From d6eebd5a84fa2f95a36bb4ad38f124eff40f1abf Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 01:42:21 +0100 Subject: [PATCH 01/15] feat(target-health): track MCP and agent target health Add a per-replica, in-memory health tracker for MCP servers and A2A agents (target_health.go). The tracker records observations from real proxied traffic (handleTargetProxy, mcp_a2a.go) and federated calls (mcpFederatedToolsList/mcpFederatedToolsCall, mcp_federation.go), and derives a three-state readout (unknown, healthy, unhealthy) from a configurable consecutive-failure threshold. Add TargetHealthConfig to Config, validated at construction. The tracker never gates routing: federation and the target proxy keep contacting every configured server regardless of its recorded health. Extend proxyResult (routes_passthrough.go) with status and clientCanceled so handleTargetProxy can classify a proxied response without proxyUpstream knowing anything about target health. Add maybeSweepTargetHealth, an opt-in, lazy, single-flight active probe sweep with no timer and no long-lived goroutine, matching this plugin's lack of a Close hook under Traefik hot reload. A probe uses the initialize/close handshake for a Streamable HTTP MCP server, a plain unread GET for a legacy /sse server, and a GET of the agent card path for an A2A agent. handleMCPServers and handleAgents now trigger a sweep at the top of each call. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- llmgateway.go | 86 ++++++- mcp_a2a.go | 12 +- mcp_a2a_test.go | 226 ++++++++++++++++++ mcp_federation.go | 12 + mcp_federation_test.go | 122 ++++++++++ routes_passthrough.go | 29 ++- target_health.go | 524 +++++++++++++++++++++++++++++++++++++++++ target_health_test.go | 413 ++++++++++++++++++++++++++++++++ 8 files changed, 1413 insertions(+), 11 deletions(-) create mode 100644 target_health.go create mode 100644 target_health_test.go diff --git a/llmgateway.go b/llmgateway.go index ba90a94..116678b 100644 --- a/llmgateway.go +++ b/llmgateway.go @@ -111,6 +111,13 @@ type Config struct { // Cache is a struct value, not a pointer, for the same reason as Retry // above: its own Enabled field is the on/off signal. Cache CacheConfig `json:"cache"` + // TargetHealth configures feat/target-health's opt-in active probe + // sweep for MCP servers and A2A agents — see TargetHealthConfig's own + // doc comment. A struct value, not a pointer, for the same + // zero-means-default reason as Breaker above: passive recording and + // exposure (GET /admin/api/targets, llmgateway_target_healthy) stay + // on unconditionally regardless of this block's presence. + TargetHealth TargetHealthConfig `json:"targetHealth"` // MaxInFlightBodyRequests caps how many unified and media JSON/ // multipart requests (routes_unified.go's runUnified via // readAndDecodeUnifiedBody; routes_media.go's decodeMediaJSONRequest/ @@ -362,6 +369,39 @@ type BreakerConfig struct { FailureThreshold int `json:"failureThreshold,omitempty"` } +// TargetHealthConfig configures feat/target-health's OPT-IN active probe +// sweep for MCP servers and A2A agents (target_health.go). Passive +// recording from real request traffic, and exposure via GET +// /admin/api/targets and the llmgateway_target_healthy gauge, are ALWAYS +// on regardless of this block's presence — Enabled here gates ONLY the +// background probe sweep (maybeSweepTargetHealth, target_health.go). The +// zero value (Enabled: false) preserves prior behavior exactly: a +// deployment that predates this feature, or one that never configures +// this block, sends no active probe traffic to any MCP server or agent. +// Field order (string before the two scalars) is fieldalignment- +// sensitive, the same convention BreakerConfig's own doc comment above +// explains. +type TargetHealthConfig struct { + // ProbeInterval is the minimum time between sweeps (a Go duration + // string, e.g. "60s"). Empty (the default) uses + // defaultTargetHealthProbeInterval (target_health.go). Must be + // between minTargetHealthProbeInterval (10s) and + // maxTargetHealthProbeInterval (1h) when set, or construction fails. + ProbeInterval string `json:"probeInterval,omitempty"` + // FailureThreshold is how many CONSECUTIVE failed observations + // (probe or traffic) mark a target unhealthy — see + // targetHealthTracker's own doc comment (target_health.go) for the + // exact state rule. 0 (the default) uses + // defaultTargetHealthFailureThreshold (3). Must be between 1 and 100, + // or construction fails. + FailureThreshold int `json:"failureThreshold,omitempty"` + // Enabled opts into the active probe sweep. false (the default) + // means no MCP server or A2A agent is ever proactively contacted for + // health purposes — passive recording from real proxied traffic + // still runs either way. + Enabled bool `json:"enabled,omitempty"` +} + // AdminConfig configures the read-only admin dashboard (spec §4, v0.2). // The zero value (Enabled: false) disables it, preserving v0.1 behavior // exactly: no /admin* route is registered, so those paths fall through @@ -561,11 +601,22 @@ type Gateway struct { // degrades to "failover never skips a candidate for request health" // rather than a nil-pointer panic. failoverHealth *requestHealthTracker - limiter *limiter - registry *modelRegistry - adapters map[string]providerAdapter - cfg *Config - auth *authStore + // targetHealth is feat/target-health's own per-pod, in-memory health + // tracker for MCP servers and A2A agents (target_health.go) — always + // constructed, here, regardless of Config.TargetHealth.Enabled: + // passive recording (handleTargetProxy, mcp_a2a.go; + // mcpFederatedToolsList/mcpFederatedToolsCall, mcp_federation.go) and + // exposure (GET /admin/api/targets, llmgateway_target_healthy) both + // stay on unconditionally, mirroring g.latency/g.provenance's own + // "always-present, usually-empty, nil-receiver-safe" convention + // below. Enabled gates only maybeSweepTargetHealth's own active + // probe sweep. + targetHealth *targetHealthTracker + limiter *limiter + registry *modelRegistry + adapters map[string]providerAdapter + cfg *Config + auth *authStore // cache is nil whenever response caching is not configured or not // usable (cfg.Cache.Enabled is false, or true with no config.Redis — // see buildResponseCache, cache.go). Every call site checks for nil @@ -624,6 +675,10 @@ type Gateway struct { // failover is Config.Failover, validated and resolved once by // newGateway (validateFailoverConfig, failover.go). failover failoverConfig + // targetHealthCfg is Config.TargetHealth, validated and resolved once + // by validateTargetHealthConfig (target_health.go) — maybeSweepTargetHealth + // reads probeInterval/enabled from this, never the raw Config. + targetHealthCfg targetHealthConfig // targetTimeout is targetClient's own resolved request timeout — // Config.RequestTimeout only; an MCP/A2A target has no per-target // override the way a provider does. proxyUpstream's own callers @@ -631,6 +686,15 @@ type Gateway struct { // idle-progress body watchdog (timeout.go) matches the // ResponseHeaderTimeout already set on targetClient's Transport. targetTimeout time.Duration + // targetHealthLastSweepUnixNano/targetHealthSweeping back + // maybeSweepTargetHealth's own single-flight, at-most-one-sweep-per- + // interval gate (target_health.go): a UnixNano timestamp and a CAS + // flag, both atomic rather than mutex-guarded, since every caller + // (serveMetrics, serveAdminTargets, handleMCPServers, handleAgents) + // reaches maybeSweepTargetHealth on a live request path and must + // never block behind a lock another such call already holds. + targetHealthLastSweepUnixNano int64 + targetHealthSweeping int32 } // telemetryStartupOnce keeps the anonymous "plugin loaded" ping to one per @@ -749,6 +813,18 @@ func newGateway(ctx context.Context, next http.Handler, config *Config, name str } g.failover = failoverCfg g.failoverHealth = newRequestHealthTracker() + + // feat/target-health: validated once, here — passive recording and + // exposure stay always-on regardless of this block; Enabled gates + // only maybeSweepTargetHealth's own active probe sweep + // (target_health.go). + targetHealthCfg, err := validateTargetHealthConfig(config.TargetHealth) + if err != nil { + return nil, err + } + g.targetHealthCfg = targetHealthCfg + g.targetHealth = newTargetHealthTracker(targetHealthCfg.failureThreshold) + // feat: instrument upstream latency — always constructed, regardless // of whether Config.Metrics is nil/disabled; see g.latency's own doc // comment above for why an always-present, usually-empty store is the diff --git a/mcp_a2a.go b/mcp_a2a.go index a7168c7..1fc6c64 100644 --- a/mcp_a2a.go +++ b/mcp_a2a.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "sort" + "time" ) // Target kinds handleTargetProxy and resolveTarget dispatch on, selecting @@ -63,6 +64,7 @@ type agentListing struct { // servers, filtered by group.allowsMCP and sorted by name for a // deterministic response. func (g *Gateway) handleMCPServers(w http.ResponseWriter, grp *group) { + g.maybeSweepTargetHealth() names := make([]string, 0, len(g.cfg.MCPServers)) for name := range g.cfg.MCPServers { if grp.allowsMCP(name) { @@ -86,6 +88,7 @@ func (g *Gateway) handleMCPServers(w http.ResponseWriter, grp *group) { // proxy URL plus its configured card path, defaulting to // defaultAgentCardPath when AgentConfig.Card is empty. func (g *Gateway) handleAgents(w http.ResponseWriter, grp *group) { + g.maybeSweepTargetHealth() names := make([]string, 0, len(g.cfg.Agents)) for name := range g.cfg.Agents { if grp.allowsAgent(name) { @@ -216,7 +219,14 @@ func (g *Gateway) handleTargetProxy(w http.ResponseWriter, r *http.Request, u *u upstreamURL += "?" + r.URL.RawQuery } - g.proxyUpstream(w, r, upstreamURL, g.targetClient, nil, nil, false, kind+" target (name "+name+")", g.targetTimeout) + // feat/target-health: passive recording (target_health.go) — latency + // measured around the whole proxyUpstream call, matching what an + // active probe of the same target measures. See + // recordTargetProxyHealth's own doc comment for the exact + // success/failure rule. + start := time.Now() + result, ok := g.proxyUpstream(w, r, upstreamURL, g.targetClient, nil, nil, false, kind+" target (name "+name+")", g.targetTimeout) + g.recordTargetProxyHealth(kind, name, result, ok, time.Since(start)) } // validateTargetURLs checks every configured MCP-server and agent entry at diff --git a/mcp_a2a_test.go b/mcp_a2a_test.go index 77842d0..7394d66 100644 --- a/mcp_a2a_test.go +++ b/mcp_a2a_test.go @@ -935,3 +935,229 @@ func TestHandleTargetProxy_PerTargetCounters_AttributedAndCollisionSafe(t *testi }) } } + +// --- feat/target-health: passive recording via handleTargetProxy --- + +func newTargetHealthProxyConfig(mcpURL string) *Config { + cfg := CreateConfig() + cfg.Providers = map[string]*ProviderConfig{"openai": {Type: "openai", APIKey: "k"}} + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: mcpURL}} + cfg.Groups = map[string]*GroupConfig{"default": {}} + cfg.Users = &UsersConfig{Inline: []*UserConfig{{Name: "alice", Group: "default", APIKey: "sk-alice"}}} + return cfg +} + +// TestHandleTargetProxy_TargetHealth_200_RecordsHealthy proves an +// ordinary successful proxy call records a healthy, "traffic"-sourced +// observation. +func TestHandleTargetProxy_TargetHealth_200_RecordsHealthy(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + cfg := newTargetHealthProxyConfig(srv.URL) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthHealthy { + t.Errorf("state = %q, want healthy", snap.state) + } + if snap.source != targetHealthSourceTraffic { + t.Errorf("source = %q, want %q", snap.source, targetHealthSourceTraffic) + } + if snap.consecutiveFailures != 0 { + t.Errorf("consecutiveFailures = %d, want 0", snap.consecutiveFailures) + } +} + +// TestHandleTargetProxy_TargetHealth_404_RecordsHealthy proves a 4xx +// upstream response still counts as reachable — only 5xx (or an outright +// failed attempt) is a failure. +func TestHandleTargetProxy_TargetHealth_404_RecordsHealthy(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + })) + defer srv.Close() + + cfg := newTargetHealthProxyConfig(srv.URL) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthHealthy { + t.Errorf("state = %q, want healthy (a 4xx still proves the target answered)", snap.state) + } +} + +// TestHandleTargetProxy_TargetHealth_500_RecordsUnhealthy proves an +// upstream 5xx is a failure, distinct from a 4xx above. +func TestHandleTargetProxy_TargetHealth_500_RecordsUnhealthy(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + defer srv.Close() + + cfg := newTargetHealthProxyConfig(srv.URL) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthUnhealthy { + t.Errorf("state = %q, want unhealthy", snap.state) + } + if snap.lastError == "" { + t.Error("want a non-empty lastError naming the 500 status") + } +} + +// TestHandleTargetProxy_TargetHealth_DeadUpstream_RecordsUnhealthy +// proves an outright failed attempt (connection refused) is a failure, +// exercising proxyResult's status=0/clientCanceled=false shape. +func TestHandleTargetProxy_TargetHealth_DeadUpstream_RecordsUnhealthy(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + deadURL := srv.URL + srv.Close() + + cfg := newTargetHealthProxyConfig(deadURL) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthUnhealthy { + t.Errorf("state = %q, want unhealthy", snap.state) + } +} + +// TestHandleTargetProxy_TargetHealth_HangTripsWatchdog_RecordsUnhealthy +// proves a stalled upstream that trips the idle-progress watchdog +// (timeout.go) is recorded as a failure, not silently ignored — the +// hang fixture mirrors TestHandlePassthrough_StalledUpstream_AbortedAtTimeout +// (timeout_test.go). +func TestHandleTargetProxy_TargetHealth_HangTripsWatchdog_RecordsUnhealthy(t *testing.T) { + srv, release := newStallingServer(nil) + defer release() + + cfg := newTargetHealthProxyConfig(srv.URL) + cfg.RequestTimeout = "60ms" + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + rec := httptest.NewRecorder() + + start := time.Now() + h.ServeHTTP(rec, req) + if elapsed := time.Since(start); elapsed > 3*time.Second { + t.Errorf("target proxy took %s to abort a 60ms requestTimeout", elapsed) + } + if rec.Code != http.StatusBadGateway { + t.Fatalf("status = %d, want 502, body=%s", rec.Code, rec.Body.String()) + } + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthUnhealthy { + t.Errorf("state = %q, want unhealthy (the watchdog firing must record a failure)", snap.state) + } +} + +// TestHandleTargetProxy_TargetHealth_ClientCanceled_RecordsNothing +// proves a canceled CLIENT request records nothing at all — the target's +// own health stays "unknown", not "unhealthy", since the client hanging +// up says nothing about the target. +func TestHandleTargetProxy_TargetHealth_ClientCanceled_RecordsNothing(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(200 * time.Millisecond) + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + cfg := newTargetHealthProxyConfig(srv.URL) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + ctx, cancel := context.WithCancel(context.Background()) + go func() { + time.Sleep(30 * time.Millisecond) + cancel() + }() + req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil).WithContext(ctx) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + if snap.state != targetHealthUnknown { + t.Errorf("state = %q, want unknown (a client cancel must record nothing)", snap.state) + } +} + +// TestHandleTargetProxy_TargetHealth_A2A_UsesAgentKind proves an A2A +// target proxy call records under targetKindAgent, independent of an MCP +// server sharing the same name. +func TestHandleTargetProxy_TargetHealth_A2A_UsesAgentKind(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + cfg := CreateConfig() + cfg.Providers = map[string]*ProviderConfig{"openai": {Type: "openai", APIKey: "k"}} + cfg.Agents = map[string]*AgentConfig{"alpha": {URL: srv.URL}} + cfg.Groups = map[string]*GroupConfig{"default": {}} + cfg.Users = &UsersConfig{Inline: []*UserConfig{{Name: "alice", Group: "default", APIKey: "sk-alice"}}} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := httptest.NewRequest(http.MethodGet, "/a2a/alpha/tasks", nil) + req.Header.Set("Authorization", "Bearer sk-alice") + h.ServeHTTP(httptest.NewRecorder(), req) + + if gw.targetHealth.stateOf(targetKindAgent, "alpha") != targetHealthHealthy { + t.Errorf("agent/alpha state = %q, want healthy", gw.targetHealth.stateOf(targetKindAgent, "alpha")) + } + if gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown { + t.Errorf("mcp/alpha state = %q, want unknown (must not be conflated with the agent of the same name)", gw.targetHealth.stateOf(targetKindMCP, "alpha")) + } +} diff --git a/mcp_federation.go b/mcp_federation.go index b916bd1..e2dd4d3 100644 --- a/mcp_federation.go +++ b/mcp_federation.go @@ -974,7 +974,13 @@ func (g *Gateway) mcpFederatedToolsList(w http.ResponseWriter, format mcpRespons defer func() { <-sem }() targetURL := g.cfg.MCPServers[name].URL + // feat/target-health: passive recording (target_health.go) — + // err != nil is a failure; a JSON-RPC-level resp.Error is NOT + // (the server answered, it just reported its own error), so + // it is recorded separately, below, once the shape is known. + probeStart := time.Now() resp, err := g.mcpBackendCall(fanoutCtx, targetURL, "tools/list", struct{}{}, mcpBackendResponseMaxBytes) + g.targetHealth.record(targetKindMCP, name, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) mu.Lock() defer mu.Unlock() @@ -1091,7 +1097,13 @@ func (g *Gateway) mcpFederatedToolsCall(w http.ResponseWriter, format mcpRespons // important finding 4): tools/call always resolves to exactly ONE // backend, so the fan-out memory-amplification argument does not // apply here — see mcpBackendCallResponseMaxBytes' own doc comment. + // feat/target-health: passive recording (target_health.go) — measured + // around the whole outbound call, same rule as tools/list's own fan- + // out above: err != nil is a failure, a JSON-RPC-level resp.Error is + // not. + probeStart := time.Now() resp, err := g.mcpBackendCall(ctx, targetURL, "tools/call", mcpToolCallParams{Name: toolName, Arguments: params.Arguments}, mcpBackendCallResponseMaxBytes) + g.targetHealth.record(targetKindMCP, serverName, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) g.limiter.countTargetRequest(targetKindMCP, serverName) if err != nil { g.logf("federated tools/call: server %q: %v", serverName, err) diff --git a/mcp_federation_test.go b/mcp_federation_test.go index ed0e5a4..94933e2 100644 --- a/mcp_federation_test.go +++ b/mcp_federation_test.go @@ -1873,3 +1873,125 @@ func TestMcpBackendCall_SessionCloseFailure_NeverSurfacedToCaller(t *testing.T) t.Fatalf("tools = %+v, want alpha_search despite the session-close failure", result.Tools) } } + +// --- feat/target-health: passive recording from federation traffic --- + +// TestHandleMCPFederated_ToolsList_TargetHealth_RecordsPerServer proves +// tools/list's own fan-out records a failure for the one server that +// could not be reached, and a healthy observation for every server that +// answered — independent of the aggregate response degrading rather +// than failing (TestHandleMCPFederated_ToolsList_UnreachableServerDegradesNotFails +// already covers the response shape; this proves the target-health side +// effect). +func TestHandleMCPFederated_ToolsList_TargetHealth_RecordsPerServer(t *testing.T) { + alpha := newMockJSONRPCServer(t, []mcpTool{{Name: "lookup"}}) + cfg := newFederationTestConfig(alpha.srv.URL, "http://127.0.0.1:1", false) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")})) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthHealthy { + t.Errorf("alpha state = %q, want healthy", got) + } + if got := gw.targetHealth.stateOf(targetKindMCP, "beta"); got != targetHealthUnhealthy { + t.Errorf("beta state = %q, want unhealthy (unreachable)", got) + } +} + +// TestHandleMCPFederated_ToolsList_TargetHealth_JSONRPCError_StillHealthy +// proves a server that ANSWERS with its own JSON-RPC-level error is +// still recorded healthy — it responded, which is what target-health +// cares about; only a transport-level failure (err != nil from +// mcpBackendCall) counts against it. +func TestHandleMCPFederated_ToolsList_TargetHealth_JSONRPCError_StillHealthy(t *testing.T) { + alpha := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req jsonrpcRequest + _ = json.NewDecoder(r.Body).Decode(&req) + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(jsonrpcResponse{ID: req.ID, Error: &jsonrpcError{Code: -32000, Message: "tools unavailable"}}) + })) + defer alpha.Close() + + cfg := newFederationTestConfig(alpha.URL, alpha.URL, false) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")})) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthHealthy { + t.Errorf("alpha state = %q, want healthy — a JSON-RPC-level error still means the server answered", got) + } +} + +// TestHandleMCPFederated_ToolsCall_TargetHealth_RecordsResolvedServerOnly +// proves tools/call records health for the ONE resolved server, never +// the other configured-but-uncontacted one. +func TestHandleMCPFederated_ToolsCall_TargetHealth_RecordsResolvedServerOnly(t *testing.T) { + alpha := newMockJSONRPCServer(t, nil) + beta := newMockJSONRPCServer(t, nil) + cfg := newFederationTestConfig(alpha.srv.URL, beta.srv.URL, false) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + callParams, _ := json.Marshal(mcpToolCallParams{Name: "alpha_lookup"}) + rec := httptest.NewRecorder() + h.ServeHTTP(rec, newFederatedRequest(t, "sk-alice", jsonrpcRequest{ + JSONRPC: jsonrpcVersion, Method: "tools/call", ID: json.RawMessage("5"), Params: callParams, + })) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthHealthy { + t.Errorf("alpha state = %q, want healthy", got) + } + if got := gw.targetHealth.stateOf(targetKindMCP, "beta"); got != targetHealthUnknown { + t.Errorf("beta state = %q, want unknown (never contacted)", got) + } +} + +// TestHandleMCPFederated_ToolsCall_TargetHealth_UnreachableServer_RecordsUnhealthy +// proves a resolved-but-unreachable backend records a failure even +// though the client sees a generic JSON-RPC internal error, not a raw +// transport error. +func TestHandleMCPFederated_ToolsCall_TargetHealth_UnreachableServer_RecordsUnhealthy(t *testing.T) { + cfg := newFederationTestConfig("http://127.0.0.1:1", "http://127.0.0.1:1", false) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + callParams, _ := json.Marshal(mcpToolCallParams{Name: "alpha_lookup"}) + rec := httptest.NewRecorder() + h.ServeHTTP(rec, newFederatedRequest(t, "sk-alice", jsonrpcRequest{ + JSONRPC: jsonrpcVersion, Method: "tools/call", ID: json.RawMessage("5"), Params: callParams, + })) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthUnhealthy { + t.Errorf("alpha state = %q, want unhealthy", got) + } +} diff --git a/routes_passthrough.go b/routes_passthrough.go index 37fb3a0..dd99abb 100644 --- a/routes_passthrough.go +++ b/routes_passthrough.go @@ -910,8 +910,27 @@ func (g *Gateway) handlePassthrough(w http.ResponseWriter, r *http.Request, u *u // nil unless accountJSON was true and the response's Content-Type was // application/json. type proxyResult struct { - tee *cappedAccountingBuffer + tee *cappedAccountingBuffer + // status is the upstream response's own status code, once headers + // were actually written to w — 0 when proxyUpstream returned before + // ever writing them (a build/connection failure, or a client cancel + // before the request was even sent). Additive field for + // feat/target-health's passive recording (recordTargetProxyHealth, + // target_health.go): ok=false alone conflates "the upstream never + // answered at all" with "it answered with a 5xx", which that + // feature's failure rule needs to distinguish. Field order (pointer, + // then int, then the two bools) is fieldalignment-sensitive, the same + // convention this package's other structs already follow. + status int isJSON bool + // clientCanceled is true exactly when either of proxyUpstream's own + // errors.Is(err, context.Canceled) branches fired — the CLIENT, not + // the upstream, ended the request, whether before the upstream call + // was even sent or mid-copy of an already-started response. + // feat/target-health's passive recording must record NOTHING for + // this case (handleTargetProxy's own doc comment, mcp_a2a.go): a + // client hanging up says nothing about the target's own health. + clientCanceled bool } // proxyUpstream is the shared reverse-proxy core behind both native @@ -1054,7 +1073,7 @@ func (g *Gateway) proxyUpstream(w http.ResponseWriter, r *http.Request, upstream cancel() if errors.Is(err, context.Canceled) { g.logf("%s: client canceled request: %v", logPrefix, err) - return proxyResult{}, false + return proxyResult{clientCanceled: true}, false } g.errorf("%s: upstream connection error: %v", logPrefix, err) writeOAIError(w, http.StatusBadGateway, "server_error", "upstream connection error") @@ -1099,10 +1118,10 @@ func (g *Gateway) proxyUpstream(w http.ResponseWriter, r *http.Request, upstream // — the latter falls through to the errorf below, unchanged. if errors.Is(err, context.Canceled) { g.logf("%s: client canceled request: %v", logPrefix, err) - return proxyResult{isJSON: isJSON, tee: tee}, false + return proxyResult{isJSON: isJSON, tee: tee, status: resp.StatusCode, clientCanceled: true}, false } g.errorf("%s: stream response body: %v", logPrefix, err) - return proxyResult{isJSON: isJSON, tee: tee}, false + return proxyResult{isJSON: isJSON, tee: tee, status: resp.StatusCode}, false } - return proxyResult{isJSON: isJSON, tee: tee}, true + return proxyResult{isJSON: isJSON, tee: tee, status: resp.StatusCode}, true } diff --git a/target_health.go b/target_health.go new file mode 100644 index 0000000..33cdeb7 --- /dev/null +++ b/target_health.go @@ -0,0 +1,524 @@ +package traefikllmgateway + +import ( + "context" + "errors" + "fmt" + "net/http" + "sync" + "sync/atomic" + "time" +) + +// This file implements feat/target-health: a per-replica, in-memory +// health tracker for MCP servers and A2A agents ("targets"), which have +// no health signal today the way providers do (registry.go's discovery +// circuit breaker, failover.go's requestHealthTracker). Two feeds keep +// it current: always-on PASSIVE recording from real request traffic +// (handleTargetProxy, mcp_a2a.go; mcpFederatedToolsList/ +// mcpFederatedToolsCall, mcp_federation.go) and an opt-in, lazy ACTIVE +// probe sweep (maybeSweepTargetHealth, below). Exposure is always on +// too: GET /admin/api/targets (admin.go) and the llmgateway_target_healthy +// gauge (metrics.go) both read this tracker regardless of +// Config.TargetHealth.Enabled — that flag gates only the active probe +// sweep. This tracker is OBSERVE-ONLY: nothing in mcp_a2a.go or +// mcp_federation.go ever skips a server or agent because it reports +// unhealthy — federation routing behavior is unchanged by this feature. + +// targetHealthState is the tri-state health readout stateOf/snapshot +// report for one target, mirroring the discovery breaker's healthState +// string shape (registry.go's providerState) so the admin API and +// dashboard can treat both consistently. +type targetHealthState string + +const ( + // targetHealthUnknown: the tracker has never recorded an observation + // (probe or traffic) for this (kind, name) — a target configured but + // never yet reached. + targetHealthUnknown targetHealthState = "unknown" + // targetHealthHealthy: recorded at least once, and consecutiveFailures + // has not yet reached failureThreshold. This DELIBERATELY includes a + // target whose most recent single observation was itself a failure: + // 1 or 2 recent failures after a success still read "healthy" until + // the configured threshold is actually crossed — the same + // consecutive-failure gate the discovery circuit breaker uses + // (registry.go's providerState/recordHealthLocked), reimplemented + // independently here since this tracker carries no open/half-open + // state machine of its own (see this file's own package doc comment + // for why). + targetHealthHealthy targetHealthState = "healthy" + // targetHealthUnhealthy: consecutiveFailures >= failureThreshold. + targetHealthUnhealthy targetHealthState = "unhealthy" +) + +// Source values record's callers pass — which mechanism produced the +// last observation, exposed on GET /admin/api/targets and stored per +// entry. +const ( + targetHealthSourceProbe = "probe" + targetHealthSourceTraffic = "traffic" +) + +// targetHealthMaxErrorRunes bounds targetHealthEntry.lastError: an +// upstream MCP/A2A target's own error text is not operator-controlled +// the way its URL is, so a pathological error string must not grow this +// in-memory tracker unbounded. Runes, not bytes (truncateRunes, below) +// — a byte-level cut could split a multi-byte UTF-8 sequence. +const targetHealthMaxErrorRunes = 200 + +// targetHealthKey identifies one tracked target by routing kind +// (targetKindMCP or targetKindAgent, mcp_a2a.go — NOT scopeKindAgent, +// which is the limiter/admin-API-facing "agent" spelling for a2a +// targets) and configured name. +type targetHealthKey struct { + kind string + name string +} + +// targetHealthEntry is one target's current health state, guarded by its +// owning tracker's own mu (never its own) — mirrors latencyHistogram's +// identical "guarded by the parent store's lock" convention +// (metrics.go). +type targetHealthEntry struct { + lastCheck time.Time + lastError string + source string + latency time.Duration + consecutiveFailures int + lastOK bool +} + +// targetHealthTracker is feat/target-health's own per-pod, in-memory +// health signal for every configured MCP server and A2A agent. +// Deliberately separate from requestHealthTracker (failover.go) and the +// discovery circuit breaker (registry.go): this tracker carries no +// open/half-open/backoff state machine and never gates routing — it +// exists purely for operational visibility. +// +// Every method is nil-receiver-safe, matching this package's own +// nil-means-disabled convention (requestHealthTracker's own doc +// comment, failover.go) — a Gateway assembled directly in a test, +// bypassing newGateway, degrades to "every target reads unknown" rather +// than a nil-pointer panic, even though newGateway itself always +// constructs a real one (see Gateway.targetHealth's own doc comment, +// llmgateway.go). +type targetHealthTracker struct { + entries map[targetHealthKey]*targetHealthEntry + nowFn func() time.Time + // failureThreshold is TargetHealthConfig.FailureThreshold, validated + // and defaulted once at construction (validateTargetHealthConfig) — + // copied here rather than re-read from Config on every stateOf call, + // the same resolved-value-not-raw-config shape breakerConfig/ + // failoverConfig already use. + failureThreshold int + mu sync.Mutex +} + +// newTargetHealthTracker returns an empty tracker: every target reads +// "unknown" until its first recorded observation. threshold is the +// resolved (validated, defaulted) TargetHealthConfig.FailureThreshold. +func newTargetHealthTracker(threshold int) *targetHealthTracker { + return &targetHealthTracker{entries: make(map[targetHealthKey]*targetHealthEntry), nowFn: time.Now, failureThreshold: threshold} +} + +// record accounts one observation (a real proxied request, or an active +// probe) for (kind, name): success resets consecutiveFailures to 0 and +// clears lastError; failure increments consecutiveFailures and stores +// err's message, truncated to targetHealthMaxErrorRunes (err may be nil +// even on failure — a caller with no Go error to attach, e.g. a bad +// HTTP status alone, still leaves lastError at whatever it previously +// held rather than clearing it, since there IS a new failure to report). +// source is targetHealthSourceProbe or targetHealthSourceTraffic — +// whichever mechanism produced this observation. +func (t *targetHealthTracker) record(kind, name string, ok bool, err error, latency time.Duration, source string) { + if t == nil || name == "" { + return + } + t.mu.Lock() + defer t.mu.Unlock() + key := targetHealthKey{kind: kind, name: name} + e, exists := t.entries[key] + if !exists { + e = &targetHealthEntry{} + t.entries[key] = e + } + e.lastCheck = t.nowFn() + e.lastOK = ok + e.latency = latency + e.source = source + if ok { + e.consecutiveFailures = 0 + e.lastError = "" + return + } + e.consecutiveFailures++ + if err != nil { + e.lastError = truncateRunes(err.Error(), targetHealthMaxErrorRunes) + } +} + +// stateOf reports (kind, name)'s current targetHealthState — see this +// type's own doc comment for the exact unknown/healthy/unhealthy rule. +func (t *targetHealthTracker) stateOf(kind, name string) targetHealthState { + if t == nil { + return targetHealthUnknown + } + t.mu.Lock() + defer t.mu.Unlock() + e, ok := t.entries[targetHealthKey{kind: kind, name: name}] + if !ok { + return targetHealthUnknown + } + return t.stateForLocked(e) +} + +// stateForLocked derives e's targetHealthState. Caller must hold t.mu. +// Split out of stateOf/snapshot so both apply the identical rule. +func (t *targetHealthTracker) stateForLocked(e *targetHealthEntry) targetHealthState { + if e.consecutiveFailures >= t.failureThreshold { + return targetHealthUnhealthy + } + return targetHealthHealthy +} + +// targetHealthSnapshot is one target's fully-copied health state, safe +// to read after targetHealthTracker.snapshot returns without holding its +// lock — mirrors latencySnapshot's identical shape (metrics.go). +type targetHealthSnapshot struct { + lastCheck time.Time + state targetHealthState + lastError string + source string + latency time.Duration + consecutiveFailures int +} + +// snapshot returns a copy of (kind, name)'s current health state — +// buildAdminTargets (admin.go) and writeTargetMetrics (metrics.go) both +// read through this, once per configured target, rather than exposing +// t.entries directly. A target this tracker has never observed returns +// a zero-valued snapshot with state targetHealthUnknown. +func (t *targetHealthTracker) snapshot(kind, name string) targetHealthSnapshot { + if t == nil { + return targetHealthSnapshot{state: targetHealthUnknown} + } + t.mu.Lock() + defer t.mu.Unlock() + e, ok := t.entries[targetHealthKey{kind: kind, name: name}] + if !ok { + return targetHealthSnapshot{state: targetHealthUnknown} + } + return targetHealthSnapshot{ + state: t.stateForLocked(e), + lastCheck: e.lastCheck, + lastError: e.lastError, + source: e.source, + latency: e.latency, + consecutiveFailures: e.consecutiveFailures, + } +} + +// truncateRunes bounds s to at most n runes, decoding as UTF-8 rather +// than slicing raw bytes — a byte-level cut on an arbitrary upstream +// error string could split a multi-byte rune (escapeLabelValue's own +// doc comment, metrics.go, is the identical concern applied to a +// different string). +func truncateRunes(s string, n int) string { + r := []rune(s) + if len(r) <= n { + return s + } + return string(r[:n]) +} + +// --- config: TargetHealthConfig validation --- + +// defaultTargetHealthProbeInterval/min/max bound TargetHealthConfig. +// ProbeInterval; defaultTargetHealthFailureThreshold/max bound +// TargetHealthConfig.FailureThreshold. See TargetHealthConfig's own doc +// comment (llmgateway.go) for what each governs. +const ( + defaultTargetHealthProbeInterval = 60 * time.Second + minTargetHealthProbeInterval = 10 * time.Second + maxTargetHealthProbeInterval = time.Hour + defaultTargetHealthFailureThreshold = 3 + maxTargetHealthFailureThreshold = 100 +) + +// targetHealthConfig is TargetHealthConfig, validated and defaulted once +// at construction (newGateway, llmgateway.go) — mirrors breakerConfig/ +// failoverConfig's own resolved-value-not-raw-config shape. +type targetHealthConfig struct { + probeInterval time.Duration + failureThreshold int + enabled bool +} + +// validateTargetHealthConfig validates thc and returns the resolved +// targetHealthConfig newGateway attaches to the Gateway. thc's zero +// value (no targetHealth block at all) resolves to every default below +// unchanged: enabled stays false (a deployment that predates this +// feature, or never configures this block, sends no active probe +// traffic), matching FailoverConfig's own "off unless explicitly opted +// in" precedent (failover.go). +func validateTargetHealthConfig(thc TargetHealthConfig) (targetHealthConfig, error) { + interval := defaultTargetHealthProbeInterval + if thc.ProbeInterval != "" { + d, err := time.ParseDuration(thc.ProbeInterval) + if err != nil { + return targetHealthConfig{}, fmt.Errorf("llmgateway: targetHealth.probeInterval %q is invalid: %w", thc.ProbeInterval, err) + } + if d < minTargetHealthProbeInterval || d > maxTargetHealthProbeInterval { + return targetHealthConfig{}, fmt.Errorf("llmgateway: targetHealth.probeInterval must be between %s and %s, got %q", minTargetHealthProbeInterval, maxTargetHealthProbeInterval, thc.ProbeInterval) + } + interval = d + } + + threshold := thc.FailureThreshold + if threshold == 0 { + threshold = defaultTargetHealthFailureThreshold + } + if threshold < 1 || threshold > maxTargetHealthFailureThreshold { + return targetHealthConfig{}, fmt.Errorf("llmgateway: targetHealth.failureThreshold must be between 1 and %d, got %d", maxTargetHealthFailureThreshold, threshold) + } + + return targetHealthConfig{enabled: thc.Enabled, probeInterval: interval, failureThreshold: threshold}, nil +} + +// --- active probes: opt-in, lazy, single-flight --- + +// targetHealthMaxProbeTimeout caps how long any ONE active probe may +// run, regardless of Config.RequestTimeout — a probe is a cheap, +// synchronous health check, not real traffic, and defaultRequestTimeout +// (timeout.go) is 5 minutes: without this cap, one hung MCP server or +// agent could tie up a probe goroutine for that entire duration. +const targetHealthMaxProbeTimeout = 10 * time.Second + +// targetHealthProbeTimeout resolves the timeout ONE active probe gets: +// requestTimeout (g.targetTimeout), capped at +// targetHealthMaxProbeTimeout. Written as a small helper rather than the +// Go 1.21+ builtin min: this plugin runs interpreted under Yaegi, and +// this repo's own constraints call for stdlib-only, builtin-free helpers +// where a construct's interpreter support is unverified. +func targetHealthProbeTimeout(requestTimeout time.Duration) time.Duration { + if requestTimeout <= 0 || requestTimeout > targetHealthMaxProbeTimeout { + return targetHealthMaxProbeTimeout + } + return requestTimeout +} + +// maybeSweepTargetHealth is called at the top of every route a scrape or +// a dashboard poll can reach (serveMetrics, metrics.go; serveAdminTargets/ +// handleMCPServers/handleAgents, admin.go/mcp_a2a.go) — that traffic IS +// the heartbeat: this plugin has no Close hook under Traefik's hot +// reload (Gateway.Close's own doc comment, llmgateway.go) and therefore +// starts no timer or long-lived goroutine of its own here either, +// mirroring modelRegistry.maybeRefresh's identical reasoning +// (registry.go). +// +// Returns immediately when disabled. Otherwise: g.targetHealthSweeping +// is the single-flight gate (an atomic CAS, not a mutex, since every +// caller reaches this on a live request path and must never block +// behind a lock another such call already holds) — a CAS that fails +// means either a sweep is already in flight, in which case returning is +// exactly right regardless of how long ago it started, or another +// goroutine just won the race to start this interval's sweep, in which +// case returning is exactly right too. The interval check above the CAS +// is a cheap early-out only; the CAS itself is what actually enforces +// "at most one sweep in flight, and at most one starts per interval". +func (g *Gateway) maybeSweepTargetHealth() { + if !g.targetHealthCfg.enabled { + return + } + last := atomic.LoadInt64(&g.targetHealthLastSweepUnixNano) + if last != 0 && time.Duration(time.Now().UnixNano()-last) < g.targetHealthCfg.probeInterval { + return + } + if !atomic.CompareAndSwapInt32(&g.targetHealthSweeping, 0, 1) { + return + } + atomic.StoreInt64(&g.targetHealthLastSweepUnixNano, time.Now().UnixNano()) + go g.sweepTargetHealth() //nolint:gosec // G118: self-terminating, bounded by mcpFederatedFanoutConcurrency*targetHealthMaxProbeTimeout worst case, and always clears targetHealthSweeping on return (including on panic) — see maybeRefresh's identical reasoning, registry.go, for why this plugin accepts a bounded, self-terminating background goroutine despite having no Close hook to await it +} + +// sweepTargetHealth performs one active probe sweep: every configured +// MCP server and agent, concurrently, behind a semaphore of +// mcpFederatedFanoutConcurrency (mcp_federation.go) — reusing federation's +// own fan-out concurrency constant rather than adding a second one for +// an identical "how many outbound target requests at once" question. +// Always clears g.targetHealthSweeping on return, even on panic +// (mirrors modelRegistry.refreshProvider's own deferred-recover +// reasoning, registry.go — this goroutine has no ServeHTTP caller to +// unwind into either). +func (g *Gateway) sweepTargetHealth() { + defer atomic.StoreInt32(&g.targetHealthSweeping, 0) + defer func() { + if rec := recover(); rec != nil { + g.logf("target health: sweep panicked: %v", rec) + } + }() + + timeout := targetHealthProbeTimeout(g.targetTimeout) + + var wg sync.WaitGroup + sem := make(chan struct{}, mcpFederatedFanoutConcurrency) + + for name, tc := range g.cfg.MCPServers { + if tc == nil { + continue + } + wg.Add(1) + go func(name, url string) { + defer wg.Done() + defer func() { + if rec := recover(); rec != nil { + g.logf("target health: probe for mcp %q panicked: %v", name, rec) + } + }() + sem <- struct{}{} + defer func() { <-sem }() + g.probeMCPTarget(name, url, timeout) + }(name, tc.URL) + } + for name, ac := range g.cfg.Agents { + if ac == nil { + continue + } + wg.Add(1) + go func(name, url, card string) { + defer wg.Done() + defer func() { + if rec := recover(); rec != nil { + g.logf("target health: probe for agent %q panicked: %v", name, rec) + } + }() + sem <- struct{}{} + defer func() { <-sem }() + g.probeAgentTarget(name, url, card, timeout) + }(name, ac.URL, ac.Card) + } + wg.Wait() +} + +// probeMCPTarget performs one active probe of MCP server name at +// rawURL, bounded by timeout, and records the result with source +// "probe". A legacy HTTP+SSE-transport server (isLegacySSETransportURL, +// mcp_federation.go) gets a plain GET with its body closed unread +// (probeLegacySSE, below); every other server gets the same +// initialize/close handshake mcpBackendCall's own fallback path already +// uses (mcpBackendHandshake/mcpBackendCloseSession, mcp_federation.go) +// — a JSON-RPC error answering "initialize" is a failure carrying that +// message, exactly like a transport-level error. +func (g *Gateway) probeMCPTarget(name, rawURL string, timeout time.Duration) { + start := time.Now() + + if isLegacySSETransportURL(rawURL) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + ok, err := g.probeLegacySSE(ctx, rawURL) + cancel() + g.targetHealth.record(targetKindMCP, name, ok, err, time.Since(start), targetHealthSourceProbe) + return + } + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + sessionID, err := g.mcpBackendHandshake(ctx, rawURL, mcpBackendResponseMaxBytes) + cancel() + ok := err == nil + if ok && sessionID != "" { + closeCtx, closeCancel := context.WithTimeout(context.Background(), mcpSessionCloseTimeout) + g.mcpBackendCloseSession(closeCtx, rawURL, sessionID) + closeCancel() + } + g.targetHealth.record(targetKindMCP, name, ok, err, time.Since(start), targetHealthSourceProbe) +} + +// probeLegacySSE probes a legacy HTTP+SSE-transport MCP server (URL path +// ends "/sse", isLegacySSETransportURL) with a plain GET: ok iff no +// transport error and the response status is under 500. The body is +// closed IMMEDIATELY after headers, never read — an SSE endpoint streams +// indefinitely, so reading it would hang the probe for its entire +// timeout budget on every sweep. +func (g *Gateway) probeLegacySSE(ctx context.Context, rawURL string) (bool, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil) //nolint:gosec // operator-configured target URL, validated at construction (validateTargetURLs, mcp_a2a.go) + if err != nil { + return false, err + } + resp, err := g.targetClient.Do(req) + if err != nil { + return false, err + } + _ = resp.Body.Close() //nolint:errcheck // deliberately unread — see this function's own doc comment + if resp.StatusCode >= http.StatusInternalServerError { + return false, fmt.Errorf("legacy sse probe: upstream returned HTTP %d", resp.StatusCode) + } + return true, nil +} + +// probeAgentTarget performs one active probe of agent name: a GET of +// baseURL+cardPath (AgentConfig.Card, or defaultAgentCardPath when empty +// — mcp_a2a.go), bounded by timeout. ok iff no transport error and the +// response status is under 500 — a 404 counts as reachable (e.g. an +// umbrella agent whose root has no card of its own), the identical +// "any status under 500 proves the target answered" rule handleTargetProxy's +// own passive recording applies (recordTargetProxyHealth, below). The +// body is closed without being read: an agent-card probe only needs the +// status. +func (g *Gateway) probeAgentTarget(name, baseURL, cardPath string, timeout time.Duration) { + if cardPath == "" { + cardPath = defaultAgentCardPath + } + start := time.Now() + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, baseURL+cardPath, nil) //nolint:gosec // operator-configured target URL, validated at construction (validateTargetURLs, mcp_a2a.go) + if err != nil { + g.targetHealth.record(targetKindAgent, name, false, err, time.Since(start), targetHealthSourceProbe) + return + } + resp, err := g.targetClient.Do(req) + if err != nil { + g.targetHealth.record(targetKindAgent, name, false, err, time.Since(start), targetHealthSourceProbe) + return + } + _ = resp.Body.Close() //nolint:errcheck // read-side close; nothing actionable on failure + ok := resp.StatusCode < http.StatusInternalServerError + var probeErr error + if !ok { + probeErr = fmt.Errorf("agent probe: upstream returned HTTP %d", resp.StatusCode) + } + g.targetHealth.record(targetKindAgent, name, ok, probeErr, time.Since(start), targetHealthSourceProbe) +} + +// --- passive recording: handleTargetProxy (mcp_a2a.go) --- + +// recordTargetProxyHealth applies handleTargetProxy's own passive +// recording rule to one proxyUpstream result (routes_passthrough.go): +// failure iff the proxy attempt itself failed for a reason other than +// the client canceling, OR the upstream answered with a 5xx; otherwise +// success — any status under 500 counts as reachable, 4xx included, +// since a 4xx still proves the target itself answered. A client cancel +// (result.clientCanceled) records nothing at all: a caller hanging up +// says nothing about the target's own health. +func (g *Gateway) recordTargetProxyHealth(kind, name string, result proxyResult, ok bool, latency time.Duration) { + if result.clientCanceled { + return + } + failed := !ok || result.status >= http.StatusInternalServerError + var err error + if failed { + err = targetProxyHealthError(ok, result.status) + } + g.targetHealth.record(kind, name, !failed, err, latency, targetHealthSourceTraffic) +} + +// targetProxyHealthError builds a short, bounded description for a +// failed passive observation. proxyUpstream itself already logged the +// real underlying error; this is only what targetHealthEntry.lastError +// — exposed via GET /admin/api/targets — shows an operator. +func targetProxyHealthError(ok bool, status int) error { + if !ok { + return errors.New("target proxy: upstream request failed") + } + return fmt.Errorf("target proxy: upstream returned HTTP %d", status) +} diff --git a/target_health_test.go b/target_health_test.go new file mode 100644 index 0000000..fc6f1cc --- /dev/null +++ b/target_health_test.go @@ -0,0 +1,413 @@ +package traefikllmgateway + +import ( + "context" + "errors" + "net/http" + "net/http/httptest" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// --- targetHealthTracker: state machine --- + +func TestTargetHealthTracker_NeverRecorded_ReadsUnknown(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindMCP, "alpha")) +} + +func TestTargetHealthTracker_NilReceiver_Safe(t *testing.T) { + t.Parallel() + var tr *targetHealthTracker + assert.NotPanics(t, func() { + tr.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) + }) + assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindMCP, "alpha")) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.Equal(t, targetHealthUnknown, snap.state) +} + +func TestTargetHealthTracker_SingleSuccess_ReadsHealthy(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", true, nil, 5*time.Millisecond, targetHealthSourceTraffic) + assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha")) +} + +// TestTargetHealthTracker_BelowThreshold_StaysHealthy proves the +// documented exception: 1 or 2 recent failures after a success still +// reads "healthy" until consecutiveFailures actually reaches the +// configured threshold (targetHealthTracker's own doc comment). +func TestTargetHealthTracker_BelowThreshold_StaysHealthy(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", true, nil, 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha"), "1 failure of threshold 3 must still read healthy") + tr.record(targetKindMCP, "alpha", false, errors.New("boom again"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha"), "2 failures of threshold 3 must still read healthy") +} + +func TestTargetHealthTracker_ReachesThreshold_ReadsUnhealthy(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + for i := 0; i < 3; i++ { + tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + } + assert.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "alpha")) +} + +func TestTargetHealthTracker_SuccessAfterUnhealthy_RecoversToHealthy(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(2) + tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + require.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "alpha")) + + tr.record(targetKindMCP, "alpha", true, nil, 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha")) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.Equal(t, 0, snap.consecutiveFailures, "a success must reset consecutiveFailures to 0") + assert.Empty(t, snap.lastError, "a success must clear lastError") +} + +func TestTargetHealthTracker_ErrorString_BoundedLength(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + long := strings.Repeat("x", targetHealthMaxErrorRunes+500) + tr.record(targetKindMCP, "alpha", false, errors.New(long), 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.LessOrEqual(t, len([]rune(snap.lastError)), targetHealthMaxErrorRunes) + assert.Equal(t, strings.Repeat("x", targetHealthMaxErrorRunes), snap.lastError) +} + +func TestTargetHealthTracker_ShortError_Unchanged(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", false, errors.New("dial tcp: connection refused"), 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.Equal(t, "dial tcp: connection refused", snap.lastError) +} + +func TestTargetHealthTracker_KeyedByKindAndName_Independent(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(1) + tr.record(targetKindMCP, "shared", false, errors.New("boom"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "shared")) + assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindAgent, "shared"), "an mcp server and an agent sharing a name must track independently") +} + +func TestTargetHealthTracker_Snapshot_FieldsPopulated(t *testing.T) { + t.Parallel() + now := time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC) + tr := newTargetHealthTracker(3) + tr.nowFn = func() time.Time { return now } + tr.record(targetKindAgent, "beta", true, nil, 42*time.Millisecond, targetHealthSourceProbe) + + snap := tr.snapshot(targetKindAgent, "beta") + assert.Equal(t, targetHealthHealthy, snap.state) + assert.Equal(t, now, snap.lastCheck) + assert.Equal(t, 42*time.Millisecond, snap.latency) + assert.Equal(t, targetHealthSourceProbe, snap.source) + assert.Equal(t, 0, snap.consecutiveFailures) +} + +func TestTargetHealthTracker_ConcurrentRecord_NoRace(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + var wg sync.WaitGroup + for i := 0; i < 50; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + tr.record(targetKindMCP, "alpha", i%2 == 0, errors.New("x"), time.Millisecond, targetHealthSourceTraffic) + }(i) + } + wg.Wait() + _ = tr.stateOf(targetKindMCP, "alpha") +} + +// --- TargetHealthConfig validation --- + +func TestValidateTargetHealthConfig_Defaults(t *testing.T) { + t.Parallel() + thc, err := validateTargetHealthConfig(TargetHealthConfig{}) + require.NoError(t, err) + assert.False(t, thc.enabled) + assert.Equal(t, defaultTargetHealthProbeInterval, thc.probeInterval) + assert.Equal(t, defaultTargetHealthFailureThreshold, thc.failureThreshold) +} + +func TestValidateTargetHealthConfig_ExplicitEnable(t *testing.T) { + t.Parallel() + thc, err := validateTargetHealthConfig(TargetHealthConfig{Enabled: true}) + require.NoError(t, err) + assert.True(t, thc.enabled) +} + +func TestValidateTargetHealthConfig_ProbeIntervalBounds(t *testing.T) { + t.Parallel() + _, err := validateTargetHealthConfig(TargetHealthConfig{ProbeInterval: "1s"}) + assert.Error(t, err, "below the 10s floor must be rejected") + + _, err = validateTargetHealthConfig(TargetHealthConfig{ProbeInterval: "2h"}) + assert.Error(t, err, "above the 1h ceiling must be rejected") + + _, err = validateTargetHealthConfig(TargetHealthConfig{ProbeInterval: "not-a-duration"}) + assert.Error(t, err) + + thc, err := validateTargetHealthConfig(TargetHealthConfig{ProbeInterval: "30s"}) + require.NoError(t, err) + assert.Equal(t, 30*time.Second, thc.probeInterval) +} + +func TestValidateTargetHealthConfig_FailureThresholdBounds(t *testing.T) { + t.Parallel() + _, err := validateTargetHealthConfig(TargetHealthConfig{FailureThreshold: -1}) + assert.Error(t, err) + + _, err = validateTargetHealthConfig(TargetHealthConfig{FailureThreshold: maxTargetHealthFailureThreshold + 1}) + assert.Error(t, err) + + thc, err := validateTargetHealthConfig(TargetHealthConfig{FailureThreshold: 10}) + require.NoError(t, err) + assert.Equal(t, 10, thc.failureThreshold) +} + +func TestNewGateway_TargetHealth_InvalidConfig_ConstructionError(t *testing.T) { + t.Parallel() + cfg := CreateConfig() + cfg.Providers = map[string]*ProviderConfig{"openai": {Type: "openai", APIKey: "k"}} + cfg.TargetHealth = TargetHealthConfig{ProbeInterval: "1s"} + _, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + assert.Error(t, err) +} + +func TestNewGateway_TargetHealth_DisabledByDefault_TrackerStillConstructed(t *testing.T) { + t.Parallel() + cfg := CreateConfig() + cfg.Providers = map[string]*ProviderConfig{"openai": {Type: "openai", APIKey: "k"}} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + require.NoError(t, err) + gw, ok := h.(*Gateway) + require.True(t, ok) + require.NotNil(t, gw.targetHealth, "the tracker must always be constructed regardless of Enabled — passive recording/exposure stay on unconditionally") + assert.False(t, gw.targetHealthCfg.enabled) +} + +// --- maybeSweepTargetHealth: disabled / enabled / single-flight --- + +func newTargetHealthSweepGateway(t *testing.T, enabled bool, probeInterval time.Duration, mcpURL string) *Gateway { + t.Helper() + adapters := map[string]providerAdapter{"openai": newFakeAdapter("openai")} + cfg := &Config{ + Providers: map[string]*ProviderConfig{"openai": {}}, + MCPServers: map[string]*TargetConfig{"alpha": {URL: mcpURL}}, + } + reg, err := newModelRegistry(adapters, cfg, func(string, ...any) {}) + require.NoError(t, err) + return &Gateway{ + cfg: cfg, + registry: reg, + targetHealth: newTargetHealthTracker(3), + targetHealthCfg: targetHealthConfig{enabled: enabled, probeInterval: probeInterval, failureThreshold: 3}, + targetClient: http.DefaultClient, + targetTimeout: 5 * time.Second, + name: "test", + } +} + +func TestMaybeSweepTargetHealth_Disabled_NoOutboundRequests(t *testing.T) { + t.Parallel() + hits := 0 + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + hits++ + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + gw := newTargetHealthSweepGateway(t, false, 10*time.Millisecond, srv.URL) + gw.maybeSweepTargetHealth() + // maybeSweepTargetHealth spawns a goroutine when it decides to sweep; + // since it must return immediately when disabled, there is nothing to + // wait on — a brief sleep would only prove absence of a signal we + // never expect to see. + time.Sleep(20 * time.Millisecond) + assert.Equal(t, 0, hits, "a disabled targetHealth must never send an outbound probe") + assert.Equal(t, targetHealthUnknown, gw.targetHealth.stateOf(targetKindMCP, "alpha")) +} + +func TestMaybeSweepTargetHealth_Enabled_ProbesConfiguredServer(t *testing.T) { + t.Parallel() + var hits int32 + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + atomic.AddInt32(&hits, 1) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"jsonrpc":"2.0","id":"federated","result":{"protocolVersion":"2025-11-25","capabilities":{}}}`)) + })) + defer srv.Close() + + gw := newTargetHealthSweepGateway(t, true, time.Hour, srv.URL) + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) > 0 }, time.Second) + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") == targetHealthHealthy }, time.Second) + + snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") + assert.Equal(t, targetHealthSourceProbe, snap.source) +} + +func TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight(t *testing.T) { + t.Parallel() + var hits int32 + release := make(chan struct{}) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + atomic.AddInt32(&hits, 1) + <-release + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"jsonrpc":"2.0","id":"federated","result":{}}`)) + })) + defer srv.Close() + + gw := newTargetHealthSweepGateway(t, true, time.Hour, srv.URL) + + var wg sync.WaitGroup + for i := 0; i < 20; i++ { + wg.Add(1) + go func() { + defer wg.Done() + gw.maybeSweepTargetHealth() + }() + } + wg.Wait() + + // Give the single in-flight probe time to actually reach the server, + // then release it — regardless of how many goroutines called + // maybeSweepTargetHealth concurrently, at most one outbound request + // must have been sent. + waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) > 0 }, time.Second) + close(release) + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown }, time.Second) + assert.Equal(t, int32(1), atomic.LoadInt32(&hits), "concurrent triggers within one interval must produce exactly one sweep") +} + +// TestMaybeSweepTargetHealth_LegacySSE_ClosesBodyWithoutReading proves a +// legacy "/sse" MCP server's probe uses a plain GET and closes the body +// immediately: a test server that never closes its stream must not hang +// the probe. +func TestMaybeSweepTargetHealth_LegacySSE_ClosesBodyWithoutReading(t *testing.T) { + t.Parallel() + headersSent := make(chan struct{}) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/event-stream") + w.WriteHeader(http.StatusOK) + close(headersSent) + flusher, ok := w.(http.Flusher) + if ok { + flusher.Flush() + } + <-r.Context().Done() // never closes on its own; relies on the probe not reading + })) + defer srv.Close() + + adapters := map[string]providerAdapter{"openai": newFakeAdapter("openai")} + cfg := &Config{ + Providers: map[string]*ProviderConfig{"openai": {}}, + MCPServers: map[string]*TargetConfig{"alpha": {URL: srv.URL + "/sse"}}, + } + reg, err := newModelRegistry(adapters, cfg, func(string, ...any) {}) + require.NoError(t, err) + gw := &Gateway{ + cfg: cfg, + registry: reg, + targetHealth: newTargetHealthTracker(3), + targetHealthCfg: targetHealthConfig{enabled: true, probeInterval: time.Hour, failureThreshold: 3}, + targetClient: http.DefaultClient, + targetTimeout: 5 * time.Second, + name: "test", + } + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown }, 2*time.Second) + assert.Equal(t, targetHealthHealthy, gw.targetHealth.stateOf(targetKindMCP, "alpha")) +} + +func TestMaybeSweepTargetHealth_AgentReturns404_ReadsHealthy(t *testing.T) { + t.Parallel() + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + })) + defer srv.Close() + + adapters := map[string]providerAdapter{"openai": newFakeAdapter("openai")} + cfg := &Config{ + Providers: map[string]*ProviderConfig{"openai": {}}, + Agents: map[string]*AgentConfig{"beta": {URL: srv.URL}}, + } + reg, err := newModelRegistry(adapters, cfg, func(string, ...any) {}) + require.NoError(t, err) + gw := &Gateway{ + cfg: cfg, + registry: reg, + targetHealth: newTargetHealthTracker(3), + targetHealthCfg: targetHealthConfig{enabled: true, probeInterval: time.Hour, failureThreshold: 3}, + targetClient: http.DefaultClient, + targetTimeout: 5 * time.Second, + name: "test", + } + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindAgent, "beta") != targetHealthUnknown }, time.Second) + assert.Equal(t, targetHealthHealthy, gw.targetHealth.stateOf(targetKindAgent, "beta"), "a 404 agent-card fetch counts as reachable") +} + +func TestMaybeSweepTargetHealth_AgentReturns503_RecordsFailure(t *testing.T) { + t.Parallel() + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusServiceUnavailable) + })) + defer srv.Close() + + adapters := map[string]providerAdapter{"openai": newFakeAdapter("openai")} + cfg := &Config{ + Providers: map[string]*ProviderConfig{"openai": {}}, + Agents: map[string]*AgentConfig{"beta": {URL: srv.URL}}, + } + reg, err := newModelRegistry(adapters, cfg, func(string, ...any) {}) + require.NoError(t, err) + gw := &Gateway{ + cfg: cfg, + registry: reg, + targetHealth: newTargetHealthTracker(1), + targetHealthCfg: targetHealthConfig{enabled: true, probeInterval: time.Hour, failureThreshold: 1}, + targetClient: http.DefaultClient, + targetTimeout: 5 * time.Second, + name: "test", + } + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindAgent, "beta") != targetHealthUnknown }, time.Second) + assert.Equal(t, targetHealthUnhealthy, gw.targetHealth.stateOf(targetKindAgent, "beta")) +} + +// waitForCondition polls cond until it returns true or deadline elapses, +// failing the test on timeout — used throughout this file's sweep tests +// since the sweep itself runs in a background goroutine with no +// synchronous completion signal (maybeSweepTargetHealth's own doc +// comment: no timers, no long-lived goroutines, fire-and-forget). +func waitForCondition(t *testing.T, cond func() bool, timeout time.Duration) { + t.Helper() + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { + if cond() { + return + } + time.Sleep(2 * time.Millisecond) + } + if !cond() { + t.Fatalf("condition not met within %s", timeout) + } +} From a31647f652f093827b2670cc78b05e70923bf552 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 01:42:49 +0100 Subject: [PATCH 02/15] feat(target-health): expose target health on admin API and metrics Add a health object to each row of GET /admin/api/targets (adminTargetHealthView, admin.go): state, an RFC3339 lastCheck, lastError, source, and latencyMs, every optional field omitted while the target has never been observed. Both serveAdminTargets and the MCP/agent listing routes (handleMCPServers, handleAgents) trigger the active probe sweep before responding, so admin polling and client listings double as the heartbeat that drives it. Add llmgateway_target_healthy to /metrics (metrics.go): a 1/0 gauge labeled by kind (mcp or agent) and target name, with no sample at all for a target the tracker has never observed. serveMetrics triggers the sweep too, so a Prometheus scrape becomes a heartbeat as well. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- admin.go | 44 +++++++++++++++++ admin_test.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++++ metrics.go | 49 +++++++++++++++++++ metrics_test.go | 75 ++++++++++++++++++++++++++++ 4 files changed, 295 insertions(+) diff --git a/admin.go b/admin.go index a1c66b7..748b8f2 100644 --- a/admin.go +++ b/admin.go @@ -1235,13 +1235,54 @@ type adminTargetCountersView struct { // convention (adminUsageEntryView) — rather than always listing every // group name, which would grow with the group catalog for no reason once // nothing is actually restricted. +// +// Health is feat/target-health's own readout (targetHealthView, below). +// Field order (Health first, the struct-typed field, then the strings/ +// slice, then Counters last) is fieldalignment-sensitive, derived +// against a scratch copy the same way this package's other structs +// already document (Config's own doc comment, llmgateway.go). type adminTargetView struct { + Health adminTargetHealthView `json:"health"` Name string `json:"name"` URL string `json:"url"` Access []string `json:"access,omitempty"` Counters adminTargetCountersView `json:"counters"` } +// adminTargetHealthView is one target's feat/target-health readout in +// GET /admin/api/targets — the exact JSON contract the webui's MCP & +// Agents panel codes against. State and ConsecutiveFailures are always +// present; every other field is omitted while State is +// targetHealthUnknown (this tracker has never observed the target), +// since none of them carry a meaningful value yet. LatencyMs is a +// pointer so a genuine 0ms observation still serializes as +// "latencyMs":0 rather than being indistinguishable from "omitted". +// Field order is fieldalignment-derived, the same convention +// adminTargetView's own doc comment above explains. +type adminTargetHealthView struct { + LatencyMs *int64 `json:"latencyMs,omitempty"` + State targetHealthState `json:"state"` + LastCheck string `json:"lastCheck,omitempty"` + LastError string `json:"lastError,omitempty"` + Source string `json:"source,omitempty"` + ConsecutiveFailures int `json:"consecutiveFailures"` +} + +// targetHealthView converts one targetHealthTracker.snapshot result +// (target_health.go) into its JSON view. +func targetHealthView(snap targetHealthSnapshot) adminTargetHealthView { + view := adminTargetHealthView{State: snap.state, ConsecutiveFailures: snap.consecutiveFailures} + if snap.state == targetHealthUnknown { + return view + } + view.LastCheck = snap.lastCheck.UTC().Format(time.RFC3339) + view.LastError = snap.lastError + view.Source = snap.source + ms := snap.latency.Milliseconds() + view.LatencyMs = &ms + return view +} + // adminTargetsResponse is the full body of GET /admin/api/targets (Feature // B, v0.21): every configured MCP server and every configured agent, each // with its own access list and current-window request counters. Both @@ -1339,6 +1380,7 @@ func (g *Gateway) buildAdminTargets() adminTargetsResponse { mcpServers := make([]adminTargetView, len(mcpNames)) for i, name := range mcpNames { mcpServers[i] = adminTargetView{ + Health: targetHealthView(g.targetHealth.snapshot(targetKindMCP, name)), Name: name, URL: sanitizeBaseURL(g.cfg.MCPServers[name].URL), Access: adminTargetAccess(groupSummaries, func(gs groupSummary) []string { return gs.mcpServers }, name), @@ -1348,6 +1390,7 @@ func (g *Gateway) buildAdminTargets() adminTargetsResponse { agents := make([]adminTargetView, len(agentNames)) for i, name := range agentNames { agents[i] = adminTargetView{ + Health: targetHealthView(g.targetHealth.snapshot(targetKindAgent, name)), Name: name, URL: sanitizeBaseURL(g.cfg.Agents[name].URL), Access: adminTargetAccess(groupSummaries, func(gs groupSummary) []string { return gs.agents }, name), @@ -1360,6 +1403,7 @@ func (g *Gateway) buildAdminTargets() adminTargetsResponse { // serveAdminTargets writes buildAdminTargets's result as JSON. func (g *Gateway) serveAdminTargets(w http.ResponseWriter) { + g.maybeSweepTargetHealth() setAdminJSONHeaders(w) _ = json.NewEncoder(w).Encode(g.buildAdminTargets()) } diff --git a/admin_test.go b/admin_test.go index 93b26c2..92bb80f 100644 --- a/admin_test.go +++ b/admin_test.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/hex" "encoding/json" + "errors" "fmt" "math" "net/http" @@ -2436,3 +2437,129 @@ func TestParseHistoryScope_ModelIDKeepsLaterSeparators(t *testing.T) { t.Errorf("parseHistoryScope = (%q, %q, %v), want the full model id preserved", kind, id, ok) } } + +// --- feat/target-health: GET /admin/api/targets "health" field --- + +// TestAdminTargets_Health_NeverObserved_UnknownWithOmittedFields proves +// the exact JSON contract for a target this tracker has never observed: +// "state":"unknown", consecutiveFailures present as 0, and every other +// health field (lastCheck/lastError/latencyMs/source) omitted entirely. +func TestAdminTargets_Health_NeverObserved_UnknownWithOmittedFields(t *testing.T) { + t.Parallel() + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, _ := newAdminGatewayHandle(t, cfg) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + body := rec.Body.String() + if !strings.Contains(body, `"health":{"state":"unknown","consecutiveFailures":0}`) { + t.Errorf("body = %s, want an unknown target's health object to carry only state and consecutiveFailures", body) + } +} + +// TestAdminTargets_Health_Recorded_AllFieldsPresent proves a target with +// at least one recorded observation carries every health field, and that +// state/source/consecutiveFailures reflect the tracker exactly. +func TestAdminTargets_Health_Recorded_AllFieldsPresent(t *testing.T) { + t.Parallel() + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, gw := newAdminGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", true, nil, 12*time.Millisecond, targetHealthSourceTraffic) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + var got adminTargetsResponse + if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { + t.Fatalf("decode: %v", err) + } + if len(got.MCPServers) != 1 { + t.Fatalf("mcpServers = %+v, want exactly 1", got.MCPServers) + } + health := got.MCPServers[0].Health + if health.State != targetHealthHealthy { + t.Errorf("state = %q, want healthy", health.State) + } + if health.LastCheck == "" { + t.Error("want a non-empty lastCheck (RFC3339)") + } + if _, err := time.Parse(time.RFC3339, health.LastCheck); err != nil { + t.Errorf("lastCheck = %q, want RFC3339: %v", health.LastCheck, err) + } + if health.Source != targetHealthSourceTraffic { + t.Errorf("source = %q, want %q", health.Source, targetHealthSourceTraffic) + } + if health.LatencyMs == nil || *health.LatencyMs != 12 { + t.Errorf("latencyMs = %v, want *12", health.LatencyMs) + } + if health.ConsecutiveFailures != 0 { + t.Errorf("consecutiveFailures = %d, want 0", health.ConsecutiveFailures) + } + if health.LastError != "" { + t.Errorf("lastError = %q, want empty (omitted) after a success", health.LastError) + } +} + +// TestAdminTargets_Health_Unhealthy_LastErrorPresent proves an unhealthy +// target's lastError is populated and non-empty. +func TestAdminTargets_Health_Unhealthy_LastErrorPresent(t *testing.T) { + t.Parallel() + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, gw := newAdminGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", false, errors.New("dial tcp: connection refused"), 3*time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + var got adminTargetsResponse + if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { + t.Fatalf("decode: %v", err) + } + health := got.MCPServers[0].Health + if health.State != targetHealthUnhealthy { + t.Errorf("state = %q, want unhealthy", health.State) + } + if health.LastError != "dial tcp: connection refused" { + t.Errorf("lastError = %q, want the recorded error text", health.LastError) + } + if health.Source != targetHealthSourceProbe { + t.Errorf("source = %q, want %q", health.Source, targetHealthSourceProbe) + } +} + +// TestAdminTargets_Health_AgentUsesAgentKind proves an agent row's health +// is read under targetKindAgent, not the mcp kind. +func TestAdminTargets_Health_AgentUsesAgentKind(t *testing.T) { + t.Parallel() + cfg := newAdminTestConfig() + cfg.Agents = map[string]*AgentConfig{"bot1": {URL: "http://agent-bot1.internal"}} + h, gw := newAdminGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindAgent, "bot1", true, nil, time.Millisecond, targetHealthSourceTraffic) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + var got adminTargetsResponse + if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { + t.Fatalf("decode: %v", err) + } + if len(got.Agents) != 1 || got.Agents[0].Health.State != targetHealthHealthy { + t.Fatalf("agents = %+v, want bot1 healthy", got.Agents) + } +} diff --git a/metrics.go b/metrics.go index f8207ce..b39ad8b 100644 --- a/metrics.go +++ b/metrics.go @@ -170,6 +170,7 @@ func (g *Gateway) metricsSourceAllowed(r *http.Request) bool { // disk cache, and its declared Content-Type must never be second-guessed // by a client's MIME sniffer. func (g *Gateway) serveMetrics(w http.ResponseWriter) { + g.maybeSweepTargetHealth() w.Header().Set("Content-Type", "text/plain; version=0.0.4; charset=utf-8") w.Header().Set("X-Content-Type-Options", "nosniff") w.Header().Set("Cache-Control", "no-store") @@ -448,6 +449,16 @@ const aggregationNotePerProcess = " AGGREGATION ACROSS REPLICAS: this counter li // instant (e.g. one mid-backoff, one already recovered). const aggregationNoteProviderHealthy = " AGGREGATION ACROSS REPLICAS: each replica runs its own discovery circuit breaker in-process, never shared via Redis, so this can legitimately differ per replica. Read it per-instance where possible; if you must aggregate, use min() to surface \"at least one replica sees this provider as unhealthy\" — sum() is meaningless for a 0/1 gauge." +// aggregationNoteTargetHealthy is appended to llmgateway_target_healthy's +// HELP text (feat/target-health): the tracker behind this gauge +// (target_health.go) is per-process, in-memory state, fed by each +// replica's own passive traffic and, when enabled, its own active probe +// sweep — never shared via Redis. A sibling to +// aggregationNoteProviderHealthy above, not a reuse of it: this +// tracker has no discovery step of its own, so that note's own +// reference to "discovery circuit breaker" would not apply here. +const aggregationNoteTargetHealthy = " AGGREGATION ACROSS REPLICAS: each replica tracks this target's health independently from its own passive traffic and, if enabled, its own active probes — never shared via Redis — so this can legitimately differ per replica. Read it per-instance where possible; if you must aggregate, use min() to surface \"at least one replica sees this target as unhealthy\" — sum() is meaningless for a 0/1 gauge." + // aggregationNoteStoreHealth is appended to llmgateway_limit_store_up's // HELP text: whether THIS replica's own connection to the configured // limit store is currently healthy is, by definition, discovered @@ -470,6 +481,7 @@ func (g *Gateway) renderMetrics() []byte { var m metricWriter g.writeUsageMetrics(&m) g.writeProviderMetrics(&m) + g.writeTargetMetrics(&m) g.writeLatencyMetrics(&m) g.writeProvenanceMetrics(&m) g.writeRejectionMetrics(&m) @@ -673,6 +685,43 @@ func (g *Gateway) writeProviderMetrics(m *metricWriter) { } } +// writeTargetMetrics emits llmgateway_target_healthy (feat/target-health): +// 1 for a healthy MCP server or A2A agent, 0 for an unhealthy one, and NO +// sample at all for a target this tracker has never observed — the +// identical "a gap is honest, a fabricated value is not" convention +// writeUsageMetrics/writeProviderMetrics already apply to a storeDown +// read, applied here to "never yet observed" instead of "currently +// unreadable". Iterates every CONFIGURED MCP server and agent (not just +// ones the tracker happens to have an entry for), so a target removed +// from config since its last observation contributes no stale series. +func (g *Gateway) writeTargetMetrics(m *metricWriter) { + m.family("llmgateway_target_healthy", "gauge", + "1 when an MCP server or A2A agent's health (last passive observation or active probe) is healthy, 0 when its consecutive-failure count has reached targetHealth.failureThreshold. No sample while never yet observed."+aggregationNoteTargetHealthy) + + for _, name := range sortedMCPServerNames(g.cfg.MCPServers) { + writeTargetHealthySample(m, g.targetHealth.snapshot(targetKindMCP, name), targetScopeKind(targetKindMCP), name) + } + for _, name := range sortedAgentNames(g.cfg.Agents) { + writeTargetHealthySample(m, g.targetHealth.snapshot(targetKindAgent, name), targetScopeKind(targetKindAgent), name) + } +} + +// writeTargetHealthySample writes llmgateway_target_healthy's one sample +// for (kindLabel, name), skipped entirely while snap's state is unknown +// — see writeTargetMetrics' own doc comment for why. kindLabel is the +// external "mcp"/"agent" spelling (targetScopeKind), never the internal +// routing kind ("a2a") targetHealthTracker itself keys on. +func writeTargetHealthySample(m *metricWriter, snap targetHealthSnapshot, kindLabel, name string) { + if snap.state == targetHealthUnknown { + return + } + healthy := int64(1) + if snap.state == targetHealthUnhealthy { + healthy = 0 + } + m.sampleInt("llmgateway_target_healthy", []metricLabel{{"kind", kindLabel}, {"target", name}}, healthy) +} + // --- upstream latency (feat: instrument upstream latency) --- // // The task: "priority-based throttling that engages when providers are diff --git a/metrics_test.go b/metrics_test.go index 3a0c4f2..6cc675e 100644 --- a/metrics_test.go +++ b/metrics_test.go @@ -3,6 +3,7 @@ package traefikllmgateway import ( "context" "encoding/json" + "errors" "fmt" "math" "net/http" @@ -1494,3 +1495,77 @@ func TestRecordLatency_MetricsDisabled_NoObservationCollected(t *testing.T) { t.Errorf("g.latency has %d entries after a request with metrics disabled, want 0 — no latency observation should ever be collected when metrics is off", len(snaps)) } } + +// --- feat/target-health: llmgateway_target_healthy --- + +// TestMetrics_TargetHealthy_NoSampleWhileUnknown proves a configured but +// never-observed target contributes NO sample at all — the same +// "a gap is honest, a fabricated value is not" rule the store-backed +// families apply to storeDown, applied here to "never yet observed". +func TestMetrics_TargetHealthy_NoSampleWhileUnknown(t *testing.T) { + t.Parallel() + cfg := newMetricsTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, _ := newMetricsGatewayHandle(t, cfg) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + _, samples := parsePrometheusText(t, rec.Body.Bytes()) + for _, s := range samples { + if s.name == "llmgateway_target_healthy" { + t.Errorf("unexpected sample %v — a never-observed target must emit nothing", s) + } + } +} + +// TestMetrics_TargetHealthy_ReflectsRecordedState proves the gauge +// renders 1 for a healthy MCP server and 0 for an unhealthy agent, with +// the documented kind label values ("mcp"/"agent" — NOT the internal +// routing kind "a2a"). +func TestMetrics_TargetHealthy_ReflectsRecordedState(t *testing.T) { + t.Parallel() + cfg := newMetricsTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + cfg.Agents = map[string]*AgentConfig{"bot1": {URL: "http://agent-bot1.internal"}} + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, gw := newMetricsGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) + gw.targetHealth.record(targetKindAgent, "bot1", false, errors.New("boom"), time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + _, samples := parsePrometheusText(t, rec.Body.Bytes()) + assertSample(t, samples, "llmgateway_target_healthy", map[string]string{"kind": "mcp", "target": "alpha"}, "1") + assertSample(t, samples, "llmgateway_target_healthy", map[string]string{"kind": "agent", "target": "bot1"}, "0") +} + +// TestMetrics_TargetHealthy_UnaffectedByStoreOutage proves this gauge is +// unaffected by a limit-store outage — it reads the in-process +// target-health tracker only, never the store, mirroring +// llmgateway_provider_healthy's own identical independence +// (TestMetrics_StoreDown_SkipsRatherThanFabricatesZero's own doc +// comment explains why that one is asserted present during an outage; +// this is the same claim for this feature's gauge). +func TestMetrics_TargetHealthy_UnaffectedByStoreOutage(t *testing.T) { + t.Parallel() + cfg := newMetricsTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, gw := newMetricsGatewayHandle(t, cfg) + gw.targetHealth.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) + gw.limiter.store = alwaysErrStore{} + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + _, samples := parsePrometheusText(t, rec.Body.Bytes()) + assertSample(t, samples, "llmgateway_target_healthy", map[string]string{"kind": "mcp", "target": "alpha"}, "1") +} From 9e425a3343a98c71921b365733373e5a9f9d6aff Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 01:46:36 +0100 Subject: [PATCH 03/15] test(yaegi-check): exercise target health under the interpreter Add a second MCP server (target-health-down) pointed at a closed listener, and enable targetHealth in the harness config. After the existing federated tools/call probe, exerciseTargetHealth reads GET /admin/api/targets and asserts the probe server reads healthy with source traffic, then drives targetHealthFailureThreshold consecutive failures through the direct per-server proxy path against the dead server and asserts it flips to unhealthy on both GET /admin/api/targets and llmgateway_target_healthy on /metrics. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- tools/yaegi-check/main.go | 159 +++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/tools/yaegi-check/main.go b/tools/yaegi-check/main.go index 878cf05..136e370 100644 --- a/tools/yaegi-check/main.go +++ b/tools/yaegi-check/main.go @@ -404,6 +404,17 @@ func run() error { _, _ = w.Write([]byte(`"}]}}`)) })) defer mcpProbeUpstream.Close() + // targetHealthDownUpstream is opened only to capture a real, unique + // "http://127.0.0.1:PORT" URL, then immediately closed — feat/ + // target-health's own exerciseTargetHealth (below) drives real 502s + // through this dead target's per-server proxy path + // (/mcp/target-health-down/...) to prove the interpreted tracker + // flips it to "unhealthy" after targetHealthFailureThreshold + // consecutive failures, without disturbing mcpProbeUpstream's own + // (successful, federation-routed) traffic above. + targetHealthDownUpstream := httptest.NewServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {})) + targetHealthDownURL := targetHealthDownUpstream.URL + targetHealthDownUpstream.Close() // anthropicProbeUpstream answers an Anthropic Messages API call with a // real Anthropic-shaped body, so the /v1/messages passthrough branch // (callAnthropicMessagesPassthrough) runs interpreted. A body @@ -587,7 +598,16 @@ func run() error { // runs correctly under Yaegi too, not just the config-override // one testDataWantModel already exercises. `"modelMeta":{"` + testDataWantModel + `":{"contextTokens":` + yaegiMetaContextTokens + `,"inputCostPerMTokMicroUsd":1250000,"outputCostPerMTokMicroUsd":10000000}},` + - `"mcpServers":{"` + mcpProbeServerName + `":{"url":"` + mcpProbeUpstream.URL + `"}},` + + `"mcpServers":{"` + mcpProbeServerName + `":{"url":"` + mcpProbeUpstream.URL + `"},"` + targetHealthDownServerName + `":{"url":"` + targetHealthDownURL + `"}},` + + // targetHealth (feat/target-health): enabled with a short + // probeInterval so a future active-probe assertion could run + // quickly if this harness ever adds one — exerciseTargetHealth + // (below) currently exercises the passive-recording and + // admin/metrics-exposure paths only, driven by real traffic + // (exerciseFederatedTooLarge's own federated call, and + // exerciseTargetHealth's own direct proxy calls against + // targetHealthDownServerName), never the active sweep itself. + `"targetHealth":{"enabled":true,"probeInterval":"10s"},` + // metrics (Prometheus text-exposition endpoint): enabled with // modelLabel on, so exerciseMetricsRoute below exercises the // opt-in per-(provider,model) breakdown under the interpreter @@ -646,6 +666,17 @@ func run() error { if err := exerciseHandler(handler, builtinLookupContextTokens, failoverBHits); err != nil { return err } + // exerciseTargetHealth (feat/target-health) runs right after + // exerciseHandler: its own part (a) reads the passive-recording + // side effect of exerciseFederatedTooLarge's federated tools/call, + // already driven above as one of exerciseHandler's own sub-probes, + // so it must not run before that attempt has happened. Its part (b) + // drives its own, independent target (targetHealthDownServerName), + // so it cannot perturb any later probe's own counters or /metrics + // assertions. + if err := exerciseTargetHealth(handler); err != nil { + return err + } // exerciseBareWinnerGroupAware (fix/group-aware-bare-winner, // 2026-08-27) runs right after exerciseHandler and before // exerciseBreaker: it drives its own, freshly named providers and @@ -753,6 +784,20 @@ const ( mcpProbeToolName = mcpProbeServerName + "_big" ) +// targetHealthDownServerName is the second MCP server run() configures, +// against targetHealthDownUpstream — a URL nothing listens on, opened +// then immediately closed (feat/target-health, exerciseTargetHealth, +// below). targetHealthFailureThreshold mirrors the plugin's own +// defaultTargetHealthFailureThreshold (target_health.go): this harness +// module cannot import that unexported constant across the Yaegi +// reflection boundary, so it is copied here, the same independent- +// literal approach every other harness constant mirroring plugin +// internals already takes in this file (e.g. testDataWantModel). +const ( + targetHealthDownServerName = "target-health-down" + targetHealthFailureThreshold = 3 +) + // metricsProbeAllowedCIDR is the CIDR block attemptAccountingOverride's // own metrics.allowedCIDRs names — see that literal's own comment for why // this must contain httptest.NewRequest's default RemoteAddr. @@ -1716,6 +1761,118 @@ func exerciseFederatedTooLarge(handler http.Handler) error { return nil } +// targetHealthProbeView is a shape-tolerant decode of one adminTargetView +// entry's own "health" object (admin.go's adminTargetHealthView) — +// this harness module cannot import the plugin's unexported type across +// the Yaegi reflection boundary (New is resolved and called by +// reflection, not a normal Go import — this whole file's own doc +// comment explains why), so it decodes the JSON shape independently, the +// same approach readHealth/readProviderAttemptCounters already take for +// other admin responses. +type targetHealthProbeView struct { + State string `json:"state"` + Source string `json:"source"` +} + +// readTargetHealth returns name's own "health" object from GET +// /admin/api/targets, searching both mcpServers and agents (mcpProbeServerName +// and targetHealthDownServerName are both MCP servers, but this checks +// both arrays so a future agent-shaped call site can reuse it unchanged). +func readTargetHealth(handler http.Handler, name string) (targetHealthProbeView, error) { + req := httptest.NewRequest(http.MethodGet, "/admin/api/targets", nil) + req.Header.Set("Authorization", "Bearer "+attemptAccountingAdminAPIKey) + rec := httptest.NewRecorder() + handler.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return targetHealthProbeView{}, fmt.Errorf("GET /admin/api/targets: status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + var body struct { + MCPServers []struct { + Name string `json:"name"` + Health targetHealthProbeView `json:"health"` + } `json:"mcpServers"` + Agents []struct { + Name string `json:"name"` + Health targetHealthProbeView `json:"health"` + } `json:"agents"` + } + if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { + return targetHealthProbeView{}, fmt.Errorf("decode GET /admin/api/targets body: %w (body=%s)", err, rec.Body.String()) + } + for _, s := range body.MCPServers { + if s.Name == name { + return s.Health, nil + } + } + for _, a := range body.Agents { + if a.Name == name { + return a.Health, nil + } + } + return targetHealthProbeView{}, fmt.Errorf("target %q not in GET /admin/api/targets: %s", name, rec.Body.String()) +} + +// exerciseTargetHealth proves feat/target-health end to end under the +// REAL interpreter. Part (a): mcpProbeServerName already received one +// real federated tools/call attempt via exerciseFederatedTooLarge, +// above — its oversized response trips errMCPResponseTooLarge, a +// transport-level failure from doBackendJSONRPC's own perspective +// (mcp_federation.go), which mcpFederatedToolsCall records as a +// target-health failure. One failure stays well under +// targetHealthFailureThreshold, so the target still reads "healthy" — +// target_health.go's own doc comment explains why 1-2 recent failures +// short of the threshold stay healthy. Part (b): drives +// targetHealthFailureThreshold consecutive failures through the direct +// per-server proxy path (/mcp/{name}/..., handleTargetProxy) against +// targetHealthDownServerName's dead upstream, then asserts the SAME +// tracker flips that target to "unhealthy" on both GET +// /admin/api/targets and llmgateway_target_healthy on /metrics. +func exerciseTargetHealth(handler http.Handler) error { + probeHealth, err := readTargetHealth(handler, mcpProbeServerName) + if err != nil { + return err + } + if probeHealth.State != "healthy" { + return fmt.Errorf("TARGETHEALTH-1: GET /admin/api/targets: %q health.state = %q, want healthy (after one federated tools/call attempt, below threshold): %+v", mcpProbeServerName, probeHealth.State, probeHealth) + } + if probeHealth.Source != "traffic" { + return fmt.Errorf("TARGETHEALTH-2: GET /admin/api/targets: %q health.source = %q, want %q", mcpProbeServerName, probeHealth.Source, "traffic") + } + + for i := 0; i < targetHealthFailureThreshold; i++ { + req := httptest.NewRequest(http.MethodGet, "/mcp/"+targetHealthDownServerName+"/tools/list", nil) + req.Header.Set("Authorization", "Bearer "+testDataUserAPIKey) + rec := httptest.NewRecorder() + handler.ServeHTTP(rec, req) + if rec.Code != http.StatusBadGateway { + return fmt.Errorf("TARGETHEALTH-3: GET /mcp/%s/tools/list attempt %d: status = %d, want 502 (dead upstream), body=%s", targetHealthDownServerName, i, rec.Code, rec.Body.String()) + } + } + + downHealth, err := readTargetHealth(handler, targetHealthDownServerName) + if err != nil { + return err + } + if downHealth.State != "unhealthy" { + return fmt.Errorf("TARGETHEALTH-4: GET /admin/api/targets: %q health.state = %q, want unhealthy after %d consecutive failures: %+v", targetHealthDownServerName, downHealth.State, targetHealthFailureThreshold, downHealth) + } + + metricsReq := httptest.NewRequest(http.MethodGet, "/metrics", nil) + metricsReq.Header.Set("Authorization", "Bearer "+attemptAccountingAdminAPIKey) + metricsRec := httptest.NewRecorder() + handler.ServeHTTP(metricsRec, metricsReq) + if metricsRec.Code != http.StatusOK { + return fmt.Errorf("GET /metrics: status = %d, want 200, body=%s", metricsRec.Code, metricsRec.Body.String()) + } + wantSample := `llmgateway_target_healthy{kind="mcp",target="` + targetHealthDownServerName + `"} 0` + if !strings.Contains(metricsRec.Body.String(), wantSample) { + return fmt.Errorf("TARGETHEALTH-5: GET /metrics missing %q — interpreted target-health metric diverged from the compiled shape; body=%s", wantSample, metricsRec.Body.String()) + } + + fmt.Println("yaegi-check: target health tracked and exposed correctly interpreted (admin API + /metrics)") + return nil +} + // exerciseFederatedSSENegotiation drives two real POST /mcp "ping" calls // against the interpreted handler — one carrying no Accept header // (today's plain JSON framing) and one carrying the reported client's From e9eac5248ea104fc5933af8e07f042626fa55cdc Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 01:48:25 +0100 Subject: [PATCH 04/15] docs: document target health Add the targetHealth config row and a TargetHealthConfig reference section, a Target health section under MCP and A2A describing the passive recording rules and the active probe rules per target kind, the health field on GET /admin/api/targets, and the llmgateway_target_healthy gauge with its aggregation-across-replicas note. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- README.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 47d80d8..4bd9de3 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,7 @@ config accepts them as YAML, which decodes to the same JSON shape. | `requestTimeout` | `string` (Go duration) | `5m` | Progress-based upstream request timeout, applied to every provider adapter call, native passthrough, and the MCP/A2A target proxy — see [Request timeout](#request-timeout). **Behavior change for every deployment**: before this field existed, no timeout was set at all, so a provider that accepted a connection and then went silent hung the request forever. A provider's own `requestTimeout` (`ProviderConfig`) overrides this. Empty means the default; a value that fails to parse, or parses to zero or a negative duration, is a construction error. | | `cache` | `CacheConfig` | `{}` (disabled) | Opt-in Redis-backed response cache for unified non-streaming chat/embeddings — see [Caching](#caching). Omitted or `enabled: false` means no caching, byte-identical to a gateway built before this field existed. | | `breaker` | `BreakerConfig` | `{}` (every default) | Per-provider discovery circuit breaker — see [Provider health (discovery circuit breaker)](#provider-health-discovery-circuit-breaker). Every field is individually zero-means-default; a provider whose discovery never fails is unaffected regardless of what this block contains. | +| `targetHealth` | `TargetHealthConfig` | `{}` (probes off) | Health tracking for MCP servers and A2A agents — see [MCP and A2A](#mcp-and-a2a)'s "Target health" section. Passive recording and exposure stay on regardless of this block; `enabled` gates only the active probe sweep. | | `admin` | `*AdminConfig` | `nil` (disabled) | Read-only admin dashboard — see [Admin](#admin). `nil` or `enabled: false` means the `/admin*` routes are not registered at all. | | `metrics` | `*MetricsConfig` | `nil` (disabled) | Prometheus text-exposition endpoint — see [Metrics](#metrics). `nil` or `enabled: false` means the metrics route is not registered at all. | | `modelAliases` | `map[string]string` | `{}` | Operator-defined alias id → target model id — see [Model aliases](#model-aliases). Omitted or empty means no aliases, byte-identical to a gateway built before this field existed. | @@ -325,6 +326,21 @@ own is governed purely by their group's — see | `openDuration` | `string` (Go duration) | `1m` | Base backoff a newly opened breaker waits before its first half-open probe; doubles on every further failed probe, capped at `maxOpenDuration`. Invalid or non-positive duration string is a construction error. | | `maxOpenDuration` | `string` (Go duration) | `6h` | Ceiling on the backoff `openDuration` doubles into. Must be `>= openDuration` and no more than `24h`, or construction fails. Deliberately longer than the default `discoveryInterval` (1h) — see [Provider health](#provider-health-discovery-circuit-breaker) for why a value at or below `discoveryInterval` suppresses nothing. | +### `TargetHealthConfig` + +Configures the opt-in active probe sweep for MCP servers and A2A agents +— see [MCP and A2A](#mcp-and-a2a)'s "Target health" section for the full +contract. **Passive recording from real proxied traffic, and exposure +through `GET /admin/api/targets` and the `llmgateway_target_healthy` +gauge, stay on unconditionally, regardless of this block.** `enabled` +gates only the background probe sweep. + +| Field | Type | Default | Semantics | +|---|---|---|---| +| `enabled` | `bool` | `false` | `false`: no MCP server or A2A agent is ever proactively contacted for health purposes. `true`: the active probe sweep runs, at most once per `probeInterval`, triggered by `/metrics`, `GET /admin/api/targets`, `GET /v1/mcp/servers`, or `GET /v1/agents` — never a timer. | +| `probeInterval` | `string` (Go duration) | `60s` | Minimum time between sweeps. Must be between `10s` and `1h`, or construction fails. | +| `failureThreshold` | `int` | `3` | Consecutive failed observations (probe or passive traffic) that mark a target unhealthy. `0` uses the default. Must be between `1` and `100`, or construction fails. | + ### `AdminConfig` | Field | Type | Default | Semantics | @@ -1521,7 +1537,7 @@ or in CI. - **`GET /admin/api/targets`** returns every configured MCP server and agent for the dashboard's "MCP & Agents" tab: `{"mcpServers":[...],"agents":[...]}`, each entry - `{"name","url","access","counters"}`. `url` has any userinfo/query + `{"name","url","access","counters","health"}`. `url` has any userinfo/query string stripped, same as a provider's `baseUrl` in `overview`. `access` is the list of group names actually allowed to reach that target, computed via the identical glob match `mcpServers`/`agents` @@ -1529,8 +1545,17 @@ or in CI. view can never disagree with what the proxy enforces; omitted when every configured group can reach it. `counters` is `requestsPerMinute`/`requestsPerDay`/`requestsPerMonth` — requests - only, no tokens or cost (see [MCP and A2A](#mcp-and-a2a) for why). Polled - every 5 seconds, in the same batch as `overview` and `usage`. + only, no tokens or cost (see [MCP and A2A](#mcp-and-a2a) for why). + `health` is `{"state","lastCheck","lastError","consecutiveFailures","latencyMs","source"}` + — see [MCP and A2A](#mcp-and-a2a)'s "Target health" section for the + full contract. `state` is `"unknown"`, `"healthy"`, or `"unhealthy"`, + and `consecutiveFailures` is always present; every other field is + omitted while `state` is `"unknown"` (this target has never been + observed). This route always reads existing state; when + `targetHealth.enabled`, it additionally triggers a background probe + sweep when one is due, so the response itself never waits on that + sweep. Polled every 5 seconds, in the same batch as `overview` and + `usage`. - **What's exposed**: provider names, types, base URLs (with any userinfo/query string stripped before it's ever echoed), model counts, discovery status, group/user names, membership, limits, MCP/agent @@ -1656,6 +1681,10 @@ plugin's config. - `llmgateway_provider_healthy{provider}` — `1`/`0` gauge from the discovery circuit breaker (`healthState` in the admin API); see [Provider health](#provider-health-discovery-circuit-breaker). + - `llmgateway_target_healthy{kind,target}` — `1`/`0` gauge for an MCP + server or A2A agent's tracked health; `kind` is `"mcp"` or `"agent"`. + No sample at all for a target this tracker has never observed — see + [MCP and A2A](#mcp-and-a2a)'s "Target health" section. - `llmgateway_limit_store_up` — `1`/`0` gauge for this replica's own connection to the configured limit store (Redis); absent entirely when no store is configured. Every store-backed family above simply @@ -1692,7 +1721,7 @@ plugin's config. identical families become genuinely **per-replica** instead — each replica counts only the traffic it personally handled — and `sum()` becomes the correct aggregation instead. This flips on that one config - bit; know which one you are running before wiring an alert. Three + bit; know which one you are running before wiring an alert. Four families do **not** follow this rule: - `llmgateway_rate_limit_rejections_total` lives only in each replica's own process memory, **never** in Redis, regardless of the `redis` @@ -1704,6 +1733,11 @@ plugin's config. possible; if you must aggregate, `min()` surfaces "at least one replica sees this provider as unhealthy" — `sum()` is meaningless for a 0/1 gauge. + - `llmgateway_target_healthy` reflects each replica's own tracker, + fed by its own passive traffic and, if enabled, its own active + probes — never shared via Redis. Same guidance as + `llmgateway_provider_healthy`: read per-instance, `min()` if you must + aggregate. - `llmgateway_limit_store_up` reflects each replica's own, locally -discovered connection health to the configured store — it cannot itself be read from the store it describes, so it is inherently @@ -1843,6 +1877,48 @@ plugin's config. /admin/api/targets` above and the request-rate note below. Applies to MCP servers only, not agents: there is no equivalent aggregated `/a2a` endpoint. +- **Target health**: a per-replica, in-memory health tracker for every + configured MCP server and A2A agent — providers already have a health + signal (the discovery circuit breaker); this is the equivalent for + targets. Exposed via `GET /admin/api/targets`'s own `health` field + (above) and the `llmgateway_target_healthy` gauge (see + [Metrics](#metrics)). **Never gates routing**: federation and the + per-server proxy keep contacting every configured target regardless of + its recorded health — this tracker is observe-only. + - **Passive recording, always on**, independent of `targetHealth.enabled`: + the per-server proxy (`/mcp/{name}/...`, `/a2a/{name}/...`) records a + failure when the proxy attempt itself fails (excluding a client + cancel, which records nothing) or the upstream answers `5xx`; any + status under `500`, `4xx` included, counts as reachable. Federated + `POST /mcp`'s `tools/list` fan-out and `tools/call` record a failure + only when the outbound call itself fails (`err != nil` from the + backend call) — a JSON-RPC-level `error` in the backend's own + response still counts as reachable, since the server answered. + - **Active probes are opt-in** (`targetHealth.enabled: true`) and lazy: + no timer, no background goroutine running on its own. A probe sweep + is triggered by `/metrics`, `GET /admin/api/targets`, `GET + /v1/mcp/servers`, or `GET /v1/agents` — whichever is polled first + once `targetHealth.probeInterval` has elapsed since the last sweep — + and runs at most one sweep at a time, contacting every configured MCP + server and agent concurrently. Each probe gets its own timeout: the + configured `requestTimeout`, capped at `10s`. + - An MCP server on the Streamable HTTP transport gets an + `initialize`/session-close handshake; a JSON-RPC error answering + `initialize` is a failure carrying that message. + - An MCP server whose URL ends `/sse` (legacy HTTP+SSE transport, + same exclusion federation itself applies) gets a plain `GET`; the + response body is closed immediately, **never read** — an SSE + endpoint streams indefinitely. Reachable iff no transport error and + the status is under `500`. + - An A2A agent gets a `GET` of its agent-card path (`AgentConfig.card`, + or the default `/.well-known/agent-card.json`); a `404` still + counts as reachable — for example an umbrella agent whose root + carries no card of its own. + - **State**: `"unknown"` (never observed), `"healthy"` (recorded at + least once, `consecutiveFailures` below `targetHealth.failureThreshold`), + or `"unhealthy"` (`consecutiveFailures` at or above the threshold). A + target with one or two recent failures after a success still reads + `"healthy"` until the threshold is actually crossed. ## Security notes From d2152b169cbb78a8607999cb951e5ad68a8380a8 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:42:01 +0100 Subject: [PATCH 05/15] fix(target-health): scrub lastError URLs and fix unknown-state gaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Combines three closely-coupled target_health.go fixes that all touch targetHealthTracker.record/stateForLocked in the same commit, since splitting them would leave an intermediate commit that fails to compile or a test asserting behaviour its own commit does not yet implement. F1: record gains a rawURL parameter and scrubs err's text through sanitizeProviderErr before storing lastError, so a target URL configured with an embedded credential can never leak through GET /admin/api/targets. The scrub runs before truncateRunes so a long embedded URL cannot survive truncation unscrubbed. Every probe, the per-server proxy hook (mcp_a2a.go), and both federation record sites (mcp_federation.go) now pass their target's configured URL through. F3: maybeSweepTargetHealth re-checks the elapsed interval after winning the single-flight CAS, closing a window where a caller's own stale interval read could still win the CAS once a separate, faster sweep had already started and finished within the same interval. F4: targetHealthEntry gains everOK, set on record's success branch. stateForLocked now reads a target that has never once succeeded as unknown rather than healthy, even below failureThreshold — the threshold still protects against a single transient first failure, it just does not promote a target this tracker has never seen answer to healthy. targetHealthSnapshot gains observed so the admin view can still tell apart never-observed (omit every other field) from observed-but-never-succeeded (keep them) despite both reading state unknown. The now-redundant lastOK field is removed. Also included: target_health_test.go's own test-hygiene fixes (F6) — an idempotent, t.Cleanup-registered unblock ahead of srv.Close so a failing assertion cannot leave a released server handler blocked until the test binary's own timeout, and an atomic hit counter in the disabled-sweep test — since they land in the same file as the tests above. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- admin.go | 26 ++++-- admin_test.go | 85 +++++++++++++++++- mcp_a2a.go | 2 +- mcp_federation.go | 4 +- metrics_test.go | 6 +- target_health.go | 125 ++++++++++++++++++++------ target_health_test.go | 204 +++++++++++++++++++++++++++++++++++++----- 7 files changed, 387 insertions(+), 65 deletions(-) diff --git a/admin.go b/admin.go index 748b8f2..bda3379 100644 --- a/admin.go +++ b/admin.go @@ -1252,11 +1252,20 @@ type adminTargetView struct { // adminTargetHealthView is one target's feat/target-health readout in // GET /admin/api/targets — the exact JSON contract the webui's MCP & // Agents panel codes against. State and ConsecutiveFailures are always -// present; every other field is omitted while State is -// targetHealthUnknown (this tracker has never observed the target), -// since none of them carry a meaningful value yet. LatencyMs is a -// pointer so a genuine 0ms observation still serializes as -// "latencyMs":0 rather than being indistinguishable from "omitted". +// present. State "unknown" (targetHealthUnknown) covers two different +// situations (F4, feat/target-health review) — see that constant's own +// doc comment — and this view tells them apart by whether the tracker +// has ever observed the target at all, NOT by State alone: +// - never observed: every other field is omitted, since none of them +// carry a meaningful value yet. +// - observed, but never once succeeded (still below +// targetHealth.failureThreshold): every field below is still +// present, exactly as for "healthy"/"unhealthy" — there IS a real +// lastCheck/lastError/source/latencyMs to show, the tracker simply +// has not seen this target succeed yet. +// +// LatencyMs is a pointer so a genuine 0ms observation still serializes +// as "latencyMs":0 rather than being indistinguishable from "omitted". // Field order is fieldalignment-derived, the same convention // adminTargetView's own doc comment above explains. type adminTargetHealthView struct { @@ -1269,10 +1278,13 @@ type adminTargetHealthView struct { } // targetHealthView converts one targetHealthTracker.snapshot result -// (target_health.go) into its JSON view. +// (target_health.go) into its JSON view. Whether to omit the non-always- +// present fields is decided by snap.observed, NOT snap.state == +// targetHealthUnknown (adminTargetHealthView's own doc comment explains +// why those are different questions since F4). func targetHealthView(snap targetHealthSnapshot) adminTargetHealthView { view := adminTargetHealthView{State: snap.state, ConsecutiveFailures: snap.consecutiveFailures} - if snap.state == targetHealthUnknown { + if !snap.observed { return view } view.LastCheck = snap.lastCheck.UTC().Format(time.RFC3339) diff --git a/admin_test.go b/admin_test.go index 92bb80f..cc49aa1 100644 --- a/admin_test.go +++ b/admin_test.go @@ -2461,6 +2461,51 @@ func TestAdminTargets_Health_NeverObserved_UnknownWithOmittedFields(t *testing.T } } +// TestAdminTargets_Health_NeverSucceeded_UnknownWithFieldsPresent proves +// F4's second "unknown" case: a target that HAS been observed, but never +// once succeeded, and is still below failureThreshold, reads "unknown" — +// yet carries every other health field, unlike a target this tracker has +// never observed at all (the test above). The omit-when-unknown rule +// applies only to a NEVER-OBSERVED entry, not to "unknown because never +// succeeded yet". +func TestAdminTargets_Health_NeverSucceeded_UnknownWithFieldsPresent(t *testing.T) { + t.Parallel() + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, gw := newAdminGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", "", false, errors.New("dial tcp: connection refused"), 7*time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + var got adminTargetsResponse + if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { + t.Fatalf("decode: %v", err) + } + health := got.MCPServers[0].Health + if health.State != targetHealthUnknown { + t.Errorf("state = %q, want unknown (never succeeded, still below threshold)", health.State) + } + if health.LastCheck == "" { + t.Error("want a non-empty lastCheck even though state is unknown — this target HAS been observed") + } + if health.LastError != "dial tcp: connection refused" { + t.Errorf("lastError = %q, want the recorded error text", health.LastError) + } + if health.Source != targetHealthSourceProbe { + t.Errorf("source = %q, want %q", health.Source, targetHealthSourceProbe) + } + if health.LatencyMs == nil || *health.LatencyMs != 7 { + t.Errorf("latencyMs = %v, want *7", health.LatencyMs) + } + if health.ConsecutiveFailures != 1 { + t.Errorf("consecutiveFailures = %d, want 1", health.ConsecutiveFailures) + } +} + // TestAdminTargets_Health_Recorded_AllFieldsPresent proves a target with // at least one recorded observation carries every health field, and that // state/source/consecutiveFailures reflect the tracker exactly. @@ -2470,7 +2515,7 @@ func TestAdminTargets_Health_Recorded_AllFieldsPresent(t *testing.T) { cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} h, gw := newAdminGatewayHandle(t, cfg) - gw.targetHealth.record(targetKindMCP, "alpha", true, nil, 12*time.Millisecond, targetHealthSourceTraffic) + gw.targetHealth.record(targetKindMCP, "alpha", "", true, nil, 12*time.Millisecond, targetHealthSourceTraffic) rec := httptest.NewRecorder() h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) @@ -2517,7 +2562,7 @@ func TestAdminTargets_Health_Unhealthy_LastErrorPresent(t *testing.T) { cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} h, gw := newAdminGatewayHandle(t, cfg) - gw.targetHealth.record(targetKindMCP, "alpha", false, errors.New("dial tcp: connection refused"), 3*time.Millisecond, targetHealthSourceProbe) + gw.targetHealth.record(targetKindMCP, "alpha", "", false, errors.New("dial tcp: connection refused"), 3*time.Millisecond, targetHealthSourceProbe) rec := httptest.NewRecorder() h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) @@ -2548,7 +2593,7 @@ func TestAdminTargets_Health_AgentUsesAgentKind(t *testing.T) { cfg.Agents = map[string]*AgentConfig{"bot1": {URL: "http://agent-bot1.internal"}} h, gw := newAdminGatewayHandle(t, cfg) - gw.targetHealth.record(targetKindAgent, "bot1", true, nil, time.Millisecond, targetHealthSourceTraffic) + gw.targetHealth.record(targetKindAgent, "bot1", "", true, nil, time.Millisecond, targetHealthSourceTraffic) rec := httptest.NewRecorder() h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) @@ -2563,3 +2608,37 @@ func TestAdminTargets_Health_AgentUsesAgentKind(t *testing.T) { t.Fatalf("agents = %+v, want bot1 healthy", got.Agents) } } + +// TestAdminTargets_Health_LastError_ScrubsTargetCredentials proves F1 end +// to end: a target URL configured with an embedded credential never +// reaches GET /admin/api/targets through lastError, even though the +// recorded probe error text embeds the exact configured URL — mirroring +// the credential scrub sanitizeBaseURL already applies to the sibling +// "url" field. +func TestAdminTargets_Health_LastError_ScrubsTargetCredentials(t *testing.T) { + t.Parallel() + rawURL := "https://svc.internal/mcp?api-key=SECRETVALUE" + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: rawURL}} + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, gw := newAdminGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", rawURL, false, errors.New(`Get "`+rawURL+`": dial tcp: connection refused`), 3*time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + body := rec.Body.String() + if strings.Contains(body, "SECRETVALUE") { + t.Errorf("body = %s, want lastError scrubbed of the target's api-key", body) + } + var got adminTargetsResponse + if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { + t.Fatalf("decode: %v", err) + } + if strings.Contains(got.MCPServers[0].Health.LastError, "SECRETVALUE") { + t.Errorf("lastError = %q, want scrubbed", got.MCPServers[0].Health.LastError) + } +} diff --git a/mcp_a2a.go b/mcp_a2a.go index 1fc6c64..32df7e9 100644 --- a/mcp_a2a.go +++ b/mcp_a2a.go @@ -226,7 +226,7 @@ func (g *Gateway) handleTargetProxy(w http.ResponseWriter, r *http.Request, u *u // success/failure rule. start := time.Now() result, ok := g.proxyUpstream(w, r, upstreamURL, g.targetClient, nil, nil, false, kind+" target (name "+name+")", g.targetTimeout) - g.recordTargetProxyHealth(kind, name, result, ok, time.Since(start)) + g.recordTargetProxyHealth(kind, name, targetURL, result, ok, time.Since(start)) } // validateTargetURLs checks every configured MCP-server and agent entry at diff --git a/mcp_federation.go b/mcp_federation.go index e2dd4d3..223bbd2 100644 --- a/mcp_federation.go +++ b/mcp_federation.go @@ -980,7 +980,7 @@ func (g *Gateway) mcpFederatedToolsList(w http.ResponseWriter, format mcpRespons // it is recorded separately, below, once the shape is known. probeStart := time.Now() resp, err := g.mcpBackendCall(fanoutCtx, targetURL, "tools/list", struct{}{}, mcpBackendResponseMaxBytes) - g.targetHealth.record(targetKindMCP, name, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + g.targetHealth.record(targetKindMCP, name, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) mu.Lock() defer mu.Unlock() @@ -1103,7 +1103,7 @@ func (g *Gateway) mcpFederatedToolsCall(w http.ResponseWriter, format mcpRespons // not. probeStart := time.Now() resp, err := g.mcpBackendCall(ctx, targetURL, "tools/call", mcpToolCallParams{Name: toolName, Arguments: params.Arguments}, mcpBackendCallResponseMaxBytes) - g.targetHealth.record(targetKindMCP, serverName, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + g.targetHealth.record(targetKindMCP, serverName, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) g.limiter.countTargetRequest(targetKindMCP, serverName) if err != nil { g.logf("federated tools/call: server %q: %v", serverName, err) diff --git a/metrics_test.go b/metrics_test.go index 6cc675e..0bf64a3 100644 --- a/metrics_test.go +++ b/metrics_test.go @@ -1533,8 +1533,8 @@ func TestMetrics_TargetHealthy_ReflectsRecordedState(t *testing.T) { cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} h, gw := newMetricsGatewayHandle(t, cfg) - gw.targetHealth.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) - gw.targetHealth.record(targetKindAgent, "bot1", false, errors.New("boom"), time.Millisecond, targetHealthSourceProbe) + gw.targetHealth.record(targetKindMCP, "alpha", "", true, nil, time.Millisecond, targetHealthSourceTraffic) + gw.targetHealth.record(targetKindAgent, "bot1", "", false, errors.New("boom"), time.Millisecond, targetHealthSourceProbe) rec := httptest.NewRecorder() h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) @@ -1558,7 +1558,7 @@ func TestMetrics_TargetHealthy_UnaffectedByStoreOutage(t *testing.T) { cfg := newMetricsTestConfig() cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} h, gw := newMetricsGatewayHandle(t, cfg) - gw.targetHealth.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) + gw.targetHealth.record(targetKindMCP, "alpha", "", true, nil, time.Millisecond, targetHealthSourceTraffic) gw.limiter.store = alwaysErrStore{} rec := httptest.NewRecorder() diff --git a/target_health.go b/target_health.go index 33cdeb7..a16b485 100644 --- a/target_health.go +++ b/target_health.go @@ -32,11 +32,22 @@ import ( type targetHealthState string const ( - // targetHealthUnknown: the tracker has never recorded an observation - // (probe or traffic) for this (kind, name) — a target configured but - // never yet reached. + // targetHealthUnknown covers two distinct situations (F4, + // feat/target-health review), both read the SAME state on purpose — + // neither has ever demonstrated the target actually works: + // 1. never observed at all — the tracker has no entry for this + // (kind, name) yet, a target configured but never yet reached. + // 2. observed, but never once succeeded — every observation so far + // is a failure, and consecutiveFailures has not yet reached + // failureThreshold. Reading "healthy" here (the pre-F4 behavior) + // would be a false claim from a target this tracker has never + // actually seen answer; reading "unhealthy" before the threshold + // is reached would discard the threshold's own protection + // against a single transient first failure. See + // targetHealthSnapshot.observed for how the admin view (admin.go) + // tells these two apart despite sharing this one state. targetHealthUnknown targetHealthState = "unknown" - // targetHealthHealthy: recorded at least once, and consecutiveFailures + // targetHealthHealthy: succeeded at least once, and consecutiveFailures // has not yet reached failureThreshold. This DELIBERATELY includes a // target whose most recent single observation was itself a failure: // 1 or 2 recent failures after a success still read "healthy" until @@ -47,7 +58,10 @@ const ( // state machine of its own (see this file's own package doc comment // for why). targetHealthHealthy targetHealthState = "healthy" - // targetHealthUnhealthy: consecutiveFailures >= failureThreshold. + // targetHealthUnhealthy: consecutiveFailures >= failureThreshold, + // regardless of whether the target has ever succeeded — the + // threshold gate always takes priority over the never-succeeded + // check above. targetHealthUnhealthy targetHealthState = "unhealthy" ) @@ -85,7 +99,11 @@ type targetHealthEntry struct { source string latency time.Duration consecutiveFailures int - lastOK bool + // everOK is set true the first time record observes a success for + // this entry, and never cleared afterward — stateForLocked's F4 + // "never succeeded yet reads unknown, not healthy" rule reads this, + // not consecutiveFailures alone. + everOK bool } // targetHealthTracker is feat/target-health's own per-pod, in-memory @@ -128,9 +146,20 @@ func newTargetHealthTracker(threshold int) *targetHealthTracker { // even on failure — a caller with no Go error to attach, e.g. a bad // HTTP status alone, still leaves lastError at whatever it previously // held rather than clearing it, since there IS a new failure to report). -// source is targetHealthSourceProbe or targetHealthSourceTraffic — -// whichever mechanism produced this observation. -func (t *targetHealthTracker) record(kind, name string, ok bool, err error, latency time.Duration, source string) { +// rawURL is (kind, name)'s configured target URL — the exact string a +// caller dialed, used ONLY to scrub err's text through sanitizeProviderErr +// (admin.go) before it is stored: a Go *url.Error embeds the dialed URL +// verbatim, so an operator-configured target URL carrying credentials +// (an "api-key" query parameter, userinfo) would otherwise leak through +// GET /admin/api/targets' lastError field the same way an unsanitized +// provider error once could (F1, feat/target-health review). The scrub +// runs BEFORE truncateRunes, not after: truncating first could cut a long +// embedded URL in half, leaving sanitizeProviderErr's exact-substring +// match unable to find it and a fragment of the credential in the +// truncated result. source is targetHealthSourceProbe or +// targetHealthSourceTraffic — whichever mechanism produced this +// observation. +func (t *targetHealthTracker) record(kind, name, rawURL string, ok bool, err error, latency time.Duration, source string) { if t == nil || name == "" { return } @@ -143,17 +172,17 @@ func (t *targetHealthTracker) record(kind, name string, ok bool, err error, late t.entries[key] = e } e.lastCheck = t.nowFn() - e.lastOK = ok e.latency = latency e.source = source if ok { + e.everOK = true e.consecutiveFailures = 0 e.lastError = "" return } e.consecutiveFailures++ if err != nil { - e.lastError = truncateRunes(err.Error(), targetHealthMaxErrorRunes) + e.lastError = truncateRunes(sanitizeProviderErr(err.Error(), rawURL), targetHealthMaxErrorRunes) } } @@ -173,11 +202,19 @@ func (t *targetHealthTracker) stateOf(kind, name string) targetHealthState { } // stateForLocked derives e's targetHealthState. Caller must hold t.mu. -// Split out of stateOf/snapshot so both apply the identical rule. +// Split out of stateOf/snapshot so both apply the identical rule. The +// threshold check runs first and always wins (F4): a target that has +// failed failureThreshold times straight reads unhealthy whether or not +// it has ever succeeded. Below threshold, a target that has never once +// succeeded reads unknown rather than healthy — see targetHealthUnknown's +// own doc comment for why. func (t *targetHealthTracker) stateForLocked(e *targetHealthEntry) targetHealthState { if e.consecutiveFailures >= t.failureThreshold { return targetHealthUnhealthy } + if !e.everOK { + return targetHealthUnknown + } return targetHealthHealthy } @@ -191,13 +228,21 @@ type targetHealthSnapshot struct { source string latency time.Duration consecutiveFailures int + // observed is true iff this tracker holds an entry for (kind, name) + // — i.e. record has been called at least once, regardless of + // success or failure. F4, feat/target-health review: state alone + // cannot tell apart targetHealthUnknown's two cases (never observed + // vs. observed-but-never-succeeded), so targetHealthView (admin.go) + // reads this field, not state, to decide whether to omit + // lastCheck/lastError/source/latencyMs — omit only while !observed. + observed bool } // snapshot returns a copy of (kind, name)'s current health state — // buildAdminTargets (admin.go) and writeTargetMetrics (metrics.go) both // read through this, once per configured target, rather than exposing // t.entries directly. A target this tracker has never observed returns -// a zero-valued snapshot with state targetHealthUnknown. +// a zero-valued, !observed snapshot with state targetHealthUnknown. func (t *targetHealthTracker) snapshot(kind, name string) targetHealthSnapshot { if t == nil { return targetHealthSnapshot{state: targetHealthUnknown} @@ -209,6 +254,7 @@ func (t *targetHealthTracker) snapshot(kind, name string) targetHealthSnapshot { return targetHealthSnapshot{state: targetHealthUnknown} } return targetHealthSnapshot{ + observed: true, state: t.stateForLocked(e), lastCheck: e.lastCheck, lastError: e.lastError, @@ -321,26 +367,49 @@ func targetHealthProbeTimeout(requestTimeout time.Duration) time.Duration { // caller reaches this on a live request path and must never block // behind a lock another such call already holds) — a CAS that fails // means either a sweep is already in flight, in which case returning is -// exactly right regardless of how long ago it started, or another -// goroutine just won the race to start this interval's sweep, in which -// case returning is exactly right too. The interval check above the CAS -// is a cheap early-out only; the CAS itself is what actually enforces -// "at most one sweep in flight, and at most one starts per interval". +// exactly right, or another goroutine just won the race to start this +// interval's sweep, in which case returning is exactly right too. The +// CAS alone enforces only single-flight — "at most one sweep in flight +// at a time" — NOT the probe interval: the interval load above it and +// the CAS are not atomic with each other, so a caller whose own interval +// read predates an entirely separate sweep's full start-and-finish could +// still win the CAS once that sweep clears the flag (worst at startup, +// when every caller's first read sees last == 0). F3, feat/target-health +// review: re-check the interval AFTER winning the CAS, against +// whatever targetHealthLastSweepUnixNano holds now — set by the sweep +// that raced ahead, if any — and back out without spawning when that +// sweep already started within the interval. func (g *Gateway) maybeSweepTargetHealth() { if !g.targetHealthCfg.enabled { return } - last := atomic.LoadInt64(&g.targetHealthLastSweepUnixNano) - if last != 0 && time.Duration(time.Now().UnixNano()-last) < g.targetHealthCfg.probeInterval { + if !targetHealthIntervalElapsed(atomic.LoadInt64(&g.targetHealthLastSweepUnixNano), g.targetHealthCfg.probeInterval) { return } if !atomic.CompareAndSwapInt32(&g.targetHealthSweeping, 0, 1) { return } - atomic.StoreInt64(&g.targetHealthLastSweepUnixNano, time.Now().UnixNano()) + now := time.Now().UnixNano() + if !targetHealthIntervalElapsed(atomic.LoadInt64(&g.targetHealthLastSweepUnixNano), g.targetHealthCfg.probeInterval) { + // Lost the race: some other sweep already started (and, since + // the flag was 0 again for this CAS to succeed, already + // finished) within the interval while this call was still + // working from its own, now-stale, interval read above. + atomic.StoreInt32(&g.targetHealthSweeping, 0) + return + } + atomic.StoreInt64(&g.targetHealthLastSweepUnixNano, now) go g.sweepTargetHealth() //nolint:gosec // G118: self-terminating, bounded by mcpFederatedFanoutConcurrency*targetHealthMaxProbeTimeout worst case, and always clears targetHealthSweeping on return (including on panic) — see maybeRefresh's identical reasoning, registry.go, for why this plugin accepts a bounded, self-terminating background goroutine despite having no Close hook to await it } +// targetHealthIntervalElapsed reports whether probeInterval has passed +// since lastSweepUnixNano (0 meaning "never swept", which always counts +// as elapsed) — the exact rule maybeSweepTargetHealth applies both above +// and, again, under the CAS. +func targetHealthIntervalElapsed(lastSweepUnixNano int64, probeInterval time.Duration) bool { + return lastSweepUnixNano == 0 || time.Duration(time.Now().UnixNano()-lastSweepUnixNano) >= probeInterval +} + // sweepTargetHealth performs one active probe sweep: every configured // MCP server and agent, concurrently, behind a semaphore of // mcpFederatedFanoutConcurrency (mcp_federation.go) — reusing federation's @@ -416,7 +485,7 @@ func (g *Gateway) probeMCPTarget(name, rawURL string, timeout time.Duration) { ctx, cancel := context.WithTimeout(context.Background(), timeout) ok, err := g.probeLegacySSE(ctx, rawURL) cancel() - g.targetHealth.record(targetKindMCP, name, ok, err, time.Since(start), targetHealthSourceProbe) + g.targetHealth.record(targetKindMCP, name, rawURL, ok, err, time.Since(start), targetHealthSourceProbe) return } @@ -429,7 +498,7 @@ func (g *Gateway) probeMCPTarget(name, rawURL string, timeout time.Duration) { g.mcpBackendCloseSession(closeCtx, rawURL, sessionID) closeCancel() } - g.targetHealth.record(targetKindMCP, name, ok, err, time.Since(start), targetHealthSourceProbe) + g.targetHealth.record(targetKindMCP, name, rawURL, ok, err, time.Since(start), targetHealthSourceProbe) } // probeLegacySSE probes a legacy HTTP+SSE-transport MCP server (URL path @@ -473,12 +542,12 @@ func (g *Gateway) probeAgentTarget(name, baseURL, cardPath string, timeout time. req, err := http.NewRequestWithContext(ctx, http.MethodGet, baseURL+cardPath, nil) //nolint:gosec // operator-configured target URL, validated at construction (validateTargetURLs, mcp_a2a.go) if err != nil { - g.targetHealth.record(targetKindAgent, name, false, err, time.Since(start), targetHealthSourceProbe) + g.targetHealth.record(targetKindAgent, name, baseURL, false, err, time.Since(start), targetHealthSourceProbe) return } resp, err := g.targetClient.Do(req) if err != nil { - g.targetHealth.record(targetKindAgent, name, false, err, time.Since(start), targetHealthSourceProbe) + g.targetHealth.record(targetKindAgent, name, baseURL, false, err, time.Since(start), targetHealthSourceProbe) return } _ = resp.Body.Close() //nolint:errcheck // read-side close; nothing actionable on failure @@ -487,7 +556,7 @@ func (g *Gateway) probeAgentTarget(name, baseURL, cardPath string, timeout time. if !ok { probeErr = fmt.Errorf("agent probe: upstream returned HTTP %d", resp.StatusCode) } - g.targetHealth.record(targetKindAgent, name, ok, probeErr, time.Since(start), targetHealthSourceProbe) + g.targetHealth.record(targetKindAgent, name, baseURL, ok, probeErr, time.Since(start), targetHealthSourceProbe) } // --- passive recording: handleTargetProxy (mcp_a2a.go) --- @@ -500,7 +569,7 @@ func (g *Gateway) probeAgentTarget(name, baseURL, cardPath string, timeout time. // since a 4xx still proves the target itself answered. A client cancel // (result.clientCanceled) records nothing at all: a caller hanging up // says nothing about the target's own health. -func (g *Gateway) recordTargetProxyHealth(kind, name string, result proxyResult, ok bool, latency time.Duration) { +func (g *Gateway) recordTargetProxyHealth(kind, name, rawURL string, result proxyResult, ok bool, latency time.Duration) { if result.clientCanceled { return } @@ -509,7 +578,7 @@ func (g *Gateway) recordTargetProxyHealth(kind, name string, result proxyResult, if failed { err = targetProxyHealthError(ok, result.status) } - g.targetHealth.record(kind, name, !failed, err, latency, targetHealthSourceTraffic) + g.targetHealth.record(kind, name, rawURL, !failed, err, latency, targetHealthSourceTraffic) } // targetProxyHealthError builds a short, bounded description for a diff --git a/target_health_test.go b/target_health_test.go index fc6f1cc..3ae3424 100644 --- a/target_health_test.go +++ b/target_health_test.go @@ -27,7 +27,7 @@ func TestTargetHealthTracker_NilReceiver_Safe(t *testing.T) { t.Parallel() var tr *targetHealthTracker assert.NotPanics(t, func() { - tr.record(targetKindMCP, "alpha", true, nil, time.Millisecond, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", true, nil, time.Millisecond, targetHealthSourceTraffic) }) assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindMCP, "alpha")) snap := tr.snapshot(targetKindMCP, "alpha") @@ -37,7 +37,7 @@ func TestTargetHealthTracker_NilReceiver_Safe(t *testing.T) { func TestTargetHealthTracker_SingleSuccess_ReadsHealthy(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) - tr.record(targetKindMCP, "alpha", true, nil, 5*time.Millisecond, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", true, nil, 5*time.Millisecond, targetHealthSourceTraffic) assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha")) } @@ -48,10 +48,10 @@ func TestTargetHealthTracker_SingleSuccess_ReadsHealthy(t *testing.T) { func TestTargetHealthTracker_BelowThreshold_StaysHealthy(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) - tr.record(targetKindMCP, "alpha", true, nil, 0, targetHealthSourceTraffic) - tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", true, nil, 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha"), "1 failure of threshold 3 must still read healthy") - tr.record(targetKindMCP, "alpha", false, errors.New("boom again"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom again"), 0, targetHealthSourceTraffic) assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha"), "2 failures of threshold 3 must still read healthy") } @@ -59,19 +59,50 @@ func TestTargetHealthTracker_ReachesThreshold_ReadsUnhealthy(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) for i := 0; i < 3; i++ { - tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) } assert.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "alpha")) } +// TestTargetHealthTracker_FirstObservationFailure_ReadsUnknown proves F4: +// a target whose only observations so far are failures below +// failureThreshold reads "unknown", not "healthy" — the tracker has +// never actually seen it succeed, so "healthy" would be a false claim +// even though the failure-threshold gate has not fired. The threshold +// still protects against a transient first failure: this stays +// "unknown", it does not jump straight to "unhealthy". +func TestTargetHealthTracker_FirstObservationFailure_ReadsUnknown(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindMCP, "alpha"), "never having succeeded must read unknown, not healthy, below threshold") + + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom again"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindMCP, "alpha"), "still unknown after a second failure, still below threshold") +} + +// TestTargetHealthTracker_SuccessThenFewFailures_ReadsHealthy re-proves +// TestTargetHealthTracker_BelowThreshold_StaysHealthy's claim in F4 +// terms: once a target HAS succeeded at least once, 1-2 subsequent +// failures below threshold still read "healthy" — F4 only changes the +// NEVER-succeeded case. +func TestTargetHealthTracker_SuccessThenFewFailures_ReadsHealthy(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", "", true, nil, 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom again"), 0, targetHealthSourceTraffic) + assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha")) +} + func TestTargetHealthTracker_SuccessAfterUnhealthy_RecoversToHealthy(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(2) - tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) - tr.record(targetKindMCP, "alpha", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) require.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "alpha")) - tr.record(targetKindMCP, "alpha", true, nil, 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", true, nil, 0, targetHealthSourceTraffic) assert.Equal(t, targetHealthHealthy, tr.stateOf(targetKindMCP, "alpha")) snap := tr.snapshot(targetKindMCP, "alpha") assert.Equal(t, 0, snap.consecutiveFailures, "a success must reset consecutiveFailures to 0") @@ -82,7 +113,7 @@ func TestTargetHealthTracker_ErrorString_BoundedLength(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) long := strings.Repeat("x", targetHealthMaxErrorRunes+500) - tr.record(targetKindMCP, "alpha", false, errors.New(long), 0, targetHealthSourceProbe) + tr.record(targetKindMCP, "alpha", "", false, errors.New(long), 0, targetHealthSourceProbe) snap := tr.snapshot(targetKindMCP, "alpha") assert.LessOrEqual(t, len([]rune(snap.lastError)), targetHealthMaxErrorRunes) assert.Equal(t, strings.Repeat("x", targetHealthMaxErrorRunes), snap.lastError) @@ -91,15 +122,65 @@ func TestTargetHealthTracker_ErrorString_BoundedLength(t *testing.T) { func TestTargetHealthTracker_ShortError_Unchanged(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) - tr.record(targetKindMCP, "alpha", false, errors.New("dial tcp: connection refused"), 0, targetHealthSourceProbe) + tr.record(targetKindMCP, "alpha", "", false, errors.New("dial tcp: connection refused"), 0, targetHealthSourceProbe) snap := tr.snapshot(targetKindMCP, "alpha") assert.Equal(t, "dial tcp: connection refused", snap.lastError) } +// TestTargetHealthTracker_Record_ScrubsCredentialsFromLastError proves F1: +// record scrubs an error's embedded target URL through sanitizeProviderErr +// before storing lastError, so a target URL configured with an embedded +// credential (an "api-key" query parameter, or userinfo) never survives +// into GET /admin/api/targets. +func TestTargetHealthTracker_Record_ScrubsCredentialsFromLastError(t *testing.T) { + t.Parallel() + + t.Run("query parameter credential", func(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + rawURL := "https://svc.internal/mcp?api-key=SECRETVALUE" + err := errors.New(`Get "` + rawURL + `": dial tcp: connection refused`) + tr.record(targetKindMCP, "alpha", rawURL, false, err, 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.NotContains(t, snap.lastError, "SECRETVALUE") + assert.NotContains(t, snap.lastError, "api-key=") + }) + + t.Run("userinfo credential", func(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + rawURL := "https://tok3n@svc.internal/mcp" + err := errors.New(`Get "` + rawURL + `": dial tcp: connection refused`) + tr.record(targetKindMCP, "alpha", rawURL, false, err, 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.NotContains(t, snap.lastError, "tok3n") + }) +} + +// TestTargetHealthTracker_Record_ScrubsBeforeTruncate proves F1: the URL +// scrub runs against err.Error() BEFORE truncateRunes bounds it to +// targetHealthMaxErrorRunes — even when the embedded URL straddles the +// truncation point, no fragment of the secret survives. +func TestTargetHealthTracker_Record_ScrubsBeforeTruncate(t *testing.T) { + t.Parallel() + tr := newTargetHealthTracker(3) + rawURL := "https://svc.internal/mcp?api-key=" + strings.Repeat("S", 60) + prefix := strings.Repeat("p", 180) + require.Less(t, len([]rune(prefix)), targetHealthMaxErrorRunes, "prefix must start before the truncation point") + require.Greater(t, len([]rune(prefix))+len([]rune(rawURL)), targetHealthMaxErrorRunes, "the url must straddle the truncation point") + errText := prefix + " " + rawURL + " connection refused" + + tr.record(targetKindMCP, "alpha", rawURL, false, errors.New(errText), 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + assert.LessOrEqual(t, len([]rune(snap.lastError)), targetHealthMaxErrorRunes) + assert.NotContains(t, snap.lastError, "SSSS", "no fragment of the secret must survive truncation") + assert.NotContains(t, snap.lastError, "api-key=") +} + func TestTargetHealthTracker_KeyedByKindAndName_Independent(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(1) - tr.record(targetKindMCP, "shared", false, errors.New("boom"), 0, targetHealthSourceTraffic) + tr.record(targetKindMCP, "shared", "", false, errors.New("boom"), 0, targetHealthSourceTraffic) assert.Equal(t, targetHealthUnhealthy, tr.stateOf(targetKindMCP, "shared")) assert.Equal(t, targetHealthUnknown, tr.stateOf(targetKindAgent, "shared"), "an mcp server and an agent sharing a name must track independently") } @@ -109,7 +190,7 @@ func TestTargetHealthTracker_Snapshot_FieldsPopulated(t *testing.T) { now := time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC) tr := newTargetHealthTracker(3) tr.nowFn = func() time.Time { return now } - tr.record(targetKindAgent, "beta", true, nil, 42*time.Millisecond, targetHealthSourceProbe) + tr.record(targetKindAgent, "beta", "", true, nil, 42*time.Millisecond, targetHealthSourceProbe) snap := tr.snapshot(targetKindAgent, "beta") assert.Equal(t, targetHealthHealthy, snap.state) @@ -127,7 +208,7 @@ func TestTargetHealthTracker_ConcurrentRecord_NoRace(t *testing.T) { wg.Add(1) go func(i int) { defer wg.Done() - tr.record(targetKindMCP, "alpha", i%2 == 0, errors.New("x"), time.Millisecond, targetHealthSourceTraffic) + tr.record(targetKindMCP, "alpha", "", i%2 == 0, errors.New("x"), time.Millisecond, targetHealthSourceTraffic) }(i) } wg.Wait() @@ -226,9 +307,14 @@ func newTargetHealthSweepGateway(t *testing.T, enabled bool, probeInterval time. func TestMaybeSweepTargetHealth_Disabled_NoOutboundRequests(t *testing.T) { t.Parallel() - hits := 0 + // F6, feat/target-health review: atomic even though a disabled sweep + // must never actually invoke this handler — a regression that DID + // invoke it would otherwise race this counter's read below under + // -race, obscuring the real bug (an unexpected outbound probe) behind + // a data-race report instead of the intended assert.Equal failure. + var hits int32 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - hits++ + atomic.AddInt32(&hits, 1) w.WriteHeader(http.StatusOK) })) defer srv.Close() @@ -240,7 +326,7 @@ func TestMaybeSweepTargetHealth_Disabled_NoOutboundRequests(t *testing.T) { // wait on — a brief sleep would only prove absence of a signal we // never expect to see. time.Sleep(20 * time.Millisecond) - assert.Equal(t, 0, hits, "a disabled targetHealth must never send an outbound probe") + assert.Equal(t, int32(0), atomic.LoadInt32(&hits), "a disabled targetHealth must never send an outbound probe") assert.Equal(t, targetHealthUnknown, gw.targetHealth.stateOf(targetKindMCP, "alpha")) } @@ -273,7 +359,20 @@ func TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight(t *testing.T) { w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"jsonrpc":"2.0","id":"federated","result":{}}`)) })) - defer srv.Close() + // F6, feat/target-health review: registered in this order so + // t.Cleanup's LIFO order unblocks the handler (closing release) + // BEFORE srv.Close runs — httptest.Server.Close blocks until + // outstanding requests complete, and the assertions below can + // t.Fatalf/t.Errorf before ever reaching the explicit close(release) + // further down; without this a failing assertion left the handler + // permanently blocked and srv.Close hung until the whole test + // binary's 10-minute timeout, rather than failing fast. unblock is + // idempotent (sync.Once) since the happy path below also calls it + // directly, before waiting on the sweep's resulting state. + var unblockOnce sync.Once + unblock := func() { unblockOnce.Do(func() { close(release) }) } + t.Cleanup(srv.Close) + t.Cleanup(unblock) gw := newTargetHealthSweepGateway(t, true, time.Hour, srv.URL) @@ -292,11 +391,64 @@ func TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight(t *testing.T) { // maybeSweepTargetHealth concurrently, at most one outbound request // must have been sent. waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) > 0 }, time.Second) - close(release) + unblock() waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown }, time.Second) assert.Equal(t, int32(1), atomic.LoadInt32(&hits), "concurrent triggers within one interval must produce exactly one sweep") } +// TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls proves F3: +// the interval load (top of maybeSweepTargetHealth) and the CAS that wins +// the single-flight flag are not atomic with each other. Without a +// re-check under the CAS, a caller whose own interval read predates an +// entirely separate sweep's start-and-finish could still win the CAS +// once that sweep clears the flag, and spawn a second sweep inside the +// same interval — worst at startup, when every caller's first read sees +// last == 0. A fast-completing first sweep, immediately followed by a +// burst of concurrent callers, must still yield exactly one sweep within +// probeInterval; a call after the interval has genuinely elapsed must +// start a second one. +func TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls(t *testing.T) { + t.Parallel() + var hits int32 + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + atomic.AddInt32(&hits, 1) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"jsonrpc":"2.0","id":"federated","result":{}}`)) + })) + defer srv.Close() + + probeInterval := 150 * time.Millisecond + gw := newTargetHealthSweepGateway(t, true, probeInterval, srv.URL) + + // First sweep: the probe answers immediately, so this completes fast + // and clears targetHealthSweeping well inside probeInterval. + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) > 0 }, time.Second) + waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown }, time.Second) + + // A burst of concurrent callers immediately after — still well inside + // probeInterval — must not start a second sweep. + var wg sync.WaitGroup + for i := 0; i < 50; i++ { + wg.Add(1) + go func() { + defer wg.Done() + gw.maybeSweepTargetHealth() + }() + } + wg.Wait() + time.Sleep(30 * time.Millisecond) // let any wrongly-spawned sweep reach the server + if got := atomic.LoadInt32(&hits); got != 1 { + t.Errorf("hits = %d, want exactly 1 (a burst of concurrent callers inside probeInterval must not start a second sweep)", got) + } + + // Once probeInterval has genuinely elapsed, a new call starts a + // second sweep. + time.Sleep(probeInterval) + gw.maybeSweepTargetHealth() + waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) == 2 }, time.Second) +} + // TestMaybeSweepTargetHealth_LegacySSE_ClosesBodyWithoutReading proves a // legacy "/sse" MCP server's probe uses a plain GET and closes the body // immediately: a test server that never closes its stream must not hang @@ -304,6 +456,7 @@ func TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight(t *testing.T) { func TestMaybeSweepTargetHealth_LegacySSE_ClosesBodyWithoutReading(t *testing.T) { t.Parallel() headersSent := make(chan struct{}) + release := make(chan struct{}) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.WriteHeader(http.StatusOK) @@ -312,9 +465,18 @@ func TestMaybeSweepTargetHealth_LegacySSE_ClosesBodyWithoutReading(t *testing.T) if ok { flusher.Flush() } - <-r.Context().Done() // never closes on its own; relies on the probe not reading + <-release // never closes on its own; relies on the probe not reading })) - defer srv.Close() + // F6, feat/target-health review: previously relied on the PROBE'S OWN + // 5s context timeout (targetTimeout below) to unblock this handler, + // so srv.Close (deferred) silently added a real ~5s stall to every + // run of this test. An explicit release channel, unblocked via + // t.Cleanup BEFORE srv.Close (LIFO — see + // TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight's own + // comment for the identical ordering reasoning), makes this test + // fast AND immune to a failing assertion ever leaving it blocked. + t.Cleanup(srv.Close) + t.Cleanup(func() { close(release) }) adapters := map[string]providerAdapter{"openai": newFakeAdapter("openai")} cfg := &Config{ From 88260a386bbb18a7139d4f02368fdc0234ad860a Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:45:15 +0100 Subject: [PATCH 06/15] fix(target-health): ignore context-caused federation errors mcpFederatedToolsList's fan-out and mcpFederatedToolsCall both derive their outbound context from r.Context(). A client cancel (context.Canceled) or the shared fan-out deadline expiring (context.DeadlineExceeded) is not evidence about a server's own health, so neither is recorded any more, mirroring recordTargetProxyHealth's own client-cancel rule. A server that is genuinely hung is still caught by the active probe sweep or its own per-server proxy health. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- README.md | 7 +- mcp_federation.go | 23 +++++- mcp_federation_test.go | 161 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4bd9de3..f05c4d0 100644 --- a/README.md +++ b/README.md @@ -1893,7 +1893,12 @@ plugin's config. `POST /mcp`'s `tools/list` fan-out and `tools/call` record a failure only when the outbound call itself fails (`err != nil` from the backend call) — a JSON-RPC-level `error` in the backend's own - response still counts as reachable, since the server answered. + response still counts as reachable, since the server answered. A + context-caused failure (the caller canceling, or the shared fan-out + deadline expiring) records nothing at all, the same client-cancel + rule the per-server proxy above applies; a genuinely hung server is + still caught by the active probe sweep or its own per-server proxy + health. - **Active probes are opt-in** (`targetHealth.enabled: true`) and lazy: no timer, no background goroutine running on its own. A probe sweep is triggered by `/metrics`, `GET /admin/api/targets`, `GET diff --git a/mcp_federation.go b/mcp_federation.go index 223bbd2..bdd6bd2 100644 --- a/mcp_federation.go +++ b/mcp_federation.go @@ -980,7 +980,20 @@ func (g *Gateway) mcpFederatedToolsList(w http.ResponseWriter, format mcpRespons // it is recorded separately, below, once the shape is known. probeStart := time.Now() resp, err := g.mcpBackendCall(fanoutCtx, targetURL, "tools/list", struct{}{}, mcpBackendResponseMaxBytes) - g.targetHealth.record(targetKindMCP, name, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + // F2: fanoutCtx is derived from r.Context() (above), so a + // client hang-up (context.Canceled) surfaces here as EVERY + // still-in-flight server's own error, and the shared + // toolsListBackendTimeout expiry (context.DeadlineExceeded) + // surfaces identically for a server that was genuinely slow + // AND one still parked on sem, never dialed at all — neither + // says anything about that server's own health, so neither is + // recorded, mirroring recordTargetProxyHealth's identical + // client-cancel rule (target_health.go). A server that is + // really hung is instead caught by the active probe sweep or + // its own per-request proxy health, not by this fan-out. + if err == nil || (!errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded)) { + g.targetHealth.record(targetKindMCP, name, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + } mu.Lock() defer mu.Unlock() @@ -1103,7 +1116,13 @@ func (g *Gateway) mcpFederatedToolsCall(w http.ResponseWriter, format mcpRespons // not. probeStart := time.Now() resp, err := g.mcpBackendCall(ctx, targetURL, "tools/call", mcpToolCallParams{Name: toolName, Arguments: params.Arguments}, mcpBackendCallResponseMaxBytes) - g.targetHealth.record(targetKindMCP, serverName, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + // F2: same context-caused-error guard as mcpFederatedToolsList's own + // fan-out, above — ctx here derives from r.Context() too, so a client + // cancel or the shared toolsCallBackendTimeout expiry must record + // nothing rather than a false failure. + if err == nil || (!errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded)) { + g.targetHealth.record(targetKindMCP, serverName, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) + } g.limiter.countTargetRequest(targetKindMCP, serverName) if err != nil { g.logf("federated tools/call: server %q: %v", serverName, err) diff --git a/mcp_federation_test.go b/mcp_federation_test.go index 94933e2..a386eb6 100644 --- a/mcp_federation_test.go +++ b/mcp_federation_test.go @@ -1995,3 +1995,164 @@ func TestHandleMCPFederated_ToolsCall_TargetHealth_UnreachableServer_RecordsUnhe t.Errorf("alpha state = %q, want unhealthy", got) } } + +// --- feat/target-health F2: context-caused fan-out errors record nothing --- +// +// A plain connection-refused server still recording a failure is already +// covered by TestHandleMCPFederated_ToolsList_TargetHealth_RecordsPerServer +// (tools/list) and TestHandleMCPFederated_ToolsCall_TargetHealth_UnreachableServer_RecordsUnhealthy +// (tools/call) above — both must keep passing unchanged by the F2 fix +// below, which only special-cases context.Canceled/context.DeadlineExceeded. + +// TestHandleMCPFederated_ToolsList_ClientCanceled_RecordsNothing proves F2: +// a client cancel mid-fan-out — context.Canceled propagating from +// r.Context() into fanoutCtx — records nothing for the servers still in +// flight, mirroring recordTargetProxyHealth's own client-cancel rule +// (target_health.go): a caller hanging up says nothing about the target's +// own health. +func TestHandleMCPFederated_ToolsList_ClientCanceled_RecordsNothing(t *testing.T) { + reached := make(chan struct{}, 2) + release := make(chan struct{}) + blocking := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + reached <- struct{}{} + <-release + }) + alpha := httptest.NewServer(blocking) + beta := httptest.NewServer(blocking) + // Registered in this order so t.Cleanup's LIFO order unblocks both + // handlers (closing release) BEFORE either server's Close is called — + // httptest.Server.Close blocks until outstanding requests complete, so + // closing it first would deadlock until the test's own timeout (F6). + t.Cleanup(alpha.Close) + t.Cleanup(beta.Close) + t.Cleanup(func() { close(release) }) + + cfg := newFederationTestConfig(alpha.URL, beta.URL, false) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + ctx, cancel := context.WithCancel(context.Background()) + req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")}).WithContext(ctx) + + done := make(chan struct{}) + rec := httptest.NewRecorder() + go func() { + h.ServeHTTP(rec, req) + close(done) + }() + + <-reached + <-reached + cancel() + <-done + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthUnknown { + t.Errorf("alpha state = %q, want unknown (a client cancel must record nothing)", got) + } + if got := gw.targetHealth.stateOf(targetKindMCP, "beta"); got != targetHealthUnknown { + t.Errorf("beta state = %q, want unknown (a client cancel must record nothing)", got) + } +} + +// TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing +// proves F2's second case: when the fan-out's own shared context expires +// (toolsListBackendTimeout, or here the incoming request's own shorter +// deadline — see TestHandleMCPFederated_ToolsList_SlowBackend_BoundedByRequestContext's +// own doc comment for why that stands in for the real 20s budget), a +// server still parked behind the fan-out semaphore — never actually +// dialed — must not be recorded as a failure either. mcpBackendCall +// returns the identical context.DeadlineExceeded whether a server was +// slow or never contacted at all, so this case is handled by the same +// guard as the client-cancel case above, not by tracking who was dialed. +func TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing(t *testing.T) { + block := make(chan struct{}) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + <-block + })) + t.Cleanup(srv.Close) + t.Cleanup(func() { close(block) }) + + // One more server than the fan-out semaphore has slots for + // (mcpFederatedFanoutConcurrency) guarantees at least one is still + // parked on the semaphore, never dialed, when the shared deadline + // fires. + names := make([]string, 0, mcpFederatedFanoutConcurrency+1) + mcpServers := make(map[string]*TargetConfig, mcpFederatedFanoutConcurrency+1) + for i := 0; i < mcpFederatedFanoutConcurrency+1; i++ { + name := fmt.Sprintf("srv%d", i) + names = append(names, name) + mcpServers[name] = &TargetConfig{URL: srv.URL} + } + + cfg := CreateConfig() + cfg.Providers = map[string]*ProviderConfig{"openai": {Type: "openai", APIKey: "k"}} + cfg.MCPServers = mcpServers + cfg.Groups = map[string]*GroupConfig{"default": {}} + cfg.Users = &UsersConfig{Inline: []*UserConfig{{Name: "alice", Group: "default", APIKey: "sk-alice"}}} + + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")}) + shortCtx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + defer cancel() + req = req.WithContext(shortCtx) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, req) + + for _, name := range names { + if got := gw.targetHealth.stateOf(targetKindMCP, name); got != targetHealthUnknown { + t.Errorf("mcp/%s state = %q, want unknown (a shared fan-out deadline expiry must record nothing)", name, got) + } + } +} + +// TestHandleMCPFederated_ToolsCall_ClientCanceled_RecordsNothing mirrors +// TestHandleMCPFederated_ToolsList_ClientCanceled_RecordsNothing for +// tools/call's own, separate context.WithTimeout(r.Context(), ...) call +// site. +func TestHandleMCPFederated_ToolsCall_ClientCanceled_RecordsNothing(t *testing.T) { + reached := make(chan struct{}) + release := make(chan struct{}) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + close(reached) + <-release + })) + t.Cleanup(srv.Close) + t.Cleanup(func() { close(release) }) + + cfg := newFederationTestConfig(srv.URL, "http://beta.invalid", true) + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + ctx, cancel := context.WithCancel(context.Background()) + callParams, _ := json.Marshal(mcpToolCallParams{Name: "alpha_lookup"}) + req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{ + JSONRPC: jsonrpcVersion, Method: "tools/call", ID: json.RawMessage("1"), Params: callParams, + }).WithContext(ctx) + + done := make(chan struct{}) + rec := httptest.NewRecorder() + go func() { + h.ServeHTTP(rec, req) + close(done) + }() + + <-reached + cancel() + <-done + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthUnknown { + t.Errorf("alpha state = %q, want unknown (a client cancel must record nothing)", got) + } +} From f5d9014b130a91dfb8714e36e13eb54a98a7ed95 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:46:04 +0100 Subject: [PATCH 07/15] test(target-health): deterministic yaegi-check and non-blocking sweep tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit exerciseTargetHealth's traffic-sourced assertion (mcpProbeServerName must read healthy/traffic, F5 review) raced its own trigger: GET /admin/api/targets was the first-ever sweep-capable route this harness hit, so the background sweep it started could beat the response encode and overwrite source from traffic to probe under Yaegi's interpreter overhead. exerciseTargetHealthProbeWarmup now runs first, before exerciseHandler, against a dedicated, never- proxied MCP target — its health can only ever be written by the probe, so polling it to healthy/probe both proves the interpreted active-probe path end to end and spends this gateway's one probeInterval-bounded sweep before any traffic runs, making every later target-health assertion in this harness deterministic. probeInterval moves from 10s to 60s so no later exercise can trigger a second sweep mid-run. TARGETHEALTH-1's expected state also updates to unknown, reflecting F4 (a2d152b1): mcpProbeServerName's only observation is a failed tools/call, so it has never once succeeded. mcp_a2a_test.go's ClientCanceled_RecordsNothing test replaces its 30ms-cancel-vs-200ms-sleep timing margin with a channel handshake (cancel only once the handler is genuinely reached, then release it), removing any wall-clock dependence. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- mcp_a2a_test.go | 34 ++++++-- tools/yaegi-check/main.go | 178 ++++++++++++++++++++++++++++++++------ 2 files changed, 178 insertions(+), 34 deletions(-) diff --git a/mcp_a2a_test.go b/mcp_a2a_test.go index 7394d66..ab2f1c2 100644 --- a/mcp_a2a_test.go +++ b/mcp_a2a_test.go @@ -1100,13 +1100,26 @@ func TestHandleTargetProxy_TargetHealth_HangTripsWatchdog_RecordsUnhealthy(t *te // TestHandleTargetProxy_TargetHealth_ClientCanceled_RecordsNothing // proves a canceled CLIENT request records nothing at all — the target's // own health stays "unknown", not "unhealthy", since the client hanging -// up says nothing about the target. +// up says nothing about the target. F6, feat/target-health review: uses +// a channel handshake (cancel only once the handler has genuinely been +// reached, then release it) instead of a 30ms-cancel-vs-200ms-sleep +// wall-clock margin, which left no slack under load and could either +// cancel before the request reached the handler or fail to prove the +// cancel raced a still-in-flight request. func TestHandleTargetProxy_TargetHealth_ClientCanceled_RecordsNothing(t *testing.T) { + reached := make(chan struct{}) + release := make(chan struct{}) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(200 * time.Millisecond) + close(reached) + <-release w.WriteHeader(http.StatusOK) })) - defer srv.Close() + // Registered in this order so t.Cleanup's LIFO order unblocks the + // handler (closing release) BEFORE srv.Close runs — see + // TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight's own + // comment (target_health_test.go) for the identical reasoning. + t.Cleanup(srv.Close) + t.Cleanup(func() { close(release) }) cfg := newTargetHealthProxyConfig(srv.URL) h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") @@ -1116,13 +1129,18 @@ func TestHandleTargetProxy_TargetHealth_ClientCanceled_RecordsNothing(t *testing gw := h.(*Gateway) ctx, cancel := context.WithCancel(context.Background()) - go func() { - time.Sleep(30 * time.Millisecond) - cancel() - }() req := httptest.NewRequest(http.MethodGet, "/mcp/alpha/tools/list", nil).WithContext(ctx) req.Header.Set("Authorization", "Bearer sk-alice") - h.ServeHTTP(httptest.NewRecorder(), req) + + done := make(chan struct{}) + go func() { + h.ServeHTTP(httptest.NewRecorder(), req) + close(done) + }() + + <-reached + cancel() + <-done snap := gw.targetHealth.snapshot(targetKindMCP, "alpha") if snap.state != targetHealthUnknown { diff --git a/tools/yaegi-check/main.go b/tools/yaegi-check/main.go index 136e370..3607517 100644 --- a/tools/yaegi-check/main.go +++ b/tools/yaegi-check/main.go @@ -415,6 +415,20 @@ func run() error { targetHealthDownUpstream := httptest.NewServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {})) targetHealthDownURL := targetHealthDownUpstream.URL targetHealthDownUpstream.Close() + // targetHealthProbeOnlyUpstream answers any JSON-RPC call — in + // practice only ever "initialize", from the active probe sweep + // (target_health.go's probeMCPTarget) — with a small, valid result + // well under mcpBackendResponseMaxBytes (4MiB), so the probe's + // handshake genuinely SUCCEEDS. targetHealthProbeOnlyServerName's own + // doc comment explains why this server backs a dedicated, + // never-proxied target rather than reusing mcpProbeUpstream (whose + // 11MiB body exceeds every response-size cap this plugin enforces, + // probe included, so it can only ever record a failure). + targetHealthProbeOnlyUpstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"jsonrpc":"2.0","id":"federated","result":{"protocolVersion":"2025-11-25","capabilities":{}}}`)) + })) + defer targetHealthProbeOnlyUpstream.Close() // anthropicProbeUpstream answers an Anthropic Messages API call with a // real Anthropic-shaped body, so the /v1/messages passthrough branch // (callAnthropicMessagesPassthrough) runs interpreted. A body @@ -598,16 +612,19 @@ func run() error { // runs correctly under Yaegi too, not just the config-override // one testDataWantModel already exercises. `"modelMeta":{"` + testDataWantModel + `":{"contextTokens":` + yaegiMetaContextTokens + `,"inputCostPerMTokMicroUsd":1250000,"outputCostPerMTokMicroUsd":10000000}},` + - `"mcpServers":{"` + mcpProbeServerName + `":{"url":"` + mcpProbeUpstream.URL + `"},"` + targetHealthDownServerName + `":{"url":"` + targetHealthDownURL + `"}},` + - // targetHealth (feat/target-health): enabled with a short - // probeInterval so a future active-probe assertion could run - // quickly if this harness ever adds one — exerciseTargetHealth - // (below) currently exercises the passive-recording and - // admin/metrics-exposure paths only, driven by real traffic - // (exerciseFederatedTooLarge's own federated call, and - // exerciseTargetHealth's own direct proxy calls against - // targetHealthDownServerName), never the active sweep itself. - `"targetHealth":{"enabled":true,"probeInterval":"10s"},` + + `"mcpServers":{"` + mcpProbeServerName + `":{"url":"` + mcpProbeUpstream.URL + `"},"` + targetHealthDownServerName + `":{"url":"` + targetHealthDownURL + `"},"` + targetHealthProbeOnlyServerName + `":{"url":"` + targetHealthProbeOnlyUpstream.URL + `"}},` + + // targetHealth (feat/target-health): enabled. probeInterval is + // deliberately well ABOVE the floor (10s): exerciseTargetHealthProbeWarmup + // (below) spends this gateway's ONE sweep for the whole + // probeInterval window right after construction, before any other + // exercise runs, specifically so no LATER exercise's own GET + // /admin/api/targets, /metrics, /v1/mcp/servers, or /v1/agents + // call can trigger a second sweep mid-run and race a passive- + // traffic assertion (F5, feat/target-health review — see + // exerciseTargetHealth's own doc comment for the exact race this + // avoids). "60s" comfortably outlasts this whole harness's + // real-world runtime. + `"targetHealth":{"enabled":true,"probeInterval":"60s"},` + // metrics (Prometheus text-exposition endpoint): enabled with // modelLabel on, so exerciseMetricsRoute below exercises the // opt-in per-(provider,model) breakdown under the interpreter @@ -663,6 +680,15 @@ func run() error { return fmt.Errorf("%s.New's returned value does not implement http.Handler", pkgName) } + // exerciseTargetHealthProbeWarmup (feat/target-health, F5 review) runs + // FIRST, before exerciseHandler and everything after it: its own doc + // comment explains why this ordering is what makes every later + // target-health assertion in this harness deterministic rather than + // racing the active probe sweep under Yaegi's interpreter overhead. + if err := exerciseTargetHealthProbeWarmup(handler); err != nil { + return err + } + if err := exerciseHandler(handler, builtinLookupContextTokens, failoverBHits); err != nil { return err } @@ -798,6 +824,18 @@ const ( targetHealthFailureThreshold = 3 ) +// targetHealthProbeOnlyServerName is a THIRD MCP server run() configures, +// against targetHealthProbeOnlyUpstream — a real, always-answering +// upstream this harness never proxies traffic through (no per-server +// proxy call, no federated tools/list or tools/call ever names it): its +// health entry can only ever be written by the ACTIVE PROBE sweep +// (target_health.go's probeMCPTarget), never by passive traffic. F5, +// feat/target-health review: exerciseTargetHealthProbeWarmup (below) +// uses this determinism to assert source == "probe" without racing +// anything, and to prove the interpreted initialize/close handshake path +// itself, not just "some sweep ran". +const targetHealthProbeOnlyServerName = "target-health-probe-only" + // metricsProbeAllowedCIDR is the CIDR block attemptAccountingOverride's // own metrics.allowedCIDRs names — see that literal's own comment for why // this must contain httptest.NewRequest's default RemoteAddr. @@ -1774,6 +1812,28 @@ type targetHealthProbeView struct { Source string `json:"source"` } +// pollTargetHealth drives GET /admin/api/targets against handler +// repeatedly until name's health satisfies want, or a 5s budget elapses, +// then returns its final reading either way — mirrors +// pollProviderAttemptCounters's identical poll-with-deadline shape +// (below), applied here to feat/target-health's own async sweep +// (maybeSweepTargetHealth spawns the actual probing goroutine and +// returns immediately, target_health.go's own doc comment) instead of +// limiter.spawn's async counter write. +func pollTargetHealth(handler http.Handler, name string, want func(targetHealthProbeView) bool) (targetHealthProbeView, error) { + deadline := time.Now().Add(5 * time.Second) + for { + health, err := readTargetHealth(handler, name) + if err != nil { + return targetHealthProbeView{}, err + } + if want(health) || time.Now().After(deadline) { + return health, nil + } + time.Sleep(10 * time.Millisecond) + } +} + // readTargetHealth returns name's own "health" object from GET // /admin/api/targets, searching both mcpServers and agents (mcpProbeServerName // and targetHealthDownServerName are both MCP servers, but this checks @@ -1812,28 +1872,94 @@ func readTargetHealth(handler http.Handler, name string) (targetHealthProbeView, return targetHealthProbeView{}, fmt.Errorf("target %q not in GET /admin/api/targets: %s", name, rec.Body.String()) } -// exerciseTargetHealth proves feat/target-health end to end under the -// REAL interpreter. Part (a): mcpProbeServerName already received one -// real federated tools/call attempt via exerciseFederatedTooLarge, -// above — its oversized response trips errMCPResponseTooLarge, a -// transport-level failure from doBackendJSONRPC's own perspective +// exerciseTargetHealthProbeWarmup proves feat/target-health's ACTIVE +// PROBE sweep end to end under the REAL interpreter, and — just as +// important — makes every LATER target-health assertion in this harness +// deterministic. Called from run() BEFORE exerciseHandler, i.e. before +// any other route this harness hits: GET /admin/api/targets is the +// first-ever sweep-capable route (maybeSweepTargetHealth's own doc +// comment, target_health.go, lists the four: serveMetrics, +// serveAdminTargets, handleMCPServers, handleAgents) this handler sees, +// so it deterministically owns the ONE sweep this gateway's +// probeInterval (configured to "60s", well above this harness's +// real-world runtime) allows for the rest of the run. +// +// This matters because targetHealthProbeOnlyServerName's own record() is +// not the only one a sweep touches — EVERY configured MCP server and +// agent gets probed in the same sweep (sweepTargetHealth's own doc +// comment), mcpProbeServerName included. Spending that one sweep here, +// before exerciseFederatedTooLarge ever drives mcpProbeServerName's real +// traffic observation, guarantees the traffic observation is the LAST +// write to that entry for the remainder of the run — no later +// admin/metrics/listing route can trigger a second sweep to race it +// (F5, feat/target-health review: this is what closes the race that +// used to make TARGETHEALTH-2, below, racy under Yaegi's interpreter +// overhead). +// +// targetHealthProbeOnlyServerName is dedicated to this assertion +// specifically because it is NEVER proxied or federated through by any +// other exercise in this harness — its health entry can only ever be +// written by the probe, so source == "probe" here is not just likely, +// it is the only value possible. Polling (pollTargetHealth) rather than +// asserting on a single read: the sweep itself still runs on its own +// spawned goroutine even though this call triggered it. +func exerciseTargetHealthProbeWarmup(handler http.Handler) error { + health, err := pollTargetHealth(handler, targetHealthProbeOnlyServerName, func(h targetHealthProbeView) bool { + return h.State != "unknown" + }) + if err != nil { + return err + } + if health.Source != "probe" { + return fmt.Errorf("TARGETHEALTH-PROBE-1: GET /admin/api/targets: %q health.source = %q, want %q (only the active probe ever touches this target)", targetHealthProbeOnlyServerName, health.Source, "probe") + } + // Recover's own swallow (sweepTargetHealth's defer, target_health.go) + // means an interpreted panic mid-probe would otherwise degrade to a + // silently-stuck "unknown" rather than a loud failure — asserting the + // FULL success shape here (not merely "state != unknown") is what + // makes a Yaegi incompatibility in the initialize/close handshake + // path visible instead of passing silently. + if health.State != "healthy" { + return fmt.Errorf("TARGETHEALTH-PROBE-2: GET /admin/api/targets: %q health.state = %q, want healthy (targetHealthProbeOnlyUpstream always answers initialize successfully)", targetHealthProbeOnlyServerName, health.State) + } + + fmt.Println("yaegi-check: target health active probe sweep ran and recorded correctly interpreted") + return nil +} + +// exerciseTargetHealth proves feat/target-health's PASSIVE recording end +// to end under the REAL interpreter, now that +// exerciseTargetHealthProbeWarmup (run() calls it first, above) has +// already spent this gateway's one probeInterval-bounded sweep — no +// further sweep can fire during this function, so neither part below +// races the active probe path. +// +// Part (a): mcpProbeServerName receives one real federated tools/call +// attempt via exerciseFederatedTooLarge (exerciseHandler, called before +// this function) — its oversized response trips errMCPResponseTooLarge, +// a transport-level failure from doBackendJSONRPC's own perspective // (mcp_federation.go), which mcpFederatedToolsCall records as a -// target-health failure. One failure stays well under -// targetHealthFailureThreshold, so the target still reads "healthy" — -// target_health.go's own doc comment explains why 1-2 recent failures -// short of the threshold stay healthy. Part (b): drives -// targetHealthFailureThreshold consecutive failures through the direct -// per-server proxy path (/mcp/{name}/..., handleTargetProxy) against -// targetHealthDownServerName's dead upstream, then asserts the SAME -// tracker flips that target to "unhealthy" on both GET -// /admin/api/targets and llmgateway_target_healthy on /metrics. +// target-health failure. This is the ONLY observation this target ever +// receives (the warmup above never touches it — see +// exerciseTargetHealthProbeWarmup's own doc comment for why spending the +// sweep before this call matters), so it has never once succeeded: +// F4 (feat/target-health review) reads that as "unknown", not "healthy" +// — the failure-threshold gate still protects against this single +// transient-looking failure, so it does not read "unhealthy" either. +// +// Part (b): drives targetHealthFailureThreshold consecutive failures +// through the direct per-server proxy path (/mcp/{name}/..., +// handleTargetProxy) against targetHealthDownServerName's dead upstream, +// then asserts the SAME tracker flips that target to "unhealthy" on +// both GET /admin/api/targets and llmgateway_target_healthy on +// /metrics. func exerciseTargetHealth(handler http.Handler) error { probeHealth, err := readTargetHealth(handler, mcpProbeServerName) if err != nil { return err } - if probeHealth.State != "healthy" { - return fmt.Errorf("TARGETHEALTH-1: GET /admin/api/targets: %q health.state = %q, want healthy (after one federated tools/call attempt, below threshold): %+v", mcpProbeServerName, probeHealth.State, probeHealth) + if probeHealth.State != "unknown" { + return fmt.Errorf("TARGETHEALTH-1: GET /admin/api/targets: %q health.state = %q, want unknown (one failed federated tools/call attempt, never having succeeded, below threshold — F4): %+v", mcpProbeServerName, probeHealth.State, probeHealth) } if probeHealth.Source != "traffic" { return fmt.Errorf("TARGETHEALTH-2: GET /admin/api/targets: %q health.source = %q, want %q", mcpProbeServerName, probeHealth.Source, "traffic") From 10d1825ed70305275ff97f2ca6d6dfaefd6e89aa Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:47:07 +0100 Subject: [PATCH 08/15] fix(target-health): omit target metrics family when unconfigured writeTargetMetrics now returns before emitting even llmgateway_target_healthy's own HELP/TYPE header when neither an MCP server nor an agent is configured, mirroring writeStoreHealthMetrics' identical behaviour when Redis is unconfigured. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- README.md | 4 +++- metrics.go | 8 ++++++++ metrics_test.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f05c4d0..6a094d0 100644 --- a/README.md +++ b/README.md @@ -1684,7 +1684,9 @@ plugin's config. - `llmgateway_target_healthy{kind,target}` — `1`/`0` gauge for an MCP server or A2A agent's tracked health; `kind` is `"mcp"` or `"agent"`. No sample at all for a target this tracker has never observed — see - [MCP and A2A](#mcp-and-a2a)'s "Target health" section. + [MCP and A2A](#mcp-and-a2a)'s "Target health" section. The whole + family, HELP and TYPE lines included, is absent entirely when no MCP + servers or agents are configured. - `llmgateway_limit_store_up` — `1`/`0` gauge for this replica's own connection to the configured limit store (Redis); absent entirely when no store is configured. Every store-backed family above simply diff --git a/metrics.go b/metrics.go index b39ad8b..a242d87 100644 --- a/metrics.go +++ b/metrics.go @@ -694,7 +694,15 @@ func (g *Gateway) writeProviderMetrics(m *metricWriter) { // unreadable". Iterates every CONFIGURED MCP server and agent (not just // ones the tracker happens to have an entry for), so a target removed // from config since its last observation contributes no stale series. +// F7, feat/target-health review: returns before emitting even the family's +// own HELP/TYPE header when no MCP server or agent is configured at all — +// mirrors writeStoreHealthMetrics' identical "nothing to report, no family +// either" early return above, rather than a HELP/TYPE line promising a +// metric family that can never carry a sample in this deployment. func (g *Gateway) writeTargetMetrics(m *metricWriter) { + if len(g.cfg.MCPServers) == 0 && len(g.cfg.Agents) == 0 { + return + } m.family("llmgateway_target_healthy", "gauge", "1 when an MCP server or A2A agent's health (last passive observation or active probe) is healthy, 0 when its consecutive-failure count has reached targetHealth.failureThreshold. No sample while never yet observed."+aggregationNoteTargetHealthy) diff --git a/metrics_test.go b/metrics_test.go index 0bf64a3..234206a 100644 --- a/metrics_test.go +++ b/metrics_test.go @@ -1521,6 +1521,58 @@ func TestMetrics_TargetHealthy_NoSampleWhileUnknown(t *testing.T) { } } +// TestMetrics_TargetHealthy_NoSampleWhileNeverSucceeded proves F4's +// second no-sample case: a target that HAS been observed, but has never +// once succeeded and is still below failureThreshold, reads "unknown" +// (TestTargetHealthTracker_FirstObservationFailure_ReadsUnknown) and +// therefore still emits no llmgateway_target_healthy sample — the same +// "a gap is honest, a fabricated value is not" rule the never-observed +// case above applies, now extended to "observed but never succeeded". +func TestMetrics_TargetHealthy_NoSampleWhileNeverSucceeded(t *testing.T) { + t.Parallel() + cfg := newMetricsTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: "http://mcp-alpha.internal"}} + h, gw := newMetricsGatewayHandle(t, cfg) + + gw.targetHealth.record(targetKindMCP, "alpha", "", false, errors.New("boom"), time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + _, samples := parsePrometheusText(t, rec.Body.Bytes()) + for _, s := range samples { + if s.name == "llmgateway_target_healthy" { + t.Errorf("unexpected sample %v — a target that has never succeeded must emit nothing", s) + } + } +} + +// TestMetrics_TargetHealthy_FamilyAbsentWhenNoTargetsConfigured proves +// F7: writeTargetMetrics omits even llmgateway_target_healthy's own +// HELP/TYPE header when no MCP server or agent is configured at all — +// mirroring writeStoreHealthMetrics' identical "nothing to report, no +// family either" behavior when Redis is unconfigured. +func TestMetrics_TargetHealthy_FamilyAbsentWhenNoTargetsConfigured(t *testing.T) { + t.Parallel() + cfg := newMetricsTestConfig() + h, _ := newMetricsGatewayHandle(t, cfg) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, metricsRequest(http.MethodGet, metricsPathDefault, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + types, _ := parsePrometheusText(t, rec.Body.Bytes()) + if _, ok := types["llmgateway_target_healthy"]; ok { + t.Error("want llmgateway_target_healthy's TYPE line absent when no MCP servers or agents are configured") + } + if strings.Contains(rec.Body.String(), "llmgateway_target_healthy") { + t.Errorf("body unexpectedly mentions llmgateway_target_healthy: %s", rec.Body.String()) + } +} + // TestMetrics_TargetHealthy_ReflectsRecordedState proves the gauge // renders 1 for a healthy MCP server and 0 for an unhealthy agent, with // the documented kind label values ("mcp"/"agent" — NOT the internal From aad01b8d6fcd61cce9fcdc514447ffa776e7c7f3 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:47:51 +0100 Subject: [PATCH 09/15] fix(target-health): keep sweep timestamp first for atomic alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit targetHealthLastSweepUnixNano moves to Gateway's first field. It is read and written only through sync/atomic's 64-bit functions, and the sync/atomic package guarantees 64-bit alignment on ARM, x86-32, and 32-bit MIPS only for a struct's first word — Traefik ships armv7 and 386 builds alongside amd64/arm64. Every other field keeps golangci-lint fieldalignment's pointer-grouped ordering; verified with the standalone fieldalignment analyzer that this is the only field out of place and adds no struct-size padding, only a documented +8 GC-scan-prefix cost. docs: catches up README's admin `health` object and Target health "State" bullet to F4 (previous commit, a0c8607) — three ways to read `state: "unknown"`, and that consecutiveFailures/lastCheck/ lastError/latencyMs/source stay present when a target has been observed but never succeeded. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- README.md | 34 ++++++++++++++++----- llmgateway.go | 83 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 78 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 6a094d0..49b826b 100644 --- a/README.md +++ b/README.md @@ -1549,9 +1549,11 @@ or in CI. `health` is `{"state","lastCheck","lastError","consecutiveFailures","latencyMs","source"}` — see [MCP and A2A](#mcp-and-a2a)'s "Target health" section for the full contract. `state` is `"unknown"`, `"healthy"`, or `"unhealthy"`, - and `consecutiveFailures` is always present; every other field is - omitted while `state` is `"unknown"` (this target has never been - observed). This route always reads existing state; when + and `consecutiveFailures` is always present. Every other field is + omitted only while this target has never once been observed; `state` + alone does not decide the omission, since `"unknown"` also covers a + target that has been observed but has not yet succeeded, and that case + keeps every field. This route always reads existing state; when `targetHealth.enabled`, it additionally triggers a background probe sweep when one is due, so the response itself never waits on that sweep. Polled every 5 seconds, in the same batch as `overview` and @@ -1921,11 +1923,27 @@ plugin's config. or the default `/.well-known/agent-card.json`); a `404` still counts as reachable — for example an umbrella agent whose root carries no card of its own. - - **State**: `"unknown"` (never observed), `"healthy"` (recorded at - least once, `consecutiveFailures` below `targetHealth.failureThreshold`), - or `"unhealthy"` (`consecutiveFailures` at or above the threshold). A - target with one or two recent failures after a success still reads - `"healthy"` until the threshold is actually crossed. + - **State**: `"healthy"` (succeeded at least once, + `consecutiveFailures` below `targetHealth.failureThreshold`), or + `"unhealthy"` (`consecutiveFailures` at or above the threshold, + whether or not the target has ever succeeded). A target with one or + two recent failures after a success still reads `"healthy"` until the + threshold is actually crossed. + - **`"unknown"` reads three ways**, all sharing one JSON `state` + value: + 1. never observed at all — no probe or passive traffic has reached + this target yet. `GET /admin/api/targets` omits every health field + but `state`/`consecutiveFailures` for this case. + 2. observed, but never once succeeded, and still below + `targetHealth.failureThreshold` — the threshold's protection + against a single transient first failure still applies, so this + does not jump straight to `"unhealthy"`, but a target this tracker + has never seen answer is not `"healthy"` either. Every other + health field is still present here, since there is a real + observation to show. + 3. either way, `llmgateway_target_healthy` emits no sample while + `state` is `"unknown"` — a gap in the series is honest, a + fabricated `1` is not. ## Security notes diff --git a/llmgateway.go b/llmgateway.go index 116678b..eceff6f 100644 --- a/llmgateway.go +++ b/llmgateway.go @@ -586,7 +586,26 @@ const maxExplicitBodyAdmissionCap = 10_000 // convention (admin.go) for the same reasoning spelled out once; this // struct is the other place it applies. type Gateway struct { - next http.Handler + // targetHealthLastSweepUnixNano MUST stay the first field (F7, + // feat/target-health review). It backs maybeSweepTargetHealth's + // single-flight gate (target_health.go) and is read/written only via + // sync/atomic's 64-bit functions (atomic.LoadInt64/StoreInt64) — the + // sync/atomic package documents that "on ARM, x86-32, and 32-bit + // MIPS, it is the caller's responsibility to arrange for 64-bit + // alignment of 64-bit words accessed atomically," and guarantees + // that alignment only for "the first word in an allocated struct, + // array, or slice." Traefik ships armv7 and 386 builds alongside + // amd64/arm64, so this is not a hypothetical: any field placed + // ahead of this one could silently misalign it on those platforms. + // Every field below is ordered by golangci-lint's fieldalignment + // linter (pointer-containing fields grouped first, for GC scan + // efficiency, then the rest) — this one field is the sole, deliberate + // exception, verified with `fieldalignment ./...` to add no + // additional padding: an 8-byte int64 transitions cleanly into the + // 8-byte-aligned pointer block that follows on every architecture + // this plugin targets. + targetHealthLastSweepUnixNano int64 + next http.Handler // redisClient is the same instance newGateway hands to both the // limiter's redisStore and the response cache (its own doc comment, // below, explains why it's built once and shared) — kept here too, @@ -617,19 +636,22 @@ type Gateway struct { adapters map[string]providerAdapter cfg *Config auth *authStore + // provenance is the in-process usage-accounting-provenance accumulator + // (feat: expose token-accounting provenance, metrics.go's + // provenanceStore) — recordUsageProvenance's only write target, and + // writeProvenanceMetrics/buildAdminProvenanceViews' (admin.go) own + // read source. Always constructed, here, by newGateway, even when + // Config.Metrics is nil or disabled, mirroring g.latency's own + // identical "always-present, usually-empty, nil-receiver-safe" + // convention immediately below — see that field's own doc comment for + // the full reasoning, which applies here unchanged. + provenance *provenanceStore // cache is nil whenever response caching is not configured or not // usable (cfg.Cache.Enabled is false, or true with no config.Redis — // see buildResponseCache, cache.go). Every call site checks for nil // before using it, rather than responseCache having its own // always-disabled zero value. cache *responseCache - // bodyAdmission is the buffered-channel semaphore acquireBodyAdmission - // (routes_unified.go) claims from and releases: security review - // finding 1b, 2026-08-22. Sized once, here, by newGateway (see - // defaultBodyAdmissionCap/Config.MaxInFlightBodyRequests) — never - // resized afterward, matching a Go channel's own fixed-capacity - // contract. - bodyAdmission chan struct{} // targetClient is the shared, connection-pooled *http.Client the // MCP/A2A target proxy (mcp_a2a.go) issues every upstream request // through — built once via newAdapterHTTPClient, the same constructor @@ -648,17 +670,14 @@ type Gateway struct { // identical "safe even off a bare &Gateway{} literal" convention // above. latency *latencyStore - // provenance is the in-process usage-accounting-provenance accumulator - // (feat: expose token-accounting provenance, metrics.go's - // provenanceStore) — recordUsageProvenance's only write target, and - // writeProvenanceMetrics/buildAdminProvenanceViews' (admin.go) own - // read source. Always constructed, here, by newGateway, even when - // Config.Metrics is nil or disabled, mirroring g.latency's own - // identical "always-present, usually-empty, nil-receiver-safe" - // convention immediately above — see that field's own doc comment for - // the full reasoning, which applies here unchanged. - provenance *provenanceStore - name string + // bodyAdmission is the buffered-channel semaphore acquireBodyAdmission + // (routes_unified.go) claims from and releases: security review + // finding 1b, 2026-08-22. Sized once, here, by newGateway (see + // defaultBodyAdmissionCap/Config.MaxInFlightBodyRequests) — never + // resized afterward, matching a Go channel's own fixed-capacity + // contract. + bodyAdmission chan struct{} + name string // failoverLogGate rate-limits runMeteredCall's generic "failing over" // log line (routes_unified.go) to once per storeErrorLogEvery // (adversarial-review fix, F10) — reuses auth.go's own logGate type, @@ -672,13 +691,13 @@ type Gateway struct { // never re-parses a CIDR string per scrape. nil when Metrics is // unconfigured or carries no AllowedCIDRs entries. metricsNets []*net.IPNet - // failover is Config.Failover, validated and resolved once by - // newGateway (validateFailoverConfig, failover.go). - failover failoverConfig // targetHealthCfg is Config.TargetHealth, validated and resolved once // by validateTargetHealthConfig (target_health.go) — maybeSweepTargetHealth // reads probeInterval/enabled from this, never the raw Config. targetHealthCfg targetHealthConfig + // failover is Config.Failover, validated and resolved once by + // newGateway (validateFailoverConfig, failover.go). + failover failoverConfig // targetTimeout is targetClient's own resolved request timeout — // Config.RequestTimeout only; an MCP/A2A target has no per-target // override the way a provider does. proxyUpstream's own callers @@ -686,15 +705,17 @@ type Gateway struct { // idle-progress body watchdog (timeout.go) matches the // ResponseHeaderTimeout already set on targetClient's Transport. targetTimeout time.Duration - // targetHealthLastSweepUnixNano/targetHealthSweeping back - // maybeSweepTargetHealth's own single-flight, at-most-one-sweep-per- - // interval gate (target_health.go): a UnixNano timestamp and a CAS - // flag, both atomic rather than mutex-guarded, since every caller - // (serveMetrics, serveAdminTargets, handleMCPServers, handleAgents) - // reaches maybeSweepTargetHealth on a live request path and must - // never block behind a lock another such call already holds. - targetHealthLastSweepUnixNano int64 - targetHealthSweeping int32 + // targetHealthSweeping is maybeSweepTargetHealth's own single-flight + // CAS flag (target_health.go) — its sibling, the UnixNano timestamp + // this same gate reads, is targetHealthLastSweepUnixNano, kept as + // this struct's FIRST field instead (see that field's own doc + // comment, top of this struct, for why). Both are atomic rather than + // mutex-guarded, since every caller (serveMetrics, serveAdminTargets, + // handleMCPServers, handleAgents) reaches maybeSweepTargetHealth on a + // live request path and must never block behind a lock another such + // call already holds. A plain int32 needs no special alignment + // treatment the way its int64 sibling does. + targetHealthSweeping int32 } // telemetryStartupOnce keeps the anonymous "plugin loaded" ping to one per From af84ed5eb7cbb0a1176ad2a1274cc09590fe70a1 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 02:49:55 +0100 Subject: [PATCH 10/15] feat(admin): show target health in the dashboard Add a Health column to the MCP servers and A2A agents tables in TargetsView. An unhealthy target renders a destructive badge with the age of its last check and carries the failure count, source, and scrubbed last error in the title. An unknown target renders an outline badge and, when it has failed but never succeeded, the same failure details in its title. A healthy target renders muted text with its last observed latency and no badge, matching the providers' convention. Add AdminTargetHealthView to the API types with the wire contract the Go side emits, a bare formatElapsedAgo helper next to formatAgo, and column-cell tests for all three states. Regenerate the baked admin assets. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- admin_assets_gen.go | 12 +- webui/src/lib/format.spec.ts | 45 +++++++- webui/src/lib/format.ts | 39 ++++++- webui/src/lib/target-columns.spec.ts | 158 +++++++++++++++++++++++++++ webui/src/lib/target-columns.ts | 97 +++++++++++++++- webui/src/types/api.ts | 39 +++++++ 6 files changed, 373 insertions(+), 17 deletions(-) create mode 100644 webui/src/lib/target-columns.spec.ts diff --git a/admin_assets_gen.go b/admin_assets_gen.go index 5bc69f2..cd15b6e 100644 --- a/admin_assets_gen.go +++ b/admin_assets_gen.go @@ -1,6 +1,6 @@ // Code generated by webui/generate.mjs; DO NOT EDIT. // -// Source: webui/dist/ (vite build output), digest 3ff0c88830d16950. +// Source: webui/dist/ (vite build output), digest 25a21c1cf0995404. // Regenerate via `make admin-ui` after any webui/ source change. // // Every asset body below is base64-encoded and decoded once at package-var @@ -34,16 +34,16 @@ func decodeAdminAsset(encoded string) []byte { // adminIndexHTML is GET /admin's response body (admin.go's serveAdminPage) — // the built Vue app's HTML shell. var adminIndexHTML = decodeAdminAsset( - "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPCEtLSBJbmxpbmUgZGF0YTogVVJJLCBub3QgYSBmaWxlIHVuZGVyIHB1YmxpYy86IGFkbWluLmdvJ3MgYXNzZXQgbWFwIG9ubHkKICAgICAgICAgZXZlciBob2xkcyBjb250ZW50LWhhc2hlZCBmaWxlcyB1bmRlciAvYWRtaW4vYXNzZXRzLyosIGFuZCB0aGUgYWRtaW4KICAgICAgICAgQ1NQJ3MgaW1nLXNyYyBhbGxvd3MgJ3NlbGYnIHBsdXMgZGF0YTogZm9yIGV4YWN0bHkgdGhpcyByZWFzb24g4oCUIG5vCiAgICAgICAgIGV4dHJhIHVuaGFzaGVkLWFzc2V0IHJvdXRlIGlzIG5lZWRlZCBmb3Igb25lIHNtYWxsIGljb24uIC0tPgogICAgPGxpbmsKICAgICAgcmVsPSJpY29uIgogICAgICB0eXBlPSJpbWFnZS9zdmcreG1sIgogICAgICBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ3JlY3Qgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyByeD0nNScgZmlsbD0nJTIzMDA3MmIyJy8lM0UlM0NwYXRoIGQ9J002IDE2LjUgMTAgOGwzIDYgMi0zLjUgMyA2JyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UiCiAgICAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+TExNIEdhdGV3YXkgLSBBZG1pbjwvdGl0bGU+CiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSIvYWRtaW4vYXNzZXRzL2luZGV4LUQ4QjhBQ0d0LmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgY3Jvc3NvcmlnaW4gaHJlZj0iL2FkbWluL2Fzc2V0cy9pbmRleC1DU2tJSXRyby5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9ImFwcCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==", + "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPCEtLSBJbmxpbmUgZGF0YTogVVJJLCBub3QgYSBmaWxlIHVuZGVyIHB1YmxpYy86IGFkbWluLmdvJ3MgYXNzZXQgbWFwIG9ubHkKICAgICAgICAgZXZlciBob2xkcyBjb250ZW50LWhhc2hlZCBmaWxlcyB1bmRlciAvYWRtaW4vYXNzZXRzLyosIGFuZCB0aGUgYWRtaW4KICAgICAgICAgQ1NQJ3MgaW1nLXNyYyBhbGxvd3MgJ3NlbGYnIHBsdXMgZGF0YTogZm9yIGV4YWN0bHkgdGhpcyByZWFzb24g4oCUIG5vCiAgICAgICAgIGV4dHJhIHVuaGFzaGVkLWFzc2V0IHJvdXRlIGlzIG5lZWRlZCBmb3Igb25lIHNtYWxsIGljb24uIC0tPgogICAgPGxpbmsKICAgICAgcmVsPSJpY29uIgogICAgICB0eXBlPSJpbWFnZS9zdmcreG1sIgogICAgICBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ3JlY3Qgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyByeD0nNScgZmlsbD0nJTIzMDA3MmIyJy8lM0UlM0NwYXRoIGQ9J002IDE2LjUgMTAgOGwzIDYgMi0zLjUgMyA2JyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UiCiAgICAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+TExNIEdhdGV3YXkgLSBBZG1pbjwvdGl0bGU+CiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSIvYWRtaW4vYXNzZXRzL2luZGV4LUN3UF9NYk9iLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgY3Jvc3NvcmlnaW4gaHJlZj0iL2FkbWluL2Fzc2V0cy9pbmRleC1DU2tJSXRyby5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9ImFwcCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==", ) // adminAssets maps each hashed filename under /admin/assets/ (admin.go's // serveAdminAsset) to its content. var adminAssets = map[string]adminAsset{ - "ChartsView-BVocJsry.js": { + "ChartsView--5PgKbV9.js": { contentType: "text/javascript; charset=utf-8", body: decodeAdminAsset( - "aW1wb3J0eyQgYXMgZSxBIGFzIHQsQXQgYXMgbixCIGFzIHIsQnQgYXMgaSxDIGFzIGEsQ3QgYXMgbyxEIGFzIHMsRHQgYXMgYyxFIGFzIGwsRXQgYXMgdSxGIGFzIGQsRnQgYXMgZixHIGFzIHAsSCBhcyBtLEkgYXMgaCxJdCBhcyBnLEogYXMgXyxLIGFzIHYsTCBhcyB5LEx0IGFzIGIsTSBhcyB4LE10IGFzIFMsTiBhcyBDLE50IGFzIHcsTyBhcyBULE90IGFzIEUsUCBhcyBELFB0IGFzIE8sUSBhcyBrLFIgYXMgZWUsUnQgYXMgdGUsUyBhcyBuZSxTdCBhcyByZSxUIGFzIGllLFR0IGFzIGFlLFUgYXMgb2UsViBhcyBzZSxWdCBhcyBjZSxXIGFzIGxlLFggYXMgdWUsWSBhcyBkZSxaIGFzIGZlLF8gYXMgcGUsX3QgYXMgbWUsYSBhcyBoZSxhdCBhcyBnZSxiIGFzIEEsYyBhcyBfZSxjdCBhcyB2ZSxkIGFzIHllLGR0IGFzIGosZXQgYXMgTSxmIGFzIGJlLGZ0IGFzIHhlLGcgYXMgU2UsZ3QgYXMgTixoIGFzIENlLGh0IGFzIHdlLGkgYXMgVGUsaXQgYXMgUCxqIGFzIEVlLGp0IGFzIEYsayBhcyBEZSxrdCBhcyBPZSxsIGFzIGtlLGx0IGFzIEFlLG0gYXMgamUsbXQgYXMgTWUsbiBhcyBOZSxudCBhcyBJLG8gYXMgUGUsb3QgYXMgTCxwIGFzIEZlLHB0IGFzIEllLHEgYXMgTGUsciBhcyBSZSxydCBhcyB6ZSxzIGFzIEJlLHN0IGFzIFIsdCBhcyBWZSx0dCBhcyBIZSx1IGFzIFVlLHV0IGFzIFdlLHYgYXMgR2UsdnQgYXMgeix3IGFzIEtlLHd0IGFzIEIseCBhcyBxZSx4dCBhcyBWLHkgYXMgSmUseXQgYXMgWWUseiBhcyBYZSx6dCBhcyBaZX1mcm9tIi4vaW5kZXgtRDhCOEFDR3QuanMiO2Z1bmN0aW9uIFFlKGUsdD0tMS8wLG49MS8wKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiAkZShlLHQsbil7bGV0IHI9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxpPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSksci5kaXNwYXRjaEV2ZW50KGkpfXZhciBldD1uKHtsYXllcnNSb290Om5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzOnZvaWQgMCxicmFuY2hlczpuZXcgU2V0fSk7ZnVuY3Rpb24gdHQoZSl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4hMTtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHQhPT1udWxsJiZ0IT09T2JqZWN0LnByb3RvdHlwZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpIT09bnVsbHx8U3ltYm9sLml0ZXJhdG9yIGluIGU/ITE6U3ltYm9sLnRvU3RyaW5nVGFnIGluIGU/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgTW9kdWxlXWA6ITB9ZnVuY3Rpb24gbnQoZSx0LG49YC5gLHIpe2lmKCF0dCh0KSlyZXR1cm4gbnQoZSx7fSxuLHIpO2xldCBpPXsuLi50fTtmb3IobGV0IHQgb2YgT2JqZWN0LmtleXMoZSkpe2lmKHQ9PT1gX19wcm90b19fYHx8dD09PWBjb25zdHJ1Y3RvcmApY29udGludWU7bGV0IGE9ZVt0XTthIT1udWxsJiYociYmcihpLHQsYSxuKXx8KGlbdF09QXJyYXkuaXNBcnJheShhKSYmQXJyYXkuaXNBcnJheShpW3RdKT9bLi4uYSwuLi5pW3RdXTp0dChhKSYmdHQoaVt0XSk/bnQoYSxpW3RdLChuP2Ake259LmA6YGApK3QudG9TdHJpbmcoKSxyKTphKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuKC4uLnQpPT50LnJlZHVjZSgodCxuKT0+bnQodCxuLGBgLGUpLHt9KX12YXIgaXQ9cnQoKSxhdD1kKCgpPT57bGV0IGU9RihuZXcgTWFwKSxuPUYoKSxyPU0oKCk9Pntmb3IobGV0IHQgb2YgZS52YWx1ZS52YWx1ZXMoKSlpZih0KXJldHVybiEwO3JldHVybiExfSksaT1zKHtzY3JvbGxCb2R5OkYoITApfSksYT1udWxsLG89KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gYCxkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0PWBgLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPWBgKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0tc2Nyb2xsYmFyLXdpZHRoYCksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1uLnZhbHVlPz9gYCx5JiZhPy4oKSxuLnZhbHVlPXZvaWQgMH07cmV0dXJuIFYociwoZSxzKT0+e2lmKCFoKXJldHVybjtpZighZSl7cyYmbygpO3JldHVybn1uLnZhbHVlPT09dm9pZCAwJiYobi52YWx1ZT1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93KTtsZXQgYz13aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsbD17cGFkZGluZzpjLG1hcmdpbjowfSx1PWkuc2Nyb2xsQm9keT8udmFsdWU/dHlwZW9mIGkuc2Nyb2xsQm9keS52YWx1ZT09YG9iamVjdGA/aXQoe3BhZGRpbmc6aS5zY3JvbGxCb2R5LnZhbHVlLnBhZGRpbmc9PT0hMD9jOmkuc2Nyb2xsQm9keS52YWx1ZS5wYWRkaW5nLG1hcmdpbjppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2luPT09ITA/YzppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2lufSxsKTpsOntwYWRkaW5nOjAsbWFyZ2luOjB9O2M+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXR5cGVvZiB1LnBhZGRpbmc9PWBudW1iZXJgP2Ake3UucGFkZGluZ31weGA6U3RyaW5nKHUucGFkZGluZyksZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodD10eXBlb2YgdS5tYXJnaW49PWBudW1iZXJgP2Ake3UubWFyZ2lufXB4YDpTdHJpbmcodS5tYXJnaW4pLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShgLS1zY3JvbGxiYXItd2lkdGhgLGAke2N9cHhgKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PWBoaWRkZW5gKSx5JiYoYT10KGRvY3VtZW50LGB0b3VjaG1vdmVgLGU9PmN0KGUpLHtwYXNzaXZlOiExfSkpLHhlKCgpPT57ci52YWx1ZSYmKGRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1gaGlkZGVuYCl9KX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgc3luY2B9KSxlfSk7ZnVuY3Rpb24gb3QoZSl7bGV0IHQ9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsNyksbj1hdCgpO24udmFsdWUuc2V0KHQsZT8/ITEpO2xldCBpPU0oe2dldDooKT0+bi52YWx1ZS5nZXQodCk/PyExLHNldDplPT5uLnZhbHVlLnNldCh0LGUpfSk7cmV0dXJuIHIoKCk9PntuLnZhbHVlLmRlbGV0ZSh0KX0pLGl9ZnVuY3Rpb24gc3QoZSl7bGV0IHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7aWYodC5vdmVyZmxvd1g9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1k9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1g9PT1gYXV0b2AmJmUuY2xpZW50V2lkdGg8ZS5zY3JvbGxXaWR0aHx8dC5vdmVyZmxvd1k9PT1gYXV0b2AmJmUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0KXJldHVybiEwO3tsZXQgdD1lLnBhcmVudE5vZGU7cmV0dXJuISh0IGluc3RhbmNlb2YgRWxlbWVudCl8fHQudGFnTmFtZT09PWBCT0RZYD8hMTpzdCh0KX19ZnVuY3Rpb24gY3QoZSl7bGV0IHQ9ZXx8d2luZG93LmV2ZW50LG49dC50YXJnZXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBFbGVtZW50JiZzdChuKT8hMTp0LnRvdWNoZXMubGVuZ3RoPjF8fCh0LnByZXZlbnREZWZhdWx0JiZ0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKSwhMSl9dmFyIGx0PTA7ZnVuY3Rpb24gdXQoKXtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtZm9jdXMtZ3VhcmRdYCk7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoYGFmdGVyYmVnaW5gLHRbMF0/P2R0KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KGBiZWZvcmVlbmRgLHRbMV0/P2R0KCkpLGx0KyssZSgoKT0+e2x0PT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtcmVrYS1mb2N1cy1ndWFyZF1gKS5mb3JFYWNoKGU9PmUucmVtb3ZlKCkpLGx0LS19KX0pfWZ1bmN0aW9uIGR0KCl7bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgc3BhbmApO3JldHVybiBlLnNldEF0dHJpYnV0ZShgZGF0YS1yZWthLWZvY3VzLWd1YXJkYCxgYCksZS50YWJJbmRleD0wLGUuc3R5bGUub3V0bGluZT1gbm9uZWAsZS5zdHlsZS5vcGFjaXR5PWAwYCxlLnN0eWxlLnBvc2l0aW9uPWBmaXhlZGAsZS5zdHlsZS5wb2ludGVyRXZlbnRzPWBub25lYCxlfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBNKCgpPT4hZyhlKXx8ISFEZShlKT8uY2xvc2VzdChgZm9ybWApKX12YXIgcHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudD5gdWA/bnVsbDooQXJyYXkuaXNBcnJheShlKT9lWzBdOmUpLm93bmVyRG9jdW1lbnQuYm9keX0sbXQ9bmV3IFdlYWtNYXAsaHQ9bmV3IFdlYWtNYXAsZ3Q9e30sX3Q9MCx2dD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuaG9zdHx8dnQoZS5wYXJlbnROb2RlKSl9LHl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe2lmKGUuY29udGFpbnModCkpcmV0dXJuIHQ7dmFyIG49dnQodCk7cmV0dXJuIG4mJmUuY29udGFpbnMobik/bjooY29uc29sZS5lcnJvcihgYXJpYS1oaWRkZW5gLHQsYGluIG5vdCBjb250YWluZWQgaW5zaWRlYCxlLGAuIERvaW5nIG5vdGhpbmdgKSxudWxsKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hIWV9KX0sYnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eXQodCxBcnJheS5pc0FycmF5KGUpP2U6W2VdKTtndFtuXXx8KGd0W25dPW5ldyBXZWFrTWFwKTt2YXIgYT1ndFtuXSxvPVtdLHM9bmV3IFNldCxjPW5ldyBTZXQoaSksbD1mdW5jdGlvbihlKXshZXx8cy5oYXMoZSl8fChzLmFkZChlKSxsKGUucGFyZW50Tm9kZSkpfTtpLmZvckVhY2gobCk7dmFyIHU9ZnVuY3Rpb24oZSl7IWV8fGMuaGFzKGUpfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7aWYocy5oYXMoZSkpdShlKTtlbHNlIHRyeXt2YXIgdD1lLmdldEF0dHJpYnV0ZShyKSxpPXQhPT1udWxsJiZ0IT09YGZhbHNlYCxjPShtdC5nZXQoZSl8fDApKzEsbD0oYS5nZXQoZSl8fDApKzE7bXQuc2V0KGUsYyksYS5zZXQoZSxsKSxvLnB1c2goZSksYz09PTEmJmkmJmh0LnNldChlLCEwKSxsPT09MSYmZS5zZXRBdHRyaWJ1dGUobixgdHJ1ZWApLGl8fGUuc2V0QXR0cmlidXRlKHIsYHRydWVgKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKGBhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gYCxlLHQpfX0pfTtyZXR1cm4gdSh0KSxzLmNsZWFyKCksX3QrKyxmdW5jdGlvbigpe28uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1tdC5nZXQoZSktMSxpPWEuZ2V0KGUpLTE7bXQuc2V0KGUsdCksYS5zZXQoZSxpKSx0fHwoaHQuaGFzKGUpfHxlLnJlbW92ZUF0dHJpYnV0ZShyKSxodC5kZWxldGUoZSkpLGl8fGUucmVtb3ZlQXR0cmlidXRlKG4pfSksX3QtLSxfdHx8KG10PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGd0PXt9KX19LHh0PWZ1bmN0aW9uKGUsdCxuKXtuPT09dm9pZCAwJiYobj1gZGF0YS1hcmlhLWhpZGRlbmApO3ZhciByPUFycmF5LmZyb20oQXJyYXkuaXNBcnJheShlKT9lOltlXSksaT10fHxwdChlKTtyZXR1cm4gaT8oci5wdXNoLmFwcGx5KHIsQXJyYXkuZnJvbShpLnF1ZXJ5U2VsZWN0b3JBbGwoYFthcmlhLWxpdmVdLCBzY3JpcHRgKSkpLGJ0KHIsaSxuLGBhcmlhLWhpZGRlbmApKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX07ZnVuY3Rpb24gU3QoZSl7bGV0IHQ7VigoKT0+RGUoZSksZT0+e2xldCBuPSExO3RyeXtuPSEhZT8uY2xvc2VzdChgW3BvcG92ZXJdOm5vdCg6cG9wb3Zlci1vcGVuKWApfWNhdGNoe31lJiYhbj90PXh0KGUpOnQmJnQoKX0pLHdlKCgpPT57dCYmdCgpfSl9ZnVuY3Rpb24gQ3QoZSl7bGV0IHQ9RigpLG49TSgoKT0+dC52YWx1ZT8ud2lkdGg/PzApLHI9TSgoKT0+dC52YWx1ZT8uaGVpZ2h0Pz8wKSxpO3JldHVybiBNZSgoKT0+e2xldCBuPURlKGUpO24/KHQudmFsdWU9e3dpZHRoOm4ub2Zmc2V0V2lkdGgsaGVpZ2h0Om4ub2Zmc2V0SGVpZ2h0fSxpPW5ldyBSZXNpemVPYnNlcnZlcihlPT57aWYoIUFycmF5LmlzQXJyYXkoZSl8fCFlLmxlbmd0aClyZXR1cm47bGV0IHI9ZVswXSxpLGE7aWYoYGJvcmRlckJveFNpemVgaW4gcil7bGV0IGU9ci5ib3JkZXJCb3hTaXplLHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7aT10LmlubGluZVNpemUsYT10LmJsb2NrU2l6ZX1lbHNlIGk9bi5vZmZzZXRXaWR0aCxhPW4ub2Zmc2V0SGVpZ2h0O3QudmFsdWU9e3dpZHRoOmksaGVpZ2h0OmF9fSksaS5vYnNlcnZlKG4se2JveDpgYm9yZGVyLWJveGB9KSk6dC52YWx1ZT12b2lkIDB9KSx3ZSgoKT0+e2k/LmRpc2Nvbm5lY3QoKSxpPXZvaWQgMH0pLHt3aWR0aDpuLGhlaWdodDpyfX1mdW5jdGlvbiB3dChlKXtsZXQgdD1YZShgYCwxZTMpO3JldHVybntzZWFyY2g6dCxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6KG4scik9PntpZih0LnZhbHVlKz1uLGUpZShuKTtlbHNle2xldCBlPW0oKSxuPXIubWFwKGU9Pih7Li4uZSx0ZXh0VmFsdWU6ZS52YWx1ZT8udGV4dFZhbHVlPz9lLnJlZi50ZXh0Q29udGVudD8udHJpbSgpPz9gYH0pKSxpPW4uZmluZCh0PT50LnJlZj09PWUpLGE9RXQobi5tYXAoZT0+ZS50ZXh0VmFsdWUpLHQudmFsdWUsaT8udGV4dFZhbHVlKSxvPW4uZmluZChlPT5lLnRleHRWYWx1ZT09PWEpO3JldHVybiBvJiZvLnJlZi5mb2N1cygpLG8/LnJlZn19LHJlc2V0VHlwZWFoZWFkOigpPT57dC52YWx1ZT1gYH19fWZ1bmN0aW9uIFR0KGUsdCl7cmV0dXJuIGUubWFwKChuLHIpPT5lWyh0K3IpJWUubGVuZ3RoXSl9ZnVuY3Rpb24gRXQoZSx0LG4pe2xldCByPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkoZT0+ZT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xLGE9VHQoZSxNYXRoLm1heChpLDApKTtyLmxlbmd0aD09PTEmJihhPWEuZmlsdGVyKGU9PmUhPT1uKSk7bGV0IG89YS5maW5kKGU9PmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHIudG9Mb3dlckNhc2UoKSkpO3JldHVybiBvPT09bj92b2lkIDA6b312YXIgRHQ9YGRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlYCxPdD1gZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGVgO2Z1bmN0aW9uIGt0KGUsdCl7aWYoISh0IGluc3RhbmNlb2YgRWxlbWVudCkpcmV0dXJuITE7bGV0IG49dC5jbG9zZXN0KGBbZGF0YS1kaXNtaXNzYWJsZS1sYXllcl1gKSxyPWUuZGF0YXNldC5kaXNtaXNzYWJsZUxheWVyPT09YGA/ZTplLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWRpc21pc3NhYmxlLWxheWVyXWApLGk9QXJyYXkuZnJvbShlLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtZGlzbWlzc2FibGUtbGF5ZXJdYCkpO3JldHVybiEhKG4mJihyPT09bnx8aS5pbmRleE9mKHIpPGkuaW5kZXhPZihuKSkpfWZ1bmN0aW9uIEF0KGUsdCxuPSEwKXtsZXQgcj10Py52YWx1ZT8ub3duZXJEb2N1bWVudD8/Z2xvYmFsVGhpcz8uZG9jdW1lbnQsaT1GKCExKSxhPUYoKCk9Pnt9KTtyZXR1cm4gcmUobz0+e2lmKCFofHwhZyhuKSlyZXR1cm47bGV0IHM9YXN5bmMgbj0+e2xldCBvPW4udGFyZ2V0O2lmKCEoIXQ/LnZhbHVlfHwhbykpe2lmKGt0KHQudmFsdWUsbykpe2kudmFsdWU9ITE7cmV0dXJufWlmKG4udGFyZ2V0JiYhaS52YWx1ZSl7bGV0IHQ9e29yaWdpbmFsRXZlbnQ6bn07ZnVuY3Rpb24gaSgpeyRlKER0LGUsdCl9bi5wb2ludGVyVHlwZT09PWB0b3VjaGA/KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpLGEudmFsdWU9aSxyLmFkZEV2ZW50TGlzdGVuZXIoYGNsaWNrYCxhLnZhbHVlLHtvbmNlOiEwfSkpOmkoKX1lbHNlIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpO2kudmFsdWU9ITF9fSxjPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ci5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVyZG93bmAscyl9LDApO28oKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcG9pbnRlcmRvd25gLHMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpfSl9KSx7b25Qb2ludGVyRG93bkNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9fX1mdW5jdGlvbiBqdChlLHQsbj0hMCl7bGV0IHI9dD8udmFsdWU/Lm93bmVyRG9jdW1lbnQ/P2dsb2JhbFRoaXM/LmRvY3VtZW50LGk9RighMSk7cmV0dXJuIHJlKGE9PntpZighaHx8IWcobikpcmV0dXJuO2xldCBvPWFzeW5jIG49PntpZighdD8udmFsdWUpcmV0dXJuO2F3YWl0IHhlKCksYXdhaXQgeGUoKTtsZXQgcj1uLnRhcmdldDshdC52YWx1ZXx8IXJ8fGt0KHQudmFsdWUscil8fG4udGFyZ2V0JiYhaS52YWx1ZSYmJGUoT3QsZSx7b3JpZ2luYWxFdmVudDpufSl9O3IuYWRkRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbyksYSgoKT0+ci5yZW1vdmVFdmVudExpc3RlbmVyKGBmb2N1c2luYCxvKSl9KSx7b25Gb2N1c0NhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9LG9uQmx1ckNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMSl9fX12YXIgTXQ9Uih7X19uYW1lOmBEaXNtaXNzYWJsZUxheWVyYCxwcm9wczp7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH19LGVtaXRzOltgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWAsYGZvY3VzT3V0c2lkZWAsYGludGVyYWN0T3V0c2lkZWAsYGRpc21pc3NgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT5vLnZhbHVlPy5vd25lckRvY3VtZW50Pz9nbG9iYWxUaGlzLmRvY3VtZW50KSxjPU0oKCk9PmV0LmxheWVyc1Jvb3QpLGw9TSgoKT0+by52YWx1ZT9BcnJheS5mcm9tKGMudmFsdWUpLmluZGV4T2Yoby52YWx1ZSk6LTEpLHU9TSgoKT0+ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT4wKSxkPU0oKCk9PntsZXQgZT1BcnJheS5mcm9tKGMudmFsdWUpLFt0XT1bLi4uZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSxuPWUuaW5kZXhPZih0KTtyZXR1cm4gbC52YWx1ZT49bn0pLGY9QXQoYXN5bmMgZT0+e2xldCB0PVsuLi5ldC5icmFuY2hlc10uc29tZSh0PT50Py5jb250YWlucyhlLnRhcmdldCkpOyFuLnByZXNlbnR8fCFkLnZhbHVlfHx0fHwocihgcG9pbnRlckRvd25PdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGF3YWl0IHhlKCksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSxvKSxwPWp0KGU9PntsZXQgdD1bLi4uZXQuYnJhbmNoZXNdLnNvbWUodD0+dD8uY29udGFpbnMoZS50YXJnZXQpKTshbi5wcmVzZW50fHx0fHwocihgZm9jdXNPdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGUuZGVmYXVsdFByZXZlbnRlZHx8cihgZGlzbWlzc2ApKX0sbyk7cmV0dXJuIFQoYEVzY2FwZWAsZT0+e24ucHJlc2VudCYmbC52YWx1ZT09PWMudmFsdWUuc2l6ZS0xJiYocihgZXNjYXBlS2V5RG93bmAsZSksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSksVihbbywoKT0+bi5kaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsKCk9Pm4ucHJlc2VudF0sKFtlLHQsbl0scixpKT0+eyFlfHwhbnx8dCYmKGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cz1zLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWApLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChlKSxpKCgpPT57ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKGUpLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYhc2UoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cykmJihzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1ldC5vcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzKX0pKX0se2ltbWVkaWF0ZTohMH0pLFYoW28sKCk9Pm4ucHJlc2VudF0sKFtlLHRdLG4scik9PnshZXx8IXR8fChjLnZhbHVlLmFkZChlKSxyKCgpPT57Yy52YWx1ZS5kZWxldGUoZSl9KSl9LHtpbW1lZGlhdGU6ITB9KSxyZShlPT57ZSgoKT0+e28udmFsdWUmJihjLnZhbHVlLmRlbGV0ZShvLnZhbHVlKSxldC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoby52YWx1ZSkpfSl9KSwoZSx0KT0+KE4oKSxJKGIoQSkse3JlZjpiKGEpLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsImRhdGEtZGlzbWlzc2FibGUtbGF5ZXIiOmBgLHN0eWxlOmkoe3BvaW50ZXJFdmVudHM6dS52YWx1ZT9kLnZhbHVlP2BhdXRvYDpgbm9uZWA6dm9pZCAwfSksb25Gb2N1c0NhcHR1cmU6YihwKS5vbkZvY3VzQ2FwdHVyZSxvbkJsdXJDYXB0dXJlOmIocCkub25CbHVyQ2FwdHVyZSxvblBvaW50ZXJkb3duQ2FwdHVyZTpiKGYpLm9uUG9pbnRlckRvd25DYXB0dXJlfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2AsYHN0eWxlYCxgb25Gb2N1c0NhcHR1cmVgLGBvbkJsdXJDYXB0dXJlYCxgb25Qb2ludGVyZG93bkNhcHR1cmVgXSkpfX0pLE50PUQoKCk9PkYoW10pKTtmdW5jdGlvbiBQdCgpe2xldCBlPU50KCk7cmV0dXJue2FkZCh0KXtsZXQgbj1lLnZhbHVlWzBdO3QhPT1uJiZuPy5wYXVzZSgpLGUudmFsdWU9RnQoZS52YWx1ZSx0KSxlLnZhbHVlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXtlLnZhbHVlPUZ0KGUudmFsdWUsdCksZS52YWx1ZVswXT8ucmVzdW1lKCl9fX1mdW5jdGlvbiBGdChlLHQpe2xldCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59dmFyIEl0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnRgLEx0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudGAsUnQ9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMH07ZnVuY3Rpb24genQoZSx7c2VsZWN0OnQ9ITF9PXt9KXtsZXQgbj1tKCk7Zm9yKGxldCByIG9mIGUpaWYoR3Qocix7c2VsZWN0OnR9KSxtKCkhPT1uKXJldHVybiEwfWZ1bmN0aW9uIEJ0KGUpe2xldCB0PVZ0KGUpO3JldHVybltIdCh0LGUpLEh0KHQucmV2ZXJzZSgpLGUpXX1mdW5jdGlvbiBWdChlKXtsZXQgdD1bXSxuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCx7YWNjZXB0Tm9kZTplPT57bGV0IHQ9ZS50YWdOYW1lPT09YElOUFVUYCYmZS50eXBlPT09YGhpZGRlbmA7cmV0dXJuIGUuZGlzYWJsZWR8fGUuaGlkZGVufHx0P05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ZS50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIEh0KGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoIVV0KG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIFV0KGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PWBoaWRkZW5gKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PWBub25lYClyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBXdChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJmBzZWxlY3RgaW4gZX1mdW5jdGlvbiBHdChlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2xldCBuPW0oKTtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJld0KGUpJiZ0JiZlLnNlbGVjdCgpfX12YXIgS3Q9Uih7X19uYW1lOmBGb2N1c1Njb3BlYCxwcm9wczp7bG9vcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LHRyYXBwZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Btb3VudEF1dG9Gb2N1c2AsYHVubW91bnRBdXRvRm9jdXNgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgcj1lLGk9dCx7Y3VycmVudFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1GKG51bGwpLGM9UHQoKSxsPW4oe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KTtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PW8udmFsdWU7aWYoIXIudHJhcHBlZClyZXR1cm47ZnVuY3Rpb24gbihlKXtpZihsLnBhdXNlZHx8IXQpcmV0dXJuO2xldCBuPWUudGFyZ2V0O3QuY29udGFpbnMobik/cy52YWx1ZT1uOkd0KHMudmFsdWUse3NlbGVjdDohMH0pfWZ1bmN0aW9uIGkoZSl7aWYobC5wYXVzZWR8fCF0KXJldHVybjtsZXQgbj1lLnJlbGF0ZWRUYXJnZXQ7biE9PW51bGwmJih0LmNvbnRhaW5zKG4pfHxHdChzLnZhbHVlLHtzZWxlY3Q6ITB9KSl9ZnVuY3Rpb24gYShlKXtsZXQgbj1zLnZhbHVlO24hPT1udWxsJiZlLnNvbWUoZT0+ZS5yZW1vdmVkTm9kZXMubGVuZ3RoPjApJiYodC5jb250YWlucyhuKXx8R3QodCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3VzaW5gLG4pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3Vzb3V0YCxpKTtsZXQgYz1uZXcgTXV0YXRpb25PYnNlcnZlcihhKTt0JiZjLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNvdXRgLGkpLGMuZGlzY29ubmVjdCgpfSl9KTtmdW5jdGlvbiB1KGUsdCl7bGV0IG49bmV3IEN1c3RvbUV2ZW50KEl0LFJ0KSxyPWU9PmkoYG1vdW50QXV0b0ZvY3VzYCxlKTtlLmFkZEV2ZW50TGlzdGVuZXIoSXQsciksZS5kaXNwYXRjaEV2ZW50KG4pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihJdCxyKSxuLmRlZmF1bHRQcmV2ZW50ZWR8fCh6dChWdChlKSx7c2VsZWN0OiEwfSksbSgpPT09dCYmR3QoZSkpfXJlKGFzeW5jIGU9PntsZXQgdD1vLnZhbHVlO2lmKGF3YWl0IHhlKCksIXQpcmV0dXJuO3IucHJlc2VudCE9PSExJiZjLmFkZChsKTtsZXQgbj1tKCk7IXQuY29udGFpbnMobikmJnIucHJlc2VudCE9PSExJiZ1KHQsbiksZSgoKT0+e2xldCBlPW5ldyBDdXN0b21FdmVudChMdCxSdCkscj1lPT57aShgdW5tb3VudEF1dG9Gb2N1c2AsZSl9O3QuYWRkRXZlbnRMaXN0ZW5lcihMdCxyKSx0LmRpc3BhdGNoRXZlbnQoZSksdC5zZXRBdHRyaWJ1dGUoYGRhdGEtZm9jdXMtc2NvcGUtdW5tb3VudGluZ2AsYGApLHNldFRpbWVvdXQoKCk9PntlLmRlZmF1bHRQcmV2ZW50ZWR8fEd0KG4/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihMdCxyKSxjLnJlbW92ZShsKSx0LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1mb2N1cy1zY29wZS11bm1vdW50aW5nYCl9LDApfSl9KSxWKCgpPT5yLnByZXNlbnQsYXN5bmMoZSx0KT0+e2lmKCFoKXJldHVybjtpZihlPT09ITEmJnQ9PT0hMCl7Yy5yZW1vdmUobCk7cmV0dXJufWlmKGUhPT0hMHx8dCE9PSExKXJldHVybjtjLmFkZChsKSxhd2FpdCB4ZSgpO2xldCBuPW8udmFsdWU7aWYoIW4pcmV0dXJuO2xldCByPW0oKTtuLmNvbnRhaW5zKHIpfHx1KG4scil9KTtmdW5jdGlvbiBkKGUpe2lmKCFyLmxvb3AmJiFyLnRyYXBwZWR8fGwucGF1c2VkKXJldHVybjtsZXQgdD1lLmtleT09PWBUYWJgJiYhZS5hbHRLZXkmJiFlLmN0cmxLZXkmJiFlLm1ldGFLZXksbj1tKCk7aWYodCYmbil7bGV0IHQ9ZS5jdXJyZW50VGFyZ2V0LFtpLGFdPUJ0KHQpO2kmJmE/IWUuc2hpZnRLZXkmJm49PT1hPyhlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChpLHtzZWxlY3Q6ITB9KSk6ZS5zaGlmdEtleSYmbj09PWkmJihlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChhLHtzZWxlY3Q6ITB9KSk6bj09PXQmJmUucHJldmVudERlZmF1bHQoKX19cmV0dXJuKGUsdCk9PihOKCksSShiKEEpLHtyZWZfa2V5OmBjdXJyZW50UmVmYCxyZWY6YSx0YWJpbmRleDpgLTFgLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25LZXlkb3duOmR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhcy1jaGlsZGAsYGFzYF0pKX19KSxxdD1bYEVudGVyYCxgIGBdLEp0PVtgQXJyb3dEb3duYCxgUGFnZVVwYCxgSG9tZWBdLFl0PVtgQXJyb3dVcGAsYFBhZ2VEb3duYCxgRW5kYF07Wy4uLkp0LC4uLll0XSxbLi4ucXRdLFsuLi5xdF07ZnVuY3Rpb24gWHQoZSl7bGV0IHQ9bSgpO2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHwobi5mb2N1cygpLG0oKSE9PXQpKXJldHVybn12YXIgWnQ9Uih7X19uYW1lOmBUZWxlcG9ydGAscHJvcHM6e3RvOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRlZmVyOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX19LHNldHVwKHQpe2xldCBuPXQscj1zKHt9KSxpPU0oKCk9Pm4udG8/P3IudGVsZXBvcnRUbz8udmFsdWU/P2Bib2R5YCksYT1FZSgpO3JldHVybih0LG4pPT5iKGEpfHx0LmZvcmNlTW91bnQ/KE4oKSxJKGUse2tleTowLHRvOmkudmFsdWUsZGlzYWJsZWQ6dC5kaXNhYmxlZCxkZWZlcjp0LmRlZmVyfSxbeih0LiRzbG90cyxgZGVmYXVsdGApXSw4LFtgdG9gLGBkaXNhYmxlZGAsYGRlZmVyYF0pKTp6ZShgdi1pZmAsITApfX0pLFF0PVIoe19fbmFtZTpgVmlzdWFsbHlIaWRkZW5gLHByb3BzOntmZWF0dXJlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBmb2N1c2FibGVgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkse2FzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsImFyaWEtaGlkZGVuIjplLmZlYXR1cmU9PT1gZm9jdXNhYmxlYHx8ZS5mZWF0dXJlPT09YGZ1bGx5LWhpZGRlbmA/YHRydWVgOnZvaWQgMCwiZGF0YS1oaWRkZW4iOmUuZmVhdHVyZT09PWBmdWxseS1oaWRkZW5gP2BgOnZvaWQgMCx0YWJpbmRleDplLmZlYXR1cmU9PT1gZnVsbHktaGlkZGVuYD9gLTFgOnZvaWQgMCxzdHlsZTp7cG9zaXRpb246YGFic29sdXRlYCxib3JkZXI6MCx3aWR0aDpgMXB4YCxoZWlnaHQ6YDFweGAscGFkZGluZzowLG1hcmdpbjpgLTFweGAsb3ZlcmZsb3c6YGhpZGRlbmAsY2xpcDpgcmVjdCgwLCAwLCAwLCAwKWAsY2xpcFBhdGg6YGluc2V0KDUwJSlgLHdoaXRlU3BhY2U6YG5vd3JhcGAsd29yZFdyYXA6YG5vcm1hbGAsdG9wOmAtMXB4YCxsZWZ0OmAtMXB4YH19LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgYXJpYS1oaWRkZW5gLGBkYXRhLWhpZGRlbmAsYHRhYmluZGV4YF0pKX19KSxbJHQsZW5dPW9lKGBQb3BwZXJSb290YCksdG49Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyUm9vdGAsc2V0dXAoZSl7bGV0IHQ9RigpO3JldHVybiBlbih7YW5jaG9yOnQsb25BbmNob3JDaGFuZ2U6ZT0+dC52YWx1ZT1lfSksKGUsdCk9PnooZS4kc2xvdHMsYGRlZmF1bHRgKX19KSxubj1SKHtfX25hbWU6YFBvcHBlckFuY2hvcmAscHJvcHM6e3JlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPSR0KCk7cmV0dXJuIG8oKCk9PntpLm9uQW5jaG9yQ2hhbmdlKHQucmVmZXJlbmNlPz9yLnZhbHVlKX0pLChlLHQpPT4oTigpLEkoYihBKSx7cmVmOmIobiksYXM6ZS5hcywiYXMtY2hpbGQiOmUuYXNDaGlsZH0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pO2Z1bmN0aW9uIHJuKGUpe3JldHVybiBlIT09bnVsbH1mdW5jdGlvbiBhbihlKXtyZXR1cm57bmFtZTpgdHJhbnNmb3JtT3JpZ2luYCxvcHRpb25zOmUsZm4odCl7bGV0e3BsYWNlbWVudDpuLHJlY3RzOnIsbWlkZGxld2FyZURhdGE6aX09dCxhPWkuYXJyb3c/LmNlbnRlck9mZnNldCE9PTAsbz1hPzA6ZS5hcnJvd1dpZHRoLHM9YT8wOmUuYXJyb3dIZWlnaHQsW2MsbF09b24obiksdT17c3RhcnQ6ZS5kaXI9PT1gcnRsYD9gMTAwJWA6YDAlYCxjZW50ZXI6YDUwJWAsZW5kOmUuZGlyPT09YHJ0bGA/YDAlYDpgMTAwJWB9W2xdLGQ9e3N0YXJ0OmAwJWAsY2VudGVyOmA1MCVgLGVuZDpgMTAwJWB9W2xdLGY9KGkuYXJyb3c/Lng/PzApK28vMixwPShpLmFycm93Py55Pz8wKStzLzIsbT1gYCxoPWBgO3JldHVybiBjPT09YGJvdHRvbWA/KG09YT91OmAke2Z9cHhgLGg9YCR7LXN9cHhgKTpjPT09YHRvcGA/KG09YT91OmAke2Z9cHhgLGg9YCR7ci5mbG9hdGluZy5oZWlnaHQrc31weGApOmM9PT1gcmlnaHRgPyhtPWAkey1zfXB4YCxoPWE/ZDpgJHtwfXB4YCk6Yz09PWBsZWZ0YCYmKG09YCR7ci5mbG9hdGluZy53aWR0aCtzfXB4YCxoPWE/ZDpgJHtwfXB4YCkse2RhdGE6e3g6bSx5Omh9fX19fWZ1bmN0aW9uIG9uKGUpe2xldFt0LG49YGNlbnRlcmBdPWUuc3BsaXQoYC1gKTtyZXR1cm5bdCxuXX12YXIgc249W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSxjbj1NYXRoLm1pbixsbj1NYXRoLm1heCx1bj1NYXRoLnJvdW5kLGRuPU1hdGguZmxvb3IsZm49ZT0+KHt4OmUseTplfSkscG49e2xlZnQ6YHJpZ2h0YCxyaWdodDpgbGVmdGAsYm90dG9tOmB0b3BgLHRvcDpgYm90dG9tYH07ZnVuY3Rpb24gbW4oZSx0LG4pe3JldHVybiBsbihlLGNuKHQsbikpfWZ1bmN0aW9uIGhuKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UodCk6ZX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZS5zcGxpdChgLWApWzBdfWZ1bmN0aW9uIF9uKGUpe3JldHVybiBlLnNwbGl0KGAtYClbMV19ZnVuY3Rpb24gdm4oZSl7cmV0dXJuIGU9PT1geGA/YHlgOmB4YH1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZT09PWB5YD9gaGVpZ2h0YDpgd2lkdGhgfWZ1bmN0aW9uIGJuKGUpe2xldCB0PWVbMF07cmV0dXJuIHQ9PT1gdGB8fHQ9PT1gYmA/YHlgOmB4YH1mdW5jdGlvbiB4bihlKXtyZXR1cm4gdm4oYm4oZSkpfWZ1bmN0aW9uIFNuKGUsdCxuKXtuPT09dm9pZCAwJiYobj0hMSk7bGV0IHI9X24oZSksaT14bihlKSxhPXluKGkpLG89aT09PWB4YD9yPT09KG4/YGVuZGA6YHN0YXJ0YCk/YHJpZ2h0YDpgbGVmdGA6cj09PWBzdGFydGA/YGJvdHRvbWA6YHRvcGA7cmV0dXJuIHQucmVmZXJlbmNlW2FdPnQuZmxvYXRpbmdbYV0mJihvPWpuKG8pKSxbbyxqbihvKV19ZnVuY3Rpb24gQ24oZSl7bGV0IHQ9am4oZSk7cmV0dXJuW3duKGUpLHQsd24odCldfWZ1bmN0aW9uIHduKGUpe3JldHVybiBlLmluY2x1ZGVzKGBzdGFydGApP2UucmVwbGFjZShgc3RhcnRgLGBlbmRgKTplLnJlcGxhY2UoYGVuZGAsYHN0YXJ0YCl9dmFyIFRuPVtgbGVmdGAsYHJpZ2h0YF0sRW49W2ByaWdodGAsYGxlZnRgXSxEbj1bYHRvcGAsYGJvdHRvbWBdLE9uPVtgYm90dG9tYCxgdG9wYF07ZnVuY3Rpb24ga24oZSx0LG4pe3N3aXRjaChlKXtjYXNlYHRvcGA6Y2FzZWBib3R0b21gOnJldHVybiBuP3Q/RW46VG46dD9UbjpFbjtjYXNlYGxlZnRgOmNhc2VgcmlnaHRgOnJldHVybiB0P0RuOk9uO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEFuKGUsdCxuLHIpe2xldCBpPV9uKGUpLGE9a24oZ24oZSksbj09PWBzdGFydGAscik7cmV0dXJuIGkmJihhPWEubWFwKGU9PmUrYC1gK2kpLHQmJihhPWEuY29uY2F0KGEubWFwKHduKSkpKSxhfWZ1bmN0aW9uIGpuKGUpe2xldCB0PWduKGUpO3JldHVybiBwblt0XStlLnNsaWNlKHQubGVuZ3RoKX1mdW5jdGlvbiBNbihlKXtyZXR1cm57dG9wOmUudG9wPz8wLHJpZ2h0OmUucmlnaHQ/PzAsYm90dG9tOmUuYm90dG9tPz8wLGxlZnQ6ZS5sZWZ0Pz8wfX1mdW5jdGlvbiBObihlKXtyZXR1cm4gdHlwZW9mIGU9PWBudW1iZXJgP3t0b3A6ZSxyaWdodDplLGJvdHRvbTplLGxlZnQ6ZX06TW4oZSl9ZnVuY3Rpb24gUG4oZSl7bGV0e3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6aX09ZTtyZXR1cm57d2lkdGg6cixoZWlnaHQ6aSx0b3A6bixsZWZ0OnQscmlnaHQ6dCtyLGJvdHRvbTpuK2kseDp0LHk6bn19ZnVuY3Rpb24gRm4oZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lLGE9Ym4odCksbz14bih0KSxzPXluKG8pLGM9Z24odCksbD1hPT09YHlgLHU9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMixwO3N3aXRjaChjKXtjYXNlYHRvcGA6cD17eDp1LHk6ci55LWkuaGVpZ2h0fTticmVhaztjYXNlYGJvdHRvbWA6cD17eDp1LHk6ci55K3IuaGVpZ2h0fTticmVhaztjYXNlYHJpZ2h0YDpwPXt4OnIueCtyLndpZHRoLHk6ZH07YnJlYWs7Y2FzZWBsZWZ0YDpwPXt4OnIueC1pLndpZHRoLHk6ZH07YnJlYWs7ZGVmYXVsdDpwPXt4OnIueCx5OnIueX19bGV0IG09X24odCk7cmV0dXJuIG0mJihwW29dKz1mKihtPT09YGVuZGA/MTotMSkqKG4mJmw/LTE6MSkpLHB9YXN5bmMgZnVuY3Rpb24gSW4oZSx0KXt0PT09dm9pZCAwJiYodD17fSk7bGV0e3g6bix5OnIscGxhdGZvcm06aSxyZWN0czphLGVsZW1lbnRzOm8sc3RyYXRlZ3k6c309ZSx7Ym91bmRhcnk6Yz1gY2xpcHBpbmdBbmNlc3RvcnNgLHJvb3RCb3VuZGFyeTpsPWB2aWV3cG9ydGAsZWxlbWVudENvbnRleHQ6dT1gZmxvYXRpbmdgLGFsdEJvdW5kYXJ5OmQ9ITEscGFkZGluZzpmPTB9PWhuKHQsZSkscD1ObihmKSxtPW9bZD91PT09YGZsb2F0aW5nYD9gcmVmZXJlbmNlYDpgZmxvYXRpbmdgOnVdLGg9UG4oYXdhaXQgaS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KG0pKT8/ITA/bTptLmNvbnRleHRFbGVtZW50fHxhd2FpdChpLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6aS5nZXREb2N1bWVudEVsZW1lbnQoby5mbG9hdGluZykpLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5Omwsc3RyYXRlZ3k6c30pKSxnPXU9PT1gZmxvYXRpbmdgP3t4Om4seTpyLHdpZHRoOmEuZmxvYXRpbmcud2lkdGgsaGVpZ2h0OmEuZmxvYXRpbmcuaGVpZ2h0fTphLnJlZmVyZW5jZSxfPWF3YWl0KGkuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDppLmdldE9mZnNldFBhcmVudChvLmZsb2F0aW5nKSksdj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoXykpJiZhd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9LHk9UG4oaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdD9hd2FpdCBpLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtlbGVtZW50czpvLHJlY3Q6ZyxvZmZzZXRQYXJlbnQ6XyxzdHJhdGVneTpzfSk6Zyk7cmV0dXJue3RvcDooaC50b3AteS50b3ArcC50b3ApL3YueSxib3R0b206KHkuYm90dG9tLWguYm90dG9tK3AuYm90dG9tKS92LnksbGVmdDooaC5sZWZ0LXkubGVmdCtwLmxlZnQpL3YueCxyaWdodDooeS5yaWdodC1oLnJpZ2h0K3AucmlnaHQpL3YueH19dmFyIExuPTUwLFJuPWFzeW5jKGUsdCxuKT0+e2xldHtwbGFjZW1lbnQ6cj1gYm90dG9tYCxzdHJhdGVneTppPWBhYnNvbHV0ZWAsbWlkZGxld2FyZTphPVtdLHBsYXRmb3JtOm99PW4scz1vLmRldGVjdE92ZXJmbG93P286ey4uLm8sZGV0ZWN0T3ZlcmZsb3c6SW59LGM9YXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTCh0KSksbD1hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSkse3g6dSx5OmR9PUZuKGwscixjKSxmPXIscD0wLG09e307Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKyspe2xldCBoPWFbbl07aWYoIWgpY29udGludWU7bGV0e25hbWU6ZyxmbjpffT1oLHt4OnYseSxkYXRhOmIscmVzZXQ6eH09YXdhaXQgXyh7eDp1LHk6ZCxpbml0aWFsUGxhY2VtZW50OnIscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptLHJlY3RzOmwscGxhdGZvcm06cyxlbGVtZW50czp7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dH19KTt1PXY/P3UsZD15Pz9kLG1bZ109ey4uLm1bZ10sLi4uYn0seCYmcDxMbiYmKHArKyx0eXBlb2YgeD09YG9iamVjdGAmJih4LnBsYWNlbWVudCYmKGY9eC5wbGFjZW1lbnQpLHgucmVjdHMmJihsPXgucmVjdHM9PT0hMD9hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6eC5yZWN0cykse3g6dSx5OmR9PUZuKGwsZixjKSksbj0tMSl9cmV0dXJue3g6dSx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptfX0sem49ZT0+KHtuYW1lOmBhcnJvd2Asb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEscGxhdGZvcm06byxlbGVtZW50czpzLG1pZGRsZXdhcmVEYXRhOmN9PXQse2VsZW1lbnQ6bCxwYWRkaW5nOnU9MH09aG4oZSx0KXx8e307aWYobD09bnVsbClyZXR1cm57fTtsZXQgZD1Obih1KSxmPXt4Om4seTpyfSxwPXhuKGkpLG09eW4ocCksaD1hd2FpdCBvLmdldERpbWVuc2lvbnMobCksZz1wPT09YHlgLF89Zz9gdG9wYDpgbGVmdGAsdj1nP2Bib3R0b21gOmByaWdodGAseT1nP2BjbGllbnRIZWlnaHRgOmBjbGllbnRXaWR0aGAsYj1hLnJlZmVyZW5jZVttXSthLnJlZmVyZW5jZVtwXS1mW3BdLWEuZmxvYXRpbmdbbV0seD1mW3BdLWEucmVmZXJlbmNlW3BdLFM9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KGwpKSxDPVM/U1t5XTowOyghQ3x8IWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudChTKSkpJiYoQz1zLmZsb2F0aW5nW3ldfHxhLmZsb2F0aW5nW21dKTtsZXQgdz1iLzIteC8yLFQ9Qy8yLWhbbV0vMi0xLEU9Y24oZFtfXSxUKSxEPWNuKGRbdl0sVCksTz1DLWhbbV0tRCxrPUMvMi1oW21dLzIrdyxlZT1tbihFLGssTyksdGU9IWMuYXJyb3cmJl9uKGkpIT1udWxsJiZrIT09ZWUmJmEucmVmZXJlbmNlW21dLzItKGs8RT9FOkQpLWhbbV0vMjwwLG5lPXRlP2s8RT9rLUU6ay1POjA7cmV0dXJue1twXTpmW3BdK25lLGRhdGE6e1twXTplZSxjZW50ZXJPZmZzZXQ6ay1lZS1uZSwuLi50ZSYme2FsaWdubWVudE9mZnNldDpuZX19LHJlc2V0OnRlfX19KSxCbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOmBmbGlwYCxvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG47bGV0e3BsYWNlbWVudDpyLG1pZGRsZXdhcmVEYXRhOmkscmVjdHM6YSxpbml0aWFsUGxhY2VtZW50Om8scGxhdGZvcm06cyxlbGVtZW50czpjfT10LHttYWluQXhpczpsPSEwLGNyb3NzQXhpczp1PSEwLGZhbGxiYWNrUGxhY2VtZW50czpkLGZhbGxiYWNrU3RyYXRlZ3k6Zj1gYmVzdEZpdGAsZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbjpwPWBub25lYCxmbGlwQWxpZ25tZW50Om09ITAsLi4uaH09aG4oZSx0KTtpZigobj1pLmFycm93KSE9bnVsbCYmbi5hbGlnbm1lbnRPZmZzZXQpcmV0dXJue307bGV0IGc9Z24ociksXz1ibihvKSx2PWduKG8pPT09byx5PWF3YWl0KHMuaXNSVEw9PW51bGw/dm9pZCAwOnMuaXNSVEwoYy5mbG9hdGluZykpLGI9ZHx8KHZ8fCFtP1tqbihvKV06Q24obykpLHg9cCE9PWBub25lYDshZCYmeCYmYi5wdXNoKC4uLkFuKG8sbSxwLHkpKTtsZXQgUz1bbywuLi5iXSxDPWF3YWl0IHMuZGV0ZWN0T3ZlcmZsb3codCxoKSx3PVtdLFQ9aS5mbGlwPy5vdmVyZmxvd3N8fFtdO2lmKGwmJncucHVzaChDW2ddKSx1KXtsZXQgZT1TbihyLGEseSk7dy5wdXNoKENbZVswXV0sQ1tlWzFdXSl9aWYoVD1bLi4uVCx7cGxhY2VtZW50OnIsb3ZlcmZsb3dzOnd9XSwhdy5ldmVyeShlPT5lPD0wKSl7bGV0IGU9KGkuZmxpcD8uaW5kZXh8fDApKzEsdD1TW2VdO2lmKHQmJih1IT09YGFsaWdubWVudGB8fF89PT1ibih0KXx8VC5ldmVyeShlPT5ibihlLnBsYWNlbWVudCkhPT1ffHxlLm92ZXJmbG93c1swXT4wKSkpcmV0dXJue2RhdGE6e2luZGV4OmUsb3ZlcmZsb3dzOlR9LHJlc2V0OntwbGFjZW1lbnQ6dH19O2xldCBuPVQuZmlsdGVyKGU9PmUub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChlLHQpPT5lLm92ZXJmbG93c1sxXS10Lm92ZXJmbG93c1sxXSlbMF0/LnBsYWNlbWVudDtpZighbilzd2l0Y2goZil7Y2FzZWBiZXN0Rml0YDp7bGV0IGU9VC5maWx0ZXIoZT0+e2lmKHgpe2xldCB0PWJuKGUucGxhY2VtZW50KTtyZXR1cm4gdD09PV98fHQ9PT1geWB9cmV0dXJuITB9KS5tYXAoZT0+W2UucGxhY2VtZW50LGUub3ZlcmZsb3dzLmZpbHRlcihlPT5lPjApLnJlZHVjZSgoZSx0KT0+ZSt0LDApXSkuc29ydCgoZSx0KT0+ZVsxXS10WzFdKVswXT8uWzBdO2UmJihuPWUpO2JyZWFrfWNhc2VgaW5pdGlhbFBsYWNlbWVudGA6bj1vfWlmKHIhPT1uKXJldHVybntyZXNldDp7cGxhY2VtZW50Om59fX1yZXR1cm57fX19fTtmdW5jdGlvbiBWbihlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gc24uc29tZSh0PT5lW3RdPj0wKX12YXIgVW49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZTpgaGlkZWAsb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHtyZWN0czpuLHBsYXRmb3JtOnJ9PXQse3N0cmF0ZWd5Omk9YHJlZmVyZW5jZUhpZGRlbmAsLi4uYX09aG4oZSx0KTtzd2l0Y2goaSl7Y2FzZWByZWZlcmVuY2VIaWRkZW5gOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsZWxlbWVudENvbnRleHQ6YHJlZmVyZW5jZWB9KSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6ZSxyZWZlcmVuY2VIaWRkZW46SG4oZSl9fX1jYXNlYGVzY2FwZWRgOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsYWx0Qm91bmRhcnk6ITB9KSxuLmZsb2F0aW5nKTtyZXR1cm57ZGF0YTp7ZXNjYXBlZE9mZnNldHM6ZSxlc2NhcGVkOkhuKGUpfX19ZGVmYXVsdDpyZXR1cm57fX19fX0sV249bmV3IFNldChbYGxlZnRgLGB0b3BgXSk7YXN5bmMgZnVuY3Rpb24gR24oZSx0KXtsZXR7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLGE9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbz1nbihuKSxzPV9uKG4pLGM9Ym4obik9PT1geWAsbD1Xbi5oYXMobyk/LTE6MSx1PWEmJmM/LTE6MSxkPWhuKHQsZSkse21haW5BeGlzOmYsY3Jvc3NBeGlzOnAsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09YG51bWJlcmA/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6ZC5tYWluQXhpc3x8MCxjcm9zc0F4aXM6ZC5jcm9zc0F4aXN8fDAsYWxpZ25tZW50QXhpczpkLmFsaWdubWVudEF4aXN9O3JldHVybiBzJiZ0eXBlb2YgbT09YG51bWJlcmAmJihwPXM9PT1gZW5kYD9tKi0xOm0pLGM/e3g6cCp1LHk6ZipsfTp7eDpmKmwseTpwKnV9fXZhciBLbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6YG9mZnNldGAsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuO2xldHt4OnIseTppLHBsYWNlbWVudDphLG1pZGRsZXdhcmVEYXRhOm99PXQscz1hd2FpdCBHbih0LGUpO3JldHVybiBhPT09by5vZmZzZXQ/LnBsYWNlbWVudCYmKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0P3t9Ont4OnIrcy54LHk6aStzLnksZGF0YTp7Li4ucyxwbGFjZW1lbnQ6YX19fX19LHFuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNoaWZ0YCxvcHRpb25zOmUsYXN5bmMgZm4odCl7bGV0e3g6bix5OnIscGxhY2VtZW50OmkscGxhdGZvcm06YX09dCx7bWFpbkF4aXM6bz0hMCxjcm9zc0F4aXM6cz0hMSxsaW1pdGVyOmM9e2ZuOmU9PntsZXR7eDp0LHk6bn09ZTtyZXR1cm57eDp0LHk6bn19fSwuLi5sfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9YXdhaXQgYS5kZXRlY3RPdmVyZmxvdyh0LGwpLGY9Ym4oaSkscD12bihmKSxtPXVbcF0saD11W2ZdLGc9KGUsdCk9Pm1uKHQrZFtlPT09YHlgP2B0b3BgOmBsZWZ0YF0sdCx0LWRbZT09PWB5YD9gYm90dG9tYDpgcmlnaHRgXSk7byYmKG09ZyhwLG0pKSxzJiYoaD1nKGYsaCkpO2xldCBfPWMuZm4oey4uLnQsW3BdOm0sW2ZdOmh9KTtyZXR1cm57Li4uXyxkYXRhOnt4Ol8ueC1uLHk6Xy55LXIsZW5hYmxlZDp7W3BdOm8sW2ZdOnN9fX19fX0sSm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7b3B0aW9uczplLGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6b309dCx7b2Zmc2V0OnM9MCxtYWluQXhpczpjPSEwLGNyb3NzQXhpczpsPSEwfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9Ym4oaSksZj12bihkKSxwPXVbZl0sbT11W2RdLGg9aG4ocyx0KSxnPXR5cGVvZiBoPT1gbnVtYmVyYD97bWFpbkF4aXM6aCxjcm9zc0F4aXM6MH06e21haW5BeGlzOmgubWFpbkF4aXM/PzAsY3Jvc3NBeGlzOmguY3Jvc3NBeGlzPz8wfTtpZihjKXtsZXQgZT1mPT09YHlgP2BoZWlnaHRgOmB3aWR0aGAsdD1hLnJlZmVyZW5jZVtmXS1hLmZsb2F0aW5nW2VdK2cubWFpbkF4aXMsbj1hLnJlZmVyZW5jZVtmXSthLnJlZmVyZW5jZVtlXS1nLm1haW5BeGlzO3A8dD9wPXQ6cD5uJiYocD1uKX1pZihsKXtsZXQgZT1mPT09YHlgP2B3aWR0aGA6YGhlaWdodGAsdD1Xbi5oYXMoZ24oaSkpLG49YS5yZWZlcmVuY2VbZF0tYS5mbG9hdGluZ1tlXSsodCYmby5vZmZzZXQ/LltkXXx8MCkrKHQ/MDpnLmNyb3NzQXhpcykscj1hLnJlZmVyZW5jZVtkXSthLnJlZmVyZW5jZVtlXSsodD8wOm8ub2Zmc2V0Py5bZF18fDApLSh0P2cuY3Jvc3NBeGlzOjApO208bj9tPW46bT5yJiYobT1yKX1yZXR1cm57W2ZdOnAsW2RdOm19fX19LFluPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNpemVgLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtsZXR7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOmF9PXQse2FwcGx5Om89KCk9Pnt9LC4uLnN9PWhuKGUsdCksYz1hd2FpdCBpLmRldGVjdE92ZXJmbG93KHQscyksbD1nbihuKSx1PV9uKG4pLGQ9Ym4obik9PT1geWAse3dpZHRoOmYsaGVpZ2h0OnB9PXIuZmxvYXRpbmcsbSxoO2w9PT1gdG9wYHx8bD09PWBib3R0b21gPyhtPWwsaD11PT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoYS5mbG9hdGluZykpP2BzdGFydGA6YGVuZGApP2BsZWZ0YDpgcmlnaHRgKTooaD1sLG09dT09PWBlbmRgP2B0b3BgOmBib3R0b21gKTtsZXQgZz1wLWMudG9wLWMuYm90dG9tLF89Zi1jLmxlZnQtYy5yaWdodCx2PWNuKHAtY1ttXSxnKSx5PWNuKGYtY1toXSxfKSxiPXQubWlkZGxld2FyZURhdGEuc2hpZnQseD0hYixTPXYsQz15O2IhPW51bGwmJmIuZW5hYmxlZC54JiYoQz1fKSxiIT1udWxsJiZiLmVuYWJsZWQueSYmKFM9ZykseCYmIXUmJihkP0M9Zi0yKmxuKGMubGVmdCxjLnJpZ2h0KTpTPXAtMipsbihjLnRvcCxjLmJvdHRvbSkpLGF3YWl0IG8oey4uLnQsYXZhaWxhYmxlV2lkdGg6QyxhdmFpbGFibGVIZWlnaHQ6U30pO2xldCB3PWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhhLmZsb2F0aW5nKTtyZXR1cm4gZiE9PXcud2lkdGh8fHAhPT13LmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gWG4oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzxgdWB9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuICRuKGUpPyhlLm5vZGVOYW1lfHxgYCkudG9Mb3dlckNhc2UoKTpgI2RvY3VtZW50YH1mdW5jdGlvbiBIKGUpe3ZhciB0O3JldHVybihlPT1udWxsfHwodD1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRlZmF1bHRWaWV3KXx8d2luZG93fWZ1bmN0aW9uIFFuKGUpe3JldHVybigoJG4oZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPy5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gJG4oZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBIKGUpLk5vZGU6ITF9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBIKGUpLkVsZW1lbnQ6ITF9ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHxlIGluc3RhbmNlb2YgSChlKS5IVE1MRWxlbWVudDohMX1mdW5jdGlvbiBucihlKXtyZXR1cm4hWG4oKXx8dHlwZW9mIFNoYWRvd1Jvb3Q+YHVgPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgSChlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHJyKGUpe2xldHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09bXIoZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiZpIT09YGlubGluZWAmJmkhPT1gY29udGVudHNgfWZ1bmN0aW9uIGlyKGUpe3JldHVybi9eKHRhYmxlfHRkfHRoKSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIGFyKGUpe3RyeXtpZihlLm1hdGNoZXMoYDpwb3BvdmVyLW9wZW5gKSlyZXR1cm4hMH1jYXRjaHt9dHJ5e3JldHVybiBlLm1hdGNoZXMoYDptb2RhbGApfWNhdGNoe3JldHVybiExfX12YXIgb3I9L3RyYW5zZm9ybXx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHBlcnNwZWN0aXZlfGZpbHRlci8sc3I9L3BhaW50fGxheW91dHxzdHJpY3R8Y29udGVudC8sY3I9ZT0+ISFlJiZlIT09YG5vbmVgLGxyO2Z1bmN0aW9uIHVyKGUpe2xldCB0PWVyKGUpP21yKGUpOmU7cmV0dXJuIGNyKHQudHJhbnNmb3JtKXx8Y3IodC50cmFuc2xhdGUpfHxjcih0LnNjYWxlKXx8Y3IodC5yb3RhdGUpfHxjcih0LnBlcnNwZWN0aXZlKXx8IWZyKCkmJihjcih0LmJhY2tkcm9wRmlsdGVyKXx8Y3IodC5maWx0ZXIpKXx8b3IudGVzdCh0LndpbGxDaGFuZ2V8fGBgKXx8c3IudGVzdCh0LmNvbnRhaW58fGBgKX1mdW5jdGlvbiBkcihlKXtsZXQgdD1ncihlKTtmb3IoO3RyKHQpJiYhcHIodCk7KXtpZih1cih0KSlyZXR1cm4gdDtpZihhcih0KSlyZXR1cm4gbnVsbDt0PWdyKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIGZyKCl7cmV0dXJuIGxyPz89dHlwZW9mIENTUzxgdWAmJkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKGAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcmAsYG5vbmVgKSxscn1mdW5jdGlvbiBwcihlKXtyZXR1cm4vXihodG1sfGJvZHl8I2RvY3VtZW50KSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIG1yKGUpe3JldHVybiBIKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIGVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUuc2Nyb2xsWCxzY3JvbGxUb3A6ZS5zY3JvbGxZfX1mdW5jdGlvbiBncihlKXtpZihabihlKT09PWBodG1sYClyZXR1cm4gZTtsZXQgdD1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHxucihlKSYmZS5ob3N0fHxRbihlKTtyZXR1cm4gbnIodCk/dC5ob3N0OnR9ZnVuY3Rpb24gX3IoZSl7bGV0IHQ9Z3IoZSk7cmV0dXJuIHByKHQpPyhlLm93bmVyRG9jdW1lbnR8fGUpLmJvZHk6dHIodCkmJnJyKHQpP3Q6X3IodCl9ZnVuY3Rpb24gdnIoZSx0LG4pe3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7bGV0IHI9X3IoZSksaT1yPT09ZS5vd25lckRvY3VtZW50Py5ib2R5LGE9SChyKTtpZihpKXtsZXQgZT15cihhKTtyZXR1cm4gdC5jb25jYXQoYSxhLnZpc3VhbFZpZXdwb3J0fHxbXSxycihyKT9yOltdLGUmJm4/dnIoZSk6W10pfXJldHVybiB0LmNvbmNhdChyLHZyKHIsW10sbikpfWZ1bmN0aW9uIHlyKGUpe3JldHVybiBlLnBhcmVudCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUucGFyZW50KT9lLmZyYW1lRWxlbWVudDpudWxsfWZ1bmN0aW9uIGJyKGUpe2xldCB0PW1yKGUpLG49cGFyc2VGbG9hdCh0LndpZHRoKXx8MCxyPXBhcnNlRmxvYXQodC5oZWlnaHQpfHwwLGk9dHIoZSksYT1pP2Uub2Zmc2V0V2lkdGg6bixvPWk/ZS5vZmZzZXRIZWlnaHQ6cixzPXVuKG4pIT09YXx8dW4ocikhPT1vO3JldHVybiBzJiYobj1hLHI9bykse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gZXIoZSk/ZTplLmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIFNyKGUpe2xldCB0PXhyKGUpO2lmKCF0cih0KSlyZXR1cm4gZm4oMSk7bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOmF9PWJyKHQpLG89KGE/dW4obi53aWR0aCk6bi53aWR0aCkvcixzPShhP3VuKG4uaGVpZ2h0KTpuLmhlaWdodCkvaTtyZXR1cm4oIW98fCFOdW1iZXIuaXNGaW5pdGUobykpJiYobz0xKSwoIXN8fCFOdW1iZXIuaXNGaW5pdGUocykpJiYocz0xKSx7eDpvLHk6c319dmFyIENyPWZuKDApO2Z1bmN0aW9uIHdyKGUpe2xldCB0PUgoZSk7cmV0dXJuIWZyKCl8fCF0LnZpc3VhbFZpZXdwb3J0P0NyOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBUcihlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhIW4mJnQmJm49PT1IKGUpfWZ1bmN0aW9uIEVyKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7bGV0IGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXhyKGUpLG89Zm4oMSk7dCYmKHI/ZXIocikmJihvPVNyKHIpKTpvPVNyKGUpKTtsZXQgcz1UcihhLG4scik/d3IoYSk6Zm4oMCksYz0oaS5sZWZ0K3MueCkvby54LGw9KGkudG9wK3MueSkvby55LHU9aS53aWR0aC9vLngsZD1pLmhlaWdodC9vLnk7aWYoYSYmcil7bGV0IGU9SChhKSx0PWVyKHIpP0gocik6cixuPWUsaT15cihuKTtmb3IoO2kmJnQhPT1uOyl7bGV0IGU9U3IoaSksdD1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bXIoaSksYT10LmxlZnQrKGkuY2xpZW50TGVmdCtwYXJzZUZsb2F0KHIucGFkZGluZ0xlZnQpKSplLngsbz10LnRvcCsoaS5jbGllbnRUb3ArcGFyc2VGbG9hdChyLnBhZGRpbmdUb3ApKSplLnk7Yyo9ZS54LGwqPWUueSx1Kj1lLngsZCo9ZS55LGMrPWEsbCs9byxuPUgoaSksaT15cihuKX19cmV0dXJuIFBuKHt3aWR0aDp1LGhlaWdodDpkLHg6Yyx5Omx9KX1mdW5jdGlvbiBEcihlLHQpe2xldCBuPWhyKGUpLnNjcm9sbExlZnQ7cmV0dXJuIHQ/dC5sZWZ0K246RXIoUW4oZSkpLmxlZnQrbn1mdW5jdGlvbiBPcihlLHQpe2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6bi5sZWZ0K3Quc2Nyb2xsTGVmdC1EcihlLG4pLHk6bi50b3ArdC5zY3JvbGxUb3B9fWZ1bmN0aW9uIGtyKGUpe2xldHtlbGVtZW50czp0LHJlY3Q6bixvZmZzZXRQYXJlbnQ6cixzdHJhdGVneTppfT1lLGE9aT09PWBmaXhlZGAsbz1RbihyKSxzPXQ/YXIodC5mbG9hdGluZyk6ITE7aWYocj09PW98fHMmJmEpcmV0dXJuIG47bGV0IGM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD1mbigxKSx1PWZuKDApLGQ9dHIocik7aWYoKGR8fCFhKSYmKChabihyKSE9PWBib2R5YHx8cnIobykpJiYoYz1ocihyKSksZCkpe2xldCBlPUVyKHIpO2w9U3IociksdS54PWUueCtyLmNsaWVudExlZnQsdS55PWUueStyLmNsaWVudFRvcH1sZXQgZj1vJiYhZCYmIWE/T3IobyxjKTpmbigwKTtyZXR1cm57d2lkdGg6bi53aWR0aCpsLngsaGVpZ2h0Om4uaGVpZ2h0KmwueSx4Om4ueCpsLngtYy5zY3JvbGxMZWZ0KmwueCt1LngrZi54LHk6bi55KmwueS1jLnNjcm9sbFRvcCpsLnkrdS55K2YueX19ZnVuY3Rpb24gQXIoZSl7cmV0dXJuIGUuZ2V0Q2xpZW50UmVjdHM/QXJyYXkuZnJvbShlLmdldENsaWVudFJlY3RzKCkpOltdfWZ1bmN0aW9uIGpyKGUpe2xldCB0PWhyKGUpLG49ZS5vd25lckRvY3VtZW50LmJvZHkscj1sbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsbi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoKSxpPWxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0KSxhPS10LnNjcm9sbExlZnQrRHIoZSksbz0tdC5zY3JvbGxUb3A7cmV0dXJuIG1yKG4pLmRpcmVjdGlvbj09PWBydGxgJiYoYSs9bG4oZS5jbGllbnRXaWR0aCxuLmNsaWVudFdpZHRoKS1yKSx7d2lkdGg6cixoZWlnaHQ6aSx4OmEseTpvfX12YXIgTXI9MjU7ZnVuY3Rpb24gTnIoZSx0LG4pe249PT12b2lkIDAmJihuPWB2aWV3cG9ydGApO2xldCByPW49PT1gbGF5b3V0Vmlld3BvcnRgLGk9SChlKSxhPVFuKGUpLG89aS52aXN1YWxWaWV3cG9ydCxzPWEuY2xpZW50V2lkdGgsYz1hLmNsaWVudEhlaWdodCxsPTAsdT0wO2lmKG8pe2xldCBlPSFmcigpfHx0PT09YGZpeGVkYDtyP2V8fChsPS1vLm9mZnNldExlZnQsdT0tby5vZmZzZXRUb3ApOihzPW8ud2lkdGgsYz1vLmhlaWdodCxlJiYobD1vLm9mZnNldExlZnQsdT1vLm9mZnNldFRvcCkpfWlmKERyKGEpPD0wKXtsZXQgZT1hLm93bmVyRG9jdW1lbnQsdD1lLmJvZHksbj1nZXRDb21wdXRlZFN0eWxlKHQpLHI9ZS5jb21wYXRNb2RlPT09YENTUzFDb21wYXRgJiZwYXJzZUZsb2F0KG4ubWFyZ2luTGVmdCkrcGFyc2VGbG9hdChuLm1hcmdpblJpZ2h0KXx8MCxpPU1hdGguYWJzKGEuY2xpZW50V2lkdGgtdC5jbGllbnRXaWR0aC1yKSxvPWdldENvbXB1dGVkU3R5bGUoYSkuc2Nyb2xsYmFyR3V0dGVyPT09YHN0YWJsZSBib3RoLWVkZ2VzYD9pLzI6aTtvPD1NciYmKHMtPW8pfXJldHVybnt3aWR0aDpzLGhlaWdodDpjLHg6bCx5OnV9fWZ1bmN0aW9uIFByKGUsdCl7bGV0IG49RXIoZSwhMCx0PT09YGZpeGVkYCkscj1uLnRvcCtlLmNsaWVudFRvcCxpPW4ubGVmdCtlLmNsaWVudExlZnQsYT1TcihlKTtyZXR1cm57d2lkdGg6ZS5jbGllbnRXaWR0aCphLngsaGVpZ2h0OmUuY2xpZW50SGVpZ2h0KmEueSx4OmkqYS54LHk6ciphLnl9fWZ1bmN0aW9uIEZyKGUsdCxuKXtsZXQgcjtpZih0PT09YHZpZXdwb3J0YHx8dD09PWBsYXlvdXRWaWV3cG9ydGApcj1OcihlLG4sdCk7ZWxzZSBpZih0PT09YGRvY3VtZW50YClyPWpyKFFuKGUpKTtlbHNlIGlmKGVyKHQpKXI9UHIodCxuKTtlbHNle2xldCBuPXdyKGUpO3I9e3g6dC54LW4ueCx5OnQueS1uLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiBQbihyKX1mdW5jdGlvbiBJcihlLHQpe2xldCBuPXQuZ2V0KGUpO2lmKG4pcmV0dXJuIG47bGV0IHI9dnIoZSxbXSwhMSkuZmlsdGVyKGU9PmVyKGUpJiZabihlKSE9PWBib2R5YCksaT1udWxsLGE9bXIoZSkucG9zaXRpb249PT1gZml4ZWRgLG89YT9ncihlKTplO2Zvcig7ZXIobykmJiFwcihvKTspe2xldCBlPW1yKG8pLHQ9dXIobyksbj1pP2kucG9zaXRpb246YT9gZml4ZWRgOmBgOyF0JiYobj09PWBmaXhlZGB8fG49PT1gYWJzb2x1dGVgJiZlLnBvc2l0aW9uPT09YHN0YXRpY2ApP3I9ci5maWx0ZXIoZT0+ZSE9PW8pOmk9ZSxvPWdyKG8pfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gTHIoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWUsYT1bLi4ubj09PWBjbGlwcGluZ0FuY2VzdG9yc2A/YXIodCk/W106SXIodCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0sbz1Gcih0LGFbMF0saSkscz1vLnRvcCxjPW8ucmlnaHQsbD1vLmJvdHRvbSx1PW8ubGVmdDtmb3IobGV0IGU9MTtlPGEubGVuZ3RoO2UrKyl7bGV0IG49RnIodCxhW2VdLGkpO3M9bG4obi50b3AscyksYz1jbihuLnJpZ2h0LGMpLGw9Y24obi5ib3R0b20sbCksdT1sbihuLmxlZnQsdSl9cmV0dXJue3dpZHRoOmMtdSxoZWlnaHQ6bC1zLHg6dSx5OnN9fWZ1bmN0aW9uIFJyKGUpe2xldHt3aWR0aDp0LGhlaWdodDpufT1icihlKTtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6bn19ZnVuY3Rpb24genIoZSx0LG4pe2xldCByPXRyKHQpLGk9UW4odCksYT1uPT09YGZpeGVkYCxvPUVyKGUsITAsYSx0KSxzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGM9Zm4oMCk7aWYoKHJ8fCFhKSYmKChabih0KSE9PWBib2R5YHx8cnIoaSkpJiYocz1ocih0KSkscikpe2xldCBlPUVyKHQsITAsYSx0KTtjLng9ZS54K3QuY2xpZW50TGVmdCxjLnk9ZS55K3QuY2xpZW50VG9wfSFyJiZpJiYoYy54PURyKGkpKTtsZXQgbD1pJiYhciYmIWE/T3IoaSxzKTpmbigwKTtyZXR1cm57eDpvLmxlZnQrcy5zY3JvbGxMZWZ0LWMueC1sLngseTpvLnRvcCtzLnNjcm9sbFRvcC1jLnktbC55LHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX1mdW5jdGlvbiBCcihlKXtyZXR1cm4gbXIoZSkucG9zaXRpb249PT1gc3RhdGljYH1mdW5jdGlvbiBWcihlLHQpe2lmKCF0cihlKXx8bXIoZSkucG9zaXRpb249PT1gZml4ZWRgKXJldHVybiBudWxsO2lmKHQpcmV0dXJuIHQoZSk7bGV0IG49ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIFFuKGUpPT09biYmKG49bi5vd25lckRvY3VtZW50LmJvZHkpLG59ZnVuY3Rpb24gSHIoZSx0KXtsZXQgbj1IKGUpO2lmKGFyKGUpKXJldHVybiBuO2lmKCF0cihlKSl7bGV0IHQ9Z3IoZSk7Zm9yKDt0JiYhcHIodCk7KXtpZihlcih0KSYmIUJyKHQpKXJldHVybiB0O3Q9Z3IodCl9cmV0dXJuIG59bGV0IHI9VnIoZSx0KTtmb3IoO3ImJmlyKHIpJiZCcihyKTspcj1WcihyLHQpO3JldHVybiByJiZwcihyKSYmQnIocikmJiF1cihyKT9uOnJ8fGRyKGUpfHxufXZhciBVcj1hc3luYyBmdW5jdGlvbihlKXtsZXQgdD10aGlzLmdldE9mZnNldFBhcmVudHx8SHIsbj10aGlzLmdldERpbWVuc2lvbnMscj1hd2FpdCBuKGUuZmxvYXRpbmcpO3JldHVybntyZWZlcmVuY2U6enIoZS5yZWZlcmVuY2UsYXdhaXQgdChlLmZsb2F0aW5nKSxlLnN0cmF0ZWd5KSxmbG9hdGluZzp7eDowLHk6MCx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH19fTtmdW5jdGlvbiBXcihlKXtyZXR1cm4gbXIoZSkuZGlyZWN0aW9uPT09YHJ0bGB9dmFyIEdyPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDprcixnZXREb2N1bWVudEVsZW1lbnQ6UW4sZ2V0Q2xpcHBpbmdSZWN0OkxyLGdldE9mZnNldFBhcmVudDpIcixnZXRFbGVtZW50UmVjdHM6VXIsZ2V0Q2xpZW50UmVjdHM6QXIsZ2V0RGltZW5zaW9uczpScixnZXRTY2FsZTpTcixpc0VsZW1lbnQ6ZXIsaXNSVEw6V3J9O2Z1bmN0aW9uIEtyKGUsdCl7cmV0dXJuIGUueD09PXQueCYmZS55PT09dC55JiZlLndpZHRoPT09dC53aWR0aCYmZS5oZWlnaHQ9PT10LmhlaWdodH1mdW5jdGlvbiBxcihlLHQsbil7bGV0IHI9bnVsbCxpLGE9UW4oZSk7ZnVuY3Rpb24gbygpe3ZhciBlO2NsZWFyVGltZW91dChpKSwoZT1yKT09bnVsbHx8ZS5kaXNjb25uZWN0KCkscj1udWxsfWZ1bmN0aW9uIHMobixjKXtuPT09dm9pZCAwJiYobj0hMSksYz09PXZvaWQgMCYmKGM9MSksbygpO2xldCBsPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2xlZnQ6dSx0b3A6ZCx3aWR0aDpmLGhlaWdodDpwfT1sO2lmKG58fHQoKSwhZnx8IXApcmV0dXJuO2xldCBtPWRuKGQpLGg9ZG4oYS5jbGllbnRXaWR0aC0odStmKSksZz1kbihhLmNsaWVudEhlaWdodC0oZCtwKSksXz1kbih1KSx2PXtyb290TWFyZ2luOi1tK2BweCBgKy1oK2BweCBgKy1nK2BweCBgKy1fK2BweGAsdGhyZXNob2xkOmxuKDAsY24oMSxjKSl8fDF9LHk9ITA7ZnVuY3Rpb24gYih0KXtsZXQgbj10WzBdLmludGVyc2VjdGlvblJhdGlvO2lmKCFLcihsLGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKXJldHVybiBzKCk7aWYobiE9PWMpe2lmKCF5KXJldHVybiBzKCk7bj9zKCExLG4pOmk9c2V0VGltZW91dCgoKT0+e3MoITEsMWUtNyl9LDFlMyl9eT0hMX10cnl7cj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYix7Li4udixyb290OmEub3duZXJEb2N1bWVudH0pfWNhdGNoe3I9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGIsdil9ci5vYnNlcnZlKGUpfWxldCBjPUgoZSksbD0oKT0+cyhuKTtyZXR1cm4gYy5hZGRFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLHMoITApLCgpPT57Yy5yZW1vdmVFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLG8oKX19ZnVuY3Rpb24gSnIoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2xldHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOmE9ITAsZWxlbWVudFJlc2l6ZTpvPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09YGZ1bmN0aW9uYCxsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09YGZ1bmN0aW9uYCxhbmltYXRpb25GcmFtZTpjPSExfT1yLGw9eHIoZSksdT1pfHxhP1suLi5sP3ZyKGwpOltdLC4uLnQ/dnIodCk6W11dOltdO3UuZm9yRWFjaChlPT57aSYmZS5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUuYWRkRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pO2xldCBkPWwmJnM/cXIobCxuLGEpOm51bGwsZj0tMSxwPW51bGw7byYmKHA9bmV3IFJlc2l6ZU9ic2VydmVyKGU9PntsZXRbcl09ZTtyJiZyLnRhcmdldD09PWwmJnAmJnQmJihwLnVub2JzZXJ2ZSh0KSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3ZhciBlOyhlPXApPT1udWxsfHxlLm9ic2VydmUodCl9KSksbigpfSksbCYmIWMmJnAub2JzZXJ2ZShsKSx0JiZwLm9ic2VydmUodCkpO2xldCBtLGg9Yz9FcihlKTpudWxsO2MmJmcoKTtmdW5jdGlvbiBnKCl7bGV0IHQ9RXIoZSk7aCYmIUtyKGgsdCkmJm4oKSxoPXQsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZyl9cmV0dXJuIG4oKSwoKT0+e3ZhciBlO3UuZm9yRWFjaChlPT57aSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pLGQ/LigpLChlPXApPT1udWxsfHxlLmRpc2Nvbm5lY3QoKSxwPW51bGwsYyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fXZhciBZcj1LbixYcj1xbixacj1CbixRcj1Zbiwkcj1VbixlaT16bix0aT1KbixuaT0oZSx0LG4pPT57bGV0IHI9bmV3IE1hcCxpPW4/P3t9LGE9ey4uLkdyLC4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIFJuKGUsdCx7Li4uaSxwbGF0Zm9ybTphfSl9O2Z1bmN0aW9uIHJpKGUpe3JldHVybiB0eXBlb2YgZT09YG9iamVjdGAmJiEhZSYmYCRlbGBpbiBlfWZ1bmN0aW9uIGlpKGUpe2lmKHJpKGUpKXtsZXQgdD1lLiRlbDtyZXR1cm4gJG4odCkmJlpuKHQpPT09YCNjb21tZW50YD9udWxsOnR9cmV0dXJuIGV9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UoKTpiKGUpfWZ1bmN0aW9uIG9pKGUpe3JldHVybntuYW1lOmBhcnJvd2Asb3B0aW9uczplLGZuKHQpe2xldCBuPWlpKGFpKGUuZWxlbWVudCkpO3JldHVybiBuPT1udWxsP3t9OmVpKHtlbGVtZW50Om4scGFkZGluZzplLnBhZGRpbmd9KS5mbih0KX19fWZ1bmN0aW9uIHNpKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PmB1YD8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBjaShlLHQpe2xldCBuPXNpKGUpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1mdW5jdGlvbiBsaShlLHQsbil7bj09PXZvaWQgMCYmKG49e30pO2xldCByPW4ud2hpbGVFbGVtZW50c01vdW50ZWQsaT1NKCgpPT5haShuLm9wZW4pPz8hMCksYT1NKCgpPT5haShuLm1pZGRsZXdhcmUpKSxvPU0oKCk9PmFpKG4ucGxhY2VtZW50KT8/YGJvdHRvbWApLHM9TSgoKT0+YWkobi5zdHJhdGVneSk/P2BhYnNvbHV0ZWApLGM9TSgoKT0+YWkobi50cmFuc2Zvcm0pPz8hMCksbD1NKCgpPT5paShlLnZhbHVlKSksZD1NKCgpPT5paSh0LnZhbHVlKSksZj1GKDApLHA9RigwKSxtPUYocy52YWx1ZSksaD1GKG8udmFsdWUpLGc9dyh7fSksXz1GKCExKSx2PU0oKCk9PntsZXQgZT17cG9zaXRpb246bS52YWx1ZSxsZWZ0OmAwYCx0b3A6YDBgfTtpZighZC52YWx1ZSlyZXR1cm4gZTtsZXQgdD1jaShkLnZhbHVlLGYudmFsdWUpLG49Y2koZC52YWx1ZSxwLnZhbHVlKTtyZXR1cm4gYy52YWx1ZT97Li4uZSx0cmFuc2Zvcm06YHRyYW5zbGF0ZShgK3QrYHB4LCBgK24rYHB4KWAsLi4uc2koZC52YWx1ZSk+PTEuNSYme3dpbGxDaGFuZ2U6YHRyYW5zZm9ybWB9fTp7cG9zaXRpb246bS52YWx1ZSxsZWZ0OnQrYHB4YCx0b3A6bitgcHhgfX0pLHk7ZnVuY3Rpb24gYigpe2lmKGwudmFsdWU9PW51bGx8fGQudmFsdWU9PW51bGwpcmV0dXJuO2xldCBlPWkudmFsdWU7bmkobC52YWx1ZSxkLnZhbHVlLHttaWRkbGV3YXJlOmEudmFsdWUscGxhY2VtZW50Om8udmFsdWUsc3RyYXRlZ3k6cy52YWx1ZX0pLnRoZW4odD0+e2YudmFsdWU9dC54LHAudmFsdWU9dC55LG0udmFsdWU9dC5zdHJhdGVneSxoLnZhbHVlPXQucGxhY2VtZW50LGcudmFsdWU9dC5taWRkbGV3YXJlRGF0YSxfLnZhbHVlPWUhPT0hMX0pfWZ1bmN0aW9uIHgoKXt0eXBlb2YgeT09YGZ1bmN0aW9uYCYmKHkoKSx5PXZvaWQgMCl9ZnVuY3Rpb24gQygpe2lmKHgoKSxyPT09dm9pZCAwKXtiKCk7cmV0dXJufWlmKGwudmFsdWUhPW51bGwmJmQudmFsdWUhPW51bGwpe3k9cihsLnZhbHVlLGQudmFsdWUsYik7cmV0dXJufX1mdW5jdGlvbiBUKCl7aS52YWx1ZXx8KF8udmFsdWU9ITEpfXJldHVybiBWKFthLG8scyxpXSxiLHtmbHVzaDpgc3luY2B9KSxWKFtsLGRdLEMse2ZsdXNoOmBzeW5jYH0pLFYoaSxULHtmbHVzaDpgc3luY2B9KSx1KCkmJk9lKHgpLHt4OlMoZikseTpTKHApLHN0cmF0ZWd5OlMobSkscGxhY2VtZW50OlMoaCksbWlkZGxld2FyZURhdGE6UyhnKSxpc1Bvc2l0aW9uZWQ6UyhfKSxmbG9hdGluZ1N0eWxlczp2LHVwZGF0ZTpifX12YXIgdWk9W2BkaXJgXSxkaT17c2lkZTpgYm90dG9tYCxzaWRlT2Zmc2V0OjAsc2lkZUZsaXA6ITAsYWxpZ246YGNlbnRlcmAsYWxpZ25PZmZzZXQ6MCxhbGlnbkZsaXA6ITAsYXJyb3dQYWRkaW5nOjAsaGlkZVNoaWZ0ZWRBcnJvdzohMCxhdm9pZENvbGxpc2lvbnM6ITAsY29sbGlzaW9uQm91bmRhcnk6KCk9PltdLGNvbGxpc2lvblBhZGRpbmc6MCxzdGlja3k6YHBhcnRpYWxgLGhpZGVXaGVuRGV0YWNoZWQ6ITEscG9zaXRpb25TdHJhdGVneTpgZml4ZWRgLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6YG9wdGltaXplZGAscHJpb3JpdGl6ZVBvc2l0aW9uOiExfSxbZmkscGldPW9lKGBQb3BwZXJDb250ZW50YCksbWk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyQ29udGVudGAscHJvcHM6V2Uoe21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSx7Li4uZGl9KSxlbWl0czpbYHBsYWNlZGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGE9JHQoKSx7Zm9yd2FyZFJlZjpzLGN1cnJlbnRFbGVtZW50OmN9PWllKCksdT1sKE0oKCk9Pm4uZGlyKSksZD1GKCksZj1GKCkse3dpZHRoOnAsaGVpZ2h0Om19PUN0KGYpLGg9TSgoKT0+bi5zaWRlKyhuLmFsaWduPT09YGNlbnRlcmA/YGA6YC0ke24uYWxpZ259YCkpLGc9TSgoKT0+dHlwZW9mIG4uY29sbGlzaW9uUGFkZGluZz09YG51bWJlcmA/bi5jb2xsaXNpb25QYWRkaW5nOnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MCwuLi5uLmNvbGxpc2lvblBhZGRpbmd9KSxfPU0oKCk9PkFycmF5LmlzQXJyYXkobi5jb2xsaXNpb25Cb3VuZGFyeSk/bi5jb2xsaXNpb25Cb3VuZGFyeTpbbi5jb2xsaXNpb25Cb3VuZGFyeV0pLHY9TSgoKT0+KHtwYWRkaW5nOmcudmFsdWUsYm91bmRhcnk6Xy52YWx1ZS5maWx0ZXIocm4pLGFsdEJvdW5kYXJ5Ol8udmFsdWUubGVuZ3RoPjB9KSkseT1NKCgpPT4oe21haW5BeGlzOm4uc2lkZUZsaXAsY3Jvc3NBeGlzOm4uYWxpZ25GbGlwfSkpLHg9TSgoKT0+W1lyKHttYWluQXhpczpuLnNpZGVPZmZzZXQrbS52YWx1ZSxhbGlnbm1lbnRBeGlzOm4uYWxpZ25PZmZzZXR9KSxuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxuLmF2b2lkQ29sbGlzaW9ucyYmWHIoe21haW5BeGlzOiEwLGNyb3NzQXhpczohIW4ucHJpb3JpdGl6ZVBvc2l0aW9uLGxpbWl0ZXI6bi5zdGlja3k9PT1gcGFydGlhbGA/dGkoKTp2b2lkIDAsLi4udi52YWx1ZX0pLCFuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxRcih7Li4udi52YWx1ZSxhcHBseTooe2VsZW1lbnRzOmUscmVjdHM6dCxhdmFpbGFibGVXaWR0aDpuLGF2YWlsYWJsZUhlaWdodDpyfSk9PntsZXR7d2lkdGg6aSxoZWlnaHQ6YX09dC5yZWZlcmVuY2Usbz1lLmZsb2F0aW5nLnN0eWxlO28uc2V0UHJvcGVydHkoYC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoYCxgJHtufXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0YCxgJHtyfXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGhgLGAke2l9cHhgKSxvLnNldFByb3BlcnR5KGAtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHRgLGAke2F9cHhgKX19KSxmLnZhbHVlJiZvaSh7ZWxlbWVudDpmLnZhbHVlLHBhZGRpbmc6bi5hcnJvd1BhZGRpbmd9KSxhbih7YXJyb3dXaWR0aDpwLnZhbHVlLGFycm93SGVpZ2h0Om0udmFsdWUsZGlyOnUudmFsdWV9KSxuLmhpZGVXaGVuRGV0YWNoZWQmJiRyKHtzdHJhdGVneTpgcmVmZXJlbmNlSGlkZGVuYCwuLi52LnZhbHVlfSldKSx7ZmxvYXRpbmdTdHlsZXM6UyxwbGFjZW1lbnQ6Qyxpc1Bvc2l0aW9uZWQ6dyxtaWRkbGV3YXJlRGF0YTpULHVwZGF0ZTpFfT1saShNKCgpPT5uLnJlZmVyZW5jZT8/YS5hbmNob3IudmFsdWUpLGQse3N0cmF0ZWd5Om4ucG9zaXRpb25TdHJhdGVneSxwbGFjZW1lbnQ6aCx3aGlsZUVsZW1lbnRzTW91bnRlZDooLi4uZSk9PkpyKC4uLmUse2xheW91dFNoaWZ0OiFuLmRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0LGFuaW1hdGlvbkZyYW1lOm4udXBkYXRlUG9zaXRpb25TdHJhdGVneT09PWBhbHdheXNgfSksbWlkZGxld2FyZTp4fSksRD1NKCgpPT5vbihDLnZhbHVlKVswXSksTz1NKCgpPT5vbihDLnZhbHVlKVsxXSk7bygoKT0+e3cudmFsdWUmJnIoYHBsYWNlZGApfSk7bGV0IGs9TSgoKT0+e2xldCBlPVQudmFsdWUuYXJyb3c/LmNlbnRlck9mZnNldCE9PTA7cmV0dXJuIG4uaGlkZVNoaWZ0ZWRBcnJvdyYmZX0pLGVlPUYoYGApO3JldHVybiByZSgoKT0+e2MudmFsdWUmJihlZS52YWx1ZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjLnZhbHVlKS56SW5kZXgpfSkscGkoe3BsYWNlZFNpZGU6RCxvbkFycm93Q2hhbmdlOmU9PmYudmFsdWU9ZSxhcnJvd1g6TSgoKT0+VC52YWx1ZS5hcnJvdz8ueD8/MCksYXJyb3dZOk0oKCk9PlQudmFsdWUuYXJyb3c/Lnk/PzApLHNob3VsZEhpZGVBcnJvdzprfSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgZmxvYXRpbmdSZWZgLHJlZjpkLCJkYXRhLXJla2EtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6YGAsZGlyOmIodSksc3R5bGU6aSh7Li4uYihTKSx0cmFuc2Zvcm06Yih3KT9iKFMpLnRyYW5zZm9ybTpgdHJhbnNsYXRlKDAsIC0yMDAlKWAsbWluV2lkdGg6YG1heC1jb250ZW50YCx6SW5kZXg6ZWUudmFsdWUsIi0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6W2IoVCkudHJhbnNmb3JtT3JpZ2luPy54LGIoVCkudHJhbnNmb3JtT3JpZ2luPy55XS5qb2luKGAgYCksLi4uYihUKS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4mJnt2aXNpYmlsaXR5OmBoaWRkZW5gLHBvaW50ZXJFdmVudHM6YG5vbmVgfX0pfSxbbi5tZW1vRGVwZW5kZW5jaWVzP2FlKFtuLmFzQ2hpbGQsbi5hcyxELnZhbHVlLE8udmFsdWUsYih3KSwuLi5PYmplY3QudmFsdWVzKGUuJGF0dHJzKSwuLi5uLm1lbW9EZXBlbmRlbmNpZXNdLCgpPT4oTigpLEkoYihBKSxqKHtrZXk6MCxyZWY6YihzKX0sZS4kYXR0cnMseyJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOm4uYXMsImRhdGEtc2lkZSI6RC52YWx1ZSwiZGF0YS1hbGlnbiI6Ty52YWx1ZSxzdHlsZTp7YW5pbWF0aW9uOmIodyk/dm9pZCAwOmBub25lYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGFzLWNoaWxkYCxgYXNgLGBkYXRhLXNpZGVgLGBkYXRhLWFsaWduYCxgc3R5bGVgXSkpLHQsMCk6KE4oKSxJKGIoQSksaih7a2V5OjEscmVmOmIocyl9LGUuJGF0dHJzLHsiYXMtY2hpbGQiOm4uYXNDaGlsZCxhczpuLmFzLCJkYXRhLXNpZGUiOkQudmFsdWUsImRhdGEtYWxpZ24iOk8udmFsdWUsZGlyOmIodSksc3R5bGU6e2FuaW1hdGlvbjpiKHcpP3ZvaWQgMDpgbm9uZWB9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2Bhcy1jaGlsZGAsYGFzYCxgZGF0YS1zaWRlYCxgZGF0YS1hbGlnbmAsYGRpcmAsYHN0eWxlYF0pKV0sMTIsdWkpKX19KTtmdW5jdGlvbiBoaShlKXtsZXQgdD1zKHtub25jZTpGKCl9KTtyZXR1cm4gTSgoKT0+ZT8udmFsdWV8fHQubm9uY2U/LnZhbHVlKX12YXIgZ2k9W2AgYCxgRW50ZXJgLGBBcnJvd1VwYCxgQXJyb3dEb3duYF0sX2k9W2AgYCxgRW50ZXJgXTtmdW5jdGlvbiB2aShlLHQsbil7cmV0dXJuIGU9PT12b2lkIDA/ITE6QXJyYXkuaXNBcnJheShlKT9lLnNvbWUoZT0+eWkoZSx0LG4pKTp5aShlLHQsbil9ZnVuY3Rpb24geWkoZSx0LG4pe3JldHVybiBlPT09dm9pZCAwfHx0PT09dm9pZCAwPyExOnR5cGVvZiBlPT1gc3RyaW5nYD9lPT09dDp0eXBlb2Ygbj09YGZ1bmN0aW9uYD9uKGUsdCk6dHlwZW9mIG49PWBzdHJpbmdgP2U/LltuXT09PXQ/LltuXTpsZShlLHQpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlPT1udWxsfHxlPT09YGB8fEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MH12YXIgeGk9W2B2YWx1ZWBdLFtTaSxDaV09b2UoYFNlbGVjdFJvb3RgKSx3aT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RSb290YCxwcm9wczp7b3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxkZWZhdWx0VmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sbW9kZWxWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxudWxsYWJsZVZhbHVlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxieTp7dHlwZTpbU3RyaW5nLEZ1bmN0aW9uXSxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sbmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYCxgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7cmVxdWlyZWQ6aSxkaXNhYmxlZDphLG11bHRpcGxlOm8sZGlyOnN9PWYobiksYz1DKG4sYG1vZGVsVmFsdWVgLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZT8/KG8udmFsdWU/W106dm9pZCAwKSxwYXNzaXZlOm4ubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSksdT1DKG4sYG9wZW5gLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRPcGVuLHBhc3NpdmU6bi5vcGVuPT09dm9pZCAwfSksZD1GKCkscD1GKCksbT1GKHt4OjAseTowfSksaD1NKCgpPT5vLnZhbHVlJiZBcnJheS5pc0FycmF5KGMudmFsdWUpP2MudmFsdWU/Lmxlbmd0aD09PTA6c2UoYy52YWx1ZSkpO0plKHtpc1Byb3ZpZGVyOiEwfSk7bGV0IGc9bChzKSxfPWZ0KGQpLHY9RihuZXcgU2V0KSx5PU0oKCk9PkFycmF5LmZyb20odi52YWx1ZSkubWFwKGU9PmUudmFsdWUpLmpvaW4oYDtgKSk7ZnVuY3Rpb24geChlKXtpZihvLnZhbHVlKXtsZXQgdD1BcnJheS5pc0FycmF5KGMudmFsdWUpP1suLi5jLnZhbHVlXTpbXSxyPXQuZmluZEluZGV4KHQ9PnlpKHQsZSxuLmJ5KSk7cj09PS0xP3QucHVzaChlKTp0LnNwbGljZShyLDEpLGMudmFsdWU9Wy4uLnRdfWVsc2UgYy52YWx1ZT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIEFycmF5LmZyb20odi52YWx1ZSkuZmluZCh0PT52aShlLHQudmFsdWUsbi5ieSkpfXJldHVybiBDaSh7dHJpZ2dlckVsZW1lbnQ6ZCxvblRyaWdnZXJDaGFuZ2U6ZT0+e2QudmFsdWU9ZX0sdmFsdWVFbGVtZW50OnAsb25WYWx1ZUVsZW1lbnRDaGFuZ2U6ZT0+e3AudmFsdWU9ZX0sY29udGVudElkOmBgLG1vZGVsVmFsdWU6YyxvblZhbHVlQ2hhbmdlOngsYnk6bi5ieSxvcGVuOnUsbXVsdGlwbGU6byxyZXF1aXJlZDppLG9uT3BlbkNoYW5nZTplPT57dS52YWx1ZT1lfSxkaXI6Zyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6bSxkaXNhYmxlZDphLGlzRW1wdHlNb2RlbFZhbHVlOmgsb3B0aW9uc1NldDp2LG9uT3B0aW9uQWRkOmU9PntsZXQgdD1TKGUudmFsdWUpO3QmJnYudmFsdWUuZGVsZXRlKHQpLHYudmFsdWUuYWRkKGUpfSxvbk9wdGlvblJlbW92ZTplPT57bGV0IHQ9UyhlLnZhbHVlKTt0JiZ2LnZhbHVlLmRlbGV0ZSh0KX19KSwoZSx0KT0+KE4oKSxJKGIodG4pLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOmIoYyksb3BlbjpiKHUpfSksYihfKSYmZS5uYW1lPyhOKCksSShUaSx7a2V5OnkudmFsdWUsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsdGFiaW5kZXg6YC0xYCxtdWx0aXBsZTpiKG8pLHJlcXVpcmVkOmIoaSksbmFtZTplLm5hbWUsYXV0b2NvbXBsZXRlOmUuYXV0b2NvbXBsZXRlLGRpc2FibGVkOmIoYSksdmFsdWU6YihjKX0se2RlZmF1bHQ6QigoKT0+W2Ioc2UpKGIoYykpPyhOKCksUChgb3B0aW9uYCx7a2V5OjAsdmFsdWU6ZS5udWxsYWJsZVZhbHVlfSxudWxsLDgseGkpKTp6ZShgdi1pZmAsITApLChOKCEwKSxQKGssbnVsbCxtZShBcnJheS5mcm9tKHYudmFsdWUpLGU9PihOKCksUChgb3B0aW9uYCxqKHtrZXk6ZS52YWx1ZT8/YGB9LHtyZWZfZm9yOiEwfSxlKSxudWxsLDE2KSkpLDEyOCkpXSksXzoxfSw4LFtgbXVsdGlwbGVgLGByZXF1aXJlZGAsYG5hbWVgLGBhdXRvY29tcGxldGVgLGBkaXNhYmxlZGAsYHZhbHVlYF0pKTp6ZShgdi1pZmAsITApXSksXzozfSkpfX0pLFRpPVIoe19fbmFtZTpgQnViYmxlU2VsZWN0YCxwcm9wczp7YXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcm06e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxuYW1lOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc2l6ZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49RigpLHI9U2koKTtWKCgpPT50LnZhbHVlLChlLHQpPT57bGV0IHI9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixgdmFsdWVgKS5zZXQ7aWYoZSE9PXQmJmkmJm4udmFsdWUpe2xldCB0PW5ldyBFdmVudChgY2hhbmdlYCx7YnViYmxlczohMH0pO2kuY2FsbChuLnZhbHVlLGUpLG4udmFsdWUuZGlzcGF0Y2hFdmVudCh0KX19KTtmdW5jdGlvbiBpKGUpe3Iub25WYWx1ZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9cmV0dXJuKGUscik9PihOKCksSShiKFF0KSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0hlKGBzZWxlY3RgLGooe3JlZl9rZXk6YHNlbGVjdEVsZW1lbnRgLHJlZjpufSx0LHtvbklucHV0Oml9KSxbeihlLiRzbG90cyxgZGVmYXVsdGApXSwxNildKSxfOjN9KSl9fSksRWk9Uih7X19uYW1lOmBTZWxlY3RQb3BwZXJQb3NpdGlvbmAscHJvcHM6e21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITEsZGVmYXVsdDoxMH0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1LZShlKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIobWkpLGooYih0KSx7c3R5bGU6e2JveFNpemluZzpgYm9yZGVyLWJveGAsIi0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjpgdmFyKC0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilgLCItLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKWAsIi0tcmVrYS1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClgLCItLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgiOmB2YXIoLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGgpYCwiLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6YHZhcigtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHQpYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLERpPXtvblZpZXdwb3J0Q2hhbmdlOigpPT57fSxpdGVtVGV4dFJlZkNhbGxiYWNrOigpPT57fSxpdGVtUmVmQ2FsbGJhY2s6KCk9Pnt9fSxbT2ksa2ldPW9lKGBTZWxlY3RDb250ZW50YCksQWk9Uih7X19uYW1lOmBTZWxlY3RDb250ZW50SW1wbGAscHJvcHM6e3Bvc2l0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBpdGVtLWFsaWduZWRgfSxib2R5TG9jazp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITF9LGFycm93UGFkZGluZzp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc3RpY2t5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0saGlkZVdoZW5EZXRhY2hlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sdXBkYXRlUG9zaXRpb25TdHJhdGVneTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxyZWZlcmVuY2U6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPVNpKCk7dXQoKSxvdChuLmJvZHlMb2NrKTtsZXR7Q29sbGVjdGlvblNsb3Q6YSxnZXRJdGVtczpvfT1KZSgpLHM9RigpO1N0KHMpO2xldHtzZWFyY2g6YyxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6bH09d3QoKSx1PUYoKSxkPUYoKSxmPUYoKSxwPUYoITEpLG09RighMSksaD1GKCExKTtmdW5jdGlvbiBnKCl7ZC52YWx1ZSYmcy52YWx1ZSYmWHQoW2QudmFsdWUscy52YWx1ZV0pfVYocCwoKT0+e2coKX0pO2xldHtvbk9wZW5DaGFuZ2U6Xyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6dn09aTtyZShlPT57aWYoIXMudmFsdWUpcmV0dXJuO2xldCB0PXt4OjAseTowfSxuPWU9Pnt0PXt4Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWCktKHYudmFsdWU/Lng/PzApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWSktKHYudmFsdWU/Lnk/PzApKX19LHI9ZT0+e2UucG9pbnRlclR5cGUhPT1gdG91Y2hgJiYodC54PD0xMCYmdC55PD0xMD9lLnByZXZlbnREZWZhdWx0KCk6cy52YWx1ZT8uY29udGFpbnMoZS50YXJnZXQpfHxfKCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksdi52YWx1ZT1udWxsKX07di52YWx1ZSE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihgcG9pbnRlcnVwYCxyLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksZSgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBvaW50ZXJtb3ZlYCxuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVydXBgLHIse2NhcHR1cmU6ITB9KX0pfSk7ZnVuY3Rpb24geShlKXtsZXQgdD1lLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXk7aWYoZS5rZXk9PT1gVGFiYCYmZS5wcmV2ZW50RGVmYXVsdCgpLCF0JiZlLmtleS5sZW5ndGg9PT0xJiZsKGUua2V5LG8oKSksW2BBcnJvd1VwYCxgQXJyb3dEb3duYCxgSG9tZWAsYEVuZGBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IHQ9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpXTtpZihbYEFycm93VXBgLGBFbmRgXS5pbmNsdWRlcyhlLmtleSkmJih0PXQuc2xpY2UoKS5yZXZlcnNlKCkpLFtgQXJyb3dVcGAsYEFycm93RG93bmBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IG49ZS50YXJnZXQscj10LmluZGV4T2Yobik7dD10LnNsaWNlKHIrMSl9c2V0VGltZW91dCgoKT0+WHQodCkpLGUucHJldmVudERlZmF1bHQoKX19bGV0IHg9TSgoKT0+bi5wb3NpdGlvbj09PWBwb3BwZXJgP246e30pLFM9S2UoeC52YWx1ZSk7cmV0dXJuIGtpKHtjb250ZW50OnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmU9Pnt1LnZhbHVlPWV9LGl0ZW1SZWZDYWxsYmFjazooZSx0LG4pPT57bGV0IHI9IW0udmFsdWUmJiFuLGE9dmkoaS5tb2RlbFZhbHVlLnZhbHVlLHQsaS5ieSk7aWYoaS5tdWx0aXBsZS52YWx1ZSl7aWYoaC52YWx1ZSlyZXR1cm47KGF8fHIpJiYoZC52YWx1ZT1lLGEmJihoLnZhbHVlPSEwKSl9ZWxzZShhfHxyKSYmKGQudmFsdWU9ZSk7ciYmKG0udmFsdWU9ITApfSxzZWxlY3RlZEl0ZW06ZCxzZWxlY3RlZEl0ZW1UZXh0OmYsb25JdGVtTGVhdmU6KCk9PntzLnZhbHVlPy5mb2N1cygpfSxpdGVtVGV4dFJlZkNhbGxiYWNrOihlLHQsbik9PntsZXQgcj0hbS52YWx1ZSYmIW47KHZpKGkubW9kZWxWYWx1ZS52YWx1ZSx0LGkuYnkpfHxyKSYmKGYudmFsdWU9ZSl9LGZvY3VzU2VsZWN0ZWRJdGVtOmcscG9zaXRpb246bi5wb3NpdGlvbixpc1Bvc2l0aW9uZWQ6cCxzZWFyY2hSZWY6Y30pLChlLHQpPT4oTigpLEkoYihhKSxudWxsLHtkZWZhdWx0OkIoKCk9PltMKGIoS3QpLHsiYXMtY2hpbGQiOmBgLG9uTW91bnRBdXRvRm9jdXM6dFs2XXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25Vbm1vdW50QXV0b0ZvY3VzOnRbN118fD1lPT57cihgY2xvc2VBdXRvRm9jdXNgLGUpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihiKGkpLnRyaWdnZXJFbGVtZW50LnZhbHVlPy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLGUucHJldmVudERlZmF1bHQoKSl9fSx7ZGVmYXVsdDpCKCgpPT5bTChiKE10KSx7ImFzLWNoaWxkIjpgYCwiZGlzYWJsZS1vdXRzaWRlLXBvaW50ZXItZXZlbnRzIjplLmRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxvbkZvY3VzT3V0c2lkZTp0WzJdfHw9ZmUoKCk9Pnt9LFtgcHJldmVudGBdKSxvbkRpc21pc3M6dFszXXx8PWU9PmIoaSkub25PcGVuQ2hhbmdlKCExKSxvbkVzY2FwZUtleURvd246dFs0XXx8PWU9PnIoYGVzY2FwZUtleURvd25gLGUpLG9uUG9pbnRlckRvd25PdXRzaWRlOnRbNV18fD1lPT5yKGBwb2ludGVyRG93bk91dHNpZGVgLGUpfSx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxJKFllKGUucG9zaXRpb249PT1gcG9wcGVyYD9FaTpOaSksaih7Li4uZS4kYXR0cnMsLi4uYihTKX0se2lkOmIoaSkuY29udGVudElkLHJlZjplPT57aWYoIWUpcmV0dXJuO2xldCB0PWIoRGUpKGUpO3Q/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9zLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6cy52YWx1ZT10fSxyb2xlOmBsaXN0Ym94YCwiZGF0YS1zdGF0ZSI6YihpKS5vcGVuLnZhbHVlP2BvcGVuYDpgY2xvc2VkYCxkaXI6YihpKS5kaXIudmFsdWUsc3R5bGU6e2Rpc3BsYXk6YGZsZXhgLGZsZXhEaXJlY3Rpb246YGNvbHVtbmAsb3V0bGluZTpgbm9uZWB9LG9uQ29udGV4dG1lbnU6dFswXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25QbGFjZWQ6dFsxXXx8PWU9PnAudmFsdWU9ITAsb25LZXlkb3duOnl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGlkYCxgZGF0YS1zdGF0ZWAsYGRpcmAsYG9uS2V5ZG93bmBdKSldKSxfOjN9LDgsW2BkaXNhYmxlLW91dHNpZGUtcG9pbnRlci1ldmVudHNgXSldKSxfOjN9KV0pLF86M30pKX19KSxbamksTWldPW9lKGBTZWxlY3RJdGVtQWxpZ25lZFBvc2l0aW9uYCksTmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0SXRlbUFsaWduZWRQb3NpdGlvbmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgcGxhY2VkYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2dldEl0ZW1zOmF9PUplKCksbz1TaSgpLHM9T2koKSxjPUYoITEpLGw9RighMCksdT1GKCkse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1pZSgpLHt2aWV3cG9ydDpwLHNlbGVjdGVkSXRlbTptLHNlbGVjdGVkSXRlbVRleHQ6aCxmb2N1c1NlbGVjdGVkSXRlbTpnfT1zO2Z1bmN0aW9uIF8oKXtpZihvLnRyaWdnZXJFbGVtZW50LnZhbHVlJiZvLnZhbHVlRWxlbWVudC52YWx1ZSYmdS52YWx1ZSYmZi52YWx1ZSYmcD8udmFsdWUmJm0/LnZhbHVlJiZoPy52YWx1ZSl7bGV0IGU9by50cmlnZ2VyRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1vLnZhbHVlRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWgudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoby5kaXIudmFsdWUhPT1gcnRsYCl7bGV0IHI9aS5sZWZ0LXQubGVmdCxhPW4ubGVmdC1yLG89ZS5sZWZ0LWEscz1lLndpZHRoK28sYz1NYXRoLm1heChzLHQud2lkdGgpLGw9d2luZG93LmlubmVyV2lkdGgtMTAsZD1RZShhLDEwLE1hdGgubWF4KDEwLGwtYykpO3UudmFsdWUuc3R5bGUubWluV2lkdGg9YCR7c31weGAsdS52YWx1ZS5zdHlsZS5sZWZ0PWAke2R9cHhgfWVsc2V7bGV0IHI9dC5yaWdodC1pLnJpZ2h0LGE9d2luZG93LmlubmVyV2lkdGgtbi5yaWdodC1yLG89d2luZG93LmlubmVyV2lkdGgtZS5yaWdodC1hLHM9ZS53aWR0aCtvLGM9TWF0aC5tYXgocyx0LndpZHRoKSxsPXdpbmRvdy5pbm5lcldpZHRoLTEwLGQ9UWUoYSwxMCxNYXRoLm1heCgxMCxsLWMpKTt1LnZhbHVlLnN0eWxlLm1pbldpZHRoPWAke3N9cHhgLHUudmFsdWUuc3R5bGUucmlnaHQ9YCR7ZH1weGB9bGV0IHM9YSgpLm1hcChlPT5lLnJlZiksbD13aW5kb3cuaW5uZXJIZWlnaHQtMjAsZD1wLnZhbHVlLnNjcm9sbEhlaWdodCxnPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLF89TnVtYmVyLnBhcnNlSW50KGcuYm9yZGVyVG9wV2lkdGgsMTApLHY9TnVtYmVyLnBhcnNlSW50KGcucGFkZGluZ1RvcCwxMCkseT1OdW1iZXIucGFyc2VJbnQoZy5ib3JkZXJCb3R0b21XaWR0aCwxMCksYj1OdW1iZXIucGFyc2VJbnQoZy5wYWRkaW5nQm90dG9tLDEwKSx4PV8rditkK2IreSxTPU1hdGgubWluKG0udmFsdWUub2Zmc2V0SGVpZ2h0KjUseCksQz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwLnZhbHVlKSx3PU51bWJlci5wYXJzZUludChDLnBhZGRpbmdUb3AsMTApLFQ9TnVtYmVyLnBhcnNlSW50KEMucGFkZGluZ0JvdHRvbSwxMCksRT1lLnRvcCtlLmhlaWdodC8yLTEwLEQ9bC1FLE89bS52YWx1ZS5vZmZzZXRIZWlnaHQvMixrPW0udmFsdWUub2Zmc2V0VG9wK08sZWU9Xyt2K2ssdGU9eC1lZTtpZihlZTw9RSl7bGV0IGU9bS52YWx1ZT09PXMuYXQoLTEpO3UudmFsdWUuc3R5bGUuYm90dG9tPWAwcHhgO2xldCB0PWYudmFsdWUuY2xpZW50SGVpZ2h0LXAudmFsdWUub2Zmc2V0VG9wLXAudmFsdWUub2Zmc2V0SGVpZ2h0LG49ZWUrTWF0aC5tYXgoRCxPKyhlP1Q6MCkrdCt5KTt1LnZhbHVlLnN0eWxlLmhlaWdodD1gJHtufXB4YH1lbHNle2xldCBlPW0udmFsdWU9PT1zWzBdO3UudmFsdWUuc3R5bGUudG9wPWAwcHhgO2xldCB0PU1hdGgubWF4KEUsXytwLnZhbHVlLm9mZnNldFRvcCsoZT93OjApK08pK3RlO3UudmFsdWUuc3R5bGUuaGVpZ2h0PWAke3R9cHhgLHAudmFsdWUuc2Nyb2xsVG9wPWVlLUUrcC52YWx1ZS5vZmZzZXRUb3B9dS52YWx1ZS5zdHlsZS5tYXJnaW49YDEwcHggMGAsdS52YWx1ZS5zdHlsZS5taW5IZWlnaHQ9YCR7U31weGAsdS52YWx1ZS5zdHlsZS5tYXhIZWlnaHQ9YCR7bH1weGAscihgcGxhY2VkYCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5jLnZhbHVlPSEwKX19bGV0IHY9RihgYCk7TWUoYXN5bmMoKT0+e2F3YWl0IHhlKCksXygpLGYudmFsdWUmJih2LnZhbHVlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLnpJbmRleCl9KTtmdW5jdGlvbiB5KGUpe2UmJmwudmFsdWU9PT0hMCYmKF8oKSxnPy4oKSxsLnZhbHVlPSExKX1yZXR1cm4geChvLnRyaWdnZXJFbGVtZW50LCgpPT57XygpfSksTWkoe2NvbnRlbnRXcmFwcGVyOnUsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6YyxvblNjcm9sbEJ1dHRvbkNoYW5nZTp5fSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgY29udGVudFdyYXBwZXJFbGVtZW50YCxyZWY6dSxzdHlsZTppKHtkaXNwbGF5OmBmbGV4YCxmbGV4RGlyZWN0aW9uOmBjb2x1bW5gLHBvc2l0aW9uOmBmaXhlZGAsekluZGV4OnYudmFsdWV9KX0sW0woYihBKSxqKHtyZWY6YihkKSxzdHlsZTp7Ym94U2l6aW5nOmBib3JkZXItYm94YCxtYXhIZWlnaHQ6YDEwMCVgfX0sey4uLmUuJGF0dHJzLC4uLm59KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNildLDQpKX19KSxQaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RQcm92aWRlcmAscHJvcHM6e2NvbnRleHQ6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfX0sc2V0dXAoZSl7cmV0dXJuIENpKGUuY29udGV4dCksa2koRGkpLChlLHQpPT56KGUuJHNsb3RzLGBkZWZhdWx0YCl9fSksRmk9e2tleToxfSxJaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RDb250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cCh0LHtlbWl0Om59KXtsZXQgcj10LGk9YShyLG4pLG89U2koKSxzPUYoKTtNZSgoKT0+e3MudmFsdWU9bmV3IERvY3VtZW50RnJhZ21lbnR9KTtsZXQgYz1GKCksbD1NKCgpPT5yLmZvcmNlTW91bnR8fG8ub3Blbi52YWx1ZSksdT1GKGwudmFsdWUpLGQ7ZnVuY3Rpb24gZigpe2QmJj0oY2xlYXJUaW1lb3V0KGQpLHZvaWQgMCl9cmV0dXJuIFYobCwoZSx0LG4pPT57ZigpLGQ9c2V0VGltZW91dCgoKT0+e3UudmFsdWU9bC52YWx1ZSxkPXZvaWQgMH0pLG4oZil9KSx3ZShmKSwodCxuKT0+bC52YWx1ZXx8dS52YWx1ZXx8Yy52YWx1ZT8ucHJlc2VudD8oTigpLEkoYihxZSkse2tleTowLHJlZl9rZXk6YHByZXNlbmNlUmVmYCxyZWY6YyxwcmVzZW50OmwudmFsdWV9LHtkZWZhdWx0OkIoKCk9PltMKEFpLFplKHZlKHsuLi5iKGkpLC4uLnQuJGF0dHJzfSkpLHtkZWZhdWx0OkIoKCk9Plt6KHQuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2KV0pLF86M30sOCxbYHByZXNlbnRgXSkpOnMudmFsdWU/KE4oKSxQKGBkaXZgLEZpLFsoTigpLEkoZSx7dG86cy52YWx1ZX0sW0woUGkse2NvbnRleHQ6YihvKX0se2RlZmF1bHQ6QigoKT0+W3oodC4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGNvbnRleHRgXSldLDgsW2B0b2BdKSldKSk6emUoYHYtaWZgLCEwKX19KSxMaT1SKHtfX25hbWU6YFNlbGVjdEljb25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkseyJhcmlhLWhpZGRlbiI6YHRydWVgLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCx7fSwoKT0+W3RbMF18fD1nZShg4pa8YCldKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pLFtSaSx6aV09b2UoYFNlbGVjdEl0ZW1gKSxCaT1SKHtfX25hbWU6YFNlbGVjdEl0ZW1gLHByb3BzOnt2YWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSx0ZXh0VmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHNlbGVjdGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LHtkaXNhYmxlZDppfT1mKG4pLGE9U2koKSxvPU9pKCkse2ZvcndhcmRSZWY6cyxjdXJyZW50RWxlbWVudDpjfT1pZSgpLHtDb2xsZWN0aW9uSXRlbTpsfT1KZSgpLHU9TSgoKT0+dmkoYS5tb2RlbFZhbHVlPy52YWx1ZSxuLnZhbHVlLGEuYnkpKSxkPUYoITEpLHA9RihuLnRleHRWYWx1ZT8/YGApLGg9bmUodm9pZCAwLGByZWthLXNlbGVjdC1pdGVtLXRleHRgKTthc3luYyBmdW5jdGlvbiBnKGUpe2UuZGVmYXVsdFByZXZlbnRlZHx8JGUoYHNlbGVjdC5zZWxlY3RgLF8se29yaWdpbmFsRXZlbnQ6ZSx2YWx1ZTpuLnZhbHVlfSl9YXN5bmMgZnVuY3Rpb24gXyhlKXthd2FpdCB4ZSgpLHIoYHNlbGVjdGAsZSksIWUuZGVmYXVsdFByZXZlbnRlZCYmKGkudmFsdWV8fChhLm9uVmFsdWVDaGFuZ2Uobi52YWx1ZSksYS5tdWx0aXBsZS52YWx1ZXx8YS5vbk9wZW5DaGFuZ2UoITEpKSl9YXN5bmMgZnVuY3Rpb24gdihlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihpLnZhbHVlP28ub25JdGVtTGVhdmU/LigpOmUuY3VycmVudFRhcmdldD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9YXN5bmMgZnVuY3Rpb24geShlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJmUuY3VycmVudFRhcmdldD09PW0oKSYmby5vbkl0ZW1MZWF2ZT8uKCl9YXN5bmMgZnVuY3Rpb24geChlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihvLnNlYXJjaFJlZj8udmFsdWU9PT1gYHx8ZS5rZXkhPT1gIGApJiYoX2kuaW5jbHVkZXMoZS5rZXkpJiZnKGUpLGUua2V5PT09YCBgJiZlLnByZXZlbnREZWZhdWx0KCkpfWlmKG4udmFsdWU9PT1gYCl0aHJvdyBFcnJvcihgQSA8U2VsZWN0SXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuYCk7cmV0dXJuIE1lKCgpPT57Yy52YWx1ZSYmby5pdGVtUmVmQ2FsbGJhY2soYy52YWx1ZSxuLnZhbHVlLG4uZGlzYWJsZWQpfSksemkoe3ZhbHVlOm4udmFsdWUsZGlzYWJsZWQ6aSx0ZXh0SWQ6aCxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTplPT57cC52YWx1ZT0oKHAudmFsdWV8fGU/LnRleHRDb250ZW50KT8/YGApLnRyaW0oKX19KSwoZSx0KT0+KE4oKSxJKGIobCkse3ZhbHVlOnt0ZXh0VmFsdWU6cC52YWx1ZX19LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHMpLHJvbGU6YG9wdGlvbmAsImFyaWEtbGFiZWxsZWRieSI6YihoKSwiZGF0YS1oaWdobGlnaHRlZCI6ZC52YWx1ZT9gYDp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUudmFsdWUsImRhdGEtc3RhdGUiOnUudmFsdWU/YGNoZWNrZWRgOmB1bmNoZWNrZWRgLCJhcmlhLWRpc2FibGVkIjpiKGkpfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmIoaSk/YGA6dm9pZCAwLHRhYmluZGV4OmIoaSk/dm9pZCAwOi0xLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsb25Gb2N1czp0WzBdfHw9ZT0+ZC52YWx1ZT0hMCxvbkJsdXI6dFsxXXx8PWU9PmQudmFsdWU9ITEsb25Qb2ludGVydXA6ZyxvblBvaW50ZXJkb3duOnRbMl18fD1lPT57ZS5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LG9uVG91Y2hlbmQ6dFszXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgLGBzdG9wYF0pLG9uUG9pbnRlcm1vdmU6dixvblBvaW50ZXJsZWF2ZTp5LG9uS2V5ZG93bjp4fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXJpYS1sYWJlbGxlZGJ5YCxgZGF0YS1oaWdobGlnaHRlZGAsYGFyaWEtc2VsZWN0ZWRgLGBkYXRhLXN0YXRlYCxgYXJpYS1kaXNhYmxlZGAsYGRhdGEtZGlzYWJsZWRgLGB0YWJpbmRleGAsYGFzYCxgYXMtY2hpbGRgXSldKSxfOjN9LDgsW2B2YWx1ZWBdKSl9fSksVmk9Uih7X19uYW1lOmBTZWxlY3RJdGVtSW5kaWNhdG9yYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVJpKCk7cmV0dXJuKGUscik9PmIobikuaXNTZWxlY3RlZC52YWx1ZT8oTigpLEkoYihBKSxqKHtrZXk6MCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKTp6ZShgdi1pZmAsITApfX0pLEhpPVIoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YFNlbGVjdEl0ZW1UZXh0YCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVNpKCkscj1PaSgpLGk9UmkoKSx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT4oe3ZhbHVlOmkudmFsdWUsZGlzYWJsZWQ6aS5kaXNhYmxlZC52YWx1ZSx0ZXh0Q29udGVudDpvLnZhbHVlPy50ZXh0Q29udGVudD8/aS52YWx1ZT8udG9TdHJpbmcoKT8/YGB9KSk7cmV0dXJuIE1lKCgpPT57by52YWx1ZSYmKGkub25JdGVtVGV4dENoYW5nZShvLnZhbHVlKSxyLml0ZW1UZXh0UmVmQ2FsbGJhY2soby52YWx1ZSxpLnZhbHVlLGkuZGlzYWJsZWQudmFsdWUpLG4ub25PcHRpb25BZGQocy52YWx1ZSkpfSksd2UoKCk9PntuLm9uT3B0aW9uUmVtb3ZlKHMudmFsdWUpfSksKGUsbik9PihOKCksSShiKEEpLGooe2lkOmIoaSkudGV4dElkLHJlZjpiKGEpfSx7Li4udCwuLi5lLiRhdHRyc30pLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgaWRgXSkpfX0pLFVpPVIoe19fbmFtZTpgU2VsZWN0UG9ydGFsYCxwcm9wczp7dG86e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZGVmZXI6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoWnQpLFplKHZlKHQpKSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLFdpPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsQnV0dG9uSW1wbGAsZW1pdHM6W2BhdXRvU2Nyb2xsYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49dCx7Z2V0SXRlbXM6cn09SmUoKSxpPU9pKCksYT1GKG51bGwpO2Z1bmN0aW9uIG8oKXthLnZhbHVlIT09bnVsbCYmKHdpbmRvdy5jbGVhckludGVydmFsKGEudmFsdWUpLGEudmFsdWU9bnVsbCl9cmUoKCk9PntyKCkubWFwKGU9PmUucmVmKS5maW5kKGU9PmU9PT1tKCkpPy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6YG5lYXJlc3RgfSl9KTtmdW5jdGlvbiBzKCl7YS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1mdW5jdGlvbiBjKCl7aS5vbkl0ZW1MZWF2ZT8uKCksYS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1yZXR1cm4gSWUoKCk9Pm8oKSksKGUsdCk9PihOKCksSShiKEEpLGooeyJhcmlhLWhpZGRlbiI6YHRydWVgLHN0eWxlOntmbGV4U2hyaW5rOjB9fSxlLiRwYXJlbnQ/LiRwcm9wcyx7b25Qb2ludGVyZG93bjpzLG9uUG9pbnRlcm1vdmU6YyxvblBvaW50ZXJsZWF2ZTp0WzBdfHw9KCk9PntvKCl9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KSxHaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbERvd25CdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1PaSgpLG49dC5wb3NpdGlvbj09PWBpdGVtLWFsaWduZWRgP2ppKCk6dm9pZCAwLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPUYoITEpO3JldHVybiByZShlPT57aWYodC52aWV3cG9ydD8udmFsdWUmJnQuaXNQb3NpdGlvbmVkPy52YWx1ZSl7bGV0IG49dC52aWV3cG9ydC52YWx1ZTtmdW5jdGlvbiByKCl7bGV0IGU9bi5zY3JvbGxIZWlnaHQtbi5jbGllbnRIZWlnaHQ7YS52YWx1ZT1NYXRoLmNlaWwobi5zY3JvbGxUb3ApPGV9cigpLG4uYWRkRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSxlKCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHNjcm9sbGAscikpfX0pLFYoaSwoKT0+e2kudmFsdWUmJm4/Lm9uU2Nyb2xsQnV0dG9uQ2hhbmdlKGkudmFsdWUpfSksKGUsbik9PmEudmFsdWU/KE4oKSxJKFdpLHtrZXk6MCxyZWY6YihyKSxvbkF1dG9TY3JvbGw6blswXXx8PSgpPT57bGV0e3ZpZXdwb3J0OmUsc2VsZWN0ZWRJdGVtOm59PWIodCk7ZT8udmFsdWUmJm4/LnZhbHVlJiYoZS52YWx1ZS5zY3JvbGxUb3A9ZS52YWx1ZS5zY3JvbGxUb3Arbi52YWx1ZS5vZmZzZXRIZWlnaHQpfX0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sNTEyKSk6emUoYHYtaWZgLCEwKX19KSxLaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbFVwQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9T2koKSxuPXQucG9zaXRpb249PT1gaXRlbS1hbGlnbmVkYD9qaSgpOnZvaWQgMCx7Zm9yd2FyZFJlZjpyLGN1cnJlbnRFbGVtZW50Oml9PWllKCksYT1GKCExKTtyZXR1cm4gcmUoZT0+e2lmKHQudmlld3BvcnQ/LnZhbHVlJiZ0LmlzUG9zaXRpb25lZD8udmFsdWUpe2xldCBuPXQudmlld3BvcnQudmFsdWU7ZnVuY3Rpb24gcigpe2EudmFsdWU9bi5zY3JvbGxUb3A+MH1yKCksbi5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLHIpLGUoKCk9Pm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSl9fSksVihpLCgpPT57aS52YWx1ZSYmbj8ub25TY3JvbGxCdXR0b25DaGFuZ2UoaS52YWx1ZSl9KSwoZSxuKT0+YS52YWx1ZT8oTigpLEkoV2kse2tleTowLHJlZjpiKHIpLG9uQXV0b1Njcm9sbDpuWzBdfHw9KCk9PntsZXR7dmlld3BvcnQ6ZSxzZWxlY3RlZEl0ZW06bn09Yih0KTtlPy52YWx1ZSYmbj8udmFsdWUmJihlLnZhbHVlLnNjcm9sbFRvcD1lLnZhbHVlLnNjcm9sbFRvcC1uLnZhbHVlLm9mZnNldEhlaWdodCl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw1MTIpKTp6ZShgdi1pZmAsITApfX0pLHFpPVIoe19fbmFtZTpgU2VsZWN0VHJpZ2dlcmAscHJvcHM6e2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWUsbj1TaSgpLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPU0oKCk9Pm4uZGlzYWJsZWQ/LnZhbHVlfHx0LmRpc2FibGVkKTtuLmNvbnRlbnRJZHx8PW5lKHZvaWQgMCxgcmVrYS1zZWxlY3QtY29udGVudGApLE1lKCgpPT57bi5vblRyaWdnZXJDaGFuZ2UoaS52YWx1ZSl9KTtsZXR7Z2V0SXRlbXM6b309SmUoKSx7c2VhcmNoOnMsaGFuZGxlVHlwZWFoZWFkU2VhcmNoOmMscmVzZXRUeXBlYWhlYWQ6bH09d3QoKTtmdW5jdGlvbiB1KCl7YS52YWx1ZXx8KG4ub25PcGVuQ2hhbmdlKCEwKSxsKCkpfWZ1bmN0aW9uIGQoZSl7dSgpLG4udHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLnZhbHVlPXt4Ok1hdGgucm91bmQoZS5wYWdlWCkseTpNYXRoLnJvdW5kKGUucGFnZVkpfX1mdW5jdGlvbiBmKGUpe3JldHVybiBlLmJ1dHRvbj09PTAmJmUuY3RybEtleT09PSExfWxldCBwPSExO2Z1bmN0aW9uIG0oZSl7aWYoZS5wb2ludGVyVHlwZT09PWB0b3VjaGApcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtsZXQgdD1lLnRhcmdldDt0Lmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSYmdC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpLGYoZSkmJihkKGUpLHA9ITApfWZ1bmN0aW9uIGgoZSl7ZihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGcoZSl7cHx8ZS5jdXJyZW50VGFyZ2V0Py5mb2N1cygpLHA9ITF9cmV0dXJuKGUsdCk9PihOKCksSShiKG5uKSx7ImFzLWNoaWxkIjpgYCxyZWZlcmVuY2U6ZS5yZWZlcmVuY2V9LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHIpLHJvbGU6YGNvbWJvYm94YCx0eXBlOmUuYXM9PT1gYnV0dG9uYD9gYnV0dG9uYDp2b2lkIDAsImFyaWEtY29udHJvbHMiOmIobikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpiKG4pLm9wZW4udmFsdWV8fCExLCJhcmlhLXJlcXVpcmVkIjpiKG4pLnJlcXVpcmVkPy52YWx1ZSwiYXJpYS1hdXRvY29tcGxldGUiOmBub25lYCxkaXNhYmxlZDphLnZhbHVlLGRpcjpiKG4pPy5kaXIudmFsdWUsImRhdGEtc3RhdGUiOmIobik/Lm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjphLnZhbHVlP2BgOnZvaWQgMCwiZGF0YS1wbGFjZWhvbGRlciI6YihiaSkoYihuKS5tb2RlbFZhbHVlPy52YWx1ZSk/YGA6dm9pZCAwLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25DbGljazpnLG9uUG9pbnRlcmRvd246bSxvbk1vdXNlZG93bjpoLG9uUG9pbnRlcnVwOnRbMF18fD1mZShlPT57ZS5wb2ludGVyVHlwZT09PWB0b3VjaGAmJmQoZSl9LFtgcHJldmVudGBdKSxvbktleWRvd246dFsxXXx8PWU9PntsZXQgdD1iKHMpIT09YGA7IShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiZlLmtleS5sZW5ndGg9PT0xJiZ0JiZlLmtleT09PWAgYHx8KGIoYykoZS5rZXksYihvKSgpKSxiKGdpKS5pbmNsdWRlcyhlLmtleSkmJih1KCksZS5wcmV2ZW50RGVmYXVsdCgpKSl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFyaWEtY29udHJvbHNgLGBhcmlhLWV4cGFuZGVkYCxgYXJpYS1yZXF1aXJlZGAsYGRpc2FibGVkYCxgZGlyYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXBsYWNlaG9sZGVyYCxgYXMtY2hpbGRgLGBhc2BdKV0pLF86M30sOCxbYHJlZmVyZW5jZWBdKSl9fSksSmk9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPVNpKCk7TWUoKCk9PntpLnZhbHVlRWxlbWVudD1yfSk7bGV0IGE9TSgoKT0+e2xldCBlPVtdLHQ9QXJyYXkuZnJvbShpLm9wdGlvbnNTZXQudmFsdWUpLG49ZT0+dC5maW5kKHQ9PnZpKGUsdC52YWx1ZSxpLmJ5KSk7cmV0dXJuIGU9QXJyYXkuaXNBcnJheShpLm1vZGVsVmFsdWUudmFsdWUpP2kubW9kZWxWYWx1ZS52YWx1ZS5tYXAoZT0+bihlKT8udGV4dENvbnRlbnQ/P2BgKTpbbihpLm1vZGVsVmFsdWUudmFsdWUpPy50ZXh0Q29udGVudD8/YGBdLGUuZmlsdGVyKEJvb2xlYW4pfSksbz1NKCgpPT5hLnZhbHVlLmxlbmd0aD9hLnZhbHVlLmpvaW4oYCwgYCk6dC5wbGFjZWhvbGRlcik7cmV0dXJuKGUscik9PihOKCksSShiKEEpLHtyZWY6YihuKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLHN0eWxlOntwb2ludGVyRXZlbnRzOmBub25lYH0sImRhdGEtcGxhY2Vob2xkZXIiOmEudmFsdWUubGVuZ3RoP3ZvaWQgMDp0LnBsYWNlaG9sZGVyfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse3NlbGVjdGVkTGFiZWw6YS52YWx1ZSxtb2RlbFZhbHVlOmIoaSkubW9kZWxWYWx1ZS52YWx1ZX0sKCk9PltnZShjZShvLnZhbHVlKSwxKV0pXSksXzozfSw4LFtgYXNgLGBhcy1jaGlsZGAsYGRhdGEtcGxhY2Vob2xkZXJgXSkpfX0pLFlpPVIoe19fbmFtZTpgU2VsZWN0Vmlld3BvcnRgLHByb3BzOntub25jZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse25vbmNlOm59PWYodCkscj1oaShuKSxpPU9pKCksYT1pLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGA/amkoKTp2b2lkIDAse2ZvcndhcmRSZWY6byxjdXJyZW50RWxlbWVudDpzfT1pZSgpO01lKCgpPT57aT8ub25WaWV3cG9ydENoYW5nZShzLnZhbHVlKX0pO2xldCBjPUYoMCk7ZnVuY3Rpb24gbChlKXtsZXQgdD1lLmN1cnJlbnRUYXJnZXQse3Nob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOm4sY29udGVudFdyYXBwZXI6cn09YT8/e307aWYobj8udmFsdWUmJnI/LnZhbHVlKXtsZXQgZT1NYXRoLmFicyhjLnZhbHVlLXQuc2Nyb2xsVG9wKTtpZihlPjApe2xldCBuPXdpbmRvdy5pbm5lckhlaWdodC0yMCxpPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUubWluSGVpZ2h0KSxhPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUuaGVpZ2h0KSxvPU1hdGgubWF4KGksYSk7aWYobzxuKXtsZXQgaT1vK2UsYT1NYXRoLm1pbihuLGkpLHM9aS1hO3IudmFsdWUuc3R5bGUuaGVpZ2h0PWAke2F9cHhgLHIudmFsdWUuc3R5bGUuYm90dG9tPT09YDBweGAmJih0LnNjcm9sbFRvcD1zPjA/czowLHIudmFsdWUuc3R5bGUuanVzdGlmeUNvbnRlbnQ9YGZsZXgtZW5kYCl9fX1jLnZhbHVlPXQuc2Nyb2xsVG9wfXJldHVybihlLG4pPT4oTigpLFAoayxudWxsLFtMKGIoQSksaih7cmVmOmIobyksImRhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnQiOmBgLHJvbGU6YHByZXNlbnRhdGlvbmB9LHsuLi5lLiRhdHRycywuLi50fSx7c3R5bGU6e3Bvc2l0aW9uOmByZWxhdGl2ZWAsZmxleDoxLG92ZXJmbG93OmBoaWRkZW4gYXV0b2B9LG9uU2Nyb2xsOmx9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNiksTChiKEEpLHthczpgc3R5bGVgLG5vbmNlOmIocil9LHtkZWZhdWx0OkIoKCk9Pm5bMF18fD1bZ2UoYCAvKiBIaWRlIHNjcm9sbGJhcnMgY3Jvc3MtYnJvd3NlciBhbmQgZW5hYmxlIG1vbWVudHVtIHNjcm9sbCBmb3IgdG91Y2ggZGV2aWNlcyAqLyBbZGF0YS1yZWthLXNlbGVjdC12aWV3cG9ydF0geyBzY3JvbGxiYXItd2lkdGg6bm9uZTsgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7IH0gW2RhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmU7IH0gYCldKSxfOjEsX186WzBdfSw4LFtgbm9uY2VgXSldLDY0KSl9fSksWGk9Uih7X19uYW1lOmBTZWxlY3RgLHByb3BzOntvcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRPcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRWYWx1ZTp7fSxtb2RlbFZhbHVlOnt9LG51bGxhYmxlVmFsdWU6e30sYnk6e3R5cGU6W1N0cmluZyxGdW5jdGlvbl19LGRpcjp7fSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxhdXRvY29tcGxldGU6e30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sbmFtZTp7fSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWAsYHVwZGF0ZTpvcGVuYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49YShlLHQpO3JldHVybihlLHQpPT4oTigpLEkoYih3aSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdGB9LGIobikpLHtkZWZhdWx0OkIodD0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLFplKHZlKHQpKSldKSxfOjN9LDE2KSl9fSksWmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0Q29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb246e2RlZmF1bHQ6YGl0ZW0tYWxpZ25lZGB9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW59LG1lbW9EZXBlbmRlbmNpZXM6e30sc2lkZTp7fSxzaWRlT2Zmc2V0Ont9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW59LGFsaWduOntkZWZhdWx0OmBjZW50ZXJgfSxhbGlnbk9mZnNldDp7fSxhbGlnbkZsaXA6e3R5cGU6Qm9vbGVhbn0sYXZvaWRDb2xsaXNpb25zOnt0eXBlOkJvb2xlYW59LGNvbGxpc2lvbkJvdW5kYXJ5Ont9LGNvbGxpc2lvblBhZGRpbmc6e30sYXJyb3dQYWRkaW5nOnt9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbn0sc3RpY2t5Ont9LGhpZGVXaGVuRGV0YWNoZWQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25TdHJhdGVneTp7fSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW59LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFufSxyZWZlcmVuY2U6e30sZGlyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW59LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYGNsb3NlQXV0b0ZvY3VzYCxgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGk9ZWUobixgY2xhc3NgKSxvPWEoaSxyKTtyZXR1cm4odCxyKT0+KE4oKSxJKGIoVWkpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihJaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1jb250ZW50YCwiZGF0YS1hbGlnbi10cmlnZ2VyIjplLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGB9LHsuLi50LiRhdHRycywuLi5iKG8pfSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLW9wZW46YW5pbWF0ZS1pbiBkYXRhLWNsb3NlZDphbmltYXRlLW91dCBkYXRhLWNsb3NlZDpmYWRlLW91dC0wIGRhdGEtb3BlbjpmYWRlLWluLTAgZGF0YS1jbG9zZWQ6em9vbS1vdXQtOTUgZGF0YS1vcGVuOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgcmluZy1mb3JlZ3JvdW5kLzEwIG1pbi13LTM2IHJvdW5kZWQtbGcgc2hhZG93LW1kIHJpbmctMSBkdXJhdGlvbi0xMDAgZGF0YS1bc2lkZT1pbmxpbmUtc3RhcnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPWlubGluZS1lbmRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGNuLW1lbnUtdHJhbnNsdWNlbnQgcmVsYXRpdmUgei01MCBtYXgtaC0oLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQpIG9yaWdpbi0oLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byBkYXRhLVthbGlnbi10cmlnZ2VyPXRydWVdOmFuaW1hdGUtbm9uZWAsZS5wb3NpdGlvbj09PWBwb3BwZXJgJiZgZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMWAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bTChiKHRhKSksTChiKFlpKSx7ImRhdGEtcG9zaXRpb24iOmUucG9zaXRpb24sY2xhc3M6dGUoYihwKShgZGF0YS1bcG9zaXRpb249cG9wcGVyXTpoLSgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0KSBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOnctZnVsbCBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOm1pbi13LSgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpYCkpfSx7ZGVmYXVsdDpCKCgpPT5beih0LiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS1wb3NpdGlvbmAsYGNsYXNzYF0pLEwoYihlYSkpXSksXzozfSwxNixbYGRhdGEtYWxpZ24tdHJpZ2dlcmAsYGNsYXNzYF0pXSksXzozfSkpfX0pLFFpPXtjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSByaWdodC0yIGZsZXggc2l6ZS00IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcmB9LCRpPVIoe19fbmFtZTpgU2VsZWN0SXRlbWAscHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW59LHRleHRWYWx1ZTp7fSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihCaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1pdGVtYH0sYihyKSx7Y2xhc3M6YihwKShgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgbm90LWRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOmZvY3VzOioqOnRleHQtYWNjZW50LWZvcmVncm91bmQgZ2FwLTEuNSByb3VuZGVkLW1kIHB5LTEgcHItOCBwbC0xLjUgdGV4dC1zbSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00ICo6W3NwYW5dOmxhc3Q6ZmxleCAqOltzcGFuXTpsYXN0Oml0ZW1zLWNlbnRlciAqOltzcGFuXTpsYXN0OmdhcC0yIHJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bSGUoYHNwYW5gLFFpLFtMKGIoVmkpLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGluZGljYXRvci1pY29uYCx7fSwoKT0+W0woYih1ZSkse2ljb246Yih2KSxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTMuNWB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30pXSksTChiKEhpKSxudWxsLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9KV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksZWE9Uih7X19uYW1lOmBTZWxlY3RTY3JvbGxEb3duQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPWVlKHQsYGNsYXNzYCkscj1LZShuKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoR2kpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3Qtc2Nyb2xsLWRvd24tYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoTGUpLGNsYXNzOmBzaXplLTRgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLHRhPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsVXBCdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihLaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoXyksY2xhc3M6YHNpemUtNGB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksbmE9Uih7X19uYW1lOmBTZWxlY3RUcmlnZ2VyYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0scmVmZXJlbmNlOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sc2l6ZTp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgLGBzaXplYCkscj1LZShuKTtyZXR1cm4obixpKT0+KE4oKSxJKGIocWkpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3QtdHJpZ2dlcmAsImRhdGEtc2l6ZSI6ZS5zaXplfSxiKHIpLHtjbGFzczpiKHApKGBib3JkZXItaW5wdXQgZGF0YS1wbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZS81MCBnYXAtMS41IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB5LTIgcHItMiBwbC0yLjUgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycyBzZWxlY3Qtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGRhdGEtW3NpemU9ZGVmYXVsdF06aC04IGRhdGEtW3NpemU9c21dOmgtNyBkYXRhLVtzaXplPXNtXTpyb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMHB4KV0gKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06Z2FwLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00IGZsZXggdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB3aGl0ZXNwYWNlLW5vd3JhcCBvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06bGluZS1jbGFtcC0xICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmZsZXggKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06aXRlbXMtY2VudGVyIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx0LmNsYXNzKX0pLHtkZWZhdWx0OkIoKCk9Plt6KG4uJHNsb3RzLGBkZWZhdWx0YCksTChiKExpKSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0woYih1ZSkse2ljb246YihMZSksY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBzaXplLTQgcG9pbnRlci1ldmVudHMtbm9uZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9KV0pLF86M30sMTYsW2BkYXRhLXNpemVgLGBjbGFzc2BdKSl9fSkscmE9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e319LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihOKCksSShiKEppKSxqKHsiZGF0YS1zbG90Ijpgc2VsZWN0LXZhbHVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KTtmdW5jdGlvbiBpYShlKXtyZXR1cm4gZSsuNXwwfXZhciBhYT0oZSx0LG4pPT5NYXRoLm1heChNYXRoLm1pbihlLG4pLHQpO2Z1bmN0aW9uIG9hKGUpe3JldHVybiBhYShpYShlKjIuNTUpLDAsMjU1KX1mdW5jdGlvbiBzYShlKXtyZXR1cm4gYWEoaWEoZSoyNTUpLDAsMjU1KX1mdW5jdGlvbiBjYShlKXtyZXR1cm4gYWEoaWEoZS8yLjU1KS8xMDAsMCwxKX1mdW5jdGlvbiBsYShlKXtyZXR1cm4gYWEoaWEoZSoxMDApLDAsMTAwKX12YXIgdWE9ezA6MCwxOjEsMjoyLDM6Myw0OjQsNTo1LDY6Niw3OjcsODo4LDk6OSxBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNSxhOjEwLGI6MTEsYzoxMixkOjEzLGU6MTQsZjoxNX0sZGE9Wy4uLmAwMTIzNDU2Nzg5QUJDREVGYF0sZmE9ZT0+ZGFbZSYxNV0scGE9ZT0+ZGFbKGUmMjQwKT4+NF0rZGFbZSYxNV0sbWE9ZT0+KGUmMjQwKT4+ND09KGUmMTUpLGhhPWU9Pm1hKGUucikmJm1hKGUuZykmJm1hKGUuYikmJm1hKGUuYSk7ZnVuY3Rpb24gZ2EoZSl7dmFyIHQ9ZS5sZW5ndGgsbjtyZXR1cm4gZVswXT09PWAjYCYmKHQ9PT00fHx0PT09NT9uPXtyOjI1NSZ1YVtlWzFdXSoxNyxnOjI1NSZ1YVtlWzJdXSoxNyxiOjI1NSZ1YVtlWzNdXSoxNyxhOnQ9PT01P3VhW2VbNF1dKjE3OjI1NX06KHQ9PT03fHx0PT09OSkmJihuPXtyOnVhW2VbMV1dPDw0fHVhW2VbMl1dLGc6dWFbZVszXV08PDR8dWFbZVs0XV0sYjp1YVtlWzVdXTw8NHx1YVtlWzZdXSxhOnQ9PT05P3VhW2VbN11dPDw0fHVhW2VbOF1dOjI1NX0pKSxufXZhciBfYT0oZSx0KT0+ZTwyNTU/dChlKTpgYDtmdW5jdGlvbiB2YShlKXt2YXIgdD1oYShlKT9mYTpwYTtyZXR1cm4gZT9gI2ArdChlLnIpK3QoZS5nKSt0KGUuYikrX2EoZS5hLHQpOnZvaWQgMH12YXIgeWE9L14oaHNsYT98aHdifGhzdilcKFxzKihbLSsuZVxkXSspKD86ZGVnKT9bXHMsXSsoWy0rLmVcZF0rKSVbXHMsXSsoWy0rLmVcZF0rKSUoPzpbXHMsXSsoWy0rLmVcZF0rKSglKT8pP1xzKlwpJC87ZnVuY3Rpb24gYmEoZSx0LG4pe2xldCByPXQqTWF0aC5taW4obiwxLW4pLGk9KHQsaT0odCtlLzMwKSUxMik9Pm4tcipNYXRoLm1heChNYXRoLm1pbihpLTMsOS1pLDEpLC0xKTtyZXR1cm5baSgwKSxpKDgpLGkoNCldfWZ1bmN0aW9uIHhhKGUsdCxuKXtsZXQgcj0ocixpPShyK2UvNjApJTYpPT5uLW4qdCpNYXRoLm1heChNYXRoLm1pbihpLDQtaSwxKSwwKTtyZXR1cm5bcig1KSxyKDMpLHIoMSldfWZ1bmN0aW9uIFNhKGUsdCxuKXtsZXQgcj1iYShlLDEsLjUpLGk7Zm9yKHQrbj4xJiYoaT0xLyh0K24pLHQqPWksbio9aSksaT0wO2k8MztpKyspcltpXSo9MS10LW4scltpXSs9dDtyZXR1cm4gcn1mdW5jdGlvbiBDYShlLHQsbixyLGkpe3JldHVybiBlPT09aT8odC1uKS9yKyh0PG4/NjowKTp0PT09aT8obi1lKS9yKzI6KGUtdCkvcis0fWZ1bmN0aW9uIHdhKGUpe2xldCB0PWUuci8yNTUsbj1lLmcvMjU1LHI9ZS5iLzI1NSxpPU1hdGgubWF4KHQsbixyKSxhPU1hdGgubWluKHQsbixyKSxvPShpK2EpLzIscyxjLGw7cmV0dXJuIGkhPT1hJiYobD1pLWEsYz1vPi41P2wvKDItaS1hKTpsLyhpK2EpLHM9Q2EodCxuLHIsbCxpKSxzPXMqNjArLjUpLFtzfDAsY3x8MCxvXX1mdW5jdGlvbiBUYShlLHQsbixyKXtyZXR1cm4oQXJyYXkuaXNBcnJheSh0KT9lKHRbMF0sdFsxXSx0WzJdKTplKHQsbixyKSkubWFwKHNhKX1mdW5jdGlvbiBFYShlLHQsbil7cmV0dXJuIFRhKGJhLGUsdCxuKX1mdW5jdGlvbiBEYShlLHQsbil7cmV0dXJuIFRhKFNhLGUsdCxuKX1mdW5jdGlvbiBPYShlLHQsbil7cmV0dXJuIFRhKHhhLGUsdCxuKX1mdW5jdGlvbiBrYShlKXtyZXR1cm4oZSUzNjArMzYwKSUzNjB9ZnVuY3Rpb24gQWEoZSl7bGV0IHQ9eWEuZXhlYyhlKSxuPTI1NSxyO2lmKCF0KXJldHVybjt0WzVdIT09ciYmKG49dFs2XT9vYSgrdFs1XSk6c2EoK3RbNV0pKTtsZXQgaT1rYSgrdFsyXSksYT10WzNdLzEwMCxvPXRbNF0vMTAwO3JldHVybiByPXRbMV09PT1gaHdiYD9EYShpLGEsbyk6dFsxXT09PWBoc3ZgP09hKGksYSxvKTpFYShpLGEsbykse3I6clswXSxnOnJbMV0sYjpyWzJdLGE6bn19ZnVuY3Rpb24gamEoZSx0KXt2YXIgbj13YShlKTtuWzBdPWthKG5bMF0rdCksbj1FYShuKSxlLnI9blswXSxlLmc9blsxXSxlLmI9blsyXX1mdW5jdGlvbiBNYShlKXtpZighZSlyZXR1cm47bGV0IHQ9d2EoZSksbj10WzBdLHI9bGEodFsxXSksaT1sYSh0WzJdKTtyZXR1cm4gZS5hPDI1NT9gaHNsYSgke259LCAke3J9JSwgJHtpfSUsICR7Y2EoZS5hKX0pYDpgaHNsKCR7bn0sICR7cn0lLCAke2l9JSlgfXZhciBOYT17eDpgZGFya2AsWjpgbGlnaHRgLFk6YHJlYCxYOmBibHVgLFc6YGdyYCxWOmBtZWRpdW1gLFU6YHNsYXRlYCxBOmBlZWAsVDpgb2xgLFM6YG9yYCxCOmByYWAsQzpgbGF0ZWdgLEQ6YGlnaHRzYCxSOmBpbmAsUTpgdHVycXVvaXNgLEU6YGhpYCxQOmByb2AsTzpgYWxgLE46YGxlYCxNOmBkZWAsTDpgeWVsbG9gLEY6YGVuYCxLOmBjaGAsRzpgYXJrc2AsSDpgZWFgLEk6YGlnaHRnYCxKOmB3aGB9LFBhPXtPaWNlWGU6YGYwZjhmZmAsYW50aXF1ZXdFdGU6YGZhZWJkN2AsYXF1YTpgZmZmZmAsYXF1YW1hclJlOmA3ZmZmZDRgLGF6dVk6YGYwZmZmZmAsYmVpZ2U6YGY1ZjVkY2AsYmlzcXVlOmBmZmU0YzRgLGJsYWNrOmAwYCxibGFuS2VkT21vbmQ6YGZmZWJjZGAsWGU6YGZmYCxYZXZpVGV0OmA4YTJiZTJgLGJQd246YGE1MmEyYWAsYnVybHl3b29kOmBkZWI4ODdgLGNhTXRYZTpgNWY5ZWEwYCxLYXJ0WXVzZTpgN2ZmZjAwYCxLb2NUYXRlOmBkMjY5MWVgLGNTTzpgZmY3ZjUwYCxjU25mbG93ZXJYZTpgNjQ5NWVkYCxjU25zaWxrOmBmZmY4ZGNgLGNyaW1zb246YGRjMTQzY2AsY3lhbjpgZmZmZmAseFhlOmA4YmAseGN5YW46YDhiOGJgLHhnVE1uUGQ6YGI4ODYwYmAseFdheTpgYTlhOWE5YCx4Z1lGOmA2NDAwYCx4Z1l5OmBhOWE5YTlgLHhraGFraTpgYmRiNzZiYCx4bWFnRnRhOmA4YjAwOGJgLHhUaXZlZ1lGOmA1NTZiMmZgLHhTYW5nZTpgZmY4YzAwYCx4U2NFZDpgOTkzMmNjYCx4WWQ6YDhiMDAwMGAseHNPbW9uOmBlOTk2N2FgLHhzSGdZRjpgOGZiYzhmYCx4VVhlOmA0ODNkOGJgLHhVV2F5OmAyZjRmNGZgLHhVZ1l5OmAyZjRmNGZgLHhRZTpgY2VkMWAseHZpVGV0OmA5NDAwZDNgLGRBcHBSazpgZmYxNDkzYCxkQXBza3lYZTpgYmZmZmAsZGltV2F5OmA2OTY5NjlgLGRpbWdZeTpgNjk2OTY5YCxkb2RnZXJYZTpgMWU5MGZmYCxmaVlicmljazpgYjIyMjIyYCxmbFNPd0V0ZTpgZmZmYWYwYCxmb1lzdFdBbjpgMjI4YjIyYCxmdUtzaWE6YGZmMDBmZmAsZ2FSc2JTbzpgZGNkY2RjYCxnaG9zdHdFdGU6YGY4ZjhmZmAsZ1RkOmBmZmQ3MDBgLGdUTW5QZDpgZGFhNTIwYCxXYXk6YDgwODA4MGAsZ1lGOmA4MDAwYCxnWUZMdzpgYWRmZjJmYCxnWXk6YDgwODA4MGAsaG9uZXlNdzpgZjBmZmYwYCxob3RwUms6YGZmNjliNGAsUmRpYW5ZZDpgY2Q1YzVjYCxSZGlnbzpgNGIwMDgyYCxpdlN5OmBmZmZmZjBgLGtoYWtpOmBmMGU2OGNgLGxhdkZNcjpgZTZlNmZhYCxsYXZGTXJYc2g6YGZmZjBmNWAsbGF3bmdZRjpgN2NmYzAwYCxObW9uY0VmZm9uOmBmZmZhY2RgLFpYZTpgYWRkOGU2YCxaY1NPOmBmMDgwODBgLFpjeWFuOmBlMGZmZmZgLFpnVE1uUGRMdzpgZmFmYWQyYCxaV2F5OmBkM2QzZDNgLFpnWUY6YDkwZWU5MGAsWmdZeTpgZDNkM2QzYCxacFJrOmBmZmI2YzFgLFpzT21vbjpgZmZhMDdhYCxac0hnWUY6YDIwYjJhYWAsWnNreVhlOmA4N2NlZmFgLFpVV2F5OmA3Nzg4OTlgLFpVZ1l5OmA3Nzg4OTlgLFpzdEFsWGU6YGIwYzRkZWAsWkx3OmBmZmZmZTBgLGxpbWU6YGZmMDBgLGxpbWVnWUY6YDMyY2QzMmAsbFJGOmBmYWYwZTZgLG1hZ0Z0YTpgZmYwMGZmYCxtYVBvbjpgODAwMDAwYCxWYXF1YW1hclJlOmA2NmNkYWFgLFZYZTpgY2RgLFZTY0VkOmBiYTU1ZDNgLFZwdXJwTjpgOTM3MGRiYCxWc0hnWUY6YDNjYjM3MWAsVlVYZTpgN2I2OGVlYCxWc3ByUmdnWUY6YGZhOWFgLFZRZTpgNDhkMWNjYCxWdmlUZXRZZDpgYzcxNTg1YCxtaWRuaWdodFhlOmAxOTE5NzBgLG1SdGNZYW06YGY1ZmZmYWAsbWlzdHlQc2U6YGZmZTRlMWAsbW9jY2FzUjpgZmZlNGI1YCxuYXZham93RXRlOmBmZmRlYWRgLG5hdnk6YDgwYCxUZGxhY2U6YGZkZjVlNmAsVGl2ZTpgODA4MDAwYCxUaXZlZEJiOmA2YjhlMjNgLFNhbmdlOmBmZmE1MDBgLFNhbmdlWWQ6YGZmNDUwMGAsU2NFZDpgZGE3MGQ2YCxwT2VnVE1uUGQ6YGVlZThhYWAscE9lZ1lGOmA5OGZiOThgLHBPZVFlOmBhZmVlZWVgLHBPZXZpVGV0WWQ6YGRiNzA5M2AscGFwYXlhd0VwOmBmZmVmZDVgLHBIS3B1ZmY6YGZmZGFiOWAscGVydTpgY2Q4NTNmYCxwUms6YGZmYzBjYmAscGx1bTpgZGRhMGRkYCxwb3dNclhlOmBiMGUwZTZgLHB1cnBOOmA4MDAwODBgLFliZWNjYXB1cnBOOmA2NjMzOTlgLFlkOmBmZjAwMDBgLFBzeWJyb3duOmBiYzhmOGZgLFB5T1hlOmA0MTY5ZTFgLHNhZGROYlB3bjpgOGI0NTEzYCxzT21vbjpgZmE4MDcyYCxzYW5keWJQd246YGY0YTQ2MGAsc0hnWUY6YDJlOGI1N2Asc0hzaGVsbDpgZmZmNWVlYCxzaUZuYTpgYTA1MjJkYCxzaWx2ZXI6YGMwYzBjMGAsc2t5WGU6YDg3Y2VlYmAsVVhlOmA2YTVhY2RgLFVXYXk6YDcwODA5MGAsVWdZeTpgNzA4MDkwYCxzbm93OmBmZmZhZmFgLHNwclJnZ1lGOmBmZjdmYCxzdEFsWGU6YDQ2ODJiNGAsdGFuOmBkMmI0OGNgLHRlTzpgODA4MGAsdEVzdE46YGQ4YmZkOGAsdG9tYXRvOmBmZjYzNDdgLFFlOmA0MGUwZDBgLHZpVGV0OmBlZTgyZWVgLEpIdDpgZjVkZWIzYCx3RXRlOmBmZmZmZmZgLHdFdGVzbW9rZTpgZjVmNWY1YCxMdzpgZmZmZjAwYCxMd2dZRjpgOWFjZDMyYH07ZnVuY3Rpb24gRmEoKXtsZXQgZT17fSx0PU9iamVjdC5rZXlzKFBhKSxuPU9iamVjdC5rZXlzKE5hKSxyLGksYSxvLHM7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7Zm9yKG89cz10W3JdLGk9MDtpPG4ubGVuZ3RoO2krKylhPW5baV0scz1zLnJlcGxhY2UoYSxOYVthXSk7YT1wYXJzZUludChQYVtvXSwxNiksZVtzXT1bYT4+MTYmMjU1LGE+PjgmMjU1LGEmMjU1XX1yZXR1cm4gZX12YXIgSWE7ZnVuY3Rpb24gTGEoZSl7SWF8fChJYT1GYSgpLElhLnRyYW5zcGFyZW50PVswLDAsMCwwXSk7bGV0IHQ9SWFbZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdCYme3I6dFswXSxnOnRbMV0sYjp0WzJdLGE6dC5sZW5ndGg9PT00P3RbM106MjU1fX12YXIgUmE9L15yZ2JhP1woXHMqKFstKy5cZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT8oPzpbXHMsL10rKFstKy5lXGRdKykoJSk/KT9ccypcKSQvO2Z1bmN0aW9uIHphKGUpe2xldCB0PVJhLmV4ZWMoZSksbj0yNTUscixpLGE7aWYodCl7aWYodFs3XSE9PXIpe2xldCBlPSt0WzddO249dFs4XT9vYShlKTphYShlKjI1NSwwLDI1NSl9cmV0dXJuIHI9K3RbMV0saT0rdFszXSxhPSt0WzVdLHI9MjU1Jih0WzJdP29hKHIpOmFhKHIsMCwyNTUpKSxpPTI1NSYodFs0XT9vYShpKTphYShpLDAsMjU1KSksYT0yNTUmKHRbNl0/b2EoYSk6YWEoYSwwLDI1NSkpLHtyLGc6aSxiOmEsYTpufX19ZnVuY3Rpb24gQmEoZSl7cmV0dXJuIGUmJihlLmE8MjU1P2ByZ2JhKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0sICR7Y2EoZS5hKX0pYDpgcmdiKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0pYCl9dmFyIFZhPWU9PmU8PS4wMDMxMzA4P2UqMTIuOTI6ZSoqKDEvMi40KSoxLjA1NS0uMDU1LEhhPWU9PmU8PS4wNDA0NT9lLzEyLjkyOigoZSsuMDU1KS8xLjA1NSkqKjIuNDtmdW5jdGlvbiBVYShlLHQsbil7bGV0IHI9SGEoY2EoZS5yKSksaT1IYShjYShlLmcpKSxhPUhhKGNhKGUuYikpO3JldHVybntyOnNhKFZhKHIrbiooSGEoY2EodC5yKSktcikpKSxnOnNhKFZhKGkrbiooSGEoY2EodC5nKSktaSkpKSxiOnNhKFZhKGErbiooSGEoY2EodC5iKSktYSkpKSxhOmUuYStuKih0LmEtZS5hKX19ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUpe2xldCByPXdhKGUpO3JbdF09TWF0aC5tYXgoMCxNYXRoLm1pbihyW3RdK3JbdF0qbix0PT09MD8zNjA6MSkpLHI9RWEociksZS5yPXJbMF0sZS5nPXJbMV0sZS5iPXJbMl19fWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIGUmJk9iamVjdC5hc3NpZ24odHx8e30sZSl9ZnVuY3Rpb24gS2EoZSl7dmFyIHQ9e3I6MCxnOjAsYjowLGE6MjU1fTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aD49MyYmKHQ9e3I6ZVswXSxnOmVbMV0sYjplWzJdLGE6MjU1fSxlLmxlbmd0aD4zJiYodC5hPXNhKGVbM10pKSk6KHQ9R2EoZSx7cjowLGc6MCxiOjAsYToxfSksdC5hPXNhKHQuYSkpLHR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGUuY2hhckF0KDApPT09YHJgP3phKGUpOkFhKGUpfXZhciBKYT1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiB0O2xldCBuPXR5cGVvZiB0LHI7bj09PWBvYmplY3RgP3I9S2EodCk6bj09PWBzdHJpbmdgJiYocj1nYSh0KXx8TGEodCl8fHFhKHQpKSx0aGlzLl9yZ2I9cix0aGlzLl92YWxpZD0hIXJ9Z2V0IHZhbGlkKCl7cmV0dXJuIHRoaXMuX3ZhbGlkfWdldCByZ2IoKXt2YXIgZT1HYSh0aGlzLl9yZ2IpO3JldHVybiBlJiYoZS5hPWNhKGUuYSkpLGV9c2V0IHJnYihlKXt0aGlzLl9yZ2I9S2EoZSl9cmdiU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkP0JhKHRoaXMuX3JnYik6dm9pZCAwfWhleFN0cmluZygpe3JldHVybiB0aGlzLl92YWxpZD92YSh0aGlzLl9yZ2IpOnZvaWQgMH1oc2xTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdmFsaWQ/TWEodGhpcy5fcmdiKTp2b2lkIDB9bWl4KGUsdCl7aWYoZSl7bGV0IG49dGhpcy5yZ2Iscj1lLnJnYixpLGE9dD09PWk/LjU6dCxvPTIqYS0xLHM9bi5hLXIuYSxjPSgobypzPT09LTE/bzoobytzKS8oMStvKnMpKSsxKS8yO2k9MS1jLG4ucj0yNTUmYypuLnIraSpyLnIrLjUsbi5nPTI1NSZjKm4uZytpKnIuZysuNSxuLmI9MjU1JmMqbi5iK2kqci5iKy41LG4uYT1hKm4uYSsoMS1hKSpyLmEsdGhpcy5yZ2I9bn1yZXR1cm4gdGhpc31pbnRlcnBvbGF0ZShlLHQpe3JldHVybiBlJiYodGhpcy5fcmdiPVVhKHRoaXMuX3JnYixlLl9yZ2IsdCkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IGUodGhpcy5yZ2IpfWFscGhhKGUpe3JldHVybiB0aGlzLl9yZ2IuYT1zYShlKSx0aGlzfWNsZWFyZXIoZSl7bGV0IHQ9dGhpcy5fcmdiO3JldHVybiB0LmEqPTEtZSx0aGlzfWdyZXlzY2FsZSgpe2xldCBlPXRoaXMuX3JnYjtyZXR1cm4gZS5yPWUuZz1lLmI9aWEoZS5yKi4zK2UuZyouNTkrZS5iKi4xMSksdGhpc31vcGFxdWVyKGUpe2xldCB0PXRoaXMuX3JnYjtyZXR1cm4gdC5hKj0xK2UsdGhpc31uZWdhdGUoKXtsZXQgZT10aGlzLl9yZ2I7cmV0dXJuIGUucj0yNTUtZS5yLGUuZz0yNTUtZS5nLGUuYj0yNTUtZS5iLHRoaXN9bGlnaHRlbihlKXtyZXR1cm4gV2EodGhpcy5fcmdiLDIsZSksdGhpc31kYXJrZW4oZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwyLC1lKSx0aGlzfXNhdHVyYXRlKGUpe3JldHVybiBXYSh0aGlzLl9yZ2IsMSxlKSx0aGlzfWRlc2F0dXJhdGUoZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwxLC1lKSx0aGlzfXJvdGF0ZShlKXtyZXR1cm4gamEodGhpcy5fcmdiLGUpLHRoaXN9fTtmdW5jdGlvbiBZYSgpe312YXIgWGE9KCgpPT57bGV0IGU9MDtyZXR1cm4oKT0+ZSsrfSkoKTtmdW5jdGlvbiBVKGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIFcoZSl7aWYoQXJyYXkuaXNBcnJheSYmQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoMCw3KT09PWBbb2JqZWN0YCYmdC5zbGljZSgtNik9PT1gQXJyYXldYH1mdW5jdGlvbiBHKGUpe3JldHVybiBlIT09bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWB9ZnVuY3Rpb24gSyhlKXtyZXR1cm4odHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmaXNGaW5pdGUoK2UpfWZ1bmN0aW9uIFphKGUsdCl7cmV0dXJuIEsoZSk/ZTp0fWZ1bmN0aW9uIHEoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD90OmV9dmFyIFFhPShlLHQpPT50eXBlb2YgZT09YHN0cmluZ2AmJmUuZW5kc1dpdGgoYCVgKT9wYXJzZUZsb2F0KGUpLzEwMCp0OitlO2Z1bmN0aW9uIEooZSx0LG4pe2lmKGUmJnR5cGVvZiBlLmNhbGw9PWBmdW5jdGlvbmApcmV0dXJuIGUuYXBwbHkobix0KX1mdW5jdGlvbiBZKGUsdCxuLHIpe2xldCBpLGEsbztpZihXKGUpKXtpZihhPWUubGVuZ3RoLHIpZm9yKGk9YS0xO2k+PTA7aS0tKXQuY2FsbChuLGVbaV0saSk7ZWxzZSBmb3IoaT0wO2k8YTtpKyspdC5jYWxsKG4sZVtpXSxpKX1lbHNlIGlmKEcoZSkpZm9yKG89T2JqZWN0LmtleXMoZSksYT1vLmxlbmd0aCxpPTA7aTxhO2krKyl0LmNhbGwobixlW29baV1dLG9baV0pfWZ1bmN0aW9uICRhKGUsdCl7bGV0IG4scixpLGE7aWYoIWV8fCF0fHxlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKWlmKGk9ZVtuXSxhPXRbbl0saS5kYXRhc2V0SW5kZXghPT1hLmRhdGFzZXRJbmRleHx8aS5pbmRleCE9PWEuaW5kZXgpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZW8oZSl7aWYoVyhlKSlyZXR1cm4gZS5tYXAoZW8pO2lmKEcoZSkpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1PYmplY3Qua2V5cyhlKSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdFtuW2ldXT1lbyhlW25baV1dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiB0byhlKXtyZXR1cm5bYF9fcHJvdG9fX2AsYHByb3RvdHlwZWAsYGNvbnN0cnVjdG9yYF0uaW5kZXhPZihlKT09PS0xfWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKCF0byhlKSlyZXR1cm47bGV0IGk9dFtlXSxhPW5bZV07RyhpKSYmRyhhKT9ybyhpLGEscik6dFtlXT1lbyhhKX1mdW5jdGlvbiBybyhlLHQsbil7bGV0IHI9Vyh0KT90Olt0XSxpPXIubGVuZ3RoO2lmKCFHKGUpKXJldHVybiBlO258fD17fTtsZXQgYT1uLm1lcmdlcnx8bm8sbztmb3IobGV0IHQ9MDt0PGk7Kyt0KXtpZihvPXJbdF0sIUcobykpY29udGludWU7bGV0IGk9T2JqZWN0LmtleXMobyk7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7Kyt0KWEoaVt0XSxlLG8sbil9cmV0dXJuIGV9ZnVuY3Rpb24gaW8oZSx0KXtyZXR1cm4gcm8oZSx0LHttZXJnZXI6YW99KX1mdW5jdGlvbiBhbyhlLHQsbil7aWYoIXRvKGUpKXJldHVybjtsZXQgcj10W2VdLGk9bltlXTtHKHIpJiZHKGkpP2lvKHIsaSk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl8fCh0W2VdPWVvKGkpKX12YXIgb289eyIiOmU9PmUseDplPT5lLngseTplPT5lLnl9O2Z1bmN0aW9uIHNvKGUpe2xldCB0PWUuc3BsaXQoYC5gKSxuPVtdLHI9YGA7Zm9yKGxldCBlIG9mIHQpcis9ZSxyLmVuZHNXaXRoKGBcXGApP3I9ci5zbGljZSgwLC0xKStgLmA6KG4ucHVzaChyKSxyPWBgKTtyZXR1cm4gbn1mdW5jdGlvbiBjbyhlKXtsZXQgdD1zbyhlKTtyZXR1cm4gZT0+e2ZvcihsZXQgbiBvZiB0KXtpZihuPT09YGApYnJlYWs7ZSYmPWVbbl19cmV0dXJuIGV9fWZ1bmN0aW9uIGxvKGUsdCl7cmV0dXJuKG9vW3RdfHwob29bdF09Y28odCkpKShlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfXZhciBmbz1lPT5lIT09dm9pZCAwLHBvPWU9PnR5cGVvZiBlPT1gZnVuY3Rpb25gLG1vPShlLHQpPT57aWYoZS5zaXplIT09dC5zaXplKXJldHVybiExO2ZvcihsZXQgbiBvZiBlKWlmKCF0LmhhcyhuKSlyZXR1cm4hMTtyZXR1cm4hMH07ZnVuY3Rpb24gaG8oZSl7cmV0dXJuIGUudHlwZT09PWBtb3VzZXVwYHx8ZS50eXBlPT09YGNsaWNrYHx8ZS50eXBlPT09YGNvbnRleHRtZW51YH12YXIgWD1NYXRoLlBJLGdvPTIqWDtnbytYO3ZhciBfbz0xLzAsdm89WC8xODAseW89WC8yLGJvPVgvNCx4bz1YKjIvMyxTbz1NYXRoLmxvZzEwLENvPU1hdGguc2lnbjtmdW5jdGlvbiB3byhlLHQsbil7cmV0dXJuIE1hdGguYWJzKGUtdCk8bn1mdW5jdGlvbiBUbyhlKXtsZXQgdD1NYXRoLnJvdW5kKGUpO2U9d28oZSx0LGUvMWUzKT90OmU7bGV0IG49MTAqKk1hdGguZmxvb3IoU28oZSkpLHI9ZS9uO3JldHVybihyPD0xPzE6cjw9Mj8yOnI8PTU/NToxMCkqbn1mdW5jdGlvbiBFbyhlKXtsZXQgdD1bXSxuPU1hdGguc3FydChlKSxyO2ZvcihyPTE7cjxuO3IrKyllJXI9PT0wJiYodC5wdXNoKHIpLHQucHVzaChlL3IpKTtyZXR1cm4gbj09PShufDApJiZ0LnB1c2gobiksdC5zb3J0KChlLHQpPT5lLXQpLnBvcCgpLHR9ZnVuY3Rpb24gRG8oZSl7cmV0dXJuIHR5cGVvZiBlPT1gc3ltYm9sYHx8dHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJiEoU3ltYm9sLnRvUHJpbWl0aXZlIGluIGV8fGB0b1N0cmluZ2BpbiBlfHxgdmFsdWVPZmBpbiBlKX1mdW5jdGlvbiBPbyhlKXtyZXR1cm4hRG8oZSkmJiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24ga28oZSx0KXtsZXQgbj1NYXRoLnJvdW5kKGUpO3JldHVybiBuLXQ8PWUmJm4rdD49ZX1mdW5jdGlvbiBBbyhlLHQsbil7bGV0IHIsaSxhO2ZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKWE9ZVtyXVtuXSxpc05hTihhKXx8KHQubWluPU1hdGgubWluKHQubWluLGEpLHQubWF4PU1hdGgubWF4KHQubWF4LGEpKX1mdW5jdGlvbiBqbyhlKXtyZXR1cm4gWC8xODAqZX1mdW5jdGlvbiBNbyhlKXtyZXR1cm4gMTgwL1gqZX1mdW5jdGlvbiBObyhlKXtpZighSyhlKSlyZXR1cm47bGV0IHQ9MSxuPTA7Zm9yKDtNYXRoLnJvdW5kKGUqdCkvdCE9PWU7KXQqPTEwLG4rKztyZXR1cm4gbn1mdW5jdGlvbiBQbyhlLHQpe2xldCBuPXQueC1lLngscj10LnktZS55LGk9TWF0aC5zcXJ0KG4qbityKnIpLGE9TWF0aC5hdGFuMihyLG4pO3JldHVybiBhPC0uNSpYJiYoYSs9Z28pLHthbmdsZTphLGRpc3RhbmNlOml9fWZ1bmN0aW9uIEZvKGUsdCl7cmV0dXJuIE1hdGguc3FydCgodC54LWUueCkqKjIrKHQueS1lLnkpKioyKX1mdW5jdGlvbiBJbyhlKXtyZXR1cm4oZSVnbytnbyklZ299ZnVuY3Rpb24gTG8oZSx0LG4scil7bGV0IGk9SW8oZSksYT1Jbyh0KSxvPUlvKG4pLHM9SW8oYS1pKSxjPUlvKG8taSksbD1JbyhpLWEpLHU9SW8oaS1vKTtyZXR1cm4gaT09PWF8fGk9PT1vfHxyJiZhPT09b3x8cz5jJiZsPHV9ZnVuY3Rpb24gUm8oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfWZ1bmN0aW9uIHpvKGUpe3JldHVybiBSbyhlLC0zMjc2OCwzMjc2Nyl9ZnVuY3Rpb24gQm8oZSx0LG4scj0xZS02KXtyZXR1cm4gZT49TWF0aC5taW4odCxuKS1yJiZlPD1NYXRoLm1heCh0LG4pK3J9ZnVuY3Rpb24gVm8oZSx0LG4pe258fD0obj0+ZVtuXTx0KTtsZXQgcj1lLmxlbmd0aC0xLGk9MCxhO2Zvcig7ci1pPjE7KWE9aStyPj4xLG4oYSk/aT1hOnI9YTtyZXR1cm57bG86aSxoaTpyfX12YXIgSG89KGUsdCxuLHIpPT5WbyhlLG4scj9yPT57bGV0IGk9ZVtyXVt0XTtyZXR1cm4gaTxufHxpPT09biYmZVtyKzFdW3RdPT09bn06cj0+ZVtyXVt0XTxuKSxVbz0oZSx0LG4pPT5WbyhlLG4scj0+ZVtyXVt0XT49bik7ZnVuY3Rpb24gV28oZSx0LG4pe2xldCByPTAsaT1lLmxlbmd0aDtmb3IoO3I8aSYmZVtyXTx0OylyKys7Zm9yKDtpPnImJmVbaS0xXT5uOylpLS07cmV0dXJuIHI+MHx8aTxlLmxlbmd0aD9lLnNsaWNlKHIsaSk6ZX12YXIgR289W2BwdXNoYCxgcG9wYCxgc2hpZnRgLGBzcGxpY2VgLGB1bnNoaWZ0YF07ZnVuY3Rpb24gS28oZSx0KXtpZihlLl9jaGFydGpzKXtlLl9jaGFydGpzLmxpc3RlbmVycy5wdXNoKHQpO3JldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX2NoYXJ0anMiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTp7bGlzdGVuZXJzOlt0XX19KSxHby5mb3JFYWNoKHQ9PntsZXQgbj1gX29uRGF0YWArdW8odCkscj1lW3RdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlKC4uLnQpe2xldCBpPXIuYXBwbHkodGhpcyx0KTtyZXR1cm4gZS5fY2hhcnRqcy5saXN0ZW5lcnMuZm9yRWFjaChlPT57dHlwZW9mIGVbbl09PWBmdW5jdGlvbmAmJmVbbl0oLi4udCl9KSxpfX0pfSl9ZnVuY3Rpb24gcW8oZSx0KXtsZXQgbj1lLl9jaGFydGpzO2lmKCFuKXJldHVybjtsZXQgcj1uLmxpc3RlbmVycyxpPXIuaW5kZXhPZih0KTtpIT09LTEmJnIuc3BsaWNlKGksMSksIShyLmxlbmd0aD4wKSYmKEdvLmZvckVhY2godD0+e2RlbGV0ZSBlW3RdfSksZGVsZXRlIGUuX2NoYXJ0anMpfWZ1bmN0aW9uIEpvKGUpe2xldCB0PW5ldyBTZXQoZSk7cmV0dXJuIHQuc2l6ZT09PWUubGVuZ3RoP2U6QXJyYXkuZnJvbSh0KX12YXIgWW89ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz5gdWA/ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX06d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZX0oKTtmdW5jdGlvbiBYbyhlLHQpe2xldCBuPVtdLHI9ITE7cmV0dXJuIGZ1bmN0aW9uKC4uLmkpe249aSxyfHwocj0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3I9ITEsZS5hcHBseSh0LG4pfSkpfX1mdW5jdGlvbiBabyhlLHQpe2xldCBuO3JldHVybiBmdW5jdGlvbiguLi5yKXtyZXR1cm4gdD8oY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChlLHQscikpOmUuYXBwbHkodGhpcyxyKSx0fX12YXIgUW89ZT0+ZT09PWBzdGFydGA/YGxlZnRgOmU9PT1gZW5kYD9gcmlnaHRgOmBjZW50ZXJgLCRvPShlLHQsbik9PmU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246KHQrbikvMixlcz0oZSx0LG4scik9PmU9PT0ocj9gbGVmdGA6YHJpZ2h0YCk/bjplPT09YGNlbnRlcmA/KHQrbikvMjp0LHRzPWU9PmU9PT0wfHxlPT09MSxucz0oZSx0LG4pPT4tKDIqKigxMCotLWUpKk1hdGguc2luKChlLXQpKmdvL24pKSxycz0oZSx0LG4pPT4yKiooLTEwKmUpKk1hdGguc2luKChlLXQpKmdvL24pKzEsaXM9e2xpbmVhcjplPT5lLGVhc2VJblF1YWQ6ZT0+ZSplLGVhc2VPdXRRdWFkOmU9Pi1lKihlLTIpLGVhc2VJbk91dFF1YWQ6ZT0+KGUvPS41KTwxPy41KmUqZTotLjUqKC0tZSooZS0yKS0xKSxlYXNlSW5DdWJpYzplPT5lKmUqZSxlYXNlT3V0Q3ViaWM6ZT0+LS1lKmUqZSsxLGVhc2VJbk91dEN1YmljOmU9PihlLz0uNSk8MT8uNSplKmUqZTouNSooKGUtPTIpKmUqZSsyKSxlYXNlSW5RdWFydDplPT5lKmUqZSplLGVhc2VPdXRRdWFydDplPT4tKC0tZSplKmUqZS0xKSxlYXNlSW5PdXRRdWFydDplPT4oZS89LjUpPDE/LjUqZSplKmUqZTotLjUqKChlLT0yKSplKmUqZS0yKSxlYXNlSW5RdWludDplPT5lKmUqZSplKmUsZWFzZU91dFF1aW50OmU9Pi0tZSplKmUqZSplKzEsZWFzZUluT3V0UXVpbnQ6ZT0+KGUvPS41KTwxPy41KmUqZSplKmUqZTouNSooKGUtPTIpKmUqZSplKmUrMiksZWFzZUluU2luZTplPT4tTWF0aC5jb3MoZSp5bykrMSxlYXNlT3V0U2luZTplPT5NYXRoLnNpbihlKnlvKSxlYXNlSW5PdXRTaW5lOmU9Pi0uNSooTWF0aC5jb3MoWCplKS0xKSxlYXNlSW5FeHBvOmU9PmU9PT0wPzA6MioqKDEwKihlLTEpKSxlYXNlT3V0RXhwbzplPT5lPT09MT8xOi0oMioqKC0xMCplKSkrMSxlYXNlSW5PdXRFeHBvOmU9PnRzKGUpP2U6ZTwuNT8uNSoyKiooMTAqKGUqMi0xKSk6LjUqKC0oMioqKC0xMCooZSoyLTEpKSkrMiksZWFzZUluQ2lyYzplPT5lPj0xP2U6LShNYXRoLnNxcnQoMS1lKmUpLTEpLGVhc2VPdXRDaXJjOmU9Pk1hdGguc3FydCgxLSAtLWUqZSksZWFzZUluT3V0Q2lyYzplPT4oZS89LjUpPDE/LS41KihNYXRoLnNxcnQoMS1lKmUpLTEpOi41KihNYXRoLnNxcnQoMS0oZS09MikqZSkrMSksZWFzZUluRWxhc3RpYzplPT50cyhlKT9lOm5zKGUsLjA3NSwuMyksZWFzZU91dEVsYXN0aWM6ZT0+dHMoZSk/ZTpycyhlLC4wNzUsLjMpLGVhc2VJbk91dEVsYXN0aWMoZSl7bGV0IHQ9LjExMjUsbj0uNDU7cmV0dXJuIHRzKGUpP2U6ZTwuNT8uNSpucyhlKjIsdCxuKTouNSsuNSpycyhlKjItMSx0LG4pfSxlYXNlSW5CYWNrKGUpe3JldHVybiBlKmUqKDIuNzAxNTgqZS0xLjcwMTU4KX0sZWFzZU91dEJhY2soZSl7cmV0dXJuLS1lKmUqKDIuNzAxNTgqZSsxLjcwMTU4KSsxfSxlYXNlSW5PdXRCYWNrKGUpe2xldCB0PTEuNzAxNTg7cmV0dXJuKGUvPS41KTwxPy41KihlKmUqKCgodCo9MS41MjUpKzEpKmUtdCkpOi41KigoZS09MikqZSooKCh0Kj0xLjUyNSkrMSkqZSt0KSsyKX0sZWFzZUluQm91bmNlOmU9PjEtaXMuZWFzZU91dEJvdW5jZSgxLWUpLGVhc2VPdXRCb3VuY2UoZSl7bGV0IHQ9Ny41NjI1LG49Mi43NTtyZXR1cm4gZTwxL24/dCplKmU6ZTwyL24/dCooZS09MS41L24pKmUrLjc1OmU8Mi41L24/dCooZS09Mi4yNS9uKSplKy45Mzc1OnQqKGUtPTIuNjI1L24pKmUrLjk4NDM3NX0sZWFzZUluT3V0Qm91bmNlOmU9PmU8LjU/aXMuZWFzZUluQm91bmNlKGUqMikqLjU6aXMuZWFzZU91dEJvdW5jZShlKjItMSkqLjUrLjV9O2Z1bmN0aW9uIGFzKGUpe2lmKGUmJnR5cGVvZiBlPT1gb2JqZWN0YCl7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PT09YFtvYmplY3QgQ2FudmFzUGF0dGVybl1gfHx0PT09YFtvYmplY3QgQ2FudmFzR3JhZGllbnRdYH1yZXR1cm4hMX1mdW5jdGlvbiBvcyhlKXtyZXR1cm4gYXMoZSk/ZTpuZXcgSmEoZSl9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGFzKGUpP2U6bmV3IEphKGUpLnNhdHVyYXRlKC41KS5kYXJrZW4oLjEpLmhleFN0cmluZygpfXZhciBjcz1bYHhgLGB5YCxgYm9yZGVyV2lkdGhgLGByYWRpdXNgLGB0ZW5zaW9uYF0sbHM9W2Bjb2xvcmAsYGJvcmRlckNvbG9yYCxgYmFja2dyb3VuZENvbG9yYF07ZnVuY3Rpb24gdXMoZSl7ZS5zZXQoYGFuaW1hdGlvbmAse2RlbGF5OnZvaWQgMCxkdXJhdGlvbjoxZTMsZWFzaW5nOmBlYXNlT3V0UXVhcnRgLGZuOnZvaWQgMCxmcm9tOnZvaWQgMCxsb29wOnZvaWQgMCx0bzp2b2lkIDAsdHlwZTp2b2lkIDB9KSxlLmRlc2NyaWJlKGBhbmltYXRpb25gLHtfZmFsbGJhY2s6ITEsX2luZGV4YWJsZTohMSxfc2NyaXB0YWJsZTplPT5lIT09YG9uUHJvZ3Jlc3NgJiZlIT09YG9uQ29tcGxldGVgJiZlIT09YGZuYH0pLGUuc2V0KGBhbmltYXRpb25zYCx7Y29sb3JzOnt0eXBlOmBjb2xvcmAscHJvcGVydGllczpsc30sbnVtYmVyczp7dHlwZTpgbnVtYmVyYCxwcm9wZXJ0aWVzOmNzfX0pLGUuZGVzY3JpYmUoYGFuaW1hdGlvbnNgLHtfZmFsbGJhY2s6YGFuaW1hdGlvbmB9KSxlLnNldChgdHJhbnNpdGlvbnNgLHthY3RpdmU6e2FuaW1hdGlvbjp7ZHVyYXRpb246NDAwfX0scmVzaXplOnthbmltYXRpb246e2R1cmF0aW9uOjB9fSxzaG93OnthbmltYXRpb25zOntjb2xvcnM6e2Zyb206YHRyYW5zcGFyZW50YH0sdmlzaWJsZTp7dHlwZTpgYm9vbGVhbmAsZHVyYXRpb246MH19fSxoaWRlOnthbmltYXRpb25zOntjb2xvcnM6e3RvOmB0cmFuc3BhcmVudGB9LHZpc2libGU6e3R5cGU6YGJvb2xlYW5gLGVhc2luZzpgbGluZWFyYCxmbjplPT5lfDB9fX19KX1mdW5jdGlvbiBkcyhlKXtlLnNldChgbGF5b3V0YCx7YXV0b1BhZGRpbmc6ITAscGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fSl9dmFyIGZzPW5ldyBNYXA7ZnVuY3Rpb24gcHMoZSx0KXt0fHw9e307bGV0IG49ZStKU09OLnN0cmluZ2lmeSh0KSxyPWZzLmdldChuKTtyZXR1cm4gcnx8KHI9bmV3IEludGwuTnVtYmVyRm9ybWF0KGUsdCksZnMuc2V0KG4scikpLHJ9ZnVuY3Rpb24gbXMoZSx0LG4pe3JldHVybiBwcyh0LG4pLmZvcm1hdChlKX12YXIgaHM9e3ZhbHVlcyhlKXtyZXR1cm4gVyhlKT9lOmBgK2V9LG51bWVyaWMoZSx0LG4pe2lmKGU9PT0wKXJldHVybmAwYDtsZXQgcj10aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLGksYT1lO2lmKG4ubGVuZ3RoPjEpe2xldCB0PU1hdGgubWF4KE1hdGguYWJzKG5bMF0udmFsdWUpLE1hdGguYWJzKG5bbi5sZW5ndGgtMV0udmFsdWUpKTsodDwxZS00fHx0PjB4MzhkN2VhNGM2ODAwMCkmJihpPWBzY2llbnRpZmljYCksYT1ncyhlLG4pfWxldCBvPVNvKE1hdGguYWJzKGEpKSxzPWlzTmFOKG8pPzE6TWF0aC5tYXgoTWF0aC5taW4oLTEqTWF0aC5mbG9vcihvKSwyMCksMCksYz17bm90YXRpb246aSxtaW5pbXVtRnJhY3Rpb25EaWdpdHM6cyxtYXhpbXVtRnJhY3Rpb25EaWdpdHM6c307cmV0dXJuIE9iamVjdC5hc3NpZ24oYyx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KSxtcyhlLHIsYyl9LGxvZ2FyaXRobWljKGUsdCxuKXtpZihlPT09MClyZXR1cm5gMGA7bGV0IHI9blt0XS5zaWduaWZpY2FuZHx8ZS8xMCoqTWF0aC5mbG9vcihTbyhlKSk7cmV0dXJuWzEsMiwzLDUsMTAsMTVdLmluY2x1ZGVzKHIpfHx0Pi44Km4ubGVuZ3RoP2hzLm51bWVyaWMuY2FsbCh0aGlzLGUsdCxuKTpgYH19O2Z1bmN0aW9uIGdzKGUsdCl7bGV0IG49dC5sZW5ndGg+Mz90WzJdLnZhbHVlLXRbMV0udmFsdWU6dFsxXS52YWx1ZS10WzBdLnZhbHVlO3JldHVybiBNYXRoLmFicyhuKT49MSYmZSE9PU1hdGguZmxvb3IoZSkmJihuPWUtTWF0aC5mbG9vcihlKSksbn12YXIgX3M9e2Zvcm1hdHRlcnM6aHN9O2Z1bmN0aW9uIHZzKGUpe2Uuc2V0KGBzY2FsZWAse2Rpc3BsYXk6ITAsb2Zmc2V0OiExLHJldmVyc2U6ITEsYmVnaW5BdFplcm86ITEsYm91bmRzOmB0aWNrc2AsY2xpcDohMCxncmFjZTowLGdyaWQ6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsZHJhd09uQ2hhcnRBcmVhOiEwLGRyYXdUaWNrczohMCx0aWNrTGVuZ3RoOjgsdGlja1dpZHRoOihlLHQpPT50LmxpbmVXaWR0aCx0aWNrQ29sb3I6KGUsdCk9PnQuY29sb3Isb2Zmc2V0OiExfSxib3JkZXI6e2Rpc3BsYXk6ITAsZGFzaDpbXSxkYXNoT2Zmc2V0OjAsd2lkdGg6MX0sdGl0bGU6e2Rpc3BsYXk6ITEsdGV4dDpgYCxwYWRkaW5nOnt0b3A6NCxib3R0b206NH19LHRpY2tzOnttaW5Sb3RhdGlvbjowLG1heFJvdGF0aW9uOjUwLG1pcnJvcjohMSx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0U3Ryb2tlQ29sb3I6YGAscGFkZGluZzozLGRpc3BsYXk6ITAsYXV0b1NraXA6ITAsYXV0b1NraXBQYWRkaW5nOjMsbGFiZWxPZmZzZXQ6MCxjYWxsYmFjazpfcy5mb3JtYXR0ZXJzLnZhbHVlcyxtaW5vcjp7fSxtYWpvcjp7fSxhbGlnbjpgY2VudGVyYCxjcm9zc0FsaWduOmBuZWFyYCxzaG93TGFiZWxCYWNrZHJvcDohMSxiYWNrZHJvcENvbG9yOmByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpYCxiYWNrZHJvcFBhZGRpbmc6Mn19KSxlLnJvdXRlKGBzY2FsZS50aWNrc2AsYGNvbG9yYCxgYCxgY29sb3JgKSxlLnJvdXRlKGBzY2FsZS5ncmlkYCxgY29sb3JgLGBgLGBib3JkZXJDb2xvcmApLGUucm91dGUoYHNjYWxlLmJvcmRlcmAsYGNvbG9yYCxgYCxgYm9yZGVyQ29sb3JgKSxlLnJvdXRlKGBzY2FsZS50aXRsZWAsYGNvbG9yYCxgYCxgY29sb3JgKSxlLmRlc2NyaWJlKGBzY2FsZWAse19mYWxsYmFjazohMSxfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBiZWZvcmVgKSYmIWUuc3RhcnRzV2l0aChgYWZ0ZXJgKSYmZSE9PWBjYWxsYmFja2AmJmUhPT1gcGFyc2VyYCxfaW5kZXhhYmxlOmU9PmUhPT1gYm9yZGVyRGFzaGAmJmUhPT1gdGlja0JvcmRlckRhc2hgJiZlIT09YGRhc2hgfSksZS5kZXNjcmliZShgc2NhbGVzYCx7X2ZhbGxiYWNrOmBzY2FsZWB9KSxlLmRlc2NyaWJlKGBzY2FsZS50aWNrc2Ase19zY3JpcHRhYmxlOmU9PmUhPT1gYmFja2Ryb3BQYWRkaW5nYCYmZSE9PWBjYWxsYmFja2AsX2luZGV4YWJsZTplPT5lIT09YGJhY2tkcm9wUGFkZGluZ2B9KX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKSxicz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHhzKGUsdCl7aWYoIXQpcmV0dXJuIGU7bGV0IG49dC5zcGxpdChgLmApO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dDxyOysrdCl7bGV0IHI9blt0XTtlPWVbcl18fChlW3JdPU9iamVjdC5jcmVhdGUobnVsbCkpfXJldHVybiBlfWZ1bmN0aW9uIFNzKGUsdCxuKXtyZXR1cm4gdHlwZW9mIHQ9PWBzdHJpbmdgP3JvKHhzKGUsdCksbik6cm8oeHMoZSxgYCksdCl9dmFyIFo9bmV3IGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5hbmltYXRpb249dm9pZCAwLHRoaXMuYmFja2dyb3VuZENvbG9yPWByZ2JhKDAsMCwwLDAuMSlgLHRoaXMuYm9yZGVyQ29sb3I9YHJnYmEoMCwwLDAsMC4xKWAsdGhpcy5jb2xvcj1gIzY2NmAsdGhpcy5kYXRhc2V0cz17fSx0aGlzLmRldmljZVBpeGVsUmF0aW89ZT0+ZS5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCksdGhpcy5lbGVtZW50cz17fSx0aGlzLmV2ZW50cz1bYG1vdXNlbW92ZWAsYG1vdXNlb3V0YCxgY2xpY2tgLGB0b3VjaHN0YXJ0YCxgdG91Y2htb3ZlYF0sdGhpcy5mb250PXtmYW1pbHk6YCdIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmYCxzaXplOjEyLHN0eWxlOmBub3JtYWxgLGxpbmVIZWlnaHQ6MS4yLHdlaWdodDpudWxsfSx0aGlzLmhvdmVyPXt9LHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3I9KGUsdCk9PnNzKHQuYmFja2dyb3VuZENvbG9yKSx0aGlzLmhvdmVyQm9yZGVyQ29sb3I9KGUsdCk9PnNzKHQuYm9yZGVyQ29sb3IpLHRoaXMuaG92ZXJDb2xvcj0oZSx0KT0+c3ModC5jb2xvciksdGhpcy5pbmRleEF4aXM9YHhgLHRoaXMuaW50ZXJhY3Rpb249e21vZGU6YG5lYXJlc3RgLGludGVyc2VjdDohMCxpbmNsdWRlSW52aXNpYmxlOiExfSx0aGlzLm1haW50YWluQXNwZWN0UmF0aW89ITAsdGhpcy5vbkhvdmVyPW51bGwsdGhpcy5vbkNsaWNrPW51bGwsdGhpcy5wYXJzaW5nPSEwLHRoaXMucGx1Z2lucz17fSx0aGlzLnJlc3BvbnNpdmU9ITAsdGhpcy5zY2FsZT12b2lkIDAsdGhpcy5zY2FsZXM9e30sdGhpcy5zaG93TGluZT0hMCx0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wPSEwLHRoaXMuZGVzY3JpYmUoZSksdGhpcy5hcHBseSh0KX1zZXQoZSx0KXtyZXR1cm4gU3ModGhpcyxlLHQpfWdldChlKXtyZXR1cm4geHModGhpcyxlKX1kZXNjcmliZShlLHQpe3JldHVybiBTcyhicyxlLHQpfW92ZXJyaWRlKGUsdCl7cmV0dXJuIFNzKHlzLGUsdCl9cm91dGUoZSx0LG4scil7bGV0IGk9eHModGhpcyxlKSxhPXhzKHRoaXMsbiksbz1gX2ArdDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLHtbb106e3ZhbHVlOmlbdF0sd3JpdGFibGU6ITB9LFt0XTp7ZW51bWVyYWJsZTohMCxnZXQoKXtsZXQgZT10aGlzW29dLHQ9YVtyXTtyZXR1cm4gRyhlKT9PYmplY3QuYXNzaWduKHt9LHQsZSk6cShlLHQpfSxzZXQoZSl7dGhpc1tvXT1lfX19KX1hcHBseShlKXtlLmZvckVhY2goZT0+ZSh0aGlzKSl9fSh7X3NjcmlwdGFibGU6ZT0+IWUuc3RhcnRzV2l0aChgb25gKSxfaW5kZXhhYmxlOmU9PmUhPT1gZXZlbnRzYCxob3Zlcjp7X2ZhbGxiYWNrOmBpbnRlcmFjdGlvbmB9LGludGVyYWN0aW9uOntfc2NyaXB0YWJsZTohMSxfaW5kZXhhYmxlOiExfX0sW3VzLGRzLHZzXSk7ZnVuY3Rpb24gQ3MoZSl7cmV0dXJuIWV8fFUoZS5zaXplKXx8VShlLmZhbWlseSk/bnVsbDooZS5zdHlsZT9lLnN0eWxlK2AgYDpgYCkrKGUud2VpZ2h0P2Uud2VpZ2h0K2AgYDpgYCkrZS5zaXplK2BweCBgK2UuZmFtaWx5fWZ1bmN0aW9uIHdzKGUsdCxuLHIsaSl7bGV0IGE9dFtpXTtyZXR1cm4gYXx8KGE9dFtpXT1lLm1lYXN1cmVUZXh0KGkpLndpZHRoLG4ucHVzaChpKSksYT5yJiYocj1hKSxyfWZ1bmN0aW9uIFRzKGUsdCxuLHIpe3J8fD17fTtsZXQgaT1yLmRhdGE9ci5kYXRhfHx7fSxhPXIuZ2FyYmFnZUNvbGxlY3Q9ci5nYXJiYWdlQ29sbGVjdHx8W107ci5mb250IT09dCYmKGk9ci5kYXRhPXt9LGE9ci5nYXJiYWdlQ29sbGVjdD1bXSxyLmZvbnQ9dCksZS5zYXZlKCksZS5mb250PXQ7bGV0IG89MCxzPW4ubGVuZ3RoLGMsbCx1LGQsZjtmb3IoYz0wO2M8cztjKyspaWYoZD1uW2NdLGQhPW51bGwmJiFXKGQpKW89d3MoZSxpLGEsbyxkKTtlbHNlIGlmKFcoZCkpZm9yKGw9MCx1PWQubGVuZ3RoO2w8dTtsKyspZj1kW2xdLGYhPW51bGwmJiFXKGYpJiYobz13cyhlLGksYSxvLGYpKTtlLnJlc3RvcmUoKTtsZXQgcD1hLmxlbmd0aC8yO2lmKHA+bi5sZW5ndGgpe2ZvcihjPTA7YzxwO2MrKylkZWxldGUgaVthW2NdXTthLnNwbGljZSgwLHApfXJldHVybiBvfWZ1bmN0aW9uIEVzKGUsdCxuKXtsZXQgcj1lLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvLGk9bj09PTA/MDpNYXRoLm1heChuLzIsLjUpO3JldHVybiBNYXRoLnJvdW5kKCh0LWkpKnIpL3IraX1mdW5jdGlvbiBEcyhlLHQpeyF0JiYhZXx8KHR8fD1lLmdldENvbnRleHQoYDJkYCksdC5zYXZlKCksdC5yZXNldFRyYW5zZm9ybSgpLHQuY2xlYXJSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0LnJlc3RvcmUoKSl9ZnVuY3Rpb24gT3MoZSx0LG4scil7a3MoZSx0LG4scixudWxsKX1mdW5jdGlvbiBrcyhlLHQsbixyLGkpe2xldCBhLG8scyxjLGwsdSxkLGYscD10LnBvaW50U3R5bGUsbT10LnJvdGF0aW9uLGg9dC5yYWRpdXMsZz0obXx8MCkqdm87aWYocCYmdHlwZW9mIHA9PWBvYmplY3RgJiYoYT1wLnRvU3RyaW5nKCksYT09PWBbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdYHx8YT09PWBbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XWApKXtlLnNhdmUoKSxlLnRyYW5zbGF0ZShuLHIpLGUucm90YXRlKGcpLGUuZHJhd0ltYWdlKHAsLXAud2lkdGgvMiwtcC5oZWlnaHQvMixwLndpZHRoLHAuaGVpZ2h0KSxlLnJlc3RvcmUoKTtyZXR1cm59aWYoIShpc05hTihoKXx8aDw9MCkpe3N3aXRjaChlLmJlZ2luUGF0aCgpLHApe2RlZmF1bHQ6aT9lLmVsbGlwc2UobixyLGkvMixoLDAsMCxnbyk6ZS5hcmMobixyLGgsMCxnbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHRyaWFuZ2xlYDp1PWk/aS8yOmgsZS5tb3ZlVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RSb3VuZGVkYDpsPWgqLjUxNixjPWgtbCxvPU1hdGguY29zKGcrYm8pKmMsZD1NYXRoLmNvcyhnK2JvKSooaT9pLzItbDpjKSxzPU1hdGguc2luKGcrYm8pKmMsZj1NYXRoLnNpbihnK2JvKSooaT9pLzItbDpjKSxlLmFyYyhuLWQsci1zLGwsZy1YLGcteW8pLGUuYXJjKG4rZixyLW8sbCxnLXlvLGcpLGUuYXJjKG4rZCxyK3MsbCxnLGcreW8pLGUuYXJjKG4tZixyK28sbCxnK3lvLGcrWCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RgOmlmKCFtKXtjPU1hdGguU1FSVDFfMipoLHU9aT9pLzI6YyxlLnJlY3Qobi11LHItYywyKnUsMipjKTticmVha31nKz1ibztjYXNlYHJlY3RSb3RgOmQ9TWF0aC5jb3MoZykqKGk/aS8yOmgpLG89TWF0aC5jb3MoZykqaCxzPU1hdGguc2luKGcpKmgsZj1NYXRoLnNpbihnKSooaT9pLzI6aCksZS5tb3ZlVG8obi1kLHItcyksZS5saW5lVG8obitmLHItbyksZS5saW5lVG8obitkLHIrcyksZS5saW5lVG8obi1mLHIrbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYGNyb3NzUm90YDpnKz1ibztjYXNlYGNyb3NzYDpkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2Vgc3RhcmA6ZD1NYXRoLmNvcyhnKSooaT9pLzI6aCksbz1NYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxmPU1hdGguc2luKGcpKihpP2kvMjpoKSxlLm1vdmVUbyhuLWQsci1zKSxlLmxpbmVUbyhuK2QscitzKSxlLm1vdmVUbyhuK2Ysci1vKSxlLmxpbmVUbyhuLWYscitvKSxnKz1ibyxkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2VgbGluZWA6bz1pP2kvMjpNYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxlLm1vdmVUbyhuLW8sci1zKSxlLmxpbmVUbyhuK28scitzKTticmVhaztjYXNlYGRhc2hgOmUubW92ZVRvKG4sciksZS5saW5lVG8obitNYXRoLmNvcyhnKSooaT9pLzI6aCkscitNYXRoLnNpbihnKSpoKTticmVhaztjYXNlITE6ZS5jbG9zZVBhdGgoKX1lLmZpbGwoKSx0LmJvcmRlcldpZHRoPjAmJmUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEFzKGUsdCxuKXtyZXR1cm4gbnx8PS41LCF0fHxlJiZlLng+dC5sZWZ0LW4mJmUueDx0LnJpZ2h0K24mJmUueT50LnRvcC1uJiZlLnk8dC5ib3R0b20rbn1mdW5jdGlvbiBqcyhlLHQpe2Uuc2F2ZSgpLGUuYmVnaW5QYXRoKCksZS5yZWN0KHQubGVmdCx0LnRvcCx0LnJpZ2h0LXQubGVmdCx0LmJvdHRvbS10LnRvcCksZS5jbGlwKCl9ZnVuY3Rpb24gTXMoZSl7ZS5yZXN0b3JlKCl9ZnVuY3Rpb24gTnMoZSx0KXt0LnRyYW5zbGF0aW9uJiZlLnRyYW5zbGF0ZSh0LnRyYW5zbGF0aW9uWzBdLHQudHJhbnNsYXRpb25bMV0pLFUodC5yb3RhdGlvbil8fGUucm90YXRlKHQucm90YXRpb24pLHQuY29sb3ImJihlLmZpbGxTdHlsZT10LmNvbG9yKSx0LnRleHRBbGlnbiYmKGUudGV4dEFsaWduPXQudGV4dEFsaWduKSx0LnRleHRCYXNlbGluZSYmKGUudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lKX1mdW5jdGlvbiBQcyhlLHQsbixyLGkpe2lmKGkuc3RyaWtldGhyb3VnaHx8aS51bmRlcmxpbmUpe2xldCBhPWUubWVhc3VyZVRleHQociksbz10LWEuYWN0dWFsQm91bmRpbmdCb3hMZWZ0LHM9dCthLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQsYz1uLWEuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsbD1uK2EuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50LHU9aS5zdHJpa2V0aHJvdWdoPyhjK2wpLzI6bDtlLnN0cm9rZVN0eWxlPWUuZmlsbFN0eWxlLGUuYmVnaW5QYXRoKCksZS5saW5lV2lkdGg9aS5kZWNvcmF0aW9uV2lkdGh8fDIsZS5tb3ZlVG8obyx1KSxlLmxpbmVUbyhzLHUpLGUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEZzKGUsdCl7bGV0IG49ZS5maWxsU3R5bGU7ZS5maWxsU3R5bGU9dC5jb2xvcixlLmZpbGxSZWN0KHQubGVmdCx0LnRvcCx0LndpZHRoLHQuaGVpZ2h0KSxlLmZpbGxTdHlsZT1ufWZ1bmN0aW9uIElzKGUsdCxuLHIsaSxhPXt9KXtsZXQgbz1XKHQpP3Q6W3RdLHM9YS5zdHJva2VXaWR0aD4wJiZhLnN0cm9rZUNvbG9yIT09YGAsYyxsO2ZvcihlLnNhdmUoKSxlLmZvbnQ9aS5zdHJpbmcsTnMoZSxhKSxjPTA7YzxvLmxlbmd0aDsrK2MpbD1vW2NdLGEuYmFja2Ryb3AmJkZzKGUsYS5iYWNrZHJvcCkscyYmKGEuc3Ryb2tlQ29sb3ImJihlLnN0cm9rZVN0eWxlPWEuc3Ryb2tlQ29sb3IpLFUoYS5zdHJva2VXaWR0aCl8fChlLmxpbmVXaWR0aD1hLnN0cm9rZVdpZHRoKSxlLnN0cm9rZVRleHQobCxuLHIsYS5tYXhXaWR0aCkpLGUuZmlsbFRleHQobCxuLHIsYS5tYXhXaWR0aCksUHMoZSxuLHIsbCxhKSxyKz1OdW1iZXIoaS5saW5lSGVpZ2h0KTtlLnJlc3RvcmUoKX1mdW5jdGlvbiBMcyhlLHQpe2xldHt4Om4seTpyLHc6aSxoOmEscmFkaXVzOm99PXQ7ZS5hcmMobitvLnRvcExlZnQscitvLnRvcExlZnQsby50b3BMZWZ0LDEuNSpYLFgsITApLGUubGluZVRvKG4scithLW8uYm90dG9tTGVmdCksZS5hcmMobitvLmJvdHRvbUxlZnQscithLW8uYm90dG9tTGVmdCxvLmJvdHRvbUxlZnQsWCx5bywhMCksZS5saW5lVG8obitpLW8uYm90dG9tUmlnaHQscithKSxlLmFyYyhuK2ktby5ib3R0b21SaWdodCxyK2Etby5ib3R0b21SaWdodCxvLmJvdHRvbVJpZ2h0LHlvLDAsITApLGUubGluZVRvKG4raSxyK28udG9wUmlnaHQpLGUuYXJjKG4raS1vLnRvcFJpZ2h0LHIrby50b3BSaWdodCxvLnRvcFJpZ2h0LDAsLXlvLCEwKSxlLmxpbmVUbyhuK28udG9wTGVmdCxyKX12YXIgUnM9L14obm9ybWFsfChcZCsoPzpcLlxkKyk/KShweHxlbXwlKT8pJC8senM9L14obm9ybWFsfGl0YWxpY3xpbml0aWFsfGluaGVyaXR8dW5zZXR8KG9ibGlxdWUoIC0/WzAtOV0/WzAtOV1kZWcpPykpJC87ZnVuY3Rpb24gQnMoZSx0KXtsZXQgbj0oYGArZSkubWF0Y2goUnMpO2lmKCFufHxuWzFdPT09YG5vcm1hbGApcmV0dXJuIHQqMS4yO3N3aXRjaChlPStuWzJdLG5bM10pe2Nhc2VgcHhgOnJldHVybiBlO2Nhc2VgJWA6ZS89MTAwfXJldHVybiB0KmV9dmFyIFZzPWU9PitlfHwwO2Z1bmN0aW9uIEhzKGUsdCl7bGV0IG49e30scj1HKHQpLGk9cj9PYmplY3Qua2V5cyh0KTp0LGE9RyhlKT9yP249PnEoZVtuXSxlW3Rbbl1dKTp0PT5lW3RdOigpPT5lO2ZvcihsZXQgZSBvZiBpKW5bZV09VnMoYShlKSk7cmV0dXJuIG59ZnVuY3Rpb24gVXMoZSl7cmV0dXJuIEhzKGUse3RvcDpgeWAscmlnaHQ6YHhgLGJvdHRvbTpgeWAsbGVmdDpgeGB9KX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gSHMoZSxbYHRvcExlZnRgLGB0b3BSaWdodGAsYGJvdHRvbUxlZnRgLGBib3R0b21SaWdodGBdKX1mdW5jdGlvbiBRKGUpe2xldCB0PVVzKGUpO3JldHVybiB0LndpZHRoPXQubGVmdCt0LnJpZ2h0LHQuaGVpZ2h0PXQudG9wK3QuYm90dG9tLHR9ZnVuY3Rpb24gJChlLHQpe2V8fD17fSx0fHw9Wi5mb250O2xldCBuPXEoZS5zaXplLHQuc2l6ZSk7dHlwZW9mIG49PWBzdHJpbmdgJiYobj1wYXJzZUludChuLDEwKSk7bGV0IHI9cShlLnN0eWxlLHQuc3R5bGUpO3ImJiEoYGArcikubWF0Y2goenMpJiYoY29uc29sZS53YXJuKGBJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiAiYCtyK2AiYCkscj12b2lkIDApO2xldCBpPXtmYW1pbHk6cShlLmZhbWlseSx0LmZhbWlseSksbGluZUhlaWdodDpCcyhxKGUubGluZUhlaWdodCx0LmxpbmVIZWlnaHQpLG4pLHNpemU6bixzdHlsZTpyLHdlaWdodDpxKGUud2VpZ2h0LHQud2VpZ2h0KSxzdHJpbmc6YGB9O3JldHVybiBpLnN0cmluZz1DcyhpKSxpfWZ1bmN0aW9uIEdzKGUsdCxuLHIpe2xldCBpPSEwLGEsbyxzO2ZvcihhPTAsbz1lLmxlbmd0aDthPG87KythKWlmKHM9ZVthXSxzIT09dm9pZCAwJiYodCE9PXZvaWQgMCYmdHlwZW9mIHM9PWBmdW5jdGlvbmAmJihzPXModCksaT0hMSksbiE9PXZvaWQgMCYmVyhzKSYmKHM9c1tuJXMubGVuZ3RoXSxpPSExKSxzIT09dm9pZCAwKSlyZXR1cm4gciYmIWkmJihyLmNhY2hlYWJsZT0hMSksc31mdW5jdGlvbiBLcyhlLHQsbil7bGV0e21pbjpyLG1heDppfT1lLGE9UWEodCwoaS1yKS8yKSxvPShlLHQpPT5uJiZlPT09MD8wOmUrdDtyZXR1cm57bWluOm8ociwtTWF0aC5hYnMoYSkpLG1heDpvKGksYSl9fWZ1bmN0aW9uIHFzKGUsdCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShlKSx0KX1mdW5jdGlvbiBKcyhlLHQ9W2BgXSxuLHIsaT0oKT0+ZVswXSl7bGV0IGE9bnx8ZTtyZXR1cm4gcj09PXZvaWQgMCYmKHI9dWMoYF9mYWxsYmFja2AsZSkpLG5ldyBQcm94eSh7W1N5bWJvbC50b1N0cmluZ1RhZ106YE9iamVjdGAsX2NhY2hlYWJsZTohMCxfc2NvcGVzOmUsX3Jvb3RTY29wZXM6YSxfZmFsbGJhY2s6cixfZ2V0VGFyZ2V0Omksb3ZlcnJpZGU6bj0+SnMoW24sLi4uZV0sdCxhLHIpfSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIHQuX2tleXMsZGVsZXRlIGVbMF1bbl0sITB9LGdldChuLHIpe3JldHVybiAkcyhuLHIsKCk9PmxjKHIsdCxlLG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuX3Njb3Blc1swXSx0KX0sZ2V0UHJvdG90eXBlT2YoKXtyZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihlWzBdKX0saGFzKGUsdCl7cmV0dXJuIGRjKGUpLmluY2x1ZGVzKHQpfSxvd25LZXlzKGUpe3JldHVybiBkYyhlKX0sc2V0KGUsdCxuKXtsZXQgcj1lLl9zdG9yYWdlfHw9aSgpO3JldHVybiBlW3RdPXJbdF09bixkZWxldGUgZS5fa2V5cywhMH19KX1mdW5jdGlvbiBZcyhlLHQsbixyKXtsZXQgaT17X2NhY2hlYWJsZTohMSxfcHJveHk6ZSxfY29udGV4dDp0LF9zdWJQcm94eTpuLF9zdGFjazpuZXcgU2V0LF9kZXNjcmlwdG9yczpYcyhlLHIpLHNldENvbnRleHQ6dD0+WXMoZSx0LG4sciksb3ZlcnJpZGU6aT0+WXMoZS5vdmVycmlkZShpKSx0LG4scil9O3JldHVybiBuZXcgUHJveHkoaSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIGVbbl0sITB9LGdldChlLHQsbil7cmV0dXJuICRzKGUsdCwoKT0+ZWMoZSx0LG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7cmV0dXJuIHQuX2Rlc2NyaXB0b3JzLmFsbEtleXM/UmVmbGVjdC5oYXMoZSxuKT97ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9OnZvaWQgMDpSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pfSxnZXRQcm90b3R5cGVPZigpe3JldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGUpfSxoYXModCxuKXtyZXR1cm4gUmVmbGVjdC5oYXMoZSxuKX0sb3duS2V5cygpe3JldHVybiBSZWZsZWN0Lm93bktleXMoZSl9LHNldCh0LG4scil7cmV0dXJuIGVbbl09cixkZWxldGUgdFtuXSwhMH19KX1mdW5jdGlvbiBYcyhlLHQ9e3NjcmlwdGFibGU6ITAsaW5kZXhhYmxlOiEwfSl7bGV0e19zY3JpcHRhYmxlOm49dC5zY3JpcHRhYmxlLF9pbmRleGFibGU6cj10LmluZGV4YWJsZSxfYWxsS2V5czppPXQuYWxsS2V5c309ZTtyZXR1cm57YWxsS2V5czppLHNjcmlwdGFibGU6bixpbmRleGFibGU6cixpc1NjcmlwdGFibGU6cG8obik/bjooKT0+bixpc0luZGV4YWJsZTpwbyhyKT9yOigpPT5yfX12YXIgWnM9KGUsdCk9PmU/ZSt1byh0KTp0LFFzPShlLHQpPT5HKHQpJiZlIT09YGFkYXB0ZXJzYCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGx8fHQuY29uc3RydWN0b3I9PT1PYmplY3QpO2Z1bmN0aW9uICRzKGUsdCxuKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KXx8dD09PWBjb25zdHJ1Y3RvcmApcmV0dXJuIGVbdF07bGV0IHI9bigpO3JldHVybiBlW3RdPXIscn1mdW5jdGlvbiBlYyhlLHQsbil7bGV0e19wcm94eTpyLF9jb250ZXh0OmksX3N1YlByb3h5OmEsX2Rlc2NyaXB0b3JzOm99PWUscz1yW3RdO3JldHVybiBwbyhzKSYmby5pc1NjcmlwdGFibGUodCkmJihzPXRjKHQscyxlLG4pKSxXKHMpJiZzLmxlbmd0aCYmKHM9bmModCxzLGUsby5pc0luZGV4YWJsZSkpLFFzKHQscykmJihzPVlzKHMsaSxhJiZhW3RdLG8pKSxzfWZ1bmN0aW9uIHRjKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9zdGFjazpzfT1uO2lmKHMuaGFzKGUpKXRocm93IEVycm9yKGBSZWN1cnNpb24gZGV0ZWN0ZWQ6IGArQXJyYXkuZnJvbShzKS5qb2luKGAtPmApK2AtPmArZSk7cy5hZGQoZSk7bGV0IGM9dChhLG98fHIpO3JldHVybiBzLmRlbGV0ZShlKSxRcyhlLGMpJiYoYz1vYyhpLl9zY29wZXMsaSxlLGMpKSxjfWZ1bmN0aW9uIG5jKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9kZXNjcmlwdG9yczpzfT1uO2lmKGEuaW5kZXghPT12b2lkIDAmJnIoZSkpcmV0dXJuIHRbYS5pbmRleCV0Lmxlbmd0aF07aWYoRyh0WzBdKSl7bGV0IG49dCxyPWkuX3Njb3Blcy5maWx0ZXIoZT0+ZSE9PW4pO3Q9W107Zm9yKGxldCBjIG9mIG4pe2xldCBuPW9jKHIsaSxlLGMpO3QucHVzaChZcyhuLGEsbyYmb1tlXSxzKSl9fXJldHVybiB0fWZ1bmN0aW9uIHJjKGUsdCxuKXtyZXR1cm4gcG8oZSk/ZSh0LG4pOmV9dmFyIGljPShlLHQpPT5lPT09ITA/dDp0eXBlb2YgZT09YHN0cmluZ2A/bG8odCxlKTp2b2lkIDA7ZnVuY3Rpb24gYWMoZSx0LG4scixpKXtmb3IobGV0IGEgb2YgdCl7bGV0IHQ9aWMobixhKTtpZih0KXtlLmFkZCh0KTtsZXQgYT1yYyh0Ll9mYWxsYmFjayxuLGkpO2lmKGEhPT12b2lkIDAmJmEhPT1uJiZhIT09cilyZXR1cm4gYX1lbHNlIGlmKHQ9PT0hMSYmciE9PXZvaWQgMCYmbiE9PXIpcmV0dXJuIG51bGx9cmV0dXJuITF9ZnVuY3Rpb24gb2MoZSx0LG4scil7bGV0IGk9dC5fcm9vdFNjb3BlcyxhPXJjKHQuX2ZhbGxiYWNrLG4sciksbz1bLi4uZSwuLi5pXSxzPW5ldyBTZXQ7cy5hZGQocik7bGV0IGM9c2MocyxvLG4sYXx8bixyKTtyZXR1cm4gYz09PW51bGx8fGEhPT12b2lkIDAmJmEhPT1uJiYoYz1zYyhzLG8sYSxjLHIpLGM9PT1udWxsKT8hMTpKcyhBcnJheS5mcm9tKHMpLFtgYF0saSxhLCgpPT5jYyh0LG4scikpfWZ1bmN0aW9uIHNjKGUsdCxuLHIsaSl7Zm9yKDtuOyluPWFjKGUsdCxuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gY2MoZSx0LG4pe2xldCByPWUuX2dldFRhcmdldCgpO3QgaW4gcnx8KHJbdF09e30pO2xldCBpPXJbdF07cmV0dXJuIFcoaSkmJkcobik/bjppfHx7fX1mdW5jdGlvbiBsYyhlLHQsbixyKXtsZXQgaTtmb3IobGV0IGEgb2YgdClpZihpPXVjKFpzKGEsZSksbiksaSE9PXZvaWQgMClyZXR1cm4gUXMoZSxpKT9vYyhuLHIsZSxpKTppfWZ1bmN0aW9uIHVjKGUsdCl7Zm9yKGxldCBuIG9mIHQpe2lmKCFuKWNvbnRpbnVlO2xldCB0PW5bZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdH19ZnVuY3Rpb24gZGMoZSl7bGV0IHQ9ZS5fa2V5cztyZXR1cm4gdHx8PWUuX2tleXM9ZmMoZS5fc2NvcGVzKSx0fWZ1bmN0aW9uIGZjKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIGUpZm9yKGxldCBlIG9mIE9iamVjdC5rZXlzKG4pLmZpbHRlcihlPT4hZS5zdGFydHNXaXRoKGBfYCkpKXQuYWRkKGUpO3JldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8YHVgJiZ0eXBlb2YgZG9jdW1lbnQ8YHVgfWZ1bmN0aW9uIG1jKGUpe2xldCB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC50b1N0cmluZygpPT09YFtvYmplY3QgU2hhZG93Um9vdF1gJiYodD10Lmhvc3QpLHR9ZnVuY3Rpb24gaGMoZSx0LG4pe2xldCByO3JldHVybiB0eXBlb2YgZT09YHN0cmluZ2A/KHI9cGFyc2VJbnQoZSwxMCksZS5pbmRleE9mKGAlYCkhPT0tMSYmKHI9ci8xMDAqdC5wYXJlbnROb2RlW25dKSk6cj1lLHJ9dmFyIGdjPWU9PmUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCk7ZnVuY3Rpb24gX2MoZSx0KXtyZXR1cm4gZ2MoZSkuZ2V0UHJvcGVydHlWYWx1ZSh0KX12YXIgdmM9W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXTtmdW5jdGlvbiB5YyhlLHQsbil7bGV0IHI9e307bj1uP2AtYCtuOmBgO2ZvcihsZXQgaT0wO2k8NDtpKyspe2xldCBhPXZjW2ldO3JbYV09cGFyc2VGbG9hdChlW3QrYC1gK2Erbl0pfHwwfXJldHVybiByLndpZHRoPXIubGVmdCtyLnJpZ2h0LHIuaGVpZ2h0PXIudG9wK3IuYm90dG9tLHJ9dmFyIGJjPShlLHQsbik9PihlPjB8fHQ+MCkmJighbnx8IW4uc2hhZG93Um9vdCk7ZnVuY3Rpb24geGMoZSx0KXtsZXQgbj1lLnRvdWNoZXMscj1uJiZuLmxlbmd0aD9uWzBdOmUse29mZnNldFg6aSxvZmZzZXRZOmF9PXIsbz0hMSxzLGM7aWYoYmMoaSxhLGUudGFyZ2V0KSlzPWksYz1hO2Vsc2V7bGV0IGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtzPXIuY2xpZW50WC1lLmxlZnQsYz1yLmNsaWVudFktZS50b3Asbz0hMH1yZXR1cm57eDpzLHk6Yyxib3g6b319ZnVuY3Rpb24gU2MoZSx0KXtpZihgbmF0aXZlYGluIGUpcmV0dXJuIGU7bGV0e2NhbnZhczpuLGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvOnJ9PXQsaT1nYyhuKSxhPWkuYm94U2l6aW5nPT09YGJvcmRlci1ib3hgLG89eWMoaSxgcGFkZGluZ2ApLHM9eWMoaSxgYm9yZGVyYCxgd2lkdGhgKSx7eDpjLHk6bCxib3g6dX09eGMoZSxuKSxkPW8ubGVmdCsodSYmcy5sZWZ0KSxmPW8udG9wKyh1JiZzLnRvcCkse3dpZHRoOnAsaGVpZ2h0Om19PXQ7cmV0dXJuIGEmJihwLT1vLndpZHRoK3Mud2lkdGgsbS09by5oZWlnaHQrcy5oZWlnaHQpLHt4Ok1hdGgucm91bmQoKGMtZCkvcCpuLndpZHRoL3IpLHk6TWF0aC5yb3VuZCgobC1mKS9tKm4uaGVpZ2h0L3IpfX1mdW5jdGlvbiBDYyhlLHQsbil7bGV0IHIsaTtpZih0PT09dm9pZCAwfHxuPT09dm9pZCAwKXtsZXQgYT1lJiZtYyhlKTtpZighYSl0PWUuY2xpZW50V2lkdGgsbj1lLmNsaWVudEhlaWdodDtlbHNle2xldCBlPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1nYyhhKSxzPXljKG8sYGJvcmRlcmAsYHdpZHRoYCksYz15YyhvLGBwYWRkaW5nYCk7dD1lLndpZHRoLWMud2lkdGgtcy53aWR0aCxuPWUuaGVpZ2h0LWMuaGVpZ2h0LXMuaGVpZ2h0LHI9aGMoby5tYXhXaWR0aCxhLGBjbGllbnRXaWR0aGApLGk9aGMoby5tYXhIZWlnaHQsYSxgY2xpZW50SGVpZ2h0YCl9fXJldHVybnt3aWR0aDp0LGhlaWdodDpuLG1heFdpZHRoOnJ8fF9vLG1heEhlaWdodDppfHxfb319dmFyIHdjPWU9Pk1hdGgucm91bmQoZSoxMCkvMTA7ZnVuY3Rpb24gVGMoZSx0LG4scil7bGV0IGk9Z2MoZSksYT15YyhpLGBtYXJnaW5gKSxvPWhjKGkubWF4V2lkdGgsZSxgY2xpZW50V2lkdGhgKXx8X28scz1oYyhpLm1heEhlaWdodCxlLGBjbGllbnRIZWlnaHRgKXx8X28sYz1DYyhlLHQsbikse3dpZHRoOmwsaGVpZ2h0OnV9PWM7aWYoaS5ib3hTaXppbmc9PT1gY29udGVudC1ib3hgKXtsZXQgZT15YyhpLGBib3JkZXJgLGB3aWR0aGApLHQ9eWMoaSxgcGFkZGluZ2ApO2wtPXQud2lkdGgrZS53aWR0aCx1LT10LmhlaWdodCtlLmhlaWdodH1yZXR1cm4gbD1NYXRoLm1heCgwLGwtYS53aWR0aCksdT1NYXRoLm1heCgwLHI/bC9yOnUtYS5oZWlnaHQpLGw9d2MoTWF0aC5taW4obCxvLGMubWF4V2lkdGgpKSx1PXdjKE1hdGgubWluKHUscyxjLm1heEhlaWdodCkpLGwmJiF1JiYodT13YyhsLzIpKSwodCE9PXZvaWQgMHx8biE9PXZvaWQgMCkmJnImJmMuaGVpZ2h0JiZ1PmMuaGVpZ2h0JiYodT1jLmhlaWdodCxsPXdjKE1hdGguZmxvb3IodSpyKSkpLHt3aWR0aDpsLGhlaWdodDp1fX1mdW5jdGlvbiBFYyhlLHQsbil7bGV0IHI9dHx8MSxpPXdjKGUuaGVpZ2h0KnIpLGE9d2MoZS53aWR0aCpyKTtlLmhlaWdodD13YyhlLmhlaWdodCksZS53aWR0aD13YyhlLndpZHRoKTtsZXQgbz1lLmNhbnZhcztyZXR1cm4gby5zdHlsZSYmKG58fCFvLnN0eWxlLmhlaWdodCYmIW8uc3R5bGUud2lkdGgpJiYoby5zdHlsZS5oZWlnaHQ9YCR7ZS5oZWlnaHR9cHhgLG8uc3R5bGUud2lkdGg9YCR7ZS53aWR0aH1weGApLGUuY3VycmVudERldmljZVBpeGVsUmF0aW8hPT1yfHxvLmhlaWdodCE9PWl8fG8ud2lkdGghPT1hPyhlLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvPXIsby5oZWlnaHQ9aSxvLndpZHRoPWEsZS5jdHguc2V0VHJhbnNmb3JtKHIsMCwwLHIsMCwwKSwhMCk6ITF9dmFyIERjPWZ1bmN0aW9uKCl7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX07cGMoKSYmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpKX1jYXRjaHt9cmV0dXJuIGV9KCk7ZnVuY3Rpb24gT2MoZSx0KXtsZXQgbj1fYyhlLHQpLHI9biYmbi5tYXRjaCgvXihcZCspKFwuXGQrKT9weCQvKTtyZXR1cm4gcj8rclsxXTp2b2lkIDB9dmFyIGtjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3gobil7cmV0dXJuIGUrZSt0LW59LHNldFdpZHRoKGUpe3Q9ZX0sdGV4dEFsaWduKGUpe3JldHVybiBlPT09YGNlbnRlcmA/ZTplPT09YHJpZ2h0YD9gbGVmdGA6YHJpZ2h0YH0seFBsdXMoZSx0KXtyZXR1cm4gZS10fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGUtdH19fSxBYz1mdW5jdGlvbigpe3JldHVybnt4KGUpe3JldHVybiBlfSxzZXRXaWR0aChlKXt9LHRleHRBbGlnbihlKXtyZXR1cm4gZX0seFBsdXMoZSx0KXtyZXR1cm4gZSt0fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGV9fX07ZnVuY3Rpb24gamMoZSx0LG4pe3JldHVybiBlP2tjKHQsbik6QWMoKX1mdW5jdGlvbiBNYyhlLHQpe2xldCBuLHI7KHQ9PT1gbHRyYHx8dD09PWBydGxgKSYmKG49ZS5jYW52YXMuc3R5bGUscj1bbi5nZXRQcm9wZXJ0eVZhbHVlKGBkaXJlY3Rpb25gKSxuLmdldFByb3BlcnR5UHJpb3JpdHkoYGRpcmVjdGlvbmApXSxuLnNldFByb3BlcnR5KGBkaXJlY3Rpb25gLHQsYGltcG9ydGFudGApLGUucHJldlRleHREaXJlY3Rpb249cil9ZnVuY3Rpb24gTmMoZSx0KXt0IT09dm9pZCAwJiYoZGVsZXRlIGUucHJldlRleHREaXJlY3Rpb24sZS5jYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoYGRpcmVjdGlvbmAsdFswXSx0WzFdKSl9ZnVuY3Rpb24gUGMoZSx0LG4pe3JldHVybiBlLm9wdGlvbnMuY2xpcD9lW25dOnRbbl19ZnVuY3Rpb24gRmMoZSx0KXtsZXR7eFNjYWxlOm4seVNjYWxlOnJ9PWU7cmV0dXJuIG4mJnI/e2xlZnQ6UGMobix0LGBsZWZ0YCkscmlnaHQ6UGMobix0LGByaWdodGApLHRvcDpQYyhyLHQsYHRvcGApLGJvdHRvbTpQYyhyLHQsYGJvdHRvbWApfTp0fWZ1bmN0aW9uIEljKGUsdCl7bGV0IG49dC5fY2xpcDtpZihuLmRpc2FibGVkKXJldHVybiExO2xldCByPUZjKHQsZS5jaGFydEFyZWEpO3JldHVybntsZWZ0Om4ubGVmdD09PSExPzA6ci5sZWZ0LShuLmxlZnQ9PT0hMD8wOm4ubGVmdCkscmlnaHQ6bi5yaWdodD09PSExP2Uud2lkdGg6ci5yaWdodCsobi5yaWdodD09PSEwPzA6bi5yaWdodCksdG9wOm4udG9wPT09ITE/MDpyLnRvcC0obi50b3A9PT0hMD8wOm4udG9wKSxib3R0b206bi5ib3R0b209PT0hMT9lLmhlaWdodDpyLmJvdHRvbSsobi5ib3R0b209PT0hMD8wOm4uYm90dG9tKX19dmFyIExjPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9jaGFydHM9bmV3IE1hcCx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX2xhc3REYXRlPXZvaWQgMH1fbm90aWZ5KGUsdCxuLHIpe2xldCBpPXQubGlzdGVuZXJzW3JdLGE9dC5kdXJhdGlvbjtpLmZvckVhY2gocj0+cih7Y2hhcnQ6ZSxpbml0aWFsOnQuaW5pdGlhbCxudW1TdGVwczphLGN1cnJlbnRTdGVwOk1hdGgubWluKG4tdC5zdGFydCxhKX0pKX1fcmVmcmVzaCgpe3RoaXMuX3JlcXVlc3R8fD0odGhpcy5fcnVubmluZz0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3RoaXMuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZWZyZXNoKCl9KSl9X3VwZGF0ZShlPURhdGUubm93KCkpe2xldCB0PTA7dGhpcy5fY2hhcnRzLmZvckVhY2goKG4scik9PntpZighbi5ydW5uaW5nfHwhbi5pdGVtcy5sZW5ndGgpcmV0dXJuO2xldCBpPW4uaXRlbXMsYT1pLmxlbmd0aC0xLG89ITEscztmb3IoO2E+PTA7LS1hKXM9aVthXSxzLl9hY3RpdmU/KHMuX3RvdGFsPm4uZHVyYXRpb24mJihuLmR1cmF0aW9uPXMuX3RvdGFsKSxzLnRpY2soZSksbz0hMCk6KGlbYV09aVtpLmxlbmd0aC0xXSxpLnBvcCgpKTtvJiYoci5kcmF3KCksdGhpcy5fbm90aWZ5KHIsbixlLGBwcm9ncmVzc2ApKSxpLmxlbmd0aHx8KG4ucnVubmluZz0hMSx0aGlzLl9ub3RpZnkocixuLGUsYGNvbXBsZXRlYCksbi5pbml0aWFsPSExKSx0Kz1pLmxlbmd0aH0pLHRoaXMuX2xhc3REYXRlPWUsdD09PTAmJih0aGlzLl9ydW5uaW5nPSExKX1fZ2V0QW5pbXMoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLG49dC5nZXQoZSk7cmV0dXJuIG58fChuPXtydW5uaW5nOiExLGluaXRpYWw6ITAsaXRlbXM6W10sbGlzdGVuZXJzOntjb21wbGV0ZTpbXSxwcm9ncmVzczpbXX19LHQuc2V0KGUsbikpLG59bGlzdGVuKGUsdCxuKXt0aGlzLl9nZXRBbmltcyhlKS5saXN0ZW5lcnNbdF0ucHVzaChuKX1hZGQoZSx0KXshdHx8IXQubGVuZ3RofHx0aGlzLl9nZXRBbmltcyhlKS5pdGVtcy5wdXNoKC4uLnQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fZ2V0QW5pbXMoZSkuaXRlbXMubGVuZ3RoPjB9c3RhcnQoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTt0JiYodC5ydW5uaW5nPSEwLHQuc3RhcnQ9RGF0ZS5ub3coKSx0LmR1cmF0aW9uPXQuaXRlbXMucmVkdWNlKChlLHQpPT5NYXRoLm1heChlLHQuX2R1cmF0aW9uKSwwKSx0aGlzLl9yZWZyZXNoKCkpfXJ1bm5pbmcoZSl7aWYoIXRoaXMuX3J1bm5pbmcpcmV0dXJuITE7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtyZXR1cm4hKCF0fHwhdC5ydW5uaW5nfHwhdC5pdGVtcy5sZW5ndGgpfXN0b3AoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtpZighdHx8IXQuaXRlbXMubGVuZ3RoKXJldHVybjtsZXQgbj10Lml0ZW1zLHI9bi5sZW5ndGgtMTtmb3IoO3I+PTA7LS1yKW5bcl0uY2FuY2VsKCk7dC5pdGVtcz1bXSx0aGlzLl9ub3RpZnkoZSx0LERhdGUubm93KCksYGNvbXBsZXRlYCl9cmVtb3ZlKGUpe3JldHVybiB0aGlzLl9jaGFydHMuZGVsZXRlKGUpfX0sUmM9YHRyYW5zcGFyZW50YCx6Yz17Ym9vbGVhbihlLHQsbil7cmV0dXJuIG4+LjU/dDplfSxjb2xvcihlLHQsbil7bGV0IHI9b3MoZXx8UmMpLGk9ci52YWxpZCYmb3ModHx8UmMpO3JldHVybiBpJiZpLnZhbGlkP2kubWl4KHIsbikuaGV4U3RyaW5nKCk6dH0sbnVtYmVyKGUsdCxuKXtyZXR1cm4gZSsodC1lKSpufX0sQmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7bGV0IGk9dFtuXTtyPUdzKFtlLnRvLHIsaSxlLmZyb21dKTtsZXQgYT1HcyhbZS5mcm9tLGkscl0pO3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9mbj1lLmZufHx6Y1tlLnR5cGV8fHR5cGVvZiBhXSx0aGlzLl9lYXNpbmc9aXNbZS5lYXNpbmddfHxpcy5saW5lYXIsdGhpcy5fc3RhcnQ9TWF0aC5mbG9vcihEYXRlLm5vdygpKyhlLmRlbGF5fHwwKSksdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWw9TWF0aC5mbG9vcihlLmR1cmF0aW9uKSx0aGlzLl9sb29wPSEhZS5sb29wLHRoaXMuX3RhcmdldD10LHRoaXMuX3Byb3A9bix0aGlzLl9mcm9tPWEsdGhpcy5fdG89cix0aGlzLl9wcm9taXNlcz12b2lkIDB9YWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX11cGRhdGUoZSx0LG4pe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fbm90aWZ5KCExKTtsZXQgcj10aGlzLl90YXJnZXRbdGhpcy5fcHJvcF0saT1uLXRoaXMuX3N0YXJ0LGE9dGhpcy5fZHVyYXRpb24taTt0aGlzLl9zdGFydD1uLHRoaXMuX2R1cmF0aW9uPU1hdGguZmxvb3IoTWF0aC5tYXgoYSxlLmR1cmF0aW9uKSksdGhpcy5fdG90YWwrPWksdGhpcy5fbG9vcD0hIWUubG9vcCx0aGlzLl90bz1HcyhbZS50byx0LHIsZS5mcm9tXSksdGhpcy5fZnJvbT1HcyhbZS5mcm9tLHIsdF0pfX1jYW5jZWwoKXt0aGlzLl9hY3RpdmUmJih0aGlzLnRpY2soRGF0ZS5ub3coKSksdGhpcy5fYWN0aXZlPSExLHRoaXMuX25vdGlmeSghMSkpfXRpY2soZSl7bGV0IHQ9ZS10aGlzLl9zdGFydCxuPXRoaXMuX2R1cmF0aW9uLHI9dGhpcy5fcHJvcCxpPXRoaXMuX2Zyb20sYT10aGlzLl9sb29wLG89dGhpcy5fdG8scztpZih0aGlzLl9hY3RpdmU9aSE9PW8mJihhfHx0PG4pLCF0aGlzLl9hY3RpdmUpe3RoaXMuX3RhcmdldFtyXT1vLHRoaXMuX25vdGlmeSghMCk7cmV0dXJufWlmKHQ8MCl7dGhpcy5fdGFyZ2V0W3JdPWk7cmV0dXJufXM9dC9uJTIscz1hJiZzPjE/Mi1zOnMscz10aGlzLl9lYXNpbmcoTWF0aC5taW4oMSxNYXRoLm1heCgwLHMpKSksdGhpcy5fdGFyZ2V0W3JdPXRoaXMuX2ZuKGksbyxzKX13YWl0KCl7bGV0IGU9dGhpcy5fcHJvbWlzZXN8fD1bXTtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntlLnB1c2goe3Jlczp0LHJlajpufSl9KX1fbm90aWZ5KGUpe2xldCB0PWU/YHJlc2A6YHJlamAsbj10aGlzLl9wcm9taXNlc3x8W107Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXVt0XSgpfX0sVmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9jaGFydD1lLHRoaXMuX3Byb3BlcnRpZXM9bmV3IE1hcCx0aGlzLmNvbmZpZ3VyZSh0KX1jb25maWd1cmUoZSl7aWYoIUcoZSkpcmV0dXJuO2xldCB0PU9iamVjdC5rZXlzKFouYW5pbWF0aW9uKSxuPXRoaXMuX3Byb3BlcnRpZXM7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuZm9yRWFjaChyPT57bGV0IGk9ZVtyXTtpZighRyhpKSlyZXR1cm47bGV0IGE9e307Zm9yKGxldCBlIG9mIHQpYVtlXT1pW2VdOyhXKGkucHJvcGVydGllcykmJmkucHJvcGVydGllc3x8W3JdKS5mb3JFYWNoKGU9PnsoZT09PXJ8fCFuLmhhcyhlKSkmJm4uc2V0KGUsYSl9KX0pfV9hbmltYXRlT3B0aW9ucyhlLHQpe2xldCBuPXQub3B0aW9ucyxyPVVjKGUsbik7aWYoIXIpcmV0dXJuW107bGV0IGk9dGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhyLG4pO3JldHVybiBuLiRzaGFyZWQmJkhjKGUub3B0aW9ucy4kYW5pbWF0aW9ucyxuKS50aGVuKCgpPT57ZS5vcHRpb25zPW59LCgpPT57fSksaX1fY3JlYXRlQW5pbWF0aW9ucyhlLHQpe2xldCBuPXRoaXMuX3Byb3BlcnRpZXMscj1bXSxpPWUuJGFuaW1hdGlvbnN8fD17fSxhPU9iamVjdC5rZXlzKHQpLG89RGF0ZS5ub3coKSxzO2ZvcihzPWEubGVuZ3RoLTE7cz49MDstLXMpe2xldCBjPWFbc107aWYoYy5jaGFyQXQoMCk9PT1gJGApY29udGludWU7aWYoYz09PWBvcHRpb25zYCl7ci5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKGUsdCkpO2NvbnRpbnVlfWxldCBsPXRbY10sdT1pW2NdLGQ9bi5nZXQoYyk7aWYodSl7aWYoZCYmdS5hY3RpdmUoKSl7dS51cGRhdGUoZCxsLG8pO2NvbnRpbnVlfXUuY2FuY2VsKCl9aWYoIWR8fCFkLmR1cmF0aW9uKXtlW2NdPWw7Y29udGludWV9aVtjXT11PW5ldyBCYyhkLGUsYyxsKSxyLnB1c2godSl9cmV0dXJuIHJ9dXBkYXRlKGUsdCl7aWYodGhpcy5fcHJvcGVydGllcy5zaXplPT09MCl7T2JqZWN0LmFzc2lnbihlLHQpO3JldHVybn1sZXQgbj10aGlzLl9jcmVhdGVBbmltYXRpb25zKGUsdCk7aWYobi5sZW5ndGgpcmV0dXJuIExjLmFkZCh0aGlzLl9jaGFydCxuKSwhMH19O2Z1bmN0aW9uIEhjKGUsdCl7bGV0IG49W10scj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7bGV0IGk9ZVtyW3RdXTtpJiZpLmFjdGl2ZSgpJiZuLnB1c2goaS53YWl0KCkpfXJldHVybiBQcm9taXNlLmFsbChuKX1mdW5jdGlvbiBVYyhlLHQpe2lmKCF0KXJldHVybjtsZXQgbj1lLm9wdGlvbnM7aWYoIW4pe2Uub3B0aW9ucz10O3JldHVybn1yZXR1cm4gbi4kc2hhcmVkJiYoZS5vcHRpb25zPW49T2JqZWN0LmFzc2lnbih7fSxuLHskc2hhcmVkOiExLCRhbmltYXRpb25zOnt9fSkpLG59ZnVuY3Rpb24gV2MoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnN8fHt9LHI9bi5yZXZlcnNlLGk9bi5taW49PT12b2lkIDA/dDowLGE9bi5tYXg9PT12b2lkIDA/dDowO3JldHVybntzdGFydDpyP2E6aSxlbmQ6cj9pOmF9fWZ1bmN0aW9uIEdjKGUsdCxuKXtpZihuPT09ITEpcmV0dXJuITE7bGV0IHI9V2MoZSxuKSxpPVdjKHQsbik7cmV0dXJue3RvcDppLmVuZCxyaWdodDpyLmVuZCxib3R0b206aS5zdGFydCxsZWZ0OnIuc3RhcnR9fWZ1bmN0aW9uIEtjKGUpe2xldCB0LG4scixpO3JldHVybiBHKGUpPyh0PWUudG9wLG49ZS5yaWdodCxyPWUuYm90dG9tLGk9ZS5sZWZ0KTp0PW49cj1pPWUse3RvcDp0LHJpZ2h0Om4sYm90dG9tOnIsbGVmdDppLGRpc2FibGVkOmU9PT0hMX19ZnVuY3Rpb24gcWMoZSx0KXtsZXQgbj1bXSxyPWUuX2dldFNvcnRlZERhdGFzZXRNZXRhcyh0KSxpLGE7Zm9yKGk9MCxhPXIubGVuZ3RoO2k8YTsrK2kpbi5wdXNoKHJbaV0uaW5kZXgpO3JldHVybiBufWZ1bmN0aW9uIEpjKGUsdCxuLHI9e30pe2xldCBpPWUua2V5cyxhPXIubW9kZT09PWBzaW5nbGVgLG8scyxjLGw7aWYodD09PW51bGwpcmV0dXJuO2xldCB1PSExO2ZvcihvPTAscz1pLmxlbmd0aDtvPHM7KytvKXtpZihjPStpW29dLGM9PT1uKXtpZih1PSEwLHIuYWxsKWNvbnRpbnVlO2JyZWFrfWw9ZS52YWx1ZXNbY10sSyhsKSYmKGF8fHQ9PT0wfHxDbyh0KT09PUNvKGwpKSYmKHQrPWwpfXJldHVybiF1JiYhci5hbGw/MDp0fWZ1bmN0aW9uIFljKGUsdCl7bGV0e2lTY2FsZTpuLHZTY2FsZTpyfT10LGk9bi5heGlzPT09YHhgP2B4YDpgeWAsYT1yLmF4aXM9PT1geGA/YHhgOmB5YCxvPU9iamVjdC5rZXlzKGUpLHM9QXJyYXkoby5sZW5ndGgpLGMsbCx1O2ZvcihjPTAsbD1vLmxlbmd0aDtjPGw7KytjKXU9b1tjXSxzW2NdPXtbaV06dSxbYV06ZVt1XX07cmV0dXJuIHN9ZnVuY3Rpb24gWGMoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnMuc3RhY2tlZDtyZXR1cm4gbnx8bj09PXZvaWQgMCYmdC5zdGFjayE9PXZvaWQgMH1mdW5jdGlvbiBaYyhlLHQsbil7cmV0dXJuYCR7ZS5pZH0uJHt0LmlkfS4ke24uc3RhY2t8fG4udHlwZX1gfWZ1bmN0aW9uIFFjKGUpe2xldHttaW46dCxtYXg6bixtaW5EZWZpbmVkOnIsbWF4RGVmaW5lZDppfT1lLmdldFVzZXJCb3VuZHMoKTtyZXR1cm57bWluOnI/dDotMS8wLG1heDppP246MS8wfX1mdW5jdGlvbiAkYyhlLHQsbil7bGV0IHI9ZVt0XXx8KGVbdF09e30pO3JldHVybiByW25dfHwocltuXT17fSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7Zm9yKGxldCBpIG9mIHQuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMocikucmV2ZXJzZSgpKXtsZXQgdD1lW2kuaW5kZXhdO2lmKG4mJnQ+MHx8IW4mJnQ8MClyZXR1cm4gaS5pbmRleH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0bChlLHQpe2xldHtjaGFydDpuLF9jYWNoZWRNZXRhOnJ9PWUsaT1uLl9zdGFja3N8fD17fSx7aVNjYWxlOmEsdlNjYWxlOm8saW5kZXg6c309cixjPWEuYXhpcyxsPW8uYXhpcyx1PVpjKGEsbyxyKSxkPXQubGVuZ3RoLGY7Zm9yKGxldCBlPTA7ZTxkOysrZSl7bGV0IG49dFtlXSx7W2NdOmEsW2xdOmR9PW4scD1uLl9zdGFja3N8fD17fTtmPXBbbF09JGMoaSx1LGEpLGZbc109ZCxmLl90b3A9ZWwoZixvLCEwLHIudHlwZSksZi5fYm90dG9tPWVsKGYsbywhMSxyLnR5cGUpO2xldCBtPWYuX3Zpc3VhbFZhbHVlc3x8KGYuX3Zpc3VhbFZhbHVlcz17fSk7bVtzXT1kfX1mdW5jdGlvbiBubChlLHQpe2xldCBuPWUuc2NhbGVzO3JldHVybiBPYmplY3Qua2V5cyhuKS5maWx0ZXIoZT0+bltlXS5heGlzPT09dCkuc2hpZnQoKX1mdW5jdGlvbiBybChlLHQpe3JldHVybiBxcyhlLHthY3RpdmU6ITEsZGF0YXNldDp2b2lkIDAsZGF0YXNldEluZGV4OnQsaW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhc2V0YH0pfWZ1bmN0aW9uIGlsKGUsdCxuKXtyZXR1cm4gcXMoZSx7YWN0aXZlOiExLGRhdGFJbmRleDp0LHBhcnNlZDp2b2lkIDAscmF3OnZvaWQgMCxlbGVtZW50Om4saW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhYH0pfWZ1bmN0aW9uIGFsKGUsdCl7bGV0IG49ZS5jb250cm9sbGVyLmluZGV4LHI9ZS52U2NhbGUmJmUudlNjYWxlLmF4aXM7aWYocil7dHx8PWUuX3BhcnNlZDtmb3IobGV0IGUgb2YgdCl7bGV0IHQ9ZS5fc3RhY2tzO2lmKCF0fHx0W3JdPT09dm9pZCAwfHx0W3JdW25dPT09dm9pZCAwKXJldHVybjtkZWxldGUgdFtyXVtuXSx0W3JdLl92aXN1YWxWYWx1ZXMhPT12b2lkIDAmJnRbcl0uX3Zpc3VhbFZhbHVlc1tuXSE9PXZvaWQgMCYmZGVsZXRlIHRbcl0uX3Zpc3VhbFZhbHVlc1tuXX19fXZhciBvbD1lPT5lPT09YHJlc2V0YHx8ZT09PWBub25lYCxzbD0oZSx0KT0+dD9lOk9iamVjdC5hc3NpZ24oe30sZSksY2w9KGUsdCxuKT0+ZSYmIXQuaGlkZGVuJiZ0Ll9zdGFja2VkJiZ7a2V5czpxYyhuLCEwKSx2YWx1ZXM6bnVsbH0sbGw9Y2xhc3N7c3RhdGljIGRlZmF1bHRzPXt9O3N0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGU9bnVsbDtzdGF0aWMgZGF0YUVsZW1lbnRUeXBlPW51bGw7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoYXJ0PWUsdGhpcy5fY3R4PWUuY3R4LHRoaXMuaW5kZXg9dCx0aGlzLl9jYWNoZWREYXRhT3B0cz17fSx0aGlzLl9jYWNoZWRNZXRhPXRoaXMuZ2V0TWV0YSgpLHRoaXMuX3R5cGU9dGhpcy5fY2FjaGVkTWV0YS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5fcGFyc2luZz0hMSx0aGlzLl9kYXRhPXZvaWQgMCx0aGlzLl9vYmplY3REYXRhPXZvaWQgMCx0aGlzLl9zaGFyZWRPcHRpb25zPXZvaWQgMCx0aGlzLl9kcmF3U3RhcnQ9dm9pZCAwLHRoaXMuX2RyYXdDb3VudD12b2lkIDAsdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSExLHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlLHRoaXMuZGF0YUVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlLHRoaXMuaW5pdGlhbGl6ZSgpfWluaXRpYWxpemUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuY29uZmlndXJlKCksdGhpcy5saW5rU2NhbGVzKCksZS5fc3RhY2tlZD1YYyhlLnZTY2FsZSxlKSx0aGlzLmFkZEVsZW1lbnRzKCksdGhpcy5vcHRpb25zLmZpbGwmJiF0aGlzLmNoYXJ0LmlzUGx1Z2luRW5hYmxlZChgZmlsbGVyYCkmJmNvbnNvbGUud2FybihgVHJpZWQgdG8gdXNlIHRoZSAnZmlsbCcgb3B0aW9uIHdpdGhvdXQgdGhlICdGaWxsZXInIHBsdWdpbiBlbmFibGVkLiBQbGVhc2UgaW1wb3J0IGFuZCByZWdpc3RlciB0aGUgJ0ZpbGxlcicgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGRpc2FibGVkIGluIHRoZSBvcHRpb25zYCl9dXBkYXRlSW5kZXgoZSl7dGhpcy5pbmRleCE9PWUmJmFsKHRoaXMuX2NhY2hlZE1ldGEpLHRoaXMuaW5kZXg9ZX1saW5rU2NhbGVzKCl7bGV0IGU9dGhpcy5jaGFydCx0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPShlLHQsbixyKT0+ZT09PWB4YD90OmU9PT1gcmA/cjpuLGk9dC54QXhpc0lEPXEobi54QXhpc0lELG5sKGUsYHhgKSksYT10LnlBeGlzSUQ9cShuLnlBeGlzSUQsbmwoZSxgeWApKSxvPXQuckF4aXNJRD1xKG4uckF4aXNJRCxubChlLGByYCkpLHM9dC5pbmRleEF4aXMsYz10LmlBeGlzSUQ9cihzLGksYSxvKSxsPXQudkF4aXNJRD1yKHMsYSxpLG8pO3QueFNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChpKSx0LnlTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQoYSksdC5yU2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKG8pLHQuaVNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChjKSx0LnZTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQobCl9Z2V0RGF0YXNldCgpe3JldHVybiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbdGhpcy5pbmRleF19Z2V0TWV0YSgpe3JldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpfWdldFNjYWxlRm9ySWQoZSl7cmV0dXJuIHRoaXMuY2hhcnQuc2NhbGVzW2VdfV9nZXRPdGhlclNjYWxlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7cmV0dXJuIGU9PT10LmlTY2FsZT90LnZTY2FsZTp0LmlTY2FsZX1yZXNldCgpe3RoaXMuX3VwZGF0ZShgcmVzZXRgKX1fZGVzdHJveSgpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5fZGF0YSYmcW8odGhpcy5fZGF0YSx0aGlzKSxlLl9zdGFja2VkJiZhbChlKX1fZGF0YUNoZWNrKCl7bGV0IGU9dGhpcy5nZXREYXRhc2V0KCksdD1lLmRhdGF8fD1bXSxuPXRoaXMuX2RhdGE7aWYoRyh0KSl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLl9kYXRhPVljKHQsZSl9ZWxzZSBpZihuIT09dCl7aWYobil7cW8obix0aGlzKTtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO2FsKGUpLGUuX3BhcnNlZD1bXX10JiZPYmplY3QuaXNFeHRlbnNpYmxlKHQpJiZLbyh0LHRoaXMpLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuX2RhdGE9dH19YWRkRWxlbWVudHMoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuX2RhdGFDaGVjaygpLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlJiYoZS5kYXRhc2V0PW5ldyB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSl9YnVpbGRPclVwZGF0ZUVsZW1lbnRzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPSExO3RoaXMuX2RhdGFDaGVjaygpO2xldCBpPXQuX3N0YWNrZWQ7dC5fc3RhY2tlZD1YYyh0LnZTY2FsZSx0KSx0LnN0YWNrIT09bi5zdGFjayYmKHI9ITAsYWwodCksdC5zdGFjaz1uLnN0YWNrKSx0aGlzLl9yZXN5bmNFbGVtZW50cyhlKSwocnx8aSE9PXQuX3N0YWNrZWQpJiYodGwodGhpcyx0Ll9wYXJzZWQpLHQuX3N0YWNrZWQ9WGModC52U2NhbGUsdCkpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMuY2hhcnQuY29uZmlnLHQ9ZS5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpLG49ZS5nZXRPcHRpb25TY29wZXModGhpcy5nZXREYXRhc2V0KCksdCwhMCk7dGhpcy5vcHRpb25zPWUuY3JlYXRlUmVzb2x2ZXIobix0aGlzLmdldENvbnRleHQoKSksdGhpcy5fcGFyc2luZz10aGlzLm9wdGlvbnMucGFyc2luZyx0aGlzLl9jYWNoZWREYXRhT3B0cz17fX1wYXJzZShlLHQpe2xldHtfY2FjaGVkTWV0YTpuLF9kYXRhOnJ9PXRoaXMse2lTY2FsZTppLF9zdGFja2VkOmF9PW4sbz1pLmF4aXMscz1lPT09MCYmdD09PXIubGVuZ3RofHxuLl9zb3J0ZWQsYz1lPjAmJm4uX3BhcnNlZFtlLTFdLGwsdSxkO2lmKHRoaXMuX3BhcnNpbmc9PT0hMSluLl9wYXJzZWQ9cixuLl9zb3J0ZWQ9ITAsZD1yO2Vsc2V7ZD1XKHJbZV0pP3RoaXMucGFyc2VBcnJheURhdGEobixyLGUsdCk6RyhyW2VdKT90aGlzLnBhcnNlT2JqZWN0RGF0YShuLHIsZSx0KTp0aGlzLnBhcnNlUHJpbWl0aXZlRGF0YShuLHIsZSx0KTtsZXQgaT0oKT0+dVtvXT09PW51bGx8fGMmJnVbb108Y1tvXTtmb3IobD0wO2w8dDsrK2wpbi5fcGFyc2VkW2wrZV09dT1kW2xdLHMmJihpKCkmJihzPSExKSxjPXUpO24uX3NvcnRlZD1zfWEmJnRsKHRoaXMsZCl9cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSxvPWkuYXhpcyxzPWEuYXhpcyxjPWkuZ2V0TGFiZWxzKCksbD1pPT09YSx1PUFycmF5KHIpLGQsZixwO2ZvcihkPTAsZj1yO2Q8ZjsrK2QpcD1kK24sdVtkXT17W29dOmx8fGkucGFyc2UoY1twXSxwKSxbc106YS5wYXJzZSh0W3BdLHApfTtyZXR1cm4gdX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtsZXR7eFNjYWxlOmkseVNjYWxlOmF9PWUsbz1BcnJheShyKSxzLGMsbCx1O2ZvcihzPTAsYz1yO3M8YzsrK3MpbD1zK24sdT10W2xdLG9bc109e3g6aS5wYXJzZSh1WzBdLGwpLHk6YS5wYXJzZSh1WzFdLGwpfTtyZXR1cm4gb31wYXJzZU9iamVjdERhdGEoZSx0LG4scil7bGV0e3hTY2FsZTppLHlTY2FsZTphfT1lLHt4QXhpc0tleTpvPWB4YCx5QXhpc0tleTpzPWB5YH09dGhpcy5fcGFyc2luZyxjPUFycmF5KHIpLGwsdSxkLGY7Zm9yKGw9MCx1PXI7bDx1OysrbClkPWwrbixmPXRbZF0sY1tsXT17eDppLnBhcnNlKGxvKGYsbyksZCkseTphLnBhcnNlKGxvKGYscyksZCl9O3JldHVybiBjfWdldFBhcnNlZChlKXtyZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2VdfWdldERhdGFFbGVtZW50KGUpe3JldHVybiB0aGlzLl9jYWNoZWRNZXRhLmRhdGFbZV19YXBwbHlTdGFjayhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZE1ldGEsYT10W2UuYXhpc107cmV0dXJuIEpjKHtrZXlzOnFjKHIsITApLHZhbHVlczp0Ll9zdGFja3NbZS5heGlzXS5fdmlzdWFsVmFsdWVzfSxhLGkuaW5kZXgse21vZGU6bn0pfXVwZGF0ZVJhbmdlRnJvbVBhcnNlZChlLHQsbixyKXtsZXQgaT1uW3QuYXhpc10sYT1pPT09bnVsbD9OYU46aSxvPXImJm4uX3N0YWNrc1t0LmF4aXNdO3ImJm8mJihyLnZhbHVlcz1vLGE9SmMocixpLHRoaXMuX2NhY2hlZE1ldGEuaW5kZXgpKSxlLm1pbj1NYXRoLm1pbihlLm1pbixhKSxlLm1heD1NYXRoLm1heChlLm1heCxhKX1nZXRNaW5NYXgoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5fcGFyc2VkLGk9bi5fc29ydGVkJiZlPT09bi5pU2NhbGUsYT1yLmxlbmd0aCxvPXRoaXMuX2dldE90aGVyU2NhbGUoZSkscz1jbCh0LG4sdGhpcy5jaGFydCksYz17bWluOjEvMCxtYXg6LTEvMH0se21pbjpsLG1heDp1fT1RYyhvKSxkLGY7ZnVuY3Rpb24gcCgpe2Y9cltkXTtsZXQgdD1mW28uYXhpc107cmV0dXJuIUsoZltlLmF4aXNdKXx8bD50fHx1PHR9Zm9yKGQ9MDtkPGEmJiEoIXAoKSYmKHRoaXMudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGMsZSxmLHMpLGkpKTsrK2QpO2lmKGkpe2ZvcihkPWEtMTtkPj0wOy0tZClpZighcCgpKXt0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChjLGUsZixzKTticmVha319cmV0dXJuIGN9Z2V0QWxsUGFyc2VkVmFsdWVzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuX3BhcnNlZCxuPVtdLHIsaSxhO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWE9dFtyXVtlLmF4aXNdLEsoYSkmJm4ucHVzaChhKTtyZXR1cm4gbn1nZXRNYXhPdmVyZmxvdygpe3JldHVybiExfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0IHQ9dGhpcy5fY2FjaGVkTWV0YSxuPXQuaVNjYWxlLHI9dC52U2NhbGUsaT10aGlzLmdldFBhcnNlZChlKTtyZXR1cm57bGFiZWw6bj9gYCtuLmdldExhYmVsRm9yVmFsdWUoaVtuLmF4aXNdKTpgYCx2YWx1ZTpyP2BgK3IuZ2V0TGFiZWxGb3JWYWx1ZShpW3IuYXhpc10pOmBgfX1fdXBkYXRlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy51cGRhdGUoZXx8YGRlZmF1bHRgKSx0Ll9jbGlwPUtjKHEodGhpcy5vcHRpb25zLmNsaXAsR2ModC54U2NhbGUsdC55U2NhbGUsdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpfXVwZGF0ZShlKXt9ZHJhdygpe2xldCBlPXRoaXMuX2N0eCx0PXRoaXMuY2hhcnQsbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5kYXRhfHxbXSxpPXQuY2hhcnRBcmVhLGE9W10sbz10aGlzLl9kcmF3U3RhcnR8fDAscz10aGlzLl9kcmF3Q291bnR8fHIubGVuZ3RoLW8sYz10aGlzLm9wdGlvbnMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AsbDtmb3Iobi5kYXRhc2V0JiZuLmRhdGFzZXQuZHJhdyhlLGksbyxzKSxsPW87bDxvK3M7KytsKXtsZXQgdD1yW2xdO3QuaGlkZGVufHwodC5hY3RpdmUmJmM/YS5wdXNoKHQpOnQuZHJhdyhlLGkpKX1mb3IobD0wO2w8YS5sZW5ndGg7KytsKWFbbF0uZHJhdyhlLGkpfWdldFN0eWxlKGUsdCl7bGV0IG49dD9gYWN0aXZlYDpgZGVmYXVsdGA7cmV0dXJuIGU9PT12b2lkIDAmJnRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldD90aGlzLnJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMobik6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGV8fDAsbil9Z2V0Q29udGV4dChlLHQsbil7bGV0IHI9dGhpcy5nZXREYXRhc2V0KCksaTtpZihlPj0wJiZlPHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGgpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YVtlXTtpPXQuJGNvbnRleHR8fD1pbCh0aGlzLmdldENvbnRleHQoKSxlLHQpLGkucGFyc2VkPXRoaXMuZ2V0UGFyc2VkKGUpLGkucmF3PXIuZGF0YVtlXSxpLmluZGV4PWkuZGF0YUluZGV4PWV9ZWxzZSBpPXRoaXMuJGNvbnRleHR8fD1ybCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLmluZGV4KSxpLmRhdGFzZXQ9cixpLmluZGV4PWkuZGF0YXNldEluZGV4PXRoaXMuaW5kZXg7cmV0dXJuIGkuYWN0aXZlPSEhdCxpLm1vZGU9bixpfXJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCxlKX1yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGUsdCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCx0LGUpfV9yZXNvbHZlRWxlbWVudE9wdGlvbnMoZSx0PWBkZWZhdWx0YCxuKXtsZXQgcj10PT09YGFjdGl2ZWAsaT10aGlzLl9jYWNoZWREYXRhT3B0cyxhPWUrYC1gK3Qsbz1pW2FdLHM9dGhpcy5lbmFibGVPcHRpb25TaGFyaW5nJiZmbyhuKTtpZihvKXJldHVybiBzbChvLHMpO2xldCBjPXRoaXMuY2hhcnQuY29uZmlnLGw9Yy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLGUpLHU9cj9bYCR7ZX1Ib3ZlcmAsYGhvdmVyYCxlLGBgXTpbZSxgYF0sZD1jLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxsKSxmPU9iamVjdC5rZXlzKFouZWxlbWVudHNbZV0pLHA9Yy5yZXNvbHZlTmFtZWRPcHRpb25zKGQsZiwoKT0+dGhpcy5nZXRDb250ZXh0KG4scix0KSx1KTtyZXR1cm4gcC4kc2hhcmVkJiYocC4kc2hhcmVkPXMsaVthXT1PYmplY3QuZnJlZXplKHNsKHAscykpKSxwfV9yZXNvbHZlQW5pbWF0aW9ucyhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZERhdGFPcHRzLGE9YGFuaW1hdGlvbi0ke3R9YCxvPWlbYV07aWYobylyZXR1cm4gbztsZXQgcztpZihyLm9wdGlvbnMuYW5pbWF0aW9uIT09ITEpe2xldCByPXRoaXMuY2hhcnQuY29uZmlnLGk9ci5kYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKHRoaXMuX3R5cGUsdCksYT1yLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxpKTtzPXIuY3JlYXRlUmVzb2x2ZXIoYSx0aGlzLmdldENvbnRleHQoZSxuLHQpKX1sZXQgYz1uZXcgVmMocixzJiZzLmFuaW1hdGlvbnMpO3JldHVybiBzJiZzLl9jYWNoZWFibGUmJihpW2FdPU9iamVjdC5mcmVlemUoYykpLGN9Z2V0U2hhcmVkT3B0aW9ucyhlKXtpZihlLiRzaGFyZWQpcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnN8fD1PYmplY3QuYXNzaWduKHt9LGUpfWluY2x1ZGVPcHRpb25zKGUsdCl7cmV0dXJuIXR8fG9sKGUpfHx0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWR9X2dldFNoYXJlZE9wdGlvbnMoZSx0KXtsZXQgbj10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZSx0KSxyPXRoaXMuX3NoYXJlZE9wdGlvbnMsaT10aGlzLmdldFNoYXJlZE9wdGlvbnMobiksYT10aGlzLmluY2x1ZGVPcHRpb25zKHQsaSl8fGkhPT1yO3JldHVybiB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoaSx0LG4pLHtzaGFyZWRPcHRpb25zOmksaW5jbHVkZU9wdGlvbnM6YX19dXBkYXRlRWxlbWVudChlLHQsbixyKXtvbChyKT9PYmplY3QuYXNzaWduKGUsbik6dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxyKS51cGRhdGUoZSxuKX11cGRhdGVTaGFyZWRPcHRpb25zKGUsdCxuKXtlJiYhb2wodCkmJnRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCx0KS51cGRhdGUoZSxuKX1fc2V0U3R5bGUoZSx0LG4scil7ZS5hY3RpdmU9cjtsZXQgaT10aGlzLmdldFN0eWxlKHQscik7dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxuLHIpLnVwZGF0ZShlLHtvcHRpb25zOiFyJiZ0aGlzLmdldFNoYXJlZE9wdGlvbnMoaSl8fGl9KX1yZW1vdmVIb3ZlclN0eWxlKGUsdCxuKXt0aGlzLl9zZXRTdHlsZShlLG4sYGFjdGl2ZWAsITEpfXNldEhvdmVyU3R5bGUoZSx0LG4pe3RoaXMuX3NldFN0eWxlKGUsbixgYWN0aXZlYCwhMCl9X3JlbW92ZURhdGFzZXRIb3ZlclN0eWxlKCl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O2UmJnRoaXMuX3NldFN0eWxlKGUsdm9pZCAwLGBhY3RpdmVgLCExKX1fc2V0RGF0YXNldEhvdmVyU3R5bGUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7ZSYmdGhpcy5fc2V0U3R5bGUoZSx2b2lkIDAsYGFjdGl2ZWAsITApfV9yZXN5bmNFbGVtZW50cyhlKXtsZXQgdD10aGlzLl9kYXRhLG49dGhpcy5fY2FjaGVkTWV0YS5kYXRhO2ZvcihsZXRbZSx0LG5db2YgdGhpcy5fc3luY0xpc3QpdGhpc1tlXSh0LG4pO3RoaXMuX3N5bmNMaXN0PVtdO2xldCByPW4ubGVuZ3RoLGk9dC5sZW5ndGgsYT1NYXRoLm1pbihpLHIpO2EmJnRoaXMucGFyc2UoMCxhKSxpPnI/dGhpcy5faW5zZXJ0RWxlbWVudHMocixpLXIsZSk6aTxyJiZ0aGlzLl9yZW1vdmVFbGVtZW50cyhpLHItaSl9X2luc2VydEVsZW1lbnRzKGUsdCxuPSEwKXtsZXQgcj10aGlzLl9jYWNoZWRNZXRhLGk9ci5kYXRhLGE9ZSt0LG8scz1lPT57Zm9yKGUubGVuZ3RoKz10LG89ZS5sZW5ndGgtMTtvPj1hO28tLSllW29dPWVbby10XX07Zm9yKHMoaSksbz1lO288YTsrK28paVtvXT1uZXcgdGhpcy5kYXRhRWxlbWVudFR5cGU7dGhpcy5fcGFyc2luZyYmcyhyLl9wYXJzZWQpLHRoaXMucGFyc2UoZSx0KSxuJiZ0aGlzLnVwZGF0ZUVsZW1lbnRzKGksZSx0LGByZXNldGApfXVwZGF0ZUVsZW1lbnRzKGUsdCxuLHIpe31fcmVtb3ZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhO2lmKHRoaXMuX3BhcnNpbmcpe2xldCByPW4uX3BhcnNlZC5zcGxpY2UoZSx0KTtuLl9zdGFja2VkJiZhbChuLHIpfW4uZGF0YS5zcGxpY2UoZSx0KX1fc3luYyhlKXtpZih0aGlzLl9wYXJzaW5nKXRoaXMuX3N5bmNMaXN0LnB1c2goZSk7ZWxzZXtsZXRbdCxuLHJdPWU7dGhpc1t0XShuLHIpfXRoaXMuY2hhcnQuX2RhdGFDaGFuZ2VzLnB1c2goW3RoaXMuaW5kZXgsLi4uZV0pfV9vbkRhdGFQdXNoKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aDt0aGlzLl9zeW5jKFtgX2luc2VydEVsZW1lbnRzYCx0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aC1lLGVdKX1fb25EYXRhUG9wKCl7dGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aC0xLDFdKX1fb25EYXRhU2hpZnQoKXt0aGlzLl9zeW5jKFtgX3JlbW92ZUVsZW1lbnRzYCwwLDFdKX1fb25EYXRhU3BsaWNlKGUsdCl7dCYmdGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsZSx0XSk7bGV0IG49YXJndW1lbnRzLmxlbmd0aC0yO24mJnRoaXMuX3N5bmMoW2BfaW5zZXJ0RWxlbWVudHNgLGUsbl0pfV9vbkRhdGFVbnNoaWZ0KCl7dGhpcy5fc3luYyhbYF9pbnNlcnRFbGVtZW50c2AsMCxhcmd1bWVudHMubGVuZ3RoXSl9fTtmdW5jdGlvbiB1bChlLHQpe2lmKCFlLl9jYWNoZS4kYmFyKXtsZXQgbj1lLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHQpLHI9W107Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKXI9ci5jb25jYXQoblt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhlKSk7ZS5fY2FjaGUuJGJhcj1KbyhyLnNvcnQoKGUsdCk9PmUtdCkpfXJldHVybiBlLl9jYWNoZS4kYmFyfWZ1bmN0aW9uIGRsKGUpe2xldCB0PWUuaVNjYWxlLG49dWwodCxlLnR5cGUpLHI9dC5fbGVuZ3RoLGksYSxvLHMsYz0oKT0+e28hPT0zMjc2NyYmbyE9PS0zMjc2OCYmKGZvKHMpJiYocj1NYXRoLm1pbihyLE1hdGguYWJzKG8tcyl8fHIpKSxzPW8pfTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhOysraSlvPXQuZ2V0UGl4ZWxGb3JWYWx1ZShuW2ldKSxjKCk7Zm9yKHM9dm9pZCAwLGk9MCxhPXQudGlja3MubGVuZ3RoO2k8YTsrK2kpbz10LmdldFBpeGVsRm9yVGljayhpKSxjKCk7cmV0dXJuIHJ9ZnVuY3Rpb24gZmwoZSx0LG4scil7bGV0IGk9bi5iYXJUaGlja25lc3MsYSxvO3JldHVybiBVKGkpPyhhPXQubWluKm4uY2F0ZWdvcnlQZXJjZW50YWdlLG89bi5iYXJQZXJjZW50YWdlKTooYT1pKnIsbz0xKSx7Y2h1bms6YS9yLHJhdGlvOm8sc3RhcnQ6dC5waXhlbHNbZV0tYS8yfX1mdW5jdGlvbiBwbChlLHQsbixyKXtsZXQgaT10LnBpeGVscyxhPWlbZV0sbz1lPjA/aVtlLTFdOm51bGwscz1lPGkubGVuZ3RoLTE/aVtlKzFdOm51bGwsYz1uLmNhdGVnb3J5UGVyY2VudGFnZTtvPT09bnVsbCYmKG89YS0ocz09PW51bGw/dC5lbmQtdC5zdGFydDpzLWEpKSxzPT09bnVsbCYmKHM9YSthLW8pO2xldCBsPWEtKGEtTWF0aC5taW4obyxzKSkvMipjO3JldHVybntjaHVuazpNYXRoLmFicyhzLW8pLzIqYy9yLHJhdGlvOm4uYmFyUGVyY2VudGFnZSxzdGFydDpsfX1mdW5jdGlvbiBtbChlLHQsbixyKXtsZXQgaT1uLnBhcnNlKGVbMF0sciksYT1uLnBhcnNlKGVbMV0sciksbz1NYXRoLm1pbihpLGEpLHM9TWF0aC5tYXgoaSxhKSxjPW8sbD1zO01hdGguYWJzKG8pPk1hdGguYWJzKHMpJiYoYz1zLGw9byksdFtuLmF4aXNdPWwsdC5fY3VzdG9tPXtiYXJTdGFydDpjLGJhckVuZDpsLHN0YXJ0OmksZW5kOmEsbWluOm8sbWF4OnN9fWZ1bmN0aW9uIGhsKGUsdCxuLHIpe3JldHVybiBXKGUpP21sKGUsdCxuLHIpOnRbbi5heGlzXT1uLnBhcnNlKGUsciksdH1mdW5jdGlvbiBnbChlLHQsbixyKXtsZXQgaT1lLmlTY2FsZSxhPWUudlNjYWxlLG89aS5nZXRMYWJlbHMoKSxzPWk9PT1hLGM9W10sbCx1LGQsZjtmb3IobD1uLHU9bityO2w8dTsrK2wpZj10W2xdLGQ9e30sZFtpLmF4aXNdPXN8fGkucGFyc2Uob1tsXSxsKSxjLnB1c2goaGwoZixkLGEsbCkpO3JldHVybiBjfWZ1bmN0aW9uIF9sKGUpe3JldHVybiBlJiZlLmJhclN0YXJ0IT09dm9pZCAwJiZlLmJhckVuZCE9PXZvaWQgMH1mdW5jdGlvbiB2bChlLHQsbil7cmV0dXJuIGU9PT0wPyh0LmlzSG9yaXpvbnRhbCgpPzE6LTEpKih0Lm1pbj49bj8xOi0xKTpDbyhlKX1mdW5jdGlvbiB5bChlKXtsZXQgdCxuLHIsaSxhO3JldHVybiBlLmhvcml6b250YWw/KHQ9ZS5iYXNlPmUueCxuPWBsZWZ0YCxyPWByaWdodGApOih0PWUuYmFzZTxlLnksbj1gYm90dG9tYCxyPWB0b3BgKSx0PyhpPWBlbmRgLGE9YHN0YXJ0YCk6KGk9YHN0YXJ0YCxhPWBlbmRgKSx7c3RhcnQ6bixlbmQ6cixyZXZlcnNlOnQsdG9wOmksYm90dG9tOmF9fWZ1bmN0aW9uIGJsKGUsdCxuLHIpe2xldCBpPXQuYm9yZGVyU2tpcHBlZCxhPXt9O2lmKCFpKXtlLmJvcmRlclNraXBwZWQ9YTtyZXR1cm59aWYoaT09PSEwKXtlLmJvcmRlclNraXBwZWQ9e3RvcDohMCxyaWdodDohMCxib3R0b206ITAsbGVmdDohMH07cmV0dXJufWxldHtzdGFydDpvLGVuZDpzLHJldmVyc2U6Yyx0b3A6bCxib3R0b206dX09eWwoZSk7aT09PWBtaWRkbGVgJiZuJiYoZS5lbmFibGVCb3JkZXJSYWRpdXM9ITAsKG4uX3RvcHx8MCk9PT1yP2k9bDoobi5fYm90dG9tfHwwKT09PXI/aT11OihhW3hsKHUsbyxzLGMpXT0hMCxpPWwpKSxhW3hsKGksbyxzLGMpXT0hMCxlLmJvcmRlclNraXBwZWQ9YX1mdW5jdGlvbiB4bChlLHQsbixyKXtyZXR1cm4gcj8oZT1TbChlLHQsbiksZT1DbChlLG4sdCkpOmU9Q2woZSx0LG4pLGV9ZnVuY3Rpb24gU2woZSx0LG4pe3JldHVybiBlPT09dD9uOmU9PT1uP3Q6ZX1mdW5jdGlvbiBDbChlLHQsbil7cmV0dXJuIGU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246ZX1mdW5jdGlvbiB3bChlLHtpbmZsYXRlQW1vdW50OnR9LG4pe2UuaW5mbGF0ZUFtb3VudD10PT09YGF1dG9gP249PT0xPy4zMzowOnR9dmFyIFRsPWNsYXNzIGV4dGVuZHMgbGx7c3RhdGljIGlkPWBiYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiExLGRhdGFFbGVtZW50VHlwZTpgYmFyYCxjYXRlZ29yeVBlcmNlbnRhZ2U6LjgsYmFyUGVyY2VudGFnZTouOSxncm91cGVkOiEwLGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgYmFzZWAsYHdpZHRoYCxgaGVpZ2h0YF19fX07c3RhdGljIG92ZXJyaWRlcz17c2NhbGVzOntfaW5kZXhfOnt0eXBlOmBjYXRlZ29yeWAsb2Zmc2V0OiEwLGdyaWQ6e29mZnNldDohMH19LF92YWx1ZV86e3R5cGU6YGxpbmVhcmAsYmVnaW5BdFplcm86ITB9fX07cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe3JldHVybiBnbChlLHQsbixyKX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtyZXR1cm4gZ2woZSx0LG4scil9cGFyc2VPYmplY3REYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSx7eEF4aXNLZXk6bz1geGAseUF4aXNLZXk6cz1geWB9PXRoaXMuX3BhcnNpbmcsYz1pLmF4aXM9PT1geGA/bzpzLGw9YS5heGlzPT09YHhgP286cyx1PVtdLGQsZixwLG07Zm9yKGQ9bixmPW4rcjtkPGY7KytkKW09dFtkXSxwPXt9LHBbaS5heGlzXT1pLnBhcnNlKGxvKG0sYyksZCksdS5wdXNoKGhsKGxvKG0sbCkscCxhLGQpKTtyZXR1cm4gdX11cGRhdGVSYW5nZUZyb21QYXJzZWQoZSx0LG4scil7c3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGUsdCxuLHIpO2xldCBpPW4uX2N1c3RvbTtpJiZ0PT09dGhpcy5fY2FjaGVkTWV0YS52U2NhbGUmJihlLm1pbj1NYXRoLm1pbihlLm1pbixpLm1pbiksZS5tYXg9TWF0aC5tYXgoZS5tYXgsaS5tYXgpKX1nZXRNYXhPdmVyZmxvdygpe3JldHVybiAwfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0e2lTY2FsZTp0LHZTY2FsZTpufT10aGlzLl9jYWNoZWRNZXRhLHI9dGhpcy5nZXRQYXJzZWQoZSksaT1yLl9jdXN0b20sYT1fbChpKT9gW2AraS5zdGFydCtgLCBgK2kuZW5kK2BdYDpgYCtuLmdldExhYmVsRm9yVmFsdWUocltuLmF4aXNdKTtyZXR1cm57bGFiZWw6YGArdC5nZXRMYWJlbEZvclZhbHVlKHJbdC5heGlzXSksdmFsdWU6YX19aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCk7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTtlLnN0YWNrPXRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrfXVwZGF0ZShlKXtsZXQgdD10aGlzLl9jYWNoZWRNZXRhO3RoaXMudXBkYXRlRWxlbWVudHModC5kYXRhLDAsdC5kYXRhLmxlbmd0aCxlKX11cGRhdGVFbGVtZW50cyhlLHQsbixyKXtsZXQgaT1yPT09YHJlc2V0YCx7aW5kZXg6YSxfY2FjaGVkTWV0YTp7dlNjYWxlOm99fT10aGlzLHM9by5nZXRCYXNlUGl4ZWwoKSxjPW8uaXNIb3Jpem9udGFsKCksbD10aGlzLl9nZXRSdWxlcigpLHtzaGFyZWRPcHRpb25zOnUsaW5jbHVkZU9wdGlvbnM6ZH09dGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyh0LHIpO2ZvcihsZXQgZj10O2Y8dCtuO2YrKyl7bGV0IHQ9dGhpcy5nZXRQYXJzZWQoZiksbj1pfHxVKHRbby5heGlzXSk/e2Jhc2U6cyxoZWFkOnN9OnRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGYpLHA9dGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoZixsKSxtPSh0Ll9zdGFja3N8fHt9KVtvLmF4aXNdLGg9e2hvcml6b250YWw6YyxiYXNlOm4uYmFzZSxlbmFibGVCb3JkZXJSYWRpdXM6IW18fF9sKHQuX2N1c3RvbSl8fGE9PT1tLl90b3B8fGE9PT1tLl9ib3R0b20seDpjP24uaGVhZDpwLmNlbnRlcix5OmM/cC5jZW50ZXI6bi5oZWFkLGhlaWdodDpjP3Auc2l6ZTpNYXRoLmFicyhuLnNpemUpLHdpZHRoOmM/TWF0aC5hYnMobi5zaXplKTpwLnNpemV9O2QmJihoLm9wdGlvbnM9dXx8dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGYsZVtmXS5hY3RpdmU/YGFjdGl2ZWA6cikpO2xldCBnPWgub3B0aW9uc3x8ZVtmXS5vcHRpb25zO2JsKGgsZyxtLGEpLHdsKGgsZyxsLnJhdGlvKSx0aGlzLnVwZGF0ZUVsZW1lbnQoZVtmXSxmLGgscil9fV9nZXRTdGFja3MoZSx0KXtsZXR7aVNjYWxlOm59PXRoaXMuX2NhY2hlZE1ldGEscj1uLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHRoaXMuX3R5cGUpLmZpbHRlcihlPT5lLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKSxpPW4ub3B0aW9ucy5zdGFja2VkLGE9W10sbz10aGlzLl9jYWNoZWRNZXRhLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKHQpLHM9byYmb1tuLmF4aXNdLGM9ZT0+e2xldCB0PWUuX3BhcnNlZC5maW5kKGU9PmVbbi5heGlzXT09PXMpLHI9dCYmdFtlLnZTY2FsZS5heGlzXTtpZihVKHIpfHxpc05hTihyKSlyZXR1cm4hMH07Zm9yKGxldCBuIG9mIHIpaWYoISh0IT09dm9pZCAwJiZjKG4pKSYmKChpPT09ITF8fGEuaW5kZXhPZihuLnN0YWNrKT09PS0xfHxpPT09dm9pZCAwJiZuLnN0YWNrPT09dm9pZCAwKSYmYS5wdXNoKG4uc3RhY2spLG4uaW5kZXg9PT1lKSlicmVhaztyZXR1cm4gYS5sZW5ndGh8fGEucHVzaCh2b2lkIDApLGF9X2dldFN0YWNrQ291bnQoZSl7cmV0dXJuIHRoaXMuX2dldFN0YWNrcyh2b2lkIDAsZSkubGVuZ3RofV9nZXRBeGlzQ291bnQoKXtyZXR1cm4gdGhpcy5fZ2V0QXhpcygpLmxlbmd0aH1nZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKXtsZXQgZT10aGlzLmNoYXJ0LnNjYWxlcyx0PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZpbHRlcihuPT5lW25dLmF4aXM9PT10KS5zaGlmdCgpfV9nZXRBeGlzKCl7bGV0IGU9e30sdD10aGlzLmdldEZpcnN0U2NhbGVJZEZvckluZGV4QXhpcygpO2ZvcihsZXQgbiBvZiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpZVtxKHRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/bi54QXhpc0lEOm4ueUF4aXNJRCx0KV09ITA7cmV0dXJuIE9iamVjdC5rZXlzKGUpfV9nZXRTdGFja0luZGV4KGUsdCxuKXtsZXQgcj10aGlzLl9nZXRTdGFja3MoZSxuKSxpPXQ9PT12b2lkIDA/LTE6ci5pbmRleE9mKHQpO3JldHVybiBpPT09LTE/ci5sZW5ndGgtMTppfV9nZXRSdWxlcigpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2NhY2hlZE1ldGEsbj10LmlTY2FsZSxyPVtdLGksYTtmb3IoaT0wLGE9dC5kYXRhLmxlbmd0aDtpPGE7KytpKXIucHVzaChuLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbbi5heGlzXSxpKSk7bGV0IG89ZS5iYXJUaGlja25lc3M7cmV0dXJue21pbjpvfHxkbCh0KSxwaXhlbHM6cixzdGFydDpuLl9zdGFydFBpeGVsLGVuZDpuLl9lbmRQaXhlbCxzdGFja0NvdW50OnRoaXMuX2dldFN0YWNrQ291bnQoKSxzY2FsZTpuLGdyb3VwZWQ6ZS5ncm91cGVkLHJhdGlvOm8/MTplLmNhdGVnb3J5UGVyY2VudGFnZSplLmJhclBlcmNlbnRhZ2V9fV9jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhlKXtsZXR7X2NhY2hlZE1ldGE6e3ZTY2FsZTp0LF9zdGFja2VkOm4saW5kZXg6cn0sb3B0aW9uczp7YmFzZTppLG1pbkJhckxlbmd0aDphfX09dGhpcyxvPWl8fDAscz10aGlzLmdldFBhcnNlZChlKSxjPXMuX2N1c3RvbSxsPV9sKGMpLHU9c1t0LmF4aXNdLGQ9MCxmPW4/dGhpcy5hcHBseVN0YWNrKHQscyxuKTp1LHAsbTtmIT09dSYmKGQ9Zi11LGY9dSksbCYmKHU9Yy5iYXJTdGFydCxmPWMuYmFyRW5kLWMuYmFyU3RhcnQsdSE9PTAmJkNvKHUpIT09Q28oYy5iYXJFbmQpJiYoZD0wKSxkKz11KTtsZXQgaD0hVShpKSYmIWw/aTpkLGc9dC5nZXRQaXhlbEZvclZhbHVlKGgpO2lmKHA9dGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShlKT90LmdldFBpeGVsRm9yVmFsdWUoZCtmKTpnLG09cC1nLE1hdGguYWJzKG0pPGEpe209dmwobSx0LG8pKmEsdT09PW8mJihnLT1tLzIpO2xldCBlPXQuZ2V0UGl4ZWxGb3JEZWNpbWFsKDApLGk9dC5nZXRQaXhlbEZvckRlY2ltYWwoMSk7Zz1NYXRoLm1heChNYXRoLm1pbihnLE1hdGgubWF4KGUsaSkpLE1hdGgubWluKGUsaSkpLHA9ZyttLG4mJiFsJiYocy5fc3RhY2tzW3QuYXhpc10uX3Zpc3VhbFZhbHVlc1tyXT10LmdldFZhbHVlRm9yUGl4ZWwocCktdC5nZXRWYWx1ZUZvclBpeGVsKGcpKX1pZihnPT09dC5nZXRQaXhlbEZvclZhbHVlKG8pKXtsZXQgZT1DbyhtKSp0LmdldExpbmVXaWR0aEZvclZhbHVlKG8pLzI7Zys9ZSxtLT1lfXJldHVybntzaXplOm0sYmFzZTpnLGhlYWQ6cCxjZW50ZXI6cCttLzJ9fV9jYWxjdWxhdGVCYXJJbmRleFBpeGVscyhlLHQpe2xldCBuPXQuc2NhbGUscj10aGlzLm9wdGlvbnMsaT1yLnNraXBOdWxsLGE9cShyLm1heEJhclRoaWNrbmVzcywxLzApLG8scyxjPXRoaXMuX2dldEF4aXNDb3VudCgpO2lmKHQuZ3JvdXBlZCl7bGV0IG49aT90aGlzLl9nZXRTdGFja0NvdW50KGUpOnQuc3RhY2tDb3VudCxsPXIuYmFyVGhpY2tuZXNzPT09YGZsZXhgP3BsKGUsdCxyLG4qYyk6ZmwoZSx0LHIsbipjKSx1PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/dGhpcy5nZXREYXRhc2V0KCkueEF4aXNJRDp0aGlzLmdldERhdGFzZXQoKS55QXhpc0lELGQ9dGhpcy5fZ2V0QXhpcygpLmluZGV4T2YocSh1LHRoaXMuZ2V0Rmlyc3RTY2FsZUlkRm9ySW5kZXhBeGlzKCkpKSxmPXRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCx0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLGk/ZTp2b2lkIDApK2Q7bz1sLnN0YXJ0K2wuY2h1bmsqZitsLmNodW5rLzIscz1NYXRoLm1pbihhLGwuY2h1bmsqbC5yYXRpbyl9ZWxzZSBvPW4uZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChlKVtuLmF4aXNdLGUpLHM9TWF0aC5taW4oYSx0Lm1pbip0LnJhdGlvKTtyZXR1cm57YmFzZTpvLXMvMixoZWFkOm8rcy8yLGNlbnRlcjpvLHNpemU6c319ZHJhdygpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGEsdD1lLnZTY2FsZSxuPWUuZGF0YSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdGhpcy5nZXRQYXJzZWQoaSlbdC5heGlzXSE9PW51bGwmJiFuW2ldLmhpZGRlbiYmbltpXS5kcmF3KHRoaXMuX2N0eCl9fTtmdW5jdGlvbiBFbCgpe3Rocm93IEVycm9yKGBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuYCl9dmFyIERsPXtfZGF0ZTpjbGFzcyBle3N0YXRpYyBvdmVycmlkZSh0KXtPYmplY3QuYXNzaWduKGUucHJvdG90eXBlLHQpfW9wdGlvbnM7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fHt9fWluaXQoKXt9Zm9ybWF0cygpe3JldHVybiBFbCgpfXBhcnNlKCl7cmV0dXJuIEVsKCl9Zm9ybWF0KCl7cmV0dXJuIEVsKCl9YWRkKCl7cmV0dXJuIEVsKCl9ZGlmZigpe3JldHVybiBFbCgpfXN0YXJ0T2YoKXtyZXR1cm4gRWwoKX1lbmRPZigpe3JldHVybiBFbCgpfX19O2Z1bmN0aW9uIE9sKGUsdCxuLHIpe2xldHtjb250cm9sbGVyOmksZGF0YTphLF9zb3J0ZWQ6b309ZSxzPWkuX2NhY2hlZE1ldGEuaVNjYWxlLGM9ZS5kYXRhc2V0JiZlLmRhdGFzZXQub3B0aW9ucz9lLmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwczpudWxsO2lmKHMmJnQ9PT1zLmF4aXMmJnQhPT1gcmAmJm8mJmEubGVuZ3RoKXtsZXQgbz1zLl9yZXZlcnNlUGl4ZWxzP1VvOkhvO2lmKCFyKXtsZXQgcj1vKGEsdCxuKTtpZihjKXtsZXR7dlNjYWxlOnR9PWkuX2NhY2hlZE1ldGEse19wYXJzZWQ6bn09ZSxhPW4uc2xpY2UoMCxyLmxvKzEpLnJldmVyc2UoKS5maW5kSW5kZXgoZT0+IVUoZVt0LmF4aXNdKSk7ci5sby09TWF0aC5tYXgoMCxhKTtsZXQgbz1uLnNsaWNlKHIuaGkpLmZpbmRJbmRleChlPT4hVShlW3QuYXhpc10pKTtyLmhpKz1NYXRoLm1heCgwLG8pfXJldHVybiByfWlmKGkuX3NoYXJlZE9wdGlvbnMpe2xldCBlPWFbMF0scj10eXBlb2YgZS5nZXRSYW5nZT09YGZ1bmN0aW9uYCYmZS5nZXRSYW5nZSh0KTtpZihyKXtsZXQgZT1vKGEsdCxuLXIpLGk9byhhLHQsbityKTtyZXR1cm57bG86ZS5sbyxoaTppLmhpfX19fXJldHVybntsbzowLGhpOmEubGVuZ3RoLTF9fWZ1bmN0aW9uIGtsKGUsdCxuLHIsaSl7bGV0IGE9ZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCksbz1uW3RdO2ZvcihsZXQgZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7bGV0e2luZGV4Om4sZGF0YTpzfT1hW2VdLHtsbzpjLGhpOmx9PU9sKGFbZV0sdCxvLGkpO2ZvcihsZXQgZT1jO2U8PWw7KytlKXtsZXQgdD1zW2VdO3Quc2tpcHx8cih0LG4sZSl9fX1mdW5jdGlvbiBBbChlKXtsZXQgdD1lLmluZGV4T2YoYHhgKSE9PS0xLG49ZS5pbmRleE9mKGB5YCkhPT0tMTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtsZXQgaT10P01hdGguYWJzKGUueC1yLngpOjAsYT1uP01hdGguYWJzKGUueS1yLnkpOjA7cmV0dXJuIE1hdGguc3FydChpKioyK2EqKjIpfX1mdW5jdGlvbiBqbChlLHQsbixyLGkpe2xldCBhPVtdO3JldHVybiFpJiYhZS5pc1BvaW50SW5BcmVhKHQpfHxrbChlLG4sdCxmdW5jdGlvbihuLG8scyl7IWkmJiFBcyhuLGUuY2hhcnRBcmVhLDApfHxuLmluUmFuZ2UodC54LHQueSxyKSYmYS5wdXNoKHtlbGVtZW50Om4sZGF0YXNldEluZGV4Om8saW5kZXg6c30pfSwhMCksYX1mdW5jdGlvbiBNbChlLHQsbixyKXtsZXQgaT1bXTtmdW5jdGlvbiBhKGUsbixhKXtsZXR7c3RhcnRBbmdsZTpvLGVuZEFuZ2xlOnN9PWUuZ2V0UHJvcHMoW2BzdGFydEFuZ2xlYCxgZW5kQW5nbGVgXSxyKSx7YW5nbGU6Y309UG8oZSx7eDp0LngseTp0Lnl9KTtMbyhjLG8scykmJmkucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpuLGluZGV4OmF9KX1yZXR1cm4ga2woZSxuLHQsYSksaX1mdW5jdGlvbiBObChlLHQsbixyLGksYSl7bGV0IG89W10scz1BbChuKSxjPTEvMDtmdW5jdGlvbiBsKG4sbCx1KXtsZXQgZD1uLmluUmFuZ2UodC54LHQueSxpKTtpZihyJiYhZClyZXR1cm47bGV0IGY9bi5nZXRDZW50ZXJQb2ludChpKTtpZighKGF8fGUuaXNQb2ludEluQXJlYShmKSkmJiFkKXJldHVybjtsZXQgcD1zKHQsZik7cDxjPyhvPVt7ZWxlbWVudDpuLGRhdGFzZXRJbmRleDpsLGluZGV4OnV9XSxjPXApOnA9PT1jJiZvLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6bCxpbmRleDp1fSl9cmV0dXJuIGtsKGUsbix0LGwpLG99ZnVuY3Rpb24gUGwoZSx0LG4scixpLGEpe3JldHVybiFhJiYhZS5pc1BvaW50SW5BcmVhKHQpP1tdOm49PT1gcmAmJiFyP01sKGUsdCxuLGkpOk5sKGUsdCxuLHIsaSxhKX1mdW5jdGlvbiBGbChlLHQsbixyLGkpe2xldCBhPVtdLG89bj09PWB4YD9gaW5YUmFuZ2VgOmBpbllSYW5nZWAscz0hMTtyZXR1cm4ga2woZSxuLHQsKGUscixjKT0+e2Vbb10mJmVbb10odFtuXSxpKSYmKGEucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpyLGluZGV4OmN9KSxzfHw9ZS5pblJhbmdlKHQueCx0LnksaSkpfSksciYmIXM/W106YX12YXIgSWw9e2V2YWx1YXRlSW50ZXJhY3Rpb25JdGVtczprbCxtb2Rlczp7aW5kZXgoZSx0LG4scil7bGV0IGk9U2ModCxlKSxhPW4uYXhpc3x8YHhgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKSxjPVtdO3JldHVybiBzLmxlbmd0aD8oZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkuZm9yRWFjaChlPT57bGV0IHQ9c1swXS5pbmRleCxuPWUuZGF0YVt0XTtuJiYhbi5za2lwJiZjLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6ZS5pbmRleCxpbmRleDp0fSl9KSxjKTpbXX0sZGF0YXNldChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKTtpZihzLmxlbmd0aD4wKXtsZXQgdD1zWzBdLmRhdGFzZXRJbmRleCxuPWUuZ2V0RGF0YXNldE1ldGEodCkuZGF0YTtzPVtdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXMucHVzaCh7ZWxlbWVudDpuW2VdLGRhdGFzZXRJbmRleDp0LGluZGV4OmV9KX1yZXR1cm4gc30scG9pbnQoZSx0LG4scil7cmV0dXJuIGpsKGUsU2ModCxlKSxuLmF4aXN8fGB4eWAscixuLmluY2x1ZGVJbnZpc2libGV8fCExKX0sbmVhcmVzdChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMTtyZXR1cm4gUGwoZSxpLGEsbi5pbnRlcnNlY3QscixvKX0seChlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB4YCxuLmludGVyc2VjdCxyKX0seShlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB5YCxuLmludGVyc2VjdCxyKX19fSxMbD1bYGxlZnRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWBdO2Z1bmN0aW9uIFJsKGUsdCl7cmV0dXJuIGUuZmlsdGVyKGU9PmUucG9zPT09dCl9ZnVuY3Rpb24gemwoZSx0KXtyZXR1cm4gZS5maWx0ZXIoZT0+TGwuaW5kZXhPZihlLnBvcyk9PT0tMSYmZS5ib3guYXhpcz09PXQpfWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIGUuc29ydCgoZSxuKT0+e2xldCByPXQ/bjplLGk9dD9lOm47cmV0dXJuIHIud2VpZ2h0PT09aS53ZWlnaHQ/ci5pbmRleC1pLmluZGV4OnIud2VpZ2h0LWkud2VpZ2h0fSl9ZnVuY3Rpb24gVmwoZSl7bGV0IHQ9W10sbixyLGksYSxvLHM7Zm9yKG49MCxyPShlfHxbXSkubGVuZ3RoO248cjsrK24paT1lW25dLHtwb3NpdGlvbjphLG9wdGlvbnM6e3N0YWNrOm8sc3RhY2tXZWlnaHQ6cz0xfX09aSx0LnB1c2goe2luZGV4Om4sYm94OmkscG9zOmEsaG9yaXpvbnRhbDppLmlzSG9yaXpvbnRhbCgpLHdlaWdodDppLndlaWdodCxzdGFjazpvJiZhK28sc3RhY2tXZWlnaHQ6c30pO3JldHVybiB0fWZ1bmN0aW9uIEhsKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBvZiBlKXtsZXR7c3RhY2s6ZSxwb3M6cixzdGFja1dlaWdodDppfT1uO2lmKCFlfHwhTGwuaW5jbHVkZXMocikpY29udGludWU7bGV0IGE9dFtlXXx8KHRbZV09e2NvdW50OjAscGxhY2VkOjAsd2VpZ2h0OjAsc2l6ZTowfSk7YS5jb3VudCsrLGEud2VpZ2h0Kz1pfXJldHVybiB0fWZ1bmN0aW9uIFVsKGUsdCl7bGV0IG49SGwoZSkse3ZCb3hNYXhXaWR0aDpyLGhCb3hNYXhIZWlnaHQ6aX09dCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7cz1lW2FdO2xldHtmdWxsU2l6ZTpvfT1zLmJveCxjPW5bcy5zdGFja10sbD1jJiZzLnN0YWNrV2VpZ2h0L2Mud2VpZ2h0O3MuaG9yaXpvbnRhbD8ocy53aWR0aD1sP2wqcjpvJiZ0LmF2YWlsYWJsZVdpZHRoLHMuaGVpZ2h0PWkpOihzLndpZHRoPXIscy5oZWlnaHQ9bD9sKmk6byYmdC5hdmFpbGFibGVIZWlnaHQpfXJldHVybiBufWZ1bmN0aW9uIFdsKGUpe2xldCB0PVZsKGUpLG49QmwodC5maWx0ZXIoZT0+ZS5ib3guZnVsbFNpemUpLCEwKSxyPUJsKFJsKHQsYGxlZnRgKSwhMCksaT1CbChSbCh0LGByaWdodGApKSxhPUJsKFJsKHQsYHRvcGApLCEwKSxvPUJsKFJsKHQsYGJvdHRvbWApKSxzPXpsKHQsYHhgKSxjPXpsKHQsYHlgKTtyZXR1cm57ZnVsbFNpemU6bixsZWZ0QW5kVG9wOnIuY29uY2F0KGEpLHJpZ2h0QW5kQm90dG9tOmkuY29uY2F0KGMpLmNvbmNhdChvKS5jb25jYXQocyksY2hhcnRBcmVhOlJsKHQsYGNoYXJ0QXJlYWApLHZlcnRpY2FsOnIuY29uY2F0KGkpLmNvbmNhdChjKSxob3Jpem9udGFsOmEuY29uY2F0KG8pLmNvbmNhdChzKX19ZnVuY3Rpb24gR2woZSx0LG4scil7cmV0dXJuIE1hdGgubWF4KGVbbl0sdFtuXSkrTWF0aC5tYXgoZVtyXSx0W3JdKX1mdW5jdGlvbiBLbChlLHQpe2UudG9wPU1hdGgubWF4KGUudG9wLHQudG9wKSxlLmxlZnQ9TWF0aC5tYXgoZS5sZWZ0LHQubGVmdCksZS5ib3R0b209TWF0aC5tYXgoZS5ib3R0b20sdC5ib3R0b20pLGUucmlnaHQ9TWF0aC5tYXgoZS5yaWdodCx0LnJpZ2h0KX1mdW5jdGlvbiBxbChlLHQsbixyKXtsZXR7cG9zOmksYm94OmF9PW4sbz1lLm1heFBhZGRpbmc7aWYoIUcoaSkpe24uc2l6ZSYmKGVbaV0tPW4uc2l6ZSk7bGV0IHQ9cltuLnN0YWNrXXx8e3NpemU6MCxjb3VudDoxfTt0LnNpemU9TWF0aC5tYXgodC5zaXplLG4uaG9yaXpvbnRhbD9hLmhlaWdodDphLndpZHRoKSxuLnNpemU9dC5zaXplL3QuY291bnQsZVtpXSs9bi5zaXplfWEuZ2V0UGFkZGluZyYmS2wobyxhLmdldFBhZGRpbmcoKSk7bGV0IHM9TWF0aC5tYXgoMCx0Lm91dGVyV2lkdGgtR2wobyxlLGBsZWZ0YCxgcmlnaHRgKSksYz1NYXRoLm1heCgwLHQub3V0ZXJIZWlnaHQtR2wobyxlLGB0b3BgLGBib3R0b21gKSksbD1zIT09ZS53LHU9YyE9PWUuaDtyZXR1cm4gZS53PXMsZS5oPWMsbi5ob3Jpem9udGFsP3tzYW1lOmwsb3RoZXI6dX06e3NhbWU6dSxvdGhlcjpsfX1mdW5jdGlvbiBKbChlKXtsZXQgdD1lLm1heFBhZGRpbmc7ZnVuY3Rpb24gbihuKXtsZXQgcj1NYXRoLm1heCh0W25dLWVbbl0sMCk7cmV0dXJuIGVbbl0rPXIscn1lLnkrPW4oYHRvcGApLGUueCs9bihgbGVmdGApLG4oYHJpZ2h0YCksbihgYm90dG9tYCl9ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj10Lm1heFBhZGRpbmc7ZnVuY3Rpb24gcihlKXtsZXQgcj17bGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9O3JldHVybiBlLmZvckVhY2goZT0+e3JbZV09TWF0aC5tYXgodFtlXSxuW2VdKX0pLHJ9cmV0dXJuIHIoZT9bYGxlZnRgLGByaWdodGBdOltgdG9wYCxgYm90dG9tYF0pfWZ1bmN0aW9uIFhsKGUsdCxuLHIpe2xldCBpPVtdLGEsbyxzLGMsbCx1O2ZvcihhPTAsbz1lLmxlbmd0aCxsPTA7YTxvOysrYSl7cz1lW2FdLGM9cy5ib3gsYy51cGRhdGUocy53aWR0aHx8dC53LHMuaGVpZ2h0fHx0LmgsWWwocy5ob3Jpem9udGFsLHQpKTtsZXR7c2FtZTpvLG90aGVyOmR9PXFsKHQsbixzLHIpO2x8PW8mJmkubGVuZ3RoLHV8fD1kLGMuZnVsbFNpemV8fGkucHVzaChzKX1yZXR1cm4gbCYmWGwoaSx0LG4scil8fHV9ZnVuY3Rpb24gWmwoZSx0LG4scixpKXtlLnRvcD1uLGUubGVmdD10LGUucmlnaHQ9dCtyLGUuYm90dG9tPW4raSxlLndpZHRoPXIsZS5oZWlnaHQ9aX1mdW5jdGlvbiBRbChlLHQsbixyKXtsZXQgaT1uLnBhZGRpbmcse3g6YSx5Om99PXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBlPXMuYm94LGM9cltzLnN0YWNrXXx8e2NvdW50OjEscGxhY2VkOjAsd2VpZ2h0OjF9LGw9cy5zdGFja1dlaWdodC9jLndlaWdodHx8MTtpZihzLmhvcml6b250YWwpe2xldCByPXQudypsLGE9Yy5zaXplfHxlLmhlaWdodDtmbyhjLnN0YXJ0KSYmKG89Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGkubGVmdCxvLG4ub3V0ZXJXaWR0aC1pLnJpZ2h0LWkubGVmdCxhKTpabChlLHQubGVmdCtjLnBsYWNlZCxvLHIsYSksYy5zdGFydD1vLGMucGxhY2VkKz1yLG89ZS5ib3R0b219ZWxzZXtsZXQgcj10LmgqbCxvPWMuc2l6ZXx8ZS53aWR0aDtmbyhjLnN0YXJ0KSYmKGE9Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGEsaS50b3AsbyxuLm91dGVySGVpZ2h0LWkuYm90dG9tLWkudG9wKTpabChlLGEsdC50b3ArYy5wbGFjZWQsbyxyKSxjLnN0YXJ0PWEsYy5wbGFjZWQrPXIsYT1lLnJpZ2h0fX10Lng9YSx0Lnk9b312YXIgJGw9e2FkZEJveChlLHQpe2UuYm94ZXN8fD1bXSx0LmZ1bGxTaXplPXQuZnVsbFNpemV8fCExLHQucG9zaXRpb249dC5wb3NpdGlvbnx8YHRvcGAsdC53ZWlnaHQ9dC53ZWlnaHR8fDAsdC5fbGF5ZXJzPXQuX2xheWVyc3x8ZnVuY3Rpb24oKXtyZXR1cm5be3o6MCxkcmF3KGUpe3QuZHJhdyhlKX19XX0sZS5ib3hlcy5wdXNoKHQpfSxyZW1vdmVCb3goZSx0KXtsZXQgbj1lLmJveGVzP2UuYm94ZXMuaW5kZXhPZih0KTotMTtuIT09LTEmJmUuYm94ZXMuc3BsaWNlKG4sMSl9LGNvbmZpZ3VyZShlLHQsbil7dC5mdWxsU2l6ZT1uLmZ1bGxTaXplLHQucG9zaXRpb249bi5wb3NpdGlvbix0LndlaWdodD1uLndlaWdodH0sdXBkYXRlKGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXQgaT1RKGUub3B0aW9ucy5sYXlvdXQucGFkZGluZyksYT1NYXRoLm1heCh0LWkud2lkdGgsMCksbz1NYXRoLm1heChuLWkuaGVpZ2h0LDApLHM9V2woZS5ib3hlcyksYz1zLnZlcnRpY2FsLGw9cy5ob3Jpem9udGFsO1koZS5ib3hlcyxlPT57dHlwZW9mIGUuYmVmb3JlTGF5b3V0PT1gZnVuY3Rpb25gJiZlLmJlZm9yZUxheW91dCgpfSk7bGV0IHU9Yy5yZWR1Y2UoKGUsdCk9PnQuYm94Lm9wdGlvbnMmJnQuYm94Lm9wdGlvbnMuZGlzcGxheT09PSExP2U6ZSsxLDApfHwxLGQ9T2JqZWN0LmZyZWV6ZSh7b3V0ZXJXaWR0aDp0LG91dGVySGVpZ2h0Om4scGFkZGluZzppLGF2YWlsYWJsZVdpZHRoOmEsYXZhaWxhYmxlSGVpZ2h0Om8sdkJveE1heFdpZHRoOmEvMi91LGhCb3hNYXhIZWlnaHQ6by8yfSksZj1PYmplY3QuYXNzaWduKHt9LGkpO0tsKGYsUShyKSk7bGV0IHA9T2JqZWN0LmFzc2lnbih7bWF4UGFkZGluZzpmLHc6YSxoOm8seDppLmxlZnQseTppLnRvcH0saSksbT1VbChjLmNvbmNhdChsKSxkKTtYbChzLmZ1bGxTaXplLHAsZCxtKSxYbChjLHAsZCxtKSxYbChsLHAsZCxtKSYmWGwoYyxwLGQsbSksSmwocCksUWwocy5sZWZ0QW5kVG9wLHAsZCxtKSxwLngrPXAudyxwLnkrPXAuaCxRbChzLnJpZ2h0QW5kQm90dG9tLHAsZCxtKSxlLmNoYXJ0QXJlYT17bGVmdDpwLmxlZnQsdG9wOnAudG9wLHJpZ2h0OnAubGVmdCtwLncsYm90dG9tOnAudG9wK3AuaCxoZWlnaHQ6cC5oLHdpZHRoOnAud30sWShzLmNoYXJ0QXJlYSx0PT57bGV0IG49dC5ib3g7T2JqZWN0LmFzc2lnbihuLGUuY2hhcnRBcmVhKSxuLnVwZGF0ZShwLncscC5oLHtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0pfSl9fSxldT1jbGFzc3thY3F1aXJlQ29udGV4dChlLHQpe31yZWxlYXNlQ29udGV4dChlKXtyZXR1cm4hMX1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt9cmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsbil7fWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gMX1nZXRNYXhpbXVtU2l6ZShlLHQsbixyKXtyZXR1cm4gdD1NYXRoLm1heCgwLHR8fGUud2lkdGgpLG58fD1lLmhlaWdodCx7d2lkdGg6dCxoZWlnaHQ6TWF0aC5tYXgoMCxyP01hdGguZmxvb3IodC9yKTpuKX19aXNBdHRhY2hlZChlKXtyZXR1cm4hMH11cGRhdGVDb25maWcoZSl7fX0sdHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlKXtyZXR1cm4gZSYmZS5nZXRDb250ZXh0JiZlLmdldENvbnRleHQoYDJkYCl8fG51bGx9dXBkYXRlQ29uZmlnKGUpe2Uub3B0aW9ucy5hbmltYXRpb249ITF9fSxudT1gJGNoYXJ0anNgLHJ1PXt0b3VjaHN0YXJ0OmBtb3VzZWRvd25gLHRvdWNobW92ZTpgbW91c2Vtb3ZlYCx0b3VjaGVuZDpgbW91c2V1cGAscG9pbnRlcmVudGVyOmBtb3VzZWVudGVyYCxwb2ludGVyZG93bjpgbW91c2Vkb3duYCxwb2ludGVybW92ZTpgbW91c2Vtb3ZlYCxwb2ludGVydXA6YG1vdXNldXBgLHBvaW50ZXJsZWF2ZTpgbW91c2VvdXRgLHBvaW50ZXJvdXQ6YG1vdXNlb3V0YH0saXU9ZT0+ZT09PW51bGx8fGU9PT1gYDtmdW5jdGlvbiBhdShlLHQpe2xldCBuPWUuc3R5bGUscj1lLmdldEF0dHJpYnV0ZShgaGVpZ2h0YCksaT1lLmdldEF0dHJpYnV0ZShgd2lkdGhgKTtpZihlW251XT17aW5pdGlhbDp7aGVpZ2h0OnIsd2lkdGg6aSxzdHlsZTp7ZGlzcGxheTpuLmRpc3BsYXksaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGh9fX0sbi5kaXNwbGF5PW4uZGlzcGxheXx8YGJsb2NrYCxuLmJveFNpemluZz1uLmJveFNpemluZ3x8YGJvcmRlci1ib3hgLGl1KGkpKXtsZXQgdD1PYyhlLGB3aWR0aGApO3QhPT12b2lkIDAmJihlLndpZHRoPXQpfWlmKGl1KHIpKXtpZihlLnN0eWxlLmhlaWdodD09PWBgKWUuaGVpZ2h0PWUud2lkdGgvKHR8fDIpO2Vsc2V7bGV0IHQ9T2MoZSxgaGVpZ2h0YCk7dCE9PXZvaWQgMCYmKGUuaGVpZ2h0PXQpfX1yZXR1cm4gZX12YXIgb3U9RGM/e3Bhc3NpdmU6ITB9OiExO2Z1bmN0aW9uIHN1KGUsdCxuKXtlJiZlLmFkZEV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBjdShlLHQsbil7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBsdShlLHQpe2xldCBuPXJ1W2UudHlwZV18fGUudHlwZSx7eDpyLHk6aX09U2MoZSx0KTtyZXR1cm57dHlwZTpuLGNoYXJ0OnQsbmF0aXZlOmUseDpyPT09dm9pZCAwP251bGw6cix5Omk9PT12b2lkIDA/bnVsbDppfX1mdW5jdGlvbiB1dShlLHQpe2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHxuLmNvbnRhaW5zKHQpKXJldHVybiEwfWZ1bmN0aW9uIGR1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5hZGRlZE5vZGVzLHIpLHQmJj0hdXUobi5yZW1vdmVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfWZ1bmN0aW9uIGZ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5yZW1vdmVkTm9kZXMsciksdCYmPSF1dShuLmFkZGVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfXZhciBwdT1uZXcgTWFwLG11PTA7ZnVuY3Rpb24gaHUoKXtsZXQgZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztlIT09bXUmJihtdT1lLHB1LmZvckVhY2goKHQsbik9PntuLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIT09ZSYmdCgpfSkpfWZ1bmN0aW9uIGd1KGUsdCl7cHUuc2l6ZXx8d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHJlc2l6ZWAsaHUpLHB1LnNldChlLHQpfWZ1bmN0aW9uIF91KGUpe3B1LmRlbGV0ZShlKSxwdS5zaXplfHx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxodSl9ZnVuY3Rpb24gdnUoZSx0LG4pe2xldCByPWUuY2FudmFzLGk9ciYmbWMocik7aWYoIWkpcmV0dXJuO2xldCBhPVhvKChlLHQpPT57bGV0IHI9aS5jbGllbnRXaWR0aDtuKGUsdCkscjxpLmNsaWVudFdpZHRoJiZuKCl9LHdpbmRvdyksbz1uZXcgUmVzaXplT2JzZXJ2ZXIoZT0+e2xldCB0PWVbMF0sbj10LmNvbnRlbnRSZWN0LndpZHRoLHI9dC5jb250ZW50UmVjdC5oZWlnaHQ7KG4hPT0wfHxyIT09MCkmJmEobixyKX0pO3JldHVybiBvLm9ic2VydmUoaSksZ3UoZSxhKSxvfWZ1bmN0aW9uIHl1KGUsdCxuKXtuJiZuLmRpc2Nvbm5lY3QoKSx0PT09YHJlc2l6ZWAmJl91KGUpfWZ1bmN0aW9uIGJ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPVhvKHQ9PntlLmN0eCE9PW51bGwmJm4obHUodCxlKSl9LGUpO3JldHVybiBzdShyLHQsaSksaX12YXIgeHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlLHQpe2xldCBuPWUmJmUuZ2V0Q29udGV4dCYmZS5nZXRDb250ZXh0KGAyZGApO3JldHVybiBuJiZuLmNhbnZhcz09PWU/KGF1KGUsdCksbik6bnVsbH1yZWxlYXNlQ29udGV4dChlKXtsZXQgdD1lLmNhbnZhcztpZighdFtudV0pcmV0dXJuITE7bGV0IG49dFtudV0uaW5pdGlhbDtbYGhlaWdodGAsYHdpZHRoYF0uZm9yRWFjaChlPT57bGV0IHI9bltlXTtVKHIpP3QucmVtb3ZlQXR0cmlidXRlKGUpOnQuc2V0QXR0cmlidXRlKGUscil9KTtsZXQgcj1uLnN0eWxlfHx7fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChlPT57dC5zdHlsZVtlXT1yW2VdfSksdC53aWR0aD10LndpZHRoLGRlbGV0ZSB0W251XSwhMH1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KTtsZXQgcj1lLiRwcm94aWVzfHw9e307clt0XT0oe2F0dGFjaDpkdSxkZXRhY2g6ZnUscmVzaXplOnZ1fVt0XXx8YnUpKGUsdCxuKX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IG49ZS4kcHJveGllc3x8PXt9LHI9blt0XTtyJiYoKHthdHRhY2g6eXUsZGV0YWNoOnl1LHJlc2l6ZTp5dX1bdF18fGN1KShlLHQsciksblt0XT12b2lkIDApfWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW99Z2V0TWF4aW11bVNpemUoZSx0LG4scil7cmV0dXJuIFRjKGUsdCxuLHIpfWlzQXR0YWNoZWQoZSl7bGV0IHQ9ZSYmbWMoZSk7cmV0dXJuISEodCYmdC5pc0Nvbm5lY3RlZCl9fTtmdW5jdGlvbiBTdShlKXtyZXR1cm4hcGMoKXx8dHlwZW9mIE9mZnNjcmVlbkNhbnZhczxgdWAmJmUgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXM/dHU6eHV9dmFyIEN1PWNsYXNze3N0YXRpYyBkZWZhdWx0cz17fTtzdGF0aWMgZGVmYXVsdFJvdXRlcz12b2lkIDA7eDt5O2FjdGl2ZT0hMTtvcHRpb25zOyRhbmltYXRpb25zO3Rvb2x0aXBQb3NpdGlvbihlKXtsZXR7eDp0LHk6bn09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YF0sZSk7cmV0dXJue3g6dCx5Om59fWhhc1ZhbHVlKCl7cmV0dXJuIE9vKHRoaXMueCkmJk9vKHRoaXMueSl9Z2V0UHJvcHMoZSx0KXtsZXQgbj10aGlzLiRhbmltYXRpb25zO2lmKCF0fHwhbilyZXR1cm4gdGhpcztsZXQgcj17fTtyZXR1cm4gZS5mb3JFYWNoKGU9PntyW2VdPW5bZV0mJm5bZV0uYWN0aXZlKCk/bltlXS5fdG86dGhpc1tlXX0pLHJ9fTtmdW5jdGlvbiB3dShlLHQpe2xldCBuPWUub3B0aW9ucy50aWNrcyxyPVR1KGUpLGk9TWF0aC5taW4obi5tYXhUaWNrc0xpbWl0fHxyLHIpLGE9bi5tYWpvci5lbmFibGVkP0R1KHQpOltdLG89YS5sZW5ndGgscz1hWzBdLGM9YVtvLTFdLGw9W107aWYobz5pKXJldHVybiBPdSh0LGwsYSxvL2kpLGw7bGV0IHU9RXUoYSx0LGkpO2lmKG8+MCl7bGV0IGUsbixyPW8+MT9NYXRoLnJvdW5kKChjLXMpLyhvLTEpKTpudWxsO2ZvcihrdSh0LGwsdSxVKHIpPzA6cy1yLHMpLGU9MCxuPW8tMTtlPG47ZSsrKWt1KHQsbCx1LGFbZV0sYVtlKzFdKTtyZXR1cm4ga3UodCxsLHUsYyxVKHIpP3QubGVuZ3RoOmMrciksbH1yZXR1cm4ga3UodCxsLHUpLGx9ZnVuY3Rpb24gVHUoZSl7bGV0IHQ9ZS5vcHRpb25zLm9mZnNldCxuPWUuX3RpY2tTaXplKCkscj1lLl9sZW5ndGgvbisgKyF0LGk9ZS5fbWF4TGVuZ3RoL247cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5taW4ocixpKSl9ZnVuY3Rpb24gRXUoZSx0LG4pe2xldCByPUF1KGUpLGk9dC5sZW5ndGgvbjtpZighcilyZXR1cm4gTWF0aC5tYXgoaSwxKTtsZXQgYT1FbyhyKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoLTE7ZTx0O2UrKyl7bGV0IHQ9YVtlXTtpZih0PmkpcmV0dXJuIHR9cmV0dXJuIE1hdGgubWF4KGksMSl9ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9W10sbixyO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0ubWFqb3ImJnQucHVzaChuKTtyZXR1cm4gdH1mdW5jdGlvbiBPdShlLHQsbixyKXtsZXQgaT0wLGE9blswXSxvO2ZvcihyPU1hdGguY2VpbChyKSxvPTA7bzxlLmxlbmd0aDtvKyspbz09PWEmJih0LnB1c2goZVtvXSksaSsrLGE9bltpKnJdKX1mdW5jdGlvbiBrdShlLHQsbixyLGkpe2xldCBhPXEociwwKSxvPU1hdGgubWluKHEoaSxlLmxlbmd0aCksZS5sZW5ndGgpLHM9MCxjLGwsdTtmb3Iobj1NYXRoLmNlaWwobiksaSYmKGM9aS1yLG49Yy9NYXRoLmZsb29yKGMvbikpLHU9YTt1PDA7KXMrKyx1PU1hdGgucm91bmQoYStzKm4pO2ZvcihsPU1hdGgubWF4KGEsMCk7bDxvO2wrKylsPT09dSYmKHQucHVzaChlW2xdKSxzKyssdT1NYXRoLnJvdW5kKGErcypuKSl9ZnVuY3Rpb24gQXUoZSl7bGV0IHQ9ZS5sZW5ndGgsbixyO2lmKHQ8MilyZXR1cm4hMTtmb3Iocj1lWzBdLG49MTtuPHQ7KytuKWlmKGVbbl0tZVtuLTFdIT09cilyZXR1cm4hMTtyZXR1cm4gcn12YXIganU9ZT0+ZT09PWBsZWZ0YD9gcmlnaHRgOmU9PT1gcmlnaHRgP2BsZWZ0YDplLE11PShlLHQsbik9PnQ9PT1gdG9wYHx8dD09PWBsZWZ0YD9lW3RdK246ZVt0XS1uLE51PShlLHQpPT5NYXRoLm1pbih0fHxlLGUpO2Z1bmN0aW9uIFB1KGUsdCl7bGV0IG49W10scj1lLmxlbmd0aC90LGk9ZS5sZW5ndGgsYT0wO2Zvcig7YTxpO2ErPXIpbi5wdXNoKGVbTWF0aC5mbG9vcihhKV0pO3JldHVybiBufWZ1bmN0aW9uIEZ1KGUsdCxuKXtsZXQgcj1lLnRpY2tzLmxlbmd0aCxpPU1hdGgubWluKHQsci0xKSxhPWUuX3N0YXJ0UGl4ZWwsbz1lLl9lbmRQaXhlbCxzPTFlLTYsYz1lLmdldFBpeGVsRm9yVGljayhpKSxsO2lmKCEobiYmKGw9cj09PTE/TWF0aC5tYXgoYy1hLG8tYyk6dD09PTA/KGUuZ2V0UGl4ZWxGb3JUaWNrKDEpLWMpLzI6KGMtZS5nZXRQaXhlbEZvclRpY2soaS0xKSkvMixjKz1pPHQ/bDotbCxjPGEtc3x8Yz5vK3MpKSlyZXR1cm4gY31mdW5jdGlvbiBJdShlLHQpe1koZSxlPT57bGV0IG49ZS5nYyxyPW4ubGVuZ3RoLzIsaTtpZihyPnQpe2ZvcihpPTA7aTxyOysraSlkZWxldGUgZS5kYXRhW25baV1dO24uc3BsaWNlKDAscil9fSl9ZnVuY3Rpb24gTHUoZSl7cmV0dXJuIGUuZHJhd1RpY2tzP2UudGlja0xlbmd0aDowfWZ1bmN0aW9uIFJ1KGUsdCl7aWYoIWUuZGlzcGxheSlyZXR1cm4gMDtsZXQgbj0kKGUuZm9udCx0KSxyPVEoZS5wYWRkaW5nKTtyZXR1cm4oVyhlLnRleHQpP2UudGV4dC5sZW5ndGg6MSkqbi5saW5lSGVpZ2h0K3IuaGVpZ2h0fWZ1bmN0aW9uIHp1KGUsdCl7cmV0dXJuIHFzKGUse3NjYWxlOnQsdHlwZTpgc2NhbGVgfSl9ZnVuY3Rpb24gQnUoZSx0LG4pe3JldHVybiBxcyhlLHt0aWNrOm4saW5kZXg6dCx0eXBlOmB0aWNrYH0pfWZ1bmN0aW9uIFZ1KGUsdCxuKXtsZXQgcj1RbyhlKTtyZXR1cm4obiYmdCE9PWByaWdodGB8fCFuJiZ0PT09YHJpZ2h0YCkmJihyPWp1KHIpKSxyfWZ1bmN0aW9uIEh1KGUsdCxuLHIpe2xldHt0b3A6aSxsZWZ0OmEsYm90dG9tOm8scmlnaHQ6cyxjaGFydDpjfT1lLHtjaGFydEFyZWE6bCxzY2FsZXM6dX09YyxkPTAsZixwLG0saD1vLWksZz1zLWE7aWYoZS5pc0hvcml6b250YWwoKSl7aWYocD0kbyhyLGEscyksRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO209dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpK2gtdH1lbHNlIG09bj09PWBjZW50ZXJgPyhsLmJvdHRvbStsLnRvcCkvMitoLXQ6TXUoZSxuLHQpO2Y9cy1hfWVsc2V7aWYoRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO3A9dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpLWcrdH1lbHNlIHA9bj09PWBjZW50ZXJgPyhsLmxlZnQrbC5yaWdodCkvMi1nK3Q6TXUoZSxuLHQpO209JG8ocixvLGkpLGQ9bj09PWBsZWZ0YD8teW86eW99cmV0dXJue3RpdGxlWDpwLHRpdGxlWTptLG1heFdpZHRoOmYscm90YXRpb246ZH19dmFyIFV1PWNsYXNzIGUgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaWQ9ZS5pZCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5jdHg9ZS5jdHgsdGhpcy5jaGFydD1lLmNoYXJ0LHRoaXMudG9wPXZvaWQgMCx0aGlzLmJvdHRvbT12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5fbWFyZ2lucz17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9LHRoaXMubWF4V2lkdGg9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLnBhZGRpbmdUb3A9dm9pZCAwLHRoaXMucGFkZGluZ0JvdHRvbT12b2lkIDAsdGhpcy5wYWRkaW5nTGVmdD12b2lkIDAsdGhpcy5wYWRkaW5nUmlnaHQ9dm9pZCAwLHRoaXMuYXhpcz12b2lkIDAsdGhpcy5sYWJlbFJvdGF0aW9uPXZvaWQgMCx0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwLHRoaXMuX3JhbmdlPXZvaWQgMCx0aGlzLnRpY2tzPVtdLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2xlbmd0aD0wLHRoaXMuX21heExlbmd0aD0wLHRoaXMuX2xvbmdlc3RUZXh0Q2FjaGU9e30sdGhpcy5fc3RhcnRQaXhlbD12b2lkIDAsdGhpcy5fZW5kUGl4ZWw9dm9pZCAwLHRoaXMuX3JldmVyc2VQaXhlbHM9ITEsdGhpcy5fdXNlck1heD12b2lkIDAsdGhpcy5fdXNlck1pbj12b2lkIDAsdGhpcy5fc3VnZ2VzdGVkTWF4PXZvaWQgMCx0aGlzLl9zdWdnZXN0ZWRNaW49dm9pZCAwLHRoaXMuX3RpY2tzTGVuZ3RoPTAsdGhpcy5fYm9yZGVyVmFsdWU9MCx0aGlzLl9jYWNoZT17fSx0aGlzLl9kYXRhTGltaXRzQ2FjaGVkPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwfWluaXQoZSl7dGhpcy5vcHRpb25zPWUuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksdGhpcy5heGlzPWUuYXhpcyx0aGlzLl91c2VyTWluPXRoaXMucGFyc2UoZS5taW4pLHRoaXMuX3VzZXJNYXg9dGhpcy5wYXJzZShlLm1heCksdGhpcy5fc3VnZ2VzdGVkTWluPXRoaXMucGFyc2UoZS5zdWdnZXN0ZWRNaW4pLHRoaXMuX3N1Z2dlc3RlZE1heD10aGlzLnBhcnNlKGUuc3VnZ2VzdGVkTWF4KX1wYXJzZShlLHQpe3JldHVybiBlfWdldFVzZXJCb3VuZHMoKXtsZXR7X3VzZXJNaW46ZSxfdXNlck1heDp0LF9zdWdnZXN0ZWRNaW46bixfc3VnZ2VzdGVkTWF4OnJ9PXRoaXM7cmV0dXJuIGU9WmEoZSwxLzApLHQ9WmEodCwtMS8wKSxuPVphKG4sMS8wKSxyPVphKHIsLTEvMCkse21pbjpaYShlLG4pLG1heDpaYSh0LHIpLG1pbkRlZmluZWQ6SyhlKSxtYXhEZWZpbmVkOksodCl9fWdldE1pbk1heChlKXtsZXR7bWluOnQsbWF4Om4sbWluRGVmaW5lZDpyLG1heERlZmluZWQ6aX09dGhpcy5nZXRVc2VyQm91bmRzKCksYTtpZihyJiZpKXJldHVybnttaW46dCxtYXg6bn07bGV0IG89dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO2ZvcihsZXQgcz0wLGM9by5sZW5ndGg7czxjOysrcylhPW9bc10uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcyxlKSxyfHwodD1NYXRoLm1pbih0LGEubWluKSksaXx8KG49TWF0aC5tYXgobixhLm1heCkpO3JldHVybiB0PWkmJnQ+bj9uOnQsbj1yJiZ0Pm4/dDpuLHttaW46WmEodCxaYShuLHQpKSxtYXg6WmEobixaYSh0LG4pKX19Z2V0UGFkZGluZygpe3JldHVybntsZWZ0OnRoaXMucGFkZGluZ0xlZnR8fDAsdG9wOnRoaXMucGFkZGluZ1RvcHx8MCxyaWdodDp0aGlzLnBhZGRpbmdSaWdodHx8MCxib3R0b206dGhpcy5wYWRkaW5nQm90dG9tfHwwfX1nZXRUaWNrcygpe3JldHVybiB0aGlzLnRpY2tzfWdldExhYmVscygpe2xldCBlPXRoaXMuY2hhcnQuZGF0YTtyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsc3x8KHRoaXMuaXNIb3Jpem9udGFsKCk/ZS54TGFiZWxzOmUueUxhYmVscyl8fGUubGFiZWxzfHxbXX1nZXRMYWJlbEl0ZW1zKGU9dGhpcy5jaGFydC5jaGFydEFyZWEpe3JldHVybiB0aGlzLl9sYWJlbEl0ZW1zfHw9dGhpcy5fY29tcHV0ZUxhYmVsSXRlbXMoZSl9YmVmb3JlTGF5b3V0KCl7dGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMX1iZWZvcmVVcGRhdGUoKXtKKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsW3RoaXNdKX11cGRhdGUoZSx0LG4pe2xldHtiZWdpbkF0WmVybzpyLGdyYWNlOmksdGlja3M6YX09dGhpcy5vcHRpb25zLG89YS5zYW1wbGVTaXplO3RoaXMuYmVmb3JlVXBkYXRlKCksdGhpcy5tYXhXaWR0aD1lLHRoaXMubWF4SGVpZ2h0PXQsdGhpcy5fbWFyZ2lucz1uPU9iamVjdC5hc3NpZ24oe2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfSxuKSx0aGlzLnRpY2tzPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5iZWZvcmVTZXREaW1lbnNpb25zKCksdGhpcy5zZXREaW1lbnNpb25zKCksdGhpcy5hZnRlclNldERpbWVuc2lvbnMoKSx0aGlzLl9tYXhMZW5ndGg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLndpZHRoK24ubGVmdCtuLnJpZ2h0OnRoaXMuaGVpZ2h0K24udG9wK24uYm90dG9tLHRoaXMuX2RhdGFMaW1pdHNDYWNoZWR8fD0odGhpcy5iZWZvcmVEYXRhTGltaXRzKCksdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCksdGhpcy5hZnRlckRhdGFMaW1pdHMoKSx0aGlzLl9yYW5nZT1Lcyh0aGlzLGksciksITApLHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpLHRoaXMudGlja3M9dGhpcy5idWlsZFRpY2tzKCl8fFtdLHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7bGV0IHM9bzx0aGlzLnRpY2tzLmxlbmd0aDt0aGlzLl9jb252ZXJ0VGlja3NUb0xhYmVscyhzP1B1KHRoaXMudGlja3Msbyk6dGhpcy50aWNrcyksdGhpcy5jb25maWd1cmUoKSx0aGlzLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLGEuZGlzcGxheSYmKGEuYXV0b1NraXB8fGEuc291cmNlPT09YGF1dG9gKSYmKHRoaXMudGlja3M9d3UodGhpcyx0aGlzLnRpY2tzKSx0aGlzLl9sYWJlbFNpemVzPW51bGwsdGhpcy5hZnRlckF1dG9Ta2lwKCkpLHMmJnRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRoaXMudGlja3MpLHRoaXMuYmVmb3JlRml0KCksdGhpcy5maXQoKSx0aGlzLmFmdGVyRml0KCksdGhpcy5hZnRlclVwZGF0ZSgpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMub3B0aW9ucy5yZXZlcnNlLHQsbjt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0PXRoaXMubGVmdCxuPXRoaXMucmlnaHQpOih0PXRoaXMudG9wLG49dGhpcy5ib3R0b20sZT0hZSksdGhpcy5fc3RhcnRQaXhlbD10LHRoaXMuX2VuZFBpeGVsPW4sdGhpcy5fcmV2ZXJzZVBpeGVscz1lLHRoaXMuX2xlbmd0aD1uLXQsdGhpcy5fYWxpZ25Ub1BpeGVscz10aGlzLm9wdGlvbnMuYWxpZ25Ub1BpeGVsc31hZnRlclVwZGF0ZSgpe0oodGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlLFt0aGlzXSl9YmVmb3JlU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsW3RoaXNdKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD0wLHRoaXMucmlnaHQ9dGhpcy53aWR0aCk6KHRoaXMuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LHRoaXMudG9wPTAsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdUb3A9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wfWFmdGVyU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucyxbdGhpc10pfV9jYWxsSG9va3MoZSl7dGhpcy5jaGFydC5ub3RpZnlQbHVnaW5zKGUsdGhpcy5nZXRDb250ZXh0KCkpLEoodGhpcy5vcHRpb25zW2VdLFt0aGlzXSl9YmVmb3JlRGF0YUxpbWl0cygpe3RoaXMuX2NhbGxIb29rcyhgYmVmb3JlRGF0YUxpbWl0c2ApfWRldGVybWluZURhdGFMaW1pdHMoKXt9YWZ0ZXJEYXRhTGltaXRzKCl7dGhpcy5fY2FsbEhvb2tzKGBhZnRlckRhdGFMaW1pdHNgKX1iZWZvcmVCdWlsZFRpY2tzKCl7dGhpcy5fY2FsbEhvb2tzKGBiZWZvcmVCdWlsZFRpY2tzYCl9YnVpbGRUaWNrcygpe3JldHVybltdfWFmdGVyQnVpbGRUaWNrcygpe3RoaXMuX2NhbGxIb29rcyhgYWZ0ZXJCdWlsZFRpY2tzYCl9YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCl7Sih0aGlzLm9wdGlvbnMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9Z2VuZXJhdGVUaWNrTGFiZWxzKGUpe2xldCB0PXRoaXMub3B0aW9ucy50aWNrcyxuLHIsaTtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpPWVbbl0saS5sYWJlbD1KKHQuY2FsbGJhY2ssW2kudmFsdWUsbixlXSx0aGlzKX1hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpe0oodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9YmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpe0oodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1jYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPU51KHRoaXMudGlja3MubGVuZ3RoLGUudGlja3MubWF4VGlja3NMaW1pdCkscj10Lm1pblJvdGF0aW9ufHwwLGk9dC5tYXhSb3RhdGlvbixhPXIsbyxzLGM7aWYoIXRoaXMuX2lzVmlzaWJsZSgpfHwhdC5kaXNwbGF5fHxyPj1pfHxuPD0xfHwhdGhpcy5pc0hvcml6b250YWwoKSl7dGhpcy5sYWJlbFJvdGF0aW9uPXI7cmV0dXJufWxldCBsPXRoaXMuX2dldExhYmVsU2l6ZXMoKSx1PWwud2lkZXN0LndpZHRoLGQ9bC5oaWdoZXN0LmhlaWdodCxmPVJvKHRoaXMuY2hhcnQud2lkdGgtdSwwLHRoaXMubWF4V2lkdGgpO289ZS5vZmZzZXQ/dGhpcy5tYXhXaWR0aC9uOmYvKG4tMSksdSs2Pm8mJihvPWYvKG4tKGUub2Zmc2V0Py41OjEpKSxzPXRoaXMubWF4SGVpZ2h0LUx1KGUuZ3JpZCktdC5wYWRkaW5nLVJ1KGUudGl0bGUsdGhpcy5jaGFydC5vcHRpb25zLmZvbnQpLGM9TWF0aC5zcXJ0KHUqdStkKmQpLGE9TW8oTWF0aC5taW4oTWF0aC5hc2luKFJvKChsLmhpZ2hlc3QuaGVpZ2h0KzYpL28sLTEsMSkpLE1hdGguYXNpbihSbyhzL2MsLTEsMSkpLU1hdGguYXNpbihSbyhkL2MsLTEsMSkpKSksYT1NYXRoLm1heChyLE1hdGgubWluKGksYSkpKSx0aGlzLmxhYmVsUm90YXRpb249YX1hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKXtKKHRoaXMub3B0aW9ucy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1hZnRlckF1dG9Ta2lwKCl7fWJlZm9yZUZpdCgpe0oodGhpcy5vcHRpb25zLmJlZm9yZUZpdCxbdGhpc10pfWZpdCgpe2xldCBlPXt3aWR0aDowLGhlaWdodDowfSx7Y2hhcnQ6dCxvcHRpb25zOnt0aWNrczpuLHRpdGxlOnIsZ3JpZDppfX09dGhpcyxhPXRoaXMuX2lzVmlzaWJsZSgpLG89dGhpcy5pc0hvcml6b250YWwoKTtpZihhKXtsZXQgYT1SdShyLHQub3B0aW9ucy5mb250KTtpZihvPyhlLndpZHRoPXRoaXMubWF4V2lkdGgsZS5oZWlnaHQ9THUoaSkrYSk6KGUuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LGUud2lkdGg9THUoaSkrYSksbi5kaXNwbGF5JiZ0aGlzLnRpY2tzLmxlbmd0aCl7bGV0e2ZpcnN0OnQsbGFzdDpyLHdpZGVzdDppLGhpZ2hlc3Q6YX09dGhpcy5fZ2V0TGFiZWxTaXplcygpLHM9bi5wYWRkaW5nKjIsYz1qbyh0aGlzLmxhYmVsUm90YXRpb24pLGw9TWF0aC5jb3MoYyksdT1NYXRoLnNpbihjKTtpZihvKXtsZXQgdD1uLm1pcnJvcj8wOnUqaS53aWR0aCtsKmEuaGVpZ2h0O2UuaGVpZ2h0PU1hdGgubWluKHRoaXMubWF4SGVpZ2h0LGUuaGVpZ2h0K3Qrcyl9ZWxzZXtsZXQgdD1uLm1pcnJvcj8wOmwqaS53aWR0aCt1KmEuaGVpZ2h0O2Uud2lkdGg9TWF0aC5taW4odGhpcy5tYXhXaWR0aCxlLndpZHRoK3Qrcyl9dGhpcy5fY2FsY3VsYXRlUGFkZGluZyh0LHIsdSxsKX19dGhpcy5faGFuZGxlTWFyZ2lucygpLG8/KHRoaXMud2lkdGg9dGhpcy5fbGVuZ3RoPXQud2lkdGgtdGhpcy5fbWFyZ2lucy5sZWZ0LXRoaXMuX21hcmdpbnMucmlnaHQsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQpOih0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5fbGVuZ3RoPXQuaGVpZ2h0LXRoaXMuX21hcmdpbnMudG9wLXRoaXMuX21hcmdpbnMuYm90dG9tKX1fY2FsY3VsYXRlUGFkZGluZyhlLHQsbixyKXtsZXR7dGlja3M6e2FsaWduOmkscGFkZGluZzphfSxwb3NpdGlvbjpvfT10aGlzLm9wdGlvbnMscz10aGlzLmxhYmVsUm90YXRpb24hPT0wLGM9byE9PWB0b3BgJiZ0aGlzLmF4aXM9PT1geGA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7bGV0IG89dGhpcy5nZXRQaXhlbEZvclRpY2soMCktdGhpcy5sZWZ0LGw9dGhpcy5yaWdodC10aGlzLmdldFBpeGVsRm9yVGljayh0aGlzLnRpY2tzLmxlbmd0aC0xKSx1PTAsZD0wO3M/Yz8odT1yKmUud2lkdGgsZD1uKnQuaGVpZ2h0KToodT1uKmUuaGVpZ2h0LGQ9cip0LndpZHRoKTppPT09YHN0YXJ0YD9kPXQud2lkdGg6aT09PWBlbmRgP3U9ZS53aWR0aDppIT09YGlubmVyYCYmKHU9ZS53aWR0aC8yLGQ9dC53aWR0aC8yKSx0aGlzLnBhZGRpbmdMZWZ0PU1hdGgubWF4KCh1LW8rYSkqdGhpcy53aWR0aC8odGhpcy53aWR0aC1vKSwwKSx0aGlzLnBhZGRpbmdSaWdodD1NYXRoLm1heCgoZC1sK2EpKnRoaXMud2lkdGgvKHRoaXMud2lkdGgtbCksMCl9ZWxzZXtsZXQgbj10LmhlaWdodC8yLHI9ZS5oZWlnaHQvMjtpPT09YHN0YXJ0YD8obj0wLHI9ZS5oZWlnaHQpOmk9PT1gZW5kYCYmKG49dC5oZWlnaHQscj0wKSx0aGlzLnBhZGRpbmdUb3A9bithLHRoaXMucGFkZGluZ0JvdHRvbT1yK2F9fV9oYW5kbGVNYXJnaW5zKCl7dGhpcy5fbWFyZ2lucyYmKHRoaXMuX21hcmdpbnMubGVmdD1NYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMuX21hcmdpbnMubGVmdCksdGhpcy5fbWFyZ2lucy50b3A9TWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLHRoaXMuX21hcmdpbnMudG9wKSx0aGlzLl9tYXJnaW5zLnJpZ2h0PU1hdGgubWF4KHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMuX21hcmdpbnMucmlnaHQpLHRoaXMuX21hcmdpbnMuYm90dG9tPU1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLl9tYXJnaW5zLmJvdHRvbSkpfWFmdGVyRml0KCl7Sih0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsW3RoaXNdKX1pc0hvcml6b250YWwoKXtsZXR7YXhpczplLHBvc2l0aW9uOnR9PXRoaXMub3B0aW9ucztyZXR1cm4gdD09PWB0b3BgfHx0PT09YGJvdHRvbWB8fGU9PT1geGB9aXNGdWxsU2l6ZSgpe3JldHVybiB0aGlzLm9wdGlvbnMuZnVsbFNpemV9X2NvbnZlcnRUaWNrc1RvTGFiZWxzKGUpe3RoaXMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCksdGhpcy5nZW5lcmF0ZVRpY2tMYWJlbHMoZSk7bGV0IHQsbjtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKylVKGVbdF0ubGFiZWwpJiYoZS5zcGxpY2UodCwxKSxuLS0sdC0tKTt0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCl9X2dldExhYmVsU2l6ZXMoKXtsZXQgZT10aGlzLl9sYWJlbFNpemVzO2lmKCFlKXtsZXQgdD10aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZSxuPXRoaXMudGlja3M7dDxuLmxlbmd0aCYmKG49UHUobix0KSksdGhpcy5fbGFiZWxTaXplcz1lPXRoaXMuX2NvbXB1dGVMYWJlbFNpemVzKG4sbi5sZW5ndGgsdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpfXJldHVybiBlfV9jb21wdXRlTGFiZWxTaXplcyhlLHQsbil7bGV0e2N0eDpyLF9sb25nZXN0VGV4dENhY2hlOml9PXRoaXMsYT1bXSxvPVtdLHM9TWF0aC5mbG9vcih0L051KHQsbikpLGM9MCxsPTAsdSxkLGYscCxtLGgsZyxfLHYseSxiO2Zvcih1PTA7dTx0O3UrPXMpe2lmKHA9ZVt1XS5sYWJlbCxtPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnModSksci5mb250PWg9bS5zdHJpbmcsZz1pW2hdPWlbaF18fHtkYXRhOnt9LGdjOltdfSxfPW0ubGluZUhlaWdodCx2PXk9MCwhVShwKSYmIVcocCkpdj13cyhyLGcuZGF0YSxnLmdjLHYscCkseT1fO2Vsc2UgaWYoVyhwKSlmb3IoZD0wLGY9cC5sZW5ndGg7ZDxmOysrZCliPXBbZF0sIVUoYikmJiFXKGIpJiYodj13cyhyLGcuZGF0YSxnLmdjLHYsYikseSs9Xyk7YS5wdXNoKHYpLG8ucHVzaCh5KSxjPU1hdGgubWF4KHYsYyksbD1NYXRoLm1heCh5LGwpfUl1KGksdCk7bGV0IHg9YS5pbmRleE9mKGMpLFM9by5pbmRleE9mKGwpLEM9ZT0+KHt3aWR0aDphW2VdfHwwLGhlaWdodDpvW2VdfHwwfSk7cmV0dXJue2ZpcnN0OkMoMCksbGFzdDpDKHQtMSksd2lkZXN0OkMoeCksaGlnaGVzdDpDKFMpLHdpZHRoczphLGhlaWdodHM6b319Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZX1nZXRQaXhlbEZvclZhbHVlKGUsdCl7cmV0dXJuIE5hTn1nZXRWYWx1ZUZvclBpeGVsKGUpe31nZXRQaXhlbEZvclRpY2soZSl7bGV0IHQ9dGhpcy50aWNrcztyZXR1cm4gZTwwfHxlPnQubGVuZ3RoLTE/bnVsbDp0aGlzLmdldFBpeGVsRm9yVmFsdWUodFtlXS52YWx1ZSl9Z2V0UGl4ZWxGb3JEZWNpbWFsKGUpe3RoaXMuX3JldmVyc2VQaXhlbHMmJihlPTEtZSk7bGV0IHQ9dGhpcy5fc3RhcnRQaXhlbCtlKnRoaXMuX2xlbmd0aDtyZXR1cm4gem8odGhpcy5fYWxpZ25Ub1BpeGVscz9Fcyh0aGlzLmNoYXJ0LHQsMCk6dCl9Z2V0RGVjaW1hbEZvclBpeGVsKGUpe2xldCB0PShlLXRoaXMuX3N0YXJ0UGl4ZWwpL3RoaXMuX2xlbmd0aDtyZXR1cm4gdGhpcy5fcmV2ZXJzZVBpeGVscz8xLXQ6dH1nZXRCYXNlUGl4ZWwoKXtyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldEJhc2VWYWx1ZSgpe2xldHttaW46ZSxtYXg6dH09dGhpcztyZXR1cm4gZTwwJiZ0PDA/dDplPjAmJnQ+MD9lOjB9Z2V0Q29udGV4dChlKXtsZXQgdD10aGlzLnRpY2tzfHxbXTtpZihlPj0wJiZlPHQubGVuZ3RoKXtsZXQgbj10W2VdO3JldHVybiBuLiRjb250ZXh0fHw9QnUodGhpcy5nZXRDb250ZXh0KCksZSxuKX1yZXR1cm4gdGhpcy4kY29udGV4dHx8PXp1KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHRoaXMpfV90aWNrU2l6ZSgpe2xldCBlPXRoaXMub3B0aW9ucy50aWNrcyx0PWpvKHRoaXMubGFiZWxSb3RhdGlvbiksbj1NYXRoLmFicyhNYXRoLmNvcyh0KSkscj1NYXRoLmFicyhNYXRoLnNpbih0KSksaT10aGlzLl9nZXRMYWJlbFNpemVzKCksYT1lLmF1dG9Ta2lwUGFkZGluZ3x8MCxvPWk/aS53aWRlc3Qud2lkdGgrYTowLHM9aT9pLmhpZ2hlc3QuaGVpZ2h0K2E6MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT9zKm4+bypyP28vbjpzL3I6cypyPG8qbj9zL246by9yfV9pc1Zpc2libGUoKXtsZXQgZT10aGlzLm9wdGlvbnMuZGlzcGxheTtyZXR1cm4gZT09PWBhdXRvYD90aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCkubGVuZ3RoPjA6ISFlfV9jb21wdXRlR3JpZExpbmVJdGVtcyhlKXtsZXQgdD10aGlzLmF4aXMsbj10aGlzLmNoYXJ0LHI9dGhpcy5vcHRpb25zLHtncmlkOmkscG9zaXRpb246YSxib3JkZXI6b309cixzPWkub2Zmc2V0LGM9dGhpcy5pc0hvcml6b250YWwoKSxsPXRoaXMudGlja3MubGVuZ3RoKyArISFzLHU9THUoaSksZD1bXSxmPW8uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscD1mLmRpc3BsYXk/Zi53aWR0aDowLG09cC8yLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIEVzKG4sZSxwKX0sZyxfLHYseSxiLHgsUyxDLHcsVCxFLEQ7aWYoYT09PWB0b3BgKWc9aCh0aGlzLmJvdHRvbSkseD10aGlzLmJvdHRvbS11LEM9Zy1tLFQ9aChlLnRvcCkrbSxEPWUuYm90dG9tO2Vsc2UgaWYoYT09PWBib3R0b21gKWc9aCh0aGlzLnRvcCksVD1lLnRvcCxEPWgoZS5ib3R0b20pLW0seD1nK20sQz10aGlzLnRvcCt1O2Vsc2UgaWYoYT09PWBsZWZ0YClnPWgodGhpcy5yaWdodCksYj10aGlzLnJpZ2h0LXUsUz1nLW0sdz1oKGUubGVmdCkrbSxFPWUucmlnaHQ7ZWxzZSBpZihhPT09YHJpZ2h0YClnPWgodGhpcy5sZWZ0KSx3PWUubGVmdCxFPWgoZS5yaWdodCktbSxiPWcrbSxTPXRoaXMubGVmdCt1O2Vsc2UgaWYodD09PWB4YCl7aWYoYT09PWBjZW50ZXJgKWc9aCgoZS50b3ArZS5ib3R0b20pLzIrLjUpO2Vsc2UgaWYoRyhhKSl7bGV0IGU9T2JqZWN0LmtleXMoYSlbMF0sdD1hW2VdO2c9aCh0aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpKX1UPWUudG9wLEQ9ZS5ib3R0b20seD1nK20sQz14K3V9ZWxzZSBpZih0PT09YHlgKXtpZihhPT09YGNlbnRlcmApZz1oKChlLmxlZnQrZS5yaWdodCkvMik7ZWxzZSBpZihHKGEpKXtsZXQgZT1PYmplY3Qua2V5cyhhKVswXSx0PWFbZV07Zz1oKHRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCkpfWI9Zy1tLFM9Yi11LHc9ZS5sZWZ0LEU9ZS5yaWdodH1sZXQgTz1xKHIudGlja3MubWF4VGlja3NMaW1pdCxsKSxrPU1hdGgubWF4KDEsTWF0aC5jZWlsKGwvTykpO2ZvcihfPTA7XzxsO18rPWspe2xldCBlPXRoaXMuZ2V0Q29udGV4dChfKSx0PWkuc2V0Q29udGV4dChlKSxyPW8uc2V0Q29udGV4dChlKSxhPXQubGluZVdpZHRoLGw9dC5jb2xvcix1PXIuZGFzaHx8W10sZj1yLmRhc2hPZmZzZXQscD10LnRpY2tXaWR0aCxtPXQudGlja0NvbG9yLGg9dC50aWNrQm9yZGVyRGFzaHx8W10sZz10LnRpY2tCb3JkZXJEYXNoT2Zmc2V0O3Y9RnUodGhpcyxfLHMpLHYhPT12b2lkIDAmJih5PUVzKG4sdixhKSxjP2I9Uz13PUU9eTp4PUM9VD1EPXksZC5wdXNoKHt0eDE6Yix0eTE6eCx0eDI6Uyx0eTI6Qyx4MTp3LHkxOlQseDI6RSx5MjpELHdpZHRoOmEsY29sb3I6bCxib3JkZXJEYXNoOnUsYm9yZGVyRGFzaE9mZnNldDpmLHRpY2tXaWR0aDpwLHRpY2tDb2xvcjptLHRpY2tCb3JkZXJEYXNoOmgsdGlja0JvcmRlckRhc2hPZmZzZXQ6Z30pKX1yZXR1cm4gdGhpcy5fdGlja3NMZW5ndGg9bCx0aGlzLl9ib3JkZXJWYWx1ZT1nLGR9X2NvbXB1dGVMYWJlbEl0ZW1zKGUpe2xldCB0PXRoaXMuYXhpcyxuPXRoaXMub3B0aW9ucyx7cG9zaXRpb246cix0aWNrczppfT1uLGE9dGhpcy5pc0hvcml6b250YWwoKSxvPXRoaXMudGlja3Mse2FsaWduOnMsY3Jvc3NBbGlnbjpjLHBhZGRpbmc6bCxtaXJyb3I6dX09aSxkPUx1KG4uZ3JpZCksZj1kK2wscD11Py1sOmYsbT0tam8odGhpcy5sYWJlbFJvdGF0aW9uKSxoPVtdLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE89YG1pZGRsZWA7aWYocj09PWB0b3BgKXg9dGhpcy5ib3R0b20tcCxTPXRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtlbHNlIGlmKHI9PT1gYm90dG9tYCl4PXRoaXMudG9wK3AsUz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7ZWxzZSBpZihyPT09YGxlZnRgKXtsZXQgZT10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpO1M9ZS50ZXh0QWxpZ24sYj1lLnh9ZWxzZSBpZihyPT09YHJpZ2h0YCl7bGV0IGU9dGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudChkKTtTPWUudGV4dEFsaWduLGI9ZS54fWVsc2UgaWYodD09PWB4YCl7aWYocj09PWBjZW50ZXJgKXg9KGUudG9wK2UuYm90dG9tKS8yK2Y7ZWxzZSBpZihHKHIpKXtsZXQgZT1PYmplY3Qua2V5cyhyKVswXSx0PXJbZV07eD10aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpK2Z9Uz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl9ZWxzZSBpZih0PT09YHlgKXtpZihyPT09YGNlbnRlcmApYj0oZS5sZWZ0K2UucmlnaHQpLzItZjtlbHNlIGlmKEcocikpe2xldCBlPU9iamVjdC5rZXlzKHIpWzBdLHQ9cltlXTtiPXRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCl9Uz10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpLnRleHRBbGlnbn10PT09YHlgJiYocz09PWBzdGFydGA/Tz1gdG9wYDpzPT09YGVuZGAmJihPPWBib3R0b21gKSk7bGV0IGs9dGhpcy5fZ2V0TGFiZWxTaXplcygpO2ZvcihnPTAsXz1vLmxlbmd0aDtnPF87KytnKXt2PW9bZ10seT12LmxhYmVsO2xldCBlPWkuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoZykpO0M9dGhpcy5nZXRQaXhlbEZvclRpY2soZykraS5sYWJlbE9mZnNldCx3PXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZyksVD13LmxpbmVIZWlnaHQsRT1XKHkpP3kubGVuZ3RoOjE7bGV0IHQ9RS8yLG49ZS5jb2xvcixzPWUudGV4dFN0cm9rZUNvbG9yLGw9ZS50ZXh0U3Ryb2tlV2lkdGgsZD1TO2E/KGI9QyxTPT09YGlubmVyYCYmKGQ9Zz09PV8tMT90aGlzLm9wdGlvbnMucmV2ZXJzZT9gbGVmdGA6YHJpZ2h0YDpnPT09MD90aGlzLm9wdGlvbnMucmV2ZXJzZT9gcmlnaHRgOmBsZWZ0YDpgY2VudGVyYCksRD1yPT09YHRvcGA/Yz09PWBuZWFyYHx8bSE9PTA/LUUqVCtULzI6Yz09PWBjZW50ZXJgPy1rLmhpZ2hlc3QuaGVpZ2h0LzItdCpUK1Q6LWsuaGlnaGVzdC5oZWlnaHQrVC8yOmM9PT1gbmVhcmB8fG0hPT0wP1QvMjpjPT09YGNlbnRlcmA/ay5oaWdoZXN0LmhlaWdodC8yLXQqVDprLmhpZ2hlc3QuaGVpZ2h0LUUqVCx1JiYoRCo9LTEpLG0hPT0wJiYhZS5zaG93TGFiZWxCYWNrZHJvcCYmKGIrPVQvMipNYXRoLnNpbihtKSkpOih4PUMsRD0oMS1FKSpULzIpO2xldCBmO2lmKGUuc2hvd0xhYmVsQmFja2Ryb3Ape2xldCB0PVEoZS5iYWNrZHJvcFBhZGRpbmcpLG49ay5oZWlnaHRzW2ddLHI9ay53aWR0aHNbZ10saT1ELXQudG9wLGE9MC10LmxlZnQ7c3dpdGNoKE8pe2Nhc2VgbWlkZGxlYDppLT1uLzI7YnJlYWs7Y2FzZWBib3R0b21gOmktPW59c3dpdGNoKFMpe2Nhc2VgY2VudGVyYDphLT1yLzI7YnJlYWs7Y2FzZWByaWdodGA6YS09cjticmVhaztjYXNlYGlubmVyYDpnPT09Xy0xP2EtPXI6Zz4wJiYoYS09ci8yKX1mPXtsZWZ0OmEsdG9wOmksd2lkdGg6cit0LndpZHRoLGhlaWdodDpuK3QuaGVpZ2h0LGNvbG9yOmUuYmFja2Ryb3BDb2xvcn19aC5wdXNoKHtsYWJlbDp5LGZvbnQ6dyx0ZXh0T2Zmc2V0OkQsb3B0aW9uczp7cm90YXRpb246bSxjb2xvcjpuLHN0cm9rZUNvbG9yOnMsc3Ryb2tlV2lkdGg6bCx0ZXh0QWxpZ246ZCx0ZXh0QmFzZWxpbmU6Tyx0cmFuc2xhdGlvbjpbYix4XSxiYWNrZHJvcDpmfX0pfXJldHVybiBofV9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl7bGV0e3Bvc2l0aW9uOmUsdGlja3M6dH09dGhpcy5vcHRpb25zO2lmKC1qbyh0aGlzLmxhYmVsUm90YXRpb24pKXJldHVybiBlPT09YHRvcGA/YGxlZnRgOmByaWdodGA7bGV0IG49YGNlbnRlcmA7cmV0dXJuIHQuYWxpZ249PT1gc3RhcnRgP249YGxlZnRgOnQuYWxpZ249PT1gZW5kYD9uPWByaWdodGA6dC5hbGlnbj09PWBpbm5lcmAmJihuPWBpbm5lcmApLG59X2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZSl7bGV0e3Bvc2l0aW9uOnQsdGlja3M6e2Nyb3NzQWxpZ246bixtaXJyb3I6cixwYWRkaW5nOml9fT10aGlzLm9wdGlvbnMsYT10aGlzLl9nZXRMYWJlbFNpemVzKCksbz1lK2kscz1hLndpZGVzdC53aWR0aCxjLGw7cmV0dXJuIHQ9PT1gbGVmdGA/cj8obD10aGlzLnJpZ2h0K2ksbj09PWBuZWFyYD9jPWBsZWZ0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbCs9cy8yKTooYz1gcmlnaHRgLGwrPXMpKToobD10aGlzLnJpZ2h0LW8sbj09PWBuZWFyYD9jPWByaWdodGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwtPXMvMik6KGM9YGxlZnRgLGw9dGhpcy5sZWZ0KSk6dD09PWByaWdodGA/cj8obD10aGlzLmxlZnQraSxuPT09YG5lYXJgP2M9YHJpZ2h0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbC09cy8yKTooYz1gbGVmdGAsbC09cykpOihsPXRoaXMubGVmdCtvLG49PT1gbmVhcmA/Yz1gbGVmdGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwrPXMvMik6KGM9YHJpZ2h0YCxsPXRoaXMucmlnaHQpKTpjPWByaWdodGAse3RleHRBbGlnbjpjLHg6bH19X2NvbXB1dGVMYWJlbEFyZWEoKXtpZih0aGlzLm9wdGlvbnMudGlja3MubWlycm9yKXJldHVybjtsZXQgZT10aGlzLmNoYXJ0LHQ9dGhpcy5vcHRpb25zLnBvc2l0aW9uO2lmKHQ9PT1gbGVmdGB8fHQ9PT1gcmlnaHRgKXJldHVybnt0b3A6MCxsZWZ0OnRoaXMubGVmdCxib3R0b206ZS5oZWlnaHQscmlnaHQ6dGhpcy5yaWdodH07aWYodD09PWB0b3BgfHx0PT09YGJvdHRvbWApcmV0dXJue3RvcDp0aGlzLnRvcCxsZWZ0OjAsYm90dG9tOnRoaXMuYm90dG9tLHJpZ2h0OmUud2lkdGh9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2N0eDplLG9wdGlvbnM6e2JhY2tncm91bmRDb2xvcjp0fSxsZWZ0Om4sdG9wOnIsd2lkdGg6aSxoZWlnaHQ6YX09dGhpczt0JiYoZS5zYXZlKCksZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KG4scixpLGEpLGUucmVzdG9yZSgpKX1nZXRMaW5lV2lkdGhGb3JWYWx1ZShlKXtsZXQgdD10aGlzLm9wdGlvbnMuZ3JpZDtpZighdGhpcy5faXNWaXNpYmxlKCl8fCF0LmRpc3BsYXkpcmV0dXJuIDA7bGV0IG49dGhpcy50aWNrcy5maW5kSW5kZXgodD0+dC52YWx1ZT09PWUpO3JldHVybiBuPj0wP3Quc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobikpLmxpbmVXaWR0aDowfWRyYXdHcmlkKGUpe2xldCB0PXRoaXMub3B0aW9ucy5ncmlkLG49dGhpcy5jdHgscj10aGlzLl9ncmlkTGluZUl0ZW1zfHw9dGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXMoZSksaSxhLG89KGUsdCxyKT0+eyFyLndpZHRofHwhci5jb2xvcnx8KG4uc2F2ZSgpLG4ubGluZVdpZHRoPXIud2lkdGgsbi5zdHJva2VTdHlsZT1yLmNvbG9yLG4uc2V0TGluZURhc2goci5ib3JkZXJEYXNofHxbXSksbi5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQsbi5iZWdpblBhdGgoKSxuLm1vdmVUbyhlLngsZS55KSxuLmxpbmVUbyh0LngsdC55KSxuLnN0cm9rZSgpLG4ucmVzdG9yZSgpKX07aWYodC5kaXNwbGF5KWZvcihpPTAsYT1yLmxlbmd0aDtpPGE7KytpKXtsZXQgZT1yW2ldO3QuZHJhd09uQ2hhcnRBcmVhJiZvKHt4OmUueDEseTplLnkxfSx7eDplLngyLHk6ZS55Mn0sZSksdC5kcmF3VGlja3MmJm8oe3g6ZS50eDEseTplLnR5MX0se3g6ZS50eDIseTplLnR5Mn0se2NvbG9yOmUudGlja0NvbG9yLHdpZHRoOmUudGlja1dpZHRoLGJvcmRlckRhc2g6ZS50aWNrQm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OmUudGlja0JvcmRlckRhc2hPZmZzZXR9KX19ZHJhd0JvcmRlcigpe2xldHtjaGFydDplLGN0eDp0LG9wdGlvbnM6e2JvcmRlcjpuLGdyaWQ6cn19PXRoaXMsaT1uLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLGE9bi5kaXNwbGF5P2kud2lkdGg6MDtpZighYSlyZXR1cm47bGV0IG89ci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoLHM9dGhpcy5fYm9yZGVyVmFsdWUsYyxsLHUsZDt0aGlzLmlzSG9yaXpvbnRhbCgpPyhjPUVzKGUsdGhpcy5sZWZ0LGEpLWEvMixsPUVzKGUsdGhpcy5yaWdodCxvKStvLzIsdT1kPXMpOih1PUVzKGUsdGhpcy50b3AsYSktYS8yLGQ9RXMoZSx0aGlzLmJvdHRvbSxvKStvLzIsYz1sPXMpLHQuc2F2ZSgpLHQubGluZVdpZHRoPWkud2lkdGgsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oYyx1KSx0LmxpbmVUbyhsLGQpLHQuc3Ryb2tlKCksdC5yZXN0b3JlKCl9ZHJhd0xhYmVscyhlKXtpZighdGhpcy5vcHRpb25zLnRpY2tzLmRpc3BsYXkpcmV0dXJuO2xldCB0PXRoaXMuY3R4LG49dGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO24mJmpzKHQsbik7bGV0IHI9dGhpcy5nZXRMYWJlbEl0ZW1zKGUpO2ZvcihsZXQgZSBvZiByKXtsZXQgbj1lLm9wdGlvbnMscj1lLmZvbnQsaT1lLmxhYmVsLGE9ZS50ZXh0T2Zmc2V0O0lzKHQsaSwwLGEscixuKX1uJiZNcyh0KX1kcmF3VGl0bGUoKXtsZXR7Y3R4OmUsb3B0aW9uczp7cG9zaXRpb246dCx0aXRsZTpuLHJldmVyc2U6cn19PXRoaXM7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IGk9JChuLmZvbnQpLGE9UShuLnBhZGRpbmcpLG89bi5hbGlnbixzPWkubGluZUhlaWdodC8yO3Q9PT1gYm90dG9tYHx8dD09PWBjZW50ZXJgfHxHKHQpPyhzKz1hLmJvdHRvbSxXKG4udGV4dCkmJihzKz1pLmxpbmVIZWlnaHQqKG4udGV4dC5sZW5ndGgtMSkpKTpzKz1hLnRvcDtsZXR7dGl0bGVYOmMsdGl0bGVZOmwsbWF4V2lkdGg6dSxyb3RhdGlvbjpkfT1IdSh0aGlzLHMsdCxvKTtJcyhlLG4udGV4dCwwLDAsaSx7Y29sb3I6bi5jb2xvcixtYXhXaWR0aDp1LHJvdGF0aW9uOmQsdGV4dEFsaWduOlZ1KG8sdCxyKSx0ZXh0QmFzZWxpbmU6YG1pZGRsZWAsdHJhbnNsYXRpb246W2MsbF19KX1kcmF3KGUpe3RoaXMuX2lzVmlzaWJsZSgpJiYodGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQoZSksdGhpcy5kcmF3Qm9yZGVyKCksdGhpcy5kcmF3VGl0bGUoKSx0aGlzLmRyYXdMYWJlbHMoZSkpfV9sYXllcnMoKXtsZXQgdD10aGlzLm9wdGlvbnMsbj10LnRpY2tzJiZ0LnRpY2tzLnp8fDAscj1xKHQuZ3JpZCYmdC5ncmlkLnosLTEpLGk9cSh0LmJvcmRlciYmdC5ib3JkZXIueiwwKTtyZXR1cm4hdGhpcy5faXNWaXNpYmxlKCl8fHRoaXMuZHJhdyE9PWUucHJvdG90eXBlLmRyYXc/W3t6Om4sZHJhdzplPT57dGhpcy5kcmF3KGUpfX1dOlt7ejpyLGRyYXc6ZT0+e3RoaXMuZHJhd0JhY2tncm91bmQoKSx0aGlzLmRyYXdHcmlkKGUpLHRoaXMuZHJhd1RpdGxlKCl9fSx7ejppLGRyYXc6KCk9Pnt0aGlzLmRyYXdCb3JkZXIoKX19LHt6Om4sZHJhdzplPT57dGhpcy5kcmF3TGFiZWxzKGUpfX1dfWdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKGUpe2xldCB0PXRoaXMuY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLG49dGhpcy5heGlzK2BBeGlzSURgLHI9W10saSxhO2ZvcihpPTAsYT10Lmxlbmd0aDtpPGE7KytpKXtsZXQgYT10W2ldO2Fbbl09PT10aGlzLmlkJiYoIWV8fGEudHlwZT09PWUpJiZyLnB1c2goYSl9cmV0dXJuIHJ9X3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZSl7cmV0dXJuICQodGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGUpKS5mb250KX1fbWF4RGlnaXRzKCl7bGV0IGU9dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5saW5lSGVpZ2h0O3JldHVybih0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGg6dGhpcy5oZWlnaHQpL2V9fSxXdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5zY29wZT10LHRoaXMub3ZlcnJpZGU9bix0aGlzLml0ZW1zPU9iamVjdC5jcmVhdGUobnVsbCl9aXNGb3JUeXBlKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbCh0aGlzLnR5cGUucHJvdG90eXBlLGUucHJvdG90eXBlKX1yZWdpc3RlcihlKXtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSksbjtxdSh0KSYmKG49dGhpcy5yZWdpc3Rlcih0KSk7bGV0IHI9dGhpcy5pdGVtcyxpPWUuaWQsYT10aGlzLnNjb3BlK2AuYCtpO2lmKCFpKXRocm93IEVycm9yKGBjbGFzcyBkb2VzIG5vdCBoYXZlIGlkOiBgK2UpO3JldHVybiBpIGluIHI/YToocltpXT1lLEd1KGUsYSxuKSx0aGlzLm92ZXJyaWRlJiZaLm92ZXJyaWRlKGUuaWQsZS5vdmVycmlkZXMpLGEpfWdldChlKXtyZXR1cm4gdGhpcy5pdGVtc1tlXX11bnJlZ2lzdGVyKGUpe2xldCB0PXRoaXMuaXRlbXMsbj1lLmlkLHI9dGhpcy5zY29wZTtuIGluIHQmJmRlbGV0ZSB0W25dLHImJm4gaW4gWltyXSYmKGRlbGV0ZSBaW3JdW25dLHRoaXMub3ZlcnJpZGUmJmRlbGV0ZSB5c1tuXSl9fTtmdW5jdGlvbiBHdShlLHQsbil7bGV0IHI9cm8oT2JqZWN0LmNyZWF0ZShudWxsKSxbbj9aLmdldChuKTp7fSxaLmdldCh0KSxlLmRlZmF1bHRzXSk7Wi5zZXQodCxyKSxlLmRlZmF1bHRSb3V0ZXMmJkt1KHQsZS5kZWZhdWx0Um91dGVzKSxlLmRlc2NyaXB0b3JzJiZaLmRlc2NyaWJlKHQsZS5kZXNjcmlwdG9ycyl9ZnVuY3Rpb24gS3UoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49PntsZXQgcj1uLnNwbGl0KGAuYCksaT1yLnBvcCgpLGE9W2VdLmNvbmNhdChyKS5qb2luKGAuYCksbz10W25dLnNwbGl0KGAuYCkscz1vLnBvcCgpLGM9by5qb2luKGAuYCk7Wi5yb3V0ZShhLGksYyxzKX0pfWZ1bmN0aW9uIHF1KGUpe3JldHVybmBpZGBpbiBlJiZgZGVmYXVsdHNgaW4gZX12YXIgSnU9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jb250cm9sbGVycz1uZXcgV3UobGwsYGRhdGFzZXRzYCwhMCksdGhpcy5lbGVtZW50cz1uZXcgV3UoQ3UsYGVsZW1lbnRzYCksdGhpcy5wbHVnaW5zPW5ldyBXdShPYmplY3QsYHBsdWdpbnNgKSx0aGlzLnNjYWxlcz1uZXcgV3UoVXUsYHNjYWxlc2ApLHRoaXMuX3R5cGVkUmVnaXN0cmllcz1bdGhpcy5jb250cm9sbGVycyx0aGlzLnNjYWxlcyx0aGlzLmVsZW1lbnRzXX1hZGQoLi4uZSl7dGhpcy5fZWFjaChgcmVnaXN0ZXJgLGUpfXJlbW92ZSguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlKX1hZGRDb250cm9sbGVycyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1hZGRFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmVsZW1lbnRzKX1hZGRQbHVnaW5zKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMucGx1Z2lucyl9YWRkU2NhbGVzKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1nZXRDb250cm9sbGVyKGUpe3JldHVybiB0aGlzLl9nZXQoZSx0aGlzLmNvbnRyb2xsZXJzLGBjb250cm9sbGVyYCl9Z2V0RWxlbWVudChlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5lbGVtZW50cyxgZWxlbWVudGApfWdldFBsdWdpbihlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5wbHVnaW5zLGBwbHVnaW5gKX1nZXRTY2FsZShlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5zY2FsZXMsYHNjYWxlYCl9cmVtb3ZlQ29udHJvbGxlcnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1yZW1vdmVFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuZWxlbWVudHMpfXJlbW92ZVBsdWdpbnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLnBsdWdpbnMpfXJlbW92ZVNjYWxlcyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1fZWFjaChlLHQsbil7Wy4uLnRdLmZvckVhY2godD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTtufHxyLmlzRm9yVHlwZSh0KXx8cj09PXRoaXMucGx1Z2lucyYmdC5pZD90aGlzLl9leGVjKGUscix0KTpZKHQsdD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTt0aGlzLl9leGVjKGUscix0KX0pfSl9X2V4ZWMoZSx0LG4pe2xldCByPXVvKGUpO0oobltgYmVmb3JlYCtyXSxbXSxuKSx0W2VdKG4pLEoobltgYWZ0ZXJgK3JdLFtdLG4pfV9nZXRSZWdpc3RyeUZvclR5cGUoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLl90eXBlZFJlZ2lzdHJpZXMubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5fdHlwZWRSZWdpc3RyaWVzW3RdO2lmKG4uaXNGb3JUeXBlKGUpKXJldHVybiBufXJldHVybiB0aGlzLnBsdWdpbnN9X2dldChlLHQsbil7bGV0IHI9dC5nZXQoZSk7aWYocj09PXZvaWQgMCl0aHJvdyBFcnJvcihgImArZStgIiBpcyBub3QgYSByZWdpc3RlcmVkIGArbitgLmApO3JldHVybiByfX0sWXU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9pbml0PXZvaWQgMH1ub3RpZnkoZSx0LG4scil7aWYodD09PWBiZWZvcmVJbml0YCYmKHRoaXMuX2luaXQ9dGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoZSwhMCksdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsZSxgaW5zdGFsbGApKSx0aGlzLl9pbml0PT09dm9pZCAwKXJldHVybjtsZXQgaT1yP3RoaXMuX2Rlc2NyaXB0b3JzKGUpLmZpbHRlcihyKTp0aGlzLl9kZXNjcmlwdG9ycyhlKSxhPXRoaXMuX25vdGlmeShpLGUsdCxuKTtyZXR1cm4gdD09PWBhZnRlckRlc3Ryb3lgJiYodGhpcy5fbm90aWZ5KGksZSxgc3RvcGApLHRoaXMuX25vdGlmeSh0aGlzLl9pbml0LGUsYHVuaW5zdGFsbGApLHRoaXMuX2luaXQ9dm9pZCAwKSxhfV9ub3RpZnkoZSx0LG4scil7cnx8PXt9O2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1pLnBsdWdpbixhPWVbbl07aWYoSihhLFt0LHIsaS5vcHRpb25zXSxlKT09PSExJiZyLmNhbmNlbGFibGUpcmV0dXJuITF9cmV0dXJuITB9aW52YWxpZGF0ZSgpe1UodGhpcy5fY2FjaGUpfHwodGhpcy5fb2xkQ2FjaGU9dGhpcy5fY2FjaGUsdGhpcy5fY2FjaGU9dm9pZCAwKX1fZGVzY3JpcHRvcnMoZSl7aWYodGhpcy5fY2FjaGUpcmV0dXJuIHRoaXMuX2NhY2hlO2xldCB0PXRoaXMuX2NhY2hlPXRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGUpO3JldHVybiB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXMoZSksdH1fY3JlYXRlRGVzY3JpcHRvcnMoZSx0KXtsZXQgbj1lJiZlLmNvbmZpZyxyPXEobi5vcHRpb25zJiZuLm9wdGlvbnMucGx1Z2lucyx7fSksaT1YdShuKTtyZXR1cm4gcj09PSExJiYhdD9bXTpRdShlLGkscix0KX1fbm90aWZ5U3RhdGVDaGFuZ2VzKGUpe2xldCB0PXRoaXMuX29sZENhY2hlfHxbXSxuPXRoaXMuX2NhY2hlLHI9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5wbHVnaW4uaWQ9PT10LnBsdWdpbi5pZCkpO3RoaXMuX25vdGlmeShyKHQsbiksZSxgc3RvcGApLHRoaXMuX25vdGlmeShyKG4sdCksZSxgc3RhcnRgKX19O2Z1bmN0aW9uIFh1KGUpe2xldCB0PXt9LG49W10scj1PYmplY3Qua2V5cyhKdS5wbHVnaW5zLml0ZW1zKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKyluLnB1c2goSnUuZ2V0UGx1Z2luKHJbZV0pKTtsZXQgaT1lLnBsdWdpbnN8fFtdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgcj1pW2VdO24uaW5kZXhPZihyKT09PS0xJiYobi5wdXNoKHIpLHRbci5pZF09ITApfXJldHVybntwbHVnaW5zOm4sbG9jYWxJZHM6dH19ZnVuY3Rpb24gWnUoZSx0KXtyZXR1cm4hdCYmZT09PSExP251bGw6ZT09PSEwP3t9OmV9ZnVuY3Rpb24gUXUoZSx7cGx1Z2luczp0LGxvY2FsSWRzOm59LHIsaSl7bGV0IGE9W10sbz1lLmdldENvbnRleHQoKTtmb3IobGV0IHMgb2YgdCl7bGV0IHQ9cy5pZCxjPVp1KHJbdF0saSk7YyE9PW51bGwmJmEucHVzaCh7cGx1Z2luOnMsb3B0aW9uczokdShlLmNvbmZpZyx7cGx1Z2luOnMsbG9jYWw6blt0XX0sYyxvKX0pfXJldHVybiBhfWZ1bmN0aW9uICR1KGUse3BsdWdpbjp0LGxvY2FsOm59LHIsaSl7bGV0IGE9ZS5wbHVnaW5TY29wZUtleXModCksbz1lLmdldE9wdGlvblNjb3BlcyhyLGEpO3JldHVybiBuJiZ0LmRlZmF1bHRzJiZvLnB1c2godC5kZWZhdWx0cyksZS5jcmVhdGVSZXNvbHZlcihvLGksW2BgXSx7c2NyaXB0YWJsZTohMSxpbmRleGFibGU6ITEsYWxsS2V5czohMH0pfWZ1bmN0aW9uIGVkKGUsdCl7bGV0IG49Wi5kYXRhc2V0c1tlXXx8e307cmV0dXJuKCh0LmRhdGFzZXRzfHx7fSlbZV18fHt9KS5pbmRleEF4aXN8fHQuaW5kZXhBeGlzfHxuLmluZGV4QXhpc3x8YHhgfWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZTtyZXR1cm4gZT09PWBfaW5kZXhfYD9uPXQ6ZT09PWBfdmFsdWVfYCYmKG49dD09PWB4YD9geWA6YHhgKSxufWZ1bmN0aW9uIG5kKGUsdCl7cmV0dXJuIGU9PT10P2BfaW5kZXhfYDpgX3ZhbHVlX2B9ZnVuY3Rpb24gcmQoZSl7aWYoZT09PWB4YHx8ZT09PWB5YHx8ZT09PWByYClyZXR1cm4gZX1mdW5jdGlvbiBpZChlKXtpZihlPT09YHRvcGB8fGU9PT1gYm90dG9tYClyZXR1cm5geGA7aWYoZT09PWBsZWZ0YHx8ZT09PWByaWdodGApcmV0dXJuYHlgfWZ1bmN0aW9uIGFkKGUsLi4udCl7aWYocmQoZSkpcmV0dXJuIGU7Zm9yKGxldCBuIG9mIHQpe2xldCB0PW4uYXhpc3x8aWQobi5wb3NpdGlvbil8fGUubGVuZ3RoPjEmJnJkKGVbMF0udG9Mb3dlckNhc2UoKSk7aWYodClyZXR1cm4gdH10aHJvdyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke2V9JyBheGlzLiBQbGVhc2UgcHJvdmlkZSAnYXhpcycgb3IgJ3Bvc2l0aW9uJyBvcHRpb24uYCl9ZnVuY3Rpb24gb2QoZSx0LG4pe2lmKG5bdCtgQXhpc0lEYF09PT1lKXJldHVybntheGlzOnR9fWZ1bmN0aW9uIHNkKGUsdCl7aWYodC5kYXRhJiZ0LmRhdGEuZGF0YXNldHMpe2xldCBuPXQuZGF0YS5kYXRhc2V0cy5maWx0ZXIodD0+dC54QXhpc0lEPT09ZXx8dC55QXhpc0lEPT09ZSk7aWYobi5sZW5ndGgpcmV0dXJuIG9kKGUsYHhgLG5bMF0pfHxvZChlLGB5YCxuWzBdKX1yZXR1cm57fX1mdW5jdGlvbiBjZChlLHQpe2xldCBuPXlzW2UudHlwZV18fHtzY2FsZXM6e319LHI9dC5zY2FsZXN8fHt9LGk9ZWQoZS50eXBlLHQpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCh0PT57bGV0IG89clt0XTtpZighRyhvKSlyZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHt0fWApO2lmKG8uX3Byb3h5KXJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHt0fWApO2xldCBzPWFkKHQsbyxzZCh0LGUpLFouc2NhbGVzW28udHlwZV0pLGM9bmQocyxpKSxsPW4uc2NhbGVzfHx7fTthW3RdPWlvKE9iamVjdC5jcmVhdGUobnVsbCksW3theGlzOnN9LG8sbFtzXSxsW2NdXSl9KSxlLmRhdGEuZGF0YXNldHMuZm9yRWFjaChuPT57bGV0IGk9bi50eXBlfHxlLnR5cGUsbz1uLmluZGV4QXhpc3x8ZWQoaSx0KSxzPSh5c1tpXXx8e30pLnNjYWxlc3x8e307T2JqZWN0LmtleXMocykuZm9yRWFjaChlPT57bGV0IHQ9dGQoZSxvKSxpPW5bdCtgQXhpc0lEYF18fHQ7YVtpXT1hW2ldfHxPYmplY3QuY3JlYXRlKG51bGwpLGlvKGFbaV0sW3theGlzOnR9LHJbaV0sc1tlXV0pfSl9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGU9PntsZXQgdD1hW2VdO2lvKHQsW1ouc2NhbGVzW3QudHlwZV0sWi5zY2FsZV0pfSksYX1mdW5jdGlvbiBsZChlKXtsZXQgdD1lLm9wdGlvbnN8fD17fTt0LnBsdWdpbnM9cSh0LnBsdWdpbnMse30pLHQuc2NhbGVzPWNkKGUsdCl9ZnVuY3Rpb24gdWQoZSl7cmV0dXJuIGV8fD17fSxlLmRhdGFzZXRzPWUuZGF0YXNldHN8fFtdLGUubGFiZWxzPWUubGFiZWxzfHxbXSxlfWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlfHw9e30sZS5kYXRhPXVkKGUuZGF0YSksbGQoZSksZX12YXIgZmQ9bmV3IE1hcCxwZD1uZXcgU2V0O2Z1bmN0aW9uIG1kKGUsdCl7bGV0IG49ZmQuZ2V0KGUpO3JldHVybiBufHwobj10KCksZmQuc2V0KGUsbikscGQuYWRkKG4pKSxufXZhciBoZD0oZSx0LG4pPT57bGV0IHI9bG8odCxuKTtyIT09dm9pZCAwJiZlLmFkZChyKX0sZ2Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fY29uZmlnPWRkKGUpLHRoaXMuX3Njb3BlQ2FjaGU9bmV3IE1hcCx0aGlzLl9yZXNvbHZlckNhY2hlPW5ldyBNYXB9Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5wbGF0Zm9ybX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl9jb25maWcudHlwZX1zZXQgdHlwZShlKXt0aGlzLl9jb25maWcudHlwZT1lfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuX2NvbmZpZy5kYXRhPXVkKGUpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuX2NvbmZpZy5vcHRpb25zPWV9Z2V0IHBsdWdpbnMoKXtyZXR1cm4gdGhpcy5fY29uZmlnLnBsdWdpbnN9dXBkYXRlKCl7bGV0IGU9dGhpcy5fY29uZmlnO3RoaXMuY2xlYXJDYWNoZSgpLGxkKGUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9zY29wZUNhY2hlLmNsZWFyKCksdGhpcy5fcmVzb2x2ZXJDYWNoZS5jbGVhcigpfWRhdGFzZXRTY29wZUtleXMoZSl7cmV0dXJuIG1kKGUsKCk9PltbYGRhdGFzZXRzLiR7ZX1gLGBgXV0pfWRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0udHJhbnNpdGlvbi4ke3R9YCwoKT0+W1tgZGF0YXNldHMuJHtlfS50cmFuc2l0aW9ucy4ke3R9YCxgdHJhbnNpdGlvbnMuJHt0fWBdLFtgZGF0YXNldHMuJHtlfWAsYGBdXSl9ZGF0YXNldEVsZW1lbnRTY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0tJHt0fWAsKCk9PltbYGRhdGFzZXRzLiR7ZX0uZWxlbWVudHMuJHt0fWAsYGRhdGFzZXRzLiR7ZX1gLGBlbGVtZW50cy4ke3R9YCxgYF1dKX1wbHVnaW5TY29wZUtleXMoZSl7bGV0IHQ9ZS5pZCxuPXRoaXMudHlwZTtyZXR1cm4gbWQoYCR7bn0tcGx1Z2luLSR7dH1gLCgpPT5bW2BwbHVnaW5zLiR7dH1gLC4uLmUuYWRkaXRpb25hbE9wdGlvblNjb3Blc3x8W11dXSl9X2NhY2hlZFNjb3BlcyhlLHQpe2xldCBuPXRoaXMuX3Njb3BlQ2FjaGUscj1uLmdldChlKTtyZXR1cm4oIXJ8fHQpJiYocj1uZXcgTWFwLG4uc2V0KGUscikpLHJ9Z2V0T3B0aW9uU2NvcGVzKGUsdCxuKXtsZXR7b3B0aW9uczpyLHR5cGU6aX09dGhpcyxhPXRoaXMuX2NhY2hlZFNjb3BlcyhlLG4pLG89YS5nZXQodCk7aWYobylyZXR1cm4gbztsZXQgcz1uZXcgU2V0O3QuZm9yRWFjaCh0PT57ZSYmKHMuYWRkKGUpLHQuZm9yRWFjaCh0PT5oZChzLGUsdCkpKSx0LmZvckVhY2goZT0+aGQocyxyLGUpKSx0LmZvckVhY2goZT0+aGQocyx5c1tpXXx8e30sZSkpLHQuZm9yRWFjaChlPT5oZChzLFosZSkpLHQuZm9yRWFjaChlPT5oZChzLGJzLGUpKX0pO2xldCBjPUFycmF5LmZyb20ocyk7cmV0dXJuIGMubGVuZ3RoPT09MCYmYy5wdXNoKE9iamVjdC5jcmVhdGUobnVsbCkpLHBkLmhhcyh0KSYmYS5zZXQodCxjKSxjfWNoYXJ0T3B0aW9uU2NvcGVzKCl7bGV0e29wdGlvbnM6ZSx0eXBlOnR9PXRoaXM7cmV0dXJuW2UseXNbdF18fHt9LFouZGF0YXNldHNbdF18fHt9LHt0eXBlOnR9LFosYnNdfXJlc29sdmVOYW1lZE9wdGlvbnMoZSx0LG4scj1bYGBdKXtsZXQgaT17JHNoYXJlZDohMH0se3Jlc29sdmVyOmEsc3ViUHJlZml4ZXM6b309X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLHIpLHM9YTtpZih5ZChhLHQpKXtpLiRzaGFyZWQ9ITEsbj1wbyhuKT9uKCk6bjtsZXQgdD10aGlzLmNyZWF0ZVJlc29sdmVyKGUsbixvKTtzPVlzKGEsbix0KX1mb3IobGV0IGUgb2YgdClpW2VdPXNbZV07cmV0dXJuIGl9Y3JlYXRlUmVzb2x2ZXIoZSx0LG49W2BgXSxyKXtsZXR7cmVzb2x2ZXI6aX09X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLG4pO3JldHVybiBHKHQpP1lzKGksdCx2b2lkIDAscik6aX19O2Z1bmN0aW9uIF9kKGUsdCxuKXtsZXQgcj1lLmdldCh0KTtyfHwocj1uZXcgTWFwLGUuc2V0KHQscikpO2xldCBpPW4uam9pbigpLGE9ci5nZXQoaSk7cmV0dXJuIGF8fChhPXtyZXNvbHZlcjpKcyh0LG4pLHN1YlByZWZpeGVzOm4uZmlsdGVyKGU9PiFlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYGhvdmVyYCkpfSxyLnNldChpLGEpKSxhfXZhciB2ZD1lPT5HKGUpJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5zb21lKHQ9PnBvKGVbdF0pKTtmdW5jdGlvbiB5ZChlLHQpe2xldHtpc1NjcmlwdGFibGU6bixpc0luZGV4YWJsZTpyfT1YcyhlKTtmb3IobGV0IGkgb2YgdCl7bGV0IHQ9bihpKSxhPXIoaSksbz0oYXx8dCkmJmVbaV07aWYodCYmKHBvKG8pfHx2ZChvKSl8fGEmJlcobykpcmV0dXJuITB9cmV0dXJuITF9dmFyIGJkPWA0LjUuMWAseGQ9W2B0b3BgLGBib3R0b21gLGBsZWZ0YCxgcmlnaHRgLGBjaGFydEFyZWFgXTtmdW5jdGlvbiBTZChlLHQpe3JldHVybiBlPT09YHRvcGB8fGU9PT1gYm90dG9tYHx8eGQuaW5kZXhPZihlKT09PS0xJiZ0PT09YHhgfWZ1bmN0aW9uIENkKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bZV09PT1yW2VdP25bdF0tclt0XTpuW2VdLXJbZV19fWZ1bmN0aW9uIHdkKGUpe2xldCB0PWUuY2hhcnQsbj10Lm9wdGlvbnMuYW5pbWF0aW9uO3Qubm90aWZ5UGx1Z2lucyhgYWZ0ZXJSZW5kZXJgKSxKKG4mJm4ub25Db21wbGV0ZSxbZV0sdCl9ZnVuY3Rpb24gVGQoZSl7bGV0IHQ9ZS5jaGFydCxuPXQub3B0aW9ucy5hbmltYXRpb247SihuJiZuLm9uUHJvZ3Jlc3MsW2VdLHQpfWZ1bmN0aW9uIEVkKGUpe3JldHVybiBwYygpJiZ0eXBlb2YgZT09YHN0cmluZ2A/ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplJiZlLmxlbmd0aCYmKGU9ZVswXSksZSYmZS5jYW52YXMmJihlPWUuY2FudmFzKSxlfXZhciBEZD17fSxPZD1lPT57bGV0IHQ9RWQoZSk7cmV0dXJuIE9iamVjdC52YWx1ZXMoRGQpLmZpbHRlcihlPT5lLmNhbnZhcz09PXQpLnBvcCgpfTtmdW5jdGlvbiBrZChlLHQsbil7bGV0IHI9T2JqZWN0LmtleXMoZSk7Zm9yKGxldCBpIG9mIHIpe2xldCByPStpO2lmKHI+PXQpe2xldCBhPWVbaV07ZGVsZXRlIGVbaV0sKG4+MHx8cj50KSYmKGVbcituXT1hKX19fWZ1bmN0aW9uIEFkKGUsdCxuLHIpe3JldHVybiFufHxlLnR5cGU9PT1gbW91c2VvdXRgP251bGw6cj90OmV9dmFyIGpkPWNsYXNze3N0YXRpYyBkZWZhdWx0cz1aO3N0YXRpYyBpbnN0YW5jZXM9RGQ7c3RhdGljIG92ZXJyaWRlcz15cztzdGF0aWMgcmVnaXN0cnk9SnU7c3RhdGljIHZlcnNpb249YmQ7c3RhdGljIGdldENoYXJ0PU9kO3N0YXRpYyByZWdpc3RlciguLi5lKXtKdS5hZGQoLi4uZSksTWQoKX1zdGF0aWMgdW5yZWdpc3RlciguLi5lKXtKdS5yZW1vdmUoLi4uZSksTWQoKX1jb25zdHJ1Y3RvcihlLHQpe2xldCBuPXRoaXMuY29uZmlnPW5ldyBnZCh0KSxyPUVkKGUpLGk9T2Qocik7aWYoaSl0aHJvdyBFcnJvcihgQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEICdgK2kuaWQrYCcgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjYW52YXMgd2l0aCBJRCAnYCtpLmNhbnZhcy5pZCtgJyBjYW4gYmUgcmV1c2VkLmApO2xldCBhPW4uY3JlYXRlUmVzb2x2ZXIobi5jaGFydE9wdGlvblNjb3BlcygpLHRoaXMuZ2V0Q29udGV4dCgpKTt0aGlzLnBsYXRmb3JtPW5ldyhuLnBsYXRmb3JtfHwoU3UocikpKSx0aGlzLnBsYXRmb3JtLnVwZGF0ZUNvbmZpZyhuKTtsZXQgbz10aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KHIsYS5hc3BlY3RSYXRpbykscz1vJiZvLmNhbnZhcyxjPXMmJnMuaGVpZ2h0LGw9cyYmcy53aWR0aDtpZih0aGlzLmlkPVhhKCksdGhpcy5jdHg9byx0aGlzLmNhbnZhcz1zLHRoaXMud2lkdGg9bCx0aGlzLmhlaWdodD1jLHRoaXMuX29wdGlvbnM9YSx0aGlzLl9hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHRoaXMuX2xheWVycz1bXSx0aGlzLl9tZXRhc2V0cz1bXSx0aGlzLl9zdGFja3M9dm9pZCAwLHRoaXMuYm94ZXM9W10sdGhpcy5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz12b2lkIDAsdGhpcy5jaGFydEFyZWE9dm9pZCAwLHRoaXMuX2FjdGl2ZT1bXSx0aGlzLl9sYXN0RXZlbnQ9dm9pZCAwLHRoaXMuX2xpc3RlbmVycz17fSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zb3J0ZWRNZXRhc2V0cz1bXSx0aGlzLnNjYWxlcz17fSx0aGlzLl9wbHVnaW5zPW5ldyBZdSx0aGlzLiRwcm94aWVzPXt9LHRoaXMuX2hpZGRlbkluZGljZXM9e30sdGhpcy5hdHRhY2hlZD0hMSx0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQ9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX2RvUmVzaXplPVpvKGU9PnRoaXMudXBkYXRlKGUpLGEucmVzaXplRGVsYXl8fDApLHRoaXMuX2RhdGFDaGFuZ2VzPVtdLERkW3RoaXMuaWRdPXRoaXMsIW98fCFzKXtjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNoYXJ0OiBjYW4ndCBhY3F1aXJlIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gaXRlbWApO3JldHVybn1MYy5saXN0ZW4odGhpcyxgY29tcGxldGVgLHdkKSxMYy5saXN0ZW4odGhpcyxgcHJvZ3Jlc3NgLFRkKSx0aGlzLl9pbml0aWFsaXplKCksdGhpcy5hdHRhY2hlZCYmdGhpcy51cGRhdGUoKX1nZXQgYXNwZWN0UmF0aW8oKXtsZXR7b3B0aW9uczp7YXNwZWN0UmF0aW86ZSxtYWludGFpbkFzcGVjdFJhdGlvOnR9LHdpZHRoOm4saGVpZ2h0OnIsX2FzcGVjdFJhdGlvOml9PXRoaXM7cmV0dXJuIFUoZSk/dCYmaT9pOnI/bi9yOm51bGw6ZX1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmNvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuY29uZmlnLmRhdGE9ZX1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuY29uZmlnLm9wdGlvbnM9ZX1nZXQgcmVnaXN0cnkoKXtyZXR1cm4gSnV9X2luaXRpYWxpemUoKXtyZXR1cm4gdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVJbml0YCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5yZXNpemUoKTpFYyh0aGlzLHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmJpbmRFdmVudHMoKSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVySW5pdGApLHRoaXN9Y2xlYXIoKXtyZXR1cm4gRHModGhpcy5jYW52YXMsdGhpcy5jdHgpLHRoaXN9c3RvcCgpe3JldHVybiBMYy5zdG9wKHRoaXMpLHRoaXN9cmVzaXplKGUsdCl7TGMucnVubmluZyh0aGlzKT90aGlzLl9yZXNpemVCZWZvcmVEcmF3PXt3aWR0aDplLGhlaWdodDp0fTp0aGlzLl9yZXNpemUoZSx0KX1fcmVzaXplKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLHI9dGhpcy5jYW52YXMsaT1uLm1haW50YWluQXNwZWN0UmF0aW8mJnRoaXMuYXNwZWN0UmF0aW8sYT10aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKHIsZSx0LGkpLG89bi5kZXZpY2VQaXhlbFJhdGlvfHx0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKSxzPXRoaXMud2lkdGg/YHJlc2l6ZWA6YGF0dGFjaGA7dGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuX2FzcGVjdFJhdGlvPXRoaXMuYXNwZWN0UmF0aW8sRWModGhpcyxvLCEwKSYmKHRoaXMubm90aWZ5UGx1Z2lucyhgcmVzaXplYCx7c2l6ZTphfSksSihuLm9uUmVzaXplLFt0aGlzLGFdLHRoaXMpLHRoaXMuYXR0YWNoZWQmJnRoaXMuX2RvUmVzaXplKHMpJiZ0aGlzLnJlbmRlcigpKX1lbnN1cmVTY2FsZXNIYXZlSURzKCl7WSh0aGlzLm9wdGlvbnMuc2NhbGVzfHx7fSwoZSx0KT0+e2UuaWQ9dH0pfWJ1aWxkT3JVcGRhdGVTY2FsZXMoKXtsZXQgZT10aGlzLm9wdGlvbnMsdD1lLnNjYWxlcyxuPXRoaXMuc2NhbGVzLHI9T2JqZWN0LmtleXMobikucmVkdWNlKChlLHQpPT4oZVt0XT0hMSxlKSx7fSksaT1bXTt0JiYoaT1pLmNvbmNhdChPYmplY3Qua2V5cyh0KS5tYXAoZT0+e2xldCBuPXRbZV0scj1hZChlLG4pLGk9cj09PWByYCxhPXI9PT1geGA7cmV0dXJue29wdGlvbnM6bixkcG9zaXRpb246aT9gY2hhcnRBcmVhYDphP2Bib3R0b21gOmBsZWZ0YCxkdHlwZTppP2ByYWRpYWxMaW5lYXJgOmE/YGNhdGVnb3J5YDpgbGluZWFyYH19KSkpLFkoaSx0PT57bGV0IGk9dC5vcHRpb25zLGE9aS5pZCxvPWFkKGEsaSkscz1xKGkudHlwZSx0LmR0eXBlKTsoaS5wb3NpdGlvbj09PXZvaWQgMHx8U2QoaS5wb3NpdGlvbixvKSE9PVNkKHQuZHBvc2l0aW9uKSkmJihpLnBvc2l0aW9uPXQuZHBvc2l0aW9uKSxyW2FdPSEwO2xldCBjPW51bGw7YSBpbiBuJiZuW2FdLnR5cGU9PT1zP2M9blthXTooYz1uZXcoSnUuZ2V0U2NhbGUocykpKHtpZDphLHR5cGU6cyxjdHg6dGhpcy5jdHgsY2hhcnQ6dGhpc30pLG5bYy5pZF09YyksYy5pbml0KGksZSl9KSxZKHIsKGUsdCk9PntlfHxkZWxldGUgblt0XX0pLFkobixlPT57JGwuY29uZmlndXJlKHRoaXMsZSxlLm9wdGlvbnMpLCRsLmFkZEJveCh0aGlzLGUpfSl9X3VwZGF0ZU1ldGFzZXRzKCl7bGV0IGU9dGhpcy5fbWV0YXNldHMsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49ZS5sZW5ndGg7aWYoZS5zb3J0KChlLHQpPT5lLmluZGV4LXQuaW5kZXgpLG4+dCl7Zm9yKGxldCBlPXQ7ZTxuOysrZSl0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoZSk7ZS5zcGxpY2UodCxuLXQpfXRoaXMuX3NvcnRlZE1ldGFzZXRzPWUuc2xpY2UoMCkuc29ydChDZChgb3JkZXJgLGBpbmRleGApKX1fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKXtsZXR7X21ldGFzZXRzOmUsZGF0YTp7ZGF0YXNldHM6dH19PXRoaXM7ZS5sZW5ndGg+dC5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9zdGFja3MsZS5mb3JFYWNoKChlLG4pPT57dC5maWx0ZXIodD0+dD09PWUuX2RhdGFzZXQpLmxlbmd0aD09PTAmJnRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShuKX0pfWJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpe2xldCBlPVtdLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLG4scjtmb3IodGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtsZXQgcj10W25dLGk9dGhpcy5nZXREYXRhc2V0TWV0YShuKSxhPXIudHlwZXx8dGhpcy5jb25maWcudHlwZTtpZihpLnR5cGUmJmkudHlwZSE9PWEmJih0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEobiksaT10aGlzLmdldERhdGFzZXRNZXRhKG4pKSxpLnR5cGU9YSxpLmluZGV4QXhpcz1yLmluZGV4QXhpc3x8ZWQoYSx0aGlzLm9wdGlvbnMpLGkub3JkZXI9ci5vcmRlcnx8MCxpLmluZGV4PW4saS5sYWJlbD1gYCtyLmxhYmVsLGkudmlzaWJsZT10aGlzLmlzRGF0YXNldFZpc2libGUobiksaS5jb250cm9sbGVyKWkuY29udHJvbGxlci51cGRhdGVJbmRleChuKSxpLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO2Vsc2V7bGV0IHQ9SnUuZ2V0Q29udHJvbGxlcihhKSx7ZGF0YXNldEVsZW1lbnRUeXBlOnIsZGF0YUVsZW1lbnRUeXBlOm99PVouZGF0YXNldHNbYV07T2JqZWN0LmFzc2lnbih0LHtkYXRhRWxlbWVudFR5cGU6SnUuZ2V0RWxlbWVudChvKSxkYXRhc2V0RWxlbWVudFR5cGU6ciYmSnUuZ2V0RWxlbWVudChyKX0pLGkuY29udHJvbGxlcj1uZXcgdCh0aGlzLG4pLGUucHVzaChpLmNvbnRyb2xsZXIpfX1yZXR1cm4gdGhpcy5fdXBkYXRlTWV0YXNldHMoKSxlfV9yZXNldEVsZW1lbnRzKCl7WSh0aGlzLmRhdGEuZGF0YXNldHMsKGUsdCk9Pnt0aGlzLmdldERhdGFzZXRNZXRhKHQpLmNvbnRyb2xsZXIucmVzZXQoKX0sdGhpcyl9cmVzZXQoKXt0aGlzLl9yZXNldEVsZW1lbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKGByZXNldGApfXVwZGF0ZShlKXtsZXQgdD10aGlzLmNvbmZpZzt0LnVwZGF0ZSgpO2xldCBuPXRoaXMuX29wdGlvbnM9dC5jcmVhdGVSZXNvbHZlcih0LmNoYXJ0T3B0aW9uU2NvcGVzKCksdGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSFuLmFuaW1hdGlvbjtpZih0aGlzLl91cGRhdGVTY2FsZXMoKSx0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKSx0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCksdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCksdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVVcGRhdGVgLHttb2RlOmUsY2FuY2VsYWJsZTohMH0pPT09ITEpcmV0dXJuO2xldCBpPXRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVFbGVtZW50c1VwZGF0ZWApO2xldCBhPTA7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDtlKyspe2xldHtjb250cm9sbGVyOnR9PXRoaXMuZ2V0RGF0YXNldE1ldGEoZSksbj0hciYmaS5pbmRleE9mKHQpPT09LTE7dC5idWlsZE9yVXBkYXRlRWxlbWVudHMobiksYT1NYXRoLm1heCgrdC5nZXRNYXhPdmVyZmxvdygpLGEpfWE9dGhpcy5fbWluUGFkZGluZz1uLmxheW91dC5hdXRvUGFkZGluZz9hOjAsdGhpcy5fdXBkYXRlTGF5b3V0KGEpLHJ8fFkoaSxlPT57ZS5yZXNldCgpfSksdGhpcy5fdXBkYXRlRGF0YXNldHMoZSksdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlclVwZGF0ZWAse21vZGU6ZX0pLHRoaXMuX2xheWVycy5zb3J0KENkKGB6YCxgX2lkeGApKTtsZXR7X2FjdGl2ZTpvLF9sYXN0RXZlbnQ6c309dGhpcztzP3RoaXMuX2V2ZW50SGFuZGxlcihzLCEwKTpvLmxlbmd0aCYmdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMobyxvLCEwKSx0aGlzLnJlbmRlcigpfV91cGRhdGVTY2FsZXMoKXtZKHRoaXMuc2NhbGVzLGU9PnskbC5yZW1vdmVCb3godGhpcyxlKX0pLHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpLHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpfV9jaGVja0V2ZW50QmluZGluZ3MoKXtsZXQgZT10aGlzLm9wdGlvbnM7KCFtbyhuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpLG5ldyBTZXQoZS5ldmVudHMpKXx8ISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzIT09ZS5yZXNwb25zaXZlKSYmKHRoaXMudW5iaW5kRXZlbnRzKCksdGhpcy5iaW5kRXZlbnRzKCkpfV91cGRhdGVIaWRkZW5JbmRpY2VzKCl7bGV0e19oaWRkZW5JbmRpY2VzOmV9PXRoaXMsdD10aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXx8W107Zm9yKGxldHttZXRob2Q6bixzdGFydDpyLGNvdW50Oml9b2YgdClrZChlLHIsbj09PWBfcmVtb3ZlRWxlbWVudHNgPy1pOmkpfV9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXtsZXQgZT10aGlzLl9kYXRhQ2hhbmdlcztpZighZXx8IWUubGVuZ3RoKXJldHVybjt0aGlzLl9kYXRhQ2hhbmdlcz1bXTtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49dD0+bmV3IFNldChlLmZpbHRlcihlPT5lWzBdPT09dCkubWFwKChlLHQpPT50K2AsYCtlLnNwbGljZSgxKS5qb2luKGAsYCkpKSxyPW4oMCk7Zm9yKGxldCBlPTE7ZTx0O2UrKylpZighbW8ocixuKGUpKSlyZXR1cm47cmV0dXJuIEFycmF5LmZyb20ocikubWFwKGU9PmUuc3BsaXQoYCxgKSkubWFwKGU9Pih7bWV0aG9kOmVbMV0sc3RhcnQ6K2VbMl0sY291bnQ6K2VbM119KSl9X3VwZGF0ZUxheW91dChlKXtpZih0aGlzLm5vdGlmeVBsdWdpbnMoYGJlZm9yZUxheW91dGAse2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjskbC51cGRhdGUodGhpcyx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LGUpO2xldCB0PXRoaXMuY2hhcnRBcmVhLG49dC53aWR0aDw9MHx8dC5oZWlnaHQ8PTA7dGhpcy5fbGF5ZXJzPVtdLFkodGhpcy5ib3hlcyxlPT57biYmZS5wb3NpdGlvbj09PWBjaGFydEFyZWFgfHwoZS5jb25maWd1cmUmJmUuY29uZmlndXJlKCksdGhpcy5fbGF5ZXJzLnB1c2goLi4uZS5fbGF5ZXJzKCkpKX0sdGhpcyksdGhpcy5fbGF5ZXJzLmZvckVhY2goKGUsdCk9PntlLl9pZHg9dH0pLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJMYXlvdXRgKX1fdXBkYXRlRGF0YXNldHMoZSl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZSxjYW5jZWxhYmxlOiEwfSkhPT0hMSl7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDsrK2UpdGhpcy5nZXREYXRhc2V0TWV0YShlKS5jb250cm9sbGVyLmNvbmZpZ3VyZSgpO2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDt0PG47Kyt0KXRoaXMuX3VwZGF0ZURhdGFzZXQodCxwbyhlKT9lKHtkYXRhc2V0SW5kZXg6dH0pOmUpO3RoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZX0pfX1fdXBkYXRlRGF0YXNldChlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSkscj17bWV0YTpuLGluZGV4OmUsbW9kZTp0LGNhbmNlbGFibGU6ITB9O3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRGF0YXNldFVwZGF0ZWAscikhPT0hMSYmKG4uY29udHJvbGxlci5fdXBkYXRlKHQpLHIuY2FuY2VsYWJsZT0hMSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVyRGF0YXNldFVwZGF0ZWAscikpfXJlbmRlcigpe3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlUmVuZGVyYCx7Y2FuY2VsYWJsZTohMH0pIT09ITEmJihMYy5oYXModGhpcyk/dGhpcy5hdHRhY2hlZCYmIUxjLnJ1bm5pbmcodGhpcykmJkxjLnN0YXJ0KHRoaXMpOih0aGlzLmRyYXcoKSx3ZCh7Y2hhcnQ6dGhpc30pKSl9ZHJhdygpe2xldCBlO2lmKHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcpe2xldHt3aWR0aDplLGhlaWdodDp0fT10aGlzLl9yZXNpemVCZWZvcmVEcmF3O3RoaXMuX3Jlc2l6ZUJlZm9yZURyYXc9bnVsbCx0aGlzLl9yZXNpemUoZSx0KX1pZih0aGlzLmNsZWFyKCksdGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTB8fHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRHJhd2Ase2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjtsZXQgdD10aGlzLl9sYXllcnM7Zm9yKGU9MDtlPHQubGVuZ3RoJiZ0W2VdLno8PTA7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7Zm9yKHRoaXMuX2RyYXdEYXRhc2V0cygpO2U8dC5sZW5ndGg7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRyYXdgKX1fZ2V0U29ydGVkRGF0YXNldE1ldGFzKGUpe2xldCB0PXRoaXMuX3NvcnRlZE1ldGFzZXRzLG49W10scixpO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKXtsZXQgaT10W3JdOyghZXx8aS52aXNpYmxlKSYmbi5wdXNoKGkpfXJldHVybiBufWdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKXtyZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCEwKX1fZHJhd0RhdGFzZXRzKCl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c0RyYXdgLHtjYW5jZWxhYmxlOiEwfSk9PT0hMSlyZXR1cm47bGV0IGU9dGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5fZHJhd0RhdGFzZXQoZVt0XSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXRzRHJhd2ApfV9kcmF3RGF0YXNldChlKXtsZXQgdD10aGlzLmN0eCxuPXttZXRhOmUsaW5kZXg6ZS5pbmRleCxjYW5jZWxhYmxlOiEwfSxyPUljKHRoaXMsZSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0RHJhd2AsbikhPT0hMSYmKHImJmpzKHQsciksZS5jb250cm9sbGVyLmRyYXcoKSxyJiZNcyh0KSxuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXREcmF3YCxuKSl9aXNQb2ludEluQXJlYShlKXtyZXR1cm4gQXMoZSx0aGlzLmNoYXJ0QXJlYSx0aGlzLl9taW5QYWRkaW5nKX1nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsdCxuLHIpe2xldCBpPUlsLm1vZGVzW3RdO3JldHVybiB0eXBlb2YgaT09YGZ1bmN0aW9uYD9pKHRoaXMsZSxuLHIpOltdfWdldERhdGFzZXRNZXRhKGUpe2xldCB0PXRoaXMuZGF0YS5kYXRhc2V0c1tlXSxuPXRoaXMuX21ldGFzZXRzLHI9bi5maWx0ZXIoZT0+ZSYmZS5fZGF0YXNldD09PXQpLnBvcCgpO3JldHVybiByfHwocj17dHlwZTpudWxsLGRhdGE6W10sZGF0YXNldDpudWxsLGNvbnRyb2xsZXI6bnVsbCxoaWRkZW46bnVsbCx4QXhpc0lEOm51bGwseUF4aXNJRDpudWxsLG9yZGVyOnQmJnQub3JkZXJ8fDAsaW5kZXg6ZSxfZGF0YXNldDp0LF9wYXJzZWQ6W10sX3NvcnRlZDohMX0sbi5wdXNoKHIpKSxyfWdldENvbnRleHQoKXtyZXR1cm4gdGhpcy4kY29udGV4dHx8PXFzKG51bGwse2NoYXJ0OnRoaXMsdHlwZTpgY2hhcnRgfSl9Z2V0VmlzaWJsZURhdGFzZXRDb3VudCgpe3JldHVybiB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5sZW5ndGh9aXNEYXRhc2V0VmlzaWJsZShlKXtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHNbZV07aWYoIXQpcmV0dXJuITE7bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtyZXR1cm4gdHlwZW9mIG4uaGlkZGVuPT1gYm9vbGVhbmA/IW4uaGlkZGVuOiF0LmhpZGRlbn1zZXREYXRhc2V0VmlzaWJpbGl0eShlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSk7bi5oaWRkZW49IXR9dG9nZ2xlRGF0YVZpc2liaWxpdHkoZSl7dGhpcy5faGlkZGVuSW5kaWNlc1tlXT0hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1nZXREYXRhVmlzaWJpbGl0eShlKXtyZXR1cm4hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1fdXBkYXRlVmlzaWJpbGl0eShlLHQsbil7bGV0IHI9bj9gc2hvd2A6YGhpZGVgLGk9dGhpcy5nZXREYXRhc2V0TWV0YShlKSxhPWkuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModm9pZCAwLHIpO2ZvKHQpPyhpLmRhdGFbdF0uaGlkZGVuPSFuLHRoaXMudXBkYXRlKCkpOih0aGlzLnNldERhdGFzZXRWaXNpYmlsaXR5KGUsbiksYS51cGRhdGUoaSx7dmlzaWJsZTpufSksdGhpcy51cGRhdGUodD0+dC5kYXRhc2V0SW5kZXg9PT1lP3I6dm9pZCAwKSl9aGlkZShlLHQpe3RoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZSx0LCExKX1zaG93KGUsdCl7dGhpcy5fdXBkYXRlVmlzaWJpbGl0eShlLHQsITApfV9kZXN0cm95RGF0YXNldE1ldGEoZSl7bGV0IHQ9dGhpcy5fbWV0YXNldHNbZV07dCYmdC5jb250cm9sbGVyJiZ0LmNvbnRyb2xsZXIuX2Rlc3Ryb3koKSxkZWxldGUgdGhpcy5fbWV0YXNldHNbZV19X3N0b3AoKXtsZXQgZSx0O2Zvcih0aGlzLnN0b3AoKSxMYy5yZW1vdmUodGhpcyksZT0wLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtlPHQ7KytlKXRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShlKX1kZXN0cm95KCl7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEZXN0cm95YCk7bGV0e2NhbnZhczplLGN0eDp0fT10aGlzO3RoaXMuX3N0b3AoKSx0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCksZSYmKHRoaXMudW5iaW5kRXZlbnRzKCksRHMoZSx0KSx0aGlzLnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0KHQpLHRoaXMuY2FudmFzPW51bGwsdGhpcy5jdHg9bnVsbCksZGVsZXRlIERkW3RoaXMuaWRdLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEZXN0cm95YCl9dG9CYXNlNjRJbWFnZSguLi5lKXtyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmUpfWJpbmRFdmVudHMoKXt0aGlzLmJpbmRVc2VyRXZlbnRzKCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpOnRoaXMuYXR0YWNoZWQ9ITB9YmluZFVzZXJFdmVudHMoKXtsZXQgZT10aGlzLl9saXN0ZW5lcnMsdD10aGlzLnBsYXRmb3JtLG49KG4scik9Pnt0LmFkZEV2ZW50TGlzdGVuZXIodGhpcyxuLHIpLGVbbl09cn0scj0oZSx0LG4pPT57ZS5vZmZzZXRYPXQsZS5vZmZzZXRZPW4sdGhpcy5fZXZlbnRIYW5kbGVyKGUpfTtZKHRoaXMub3B0aW9ucy5ldmVudHMsZT0+bihlLHIpKX1iaW5kUmVzcG9uc2l2ZUV2ZW50cygpe3RoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnN8fD17fTtsZXQgZT10aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLHQ9dGhpcy5wbGF0Zm9ybSxuPShuLHIpPT57dC5hZGRFdmVudExpc3RlbmVyKHRoaXMsbixyKSxlW25dPXJ9LHI9KG4scik9PntlW25dJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsbixyKSxkZWxldGUgZVtuXSl9LGk9KGUsdCk9Pnt0aGlzLmNhbnZhcyYmdGhpcy5yZXNpemUoZSx0KX0sYSxvPSgpPT57cihgYXR0YWNoYCxvKSx0aGlzLmF0dGFjaGVkPSEwLHRoaXMucmVzaXplKCksbihgcmVzaXplYCxpKSxuKGBkZXRhY2hgLGEpfTthPSgpPT57dGhpcy5hdHRhY2hlZD0hMSxyKGByZXNpemVgLGkpLHRoaXMuX3N0b3AoKSx0aGlzLl9yZXNpemUoMCwwKSxuKGBhdHRhY2hgLG8pfSx0LmlzQXR0YWNoZWQodGhpcy5jYW52YXMpP28oKTphKCl9dW5iaW5kRXZlbnRzKCl7WSh0aGlzLl9saXN0ZW5lcnMsKGUsdCk9Pnt0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyx0LGUpfSksdGhpcy5fbGlzdGVuZXJzPXt9LFkodGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycywoZSx0KT0+e3RoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLHQsZSl9KSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMH11cGRhdGVIb3ZlclN0eWxlKGUsdCxuKXtsZXQgcj1uP2BzZXRgOmByZW1vdmVgLGksYSxvLHM7Zm9yKHQ9PT1gZGF0YXNldGAmJihpPXRoaXMuZ2V0RGF0YXNldE1ldGEoZVswXS5kYXRhc2V0SW5kZXgpLGkuY29udHJvbGxlcltgX2ArcitgRGF0YXNldEhvdmVyU3R5bGVgXSgpKSxvPTAscz1lLmxlbmd0aDtvPHM7KytvKXthPWVbb107bGV0IHQ9YSYmdGhpcy5nZXREYXRhc2V0TWV0YShhLmRhdGFzZXRJbmRleCkuY29udHJvbGxlcjt0JiZ0W3IrYEhvdmVyU3R5bGVgXShhLmVsZW1lbnQsYS5kYXRhc2V0SW5kZXgsYS5pbmRleCl9fWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSl7bGV0IHQ9dGhpcy5fYWN0aXZlfHxbXSxuPWUubWFwKCh7ZGF0YXNldEluZGV4OmUsaW5kZXg6dH0pPT57bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtpZighbil0aHJvdyBFcnJvcihgTm8gZGF0YXNldCBmb3VuZCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pOyRhKG4sdCl8fCh0aGlzLl9hY3RpdmU9bix0aGlzLl9sYXN0RXZlbnQ9bnVsbCx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhuLHQpKX1ub3RpZnlQbHVnaW5zKGUsdCxuKXtyZXR1cm4gdGhpcy5fcGx1Z2lucy5ub3RpZnkodGhpcyxlLHQsbil9aXNQbHVnaW5FbmFibGVkKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIodD0+dC5wbHVnaW4uaWQ9PT1lKS5sZW5ndGg9PT0xfV91cGRhdGVIb3ZlclN0eWxlcyhlLHQsbil7bGV0IHI9dGhpcy5vcHRpb25zLmhvdmVyLGk9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgpKSxhPWkodCxlKSxvPW4/ZTppKGUsdCk7YS5sZW5ndGgmJnRoaXMudXBkYXRlSG92ZXJTdHlsZShhLHIubW9kZSwhMSksby5sZW5ndGgmJnIubW9kZSYmdGhpcy51cGRhdGVIb3ZlclN0eWxlKG8sci5tb2RlLCEwKX1fZXZlbnRIYW5kbGVyKGUsdCl7bGV0IG49e2V2ZW50OmUscmVwbGF5OnQsY2FuY2VsYWJsZTohMCxpbkNoYXJ0QXJlYTp0aGlzLmlzUG9pbnRJbkFyZWEoZSl9LHI9dD0+KHQub3B0aW9ucy5ldmVudHN8fHRoaXMub3B0aW9ucy5ldmVudHMpLmluY2x1ZGVzKGUubmF0aXZlLnR5cGUpO2lmKHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRXZlbnRgLG4scik9PT0hMSlyZXR1cm47bGV0IGk9dGhpcy5faGFuZGxlRXZlbnQoZSx0LG4uaW5DaGFydEFyZWEpO3JldHVybiBuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckV2ZW50YCxuLHIpLChpfHxuLmNoYW5nZWQpJiZ0aGlzLnJlbmRlcigpLHRoaXN9X2hhbmRsZUV2ZW50KGUsdCxuKXtsZXR7X2FjdGl2ZTpyPVtdLG9wdGlvbnM6aX09dGhpcyxhPXQsbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLHIsbixhKSxzPWhvKGUpLGM9QWQoZSx0aGlzLl9sYXN0RXZlbnQsbixzKTtuJiYodGhpcy5fbGFzdEV2ZW50PW51bGwsSihpLm9uSG92ZXIsW2Usbyx0aGlzXSx0aGlzKSxzJiZKKGkub25DbGljayxbZSxvLHRoaXNdLHRoaXMpKTtsZXQgbD0hJGEobyxyKTtyZXR1cm4obHx8dCkmJih0aGlzLl9hY3RpdmU9byx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhvLHIsdCkpLHRoaXMuX2xhc3RFdmVudD1jLGx9X2dldEFjdGl2ZUVsZW1lbnRzKGUsdCxuLHIpe2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIW4pcmV0dXJuIHQ7bGV0IGk9dGhpcy5vcHRpb25zLmhvdmVyO3JldHVybiB0aGlzLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxyKX19O2Z1bmN0aW9uIE1kKCl7cmV0dXJuIFkoamQuaW5zdGFuY2VzLGU9PmUuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKX1mdW5jdGlvbiBOZChlLHQpe2xldHt4Om4seTpyLGJhc2U6aSx3aWR0aDphLGhlaWdodDpvfT1lLmdldFByb3BzKFtgeGAsYHlgLGBiYXNlYCxgd2lkdGhgLGBoZWlnaHRgXSx0KSxzLGMsbCx1LGQ7cmV0dXJuIGUuaG9yaXpvbnRhbD8oZD1vLzIscz1NYXRoLm1pbihuLGkpLGM9TWF0aC5tYXgobixpKSxsPXItZCx1PXIrZCk6KGQ9YS8yLHM9bi1kLGM9bitkLGw9TWF0aC5taW4ocixpKSx1PU1hdGgubWF4KHIsaSkpLHtsZWZ0OnMsdG9wOmwscmlnaHQ6Yyxib3R0b206dX19ZnVuY3Rpb24gUGQoZSx0LG4scil7cmV0dXJuIGU/MDpSbyh0LG4scil9ZnVuY3Rpb24gRmQoZSx0LG4pe2xldCByPWUub3B0aW9ucy5ib3JkZXJXaWR0aCxpPWUuYm9yZGVyU2tpcHBlZCxhPVVzKHIpO3JldHVybnt0OlBkKGkudG9wLGEudG9wLDAsbikscjpQZChpLnJpZ2h0LGEucmlnaHQsMCx0KSxiOlBkKGkuYm90dG9tLGEuYm90dG9tLDAsbiksbDpQZChpLmxlZnQsYS5sZWZ0LDAsdCl9fWZ1bmN0aW9uIElkKGUsdCxuKXtsZXR7ZW5hYmxlQm9yZGVyUmFkaXVzOnJ9PWUuZ2V0UHJvcHMoW2BlbmFibGVCb3JkZXJSYWRpdXNgXSksaT1lLm9wdGlvbnMuYm9yZGVyUmFkaXVzLGE9V3MoaSksbz1NYXRoLm1pbih0LG4pLHM9ZS5ib3JkZXJTa2lwcGVkLGM9cnx8RyhpKTtyZXR1cm57dG9wTGVmdDpQZCghY3x8cy50b3B8fHMubGVmdCxhLnRvcExlZnQsMCxvKSx0b3BSaWdodDpQZCghY3x8cy50b3B8fHMucmlnaHQsYS50b3BSaWdodCwwLG8pLGJvdHRvbUxlZnQ6UGQoIWN8fHMuYm90dG9tfHxzLmxlZnQsYS5ib3R0b21MZWZ0LDAsbyksYm90dG9tUmlnaHQ6UGQoIWN8fHMuYm90dG9tfHxzLnJpZ2h0LGEuYm90dG9tUmlnaHQsMCxvKX19ZnVuY3Rpb24gTGQoZSl7bGV0IHQ9TmQoZSksbj10LnJpZ2h0LXQubGVmdCxyPXQuYm90dG9tLXQudG9wLGk9RmQoZSxuLzIsci8yKSxhPUlkKGUsbi8yLHIvMik7cmV0dXJue291dGVyOnt4OnQubGVmdCx5OnQudG9wLHc6bixoOnIscmFkaXVzOmF9LGlubmVyOnt4OnQubGVmdCtpLmwseTp0LnRvcCtpLnQsdzpuLWkubC1pLnIsaDpyLWkudC1pLmIscmFkaXVzOnt0b3BMZWZ0Ok1hdGgubWF4KDAsYS50b3BMZWZ0LU1hdGgubWF4KGkudCxpLmwpKSx0b3BSaWdodDpNYXRoLm1heCgwLGEudG9wUmlnaHQtTWF0aC5tYXgoaS50LGkucikpLGJvdHRvbUxlZnQ6TWF0aC5tYXgoMCxhLmJvdHRvbUxlZnQtTWF0aC5tYXgoaS5iLGkubCkpLGJvdHRvbVJpZ2h0Ok1hdGgubWF4KDAsYS5ib3R0b21SaWdodC1NYXRoLm1heChpLmIsaS5yKSl9fX19ZnVuY3Rpb24gUmQoZSx0LG4scil7bGV0IGk9dD09PW51bGwsYT1uPT09bnVsbCxvPWUmJiEoaSYmYSkmJk5kKGUscik7cmV0dXJuIG8mJihpfHxCbyh0LG8ubGVmdCxvLnJpZ2h0KSkmJihhfHxCbyhuLG8udG9wLG8uYm90dG9tKSl9ZnVuY3Rpb24gemQoZSl7cmV0dXJuIGUudG9wTGVmdHx8ZS50b3BSaWdodHx8ZS5ib3R0b21MZWZ0fHxlLmJvdHRvbVJpZ2h0fWZ1bmN0aW9uIEJkKGUsdCl7ZS5yZWN0KHQueCx0LnksdC53LHQuaCl9ZnVuY3Rpb24gVmQoZSx0LG49e30pe2xldCByPWUueD09PW4ueD8wOi10LGk9ZS55PT09bi55PzA6LXQsYT0oZS54K2Uudz09PW4ueCtuLnc/MDp0KS1yLG89KGUueStlLmg9PT1uLnkrbi5oPzA6dCktaTtyZXR1cm57eDplLngrcix5OmUueStpLHc6ZS53K2EsaDplLmgrbyxyYWRpdXM6ZS5yYWRpdXN9fXZhciBIZD1jbGFzcyBleHRlbmRzIEN1e3N0YXRpYyBpZD1gYmFyYDtzdGF0aWMgZGVmYXVsdHM9e2JvcmRlclNraXBwZWQ6YHN0YXJ0YCxib3JkZXJXaWR0aDowLGJvcmRlclJhZGl1czowLGluZmxhdGVBbW91bnQ6YGF1dG9gLHBvaW50U3R5bGU6dm9pZCAwfTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17YmFja2dyb3VuZENvbG9yOmBiYWNrZ3JvdW5kQ29sb3JgLGJvcmRlckNvbG9yOmBib3JkZXJDb2xvcmB9O2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLmhvcml6b250YWw9dm9pZCAwLHRoaXMuYmFzZT12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMuaW5mbGF0ZUFtb3VudD12b2lkIDAsZSYmT2JqZWN0LmFzc2lnbih0aGlzLGUpfWRyYXcoZSl7bGV0e2luZmxhdGVBbW91bnQ6dCxvcHRpb25zOntib3JkZXJDb2xvcjpuLGJhY2tncm91bmRDb2xvcjpyfX09dGhpcyx7aW5uZXI6aSxvdXRlcjphfT1MZCh0aGlzKSxvPXpkKGEucmFkaXVzKT9MczpCZDtlLnNhdmUoKSwoYS53IT09aS53fHxhLmghPT1pLmgpJiYoZS5iZWdpblBhdGgoKSxvKGUsVmQoYSx0LGkpKSxlLmNsaXAoKSxvKGUsVmQoaSwtdCxhKSksZS5maWxsU3R5bGU9bixlLmZpbGwoYGV2ZW5vZGRgKSksZS5iZWdpblBhdGgoKSxvKGUsVmQoaSx0KSksZS5maWxsU3R5bGU9cixlLmZpbGwoKSxlLnJlc3RvcmUoKX1pblJhbmdlKGUsdCxuKXtyZXR1cm4gUmQodGhpcyxlLHQsbil9aW5YUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxlLG51bGwsdCl9aW5ZUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxudWxsLGUsdCl9Z2V0Q2VudGVyUG9pbnQoZSl7bGV0e3g6dCx5Om4sYmFzZTpyLGhvcml6b250YWw6aX09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YCxgYmFzZWAsYGhvcml6b250YWxgXSxlKTtyZXR1cm57eDppPyh0K3IpLzI6dCx5Omk/bjoobityKS8yfX1nZXRSYW5nZShlKXtyZXR1cm4gZT09PWB4YD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMn19LFVkPShlLHQpPT57bGV0e2JveEhlaWdodDpuPXQsYm94V2lkdGg6cj10fT1lO3JldHVybiBlLnVzZVBvaW50U3R5bGUmJihuPU1hdGgubWluKG4sdCkscj1lLnBvaW50U3R5bGVXaWR0aHx8TWF0aC5taW4ocix0KSkse2JveFdpZHRoOnIsYm94SGVpZ2h0Om4saXRlbUhlaWdodDpNYXRoLm1heCh0LG4pfX0sV2Q9KGUsdCk9PmUhPT1udWxsJiZ0IT09bnVsbCYmZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgsR2Q9Y2xhc3MgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2FkZGVkPSExLHRoaXMubGVnZW5kSGl0Qm94ZXM9W10sdGhpcy5faG92ZXJlZEl0ZW09bnVsbCx0aGlzLmRvdWdobnV0TW9kZT0hMSx0aGlzLmNoYXJ0PWUuY2hhcnQsdGhpcy5vcHRpb25zPWUub3B0aW9ucyx0aGlzLmN0eD1lLmN0eCx0aGlzLmxlZ2VuZEl0ZW1zPXZvaWQgMCx0aGlzLmNvbHVtblNpemVzPXZvaWQgMCx0aGlzLmxpbmVXaWR0aHM9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLm1heFdpZHRoPXZvaWQgMCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuX21hcmdpbnM9dm9pZCAwLHRoaXMucG9zaXRpb249dm9pZCAwLHRoaXMud2VpZ2h0PXZvaWQgMCx0aGlzLmZ1bGxTaXplPXZvaWQgMH11cGRhdGUoZSx0LG4pe3RoaXMubWF4V2lkdGg9ZSx0aGlzLm1heEhlaWdodD10LHRoaXMuX21hcmdpbnM9bix0aGlzLnNldERpbWVuc2lvbnMoKSx0aGlzLmJ1aWxkTGFiZWxzKCksdGhpcy5maXQoKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD10aGlzLl9tYXJnaW5zLmxlZnQsdGhpcy5yaWdodD10aGlzLndpZHRoKToodGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdGhpcy50b3A9dGhpcy5fbWFyZ2lucy50b3AsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpfWJ1aWxkTGFiZWxzKCl7bGV0IGU9dGhpcy5vcHRpb25zLmxhYmVsc3x8e30sdD1KKGUuZ2VuZXJhdGVMYWJlbHMsW3RoaXMuY2hhcnRdLHRoaXMpfHxbXTtlLmZpbHRlciYmKHQ9dC5maWx0ZXIodD0+ZS5maWx0ZXIodCx0aGlzLmNoYXJ0LmRhdGEpKSksZS5zb3J0JiYodD10LnNvcnQoKHQsbik9PmUuc29ydCh0LG4sdGhpcy5jaGFydC5kYXRhKSkpLHRoaXMub3B0aW9ucy5yZXZlcnNlJiZ0LnJldmVyc2UoKSx0aGlzLmxlZ2VuZEl0ZW1zPXR9Zml0KCl7bGV0e29wdGlvbnM6ZSxjdHg6dH09dGhpcztpZighZS5kaXNwbGF5KXt0aGlzLndpZHRoPXRoaXMuaGVpZ2h0PTA7cmV0dXJufWxldCBuPWUubGFiZWxzLHI9JChuLmZvbnQpLGk9ci5zaXplLGE9dGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCkse2JveFdpZHRoOm8saXRlbUhlaWdodDpzfT1VZChuLGkpLGMsbDt0LmZvbnQ9ci5zdHJpbmcsdGhpcy5pc0hvcml6b250YWwoKT8oYz10aGlzLm1heFdpZHRoLGw9dGhpcy5fZml0Um93cyhhLGksbyxzKSsxMCk6KGw9dGhpcy5tYXhIZWlnaHQsYz10aGlzLl9maXRDb2xzKGEscixvLHMpKzEwKSx0aGlzLndpZHRoPU1hdGgubWluKGMsZS5tYXhXaWR0aHx8dGhpcy5tYXhXaWR0aCksdGhpcy5oZWlnaHQ9TWF0aC5taW4obCxlLm1heEhlaWdodHx8dGhpcy5tYXhIZWlnaHQpfV9maXRSb3dzKGUsdCxuLHIpe2xldHtjdHg6aSxtYXhXaWR0aDphLG9wdGlvbnM6e2xhYmVsczp7cGFkZGluZzpvfX19PXRoaXMscz10aGlzLmxlZ2VuZEhpdEJveGVzPVtdLGM9dGhpcy5saW5lV2lkdGhzPVswXSxsPXIrbyx1PWU7aS50ZXh0QWxpZ249YGxlZnRgLGkudGV4dEJhc2VsaW5lPWBtaWRkbGVgO2xldCBkPS0xLGY9LWw7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxwKT0+e2xldCBtPW4rdC8yK2kubWVhc3VyZVRleHQoZS50ZXh0KS53aWR0aDsocD09PTB8fGNbYy5sZW5ndGgtMV0rbSsyKm8+YSkmJih1Kz1sLGNbYy5sZW5ndGgtKHA+MD8wOjEpXT0wLGYrPWwsZCsrKSxzW3BdPXtsZWZ0OjAsdG9wOmYscm93OmQsd2lkdGg6bSxoZWlnaHQ6cn0sY1tjLmxlbmd0aC0xXSs9bStvfSksdX1fZml0Q29scyhlLHQsbixyKXtsZXR7Y3R4OmksbWF4SGVpZ2h0OmEsb3B0aW9uczp7bGFiZWxzOntwYWRkaW5nOm99fX09dGhpcyxzPXRoaXMubGVnZW5kSGl0Qm94ZXM9W10sYz10aGlzLmNvbHVtblNpemVzPVtdLGw9YS1lLHU9byxkPTAsZj0wLHA9MCxtPTA7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxhKT0+e2xldHtpdGVtV2lkdGg6aCxpdGVtSGVpZ2h0Omd9PUtkKG4sdCxpLGUscik7YT4wJiZmK2crMipvPmwmJih1Kz1kK28sYy5wdXNoKHt3aWR0aDpkLGhlaWdodDpmfSkscCs9ZCtvLG0rKyxkPWY9MCksc1thXT17bGVmdDpwLHRvcDpmLGNvbDptLHdpZHRoOmgsaGVpZ2h0Omd9LGQ9TWF0aC5tYXgoZCxoKSxmKz1nK299KSx1Kz1kLGMucHVzaCh7d2lkdGg6ZCxoZWlnaHQ6Zn0pLHV9YWRqdXN0SGl0Qm94ZXMoKXtpZighdGhpcy5vcHRpb25zLmRpc3BsYXkpcmV0dXJuO2xldCBlPXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpLHtsZWdlbmRIaXRCb3hlczp0LG9wdGlvbnM6e2FsaWduOm4sbGFiZWxzOntwYWRkaW5nOnJ9LHJ0bDppfX09dGhpcyxhPWpjKGksdGhpcy5sZWZ0LHRoaXMud2lkdGgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2xldCBpPTAsbz0kbyhuLHRoaXMubGVmdCtyLHRoaXMucmlnaHQtdGhpcy5saW5lV2lkdGhzW2ldKTtmb3IobGV0IHMgb2YgdClpIT09cy5yb3cmJihpPXMucm93LG89JG8obix0aGlzLmxlZnQrcix0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tpXSkpLHMudG9wKz10aGlzLnRvcCtlK3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngobykscy53aWR0aCksbys9cy53aWR0aCtyfWVsc2V7bGV0IGk9MCxvPSRvKG4sdGhpcy50b3ArZStyLHRoaXMuYm90dG9tLXRoaXMuY29sdW1uU2l6ZXNbaV0uaGVpZ2h0KTtmb3IobGV0IHMgb2YgdClzLmNvbCE9PWkmJihpPXMuY29sLG89JG8obix0aGlzLnRvcCtlK3IsdGhpcy5ib3R0b20tdGhpcy5jb2x1bW5TaXplc1tpXS5oZWlnaHQpKSxzLnRvcD1vLHMubGVmdCs9dGhpcy5sZWZ0K3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngocy5sZWZ0KSxzLndpZHRoKSxvKz1zLmhlaWdodCtyfX1pc0hvcml6b250YWwoKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uPT09YHRvcGB8fHRoaXMub3B0aW9ucy5wb3NpdGlvbj09PWBib3R0b21gfWRyYXcoKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSl7bGV0IGU9dGhpcy5jdHg7anMoZSx0aGlzKSx0aGlzLl9kcmF3KCksTXMoZSl9fV9kcmF3KCl7bGV0e29wdGlvbnM6ZSxjb2x1bW5TaXplczp0LGxpbmVXaWR0aHM6bixjdHg6cn09dGhpcyx7YWxpZ246aSxsYWJlbHM6YX09ZSxvPVouY29sb3Iscz1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYz0kKGEuZm9udCkse3BhZGRpbmc6bH09YSx1PWMuc2l6ZSxkPXUvMixmO3RoaXMuZHJhd1RpdGxlKCksci50ZXh0QWxpZ249cy50ZXh0QWxpZ24oYGxlZnRgKSxyLnRleHRCYXNlbGluZT1gbWlkZGxlYCxyLmxpbmVXaWR0aD0uNSxyLmZvbnQ9Yy5zdHJpbmc7bGV0e2JveFdpZHRoOnAsYm94SGVpZ2h0Om0saXRlbUhlaWdodDpofT1VZChhLHUpLGc9ZnVuY3Rpb24oZSx0LG4pe2lmKGlzTmFOKHApfHxwPD0wfHxpc05hTihtKXx8bTwwKXJldHVybjtyLnNhdmUoKTtsZXQgaT1xKG4ubGluZVdpZHRoLDEpO2lmKHIuZmlsbFN0eWxlPXEobi5maWxsU3R5bGUsbyksci5saW5lQ2FwPXEobi5saW5lQ2FwLGBidXR0YCksci5saW5lRGFzaE9mZnNldD1xKG4ubGluZURhc2hPZmZzZXQsMCksci5saW5lSm9pbj1xKG4ubGluZUpvaW4sYG1pdGVyYCksci5saW5lV2lkdGg9aSxyLnN0cm9rZVN0eWxlPXEobi5zdHJva2VTdHlsZSxvKSxyLnNldExpbmVEYXNoKHEobi5saW5lRGFzaCxbXSkpLGEudXNlUG9pbnRTdHlsZSl7bGV0IG89e3JhZGl1czptKk1hdGguU1FSVDIvMixwb2ludFN0eWxlOm4ucG9pbnRTdHlsZSxyb3RhdGlvbjpuLnJvdGF0aW9uLGJvcmRlcldpZHRoOml9LGM9cy54UGx1cyhlLHAvMiksbD10K2Q7a3MocixvLGMsbCxhLnBvaW50U3R5bGVXaWR0aCYmcCl9ZWxzZXtsZXQgYT10K01hdGgubWF4KCh1LW0pLzIsMCksbz1zLmxlZnRGb3JMdHIoZSxwKSxjPVdzKG4uYm9yZGVyUmFkaXVzKTtyLmJlZ2luUGF0aCgpLE9iamVjdC52YWx1ZXMoYykuc29tZShlPT5lIT09MCk/THMocix7eDpvLHk6YSx3OnAsaDptLHJhZGl1czpjfSk6ci5yZWN0KG8sYSxwLG0pLHIuZmlsbCgpLGkhPT0wJiZyLnN0cm9rZSgpfXIucmVzdG9yZSgpfSxfPWZ1bmN0aW9uKGUsdCxuKXtJcyhyLG4udGV4dCxlLHQraC8yLGMse3N0cmlrZXRocm91Z2g6bi5oaWRkZW4sdGV4dEFsaWduOnMudGV4dEFsaWduKG4udGV4dEFsaWduKX0pfSx2PXRoaXMuaXNIb3Jpem9udGFsKCkseT10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtmPXY/e3g6JG8oaSx0aGlzLmxlZnQrbCx0aGlzLnJpZ2h0LW5bMF0pLHk6dGhpcy50b3ArbCt5LGxpbmU6MH06e3g6dGhpcy5sZWZ0K2wseTokbyhpLHRoaXMudG9wK3krbCx0aGlzLmJvdHRvbS10WzBdLmhlaWdodCksbGluZTowfSxNYyh0aGlzLmN0eCxlLnRleHREaXJlY3Rpb24pO2xldCBiPWgrbDt0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKG8sdSk9PntyLnN0cm9rZVN0eWxlPW8uZm9udENvbG9yLHIuZmlsbFN0eWxlPW8uZm9udENvbG9yO2xldCBtPXIubWVhc3VyZVRleHQoby50ZXh0KS53aWR0aCxoPXMudGV4dEFsaWduKG8udGV4dEFsaWdufHw9YS50ZXh0QWxpZ24pLHg9cCtkK20sUz1mLngsQz1mLnk7cy5zZXRXaWR0aCh0aGlzLndpZHRoKSx2P3U+MCYmUyt4K2w+dGhpcy5yaWdodCYmKEM9Zi55Kz1iLGYubGluZSsrLFM9Zi54PSRvKGksdGhpcy5sZWZ0K2wsdGhpcy5yaWdodC1uW2YubGluZV0pKTp1PjAmJkMrYj50aGlzLmJvdHRvbSYmKFM9Zi54PVMrdFtmLmxpbmVdLndpZHRoK2wsZi5saW5lKyssQz1mLnk9JG8oaSx0aGlzLnRvcCt5K2wsdGhpcy5ib3R0b20tdFtmLmxpbmVdLmhlaWdodCkpO2xldCB3PXMueChTKTtpZihnKHcsQyxvKSxTPWVzKGgsUytwK2Qsdj9TK3g6dGhpcy5yaWdodCxlLnJ0bCksXyhzLngoUyksQyxvKSx2KWYueCs9eCtsO2Vsc2UgaWYodHlwZW9mIG8udGV4dCE9YHN0cmluZ2Ape2xldCBlPWMubGluZUhlaWdodDtmLnkrPVlkKG8sZSkrbH1lbHNlIGYueSs9Yn0pLE5jKHRoaXMuY3R4LGUudGV4dERpcmVjdGlvbil9ZHJhd1RpdGxlKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aXRsZSxuPSQodC5mb250KSxyPVEodC5wYWRkaW5nKTtpZighdC5kaXNwbGF5KXJldHVybjtsZXQgaT1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYT10aGlzLmN0eCxvPXQucG9zaXRpb24scz1uLnNpemUvMixjPXIudG9wK3MsbCx1PXRoaXMubGVmdCxkPXRoaXMud2lkdGg7aWYodGhpcy5pc0hvcml6b250YWwoKSlkPU1hdGgubWF4KC4uLnRoaXMubGluZVdpZHRocyksbD10aGlzLnRvcCtjLHU9JG8oZS5hbGlnbix1LHRoaXMucmlnaHQtZCk7ZWxzZXtsZXQgdD10aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoZSx0KT0+TWF0aC5tYXgoZSx0LmhlaWdodCksMCk7bD1jKyRvKGUuYWxpZ24sdGhpcy50b3AsdGhpcy5ib3R0b20tdC1lLmxhYmVscy5wYWRkaW5nLXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKX1sZXQgZj0kbyhvLHUsdStkKTthLnRleHRBbGlnbj1pLnRleHRBbGlnbihRbyhvKSksYS50ZXh0QmFzZWxpbmU9YG1pZGRsZWAsYS5zdHJva2VTdHlsZT10LmNvbG9yLGEuZmlsbFN0eWxlPXQuY29sb3IsYS5mb250PW4uc3RyaW5nLElzKGEsdC50ZXh0LGYsbCxuKX1fY29tcHV0ZVRpdGxlSGVpZ2h0KCl7bGV0IGU9dGhpcy5vcHRpb25zLnRpdGxlLHQ9JChlLmZvbnQpLG49UShlLnBhZGRpbmcpO3JldHVybiBlLmRpc3BsYXk/dC5saW5lSGVpZ2h0K24uaGVpZ2h0OjB9X2dldExlZ2VuZEl0ZW1BdChlLHQpe2xldCBuLHIsaTtpZihCbyhlLHRoaXMubGVmdCx0aGlzLnJpZ2h0KSYmQm8odCx0aGlzLnRvcCx0aGlzLmJvdHRvbSkpe2ZvcihpPXRoaXMubGVnZW5kSGl0Qm94ZXMsbj0wO248aS5sZW5ndGg7KytuKWlmKHI9aVtuXSxCbyhlLHIubGVmdCxyLmxlZnQrci53aWR0aCkmJkJvKHQsci50b3Asci50b3Arci5oZWlnaHQpKXJldHVybiB0aGlzLmxlZ2VuZEl0ZW1zW25dfXJldHVybiBudWxsfWhhbmRsZUV2ZW50KGUpe2xldCB0PXRoaXMub3B0aW9ucztpZighWGQoZS50eXBlLHQpKXJldHVybjtsZXQgbj10aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LGUueSk7aWYoZS50eXBlPT09YG1vdXNlbW92ZWB8fGUudHlwZT09PWBtb3VzZW91dGApe2xldCByPXRoaXMuX2hvdmVyZWRJdGVtLGk9V2QocixuKTtyJiYhaSYmSih0Lm9uTGVhdmUsW2Uscix0aGlzXSx0aGlzKSx0aGlzLl9ob3ZlcmVkSXRlbT1uLG4mJiFpJiZKKHQub25Ib3ZlcixbZSxuLHRoaXNdLHRoaXMpfWVsc2UgbiYmSih0Lm9uQ2xpY2ssW2Usbix0aGlzXSx0aGlzKX19O2Z1bmN0aW9uIEtkKGUsdCxuLHIsaSl7cmV0dXJue2l0ZW1XaWR0aDpxZChyLGUsdCxuKSxpdGVtSGVpZ2h0OkpkKGkscix0LmxpbmVIZWlnaHQpfX1mdW5jdGlvbiBxZChlLHQsbixyKXtsZXQgaT1lLnRleHQ7cmV0dXJuIGkmJnR5cGVvZiBpIT1gc3RyaW5nYCYmKGk9aS5yZWR1Y2UoKGUsdCk9PmUubGVuZ3RoPnQubGVuZ3RoP2U6dCkpLHQrbi5zaXplLzIrci5tZWFzdXJlVGV4dChpKS53aWR0aH1mdW5jdGlvbiBKZChlLHQsbil7bGV0IHI9ZTtyZXR1cm4gdHlwZW9mIHQudGV4dCE9YHN0cmluZ2AmJihyPVlkKHQsbikpLHJ9ZnVuY3Rpb24gWWQoZSx0KXtyZXR1cm4gdCooZS50ZXh0P2UudGV4dC5sZW5ndGg6MCl9ZnVuY3Rpb24gWGQoZSx0KXtyZXR1cm4hISgoZT09PWBtb3VzZW1vdmVgfHxlPT09YG1vdXNlb3V0YCkmJih0Lm9uSG92ZXJ8fHQub25MZWF2ZSl8fHQub25DbGljayYmKGU9PT1gY2xpY2tgfHxlPT09YG1vdXNldXBgKSl9dmFyIFpkPXtpZDpgbGVnZW5kYCxfZWxlbWVudDpHZCxzdGFydChlLHQsbil7bGV0IHI9ZS5sZWdlbmQ9bmV3IEdkKHtjdHg6ZS5jdHgsb3B0aW9uczpuLGNoYXJ0OmV9KTskbC5jb25maWd1cmUoZSxyLG4pLCRsLmFkZEJveChlLHIpfSxzdG9wKGUpeyRsLnJlbW92ZUJveChlLGUubGVnZW5kKSxkZWxldGUgZS5sZWdlbmR9LGJlZm9yZVVwZGF0ZShlLHQsbil7bGV0IHI9ZS5sZWdlbmQ7JGwuY29uZmlndXJlKGUscixuKSxyLm9wdGlvbnM9bn0sYWZ0ZXJVcGRhdGUoZSl7bGV0IHQ9ZS5sZWdlbmQ7dC5idWlsZExhYmVscygpLHQuYWRqdXN0SGl0Qm94ZXMoKX0sYWZ0ZXJFdmVudChlLHQpe3QucmVwbGF5fHxlLmxlZ2VuZC5oYW5kbGVFdmVudCh0LmV2ZW50KX0sZGVmYXVsdHM6e2Rpc3BsYXk6ITAscG9zaXRpb246YHRvcGAsYWxpZ246YGNlbnRlcmAsZnVsbFNpemU6ITAscmV2ZXJzZTohMSx3ZWlnaHQ6MWUzLG9uQ2xpY2soZSx0LG4pe2xldCByPXQuZGF0YXNldEluZGV4LGk9bi5jaGFydDtpLmlzRGF0YXNldFZpc2libGUocik/KGkuaGlkZShyKSx0LmhpZGRlbj0hMCk6KGkuc2hvdyhyKSx0LmhpZGRlbj0hMSl9LG9uSG92ZXI6bnVsbCxvbkxlYXZlOm51bGwsbGFiZWxzOntjb2xvcjplPT5lLmNoYXJ0Lm9wdGlvbnMuY29sb3IsYm94V2lkdGg6NDAscGFkZGluZzoxMCxnZW5lcmF0ZUxhYmVscyhlKXtsZXQgdD1lLmRhdGEuZGF0YXNldHMse2xhYmVsczp7dXNlUG9pbnRTdHlsZTpuLHBvaW50U3R5bGU6cix0ZXh0QWxpZ246aSxjb2xvcjphLHVzZUJvcmRlclJhZGl1czpvLGJvcmRlclJhZGl1czpzfX09ZS5sZWdlbmQub3B0aW9ucztyZXR1cm4gZS5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCkubWFwKGU9PntsZXQgYz1lLmNvbnRyb2xsZXIuZ2V0U3R5bGUobj8wOnZvaWQgMCksbD1RKGMuYm9yZGVyV2lkdGgpO3JldHVybnt0ZXh0OnRbZS5pbmRleF0ubGFiZWwsZmlsbFN0eWxlOmMuYmFja2dyb3VuZENvbG9yLGZvbnRDb2xvcjphLGhpZGRlbjohZS52aXNpYmxlLGxpbmVDYXA6Yy5ib3JkZXJDYXBTdHlsZSxsaW5lRGFzaDpjLmJvcmRlckRhc2gsbGluZURhc2hPZmZzZXQ6Yy5ib3JkZXJEYXNoT2Zmc2V0LGxpbmVKb2luOmMuYm9yZGVySm9pblN0eWxlLGxpbmVXaWR0aDoobC53aWR0aCtsLmhlaWdodCkvNCxzdHJva2VTdHlsZTpjLmJvcmRlckNvbG9yLHBvaW50U3R5bGU6cnx8Yy5wb2ludFN0eWxlLHJvdGF0aW9uOmMucm90YXRpb24sdGV4dEFsaWduOml8fGMudGV4dEFsaWduLGJvcmRlclJhZGl1czpvJiYoc3x8Yy5ib3JkZXJSYWRpdXMpLGRhdGFzZXRJbmRleDplLmluZGV4fX0sdGhpcyl9fSx0aXRsZTp7Y29sb3I6ZT0+ZS5jaGFydC5vcHRpb25zLmNvbG9yLGRpc3BsYXk6ITEscG9zaXRpb246YGNlbnRlcmAsdGV4dDpgYH19LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBvbmApLGxhYmVsczp7X3NjcmlwdGFibGU6ZT0+IVtgZ2VuZXJhdGVMYWJlbHNgLGBmaWx0ZXJgLGBzb3J0YF0uaW5jbHVkZXMoZSl9fX0sUWQ9e2F2ZXJhZ2UoZSl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCB0LG4scj1uZXcgU2V0LGk9MCxhPTA7Zm9yKHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3Qpe2xldCBuPWVbdF0uZWxlbWVudDtpZihuJiZuLmhhc1ZhbHVlKCkpe2xldCBlPW4udG9vbHRpcFBvc2l0aW9uKCk7ci5hZGQoZS54KSxpKz1lLnksKythfX1yZXR1cm4gYT09PTB8fHIuc2l6ZT09PTA/ITE6e3g6Wy4uLnJdLnJlZHVjZSgoZSx0KT0+ZSt0KS9yLnNpemUseTppL2F9fSxuZWFyZXN0KGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCBuPXQueCxyPXQueSxpPTEvMCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7bGV0IG49ZVthXS5lbGVtZW50O2lmKG4mJm4uaGFzVmFsdWUoKSl7bGV0IGU9Rm8odCxuLmdldENlbnRlclBvaW50KCkpO2U8aSYmKGk9ZSxzPW4pfX1pZihzKXtsZXQgZT1zLnRvb2x0aXBQb3NpdGlvbigpO249ZS54LHI9ZS55fXJldHVybnt4Om4seTpyfX19O2Z1bmN0aW9uICRkKGUsdCl7cmV0dXJuIHQmJihXKHQpP0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsdCk6ZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGVmKGUpe3JldHVybih0eXBlb2YgZT09YHN0cmluZ2B8fGUgaW5zdGFuY2VvZiBTdHJpbmcpJiZlLmluZGV4T2YoYApgKT4tMT9lLnNwbGl0KGAKYCk6ZX1mdW5jdGlvbiB0ZihlLHQpe2xldHtlbGVtZW50Om4sZGF0YXNldEluZGV4OnIsaW5kZXg6aX09dCxhPWUuZ2V0RGF0YXNldE1ldGEocikuY29udHJvbGxlcix7bGFiZWw6byx2YWx1ZTpzfT1hLmdldExhYmVsQW5kVmFsdWUoaSk7cmV0dXJue2NoYXJ0OmUsbGFiZWw6byxwYXJzZWQ6YS5nZXRQYXJzZWQoaSkscmF3OmUuZGF0YS5kYXRhc2V0c1tyXS5kYXRhW2ldLGZvcm1hdHRlZFZhbHVlOnMsZGF0YXNldDphLmdldERhdGFzZXQoKSxkYXRhSW5kZXg6aSxkYXRhc2V0SW5kZXg6cixlbGVtZW50Om59fWZ1bmN0aW9uIG5mKGUsdCl7bGV0IG49ZS5jaGFydC5jdHgse2JvZHk6cixmb290ZXI6aSx0aXRsZTphfT1lLHtib3hXaWR0aDpvLGJveEhlaWdodDpzfT10LGM9JCh0LmJvZHlGb250KSxsPSQodC50aXRsZUZvbnQpLHU9JCh0LmZvb3RlckZvbnQpLGQ9YS5sZW5ndGgsZj1pLmxlbmd0aCxwPXIubGVuZ3RoLG09USh0LnBhZGRpbmcpLGg9bS5oZWlnaHQsZz0wLF89ci5yZWR1Y2UoKGUsdCk9PmUrdC5iZWZvcmUubGVuZ3RoK3QubGluZXMubGVuZ3RoK3QuYWZ0ZXIubGVuZ3RoLDApO2lmKF8rPWUuYmVmb3JlQm9keS5sZW5ndGgrZS5hZnRlckJvZHkubGVuZ3RoLGQmJihoKz1kKmwubGluZUhlaWdodCsoZC0xKSp0LnRpdGxlU3BhY2luZyt0LnRpdGxlTWFyZ2luQm90dG9tKSxfKXtsZXQgZT10LmRpc3BsYXlDb2xvcnM/TWF0aC5tYXgocyxjLmxpbmVIZWlnaHQpOmMubGluZUhlaWdodDtoKz1wKmUrKF8tcCkqYy5saW5lSGVpZ2h0KyhfLTEpKnQuYm9keVNwYWNpbmd9ZiYmKGgrPXQuZm9vdGVyTWFyZ2luVG9wK2YqdS5saW5lSGVpZ2h0KyhmLTEpKnQuZm9vdGVyU3BhY2luZyk7bGV0IHY9MCx5PWZ1bmN0aW9uKGUpe2c9TWF0aC5tYXgoZyxuLm1lYXN1cmVUZXh0KGUpLndpZHRoK3YpfTtyZXR1cm4gbi5zYXZlKCksbi5mb250PWwuc3RyaW5nLFkoZS50aXRsZSx5KSxuLmZvbnQ9Yy5zdHJpbmcsWShlLmJlZm9yZUJvZHkuY29uY2F0KGUuYWZ0ZXJCb2R5KSx5KSx2PXQuZGlzcGxheUNvbG9ycz9vKzIrdC5ib3hQYWRkaW5nOjAsWShyLGU9PntZKGUuYmVmb3JlLHkpLFkoZS5saW5lcyx5KSxZKGUuYWZ0ZXIseSl9KSx2PTAsbi5mb250PXUuc3RyaW5nLFkoZS5mb290ZXIseSksbi5yZXN0b3JlKCksZys9bS53aWR0aCx7d2lkdGg6ZyxoZWlnaHQ6aH19ZnVuY3Rpb24gcmYoZSx0KXtsZXR7eTpuLGhlaWdodDpyfT10O3JldHVybiBuPHIvMj9gdG9wYDpuPmUuaGVpZ2h0LXIvMj9gYm90dG9tYDpgY2VudGVyYH1mdW5jdGlvbiBhZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PXIsbz1uLmNhcmV0U2l6ZStuLmNhcmV0UGFkZGluZztpZihlPT09YGxlZnRgJiZpK2Erbz50LndpZHRofHxlPT09YHJpZ2h0YCYmaS1hLW88MClyZXR1cm4hMH1mdW5jdGlvbiBvZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PW4se3dpZHRoOm8sY2hhcnRBcmVhOntsZWZ0OnMscmlnaHQ6Y319PWUsbD1gY2VudGVyYDtyZXR1cm4gcj09PWBjZW50ZXJgP2w9aTw9KHMrYykvMj9gbGVmdGA6YHJpZ2h0YDppPD1hLzI/bD1gbGVmdGA6aT49by1hLzImJihsPWByaWdodGApLGFmKGwsZSx0LG4pJiYobD1gY2VudGVyYCksbH1mdW5jdGlvbiBzZihlLHQsbil7bGV0IHI9bi55QWxpZ258fHQueUFsaWdufHxyZihlLG4pO3JldHVybnt4QWxpZ246bi54QWxpZ258fHQueEFsaWdufHxvZihlLHQsbixyKSx5QWxpZ246cn19ZnVuY3Rpb24gY2YoZSx0KXtsZXR7eDpuLHdpZHRoOnJ9PWU7cmV0dXJuIHQ9PT1gcmlnaHRgP24tPXI6dD09PWBjZW50ZXJgJiYobi09ci8yKSxufWZ1bmN0aW9uIGxmKGUsdCxuKXtsZXR7eTpyLGhlaWdodDppfT1lO3JldHVybiB0PT09YHRvcGA/cis9bjpyLT10PT09YGJvdHRvbWA/aStuOmkvMixyfWZ1bmN0aW9uIHVmKGUsdCxuLHIpe2xldHtjYXJldFNpemU6aSxjYXJldFBhZGRpbmc6YSxjb3JuZXJSYWRpdXM6b309ZSx7eEFsaWduOnMseUFsaWduOmN9PW4sbD1pK2Ese3RvcExlZnQ6dSx0b3BSaWdodDpkLGJvdHRvbUxlZnQ6Zixib3R0b21SaWdodDpwfT1XcyhvKSxtPWNmKHQscyksaD1sZih0LGMsbCk7cmV0dXJuIGM9PT1gY2VudGVyYD9zPT09YGxlZnRgP20rPWw6cz09PWByaWdodGAmJihtLT1sKTpzPT09YGxlZnRgP20tPU1hdGgubWF4KHUsZikraTpzPT09YHJpZ2h0YCYmKG0rPU1hdGgubWF4KGQscCkraSkse3g6Um8obSwwLHIud2lkdGgtdC53aWR0aCkseTpSbyhoLDAsci5oZWlnaHQtdC5oZWlnaHQpfX1mdW5jdGlvbiBkZihlLHQsbil7bGV0IHI9UShuLnBhZGRpbmcpO3JldHVybiB0PT09YGNlbnRlcmA/ZS54K2Uud2lkdGgvMjp0PT09YHJpZ2h0YD9lLngrZS53aWR0aC1yLnJpZ2h0OmUueCtyLmxlZnR9ZnVuY3Rpb24gZmYoZSl7cmV0dXJuICRkKFtdLGVmKGUpKX1mdW5jdGlvbiBwZihlLHQsbil7cmV0dXJuIHFzKGUse3Rvb2x0aXA6dCx0b29sdGlwSXRlbXM6bix0eXBlOmB0b29sdGlwYH0pfWZ1bmN0aW9uIG1mKGUsdCl7bGV0IG49dCYmdC5kYXRhc2V0JiZ0LmRhdGFzZXQudG9vbHRpcCYmdC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO3JldHVybiBuP2Uub3ZlcnJpZGUobik6ZX12YXIgaGY9e2JlZm9yZVRpdGxlOllhLHRpdGxlKGUpe2lmKGUubGVuZ3RoPjApe2xldCB0PWVbMF0sbj10LmNoYXJ0LmRhdGEubGFiZWxzLHI9bj9uLmxlbmd0aDowO2lmKHRoaXMmJnRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm1vZGU9PT1gZGF0YXNldGApcmV0dXJuIHQuZGF0YXNldC5sYWJlbHx8YGA7aWYodC5sYWJlbClyZXR1cm4gdC5sYWJlbDtpZihyPjAmJnQuZGF0YUluZGV4PHIpcmV0dXJuIG5bdC5kYXRhSW5kZXhdfXJldHVybmBgfSxhZnRlclRpdGxlOllhLGJlZm9yZUJvZHk6WWEsYmVmb3JlTGFiZWw6WWEsbGFiZWwoZSl7aWYodGhpcyYmdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubW9kZT09PWBkYXRhc2V0YClyZXR1cm4gZS5sYWJlbCtgOiBgK2UuZm9ybWF0dGVkVmFsdWV8fGUuZm9ybWF0dGVkVmFsdWU7bGV0IHQ9ZS5kYXRhc2V0LmxhYmVsfHxgYDt0JiYodCs9YDogYCk7bGV0IG49ZS5mb3JtYXR0ZWRWYWx1ZTtyZXR1cm4gVShuKXx8KHQrPW4pLHR9LGxhYmVsQ29sb3IoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue2JvcmRlckNvbG9yOnQuYm9yZGVyQ29sb3IsYmFja2dyb3VuZENvbG9yOnQuYmFja2dyb3VuZENvbG9yLGJvcmRlcldpZHRoOnQuYm9yZGVyV2lkdGgsYm9yZGVyRGFzaDp0LmJvcmRlckRhc2gsYm9yZGVyRGFzaE9mZnNldDp0LmJvcmRlckRhc2hPZmZzZXQsYm9yZGVyUmFkaXVzOjB9fSxsYWJlbFRleHRDb2xvcigpe3JldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yfSxsYWJlbFBvaW50U3R5bGUoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue3BvaW50U3R5bGU6dC5wb2ludFN0eWxlLHJvdGF0aW9uOnQucm90YXRpb259fSxhZnRlckxhYmVsOllhLGFmdGVyQm9keTpZYSxiZWZvcmVGb290ZXI6WWEsZm9vdGVyOllhLGFmdGVyRm9vdGVyOllhfTtmdW5jdGlvbiBnZihlLHQsbixyKXtsZXQgaT1lW3RdLmNhbGwobixyKTtyZXR1cm4gaT09PXZvaWQgMD9oZlt0XS5jYWxsKG4scik6aX12YXIgX2Y9Y2xhc3MgZXh0ZW5kcyBDdXtzdGF0aWMgcG9zaXRpb25lcnM9UWQ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLm9wYWNpdHk9MCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fZXZlbnRQb3NpdGlvbj12b2lkIDAsdGhpcy5fc2l6ZT12b2lkIDAsdGhpcy5fY2FjaGVkQW5pbWF0aW9ucz12b2lkIDAsdGhpcy5fdG9vbHRpcEl0ZW1zPVtdLHRoaXMuJGFuaW1hdGlvbnM9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuY2hhcnQ9ZS5jaGFydCx0aGlzLm9wdGlvbnM9ZS5vcHRpb25zLHRoaXMuZGF0YVBvaW50cz12b2lkIDAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5iZWZvcmVCb2R5PXZvaWQgMCx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuYWZ0ZXJCb2R5PXZvaWQgMCx0aGlzLmZvb3Rlcj12b2lkIDAsdGhpcy54QWxpZ249dm9pZCAwLHRoaXMueUFsaWduPXZvaWQgMCx0aGlzLng9dm9pZCAwLHRoaXMueT12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuY2FyZXRYPXZvaWQgMCx0aGlzLmNhcmV0WT12b2lkIDAsdGhpcy5sYWJlbENvbG9ycz12b2lkIDAsdGhpcy5sYWJlbFBvaW50U3R5bGVzPXZvaWQgMCx0aGlzLmxhYmVsVGV4dENvbG9ycz12b2lkIDB9aW5pdGlhbGl6ZShlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLl9jYWNoZWRBbmltYXRpb25zPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMH1fcmVzb2x2ZUFuaW1hdGlvbnMoKXtsZXQgZT10aGlzLl9jYWNoZWRBbmltYXRpb25zO2lmKGUpcmV0dXJuIGU7bGV0IHQ9dGhpcy5jaGFydCxuPXRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKSxyPW4uZW5hYmxlZCYmdC5vcHRpb25zLmFuaW1hdGlvbiYmbi5hbmltYXRpb25zLGk9bmV3IFZjKHRoaXMuY2hhcnQscik7cmV0dXJuIHIuX2NhY2hlYWJsZSYmKHRoaXMuX2NhY2hlZEFuaW1hdGlvbnM9T2JqZWN0LmZyZWV6ZShpKSksaX1nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuJGNvbnRleHR8fD1wZih0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLHRoaXMuX3Rvb2x0aXBJdGVtcyl9Z2V0VGl0bGUoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVUaXRsZWAsdGhpcyxlKSxpPWdmKG4sYHRpdGxlYCx0aGlzLGUpLGE9Z2YobixgYWZ0ZXJUaXRsZWAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfWdldEJlZm9yZUJvZHkoZSx0KXtyZXR1cm4gZmYoZ2YodC5jYWxsYmFja3MsYGJlZm9yZUJvZHlgLHRoaXMsZSkpfWdldEJvZHkoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1bXTtyZXR1cm4gWShlLGU9PntsZXQgdD17YmVmb3JlOltdLGxpbmVzOltdLGFmdGVyOltdfSxpPW1mKG4sZSk7JGQodC5iZWZvcmUsZWYoZ2YoaSxgYmVmb3JlTGFiZWxgLHRoaXMsZSkpKSwkZCh0LmxpbmVzLGdmKGksYGxhYmVsYCx0aGlzLGUpKSwkZCh0LmFmdGVyLGVmKGdmKGksYGFmdGVyTGFiZWxgLHRoaXMsZSkpKSxyLnB1c2godCl9KSxyfWdldEFmdGVyQm9keShlLHQpe3JldHVybiBmZihnZih0LmNhbGxiYWNrcyxgYWZ0ZXJCb2R5YCx0aGlzLGUpKX1nZXRGb290ZXIoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVGb290ZXJgLHRoaXMsZSksaT1nZihuLGBmb290ZXJgLHRoaXMsZSksYT1nZihuLGBhZnRlckZvb3RlcmAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfV9jcmVhdGVJdGVtcyhlKXtsZXQgdD10aGlzLl9hY3RpdmUsbj10aGlzLmNoYXJ0LmRhdGEscj1bXSxpPVtdLGE9W10sbz1bXSxzLGM7Zm9yKHM9MCxjPXQubGVuZ3RoO3M8YzsrK3Mpby5wdXNoKHRmKHRoaXMuY2hhcnQsdFtzXSkpO3JldHVybiBlLmZpbHRlciYmKG89by5maWx0ZXIoKHQscixpKT0+ZS5maWx0ZXIodCxyLGksbikpKSxlLml0ZW1Tb3J0JiYobz1vLnNvcnQoKHQscik9PmUuaXRlbVNvcnQodCxyLG4pKSksWShvLHQ9PntsZXQgbj1tZihlLmNhbGxiYWNrcyx0KTtyLnB1c2goZ2YobixgbGFiZWxDb2xvcmAsdGhpcyx0KSksaS5wdXNoKGdmKG4sYGxhYmVsUG9pbnRTdHlsZWAsdGhpcyx0KSksYS5wdXNoKGdmKG4sYGxhYmVsVGV4dENvbG9yYCx0aGlzLHQpKX0pLHRoaXMubGFiZWxDb2xvcnM9cix0aGlzLmxhYmVsUG9pbnRTdHlsZXM9aSx0aGlzLmxhYmVsVGV4dENvbG9ycz1hLHRoaXMuZGF0YVBvaW50cz1vLG99dXBkYXRlKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYWN0aXZlLGksYT1bXTtpZighci5sZW5ndGgpdGhpcy5vcGFjaXR5IT09MCYmKGk9e29wYWNpdHk6MH0pO2Vsc2V7bGV0IGU9UWRbbi5wb3NpdGlvbl0uY2FsbCh0aGlzLHIsdGhpcy5fZXZlbnRQb3NpdGlvbik7YT10aGlzLl9jcmVhdGVJdGVtcyhuKSx0aGlzLnRpdGxlPXRoaXMuZ2V0VGl0bGUoYSxuKSx0aGlzLmJlZm9yZUJvZHk9dGhpcy5nZXRCZWZvcmVCb2R5KGEsbiksdGhpcy5ib2R5PXRoaXMuZ2V0Qm9keShhLG4pLHRoaXMuYWZ0ZXJCb2R5PXRoaXMuZ2V0QWZ0ZXJCb2R5KGEsbiksdGhpcy5mb290ZXI9dGhpcy5nZXRGb290ZXIoYSxuKTtsZXQgdD10aGlzLl9zaXplPW5mKHRoaXMsbiksbz1PYmplY3QuYXNzaWduKHt9LGUsdCkscz1zZih0aGlzLmNoYXJ0LG4sbyksYz11ZihuLG8scyx0aGlzLmNoYXJ0KTt0aGlzLnhBbGlnbj1zLnhBbGlnbix0aGlzLnlBbGlnbj1zLnlBbGlnbixpPXtvcGFjaXR5OjEseDpjLngseTpjLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsY2FyZXRYOmUueCxjYXJldFk6ZS55fX10aGlzLl90b29sdGlwSXRlbXM9YSx0aGlzLiRjb250ZXh0PXZvaWQgMCxpJiZ0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLGkpLGUmJm4uZXh0ZXJuYWwmJm4uZXh0ZXJuYWwuY2FsbCh0aGlzLHtjaGFydDp0aGlzLmNoYXJ0LHRvb2x0aXA6dGhpcyxyZXBsYXk6dH0pfWRyYXdDYXJldChlLHQsbixyKXtsZXQgaT10aGlzLmdldENhcmV0UG9zaXRpb24oZSxuLHIpO3QubGluZVRvKGkueDEsaS55MSksdC5saW5lVG8oaS54MixpLnkyKSx0LmxpbmVUbyhpLngzLGkueTMpfWdldENhcmV0UG9zaXRpb24oZSx0LG4pe2xldHt4QWxpZ246cix5QWxpZ246aX09dGhpcyx7Y2FyZXRTaXplOmEsY29ybmVyUmFkaXVzOm99PW4se3RvcExlZnQ6cyx0b3BSaWdodDpjLGJvdHRvbUxlZnQ6bCxib3R0b21SaWdodDp1fT1XcyhvKSx7eDpkLHk6Zn09ZSx7d2lkdGg6cCxoZWlnaHQ6bX09dCxoLGcsXyx2LHksYjtyZXR1cm4gaT09PWBjZW50ZXJgPyh5PWYrbS8yLHI9PT1gbGVmdGA/KGg9ZCxnPWgtYSx2PXkrYSxiPXktYSk6KGg9ZCtwLGc9aCthLHY9eS1hLGI9eSthKSxfPWgpOihnPXI9PT1gbGVmdGA/ZCtNYXRoLm1heChzLGwpK2E6cj09PWByaWdodGA/ZCtwLU1hdGgubWF4KGMsdSktYTp0aGlzLmNhcmV0WCxpPT09YHRvcGA/KHY9Zix5PXYtYSxoPWctYSxfPWcrYSk6KHY9ZittLHk9dithLGg9ZythLF89Zy1hKSxiPXYpLHt4MTpoLHgyOmcseDM6Xyx5MTp2LHkyOnkseTM6Yn19ZHJhd1RpdGxlKGUsdCxuKXtsZXQgcj10aGlzLnRpdGxlLGk9ci5sZW5ndGgsYSxvLHM7aWYoaSl7bGV0IGM9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpO2ZvcihlLng9ZGYodGhpcyxuLnRpdGxlQWxpZ24sbiksdC50ZXh0QWxpZ249Yy50ZXh0QWxpZ24obi50aXRsZUFsaWduKSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCxhPSQobi50aXRsZUZvbnQpLG89bi50aXRsZVNwYWNpbmcsdC5maWxsU3R5bGU9bi50aXRsZUNvbG9yLHQuZm9udD1hLnN0cmluZyxzPTA7czxpOysrcyl0LmZpbGxUZXh0KHJbc10sYy54KGUueCksZS55K2EubGluZUhlaWdodC8yKSxlLnkrPWEubGluZUhlaWdodCtvLHMrMT09PWkmJihlLnkrPW4udGl0bGVNYXJnaW5Cb3R0b20tbyl9fV9kcmF3Q29sb3JCb3goZSx0LG4scixpKXtsZXQgYT10aGlzLmxhYmVsQ29sb3JzW25dLG89dGhpcy5sYWJlbFBvaW50U3R5bGVzW25dLHtib3hIZWlnaHQ6cyxib3hXaWR0aDpjfT1pLGw9JChpLmJvZHlGb250KSx1PWRmKHRoaXMsYGxlZnRgLGkpLGQ9ci54KHUpLGY9czxsLmxpbmVIZWlnaHQ/KGwubGluZUhlaWdodC1zKS8yOjAscD10LnkrZjtpZihpLnVzZVBvaW50U3R5bGUpe2xldCB0PXtyYWRpdXM6TWF0aC5taW4oYyxzKS8yLHBvaW50U3R5bGU6by5wb2ludFN0eWxlLHJvdGF0aW9uOm8ucm90YXRpb24sYm9yZGVyV2lkdGg6MX0sbj1yLmxlZnRGb3JMdHIoZCxjKStjLzIsbD1wK3MvMjtlLnN0cm9rZVN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLE9zKGUsdCxuLGwpLGUuc3Ryb2tlU3R5bGU9YS5ib3JkZXJDb2xvcixlLmZpbGxTdHlsZT1hLmJhY2tncm91bmRDb2xvcixPcyhlLHQsbixsKX1lbHNle2UubGluZVdpZHRoPUcoYS5ib3JkZXJXaWR0aCk/TWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhhLmJvcmRlcldpZHRoKSk6YS5ib3JkZXJXaWR0aHx8MSxlLnN0cm9rZVN0eWxlPWEuYm9yZGVyQ29sb3IsZS5zZXRMaW5lRGFzaChhLmJvcmRlckRhc2h8fFtdKSxlLmxpbmVEYXNoT2Zmc2V0PWEuYm9yZGVyRGFzaE9mZnNldHx8MDtsZXQgdD1yLmxlZnRGb3JMdHIoZCxjKSxuPXIubGVmdEZvckx0cihyLnhQbHVzKGQsMSksYy0yKSxvPVdzKGEuYm9yZGVyUmFkaXVzKTtPYmplY3QudmFsdWVzKG8pLnNvbWUoZT0+ZSE9PTApPyhlLmJlZ2luUGF0aCgpLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLExzKGUse3g6dCx5OnAsdzpjLGg6cyxyYWRpdXM6b30pLGUuZmlsbCgpLGUuc3Ryb2tlKCksZS5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsZS5iZWdpblBhdGgoKSxMcyhlLHt4Om4seTpwKzEsdzpjLTIsaDpzLTIscmFkaXVzOm99KSxlLmZpbGwoKSk6KGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFJlY3QodCxwLGMscyksZS5zdHJva2VSZWN0KHQscCxjLHMpLGUuZmlsbFN0eWxlPWEuYmFja2dyb3VuZENvbG9yLGUuZmlsbFJlY3QobixwKzEsYy0yLHMtMikpfWUuZmlsbFN0eWxlPXRoaXMubGFiZWxUZXh0Q29sb3JzW25dfWRyYXdCb2R5KGUsdCxuKXtsZXR7Ym9keTpyfT10aGlzLHtib2R5U3BhY2luZzppLGJvZHlBbGlnbjphLGRpc3BsYXlDb2xvcnM6byxib3hIZWlnaHQ6cyxib3hXaWR0aDpjLGJveFBhZGRpbmc6bH09bix1PSQobi5ib2R5Rm9udCksZD11LmxpbmVIZWlnaHQsZj0wLHA9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpLG09ZnVuY3Rpb24obil7dC5maWxsVGV4dChuLHAueChlLngrZiksZS55K2QvMiksZS55Kz1kK2l9LGg9cC50ZXh0QWxpZ24oYSksZyxfLHYseSxiLHgsUztmb3IodC50ZXh0QWxpZ249YSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCx0LmZvbnQ9dS5zdHJpbmcsZS54PWRmKHRoaXMsaCxuKSx0LmZpbGxTdHlsZT1uLmJvZHlDb2xvcixZKHRoaXMuYmVmb3JlQm9keSxtKSxmPW8mJmghPT1gcmlnaHRgP2E9PT1gY2VudGVyYD9jLzIrbDpjKzIrbDowLHk9MCx4PXIubGVuZ3RoO3k8eDsrK3kpe2ZvcihnPXJbeV0sXz10aGlzLmxhYmVsVGV4dENvbG9yc1t5XSx0LmZpbGxTdHlsZT1fLFkoZy5iZWZvcmUsbSksdj1nLmxpbmVzLG8mJnYubGVuZ3RoJiYodGhpcy5fZHJhd0NvbG9yQm94KHQsZSx5LHAsbiksZD1NYXRoLm1heCh1LmxpbmVIZWlnaHQscykpLGI9MCxTPXYubGVuZ3RoO2I8UzsrK2IpbSh2W2JdKSxkPXUubGluZUhlaWdodDtZKGcuYWZ0ZXIsbSl9Zj0wLGQ9dS5saW5lSGVpZ2h0LFkodGhpcy5hZnRlckJvZHksbSksZS55LT1pfWRyYXdGb290ZXIoZSx0LG4pe2xldCByPXRoaXMuZm9vdGVyLGk9ci5sZW5ndGgsYSxvO2lmKGkpe2xldCBzPWpjKG4ucnRsLHRoaXMueCx0aGlzLndpZHRoKTtmb3IoZS54PWRmKHRoaXMsbi5mb290ZXJBbGlnbixuKSxlLnkrPW4uZm9vdGVyTWFyZ2luVG9wLHQudGV4dEFsaWduPXMudGV4dEFsaWduKG4uZm9vdGVyQWxpZ24pLHQudGV4dEJhc2VsaW5lPWBtaWRkbGVgLGE9JChuLmZvb3RlckZvbnQpLHQuZmlsbFN0eWxlPW4uZm9vdGVyQ29sb3IsdC5mb250PWEuc3RyaW5nLG89MDtvPGk7KytvKXQuZmlsbFRleHQocltvXSxzLngoZS54KSxlLnkrYS5saW5lSGVpZ2h0LzIpLGUueSs9YS5saW5lSGVpZ2h0K24uZm9vdGVyU3BhY2luZ319ZHJhd0JhY2tncm91bmQoZSx0LG4scil7bGV0e3hBbGlnbjppLHlBbGlnbjphfT10aGlzLHt4Om8seTpzfT1lLHt3aWR0aDpjLGhlaWdodDpsfT1uLHt0b3BMZWZ0OnUsdG9wUmlnaHQ6ZCxib3R0b21MZWZ0OmYsYm90dG9tUmlnaHQ6cH09V3Moci5jb3JuZXJSYWRpdXMpO3QuZmlsbFN0eWxlPXIuYmFja2dyb3VuZENvbG9yLHQuc3Ryb2tlU3R5bGU9ci5ib3JkZXJDb2xvcix0LmxpbmVXaWR0aD1yLmJvcmRlcldpZHRoLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8obyt1LHMpLGE9PT1gdG9wYCYmdGhpcy5kcmF3Q2FyZXQoZSx0LG4sciksdC5saW5lVG8obytjLWQscyksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzLG8rYyxzK2QpLGE9PT1gY2VudGVyYCYmaT09PWByaWdodGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rYyxzK2wtcCksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzK2wsbytjLXAscytsKSxhPT09YGJvdHRvbWAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rZixzK2wpLHQucXVhZHJhdGljQ3VydmVUbyhvLHMrbCxvLHMrbC1mKSxhPT09YGNlbnRlcmAmJmk9PT1gbGVmdGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8scyt1KSx0LnF1YWRyYXRpY0N1cnZlVG8obyxzLG8rdSxzKSx0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHIuYm9yZGVyV2lkdGg+MCYmdC5zdHJva2UoKX1fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KGUpe2xldCB0PXRoaXMuY2hhcnQsbj10aGlzLiRhbmltYXRpb25zLHI9biYmbi54LGk9biYmbi55O2lmKHJ8fGkpe2xldCBuPVFkW2UucG9zaXRpb25dLmNhbGwodGhpcyx0aGlzLl9hY3RpdmUsdGhpcy5fZXZlbnRQb3NpdGlvbik7aWYoIW4pcmV0dXJuO2xldCBhPXRoaXMuX3NpemU9bmYodGhpcyxlKSxvPU9iamVjdC5hc3NpZ24oe30sbix0aGlzLl9zaXplKSxzPXNmKHQsZSxvKSxjPXVmKGUsbyxzLHQpOyhyLl90byE9PWMueHx8aS5fdG8hPT1jLnkpJiYodGhpcy54QWxpZ249cy54QWxpZ24sdGhpcy55QWxpZ249cy55QWxpZ24sdGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuY2FyZXRYPW4ueCx0aGlzLmNhcmV0WT1uLnksdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcyxjKSl9fV93aWxsUmVuZGVyKCl7cmV0dXJuISF0aGlzLm9wYWNpdHl9ZHJhdyhlKXtsZXQgdD10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksbj10aGlzLm9wYWNpdHk7aWYoIW4pcmV0dXJuO3RoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldCh0KTtsZXQgcj17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9LGk9e3g6dGhpcy54LHk6dGhpcy55fTtuPU1hdGguYWJzKG4pPC4wMDE/MDpuO2xldCBhPVEodC5wYWRkaW5nKSxvPXRoaXMudGl0bGUubGVuZ3RofHx0aGlzLmJlZm9yZUJvZHkubGVuZ3RofHx0aGlzLmJvZHkubGVuZ3RofHx0aGlzLmFmdGVyQm9keS5sZW5ndGh8fHRoaXMuZm9vdGVyLmxlbmd0aDt0LmVuYWJsZWQmJm8mJihlLnNhdmUoKSxlLmdsb2JhbEFscGhhPW4sdGhpcy5kcmF3QmFja2dyb3VuZChpLGUscix0KSxNYyhlLHQudGV4dERpcmVjdGlvbiksaS55Kz1hLnRvcCx0aGlzLmRyYXdUaXRsZShpLGUsdCksdGhpcy5kcmF3Qm9keShpLGUsdCksdGhpcy5kcmF3Rm9vdGVyKGksZSx0KSxOYyhlLHQudGV4dERpcmVjdGlvbiksZS5yZXN0b3JlKCkpfWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9hY3RpdmUscj1lLm1hcCgoe2RhdGFzZXRJbmRleDplLGluZGV4OnR9KT0+e2xldCBuPXRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pLGk9ISRhKG4sciksYT10aGlzLl9wb3NpdGlvbkNoYW5nZWQocix0KTsoaXx8YSkmJih0aGlzLl9hY3RpdmU9cix0aGlzLl9ldmVudFBvc2l0aW9uPXQsdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzPSEwLHRoaXMudXBkYXRlKCEwKSl9aGFuZGxlRXZlbnQoZSx0LG49ITApe2lmKHQmJnRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cylyZXR1cm4hMTt0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHM9ITE7bGV0IHI9dGhpcy5vcHRpb25zLGk9dGhpcy5fYWN0aXZlfHxbXSxhPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsaSx0LG4pLG89dGhpcy5fcG9zaXRpb25DaGFuZ2VkKGEsZSkscz10fHwhJGEoYSxpKXx8bztyZXR1cm4gcyYmKHRoaXMuX2FjdGl2ZT1hLChyLmVuYWJsZWR8fHIuZXh0ZXJuYWwpJiYodGhpcy5fZXZlbnRQb3NpdGlvbj17eDplLngseTplLnl9LHRoaXMudXBkYXRlKCEwLHQpKSksc31fZ2V0QWN0aXZlRWxlbWVudHMoZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zO2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIXIpcmV0dXJuIHQuZmlsdGVyKGU9PnRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tlLmRhdGFzZXRJbmRleF0mJnRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZS5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKGUuaW5kZXgpIT09dm9pZCAwKTtsZXQgYT10aGlzLmNoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxuKTtyZXR1cm4gaS5yZXZlcnNlJiZhLnJldmVyc2UoKSxhfV9wb3NpdGlvbkNoYW5nZWQoZSx0KXtsZXR7Y2FyZXRYOm4sY2FyZXRZOnIsb3B0aW9uczppfT10aGlzLGE9UWRbaS5wb3NpdGlvbl0uY2FsbCh0aGlzLGUsdCk7cmV0dXJuIGEhPT0hMSYmKG4hPT1hLnh8fHIhPT1hLnkpfX0sdmY9e2lkOmB0b29sdGlwYCxfZWxlbWVudDpfZixwb3NpdGlvbmVyczpRZCxhZnRlckluaXQoZSx0LG4pe24mJihlLnRvb2x0aXA9bmV3IF9mKHtjaGFydDplLG9wdGlvbnM6bn0pKX0sYmVmb3JlVXBkYXRlKGUsdCxuKXtlLnRvb2x0aXAmJmUudG9vbHRpcC5pbml0aWFsaXplKG4pfSxyZXNldChlLHQsbil7ZS50b29sdGlwJiZlLnRvb2x0aXAuaW5pdGlhbGl6ZShuKX0sYWZ0ZXJEcmF3KGUpe2xldCB0PWUudG9vbHRpcDtpZih0JiZ0Ll93aWxsUmVuZGVyKCkpe2xldCBuPXt0b29sdGlwOnR9O2lmKGUubm90aWZ5UGx1Z2lucyhgYmVmb3JlVG9vbHRpcERyYXdgLHsuLi5uLGNhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjt0LmRyYXcoZS5jdHgpLGUubm90aWZ5UGx1Z2lucyhgYWZ0ZXJUb29sdGlwRHJhd2Asbil9fSxhZnRlckV2ZW50KGUsdCl7aWYoZS50b29sdGlwKXtsZXQgbj10LnJlcGxheTtlLnRvb2x0aXAuaGFuZGxlRXZlbnQodC5ldmVudCxuLHQuaW5DaGFydEFyZWEpJiYodC5jaGFuZ2VkPSEwKX19LGRlZmF1bHRzOntlbmFibGVkOiEwLGV4dGVybmFsOm51bGwscG9zaXRpb246YGF2ZXJhZ2VgLGJhY2tncm91bmRDb2xvcjpgcmdiYSgwLDAsMCwwLjgpYCx0aXRsZUNvbG9yOmAjZmZmYCx0aXRsZUZvbnQ6e3dlaWdodDpgYm9sZGB9LHRpdGxlU3BhY2luZzoyLHRpdGxlTWFyZ2luQm90dG9tOjYsdGl0bGVBbGlnbjpgbGVmdGAsYm9keUNvbG9yOmAjZmZmYCxib2R5U3BhY2luZzoyLGJvZHlGb250Ont9LGJvZHlBbGlnbjpgbGVmdGAsZm9vdGVyQ29sb3I6YCNmZmZgLGZvb3RlclNwYWNpbmc6Mixmb290ZXJNYXJnaW5Ub3A6Nixmb290ZXJGb250Ont3ZWlnaHQ6YGJvbGRgfSxmb290ZXJBbGlnbjpgbGVmdGAscGFkZGluZzo2LGNhcmV0UGFkZGluZzoyLGNhcmV0U2l6ZTo1LGNvcm5lclJhZGl1czo2LGJveEhlaWdodDooZSx0KT0+dC5ib2R5Rm9udC5zaXplLGJveFdpZHRoOihlLHQpPT50LmJvZHlGb250LnNpemUsbXVsdGlLZXlCYWNrZ3JvdW5kOmAjZmZmYCxkaXNwbGF5Q29sb3JzOiEwLGJveFBhZGRpbmc6MCxib3JkZXJDb2xvcjpgcmdiYSgwLDAsMCwwKWAsYm9yZGVyV2lkdGg6MCxhbmltYXRpb246e2R1cmF0aW9uOjQwMCxlYXNpbmc6YGVhc2VPdXRRdWFydGB9LGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgd2lkdGhgLGBoZWlnaHRgLGBjYXJldFhgLGBjYXJldFlgXX0sb3BhY2l0eTp7ZWFzaW5nOmBsaW5lYXJgLGR1cmF0aW9uOjIwMH19LGNhbGxiYWNrczpoZn0sZGVmYXVsdFJvdXRlczp7Ym9keUZvbnQ6YGZvbnRgLGZvb3RlckZvbnQ6YGZvbnRgLHRpdGxlRm9udDpgZm9udGB9LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT5lIT09YGZpbHRlcmAmJmUhPT1gaXRlbVNvcnRgJiZlIT09YGV4dGVybmFsYCxfaW5kZXhhYmxlOiExLGNhbGxiYWNrczp7X3NjcmlwdGFibGU6ITEsX2luZGV4YWJsZTohMX0sYW5pbWF0aW9uOntfZmFsbGJhY2s6ITF9LGFuaW1hdGlvbnM6e19mYWxsYmFjazpgYW5pbWF0aW9uYH19LGFkZGl0aW9uYWxPcHRpb25TY29wZXM6W2BpbnRlcmFjdGlvbmBdfSx5Zj0oZSx0LG4scik9Pih0eXBlb2YgdD09YHN0cmluZ2A/KG49ZS5wdXNoKHQpLTEsci51bnNoaWZ0KHtpbmRleDpuLGxhYmVsOnR9KSk6aXNOYU4odCkmJihuPW51bGwpLG4pO2Z1bmN0aW9uIGJmKGUsdCxuLHIpe2xldCBpPWUuaW5kZXhPZih0KTtyZXR1cm4gaT09PS0xP3lmKGUsdCxuLHIpOmk9PT1lLmxhc3RJbmRleE9mKHQpP2k6bn12YXIgeGY9KGUsdCk9PmU9PT1udWxsP251bGw6Um8oTWF0aC5yb3VuZChlKSwwLHQpO2Z1bmN0aW9uIFNmKGUpe2xldCB0PXRoaXMuZ2V0TGFiZWxzKCk7cmV0dXJuIGU+PTAmJmU8dC5sZW5ndGg/dFtlXTplfXZhciBDZj1jbGFzcyBleHRlbmRzIFV1e3N0YXRpYyBpZD1gY2F0ZWdvcnlgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOlNmfX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wLHRoaXMuX2FkZGVkTGFiZWxzPVtdfWluaXQoZSl7bGV0IHQ9dGhpcy5fYWRkZWRMYWJlbHM7aWYodC5sZW5ndGgpe2xldCBlPXRoaXMuZ2V0TGFiZWxzKCk7Zm9yKGxldHtpbmRleDpuLGxhYmVsOnJ9b2YgdCllW25dPT09ciYmZS5zcGxpY2UobiwxKTt0aGlzLl9hZGRlZExhYmVscz1bXX1zdXBlci5pbml0KGUpfXBhcnNlKGUsdCl7aWYoVShlKSlyZXR1cm4gbnVsbDtsZXQgbj10aGlzLmdldExhYmVscygpO3JldHVybiB0PWlzRmluaXRlKHQpJiZuW3RdPT09ZT90OmJmKG4sZSxxKHQsZSksdGhpcy5fYWRkZWRMYWJlbHMpLHhmKHQsbi5sZW5ndGgtMSl9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOm4sbWF4OnJ9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm9wdGlvbnMuYm91bmRzPT09YHRpY2tzYCYmKGV8fChuPTApLHR8fChyPXRoaXMuZ2V0TGFiZWxzKCkubGVuZ3RoLTEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMubWluLHQ9dGhpcy5tYXgsbj10aGlzLm9wdGlvbnMub2Zmc2V0LHI9W10saT10aGlzLmdldExhYmVscygpO2k9ZT09PTAmJnQ9PT1pLmxlbmd0aC0xP2k6aS5zbGljZShlLHQrMSksdGhpcy5fdmFsdWVSYW5nZT1NYXRoLm1heChpLmxlbmd0aC0rIW4sMSksdGhpcy5fc3RhcnRWYWx1ZT10aGlzLm1pbi0obj8uNTowKTtmb3IobGV0IG49ZTtuPD10O24rKylyLnB1c2goe3ZhbHVlOm59KTtyZXR1cm4gcn1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBTZi5jYWxsKHRoaXMsZSl9Y29uZmlndXJlKCl7c3VwZXIuY29uZmlndXJlKCksdGhpcy5pc0hvcml6b250YWwoKXx8KHRoaXMuX3JldmVyc2VQaXhlbHM9IXRoaXMuX3JldmVyc2VQaXhlbHMpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIHR5cGVvZiBlIT1gbnVtYmVyYCYmKGU9dGhpcy5wYXJzZShlKSksZT09PW51bGw/TmFOOnRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKChlLXRoaXMuX3N0YXJ0VmFsdWUpL3RoaXMuX3ZhbHVlUmFuZ2UpfWdldFBpeGVsRm9yVGljayhlKXtsZXQgdD10aGlzLnRpY2tzO3JldHVybiBlPDB8fGU+dC5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0W2VdLnZhbHVlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUrdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwoZSkqdGhpcy5fdmFsdWVSYW5nZSl9Z2V0QmFzZVBpeGVsKCl7cmV0dXJuIHRoaXMuYm90dG9tfX07ZnVuY3Rpb24gd2YoZSx0KXtsZXQgbj1bXSx7Ym91bmRzOnIsc3RlcDppLG1pbjphLG1heDpvLHByZWNpc2lvbjpzLGNvdW50OmMsbWF4VGlja3M6bCxtYXhEaWdpdHM6dSxpbmNsdWRlQm91bmRzOmR9PWUsZj1pfHwxLHA9bC0xLHttaW46bSxtYXg6aH09dCxnPSFVKGEpLF89IVUobyksdj0hVShjKSx5PShoLW0pLyh1KzEpLGI9VG8oKGgtbSkvcC9mKSpmLHgsUyxDLHc7aWYoYjwxZS0xNCYmIWcmJiFfKXJldHVyblt7dmFsdWU6bX0se3ZhbHVlOmh9XTt3PU1hdGguY2VpbChoL2IpLU1hdGguZmxvb3IobS9iKSx3PnAmJihiPVRvKHcqYi9wL2YpKmYpLFUocyl8fCh4PTEwKipzLGI9TWF0aC5jZWlsKGIqeCkveCkscj09PWB0aWNrc2A/KFM9TWF0aC5mbG9vcihtL2IpKmIsQz1NYXRoLmNlaWwoaC9iKSpiKTooUz1tLEM9aCksZyYmXyYmaSYma28oKG8tYSkvaSxiLzFlMyk/KHc9TWF0aC5yb3VuZChNYXRoLm1pbigoby1hKS9iLGwpKSxiPShvLWEpL3csUz1hLEM9byk6dj8oUz1nP2E6UyxDPV8/bzpDLHc9Yy0xLGI9KEMtUykvdyk6KHc9KEMtUykvYix3PXdvKHcsTWF0aC5yb3VuZCh3KSxiLzFlMyk/TWF0aC5yb3VuZCh3KTpNYXRoLmNlaWwodykpO2xldCBUPU1hdGgubWF4KE5vKGIpLE5vKFMpKTt4PTEwKiooVShzKT9UOnMpLFM9TWF0aC5yb3VuZChTKngpL3gsQz1NYXRoLnJvdW5kKEMqeCkveDtsZXQgRT0wO2ZvcihnJiYoZCYmUyE9PWE/KG4ucHVzaCh7dmFsdWU6YX0pLFM8YSYmRSsrLHdvKE1hdGgucm91bmQoKFMrRSpiKSp4KS94LGEsVGYoYSx5LGUpKSYmRSsrKTpTPGEmJkUrKyk7RTx3OysrRSl7bGV0IGU9TWF0aC5yb3VuZCgoUytFKmIpKngpL3g7aWYoXyYmZT5vKWJyZWFrO24ucHVzaCh7dmFsdWU6ZX0pfXJldHVybiBfJiZkJiZDIT09bz9uLmxlbmd0aCYmd28obltuLmxlbmd0aC0xXS52YWx1ZSxvLFRmKG8seSxlKSk/bltuLmxlbmd0aC0xXS52YWx1ZT1vOm4ucHVzaCh7dmFsdWU6b30pOighX3x8Qz09PW8pJiZuLnB1c2goe3ZhbHVlOkN9KSxufWZ1bmN0aW9uIFRmKGUsdCx7aG9yaXpvbnRhbDpuLG1pblJvdGF0aW9uOnJ9KXtsZXQgaT1qbyhyKSxhPShuP01hdGguc2luKGkpOk1hdGguY29zKGkpKXx8LjAwMSxvPS43NSp0KihgYCtlKS5sZW5ndGg7cmV0dXJuIE1hdGgubWluKHQvYSxvKX12YXIgRWY9Y2xhc3MgZXh0ZW5kcyBVdXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fZW5kVmFsdWU9dm9pZCAwLHRoaXMuX3ZhbHVlUmFuZ2U9MH1wYXJzZShlLHQpe3JldHVybiBVKGUpfHwodHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmIWlzRmluaXRlKCtlKT9udWxsOitlfWhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKXtsZXR7YmVnaW5BdFplcm86ZX09dGhpcy5vcHRpb25zLHttaW5EZWZpbmVkOnQsbWF4RGVmaW5lZDpufT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOnIsbWF4Oml9PXRoaXMsYT1lPT5yPXQ/cjplLG89ZT0+aT1uP2k6ZTtpZihlKXtsZXQgZT1DbyhyKSx0PUNvKGkpO2U8MCYmdDwwP28oMCk6ZT4wJiZ0PjAmJmEoMCl9aWYocj09PWkpe2xldCB0PWk9PT0wPzE6TWF0aC5hYnMoaSouMDUpO28oaSt0KSxlfHxhKHItdCl9dGhpcy5taW49cix0aGlzLm1heD1pfWdldFRpY2tMaW1pdCgpe2xldHttYXhUaWNrc0xpbWl0OmUsc3RlcFNpemU6dH09dGhpcy5vcHRpb25zLnRpY2tzLG47cmV0dXJuIHQ/KG49TWF0aC5jZWlsKHRoaXMubWF4L3QpLU1hdGguZmxvb3IodGhpcy5taW4vdCkrMSxuPjFlMyYmKGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7dH0gd291bGQgcmVzdWx0IGdlbmVyYXRpbmcgdXAgdG8gJHtufSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKSxuPTFlMykpOihuPXRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpLGV8fD0xMSksZSYmKG49TWF0aC5taW4oZSxuKSksbn1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIDEvMH1idWlsZFRpY2tzKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPXRoaXMuZ2V0VGlja0xpbWl0KCk7bj1NYXRoLm1heCgyLG4pO2xldCByPXdmKHttYXhUaWNrczpuLGJvdW5kczplLmJvdW5kcyxtaW46ZS5taW4sbWF4OmUubWF4LHByZWNpc2lvbjp0LnByZWNpc2lvbixzdGVwOnQuc3RlcFNpemUsY291bnQ6dC5jb3VudCxtYXhEaWdpdHM6dGhpcy5fbWF4RGlnaXRzKCksaG9yaXpvbnRhbDp0aGlzLmlzSG9yaXpvbnRhbCgpLG1pblJvdGF0aW9uOnQubWluUm90YXRpb258fDAsaW5jbHVkZUJvdW5kczp0LmluY2x1ZGVCb3VuZHMhPT0hMX0sdGhpcy5fcmFuZ2V8fHRoaXMpO3JldHVybiBlLmJvdW5kcz09PWB0aWNrc2AmJkFvKHIsdGhpcyxgdmFsdWVgKSxlLnJldmVyc2U/KHIucmV2ZXJzZSgpLHRoaXMuc3RhcnQ9dGhpcy5tYXgsdGhpcy5lbmQ9dGhpcy5taW4pOih0aGlzLnN0YXJ0PXRoaXMubWluLHRoaXMuZW5kPXRoaXMubWF4KSxyfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMudGlja3MsdD10aGlzLm1pbixuPXRoaXMubWF4O2lmKHN1cGVyLmNvbmZpZ3VyZSgpLHRoaXMub3B0aW9ucy5vZmZzZXQmJmUubGVuZ3RoKXtsZXQgcj0obi10KS9NYXRoLm1heChlLmxlbmd0aC0xLDEpLzI7dC09cixuKz1yfXRoaXMuX3N0YXJ0VmFsdWU9dCx0aGlzLl9lbmRWYWx1ZT1uLHRoaXMuX3ZhbHVlUmFuZ2U9bi10fWdldExhYmVsRm9yVmFsdWUoZSl7cmV0dXJuIG1zKGUsdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KX19LERmPWNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWBsaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY319O2RldGVybWluZURhdGFMaW1pdHMoKXtsZXR7bWluOmUsbWF4OnR9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1LKGUpP2U6MCx0aGlzLm1heD1LKHQpP3Q6MSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7bGV0IGU9dGhpcy5pc0hvcml6b250YWwoKSx0PWU/dGhpcy53aWR0aDp0aGlzLmhlaWdodCxuPWpvKHRoaXMub3B0aW9ucy50aWNrcy5taW5Sb3RhdGlvbikscj0oZT9NYXRoLnNpbihuKTpNYXRoLmNvcyhuKSl8fC4wMDEsaT10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApO3JldHVybiBNYXRoLmNlaWwodC9NYXRoLm1pbig0MCxpLmxpbmVIZWlnaHQvcikpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIGU9PT1udWxsP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgoZS10aGlzLl9zdGFydFZhbHVlKS90aGlzLl92YWx1ZVJhbmdlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiB0aGlzLl9zdGFydFZhbHVlK3RoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpKnRoaXMuX3ZhbHVlUmFuZ2V9fSxPZj1lPT5NYXRoLmZsb29yKFNvKGUpKSxrZj0oZSx0KT0+MTAqKihPZihlKSt0KTtmdW5jdGlvbiBBZihlKXtyZXR1cm4gZS8xMCoqT2YoZSk9PTF9ZnVuY3Rpb24gamYoZSx0LG4pe2xldCByPTEwKipuLGk9TWF0aC5mbG9vcihlL3IpO3JldHVybiBNYXRoLmNlaWwodC9yKS1pfWZ1bmN0aW9uIE1mKGUsdCl7bGV0IG49T2YodC1lKTtmb3IoO2pmKGUsdCxuKT4xMDspbisrO2Zvcig7amYoZSx0LG4pPDEwOyluLS07cmV0dXJuIE1hdGgubWluKG4sT2YoZSkpfWZ1bmN0aW9uIE5mKGUse21pbjp0LG1heDpufSl7dD1aYShlLm1pbix0KTtsZXQgcj1bXSxpPU9mKHQpLGE9TWYodCxuKSxvPWE8MD8xMCoqTWF0aC5hYnMoYSk6MSxzPTEwKiphLGM9aT5hPzEwKippOjAsbD1NYXRoLnJvdW5kKCh0LWMpKm8pL28sdT1NYXRoLmZsb29yKCh0LWMpL3MvMTApKnMqMTAsZD1NYXRoLmZsb29yKChsLXUpLzEwKiphKSxmPVphKGUubWluLE1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vKTtmb3IoO2Y8bjspci5wdXNoKHt2YWx1ZTpmLG1ham9yOkFmKGYpLHNpZ25pZmljYW5kOmR9KSxkPj0xMD9kPWQ8MTU/MTU6MjA6ZCsrLGQ+PTIwJiYoYSsrLGQ9MixvPWE+PTA/MTpvKSxmPU1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vO2xldCBwPVphKGUubWF4LGYpO3JldHVybiByLnB1c2goe3ZhbHVlOnAsbWFqb3I6QWYocCksc2lnbmlmaWNhbmQ6ZH0pLHJ9KGNsYXNzIGV4dGVuZHMgVXV7c3RhdGljIGlkPWBsb2dhcml0aG1pY2A7c3RhdGljIGRlZmF1bHRzPXt0aWNrczp7Y2FsbGJhY2s6X3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxtYWpvcjp7ZW5hYmxlZDohMH19fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKGUsdCl7bGV0IG49RWYucHJvdG90eXBlLnBhcnNlLmFwcGx5KHRoaXMsW2UsdF0pO2lmKG49PT0wKXt0aGlzLl96ZXJvPSEwO3JldHVybn1yZXR1cm4gSyhuKSYmbj4wP246bnVsbH1kZXRlcm1pbmVEYXRhTGltaXRzKCl7bGV0e21pbjplLG1heDp0fT10aGlzLmdldE1pbk1heCghMCk7dGhpcy5taW49SyhlKT9NYXRoLm1heCgwLGUpOm51bGwsdGhpcy5tYXg9Syh0KT9NYXRoLm1heCgwLHQpOm51bGwsdGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvJiYodGhpcy5femVybz0hMCksdGhpcy5femVybyYmdGhpcy5taW4hPT10aGlzLl9zdWdnZXN0ZWRNaW4mJiFLKHRoaXMuX3VzZXJNaW4pJiYodGhpcy5taW49ZT09PWtmKHRoaXMubWluLDApP2tmKHRoaXMubWluLC0xKTprZih0aGlzLm1pbiwwKSksdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCl9aGFuZGxlVGlja1JhbmdlT3B0aW9ucygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSxuPXRoaXMubWluLHI9dGhpcy5tYXgsaT10PT5uPWU/bjp0LGE9ZT0+cj10P3I6ZTtuPT09ciYmKG48PTA/KGkoMSksYSgxMCkpOihpKGtmKG4sLTEpKSxhKGtmKHIsMSkpKSksbjw9MCYmaShrZihyLC0xKSkscjw9MCYmYShrZihuLDEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PU5mKHttaW46dGhpcy5fdXNlck1pbixtYXg6dGhpcy5fdXNlck1heH0sdGhpcyk7cmV0dXJuIGUuYm91bmRzPT09YHRpY2tzYCYmQW8odCx0aGlzLGB2YWx1ZWApLGUucmV2ZXJzZT8odC5yZXZlcnNlKCksdGhpcy5zdGFydD10aGlzLm1heCx0aGlzLmVuZD10aGlzLm1pbik6KHRoaXMuc3RhcnQ9dGhpcy5taW4sdGhpcy5lbmQ9dGhpcy5tYXgpLHR9Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZT09PXZvaWQgMD9gMGA6bXMoZSx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMubWluO3N1cGVyLmNvbmZpZ3VyZSgpLHRoaXMuX3N0YXJ0VmFsdWU9U28oZSksdGhpcy5fdmFsdWVSYW5nZT1Tbyh0aGlzLm1heCktU28oZSl9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtyZXR1cm4oZT09PXZvaWQgMHx8ZT09PTApJiYoZT10aGlzLm1pbiksZT09PW51bGx8fGlzTmFOKGUpP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbChlPT09dGhpcy5taW4/MDooU28oZSktdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbChlKXtsZXQgdD10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKTtyZXR1cm4gMTAqKih0aGlzLl9zdGFydFZhbHVlK3QqdGhpcy5fdmFsdWVSYW5nZSl9fSk7ZnVuY3Rpb24gUGYoZSl7bGV0IHQ9ZS50aWNrcztpZih0LmRpc3BsYXkmJmUuZGlzcGxheSl7bGV0IGU9USh0LmJhY2tkcm9wUGFkZGluZyk7cmV0dXJuIHEodC5mb250JiZ0LmZvbnQuc2l6ZSxaLmZvbnQuc2l6ZSkrZS5oZWlnaHR9cmV0dXJuIDB9ZnVuY3Rpb24gRmYoZSx0LG4pe3JldHVybiBuPVcobik/bjpbbl0se3c6VHMoZSx0LnN0cmluZyxuKSxoOm4ubGVuZ3RoKnQubGluZUhlaWdodH19ZnVuY3Rpb24gSWYoZSx0LG4scixpKXtyZXR1cm4gZT09PXJ8fGU9PT1pP3tzdGFydDp0LW4vMixlbmQ6dCtuLzJ9OmU8cnx8ZT5pP3tzdGFydDp0LW4sZW5kOnR9OntzdGFydDp0LGVuZDp0K259fWZ1bmN0aW9uIExmKGUpe2xldCB0PXtsOmUubGVmdCtlLl9wYWRkaW5nLmxlZnQscjplLnJpZ2h0LWUuX3BhZGRpbmcucmlnaHQsdDplLnRvcCtlLl9wYWRkaW5nLnRvcCxiOmUuYm90dG9tLWUuX3BhZGRpbmcuYm90dG9tfSxuPU9iamVjdC5hc3NpZ24oe30sdCkscj1bXSxpPVtdLGE9ZS5fcG9pbnRMYWJlbHMubGVuZ3RoLG89ZS5vcHRpb25zLnBvaW50TGFiZWxzLHM9by5jZW50ZXJQb2ludExhYmVscz9YL2E6MDtmb3IobGV0IGM9MDtjPGE7YysrKXtsZXQgYT1vLnNldENvbnRleHQoZS5nZXRQb2ludExhYmVsQ29udGV4dChjKSk7aVtjXT1hLnBhZGRpbmc7bGV0IGw9ZS5nZXRQb2ludFBvc2l0aW9uKGMsZS5kcmF3aW5nQXJlYStpW2NdLHMpLHU9JChhLmZvbnQpLGQ9RmYoZS5jdHgsdSxlLl9wb2ludExhYmVsc1tjXSk7cltjXT1kO2xldCBmPUlvKGUuZ2V0SW5kZXhBbmdsZShjKStzKSxwPU1hdGgucm91bmQoTW8oZikpO1JmKG4sdCxmLElmKHAsbC54LGQudywwLDE4MCksSWYocCxsLnksZC5oLDkwLDI3MCkpfWUuc2V0Q2VudGVyUG9pbnQodC5sLW4ubCxuLnItdC5yLHQudC1uLnQsbi5iLXQuYiksZS5fcG9pbnRMYWJlbEl0ZW1zPVZmKGUscixpKX1mdW5jdGlvbiBSZihlLHQsbixyLGkpe2xldCBhPU1hdGguYWJzKE1hdGguc2luKG4pKSxvPU1hdGguYWJzKE1hdGguY29zKG4pKSxzPTAsYz0wO3Iuc3RhcnQ8dC5sPyhzPSh0Lmwtci5zdGFydCkvYSxlLmw9TWF0aC5taW4oZS5sLHQubC1zKSk6ci5lbmQ+dC5yJiYocz0oci5lbmQtdC5yKS9hLGUucj1NYXRoLm1heChlLnIsdC5yK3MpKSxpLnN0YXJ0PHQudD8oYz0odC50LWkuc3RhcnQpL28sZS50PU1hdGgubWluKGUudCx0LnQtYykpOmkuZW5kPnQuYiYmKGM9KGkuZW5kLXQuYikvbyxlLmI9TWF0aC5tYXgoZS5iLHQuYitjKSl9ZnVuY3Rpb24gemYoZSx0LG4pe2xldCByPWUuZHJhd2luZ0FyZWEse2V4dHJhOmksYWRkaXRpb25hbEFuZ2xlOmEscGFkZGluZzpvLHNpemU6c309bixjPWUuZ2V0UG9pbnRQb3NpdGlvbih0LHIraStvLGEpLGw9TWF0aC5yb3VuZChNbyhJbyhjLmFuZ2xlK3lvKSkpLHU9V2YoYy55LHMuaCxsKSxkPUhmKGwpLGY9VWYoYy54LHMudyxkKTtyZXR1cm57dmlzaWJsZTohMCx4OmMueCx5OnUsdGV4dEFsaWduOmQsbGVmdDpmLHRvcDp1LHJpZ2h0OmYrcy53LGJvdHRvbTp1K3MuaH19ZnVuY3Rpb24gQmYoZSx0KXtpZighdClyZXR1cm4hMDtsZXR7bGVmdDpuLHRvcDpyLHJpZ2h0OmksYm90dG9tOmF9PWU7cmV0dXJuIShBcyh7eDpuLHk6cn0sdCl8fEFzKHt4Om4seTphfSx0KXx8QXMoe3g6aSx5OnJ9LHQpfHxBcyh7eDppLHk6YX0sdCkpfWZ1bmN0aW9uIFZmKGUsdCxuKXtsZXQgcj1bXSxpPWUuX3BvaW50TGFiZWxzLmxlbmd0aCxhPWUub3B0aW9ucyx7Y2VudGVyUG9pbnRMYWJlbHM6byxkaXNwbGF5OnN9PWEucG9pbnRMYWJlbHMsYz17ZXh0cmE6UGYoYSkvMixhZGRpdGlvbmFsQW5nbGU6bz9YL2k6MH0sbDtmb3IobGV0IGE9MDthPGk7YSsrKXtjLnBhZGRpbmc9blthXSxjLnNpemU9dFthXTtsZXQgaT16ZihlLGEsYyk7ci5wdXNoKGkpLHM9PT1gYXV0b2AmJihpLnZpc2libGU9QmYoaSxsKSxpLnZpc2libGUmJihsPWkpKX1yZXR1cm4gcn1mdW5jdGlvbiBIZihlKXtyZXR1cm4gZT09PTB8fGU9PT0xODA/YGNlbnRlcmA6ZTwxODA/YGxlZnRgOmByaWdodGB9ZnVuY3Rpb24gVWYoZSx0LG4pe3JldHVybiBuPT09YHJpZ2h0YD9lLT10Om49PT1gY2VudGVyYCYmKGUtPXQvMiksZX1mdW5jdGlvbiBXZihlLHQsbil7cmV0dXJuIG49PT05MHx8bj09PTI3MD9lLT10LzI6KG4+MjcwfHxuPDkwKSYmKGUtPXQpLGV9ZnVuY3Rpb24gR2YoZSx0LG4pe2xldHtsZWZ0OnIsdG9wOmkscmlnaHQ6YSxib3R0b206b309bix7YmFja2Ryb3BDb2xvcjpzfT10O2lmKCFVKHMpKXtsZXQgbj1Xcyh0LmJvcmRlclJhZGl1cyksYz1RKHQuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxTdHlsZT1zO2xldCBsPXItYy5sZWZ0LHU9aS1jLnRvcCxkPWEtcitjLndpZHRoLGY9by1pK2MuaGVpZ2h0O09iamVjdC52YWx1ZXMobikuc29tZShlPT5lIT09MCk/KGUuYmVnaW5QYXRoKCksTHMoZSx7eDpsLHk6dSx3OmQsaDpmLHJhZGl1czpufSksZS5maWxsKCkpOmUuZmlsbFJlY3QobCx1LGQsZil9fWZ1bmN0aW9uIEtmKGUsdCl7bGV0e2N0eDpuLG9wdGlvbnM6e3BvaW50TGFiZWxzOnJ9fT1lO2ZvcihsZXQgaT10LTE7aT49MDtpLS0pe2xldCB0PWUuX3BvaW50TGFiZWxJdGVtc1tpXTtpZighdC52aXNpYmxlKWNvbnRpbnVlO2xldCBhPXIuc2V0Q29udGV4dChlLmdldFBvaW50TGFiZWxDb250ZXh0KGkpKTtHZihuLGEsdCk7bGV0IG89JChhLmZvbnQpLHt4OnMseTpjLHRleHRBbGlnbjpsfT10O0lzKG4sZS5fcG9pbnRMYWJlbHNbaV0scyxjK28ubGluZUhlaWdodC8yLG8se2NvbG9yOmEuY29sb3IsdGV4dEFsaWduOmwsdGV4dEJhc2VsaW5lOmBtaWRkbGVgfSl9fWZ1bmN0aW9uIHFmKGUsdCxuLHIpe2xldHtjdHg6aX09ZTtpZihuKWkuYXJjKGUueENlbnRlcixlLnlDZW50ZXIsdCwwLGdvKTtlbHNle2xldCBuPWUuZ2V0UG9pbnRQb3NpdGlvbigwLHQpO2kubW92ZVRvKG4ueCxuLnkpO2ZvcihsZXQgYT0xO2E8cjthKyspbj1lLmdldFBvaW50UG9zaXRpb24oYSx0KSxpLmxpbmVUbyhuLngsbi55KX19ZnVuY3Rpb24gSmYoZSx0LG4scixpKXtsZXQgYT1lLmN0eCxvPXQuY2lyY3VsYXIse2NvbG9yOnMsbGluZVdpZHRoOmN9PXQ7IW8mJiFyfHwhc3x8IWN8fG48MHx8KGEuc2F2ZSgpLGEuc3Ryb2tlU3R5bGU9cyxhLmxpbmVXaWR0aD1jLGEuc2V0TGluZURhc2goaS5kYXNofHxbXSksYS5saW5lRGFzaE9mZnNldD1pLmRhc2hPZmZzZXQsYS5iZWdpblBhdGgoKSxxZihlLG4sbyxyKSxhLmNsb3NlUGF0aCgpLGEuc3Ryb2tlKCksYS5yZXN0b3JlKCkpfWZ1bmN0aW9uIFlmKGUsdCxuKXtyZXR1cm4gcXMoZSx7bGFiZWw6bixpbmRleDp0LHR5cGU6YHBvaW50TGFiZWxgfSl9KGNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWByYWRpYWxMaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGlzcGxheTohMCxhbmltYXRlOiEwLHBvc2l0aW9uOmBjaGFydEFyZWFgLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjB9LGdyaWQ6e2NpcmN1bGFyOiExfSxzdGFydEFuZ2xlOjAsdGlja3M6e3Nob3dMYWJlbEJhY2tkcm9wOiEwLGNhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY30scG9pbnRMYWJlbHM6e2JhY2tkcm9wQ29sb3I6dm9pZCAwLGJhY2tkcm9wUGFkZGluZzoyLGRpc3BsYXk6ITAsZm9udDp7c2l6ZToxMH0sY2FsbGJhY2soZSl7cmV0dXJuIGV9LHBhZGRpbmc6NSxjZW50ZXJQb2ludExhYmVsczohMX19O3N0YXRpYyBkZWZhdWx0Um91dGVzPXsiYW5nbGVMaW5lcy5jb2xvciI6YGJvcmRlckNvbG9yYCwicG9pbnRMYWJlbHMuY29sb3IiOmBjb2xvcmAsInRpY2tzLmNvbG9yIjpgY29sb3JgfTtzdGF0aWMgZGVzY3JpcHRvcnM9e2FuZ2xlTGluZXM6e19mYWxsYmFjazpgZ3JpZGB9fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnhDZW50ZXI9dm9pZCAwLHRoaXMueUNlbnRlcj12b2lkIDAsdGhpcy5kcmF3aW5nQXJlYT12b2lkIDAsdGhpcy5fcG9pbnRMYWJlbHM9W10sdGhpcy5fcG9pbnRMYWJlbEl0ZW1zPVtdfXNldERpbWVuc2lvbnMoKXtsZXQgZT10aGlzLl9wYWRkaW5nPVEoUGYodGhpcy5vcHRpb25zKS8yKSx0PXRoaXMud2lkdGg9dGhpcy5tYXhXaWR0aC1lLndpZHRoLG49dGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQtZS5oZWlnaHQ7dGhpcy54Q2VudGVyPU1hdGguZmxvb3IodGhpcy5sZWZ0K3QvMitlLmxlZnQpLHRoaXMueUNlbnRlcj1NYXRoLmZsb29yKHRoaXMudG9wK24vMitlLnRvcCksdGhpcy5kcmF3aW5nQXJlYT1NYXRoLmZsb29yKE1hdGgubWluKHQsbikvMil9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW46ZSxtYXg6dH09dGhpcy5nZXRNaW5NYXgoITEpO3RoaXMubWluPUsoZSkmJiFpc05hTihlKT9lOjAsdGhpcy5tYXg9Syh0KSYmIWlzTmFOKHQpP3Q6MCx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhL1BmKHRoaXMub3B0aW9ucykpfWdlbmVyYXRlVGlja0xhYmVscyhlKXtFZi5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcyxlKSx0aGlzLl9wb2ludExhYmVscz10aGlzLmdldExhYmVscygpLm1hcCgoZSx0KT0+e2xldCBuPUoodGhpcy5vcHRpb25zLnBvaW50TGFiZWxzLmNhbGxiYWNrLFtlLHRdLHRoaXMpO3JldHVybiBufHxuPT09MD9uOmBgfSkuZmlsdGVyKChlLHQpPT50aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KHQpKX1maXQoKXtsZXQgZT10aGlzLm9wdGlvbnM7ZS5kaXNwbGF5JiZlLnBvaW50TGFiZWxzLmRpc3BsYXk/TGYodGhpcyk6dGhpcy5zZXRDZW50ZXJQb2ludCgwLDAsMCwwKX1zZXRDZW50ZXJQb2ludChlLHQsbixyKXt0aGlzLnhDZW50ZXIrPU1hdGguZmxvb3IoKGUtdCkvMiksdGhpcy55Q2VudGVyKz1NYXRoLmZsb29yKChuLXIpLzIpLHRoaXMuZHJhd2luZ0FyZWEtPU1hdGgubWluKHRoaXMuZHJhd2luZ0FyZWEvMixNYXRoLm1heChlLHQsbixyKSl9Z2V0SW5kZXhBbmdsZShlKXtsZXQgdD1nby8odGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RofHwxKSxuPXRoaXMub3B0aW9ucy5zdGFydEFuZ2xlfHwwO3JldHVybiBJbyhlKnQram8obikpfWdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbik7cmV0dXJuIHRoaXMub3B0aW9ucy5yZXZlcnNlPyh0aGlzLm1heC1lKSp0OihlLXRoaXMubWluKSp0fWdldFZhbHVlRm9yRGlzdGFuY2VGcm9tQ2VudGVyKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD1lLyh0aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbikpO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT90aGlzLm1heC10OnRoaXMubWluK3R9Z2V0UG9pbnRMYWJlbENvbnRleHQoZSl7bGV0IHQ9dGhpcy5fcG9pbnRMYWJlbHN8fFtdO2lmKGU+PTAmJmU8dC5sZW5ndGgpe2xldCBuPXRbZV07cmV0dXJuIFlmKHRoaXMuZ2V0Q29udGV4dCgpLGUsbil9fWdldFBvaW50UG9zaXRpb24oZSx0LG49MCl7bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKGUpLXlvK247cmV0dXJue3g6TWF0aC5jb3MocikqdCt0aGlzLnhDZW50ZXIseTpNYXRoLnNpbihyKSp0K3RoaXMueUNlbnRlcixhbmdsZTpyfX1nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGUsdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0KSl9Z2V0QmFzZVBvc2l0aW9uKGUpe3JldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShlfHwwLHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldFBvaW50TGFiZWxQb3NpdGlvbihlKXtsZXR7bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9PXRoaXMuX3BvaW50TGFiZWxJdGVtc1tlXTtyZXR1cm57bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2JhY2tncm91bmRDb2xvcjplLGdyaWQ6e2NpcmN1bGFyOnR9fT10aGlzLm9wdGlvbnM7aWYoZSl7bGV0IG49dGhpcy5jdHg7bi5zYXZlKCksbi5iZWdpblBhdGgoKSxxZih0aGlzLHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5fZW5kVmFsdWUpLHQsdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoKSxuLmNsb3NlUGF0aCgpLG4uZmlsbFN0eWxlPWUsbi5maWxsKCksbi5yZXN0b3JlKCl9fWRyYXdHcmlkKCl7bGV0IGU9dGhpcy5jdHgsdD10aGlzLm9wdGlvbnMse2FuZ2xlTGluZXM6bixncmlkOnIsYm9yZGVyOml9PXQsYT10aGlzLl9wb2ludExhYmVscy5sZW5ndGgsbyxzLGM7aWYodC5wb2ludExhYmVscy5kaXNwbGF5JiZLZih0aGlzLGEpLHIuZGlzcGxheSYmdGhpcy50aWNrcy5mb3JFYWNoKChlLHQpPT57aWYodCE9PTB8fHQ9PT0wJiZ0aGlzLm1pbjwwKXtzPXRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZS52YWx1ZSk7bGV0IG49dGhpcy5nZXRDb250ZXh0KHQpLG89ci5zZXRDb250ZXh0KG4pLGM9aS5zZXRDb250ZXh0KG4pO0pmKHRoaXMsbyxzLGEsYyl9fSksbi5kaXNwbGF5KXtmb3IoZS5zYXZlKCksbz1hLTE7bz49MDtvLS0pe2xldCByPW4uc2V0Q29udGV4dCh0aGlzLmdldFBvaW50TGFiZWxDb250ZXh0KG8pKSx7Y29sb3I6aSxsaW5lV2lkdGg6YX09cjshYXx8IWl8fChlLmxpbmVXaWR0aD1hLGUuc3Ryb2tlU3R5bGU9aSxlLnNldExpbmVEYXNoKHIuYm9yZGVyRGFzaCksZS5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQscz10aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHQucmV2ZXJzZT90aGlzLm1pbjp0aGlzLm1heCksYz10aGlzLmdldFBvaW50UG9zaXRpb24obyxzKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHRoaXMueENlbnRlcix0aGlzLnlDZW50ZXIpLGUubGluZVRvKGMueCxjLnkpLGUuc3Ryb2tlKCkpfWUucmVzdG9yZSgpfX1kcmF3Qm9yZGVyKCl7fWRyYXdMYWJlbHMoKXtsZXQgZT10aGlzLmN0eCx0PXRoaXMub3B0aW9ucyxuPXQudGlja3M7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKDApLGksYTtlLnNhdmUoKSxlLnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSxlLnJvdGF0ZShyKSxlLnRleHRBbGlnbj1gY2VudGVyYCxlLnRleHRCYXNlbGluZT1gbWlkZGxlYCx0aGlzLnRpY2tzLmZvckVhY2goKHIsbyk9PntpZihvPT09MCYmdGhpcy5taW4+PTAmJiF0LnJldmVyc2UpcmV0dXJuO2xldCBzPW4uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobykpLGM9JChzLmZvbnQpO2lmKGk9dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW29dLnZhbHVlKSxzLnNob3dMYWJlbEJhY2tkcm9wKXtlLmZvbnQ9Yy5zdHJpbmcsYT1lLm1lYXN1cmVUZXh0KHIubGFiZWwpLndpZHRoLGUuZmlsbFN0eWxlPXMuYmFja2Ryb3BDb2xvcjtsZXQgdD1RKHMuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxSZWN0KC1hLzItdC5sZWZ0LC1pLWMuc2l6ZS8yLXQudG9wLGErdC53aWR0aCxjLnNpemUrdC5oZWlnaHQpfUlzKGUsci5sYWJlbCwwLC1pLGMse2NvbG9yOnMuY29sb3Isc3Ryb2tlQ29sb3I6cy50ZXh0U3Ryb2tlQ29sb3Isc3Ryb2tlV2lkdGg6cy50ZXh0U3Ryb2tlV2lkdGh9KX0pLGUucmVzdG9yZSgpfWRyYXdUaXRsZSgpe319KTt2YXIgWGY9e21pbGxpc2Vjb25kOntjb21tb246ITAsc2l6ZToxLHN0ZXBzOjFlM30sc2Vjb25kOntjb21tb246ITAsc2l6ZToxZTMsc3RlcHM6NjB9LG1pbnV0ZTp7Y29tbW9uOiEwLHNpemU6NmU0LHN0ZXBzOjYwfSxob3VyOntjb21tb246ITAsc2l6ZTozNmU1LHN0ZXBzOjI0fSxkYXk6e2NvbW1vbjohMCxzaXplOjg2NGU1LHN0ZXBzOjMwfSx3ZWVrOntjb21tb246ITEsc2l6ZTo2MDQ4ZTUsc3RlcHM6NH0sbW9udGg6e2NvbW1vbjohMCxzaXplOjI2MjhlNixzdGVwczoxMn0scXVhcnRlcjp7Y29tbW9uOiExLHNpemU6Nzg4NGU2LHN0ZXBzOjR9LHllYXI6e2NvbW1vbjohMCxzaXplOjMxNTRlN319LFpmPU9iamVjdC5rZXlzKFhmKTtmdW5jdGlvbiBRZihlLHQpe3JldHVybiBlLXR9ZnVuY3Rpb24gJGYoZSx0KXtpZihVKHQpKXJldHVybiBudWxsO2xldCBuPWUuX2FkYXB0ZXIse3BhcnNlcjpyLHJvdW5kOmksaXNvV2Vla2RheTphfT1lLl9wYXJzZU9wdHMsbz10O3JldHVybiB0eXBlb2Ygcj09YGZ1bmN0aW9uYCYmKG89cihvKSksSyhvKXx8KG89dHlwZW9mIHI9PWBzdHJpbmdgP24ucGFyc2UobyxyKTpuLnBhcnNlKG8pKSxvPT09bnVsbD9udWxsOihpJiYobz1pPT09YHdlZWtgJiYoT28oYSl8fGE9PT0hMCk/bi5zdGFydE9mKG8sYGlzb1dlZWtgLGEpOm4uc3RhcnRPZihvLGkpKSwrbyl9ZnVuY3Rpb24gZXAoZSx0LG4scil7bGV0IGk9WmYubGVuZ3RoO2ZvcihsZXQgYT1aZi5pbmRleE9mKGUpO2E8aS0xOysrYSl7bGV0IGU9WGZbWmZbYV1dLGk9ZS5zdGVwcz9lLnN0ZXBzOjIqKjUzLTE7aWYoZS5jb21tb24mJk1hdGguY2VpbCgobi10KS8oaSplLnNpemUpKTw9cilyZXR1cm4gWmZbYV19cmV0dXJuIFpmW2ktMV19ZnVuY3Rpb24gdHAoZSx0LG4scixpKXtmb3IobGV0IGE9WmYubGVuZ3RoLTE7YT49WmYuaW5kZXhPZihuKTthLS0pe2xldCBuPVpmW2FdO2lmKFhmW25dLmNvbW1vbiYmZS5fYWRhcHRlci5kaWZmKGkscixuKT49dC0xKXJldHVybiBufXJldHVybiBaZltuP1pmLmluZGV4T2Yobik6MF19ZnVuY3Rpb24gbnAoZSl7Zm9yKGxldCB0PVpmLmluZGV4T2YoZSkrMSxuPVpmLmxlbmd0aDt0PG47Kyt0KWlmKFhmW1pmW3RdXS5jb21tb24pcmV0dXJuIFpmW3RdfWZ1bmN0aW9uIHJwKGUsdCxuKXtpZighbillW3RdPSEwO2Vsc2UgaWYobi5sZW5ndGgpe2xldHtsbzpyLGhpOml9PVZvKG4sdCksYT1uW3JdPj10P25bcl06bltpXTtlW2FdPSEwfX1mdW5jdGlvbiBpcChlLHQsbixyKXtsZXQgaT1lLl9hZGFwdGVyLGE9K2kuc3RhcnRPZih0WzBdLnZhbHVlLHIpLG89dFt0Lmxlbmd0aC0xXS52YWx1ZSxzLGM7Zm9yKHM9YTtzPD1vO3M9K2kuYWRkKHMsMSxyKSljPW5bc10sYz49MCYmKHRbY10ubWFqb3I9ITApO3JldHVybiB0fWZ1bmN0aW9uIGFwKGUsdCxuKXtsZXQgcj1bXSxpPXt9LGE9dC5sZW5ndGgsbyxzO2ZvcihvPTA7bzxhOysrbylzPXRbb10saVtzXT1vLHIucHVzaCh7dmFsdWU6cyxtYWpvcjohMX0pO3JldHVybiBhPT09MHx8IW4/cjppcChlLHIsaSxuKX12YXIgb3A9Y2xhc3MgZXh0ZW5kcyBVdXtzdGF0aWMgaWQ9YHRpbWVgO3N0YXRpYyBkZWZhdWx0cz17Ym91bmRzOmBkYXRhYCxhZGFwdGVyczp7fSx0aW1lOntwYXJzZXI6ITEsdW5pdDohMSxyb3VuZDohMSxpc29XZWVrZGF5OiExLG1pblVuaXQ6YG1pbGxpc2Vjb25kYCxkaXNwbGF5Rm9ybWF0czp7fX0sdGlja3M6e3NvdXJjZTpgYXV0b2AsY2FsbGJhY2s6ITEsbWFqb3I6e2VuYWJsZWQ6ITF9fX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX0sdGhpcy5fdW5pdD1gZGF5YCx0aGlzLl9tYWpvclVuaXQ9dm9pZCAwLHRoaXMuX29mZnNldHM9e30sdGhpcy5fbm9ybWFsaXplZD0hMSx0aGlzLl9wYXJzZU9wdHM9dm9pZCAwfWluaXQoZSx0PXt9KXtsZXQgbj1lLnRpbWV8fD17fSxyPXRoaXMuX2FkYXB0ZXI9bmV3IERsLl9kYXRlKGUuYWRhcHRlcnMuZGF0ZSk7ci5pbml0KHQpLGlvKG4uZGlzcGxheUZvcm1hdHMsci5mb3JtYXRzKCkpLHRoaXMuX3BhcnNlT3B0cz17cGFyc2VyOm4ucGFyc2VyLHJvdW5kOm4ucm91bmQsaXNvV2Vla2RheTpuLmlzb1dlZWtkYXl9LHN1cGVyLmluaXQoZSksdGhpcy5fbm9ybWFsaXplZD10Lm5vcm1hbGl6ZWR9cGFyc2UoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD9udWxsOiRmKHRoaXMsZSl9YmVmb3JlTGF5b3V0KCl7c3VwZXIuYmVmb3JlTGF5b3V0KCksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX19ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2FkYXB0ZXIsbj1lLnRpbWUudW5pdHx8YGRheWAse21pbjpyLG1heDppLG1pbkRlZmluZWQ6YSxtYXhEZWZpbmVkOm99PXRoaXMuZ2V0VXNlckJvdW5kcygpO2Z1bmN0aW9uIHMoZSl7IWEmJiFpc05hTihlLm1pbikmJihyPU1hdGgubWluKHIsZS5taW4pKSwhbyYmIWlzTmFOKGUubWF4KSYmKGk9TWF0aC5tYXgoaSxlLm1heCkpfSghYXx8IW8pJiYocyh0aGlzLl9nZXRMYWJlbEJvdW5kcygpKSwoZS5ib3VuZHMhPT1gdGlja3NgfHxlLnRpY2tzLnNvdXJjZSE9PWBsYWJlbHNgKSYmcyh0aGlzLmdldE1pbk1heCghMSkpKSxyPUsocikmJiFpc05hTihyKT9yOit0LnN0YXJ0T2YoRGF0ZS5ub3coKSxuKSxpPUsoaSkmJiFpc05hTihpKT9pOit0LmVuZE9mKERhdGUubm93KCksbikrMSx0aGlzLm1pbj1NYXRoLm1pbihyLGktMSksdGhpcy5tYXg9TWF0aC5tYXgocisxLGkpfV9nZXRMYWJlbEJvdW5kcygpe2xldCBlPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCksdD0xLzAsbj0tMS8wO3JldHVybiBlLmxlbmd0aCYmKHQ9ZVswXSxuPWVbZS5sZW5ndGgtMV0pLHttaW46dCxtYXg6bn19YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PWUudGltZSxuPWUudGlja3Mscj1uLnNvdXJjZT09PWBsYWJlbHNgP3RoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk6dGhpcy5fZ2VuZXJhdGUoKTtlLmJvdW5kcz09PWB0aWNrc2AmJnIubGVuZ3RoJiYodGhpcy5taW49dGhpcy5fdXNlck1pbnx8clswXSx0aGlzLm1heD10aGlzLl91c2VyTWF4fHxyW3IubGVuZ3RoLTFdKTtsZXQgaT10aGlzLm1pbixhPXRoaXMubWF4LG89V28ocixpLGEpO3JldHVybiB0aGlzLl91bml0PXQudW5pdHx8KG4uYXV0b1NraXA/ZXAodC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4LHRoaXMuX2dldExhYmVsQ2FwYWNpdHkoaSkpOnRwKHRoaXMsby5sZW5ndGgsdC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4KSksdGhpcy5fbWFqb3JVbml0PSFuLm1ham9yLmVuYWJsZWR8fHRoaXMuX3VuaXQ9PT1geWVhcmA/dm9pZCAwOm5wKHRoaXMuX3VuaXQpLHRoaXMuaW5pdE9mZnNldHMociksZS5yZXZlcnNlJiZvLnJldmVyc2UoKSxhcCh0aGlzLG8sdGhpcy5fbWFqb3JVbml0KX1hZnRlckF1dG9Ta2lwKCl7dGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXAmJnRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAoZT0+K2UudmFsdWUpKX1pbml0T2Zmc2V0cyhlPVtdKXtsZXQgdD0wLG49MCxyLGk7dGhpcy5vcHRpb25zLm9mZnNldCYmZS5sZW5ndGgmJihyPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbMF0pLHQ9ZS5sZW5ndGg9PT0xPzEtcjoodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVsxXSktcikvMixpPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbZS5sZW5ndGgtMV0pLG49ZS5sZW5ndGg9PT0xP2k6KGktdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVtlLmxlbmd0aC0yXSkpLzIpO2xldCBhPWUubGVuZ3RoPDM/LjU6LjI1O3Q9Um8odCwwLGEpLG49Um8obiwwLGEpLHRoaXMuX29mZnNldHM9e3N0YXJ0OnQsZW5kOm4sZmFjdG9yOjEvKHQrMStuKX19X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5fYWRhcHRlcix0PXRoaXMubWluLG49dGhpcy5tYXgscj10aGlzLm9wdGlvbnMsaT1yLnRpbWUsYT1pLnVuaXR8fGVwKGkubWluVW5pdCx0LG4sdGhpcy5fZ2V0TGFiZWxDYXBhY2l0eSh0KSksbz1xKHIudGlja3Muc3RlcFNpemUsMSkscz1hPT09YHdlZWtgJiZpLmlzb1dlZWtkYXksYz1PbyhzKXx8cz09PSEwLGw9e30sdT10LGQsZjtpZihjJiYodT0rZS5zdGFydE9mKHUsYGlzb1dlZWtgLHMpKSx1PStlLnN0YXJ0T2YodSxjP2BkYXlgOmEpLGUuZGlmZihuLHQsYSk+MWU1Km8pdGhyb3cgRXJyb3IodCtgIGFuZCBgK24rYCBhcmUgdG9vIGZhciBhcGFydCB3aXRoIHN0ZXBTaXplIG9mIGArbytgIGArYSk7bGV0IHA9ci50aWNrcy5zb3VyY2U9PT1gZGF0YWAmJnRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtmb3IoZD11LGY9MDtkPG47ZD0rZS5hZGQoZCxvLGEpLGYrKylycChsLGQscCk7cmV0dXJuKGQ9PT1ufHxyLmJvdW5kcz09PWB0aWNrc2B8fGY9PT0xKSYmcnAobCxkLHApLE9iamVjdC5rZXlzKGwpLnNvcnQoUWYpLm1hcChlPT4rZSl9Z2V0TGFiZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9hZGFwdGVyLG49dGhpcy5vcHRpb25zLnRpbWU7cmV0dXJuIG4udG9vbHRpcEZvcm1hdD90LmZvcm1hdChlLG4udG9vbHRpcEZvcm1hdCk6dC5mb3JtYXQoZSxuLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKX1mb3JtYXQoZSx0KXtsZXQgbj10aGlzLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cyxyPXRoaXMuX3VuaXQsaT10fHxuW3JdO3JldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdChlLGkpfV90aWNrRm9ybWF0RnVuY3Rpb24oZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zLGE9aS50aWNrcy5jYWxsYmFjaztpZihhKXJldHVybiBKKGEsW2UsdCxuXSx0aGlzKTtsZXQgbz1pLnRpbWUuZGlzcGxheUZvcm1hdHMscz10aGlzLl91bml0LGM9dGhpcy5fbWFqb3JVbml0LGw9cyYmb1tzXSx1PWMmJm9bY10sZD1uW3RdLGY9YyYmdSYmZCYmZC5tYWpvcjtyZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQoZSxyfHwoZj91OmwpKX1nZW5lcmF0ZVRpY2tMYWJlbHMoZSl7bGV0IHQsbixyO2Zvcih0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXI9ZVt0XSxyLmxhYmVsPXRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihyLnZhbHVlLHQsZSl9Z2V0RGVjaW1hbEZvclZhbHVlKGUpe3JldHVybiBlPT09bnVsbD9OYU46KGUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9vZmZzZXRzLG49dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZSk7cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh0LnN0YXJ0K24pKnQuZmFjdG9yKX1nZXRWYWx1ZUZvclBpeGVsKGUpe2xldCB0PXRoaXMuX29mZnNldHMsbj10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKS90LmZhY3Rvci10LmVuZDtyZXR1cm4gdGhpcy5taW4rbioodGhpcy5tYXgtdGhpcy5taW4pfV9nZXRMYWJlbFNpemUoZSl7bGV0IHQ9dGhpcy5vcHRpb25zLnRpY2tzLG49dGhpcy5jdHgubWVhc3VyZVRleHQoZSkud2lkdGgscj1qbyh0aGlzLmlzSG9yaXpvbnRhbCgpP3QubWF4Um90YXRpb246dC5taW5Sb3RhdGlvbiksaT1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLG89dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5zaXplO3JldHVybnt3Om4qaStvKmEsaDpuKmErbyppfX1fZ2V0TGFiZWxDYXBhY2l0eShlKXtsZXQgdD10aGlzLm9wdGlvbnMudGltZSxuPXQuZGlzcGxheUZvcm1hdHMscj1uW3QudW5pdF18fG4ubWlsbGlzZWNvbmQsaT10aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24oZSwwLGFwKHRoaXMsW2VdLHRoaXMuX21ham9yVW5pdCksciksYT10aGlzLl9nZXRMYWJlbFNpemUoaSksbz1NYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aC9hLnc6dGhpcy5oZWlnaHQvYS5oKS0xO3JldHVybiBvPjA/bzoxfWdldERhdGFUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUuZGF0YXx8W10sdCxuO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCByPXRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKTtpZih0aGlzLl9ub3JtYWxpemVkJiZyLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FjaGUuZGF0YT1yWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpO2Zvcih0PTAsbj1yLmxlbmd0aDt0PG47Kyt0KWU9ZS5jb25jYXQoclt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmRhdGE9dGhpcy5ub3JtYWxpemUoZSl9Z2V0TGFiZWxUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUubGFiZWxzfHxbXSx0LG47aWYoZS5sZW5ndGgpcmV0dXJuIGU7bGV0IHI9dGhpcy5nZXRMYWJlbHMoKTtmb3IodD0wLG49ci5sZW5ndGg7dDxuOysrdCllLnB1c2goJGYodGhpcyxyW3RdKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmxhYmVscz10aGlzLl9ub3JtYWxpemVkP2U6dGhpcy5ub3JtYWxpemUoZSl9bm9ybWFsaXplKGUpe3JldHVybiBKbyhlLnNvcnQoUWYpKX19O2Z1bmN0aW9uIHNwKGUsdCxuKXtsZXQgcj0wLGk9ZS5sZW5ndGgtMSxhLG8scyxjO24/KHQ+PWVbcl0ucG9zJiZ0PD1lW2ldLnBvcyYmKHtsbzpyLGhpOml9PUhvKGUsYHBvc2AsdCkpLHtwb3M6YSx0aW1lOnN9PWVbcl0se3BvczpvLHRpbWU6Y309ZVtpXSk6KHQ+PWVbcl0udGltZSYmdDw9ZVtpXS50aW1lJiYoe2xvOnIsaGk6aX09SG8oZSxgdGltZWAsdCkpLHt0aW1lOmEscG9zOnN9PWVbcl0se3RpbWU6byxwb3M6Y309ZVtpXSk7bGV0IGw9by1hO3JldHVybiBsP3MrKGMtcykqKHQtYSkvbDpzfShjbGFzcyBleHRlbmRzIG9we3N0YXRpYyBpZD1gdGltZXNlcmllc2A7c3RhdGljIGRlZmF1bHRzPW9wLmRlZmF1bHRzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuX3RhYmxlPVtdLHRoaXMuX21pblBvcz12b2lkIDAsdGhpcy5fdGFibGVSYW5nZT12b2lkIDB9aW5pdE9mZnNldHMoKXtsZXQgZT10aGlzLl9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKSx0PXRoaXMuX3RhYmxlPXRoaXMuYnVpbGRMb29rdXBUYWJsZShlKTt0aGlzLl9taW5Qb3M9c3AodCx0aGlzLm1pbiksdGhpcy5fdGFibGVSYW5nZT1zcCh0LHRoaXMubWF4KS10aGlzLl9taW5Qb3Msc3VwZXIuaW5pdE9mZnNldHMoZSl9YnVpbGRMb29rdXBUYWJsZShlKXtsZXR7bWluOnQsbWF4Om59PXRoaXMscj1bXSxpPVtdLGEsbyxzLGMsbDtmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSljPWVbYV0sYz49dCYmYzw9biYmci5wdXNoKGMpO2lmKHIubGVuZ3RoPDIpcmV0dXJuW3t0aW1lOnQscG9zOjB9LHt0aW1lOm4scG9zOjF9XTtmb3IoYT0wLG89ci5sZW5ndGg7YTxvOysrYSlsPXJbYSsxXSxzPXJbYS0xXSxjPXJbYV0sTWF0aC5yb3VuZCgobCtzKS8yKSE9PWMmJmkucHVzaCh7dGltZTpjLHBvczphLyhvLTEpfSk7cmV0dXJuIGl9X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5taW4sdD10aGlzLm1heCxuPXN1cGVyLmdldERhdGFUaW1lc3RhbXBzKCk7cmV0dXJuKCFuLmluY2x1ZGVzKGUpfHwhbi5sZW5ndGgpJiZuLnNwbGljZSgwLDAsZSksKCFuLmluY2x1ZGVzKHQpfHxuLmxlbmd0aD09PTEpJiZuLnB1c2godCksbi5zb3J0KChlLHQpPT5lLXQpfV9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKXtsZXQgZT10aGlzLl9jYWNoZS5hbGx8fFtdO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCB0PXRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKSxuPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7cmV0dXJuIGU9dC5sZW5ndGgmJm4ubGVuZ3RoP3RoaXMubm9ybWFsaXplKHQuY29uY2F0KG4pKTp0Lmxlbmd0aD90Om4sZT10aGlzLl9jYWNoZS5hbGw9ZSxlfWdldERlY2ltYWxGb3JWYWx1ZShlKXtyZXR1cm4oc3AodGhpcy5fdGFibGUsZSktdGhpcy5fbWluUG9zKS90aGlzLl90YWJsZVJhbmdlfWdldFZhbHVlRm9yUGl4ZWwoZSl7bGV0IHQ9dGhpcy5fb2Zmc2V0cyxuPXRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpL3QuZmFjdG9yLXQuZW5kO3JldHVybiBzcCh0aGlzLl90YWJsZSxuKnRoaXMuX3RhYmxlUmFuZ2UrdGhpcy5fbWluUG9zLCEwKX19KTt2YXIgY3A9e2RhdGE6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfSxvcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OigpPT4oe30pfSxwbHVnaW5zOnt0eXBlOkFycmF5LGRlZmF1bHQ6KCk9PltdfSxkYXRhc2V0SWRLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6YGxhYmVsYH0sdXBkYXRlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp2b2lkIDB9fSxscD17YXJpYUxhYmVsOnt0eXBlOlN0cmluZ30sYXJpYURlc2NyaWJlZGJ5Ont0eXBlOlN0cmluZ319LHVwPXt0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzdHJveURlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LC4uLmNwLC4uLmxwfSxkcD0oZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQpO2Z1bmN0aW9uIGZwKGUpe3JldHVybiBjKGUpP08oZSk6ZX1mdW5jdGlvbiBwcChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZTtyZXR1cm4gYyh0KT9uZXcgUHJveHkoZSx7fSk6ZX1mdW5jdGlvbiBtcChlLHQpe2xldCBuPWUub3B0aW9ucztuJiZ0JiZPYmplY3QuYXNzaWduKG4sdCl9ZnVuY3Rpb24gaHAoZSx0KXtlLmxhYmVscz10fWZ1bmN0aW9uIGdwKGUsdCxuKXtsZXQgcj1bXTtlLmRhdGFzZXRzPXQubWFwKHQ9PntsZXQgaT1lLmRhdGFzZXRzLmZpbmQoZT0+ZVtuXT09PXRbbl0pO3JldHVybiFpfHwhdC5kYXRhfHxyLmluY2x1ZGVzKGkpP3suLi50fTooci5wdXNoKGkpLE9iamVjdC5hc3NpZ24oaSx0KSxpKX0pfWZ1bmN0aW9uIF9wKGUsdCl7bGV0IG49e2xhYmVsczpbXSxkYXRhc2V0czpbXX07cmV0dXJuIGhwKG4sZS5sYWJlbHMpLGdwKG4sZS5kYXRhc2V0cyx0KSxufXZhciB2cD1SKHtwcm9wczp1cCxzZXR1cChlLHQpe2xldHtleHBvc2U6bixzbG90czpyfT10LGk9RihudWxsKSxhPXcobnVsbCk7bih7Y2hhcnQ6YX0pO2xldCBvPSgpPT57aWYoIWkudmFsdWUpcmV0dXJuO2xldHt0eXBlOnQsZGF0YTpuLG9wdGlvbnM6cixwbHVnaW5zOm8sZGF0YXNldElkS2V5OnN9PWUsYz1wcChfcChuLHMpLG4pO2EudmFsdWU9bmV3IGpkKGkudmFsdWUse3R5cGU6dCxkYXRhOmMsb3B0aW9uczp7Li4ucn0scGx1Z2luczpvfSl9LHM9KCk9PntsZXQgdD1PKGEudmFsdWUpO3QmJihlLmRlc3Ryb3lEZWxheT4wP3NldFRpbWVvdXQoKCk9Pnt0LmRlc3Ryb3koKSxhLnZhbHVlPW51bGx9LGUuZGVzdHJveURlbGF5KToodC5kZXN0cm95KCksYS52YWx1ZT1udWxsKSl9LGM9dD0+e3QudXBkYXRlKGUudXBkYXRlTW9kZSl9O3JldHVybiBNZShvKSx3ZShzKSxWKFsoKT0+ZS5vcHRpb25zLCgpPT5lLmRhdGFdLCh0LG4pPT57bGV0W3IsaV09dCxbbyxzXT1uLGw9TyhhLnZhbHVlKTtpZighbClyZXR1cm47bGV0IHU9ITE7aWYocil7bGV0IGU9ZnAociksdD1mcChvKTtlJiZlIT09dCYmKG1wKGwsZSksdT0hMCl9aWYoaSl7bGV0IHQ9ZnAoaS5sYWJlbHMpLG49ZnAocy5sYWJlbHMpLHI9ZnAoaS5kYXRhc2V0cyksYT1mcChzLmRhdGFzZXRzKTt0IT09biYmKGhwKGwuY29uZmlnLmRhdGEsdCksdT0hMCksciYmciE9PWEmJihncChsLmNvbmZpZy5kYXRhLHIsZS5kYXRhc2V0SWRLZXkpLHU9ITApfXUmJnhlKCgpPT57YyhsKX0pfSx7ZGVlcDohMH0pLCgpPT5BZShgY2FudmFzYCx7cm9sZTpgaW1nYCwiYXJpYS1sYWJlbCI6ZS5hcmlhTGFiZWwsImFyaWEtZGVzY3JpYmVkYnkiOmUuYXJpYURlc2NyaWJlZGJ5LHJlZjppfSxbQWUoYHBgLHt9LFtyLmRlZmF1bHQ/ci5kZWZhdWx0KCk6YGBdKV0pfX0pO2Z1bmN0aW9uIHlwKGUsdCl7cmV0dXJuIGpkLnJlZ2lzdGVyKHQpLFIoe3Byb3BzOmNwLHNldHVwKHQsbil7bGV0e2V4cG9zZTpyfT1uLGk9dyhudWxsKSxhPXcobnVsbCk7VigoKT0+YS52YWx1ZT8uY2hhcnQ/P251bGwsZT0+e2kudmFsdWU9ZX0se2ZsdXNoOmBzeW5jYH0pLHIoe2NoYXJ0Oml9KTtsZXQgbz1lPT57YS52YWx1ZT1lfTtyZXR1cm4oKT0+QWUodnAsZHAoe3JlZjpvfSx7dHlwZTplLC4uLnR9KSl9fSl9dmFyIGJwPXlwKGBiYXJgLFRsKTtqZC5yZWdpc3RlcihUbCxIZCxDZixEZixaZCx2Zik7ZnVuY3Rpb24geHAoKXtsZXQgZT1GKGBgKSx0PUYoYGApLG49RihgYCk7ZnVuY3Rpb24gcigpe2xldCByPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtlLnZhbHVlPXIuZ2V0UHJvcGVydHlWYWx1ZShgLS1mb3JlZ3JvdW5kYCkudHJpbSgpLHQudmFsdWU9ci5nZXRQcm9wZXJ0eVZhbHVlKGAtLW11dGVkLWZvcmVncm91bmRgKS50cmltKCksbi52YWx1ZT1yLmdldFByb3BlcnR5VmFsdWUoYC0tYm9yZGVyYCkudHJpbSgpfWxldCBpO3JldHVybiBNZSgoKT0+e3IoKSxpPXdpbmRvdy5tYXRjaE1lZGlhKGAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspYCksaS5hZGRFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSksSWUoKCk9PntpPy5yZW1vdmVFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSkse2ZvcmVncm91bmQ6ZSxtdXRlZEZvcmVncm91bmQ6dCxib3JkZXI6bn19dmFyIFNwPXtjb3N0OmBDb3N0YCxyZXE6YFJlcXVlc3RzYCx0b2tpbjpgVG9rZW5zIGluYCx0b2tvdXQ6YFRva2VucyBvdXRgfSxDcD0yMCx3cD0xMDAsVHA9M2U0LEVwPXtob3VyOjI0LGRheTozMCxtb250aDoxMn0sRHA9e2hvdXI6YDI0aGAsZGF5OmAzMGRgLG1vbnRoOmAxMm1vYH07ZnVuY3Rpb24gT3AoZSl7c3dpdGNoKGUpe2Nhc2VgcmVxdWVzdHNgOnJldHVybltgcmVxYF07Y2FzZWB0b2tlbnNgOnJldHVybltgdG9raW5gLGB0b2tvdXRgXTtjYXNlYGNvc3RgOnJldHVybltgY29zdGBdO2Nhc2VgbW9kZWxzYDpyZXR1cm5bXX19dmFyIGtwPWRlKGBoaXN0b3J5YCx7c3RhdGU6KCk9Pih7c2NvcGU6YHRvdGFsYCx3aW5kb3c6YGhvdXJgLHRhYjpgcmVxdWVzdHNgLG1vZGVsTWV0cmljOmBjb3N0YCxzZXJpZXNCeU1ldHJpYzp7fSxtb2RlbFJhbmtpbmc6W10sbW9kZWxPcHRpb25zOltdLGxvYWRpbmc6ITEsZXJyb3I6YGAsdGltZXI6dm9pZCAwfSksYWN0aW9uczp7c2V0U2NvcGUoZSl7ZSE9PXRoaXMuc2NvcGUmJih0aGlzLnNjb3BlPWUsdGhpcy5yZWZyZXNoKCkpfSxzZXRXaW5kb3coZSl7ZSE9PXRoaXMud2luZG93JiYodGhpcy53aW5kb3c9ZSx0aGlzLnJlZnJlc2goKSl9LHNldFRhYihlKXtlIT09dGhpcy50YWImJih0aGlzLnRhYj1lLHRoaXMucmVmcmVzaCgpKX0sc2V0TW9kZWxNZXRyaWMoZSl7ZSE9PXRoaXMubW9kZWxNZXRyaWMmJih0aGlzLm1vZGVsTWV0cmljPWUsdGhpcy5yZWZyZXNoKCkpfSxhc3luYyByZWZyZXNoKCl7YXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMudGFiPT09YG1vZGVsc2A/dGhpcy5mZXRjaE1vZGVsUmFua2luZygpOnRoaXMuZmV0Y2hTZXJpZXMoKSx0aGlzLmZldGNoTW9kZWxPcHRpb25zKCldKX0sYXN5bmMgZmV0Y2hTZXJpZXMoKXtpZihqZSgpLmlzQXV0aGVudGljYXRlZCl7dGhpcy5sb2FkaW5nPSEwO3RyeXtsZXQgZT1FcFt0aGlzLndpbmRvd10sdD1PcCh0aGlzLnRhYiksbj1hd2FpdCBQcm9taXNlLmFsbCh0Lm1hcCh0PT5GZShgL2FkbWluL2FwaS91c2FnZS9oaXN0b3J5P3Njb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2NvcGUpfSZtZXRyaWM9JHt0fSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mc3Bhbj0ke2V9YCkpKSxyPXt9O3QuZm9yRWFjaCgoZSx0KT0+e3JbZV09blt0XS5wb2ludHN9KSx0aGlzLnNlcmllc0J5TWV0cmljPXIsdGhpcy5lcnJvcj1gYH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgYmUmJihlLnN0YXR1cz09PTQwMXx8ZS5zdGF0dXM9PT00MDMpKXJldHVybjt0aGlzLmVycm9yPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWZpbmFsbHl7dGhpcy5sb2FkaW5nPSExfX19LGFzeW5jIGZldGNoTW9kZWxSYW5raW5nKCl7aWYoamUoKS5pc0F1dGhlbnRpY2F0ZWQpe3RoaXMubG9hZGluZz0hMDt0cnl7bGV0IGU9YXdhaXQgRmUoYC9hZG1pbi9hcGkvdXNhZ2UvbW9kZWxzP21ldHJpYz0ke3RoaXMubW9kZWxNZXRyaWN9JndpbmRvdz0ke3RoaXMud2luZG93fSZsaW1pdD0ke0NwfWApO3RoaXMubW9kZWxSYW5raW5nPWUubW9kZWxzLHRoaXMuZXJyb3I9YGB9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGJlJiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSlyZXR1cm47dGhpcy5lcnJvcj1lIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1maW5hbGx5e3RoaXMubG9hZGluZz0hMX19fSxhc3luYyBmZXRjaE1vZGVsT3B0aW9ucygpe2lmKGplKCkuaXNBdXRoZW50aWNhdGVkKXRyeXtsZXQgZT1hd2FpdCBGZShgL2FkbWluL2FwaS91c2FnZS9tb2RlbHM/bWV0cmljPXJlcSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mbGltaXQ9JHt3cH1gKTt0aGlzLm1vZGVsT3B0aW9ucz1lLm1vZGVsc31jYXRjaHt9fSxzdGFydEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lcj09PXZvaWQgMCYmKHRoaXMudGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgdGhpcy5yZWZyZXNoKCksVHApKX0sc3RvcEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxBcD17a2V5OjAsY2xhc3M6YHB5LTggdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxqcD1SKHtfX25hbWU6YE1vZGVsVXNhZ2VDaGFydGAscHJvcHM6e21ldHJpYzp7fSxtb2RlbHM6e319LHNldHVwKGUpe2xldCB0PWUse2ZvcmVncm91bmQ6bixtdXRlZEZvcmVncm91bmQ6cixib3JkZXI6YX09eHAoKSxvPXtyZXE6YC0tY2hhcnQtcmVxdWVzdHNgLHRva2luOmAtLWNoYXJ0LXRva2Vucy1pbmAsdG9rb3V0OmAtLWNoYXJ0LXRva2Vucy1vdXRgLGNvc3Q6YC0tY2hhcnQtY29zdGB9O2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZT09PWBjb3N0YD90LzFlNjp0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGUpLnRyaW0oKX1sZXQgbD1NKCgpPT4obi52YWx1ZSx7bGFiZWxzOnQubW9kZWxzLm1hcChlPT5lLmlkKSxkYXRhc2V0czpbe2xhYmVsOlNwW3QubWV0cmljXSxiYWNrZ3JvdW5kQ29sb3I6YyhvW3QubWV0cmljXSksZGF0YTp0Lm1vZGVscy5tYXAoZT0+cyh0Lm1ldHJpYyxlLnZhbHVlKSl9XX0pKSx1PU0oKCk9PmAke01hdGgubWF4KDE4MCx0Lm1vZGVscy5sZW5ndGgqMjgrNjApfXB4YCksZD1NKCgpPT4oe2luZGV4QXhpczpgeWAscmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e2JlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmEudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQubWV0cmljPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19LHk6e2dyaWQ6e2Rpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGF1dG9Ta2lwOiExfX19LHBsdWdpbnM6e2xlZ2VuZDp7ZGlzcGxheTohMX0sdG9vbHRpcDp7Y2FsbGJhY2tzOntsYWJlbDplPT57bGV0IG49ZS5wYXJzZWQueD8/MDtyZXR1cm4gdC5tZXRyaWM9PT1gY29zdGA/YCR7U3BbdC5tZXRyaWNdfTogJCR7bi50b0ZpeGVkKDQpfWA6YCR7U3BbdC5tZXRyaWNdfTogJHtrZShuKX0gKCR7VWUobil9KWB9fX19fSkpO3JldHVybih0LG4pPT5lLm1vZGVscy5sZW5ndGg9PT0wPyhOKCksUChgcGAsQXAsYCBObyBtb2RlbCByZWNvcmRlZCBhbnkgdXNhZ2UgaW4gdGhpcyB3aW5kb3cuIGApKTooTigpLFAoYGRpdmAse2tleToxLGNsYXNzOmB3LWZ1bGxgLHN0eWxlOmkoe2hlaWdodDp1LnZhbHVlfSl9LFtMKGIoYnApLHtkYXRhOmwudmFsdWUsb3B0aW9uczpkLnZhbHVlfSxudWxsLDgsW2BkYXRhYCxgb3B0aW9uc2BdKV0sNCkpfX0pLE1wPXtjbGFzczpgaC03MiB3LWZ1bGxgfSxOcD1SKHtfX25hbWU6YFVzYWdlQ2hhcnRgLHByb3BzOnt0YWI6e30sd2luZG93Ont9LHNlcmllc0J5TWV0cmljOnt9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3JlZ3JvdW5kOm4sbXV0ZWRGb3JlZ3JvdW5kOnIsYm9yZGVyOml9PXhwKCksYT17cmVxdWVzdHM6W3ttZXRyaWM6YHJlcWAsbGFiZWw6YFJlcXVlc3RzYCxjb2xvcjpgLS1jaGFydC1yZXF1ZXN0c2B9XSx0b2tlbnM6W3ttZXRyaWM6YHRva2luYCxsYWJlbDpgVG9rZW5zIGluYCxjb2xvcjpgLS1jaGFydC10b2tlbnMtaW5gfSx7bWV0cmljOmB0b2tvdXRgLGxhYmVsOmBUb2tlbnMgb3V0YCxjb2xvcjpgLS1jaGFydC10b2tlbnMtb3V0YH1dLGNvc3Q6W3ttZXRyaWM6YGNvc3RgLGxhYmVsOmBDb3N0IChVU0QpYCxjb2xvcjpgLS1jaGFydC1jb3N0YH1dfTtmdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGU9PT1gY29zdGA/dC8xZTY6dH1sZXQgcz1NKCgpPT57bGV0IGU9YVt0LnRhYl0sbj1uZXcgU2V0O2ZvcihsZXQgciBvZiBlKWZvcihsZXQgZSBvZiB0LnNlcmllc0J5TWV0cmljW3IubWV0cmljXT8/W10pbi5hZGQoZS5idWNrZXQpO3JldHVybiBBcnJheS5mcm9tKG4pLnNvcnQoKX0pLGM9TSgoKT0+cy52YWx1ZS5tYXAoZT0+X2UoZSx0LndpbmRvdykpKTtmdW5jdGlvbiBsKGUpe3JldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShlKS50cmltKCl9bGV0IHU9TSgoKT0+e24udmFsdWU7bGV0IGU9cy52YWx1ZTtyZXR1cm57bGFiZWxzOmMudmFsdWUsZGF0YXNldHM6YVt0LnRhYl0ubWFwKG49PntsZXQgcj1uZXcgTWFwKCh0LnNlcmllc0J5TWV0cmljW24ubWV0cmljXT8/W10pLm1hcChlPT5bZS5idWNrZXQsZS52YWx1ZV0pKTtyZXR1cm57bGFiZWw6bi5sYWJlbCxiYWNrZ3JvdW5kQ29sb3I6bChuLmNvbG9yKSxkYXRhOmUubWFwKGU9Pm8obi5tZXRyaWMsci5nZXQoZSk/PzApKX19KX19KSxkPU0oKCk9PmFbdC50YWJdLmxlbmd0aD4xKSxmPU0oKCk9Pih7cmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e3N0YWNrZWQ6ZC52YWx1ZSxncmlkOntjb2xvcjppLnZhbHVlLGRpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlfX0seTp7c3RhY2tlZDpkLnZhbHVlLGJlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmkudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQudGFiPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19fSxwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZC52YWx1ZSxsYWJlbHM6e2NvbG9yOm4udmFsdWV9fSx0b29sdGlwOntjYWxsYmFja3M6e2xhYmVsOmU9PntsZXQgbj1lLnBhcnNlZC55Pz8wO3JldHVybiB0LnRhYj09PWBjb3N0YD9gJHtlLmRhdGFzZXQubGFiZWx9OiAkJHtuLnRvRml4ZWQoNCl9YDpgJHtlLmRhdGFzZXQubGFiZWx9OiAke2tlKG4pfSAoJHtVZShuKX0pYH19fX19KSk7cmV0dXJuKGUsdCk9PihOKCksUChgZGl2YCxNcCxbTChiKGJwKSx7ZGF0YTp1LnZhbHVlLG9wdGlvbnM6Zi52YWx1ZX0sbnVsbCw4LFtgZGF0YWAsYG9wdGlvbnNgXSldKSl9fSksUHA9e2NsYXNzOmBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNgfSxGcD17a2V5OjAsY2xhc3M6YHRleHQtc20gdGV4dC1kZXN0cnVjdGl2ZWB9LElwPXtjbGFzczpgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxMcD1SKHtfX25hbWU6YENoYXJ0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXllKCksbj1rcCgpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT1QZSgpLG89TSgoKT0+e2xldCBlPXQudXNhZ2U/LnVzZXJzPz9bXSxyPXQudXNhZ2U/Lmdyb3Vwcz8/W10sbz1lLmZpbHRlcihlPT4hYS52YWx1ZXx8TmUoZSxpLnZhbHVlKXx8YHVzZXI6JHtlLmlkfWA9PT1uLnNjb3BlKS5tYXAoZT0+KHt2YWx1ZTpgdXNlcjoke2UuaWR9YCxsYWJlbDplLmlkfSkpLHM9ci5maWx0ZXIodD0+IWEudmFsdWV8fFZlKHQsZSxpLnZhbHVlKXx8YGdyb3VwOiR7dC5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YGdyb3VwOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSksYz0obi5tb2RlbE9wdGlvbnM/P1tdKS5maWx0ZXIoZT0+IWEudmFsdWV8fGUuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpLnZhbHVlKXx8YG1vZGVsOiR7ZS5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YG1vZGVsOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSk7cmV0dXJuIG4uc2NvcGUuc3RhcnRzV2l0aChgbW9kZWw6YCkmJiFjLnNvbWUoZT0+ZS52YWx1ZT09PW4uc2NvcGUpJiZjLnB1c2goe3ZhbHVlOm4uc2NvcGUsbGFiZWw6bi5zY29wZS5zbGljZSg2KX0pLFt7dmFsdWU6YHRvdGFsYCxsYWJlbDpgVG90YWwgKGFsbCB0cmFmZmljKWB9LC4uLnMsLi4ubywuLi5jXX0pLHM9W2Bob3VyYCxgZGF5YCxgbW9udGhgXSxjPVtgY29zdGAsYHJlcWAsYHRva2luYCxgdG9rb3V0YF0sbD1NKCgpPT5uLnRhYj09PWBtb2RlbHNgP2ByZXF1ZXN0c2A6bi50YWIpO2Z1bmN0aW9uIHUoZSl7bi5zZXRUYWIoZSl9ZnVuY3Rpb24gZChlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0U2NvcGUoZSl9ZnVuY3Rpb24gZihlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0TW9kZWxNZXRyaWMoZSl9cmV0dXJuIE1lKCgpPT57bi5yZWZyZXNoKCksbi5zdGFydEF1dG9SZWZyZXNoKCl9KSx3ZSgoKT0+e24uc3RvcEF1dG9SZWZyZXNoKCl9KSxWKG8sZT0+e2Uuc29tZShlPT5lLnZhbHVlPT09bi5zY29wZSl8fG4uc2V0U2NvcGUoYHRvdGFsYCl9KSwoZSx0KT0+KE4oKSxJKGIoR2UpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihTZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5gfSx7ZGVmYXVsdDpCKCgpPT5bTChiKENlKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsuLi50WzJdfHw9W2dlKGBVc2FnZSBjaGFydHNgLC0xKV1dKSxfOjF9KSxIZShgZGl2YCxQcCxbTChCZSx7bW9kZWxWYWx1ZTpiKHIpLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+RShyKT9yLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzLCBncm91cHMgb3IgbW9kZWxzYCxjbGFzczpgdy01NmB9LG51bGwsOCxbYG1vZGVsVmFsdWVgXSksYihuKS50YWI9PT1gbW9kZWxzYD8oTigpLEkoYihYaSkse2tleTowLCJtb2RlbC12YWx1ZSI6YihuKS5tb2RlbE1ldHJpYywib25VcGRhdGU6bW9kZWxWYWx1ZSI6Zn0se2RlZmF1bHQ6QigoKT0+W0woYihuYSkse2NsYXNzOmB3LTQwYCwiYXJpYS1sYWJlbCI6YFJhbmsgbW9kZWxzIGJ5YH0se2RlZmF1bHQ6QigoKT0+W0woYihyYSkse3BsYWNlaG9sZGVyOmBSYW5rIGJ5YH0pXSksXzoxfSksTChiKFppKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsoTigpLFAoayxudWxsLG1lKGMsZT0+TChiKCRpKSx7a2V5OmUsdmFsdWU6ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGIoU3ApW2VdKSwxKV0pLF86Mn0sMTAzMixbYHZhbHVlYF0pKSw2NCkpXSksXzoxfSldKSxfOjF9LDgsW2Btb2RlbC12YWx1ZWBdKSk6KE4oKSxJKGIoWGkpLHtrZXk6MSwibW9kZWwtdmFsdWUiOmIobikuc2NvcGUsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmR9LHtkZWZhdWx0OkIoKCk9PltMKGIobmEpLHtjbGFzczpgdy01NmB9LHtkZWZhdWx0OkIoKCk9PltMKGIocmEpLHtwbGFjZWhvbGRlcjpgU2NvcGVgfSldKSxfOjF9KSxMKGIoWmkpLG51bGwse2RlZmF1bHQ6QigoKT0+WyhOKCEwKSxQKGssbnVsbCxtZShvLnZhbHVlLGU9PihOKCksSShiKCRpKSx7a2V5OmUudmFsdWUsdmFsdWU6ZS52YWx1ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGUubGFiZWwpLDEpXSksXzoyfSwxMDMyLFtgdmFsdWVgXSkpKSwxMjgpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSkpLEwoYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS53aW5kb3csIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMV18fD1lPT5iKG4pLnNldFdpbmRvdyhlKX0se2RlZmF1bHQ6QigoKT0+W0woYihUZSksbnVsbCx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxQKGssbnVsbCxtZShzLGU9PkwoYihSZSkse2tleTplLHZhbHVlOmV9LHtkZWZhdWx0OkIoKCk9PltnZShjZShiKERwKVtlXSksMSldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSksNjQpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSldKV0pLF86MX0pLEwoYihwZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00YH0se2RlZmF1bHQ6QigoKT0+W0woYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS50YWIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnV9LHtkZWZhdWx0OkIoKCk9PltMKGIoVGUpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihSZSkse3ZhbHVlOmByZXF1ZXN0c2B9LHtkZWZhdWx0OkIoKCk9PlsuLi50WzNdfHw9W2dlKGBSZXF1ZXN0c2AsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmB0b2tlbnNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs0XXx8PVtnZShgVG9rZW5zYCwtMSldXSksXzoxfSksTChiKFJlKSx7dmFsdWU6YGNvc3RgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs1XXx8PVtnZShgQ29zdGAsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmBtb2RlbHNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs2XXx8PVtnZShgTW9kZWxzYCwtMSldXSksXzoxfSldKSxfOjF9KV0pLF86MX0sOCxbYG1vZGVsLXZhbHVlYF0pLGIobikuZXJyb3I/KE4oKSxQKGBwYCxGcCxjZShiKG4pLmVycm9yKSwxKSk6emUoYGAsITApLGIobikudGFiPT09YG1vZGVsc2A/KE4oKSxQKGsse2tleToxfSxbSGUoYHBgLElwLGAgTW9kZWxzIHdpdGggdXNhZ2UgaW4gdGhlIHNlbGVjdGVkIHdpbmRvdywgcmFua2VkIGJ5IGArY2UoYihTcClbYihuKS5tb2RlbE1ldHJpY10udG9Mb3dlckNhc2UoKSkrYC4gRWFjaCByb3cgaXMgdGhlIHByb3ZpZGVyIHRoYXQgc2VydmVkIHRoZSB0cmFmZmljLCBzbyBhIG1vZGVsIHJlYWNoZWQgdGhyb3VnaCBtb3JlIHRoYW4gb25lIHByb3ZpZGVyIGFwcGVhcnMgb25jZSBwZXIgcHJvdmlkZXIuIGAsMSksTChqcCx7bWV0cmljOmIobikubW9kZWxNZXRyaWMsbW9kZWxzOmIobikubW9kZWxSYW5raW5nfSxudWxsLDgsW2BtZXRyaWNgLGBtb2RlbHNgXSldLDY0KSk6KE4oKSxJKE5wLHtrZXk6Mix0YWI6bC52YWx1ZSx3aW5kb3c6YihuKS53aW5kb3csInNlcmllcy1ieS1tZXRyaWMiOmIobikuc2VyaWVzQnlNZXRyaWN9LG51bGwsOCxbYHRhYmAsYHdpbmRvd2AsYHNlcmllcy1ieS1tZXRyaWNgXSkpXSksXzoxfSldKSxfOjF9KSl9fSk7ZXhwb3J0e0xwIGFzIGRlZmF1bHR9Ow==", + "aW1wb3J0eyQgYXMgZSxBIGFzIHQsQXQgYXMgbixCIGFzIHIsQnQgYXMgaSxDIGFzIGEsQ3QgYXMgbyxEIGFzIHMsRHQgYXMgYyxFIGFzIGwsRXQgYXMgdSxGIGFzIGQsRnQgYXMgZixHIGFzIHAsSCBhcyBtLEkgYXMgaCxJdCBhcyBnLEogYXMgXyxLIGFzIHYsTCBhcyB5LEx0IGFzIGIsTSBhcyB4LE10IGFzIFMsTiBhcyBDLE50IGFzIHcsTyBhcyBULE90IGFzIEUsUCBhcyBELFB0IGFzIE8sUSBhcyBrLFIgYXMgZWUsUnQgYXMgdGUsUyBhcyBuZSxTdCBhcyByZSxUIGFzIGllLFR0IGFzIGFlLFUgYXMgb2UsViBhcyBzZSxWdCBhcyBjZSxXIGFzIGxlLFggYXMgdWUsWSBhcyBkZSxaIGFzIGZlLF8gYXMgcGUsX3QgYXMgbWUsYSBhcyBoZSxhdCBhcyBnZSxiIGFzIEEsYyBhcyBfZSxjdCBhcyB2ZSxkIGFzIHllLGR0IGFzIGosZXQgYXMgTSxmIGFzIGJlLGZ0IGFzIHhlLGcgYXMgU2UsZ3QgYXMgTixoIGFzIENlLGh0IGFzIHdlLGkgYXMgVGUsaXQgYXMgUCxqIGFzIEVlLGp0IGFzIEYsayBhcyBEZSxrdCBhcyBPZSxsIGFzIGtlLGx0IGFzIEFlLG0gYXMgamUsbXQgYXMgTWUsbiBhcyBOZSxudCBhcyBJLG8gYXMgUGUsb3QgYXMgTCxwIGFzIEZlLHB0IGFzIEllLHEgYXMgTGUsciBhcyBSZSxydCBhcyB6ZSxzIGFzIEJlLHN0IGFzIFIsdCBhcyBWZSx0dCBhcyBIZSx1IGFzIFVlLHV0IGFzIFdlLHYgYXMgR2UsdnQgYXMgeix3IGFzIEtlLHd0IGFzIEIseCBhcyBxZSx4dCBhcyBWLHkgYXMgSmUseXQgYXMgWWUseiBhcyBYZSx6dCBhcyBaZX1mcm9tIi4vaW5kZXgtQ3dQX01iT2IuanMiO2Z1bmN0aW9uIFFlKGUsdD0tMS8wLG49MS8wKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiAkZShlLHQsbil7bGV0IHI9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxpPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSksci5kaXNwYXRjaEV2ZW50KGkpfXZhciBldD1uKHtsYXllcnNSb290Om5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzOnZvaWQgMCxicmFuY2hlczpuZXcgU2V0fSk7ZnVuY3Rpb24gdHQoZSl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4hMTtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHQhPT1udWxsJiZ0IT09T2JqZWN0LnByb3RvdHlwZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpIT09bnVsbHx8U3ltYm9sLml0ZXJhdG9yIGluIGU/ITE6U3ltYm9sLnRvU3RyaW5nVGFnIGluIGU/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgTW9kdWxlXWA6ITB9ZnVuY3Rpb24gbnQoZSx0LG49YC5gLHIpe2lmKCF0dCh0KSlyZXR1cm4gbnQoZSx7fSxuLHIpO2xldCBpPXsuLi50fTtmb3IobGV0IHQgb2YgT2JqZWN0LmtleXMoZSkpe2lmKHQ9PT1gX19wcm90b19fYHx8dD09PWBjb25zdHJ1Y3RvcmApY29udGludWU7bGV0IGE9ZVt0XTthIT1udWxsJiYociYmcihpLHQsYSxuKXx8KGlbdF09QXJyYXkuaXNBcnJheShhKSYmQXJyYXkuaXNBcnJheShpW3RdKT9bLi4uYSwuLi5pW3RdXTp0dChhKSYmdHQoaVt0XSk/bnQoYSxpW3RdLChuP2Ake259LmA6YGApK3QudG9TdHJpbmcoKSxyKTphKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuKC4uLnQpPT50LnJlZHVjZSgodCxuKT0+bnQodCxuLGBgLGUpLHt9KX12YXIgaXQ9cnQoKSxhdD1kKCgpPT57bGV0IGU9RihuZXcgTWFwKSxuPUYoKSxyPU0oKCk9Pntmb3IobGV0IHQgb2YgZS52YWx1ZS52YWx1ZXMoKSlpZih0KXJldHVybiEwO3JldHVybiExfSksaT1zKHtzY3JvbGxCb2R5OkYoITApfSksYT1udWxsLG89KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gYCxkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0PWBgLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPWBgKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0tc2Nyb2xsYmFyLXdpZHRoYCksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1uLnZhbHVlPz9gYCx5JiZhPy4oKSxuLnZhbHVlPXZvaWQgMH07cmV0dXJuIFYociwoZSxzKT0+e2lmKCFoKXJldHVybjtpZighZSl7cyYmbygpO3JldHVybn1uLnZhbHVlPT09dm9pZCAwJiYobi52YWx1ZT1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93KTtsZXQgYz13aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsbD17cGFkZGluZzpjLG1hcmdpbjowfSx1PWkuc2Nyb2xsQm9keT8udmFsdWU/dHlwZW9mIGkuc2Nyb2xsQm9keS52YWx1ZT09YG9iamVjdGA/aXQoe3BhZGRpbmc6aS5zY3JvbGxCb2R5LnZhbHVlLnBhZGRpbmc9PT0hMD9jOmkuc2Nyb2xsQm9keS52YWx1ZS5wYWRkaW5nLG1hcmdpbjppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2luPT09ITA/YzppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2lufSxsKTpsOntwYWRkaW5nOjAsbWFyZ2luOjB9O2M+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXR5cGVvZiB1LnBhZGRpbmc9PWBudW1iZXJgP2Ake3UucGFkZGluZ31weGA6U3RyaW5nKHUucGFkZGluZyksZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodD10eXBlb2YgdS5tYXJnaW49PWBudW1iZXJgP2Ake3UubWFyZ2lufXB4YDpTdHJpbmcodS5tYXJnaW4pLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShgLS1zY3JvbGxiYXItd2lkdGhgLGAke2N9cHhgKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PWBoaWRkZW5gKSx5JiYoYT10KGRvY3VtZW50LGB0b3VjaG1vdmVgLGU9PmN0KGUpLHtwYXNzaXZlOiExfSkpLHhlKCgpPT57ci52YWx1ZSYmKGRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1gaGlkZGVuYCl9KX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgc3luY2B9KSxlfSk7ZnVuY3Rpb24gb3QoZSl7bGV0IHQ9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsNyksbj1hdCgpO24udmFsdWUuc2V0KHQsZT8/ITEpO2xldCBpPU0oe2dldDooKT0+bi52YWx1ZS5nZXQodCk/PyExLHNldDplPT5uLnZhbHVlLnNldCh0LGUpfSk7cmV0dXJuIHIoKCk9PntuLnZhbHVlLmRlbGV0ZSh0KX0pLGl9ZnVuY3Rpb24gc3QoZSl7bGV0IHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7aWYodC5vdmVyZmxvd1g9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1k9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1g9PT1gYXV0b2AmJmUuY2xpZW50V2lkdGg8ZS5zY3JvbGxXaWR0aHx8dC5vdmVyZmxvd1k9PT1gYXV0b2AmJmUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0KXJldHVybiEwO3tsZXQgdD1lLnBhcmVudE5vZGU7cmV0dXJuISh0IGluc3RhbmNlb2YgRWxlbWVudCl8fHQudGFnTmFtZT09PWBCT0RZYD8hMTpzdCh0KX19ZnVuY3Rpb24gY3QoZSl7bGV0IHQ9ZXx8d2luZG93LmV2ZW50LG49dC50YXJnZXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBFbGVtZW50JiZzdChuKT8hMTp0LnRvdWNoZXMubGVuZ3RoPjF8fCh0LnByZXZlbnREZWZhdWx0JiZ0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKSwhMSl9dmFyIGx0PTA7ZnVuY3Rpb24gdXQoKXtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtZm9jdXMtZ3VhcmRdYCk7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoYGFmdGVyYmVnaW5gLHRbMF0/P2R0KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KGBiZWZvcmVlbmRgLHRbMV0/P2R0KCkpLGx0KyssZSgoKT0+e2x0PT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtcmVrYS1mb2N1cy1ndWFyZF1gKS5mb3JFYWNoKGU9PmUucmVtb3ZlKCkpLGx0LS19KX0pfWZ1bmN0aW9uIGR0KCl7bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgc3BhbmApO3JldHVybiBlLnNldEF0dHJpYnV0ZShgZGF0YS1yZWthLWZvY3VzLWd1YXJkYCxgYCksZS50YWJJbmRleD0wLGUuc3R5bGUub3V0bGluZT1gbm9uZWAsZS5zdHlsZS5vcGFjaXR5PWAwYCxlLnN0eWxlLnBvc2l0aW9uPWBmaXhlZGAsZS5zdHlsZS5wb2ludGVyRXZlbnRzPWBub25lYCxlfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBNKCgpPT4hZyhlKXx8ISFEZShlKT8uY2xvc2VzdChgZm9ybWApKX12YXIgcHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudD5gdWA/bnVsbDooQXJyYXkuaXNBcnJheShlKT9lWzBdOmUpLm93bmVyRG9jdW1lbnQuYm9keX0sbXQ9bmV3IFdlYWtNYXAsaHQ9bmV3IFdlYWtNYXAsZ3Q9e30sX3Q9MCx2dD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuaG9zdHx8dnQoZS5wYXJlbnROb2RlKSl9LHl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe2lmKGUuY29udGFpbnModCkpcmV0dXJuIHQ7dmFyIG49dnQodCk7cmV0dXJuIG4mJmUuY29udGFpbnMobik/bjooY29uc29sZS5lcnJvcihgYXJpYS1oaWRkZW5gLHQsYGluIG5vdCBjb250YWluZWQgaW5zaWRlYCxlLGAuIERvaW5nIG5vdGhpbmdgKSxudWxsKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hIWV9KX0sYnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eXQodCxBcnJheS5pc0FycmF5KGUpP2U6W2VdKTtndFtuXXx8KGd0W25dPW5ldyBXZWFrTWFwKTt2YXIgYT1ndFtuXSxvPVtdLHM9bmV3IFNldCxjPW5ldyBTZXQoaSksbD1mdW5jdGlvbihlKXshZXx8cy5oYXMoZSl8fChzLmFkZChlKSxsKGUucGFyZW50Tm9kZSkpfTtpLmZvckVhY2gobCk7dmFyIHU9ZnVuY3Rpb24oZSl7IWV8fGMuaGFzKGUpfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7aWYocy5oYXMoZSkpdShlKTtlbHNlIHRyeXt2YXIgdD1lLmdldEF0dHJpYnV0ZShyKSxpPXQhPT1udWxsJiZ0IT09YGZhbHNlYCxjPShtdC5nZXQoZSl8fDApKzEsbD0oYS5nZXQoZSl8fDApKzE7bXQuc2V0KGUsYyksYS5zZXQoZSxsKSxvLnB1c2goZSksYz09PTEmJmkmJmh0LnNldChlLCEwKSxsPT09MSYmZS5zZXRBdHRyaWJ1dGUobixgdHJ1ZWApLGl8fGUuc2V0QXR0cmlidXRlKHIsYHRydWVgKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKGBhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gYCxlLHQpfX0pfTtyZXR1cm4gdSh0KSxzLmNsZWFyKCksX3QrKyxmdW5jdGlvbigpe28uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1tdC5nZXQoZSktMSxpPWEuZ2V0KGUpLTE7bXQuc2V0KGUsdCksYS5zZXQoZSxpKSx0fHwoaHQuaGFzKGUpfHxlLnJlbW92ZUF0dHJpYnV0ZShyKSxodC5kZWxldGUoZSkpLGl8fGUucmVtb3ZlQXR0cmlidXRlKG4pfSksX3QtLSxfdHx8KG10PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGd0PXt9KX19LHh0PWZ1bmN0aW9uKGUsdCxuKXtuPT09dm9pZCAwJiYobj1gZGF0YS1hcmlhLWhpZGRlbmApO3ZhciByPUFycmF5LmZyb20oQXJyYXkuaXNBcnJheShlKT9lOltlXSksaT10fHxwdChlKTtyZXR1cm4gaT8oci5wdXNoLmFwcGx5KHIsQXJyYXkuZnJvbShpLnF1ZXJ5U2VsZWN0b3JBbGwoYFthcmlhLWxpdmVdLCBzY3JpcHRgKSkpLGJ0KHIsaSxuLGBhcmlhLWhpZGRlbmApKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX07ZnVuY3Rpb24gU3QoZSl7bGV0IHQ7VigoKT0+RGUoZSksZT0+e2xldCBuPSExO3RyeXtuPSEhZT8uY2xvc2VzdChgW3BvcG92ZXJdOm5vdCg6cG9wb3Zlci1vcGVuKWApfWNhdGNoe31lJiYhbj90PXh0KGUpOnQmJnQoKX0pLHdlKCgpPT57dCYmdCgpfSl9ZnVuY3Rpb24gQ3QoZSl7bGV0IHQ9RigpLG49TSgoKT0+dC52YWx1ZT8ud2lkdGg/PzApLHI9TSgoKT0+dC52YWx1ZT8uaGVpZ2h0Pz8wKSxpO3JldHVybiBNZSgoKT0+e2xldCBuPURlKGUpO24/KHQudmFsdWU9e3dpZHRoOm4ub2Zmc2V0V2lkdGgsaGVpZ2h0Om4ub2Zmc2V0SGVpZ2h0fSxpPW5ldyBSZXNpemVPYnNlcnZlcihlPT57aWYoIUFycmF5LmlzQXJyYXkoZSl8fCFlLmxlbmd0aClyZXR1cm47bGV0IHI9ZVswXSxpLGE7aWYoYGJvcmRlckJveFNpemVgaW4gcil7bGV0IGU9ci5ib3JkZXJCb3hTaXplLHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7aT10LmlubGluZVNpemUsYT10LmJsb2NrU2l6ZX1lbHNlIGk9bi5vZmZzZXRXaWR0aCxhPW4ub2Zmc2V0SGVpZ2h0O3QudmFsdWU9e3dpZHRoOmksaGVpZ2h0OmF9fSksaS5vYnNlcnZlKG4se2JveDpgYm9yZGVyLWJveGB9KSk6dC52YWx1ZT12b2lkIDB9KSx3ZSgoKT0+e2k/LmRpc2Nvbm5lY3QoKSxpPXZvaWQgMH0pLHt3aWR0aDpuLGhlaWdodDpyfX1mdW5jdGlvbiB3dChlKXtsZXQgdD1YZShgYCwxZTMpO3JldHVybntzZWFyY2g6dCxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6KG4scik9PntpZih0LnZhbHVlKz1uLGUpZShuKTtlbHNle2xldCBlPW0oKSxuPXIubWFwKGU9Pih7Li4uZSx0ZXh0VmFsdWU6ZS52YWx1ZT8udGV4dFZhbHVlPz9lLnJlZi50ZXh0Q29udGVudD8udHJpbSgpPz9gYH0pKSxpPW4uZmluZCh0PT50LnJlZj09PWUpLGE9RXQobi5tYXAoZT0+ZS50ZXh0VmFsdWUpLHQudmFsdWUsaT8udGV4dFZhbHVlKSxvPW4uZmluZChlPT5lLnRleHRWYWx1ZT09PWEpO3JldHVybiBvJiZvLnJlZi5mb2N1cygpLG8/LnJlZn19LHJlc2V0VHlwZWFoZWFkOigpPT57dC52YWx1ZT1gYH19fWZ1bmN0aW9uIFR0KGUsdCl7cmV0dXJuIGUubWFwKChuLHIpPT5lWyh0K3IpJWUubGVuZ3RoXSl9ZnVuY3Rpb24gRXQoZSx0LG4pe2xldCByPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkoZT0+ZT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xLGE9VHQoZSxNYXRoLm1heChpLDApKTtyLmxlbmd0aD09PTEmJihhPWEuZmlsdGVyKGU9PmUhPT1uKSk7bGV0IG89YS5maW5kKGU9PmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHIudG9Mb3dlckNhc2UoKSkpO3JldHVybiBvPT09bj92b2lkIDA6b312YXIgRHQ9YGRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlYCxPdD1gZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGVgO2Z1bmN0aW9uIGt0KGUsdCl7aWYoISh0IGluc3RhbmNlb2YgRWxlbWVudCkpcmV0dXJuITE7bGV0IG49dC5jbG9zZXN0KGBbZGF0YS1kaXNtaXNzYWJsZS1sYXllcl1gKSxyPWUuZGF0YXNldC5kaXNtaXNzYWJsZUxheWVyPT09YGA/ZTplLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWRpc21pc3NhYmxlLWxheWVyXWApLGk9QXJyYXkuZnJvbShlLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtZGlzbWlzc2FibGUtbGF5ZXJdYCkpO3JldHVybiEhKG4mJihyPT09bnx8aS5pbmRleE9mKHIpPGkuaW5kZXhPZihuKSkpfWZ1bmN0aW9uIEF0KGUsdCxuPSEwKXtsZXQgcj10Py52YWx1ZT8ub3duZXJEb2N1bWVudD8/Z2xvYmFsVGhpcz8uZG9jdW1lbnQsaT1GKCExKSxhPUYoKCk9Pnt9KTtyZXR1cm4gcmUobz0+e2lmKCFofHwhZyhuKSlyZXR1cm47bGV0IHM9YXN5bmMgbj0+e2xldCBvPW4udGFyZ2V0O2lmKCEoIXQ/LnZhbHVlfHwhbykpe2lmKGt0KHQudmFsdWUsbykpe2kudmFsdWU9ITE7cmV0dXJufWlmKG4udGFyZ2V0JiYhaS52YWx1ZSl7bGV0IHQ9e29yaWdpbmFsRXZlbnQ6bn07ZnVuY3Rpb24gaSgpeyRlKER0LGUsdCl9bi5wb2ludGVyVHlwZT09PWB0b3VjaGA/KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpLGEudmFsdWU9aSxyLmFkZEV2ZW50TGlzdGVuZXIoYGNsaWNrYCxhLnZhbHVlLHtvbmNlOiEwfSkpOmkoKX1lbHNlIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpO2kudmFsdWU9ITF9fSxjPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ci5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVyZG93bmAscyl9LDApO28oKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcG9pbnRlcmRvd25gLHMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpfSl9KSx7b25Qb2ludGVyRG93bkNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9fX1mdW5jdGlvbiBqdChlLHQsbj0hMCl7bGV0IHI9dD8udmFsdWU/Lm93bmVyRG9jdW1lbnQ/P2dsb2JhbFRoaXM/LmRvY3VtZW50LGk9RighMSk7cmV0dXJuIHJlKGE9PntpZighaHx8IWcobikpcmV0dXJuO2xldCBvPWFzeW5jIG49PntpZighdD8udmFsdWUpcmV0dXJuO2F3YWl0IHhlKCksYXdhaXQgeGUoKTtsZXQgcj1uLnRhcmdldDshdC52YWx1ZXx8IXJ8fGt0KHQudmFsdWUscil8fG4udGFyZ2V0JiYhaS52YWx1ZSYmJGUoT3QsZSx7b3JpZ2luYWxFdmVudDpufSl9O3IuYWRkRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbyksYSgoKT0+ci5yZW1vdmVFdmVudExpc3RlbmVyKGBmb2N1c2luYCxvKSl9KSx7b25Gb2N1c0NhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9LG9uQmx1ckNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMSl9fX12YXIgTXQ9Uih7X19uYW1lOmBEaXNtaXNzYWJsZUxheWVyYCxwcm9wczp7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH19LGVtaXRzOltgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWAsYGZvY3VzT3V0c2lkZWAsYGludGVyYWN0T3V0c2lkZWAsYGRpc21pc3NgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT5vLnZhbHVlPy5vd25lckRvY3VtZW50Pz9nbG9iYWxUaGlzLmRvY3VtZW50KSxjPU0oKCk9PmV0LmxheWVyc1Jvb3QpLGw9TSgoKT0+by52YWx1ZT9BcnJheS5mcm9tKGMudmFsdWUpLmluZGV4T2Yoby52YWx1ZSk6LTEpLHU9TSgoKT0+ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT4wKSxkPU0oKCk9PntsZXQgZT1BcnJheS5mcm9tKGMudmFsdWUpLFt0XT1bLi4uZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSxuPWUuaW5kZXhPZih0KTtyZXR1cm4gbC52YWx1ZT49bn0pLGY9QXQoYXN5bmMgZT0+e2xldCB0PVsuLi5ldC5icmFuY2hlc10uc29tZSh0PT50Py5jb250YWlucyhlLnRhcmdldCkpOyFuLnByZXNlbnR8fCFkLnZhbHVlfHx0fHwocihgcG9pbnRlckRvd25PdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGF3YWl0IHhlKCksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSxvKSxwPWp0KGU9PntsZXQgdD1bLi4uZXQuYnJhbmNoZXNdLnNvbWUodD0+dD8uY29udGFpbnMoZS50YXJnZXQpKTshbi5wcmVzZW50fHx0fHwocihgZm9jdXNPdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGUuZGVmYXVsdFByZXZlbnRlZHx8cihgZGlzbWlzc2ApKX0sbyk7cmV0dXJuIFQoYEVzY2FwZWAsZT0+e24ucHJlc2VudCYmbC52YWx1ZT09PWMudmFsdWUuc2l6ZS0xJiYocihgZXNjYXBlS2V5RG93bmAsZSksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSksVihbbywoKT0+bi5kaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsKCk9Pm4ucHJlc2VudF0sKFtlLHQsbl0scixpKT0+eyFlfHwhbnx8dCYmKGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cz1zLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWApLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChlKSxpKCgpPT57ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKGUpLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYhc2UoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cykmJihzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1ldC5vcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzKX0pKX0se2ltbWVkaWF0ZTohMH0pLFYoW28sKCk9Pm4ucHJlc2VudF0sKFtlLHRdLG4scik9PnshZXx8IXR8fChjLnZhbHVlLmFkZChlKSxyKCgpPT57Yy52YWx1ZS5kZWxldGUoZSl9KSl9LHtpbW1lZGlhdGU6ITB9KSxyZShlPT57ZSgoKT0+e28udmFsdWUmJihjLnZhbHVlLmRlbGV0ZShvLnZhbHVlKSxldC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoby52YWx1ZSkpfSl9KSwoZSx0KT0+KE4oKSxJKGIoQSkse3JlZjpiKGEpLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsImRhdGEtZGlzbWlzc2FibGUtbGF5ZXIiOmBgLHN0eWxlOmkoe3BvaW50ZXJFdmVudHM6dS52YWx1ZT9kLnZhbHVlP2BhdXRvYDpgbm9uZWA6dm9pZCAwfSksb25Gb2N1c0NhcHR1cmU6YihwKS5vbkZvY3VzQ2FwdHVyZSxvbkJsdXJDYXB0dXJlOmIocCkub25CbHVyQ2FwdHVyZSxvblBvaW50ZXJkb3duQ2FwdHVyZTpiKGYpLm9uUG9pbnRlckRvd25DYXB0dXJlfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2AsYHN0eWxlYCxgb25Gb2N1c0NhcHR1cmVgLGBvbkJsdXJDYXB0dXJlYCxgb25Qb2ludGVyZG93bkNhcHR1cmVgXSkpfX0pLE50PUQoKCk9PkYoW10pKTtmdW5jdGlvbiBQdCgpe2xldCBlPU50KCk7cmV0dXJue2FkZCh0KXtsZXQgbj1lLnZhbHVlWzBdO3QhPT1uJiZuPy5wYXVzZSgpLGUudmFsdWU9RnQoZS52YWx1ZSx0KSxlLnZhbHVlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXtlLnZhbHVlPUZ0KGUudmFsdWUsdCksZS52YWx1ZVswXT8ucmVzdW1lKCl9fX1mdW5jdGlvbiBGdChlLHQpe2xldCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59dmFyIEl0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnRgLEx0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudGAsUnQ9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMH07ZnVuY3Rpb24genQoZSx7c2VsZWN0OnQ9ITF9PXt9KXtsZXQgbj1tKCk7Zm9yKGxldCByIG9mIGUpaWYoR3Qocix7c2VsZWN0OnR9KSxtKCkhPT1uKXJldHVybiEwfWZ1bmN0aW9uIEJ0KGUpe2xldCB0PVZ0KGUpO3JldHVybltIdCh0LGUpLEh0KHQucmV2ZXJzZSgpLGUpXX1mdW5jdGlvbiBWdChlKXtsZXQgdD1bXSxuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCx7YWNjZXB0Tm9kZTplPT57bGV0IHQ9ZS50YWdOYW1lPT09YElOUFVUYCYmZS50eXBlPT09YGhpZGRlbmA7cmV0dXJuIGUuZGlzYWJsZWR8fGUuaGlkZGVufHx0P05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ZS50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIEh0KGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoIVV0KG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIFV0KGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PWBoaWRkZW5gKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PWBub25lYClyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBXdChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJmBzZWxlY3RgaW4gZX1mdW5jdGlvbiBHdChlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2xldCBuPW0oKTtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJld0KGUpJiZ0JiZlLnNlbGVjdCgpfX12YXIgS3Q9Uih7X19uYW1lOmBGb2N1c1Njb3BlYCxwcm9wczp7bG9vcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LHRyYXBwZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Btb3VudEF1dG9Gb2N1c2AsYHVubW91bnRBdXRvRm9jdXNgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgcj1lLGk9dCx7Y3VycmVudFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1GKG51bGwpLGM9UHQoKSxsPW4oe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KTtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PW8udmFsdWU7aWYoIXIudHJhcHBlZClyZXR1cm47ZnVuY3Rpb24gbihlKXtpZihsLnBhdXNlZHx8IXQpcmV0dXJuO2xldCBuPWUudGFyZ2V0O3QuY29udGFpbnMobik/cy52YWx1ZT1uOkd0KHMudmFsdWUse3NlbGVjdDohMH0pfWZ1bmN0aW9uIGkoZSl7aWYobC5wYXVzZWR8fCF0KXJldHVybjtsZXQgbj1lLnJlbGF0ZWRUYXJnZXQ7biE9PW51bGwmJih0LmNvbnRhaW5zKG4pfHxHdChzLnZhbHVlLHtzZWxlY3Q6ITB9KSl9ZnVuY3Rpb24gYShlKXtsZXQgbj1zLnZhbHVlO24hPT1udWxsJiZlLnNvbWUoZT0+ZS5yZW1vdmVkTm9kZXMubGVuZ3RoPjApJiYodC5jb250YWlucyhuKXx8R3QodCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3VzaW5gLG4pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3Vzb3V0YCxpKTtsZXQgYz1uZXcgTXV0YXRpb25PYnNlcnZlcihhKTt0JiZjLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNvdXRgLGkpLGMuZGlzY29ubmVjdCgpfSl9KTtmdW5jdGlvbiB1KGUsdCl7bGV0IG49bmV3IEN1c3RvbUV2ZW50KEl0LFJ0KSxyPWU9PmkoYG1vdW50QXV0b0ZvY3VzYCxlKTtlLmFkZEV2ZW50TGlzdGVuZXIoSXQsciksZS5kaXNwYXRjaEV2ZW50KG4pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihJdCxyKSxuLmRlZmF1bHRQcmV2ZW50ZWR8fCh6dChWdChlKSx7c2VsZWN0OiEwfSksbSgpPT09dCYmR3QoZSkpfXJlKGFzeW5jIGU9PntsZXQgdD1vLnZhbHVlO2lmKGF3YWl0IHhlKCksIXQpcmV0dXJuO3IucHJlc2VudCE9PSExJiZjLmFkZChsKTtsZXQgbj1tKCk7IXQuY29udGFpbnMobikmJnIucHJlc2VudCE9PSExJiZ1KHQsbiksZSgoKT0+e2xldCBlPW5ldyBDdXN0b21FdmVudChMdCxSdCkscj1lPT57aShgdW5tb3VudEF1dG9Gb2N1c2AsZSl9O3QuYWRkRXZlbnRMaXN0ZW5lcihMdCxyKSx0LmRpc3BhdGNoRXZlbnQoZSksdC5zZXRBdHRyaWJ1dGUoYGRhdGEtZm9jdXMtc2NvcGUtdW5tb3VudGluZ2AsYGApLHNldFRpbWVvdXQoKCk9PntlLmRlZmF1bHRQcmV2ZW50ZWR8fEd0KG4/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihMdCxyKSxjLnJlbW92ZShsKSx0LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1mb2N1cy1zY29wZS11bm1vdW50aW5nYCl9LDApfSl9KSxWKCgpPT5yLnByZXNlbnQsYXN5bmMoZSx0KT0+e2lmKCFoKXJldHVybjtpZihlPT09ITEmJnQ9PT0hMCl7Yy5yZW1vdmUobCk7cmV0dXJufWlmKGUhPT0hMHx8dCE9PSExKXJldHVybjtjLmFkZChsKSxhd2FpdCB4ZSgpO2xldCBuPW8udmFsdWU7aWYoIW4pcmV0dXJuO2xldCByPW0oKTtuLmNvbnRhaW5zKHIpfHx1KG4scil9KTtmdW5jdGlvbiBkKGUpe2lmKCFyLmxvb3AmJiFyLnRyYXBwZWR8fGwucGF1c2VkKXJldHVybjtsZXQgdD1lLmtleT09PWBUYWJgJiYhZS5hbHRLZXkmJiFlLmN0cmxLZXkmJiFlLm1ldGFLZXksbj1tKCk7aWYodCYmbil7bGV0IHQ9ZS5jdXJyZW50VGFyZ2V0LFtpLGFdPUJ0KHQpO2kmJmE/IWUuc2hpZnRLZXkmJm49PT1hPyhlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChpLHtzZWxlY3Q6ITB9KSk6ZS5zaGlmdEtleSYmbj09PWkmJihlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChhLHtzZWxlY3Q6ITB9KSk6bj09PXQmJmUucHJldmVudERlZmF1bHQoKX19cmV0dXJuKGUsdCk9PihOKCksSShiKEEpLHtyZWZfa2V5OmBjdXJyZW50UmVmYCxyZWY6YSx0YWJpbmRleDpgLTFgLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25LZXlkb3duOmR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhcy1jaGlsZGAsYGFzYF0pKX19KSxxdD1bYEVudGVyYCxgIGBdLEp0PVtgQXJyb3dEb3duYCxgUGFnZVVwYCxgSG9tZWBdLFl0PVtgQXJyb3dVcGAsYFBhZ2VEb3duYCxgRW5kYF07Wy4uLkp0LC4uLll0XSxbLi4ucXRdLFsuLi5xdF07ZnVuY3Rpb24gWHQoZSl7bGV0IHQ9bSgpO2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHwobi5mb2N1cygpLG0oKSE9PXQpKXJldHVybn12YXIgWnQ9Uih7X19uYW1lOmBUZWxlcG9ydGAscHJvcHM6e3RvOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRlZmVyOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX19LHNldHVwKHQpe2xldCBuPXQscj1zKHt9KSxpPU0oKCk9Pm4udG8/P3IudGVsZXBvcnRUbz8udmFsdWU/P2Bib2R5YCksYT1FZSgpO3JldHVybih0LG4pPT5iKGEpfHx0LmZvcmNlTW91bnQ/KE4oKSxJKGUse2tleTowLHRvOmkudmFsdWUsZGlzYWJsZWQ6dC5kaXNhYmxlZCxkZWZlcjp0LmRlZmVyfSxbeih0LiRzbG90cyxgZGVmYXVsdGApXSw4LFtgdG9gLGBkaXNhYmxlZGAsYGRlZmVyYF0pKTp6ZShgdi1pZmAsITApfX0pLFF0PVIoe19fbmFtZTpgVmlzdWFsbHlIaWRkZW5gLHByb3BzOntmZWF0dXJlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBmb2N1c2FibGVgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkse2FzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsImFyaWEtaGlkZGVuIjplLmZlYXR1cmU9PT1gZm9jdXNhYmxlYHx8ZS5mZWF0dXJlPT09YGZ1bGx5LWhpZGRlbmA/YHRydWVgOnZvaWQgMCwiZGF0YS1oaWRkZW4iOmUuZmVhdHVyZT09PWBmdWxseS1oaWRkZW5gP2BgOnZvaWQgMCx0YWJpbmRleDplLmZlYXR1cmU9PT1gZnVsbHktaGlkZGVuYD9gLTFgOnZvaWQgMCxzdHlsZTp7cG9zaXRpb246YGFic29sdXRlYCxib3JkZXI6MCx3aWR0aDpgMXB4YCxoZWlnaHQ6YDFweGAscGFkZGluZzowLG1hcmdpbjpgLTFweGAsb3ZlcmZsb3c6YGhpZGRlbmAsY2xpcDpgcmVjdCgwLCAwLCAwLCAwKWAsY2xpcFBhdGg6YGluc2V0KDUwJSlgLHdoaXRlU3BhY2U6YG5vd3JhcGAsd29yZFdyYXA6YG5vcm1hbGAsdG9wOmAtMXB4YCxsZWZ0OmAtMXB4YH19LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgYXJpYS1oaWRkZW5gLGBkYXRhLWhpZGRlbmAsYHRhYmluZGV4YF0pKX19KSxbJHQsZW5dPW9lKGBQb3BwZXJSb290YCksdG49Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyUm9vdGAsc2V0dXAoZSl7bGV0IHQ9RigpO3JldHVybiBlbih7YW5jaG9yOnQsb25BbmNob3JDaGFuZ2U6ZT0+dC52YWx1ZT1lfSksKGUsdCk9PnooZS4kc2xvdHMsYGRlZmF1bHRgKX19KSxubj1SKHtfX25hbWU6YFBvcHBlckFuY2hvcmAscHJvcHM6e3JlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPSR0KCk7cmV0dXJuIG8oKCk9PntpLm9uQW5jaG9yQ2hhbmdlKHQucmVmZXJlbmNlPz9yLnZhbHVlKX0pLChlLHQpPT4oTigpLEkoYihBKSx7cmVmOmIobiksYXM6ZS5hcywiYXMtY2hpbGQiOmUuYXNDaGlsZH0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pO2Z1bmN0aW9uIHJuKGUpe3JldHVybiBlIT09bnVsbH1mdW5jdGlvbiBhbihlKXtyZXR1cm57bmFtZTpgdHJhbnNmb3JtT3JpZ2luYCxvcHRpb25zOmUsZm4odCl7bGV0e3BsYWNlbWVudDpuLHJlY3RzOnIsbWlkZGxld2FyZURhdGE6aX09dCxhPWkuYXJyb3c/LmNlbnRlck9mZnNldCE9PTAsbz1hPzA6ZS5hcnJvd1dpZHRoLHM9YT8wOmUuYXJyb3dIZWlnaHQsW2MsbF09b24obiksdT17c3RhcnQ6ZS5kaXI9PT1gcnRsYD9gMTAwJWA6YDAlYCxjZW50ZXI6YDUwJWAsZW5kOmUuZGlyPT09YHJ0bGA/YDAlYDpgMTAwJWB9W2xdLGQ9e3N0YXJ0OmAwJWAsY2VudGVyOmA1MCVgLGVuZDpgMTAwJWB9W2xdLGY9KGkuYXJyb3c/Lng/PzApK28vMixwPShpLmFycm93Py55Pz8wKStzLzIsbT1gYCxoPWBgO3JldHVybiBjPT09YGJvdHRvbWA/KG09YT91OmAke2Z9cHhgLGg9YCR7LXN9cHhgKTpjPT09YHRvcGA/KG09YT91OmAke2Z9cHhgLGg9YCR7ci5mbG9hdGluZy5oZWlnaHQrc31weGApOmM9PT1gcmlnaHRgPyhtPWAkey1zfXB4YCxoPWE/ZDpgJHtwfXB4YCk6Yz09PWBsZWZ0YCYmKG09YCR7ci5mbG9hdGluZy53aWR0aCtzfXB4YCxoPWE/ZDpgJHtwfXB4YCkse2RhdGE6e3g6bSx5Omh9fX19fWZ1bmN0aW9uIG9uKGUpe2xldFt0LG49YGNlbnRlcmBdPWUuc3BsaXQoYC1gKTtyZXR1cm5bdCxuXX12YXIgc249W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSxjbj1NYXRoLm1pbixsbj1NYXRoLm1heCx1bj1NYXRoLnJvdW5kLGRuPU1hdGguZmxvb3IsZm49ZT0+KHt4OmUseTplfSkscG49e2xlZnQ6YHJpZ2h0YCxyaWdodDpgbGVmdGAsYm90dG9tOmB0b3BgLHRvcDpgYm90dG9tYH07ZnVuY3Rpb24gbW4oZSx0LG4pe3JldHVybiBsbihlLGNuKHQsbikpfWZ1bmN0aW9uIGhuKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UodCk6ZX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZS5zcGxpdChgLWApWzBdfWZ1bmN0aW9uIF9uKGUpe3JldHVybiBlLnNwbGl0KGAtYClbMV19ZnVuY3Rpb24gdm4oZSl7cmV0dXJuIGU9PT1geGA/YHlgOmB4YH1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZT09PWB5YD9gaGVpZ2h0YDpgd2lkdGhgfWZ1bmN0aW9uIGJuKGUpe2xldCB0PWVbMF07cmV0dXJuIHQ9PT1gdGB8fHQ9PT1gYmA/YHlgOmB4YH1mdW5jdGlvbiB4bihlKXtyZXR1cm4gdm4oYm4oZSkpfWZ1bmN0aW9uIFNuKGUsdCxuKXtuPT09dm9pZCAwJiYobj0hMSk7bGV0IHI9X24oZSksaT14bihlKSxhPXluKGkpLG89aT09PWB4YD9yPT09KG4/YGVuZGA6YHN0YXJ0YCk/YHJpZ2h0YDpgbGVmdGA6cj09PWBzdGFydGA/YGJvdHRvbWA6YHRvcGA7cmV0dXJuIHQucmVmZXJlbmNlW2FdPnQuZmxvYXRpbmdbYV0mJihvPWpuKG8pKSxbbyxqbihvKV19ZnVuY3Rpb24gQ24oZSl7bGV0IHQ9am4oZSk7cmV0dXJuW3duKGUpLHQsd24odCldfWZ1bmN0aW9uIHduKGUpe3JldHVybiBlLmluY2x1ZGVzKGBzdGFydGApP2UucmVwbGFjZShgc3RhcnRgLGBlbmRgKTplLnJlcGxhY2UoYGVuZGAsYHN0YXJ0YCl9dmFyIFRuPVtgbGVmdGAsYHJpZ2h0YF0sRW49W2ByaWdodGAsYGxlZnRgXSxEbj1bYHRvcGAsYGJvdHRvbWBdLE9uPVtgYm90dG9tYCxgdG9wYF07ZnVuY3Rpb24ga24oZSx0LG4pe3N3aXRjaChlKXtjYXNlYHRvcGA6Y2FzZWBib3R0b21gOnJldHVybiBuP3Q/RW46VG46dD9UbjpFbjtjYXNlYGxlZnRgOmNhc2VgcmlnaHRgOnJldHVybiB0P0RuOk9uO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEFuKGUsdCxuLHIpe2xldCBpPV9uKGUpLGE9a24oZ24oZSksbj09PWBzdGFydGAscik7cmV0dXJuIGkmJihhPWEubWFwKGU9PmUrYC1gK2kpLHQmJihhPWEuY29uY2F0KGEubWFwKHduKSkpKSxhfWZ1bmN0aW9uIGpuKGUpe2xldCB0PWduKGUpO3JldHVybiBwblt0XStlLnNsaWNlKHQubGVuZ3RoKX1mdW5jdGlvbiBNbihlKXtyZXR1cm57dG9wOmUudG9wPz8wLHJpZ2h0OmUucmlnaHQ/PzAsYm90dG9tOmUuYm90dG9tPz8wLGxlZnQ6ZS5sZWZ0Pz8wfX1mdW5jdGlvbiBObihlKXtyZXR1cm4gdHlwZW9mIGU9PWBudW1iZXJgP3t0b3A6ZSxyaWdodDplLGJvdHRvbTplLGxlZnQ6ZX06TW4oZSl9ZnVuY3Rpb24gUG4oZSl7bGV0e3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6aX09ZTtyZXR1cm57d2lkdGg6cixoZWlnaHQ6aSx0b3A6bixsZWZ0OnQscmlnaHQ6dCtyLGJvdHRvbTpuK2kseDp0LHk6bn19ZnVuY3Rpb24gRm4oZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lLGE9Ym4odCksbz14bih0KSxzPXluKG8pLGM9Z24odCksbD1hPT09YHlgLHU9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMixwO3N3aXRjaChjKXtjYXNlYHRvcGA6cD17eDp1LHk6ci55LWkuaGVpZ2h0fTticmVhaztjYXNlYGJvdHRvbWA6cD17eDp1LHk6ci55K3IuaGVpZ2h0fTticmVhaztjYXNlYHJpZ2h0YDpwPXt4OnIueCtyLndpZHRoLHk6ZH07YnJlYWs7Y2FzZWBsZWZ0YDpwPXt4OnIueC1pLndpZHRoLHk6ZH07YnJlYWs7ZGVmYXVsdDpwPXt4OnIueCx5OnIueX19bGV0IG09X24odCk7cmV0dXJuIG0mJihwW29dKz1mKihtPT09YGVuZGA/MTotMSkqKG4mJmw/LTE6MSkpLHB9YXN5bmMgZnVuY3Rpb24gSW4oZSx0KXt0PT09dm9pZCAwJiYodD17fSk7bGV0e3g6bix5OnIscGxhdGZvcm06aSxyZWN0czphLGVsZW1lbnRzOm8sc3RyYXRlZ3k6c309ZSx7Ym91bmRhcnk6Yz1gY2xpcHBpbmdBbmNlc3RvcnNgLHJvb3RCb3VuZGFyeTpsPWB2aWV3cG9ydGAsZWxlbWVudENvbnRleHQ6dT1gZmxvYXRpbmdgLGFsdEJvdW5kYXJ5OmQ9ITEscGFkZGluZzpmPTB9PWhuKHQsZSkscD1ObihmKSxtPW9bZD91PT09YGZsb2F0aW5nYD9gcmVmZXJlbmNlYDpgZmxvYXRpbmdgOnVdLGg9UG4oYXdhaXQgaS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KG0pKT8/ITA/bTptLmNvbnRleHRFbGVtZW50fHxhd2FpdChpLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6aS5nZXREb2N1bWVudEVsZW1lbnQoby5mbG9hdGluZykpLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5Omwsc3RyYXRlZ3k6c30pKSxnPXU9PT1gZmxvYXRpbmdgP3t4Om4seTpyLHdpZHRoOmEuZmxvYXRpbmcud2lkdGgsaGVpZ2h0OmEuZmxvYXRpbmcuaGVpZ2h0fTphLnJlZmVyZW5jZSxfPWF3YWl0KGkuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDppLmdldE9mZnNldFBhcmVudChvLmZsb2F0aW5nKSksdj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoXykpJiZhd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9LHk9UG4oaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdD9hd2FpdCBpLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtlbGVtZW50czpvLHJlY3Q6ZyxvZmZzZXRQYXJlbnQ6XyxzdHJhdGVneTpzfSk6Zyk7cmV0dXJue3RvcDooaC50b3AteS50b3ArcC50b3ApL3YueSxib3R0b206KHkuYm90dG9tLWguYm90dG9tK3AuYm90dG9tKS92LnksbGVmdDooaC5sZWZ0LXkubGVmdCtwLmxlZnQpL3YueCxyaWdodDooeS5yaWdodC1oLnJpZ2h0K3AucmlnaHQpL3YueH19dmFyIExuPTUwLFJuPWFzeW5jKGUsdCxuKT0+e2xldHtwbGFjZW1lbnQ6cj1gYm90dG9tYCxzdHJhdGVneTppPWBhYnNvbHV0ZWAsbWlkZGxld2FyZTphPVtdLHBsYXRmb3JtOm99PW4scz1vLmRldGVjdE92ZXJmbG93P286ey4uLm8sZGV0ZWN0T3ZlcmZsb3c6SW59LGM9YXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTCh0KSksbD1hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSkse3g6dSx5OmR9PUZuKGwscixjKSxmPXIscD0wLG09e307Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKyspe2xldCBoPWFbbl07aWYoIWgpY29udGludWU7bGV0e25hbWU6ZyxmbjpffT1oLHt4OnYseSxkYXRhOmIscmVzZXQ6eH09YXdhaXQgXyh7eDp1LHk6ZCxpbml0aWFsUGxhY2VtZW50OnIscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptLHJlY3RzOmwscGxhdGZvcm06cyxlbGVtZW50czp7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dH19KTt1PXY/P3UsZD15Pz9kLG1bZ109ey4uLm1bZ10sLi4uYn0seCYmcDxMbiYmKHArKyx0eXBlb2YgeD09YG9iamVjdGAmJih4LnBsYWNlbWVudCYmKGY9eC5wbGFjZW1lbnQpLHgucmVjdHMmJihsPXgucmVjdHM9PT0hMD9hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6eC5yZWN0cykse3g6dSx5OmR9PUZuKGwsZixjKSksbj0tMSl9cmV0dXJue3g6dSx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptfX0sem49ZT0+KHtuYW1lOmBhcnJvd2Asb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEscGxhdGZvcm06byxlbGVtZW50czpzLG1pZGRsZXdhcmVEYXRhOmN9PXQse2VsZW1lbnQ6bCxwYWRkaW5nOnU9MH09aG4oZSx0KXx8e307aWYobD09bnVsbClyZXR1cm57fTtsZXQgZD1Obih1KSxmPXt4Om4seTpyfSxwPXhuKGkpLG09eW4ocCksaD1hd2FpdCBvLmdldERpbWVuc2lvbnMobCksZz1wPT09YHlgLF89Zz9gdG9wYDpgbGVmdGAsdj1nP2Bib3R0b21gOmByaWdodGAseT1nP2BjbGllbnRIZWlnaHRgOmBjbGllbnRXaWR0aGAsYj1hLnJlZmVyZW5jZVttXSthLnJlZmVyZW5jZVtwXS1mW3BdLWEuZmxvYXRpbmdbbV0seD1mW3BdLWEucmVmZXJlbmNlW3BdLFM9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KGwpKSxDPVM/U1t5XTowOyghQ3x8IWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudChTKSkpJiYoQz1zLmZsb2F0aW5nW3ldfHxhLmZsb2F0aW5nW21dKTtsZXQgdz1iLzIteC8yLFQ9Qy8yLWhbbV0vMi0xLEU9Y24oZFtfXSxUKSxEPWNuKGRbdl0sVCksTz1DLWhbbV0tRCxrPUMvMi1oW21dLzIrdyxlZT1tbihFLGssTyksdGU9IWMuYXJyb3cmJl9uKGkpIT1udWxsJiZrIT09ZWUmJmEucmVmZXJlbmNlW21dLzItKGs8RT9FOkQpLWhbbV0vMjwwLG5lPXRlP2s8RT9rLUU6ay1POjA7cmV0dXJue1twXTpmW3BdK25lLGRhdGE6e1twXTplZSxjZW50ZXJPZmZzZXQ6ay1lZS1uZSwuLi50ZSYme2FsaWdubWVudE9mZnNldDpuZX19LHJlc2V0OnRlfX19KSxCbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOmBmbGlwYCxvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG47bGV0e3BsYWNlbWVudDpyLG1pZGRsZXdhcmVEYXRhOmkscmVjdHM6YSxpbml0aWFsUGxhY2VtZW50Om8scGxhdGZvcm06cyxlbGVtZW50czpjfT10LHttYWluQXhpczpsPSEwLGNyb3NzQXhpczp1PSEwLGZhbGxiYWNrUGxhY2VtZW50czpkLGZhbGxiYWNrU3RyYXRlZ3k6Zj1gYmVzdEZpdGAsZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbjpwPWBub25lYCxmbGlwQWxpZ25tZW50Om09ITAsLi4uaH09aG4oZSx0KTtpZigobj1pLmFycm93KSE9bnVsbCYmbi5hbGlnbm1lbnRPZmZzZXQpcmV0dXJue307bGV0IGc9Z24ociksXz1ibihvKSx2PWduKG8pPT09byx5PWF3YWl0KHMuaXNSVEw9PW51bGw/dm9pZCAwOnMuaXNSVEwoYy5mbG9hdGluZykpLGI9ZHx8KHZ8fCFtP1tqbihvKV06Q24obykpLHg9cCE9PWBub25lYDshZCYmeCYmYi5wdXNoKC4uLkFuKG8sbSxwLHkpKTtsZXQgUz1bbywuLi5iXSxDPWF3YWl0IHMuZGV0ZWN0T3ZlcmZsb3codCxoKSx3PVtdLFQ9aS5mbGlwPy5vdmVyZmxvd3N8fFtdO2lmKGwmJncucHVzaChDW2ddKSx1KXtsZXQgZT1TbihyLGEseSk7dy5wdXNoKENbZVswXV0sQ1tlWzFdXSl9aWYoVD1bLi4uVCx7cGxhY2VtZW50OnIsb3ZlcmZsb3dzOnd9XSwhdy5ldmVyeShlPT5lPD0wKSl7bGV0IGU9KGkuZmxpcD8uaW5kZXh8fDApKzEsdD1TW2VdO2lmKHQmJih1IT09YGFsaWdubWVudGB8fF89PT1ibih0KXx8VC5ldmVyeShlPT5ibihlLnBsYWNlbWVudCkhPT1ffHxlLm92ZXJmbG93c1swXT4wKSkpcmV0dXJue2RhdGE6e2luZGV4OmUsb3ZlcmZsb3dzOlR9LHJlc2V0OntwbGFjZW1lbnQ6dH19O2xldCBuPVQuZmlsdGVyKGU9PmUub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChlLHQpPT5lLm92ZXJmbG93c1sxXS10Lm92ZXJmbG93c1sxXSlbMF0/LnBsYWNlbWVudDtpZighbilzd2l0Y2goZil7Y2FzZWBiZXN0Rml0YDp7bGV0IGU9VC5maWx0ZXIoZT0+e2lmKHgpe2xldCB0PWJuKGUucGxhY2VtZW50KTtyZXR1cm4gdD09PV98fHQ9PT1geWB9cmV0dXJuITB9KS5tYXAoZT0+W2UucGxhY2VtZW50LGUub3ZlcmZsb3dzLmZpbHRlcihlPT5lPjApLnJlZHVjZSgoZSx0KT0+ZSt0LDApXSkuc29ydCgoZSx0KT0+ZVsxXS10WzFdKVswXT8uWzBdO2UmJihuPWUpO2JyZWFrfWNhc2VgaW5pdGlhbFBsYWNlbWVudGA6bj1vfWlmKHIhPT1uKXJldHVybntyZXNldDp7cGxhY2VtZW50Om59fX1yZXR1cm57fX19fTtmdW5jdGlvbiBWbihlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gc24uc29tZSh0PT5lW3RdPj0wKX12YXIgVW49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZTpgaGlkZWAsb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHtyZWN0czpuLHBsYXRmb3JtOnJ9PXQse3N0cmF0ZWd5Omk9YHJlZmVyZW5jZUhpZGRlbmAsLi4uYX09aG4oZSx0KTtzd2l0Y2goaSl7Y2FzZWByZWZlcmVuY2VIaWRkZW5gOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsZWxlbWVudENvbnRleHQ6YHJlZmVyZW5jZWB9KSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6ZSxyZWZlcmVuY2VIaWRkZW46SG4oZSl9fX1jYXNlYGVzY2FwZWRgOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsYWx0Qm91bmRhcnk6ITB9KSxuLmZsb2F0aW5nKTtyZXR1cm57ZGF0YTp7ZXNjYXBlZE9mZnNldHM6ZSxlc2NhcGVkOkhuKGUpfX19ZGVmYXVsdDpyZXR1cm57fX19fX0sV249bmV3IFNldChbYGxlZnRgLGB0b3BgXSk7YXN5bmMgZnVuY3Rpb24gR24oZSx0KXtsZXR7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLGE9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbz1nbihuKSxzPV9uKG4pLGM9Ym4obik9PT1geWAsbD1Xbi5oYXMobyk/LTE6MSx1PWEmJmM/LTE6MSxkPWhuKHQsZSkse21haW5BeGlzOmYsY3Jvc3NBeGlzOnAsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09YG51bWJlcmA/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6ZC5tYWluQXhpc3x8MCxjcm9zc0F4aXM6ZC5jcm9zc0F4aXN8fDAsYWxpZ25tZW50QXhpczpkLmFsaWdubWVudEF4aXN9O3JldHVybiBzJiZ0eXBlb2YgbT09YG51bWJlcmAmJihwPXM9PT1gZW5kYD9tKi0xOm0pLGM/e3g6cCp1LHk6ZipsfTp7eDpmKmwseTpwKnV9fXZhciBLbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6YG9mZnNldGAsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuO2xldHt4OnIseTppLHBsYWNlbWVudDphLG1pZGRsZXdhcmVEYXRhOm99PXQscz1hd2FpdCBHbih0LGUpO3JldHVybiBhPT09by5vZmZzZXQ/LnBsYWNlbWVudCYmKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0P3t9Ont4OnIrcy54LHk6aStzLnksZGF0YTp7Li4ucyxwbGFjZW1lbnQ6YX19fX19LHFuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNoaWZ0YCxvcHRpb25zOmUsYXN5bmMgZm4odCl7bGV0e3g6bix5OnIscGxhY2VtZW50OmkscGxhdGZvcm06YX09dCx7bWFpbkF4aXM6bz0hMCxjcm9zc0F4aXM6cz0hMSxsaW1pdGVyOmM9e2ZuOmU9PntsZXR7eDp0LHk6bn09ZTtyZXR1cm57eDp0LHk6bn19fSwuLi5sfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9YXdhaXQgYS5kZXRlY3RPdmVyZmxvdyh0LGwpLGY9Ym4oaSkscD12bihmKSxtPXVbcF0saD11W2ZdLGc9KGUsdCk9Pm1uKHQrZFtlPT09YHlgP2B0b3BgOmBsZWZ0YF0sdCx0LWRbZT09PWB5YD9gYm90dG9tYDpgcmlnaHRgXSk7byYmKG09ZyhwLG0pKSxzJiYoaD1nKGYsaCkpO2xldCBfPWMuZm4oey4uLnQsW3BdOm0sW2ZdOmh9KTtyZXR1cm57Li4uXyxkYXRhOnt4Ol8ueC1uLHk6Xy55LXIsZW5hYmxlZDp7W3BdOm8sW2ZdOnN9fX19fX0sSm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7b3B0aW9uczplLGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6b309dCx7b2Zmc2V0OnM9MCxtYWluQXhpczpjPSEwLGNyb3NzQXhpczpsPSEwfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9Ym4oaSksZj12bihkKSxwPXVbZl0sbT11W2RdLGg9aG4ocyx0KSxnPXR5cGVvZiBoPT1gbnVtYmVyYD97bWFpbkF4aXM6aCxjcm9zc0F4aXM6MH06e21haW5BeGlzOmgubWFpbkF4aXM/PzAsY3Jvc3NBeGlzOmguY3Jvc3NBeGlzPz8wfTtpZihjKXtsZXQgZT1mPT09YHlgP2BoZWlnaHRgOmB3aWR0aGAsdD1hLnJlZmVyZW5jZVtmXS1hLmZsb2F0aW5nW2VdK2cubWFpbkF4aXMsbj1hLnJlZmVyZW5jZVtmXSthLnJlZmVyZW5jZVtlXS1nLm1haW5BeGlzO3A8dD9wPXQ6cD5uJiYocD1uKX1pZihsKXtsZXQgZT1mPT09YHlgP2B3aWR0aGA6YGhlaWdodGAsdD1Xbi5oYXMoZ24oaSkpLG49YS5yZWZlcmVuY2VbZF0tYS5mbG9hdGluZ1tlXSsodCYmby5vZmZzZXQ/LltkXXx8MCkrKHQ/MDpnLmNyb3NzQXhpcykscj1hLnJlZmVyZW5jZVtkXSthLnJlZmVyZW5jZVtlXSsodD8wOm8ub2Zmc2V0Py5bZF18fDApLSh0P2cuY3Jvc3NBeGlzOjApO208bj9tPW46bT5yJiYobT1yKX1yZXR1cm57W2ZdOnAsW2RdOm19fX19LFluPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNpemVgLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtsZXR7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOmF9PXQse2FwcGx5Om89KCk9Pnt9LC4uLnN9PWhuKGUsdCksYz1hd2FpdCBpLmRldGVjdE92ZXJmbG93KHQscyksbD1nbihuKSx1PV9uKG4pLGQ9Ym4obik9PT1geWAse3dpZHRoOmYsaGVpZ2h0OnB9PXIuZmxvYXRpbmcsbSxoO2w9PT1gdG9wYHx8bD09PWBib3R0b21gPyhtPWwsaD11PT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoYS5mbG9hdGluZykpP2BzdGFydGA6YGVuZGApP2BsZWZ0YDpgcmlnaHRgKTooaD1sLG09dT09PWBlbmRgP2B0b3BgOmBib3R0b21gKTtsZXQgZz1wLWMudG9wLWMuYm90dG9tLF89Zi1jLmxlZnQtYy5yaWdodCx2PWNuKHAtY1ttXSxnKSx5PWNuKGYtY1toXSxfKSxiPXQubWlkZGxld2FyZURhdGEuc2hpZnQseD0hYixTPXYsQz15O2IhPW51bGwmJmIuZW5hYmxlZC54JiYoQz1fKSxiIT1udWxsJiZiLmVuYWJsZWQueSYmKFM9ZykseCYmIXUmJihkP0M9Zi0yKmxuKGMubGVmdCxjLnJpZ2h0KTpTPXAtMipsbihjLnRvcCxjLmJvdHRvbSkpLGF3YWl0IG8oey4uLnQsYXZhaWxhYmxlV2lkdGg6QyxhdmFpbGFibGVIZWlnaHQ6U30pO2xldCB3PWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhhLmZsb2F0aW5nKTtyZXR1cm4gZiE9PXcud2lkdGh8fHAhPT13LmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gWG4oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzxgdWB9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuICRuKGUpPyhlLm5vZGVOYW1lfHxgYCkudG9Mb3dlckNhc2UoKTpgI2RvY3VtZW50YH1mdW5jdGlvbiBIKGUpe3ZhciB0O3JldHVybihlPT1udWxsfHwodD1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRlZmF1bHRWaWV3KXx8d2luZG93fWZ1bmN0aW9uIFFuKGUpe3JldHVybigoJG4oZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPy5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gJG4oZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBIKGUpLk5vZGU6ITF9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBIKGUpLkVsZW1lbnQ6ITF9ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHxlIGluc3RhbmNlb2YgSChlKS5IVE1MRWxlbWVudDohMX1mdW5jdGlvbiBucihlKXtyZXR1cm4hWG4oKXx8dHlwZW9mIFNoYWRvd1Jvb3Q+YHVgPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgSChlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHJyKGUpe2xldHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09bXIoZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiZpIT09YGlubGluZWAmJmkhPT1gY29udGVudHNgfWZ1bmN0aW9uIGlyKGUpe3JldHVybi9eKHRhYmxlfHRkfHRoKSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIGFyKGUpe3RyeXtpZihlLm1hdGNoZXMoYDpwb3BvdmVyLW9wZW5gKSlyZXR1cm4hMH1jYXRjaHt9dHJ5e3JldHVybiBlLm1hdGNoZXMoYDptb2RhbGApfWNhdGNoe3JldHVybiExfX12YXIgb3I9L3RyYW5zZm9ybXx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHBlcnNwZWN0aXZlfGZpbHRlci8sc3I9L3BhaW50fGxheW91dHxzdHJpY3R8Y29udGVudC8sY3I9ZT0+ISFlJiZlIT09YG5vbmVgLGxyO2Z1bmN0aW9uIHVyKGUpe2xldCB0PWVyKGUpP21yKGUpOmU7cmV0dXJuIGNyKHQudHJhbnNmb3JtKXx8Y3IodC50cmFuc2xhdGUpfHxjcih0LnNjYWxlKXx8Y3IodC5yb3RhdGUpfHxjcih0LnBlcnNwZWN0aXZlKXx8IWZyKCkmJihjcih0LmJhY2tkcm9wRmlsdGVyKXx8Y3IodC5maWx0ZXIpKXx8b3IudGVzdCh0LndpbGxDaGFuZ2V8fGBgKXx8c3IudGVzdCh0LmNvbnRhaW58fGBgKX1mdW5jdGlvbiBkcihlKXtsZXQgdD1ncihlKTtmb3IoO3RyKHQpJiYhcHIodCk7KXtpZih1cih0KSlyZXR1cm4gdDtpZihhcih0KSlyZXR1cm4gbnVsbDt0PWdyKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIGZyKCl7cmV0dXJuIGxyPz89dHlwZW9mIENTUzxgdWAmJkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKGAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcmAsYG5vbmVgKSxscn1mdW5jdGlvbiBwcihlKXtyZXR1cm4vXihodG1sfGJvZHl8I2RvY3VtZW50KSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIG1yKGUpe3JldHVybiBIKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIGVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUuc2Nyb2xsWCxzY3JvbGxUb3A6ZS5zY3JvbGxZfX1mdW5jdGlvbiBncihlKXtpZihabihlKT09PWBodG1sYClyZXR1cm4gZTtsZXQgdD1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHxucihlKSYmZS5ob3N0fHxRbihlKTtyZXR1cm4gbnIodCk/dC5ob3N0OnR9ZnVuY3Rpb24gX3IoZSl7bGV0IHQ9Z3IoZSk7cmV0dXJuIHByKHQpPyhlLm93bmVyRG9jdW1lbnR8fGUpLmJvZHk6dHIodCkmJnJyKHQpP3Q6X3IodCl9ZnVuY3Rpb24gdnIoZSx0LG4pe3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7bGV0IHI9X3IoZSksaT1yPT09ZS5vd25lckRvY3VtZW50Py5ib2R5LGE9SChyKTtpZihpKXtsZXQgZT15cihhKTtyZXR1cm4gdC5jb25jYXQoYSxhLnZpc3VhbFZpZXdwb3J0fHxbXSxycihyKT9yOltdLGUmJm4/dnIoZSk6W10pfXJldHVybiB0LmNvbmNhdChyLHZyKHIsW10sbikpfWZ1bmN0aW9uIHlyKGUpe3JldHVybiBlLnBhcmVudCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUucGFyZW50KT9lLmZyYW1lRWxlbWVudDpudWxsfWZ1bmN0aW9uIGJyKGUpe2xldCB0PW1yKGUpLG49cGFyc2VGbG9hdCh0LndpZHRoKXx8MCxyPXBhcnNlRmxvYXQodC5oZWlnaHQpfHwwLGk9dHIoZSksYT1pP2Uub2Zmc2V0V2lkdGg6bixvPWk/ZS5vZmZzZXRIZWlnaHQ6cixzPXVuKG4pIT09YXx8dW4ocikhPT1vO3JldHVybiBzJiYobj1hLHI9bykse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gZXIoZSk/ZTplLmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIFNyKGUpe2xldCB0PXhyKGUpO2lmKCF0cih0KSlyZXR1cm4gZm4oMSk7bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOmF9PWJyKHQpLG89KGE/dW4obi53aWR0aCk6bi53aWR0aCkvcixzPShhP3VuKG4uaGVpZ2h0KTpuLmhlaWdodCkvaTtyZXR1cm4oIW98fCFOdW1iZXIuaXNGaW5pdGUobykpJiYobz0xKSwoIXN8fCFOdW1iZXIuaXNGaW5pdGUocykpJiYocz0xKSx7eDpvLHk6c319dmFyIENyPWZuKDApO2Z1bmN0aW9uIHdyKGUpe2xldCB0PUgoZSk7cmV0dXJuIWZyKCl8fCF0LnZpc3VhbFZpZXdwb3J0P0NyOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBUcihlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhIW4mJnQmJm49PT1IKGUpfWZ1bmN0aW9uIEVyKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7bGV0IGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXhyKGUpLG89Zm4oMSk7dCYmKHI/ZXIocikmJihvPVNyKHIpKTpvPVNyKGUpKTtsZXQgcz1UcihhLG4scik/d3IoYSk6Zm4oMCksYz0oaS5sZWZ0K3MueCkvby54LGw9KGkudG9wK3MueSkvby55LHU9aS53aWR0aC9vLngsZD1pLmhlaWdodC9vLnk7aWYoYSYmcil7bGV0IGU9SChhKSx0PWVyKHIpP0gocik6cixuPWUsaT15cihuKTtmb3IoO2kmJnQhPT1uOyl7bGV0IGU9U3IoaSksdD1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bXIoaSksYT10LmxlZnQrKGkuY2xpZW50TGVmdCtwYXJzZUZsb2F0KHIucGFkZGluZ0xlZnQpKSplLngsbz10LnRvcCsoaS5jbGllbnRUb3ArcGFyc2VGbG9hdChyLnBhZGRpbmdUb3ApKSplLnk7Yyo9ZS54LGwqPWUueSx1Kj1lLngsZCo9ZS55LGMrPWEsbCs9byxuPUgoaSksaT15cihuKX19cmV0dXJuIFBuKHt3aWR0aDp1LGhlaWdodDpkLHg6Yyx5Omx9KX1mdW5jdGlvbiBEcihlLHQpe2xldCBuPWhyKGUpLnNjcm9sbExlZnQ7cmV0dXJuIHQ/dC5sZWZ0K246RXIoUW4oZSkpLmxlZnQrbn1mdW5jdGlvbiBPcihlLHQpe2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6bi5sZWZ0K3Quc2Nyb2xsTGVmdC1EcihlLG4pLHk6bi50b3ArdC5zY3JvbGxUb3B9fWZ1bmN0aW9uIGtyKGUpe2xldHtlbGVtZW50czp0LHJlY3Q6bixvZmZzZXRQYXJlbnQ6cixzdHJhdGVneTppfT1lLGE9aT09PWBmaXhlZGAsbz1RbihyKSxzPXQ/YXIodC5mbG9hdGluZyk6ITE7aWYocj09PW98fHMmJmEpcmV0dXJuIG47bGV0IGM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD1mbigxKSx1PWZuKDApLGQ9dHIocik7aWYoKGR8fCFhKSYmKChabihyKSE9PWBib2R5YHx8cnIobykpJiYoYz1ocihyKSksZCkpe2xldCBlPUVyKHIpO2w9U3IociksdS54PWUueCtyLmNsaWVudExlZnQsdS55PWUueStyLmNsaWVudFRvcH1sZXQgZj1vJiYhZCYmIWE/T3IobyxjKTpmbigwKTtyZXR1cm57d2lkdGg6bi53aWR0aCpsLngsaGVpZ2h0Om4uaGVpZ2h0KmwueSx4Om4ueCpsLngtYy5zY3JvbGxMZWZ0KmwueCt1LngrZi54LHk6bi55KmwueS1jLnNjcm9sbFRvcCpsLnkrdS55K2YueX19ZnVuY3Rpb24gQXIoZSl7cmV0dXJuIGUuZ2V0Q2xpZW50UmVjdHM/QXJyYXkuZnJvbShlLmdldENsaWVudFJlY3RzKCkpOltdfWZ1bmN0aW9uIGpyKGUpe2xldCB0PWhyKGUpLG49ZS5vd25lckRvY3VtZW50LmJvZHkscj1sbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsbi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoKSxpPWxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0KSxhPS10LnNjcm9sbExlZnQrRHIoZSksbz0tdC5zY3JvbGxUb3A7cmV0dXJuIG1yKG4pLmRpcmVjdGlvbj09PWBydGxgJiYoYSs9bG4oZS5jbGllbnRXaWR0aCxuLmNsaWVudFdpZHRoKS1yKSx7d2lkdGg6cixoZWlnaHQ6aSx4OmEseTpvfX12YXIgTXI9MjU7ZnVuY3Rpb24gTnIoZSx0LG4pe249PT12b2lkIDAmJihuPWB2aWV3cG9ydGApO2xldCByPW49PT1gbGF5b3V0Vmlld3BvcnRgLGk9SChlKSxhPVFuKGUpLG89aS52aXN1YWxWaWV3cG9ydCxzPWEuY2xpZW50V2lkdGgsYz1hLmNsaWVudEhlaWdodCxsPTAsdT0wO2lmKG8pe2xldCBlPSFmcigpfHx0PT09YGZpeGVkYDtyP2V8fChsPS1vLm9mZnNldExlZnQsdT0tby5vZmZzZXRUb3ApOihzPW8ud2lkdGgsYz1vLmhlaWdodCxlJiYobD1vLm9mZnNldExlZnQsdT1vLm9mZnNldFRvcCkpfWlmKERyKGEpPD0wKXtsZXQgZT1hLm93bmVyRG9jdW1lbnQsdD1lLmJvZHksbj1nZXRDb21wdXRlZFN0eWxlKHQpLHI9ZS5jb21wYXRNb2RlPT09YENTUzFDb21wYXRgJiZwYXJzZUZsb2F0KG4ubWFyZ2luTGVmdCkrcGFyc2VGbG9hdChuLm1hcmdpblJpZ2h0KXx8MCxpPU1hdGguYWJzKGEuY2xpZW50V2lkdGgtdC5jbGllbnRXaWR0aC1yKSxvPWdldENvbXB1dGVkU3R5bGUoYSkuc2Nyb2xsYmFyR3V0dGVyPT09YHN0YWJsZSBib3RoLWVkZ2VzYD9pLzI6aTtvPD1NciYmKHMtPW8pfXJldHVybnt3aWR0aDpzLGhlaWdodDpjLHg6bCx5OnV9fWZ1bmN0aW9uIFByKGUsdCl7bGV0IG49RXIoZSwhMCx0PT09YGZpeGVkYCkscj1uLnRvcCtlLmNsaWVudFRvcCxpPW4ubGVmdCtlLmNsaWVudExlZnQsYT1TcihlKTtyZXR1cm57d2lkdGg6ZS5jbGllbnRXaWR0aCphLngsaGVpZ2h0OmUuY2xpZW50SGVpZ2h0KmEueSx4OmkqYS54LHk6ciphLnl9fWZ1bmN0aW9uIEZyKGUsdCxuKXtsZXQgcjtpZih0PT09YHZpZXdwb3J0YHx8dD09PWBsYXlvdXRWaWV3cG9ydGApcj1OcihlLG4sdCk7ZWxzZSBpZih0PT09YGRvY3VtZW50YClyPWpyKFFuKGUpKTtlbHNlIGlmKGVyKHQpKXI9UHIodCxuKTtlbHNle2xldCBuPXdyKGUpO3I9e3g6dC54LW4ueCx5OnQueS1uLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiBQbihyKX1mdW5jdGlvbiBJcihlLHQpe2xldCBuPXQuZ2V0KGUpO2lmKG4pcmV0dXJuIG47bGV0IHI9dnIoZSxbXSwhMSkuZmlsdGVyKGU9PmVyKGUpJiZabihlKSE9PWBib2R5YCksaT1udWxsLGE9bXIoZSkucG9zaXRpb249PT1gZml4ZWRgLG89YT9ncihlKTplO2Zvcig7ZXIobykmJiFwcihvKTspe2xldCBlPW1yKG8pLHQ9dXIobyksbj1pP2kucG9zaXRpb246YT9gZml4ZWRgOmBgOyF0JiYobj09PWBmaXhlZGB8fG49PT1gYWJzb2x1dGVgJiZlLnBvc2l0aW9uPT09YHN0YXRpY2ApP3I9ci5maWx0ZXIoZT0+ZSE9PW8pOmk9ZSxvPWdyKG8pfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gTHIoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWUsYT1bLi4ubj09PWBjbGlwcGluZ0FuY2VzdG9yc2A/YXIodCk/W106SXIodCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0sbz1Gcih0LGFbMF0saSkscz1vLnRvcCxjPW8ucmlnaHQsbD1vLmJvdHRvbSx1PW8ubGVmdDtmb3IobGV0IGU9MTtlPGEubGVuZ3RoO2UrKyl7bGV0IG49RnIodCxhW2VdLGkpO3M9bG4obi50b3AscyksYz1jbihuLnJpZ2h0LGMpLGw9Y24obi5ib3R0b20sbCksdT1sbihuLmxlZnQsdSl9cmV0dXJue3dpZHRoOmMtdSxoZWlnaHQ6bC1zLHg6dSx5OnN9fWZ1bmN0aW9uIFJyKGUpe2xldHt3aWR0aDp0LGhlaWdodDpufT1icihlKTtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6bn19ZnVuY3Rpb24genIoZSx0LG4pe2xldCByPXRyKHQpLGk9UW4odCksYT1uPT09YGZpeGVkYCxvPUVyKGUsITAsYSx0KSxzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGM9Zm4oMCk7aWYoKHJ8fCFhKSYmKChabih0KSE9PWBib2R5YHx8cnIoaSkpJiYocz1ocih0KSkscikpe2xldCBlPUVyKHQsITAsYSx0KTtjLng9ZS54K3QuY2xpZW50TGVmdCxjLnk9ZS55K3QuY2xpZW50VG9wfSFyJiZpJiYoYy54PURyKGkpKTtsZXQgbD1pJiYhciYmIWE/T3IoaSxzKTpmbigwKTtyZXR1cm57eDpvLmxlZnQrcy5zY3JvbGxMZWZ0LWMueC1sLngseTpvLnRvcCtzLnNjcm9sbFRvcC1jLnktbC55LHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX1mdW5jdGlvbiBCcihlKXtyZXR1cm4gbXIoZSkucG9zaXRpb249PT1gc3RhdGljYH1mdW5jdGlvbiBWcihlLHQpe2lmKCF0cihlKXx8bXIoZSkucG9zaXRpb249PT1gZml4ZWRgKXJldHVybiBudWxsO2lmKHQpcmV0dXJuIHQoZSk7bGV0IG49ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIFFuKGUpPT09biYmKG49bi5vd25lckRvY3VtZW50LmJvZHkpLG59ZnVuY3Rpb24gSHIoZSx0KXtsZXQgbj1IKGUpO2lmKGFyKGUpKXJldHVybiBuO2lmKCF0cihlKSl7bGV0IHQ9Z3IoZSk7Zm9yKDt0JiYhcHIodCk7KXtpZihlcih0KSYmIUJyKHQpKXJldHVybiB0O3Q9Z3IodCl9cmV0dXJuIG59bGV0IHI9VnIoZSx0KTtmb3IoO3ImJmlyKHIpJiZCcihyKTspcj1WcihyLHQpO3JldHVybiByJiZwcihyKSYmQnIocikmJiF1cihyKT9uOnJ8fGRyKGUpfHxufXZhciBVcj1hc3luYyBmdW5jdGlvbihlKXtsZXQgdD10aGlzLmdldE9mZnNldFBhcmVudHx8SHIsbj10aGlzLmdldERpbWVuc2lvbnMscj1hd2FpdCBuKGUuZmxvYXRpbmcpO3JldHVybntyZWZlcmVuY2U6enIoZS5yZWZlcmVuY2UsYXdhaXQgdChlLmZsb2F0aW5nKSxlLnN0cmF0ZWd5KSxmbG9hdGluZzp7eDowLHk6MCx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH19fTtmdW5jdGlvbiBXcihlKXtyZXR1cm4gbXIoZSkuZGlyZWN0aW9uPT09YHJ0bGB9dmFyIEdyPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDprcixnZXREb2N1bWVudEVsZW1lbnQ6UW4sZ2V0Q2xpcHBpbmdSZWN0OkxyLGdldE9mZnNldFBhcmVudDpIcixnZXRFbGVtZW50UmVjdHM6VXIsZ2V0Q2xpZW50UmVjdHM6QXIsZ2V0RGltZW5zaW9uczpScixnZXRTY2FsZTpTcixpc0VsZW1lbnQ6ZXIsaXNSVEw6V3J9O2Z1bmN0aW9uIEtyKGUsdCl7cmV0dXJuIGUueD09PXQueCYmZS55PT09dC55JiZlLndpZHRoPT09dC53aWR0aCYmZS5oZWlnaHQ9PT10LmhlaWdodH1mdW5jdGlvbiBxcihlLHQsbil7bGV0IHI9bnVsbCxpLGE9UW4oZSk7ZnVuY3Rpb24gbygpe3ZhciBlO2NsZWFyVGltZW91dChpKSwoZT1yKT09bnVsbHx8ZS5kaXNjb25uZWN0KCkscj1udWxsfWZ1bmN0aW9uIHMobixjKXtuPT09dm9pZCAwJiYobj0hMSksYz09PXZvaWQgMCYmKGM9MSksbygpO2xldCBsPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2xlZnQ6dSx0b3A6ZCx3aWR0aDpmLGhlaWdodDpwfT1sO2lmKG58fHQoKSwhZnx8IXApcmV0dXJuO2xldCBtPWRuKGQpLGg9ZG4oYS5jbGllbnRXaWR0aC0odStmKSksZz1kbihhLmNsaWVudEhlaWdodC0oZCtwKSksXz1kbih1KSx2PXtyb290TWFyZ2luOi1tK2BweCBgKy1oK2BweCBgKy1nK2BweCBgKy1fK2BweGAsdGhyZXNob2xkOmxuKDAsY24oMSxjKSl8fDF9LHk9ITA7ZnVuY3Rpb24gYih0KXtsZXQgbj10WzBdLmludGVyc2VjdGlvblJhdGlvO2lmKCFLcihsLGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKXJldHVybiBzKCk7aWYobiE9PWMpe2lmKCF5KXJldHVybiBzKCk7bj9zKCExLG4pOmk9c2V0VGltZW91dCgoKT0+e3MoITEsMWUtNyl9LDFlMyl9eT0hMX10cnl7cj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYix7Li4udixyb290OmEub3duZXJEb2N1bWVudH0pfWNhdGNoe3I9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGIsdil9ci5vYnNlcnZlKGUpfWxldCBjPUgoZSksbD0oKT0+cyhuKTtyZXR1cm4gYy5hZGRFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLHMoITApLCgpPT57Yy5yZW1vdmVFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLG8oKX19ZnVuY3Rpb24gSnIoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2xldHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOmE9ITAsZWxlbWVudFJlc2l6ZTpvPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09YGZ1bmN0aW9uYCxsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09YGZ1bmN0aW9uYCxhbmltYXRpb25GcmFtZTpjPSExfT1yLGw9eHIoZSksdT1pfHxhP1suLi5sP3ZyKGwpOltdLC4uLnQ/dnIodCk6W11dOltdO3UuZm9yRWFjaChlPT57aSYmZS5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUuYWRkRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pO2xldCBkPWwmJnM/cXIobCxuLGEpOm51bGwsZj0tMSxwPW51bGw7byYmKHA9bmV3IFJlc2l6ZU9ic2VydmVyKGU9PntsZXRbcl09ZTtyJiZyLnRhcmdldD09PWwmJnAmJnQmJihwLnVub2JzZXJ2ZSh0KSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3ZhciBlOyhlPXApPT1udWxsfHxlLm9ic2VydmUodCl9KSksbigpfSksbCYmIWMmJnAub2JzZXJ2ZShsKSx0JiZwLm9ic2VydmUodCkpO2xldCBtLGg9Yz9FcihlKTpudWxsO2MmJmcoKTtmdW5jdGlvbiBnKCl7bGV0IHQ9RXIoZSk7aCYmIUtyKGgsdCkmJm4oKSxoPXQsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZyl9cmV0dXJuIG4oKSwoKT0+e3ZhciBlO3UuZm9yRWFjaChlPT57aSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pLGQ/LigpLChlPXApPT1udWxsfHxlLmRpc2Nvbm5lY3QoKSxwPW51bGwsYyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fXZhciBZcj1LbixYcj1xbixacj1CbixRcj1Zbiwkcj1VbixlaT16bix0aT1KbixuaT0oZSx0LG4pPT57bGV0IHI9bmV3IE1hcCxpPW4/P3t9LGE9ey4uLkdyLC4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIFJuKGUsdCx7Li4uaSxwbGF0Zm9ybTphfSl9O2Z1bmN0aW9uIHJpKGUpe3JldHVybiB0eXBlb2YgZT09YG9iamVjdGAmJiEhZSYmYCRlbGBpbiBlfWZ1bmN0aW9uIGlpKGUpe2lmKHJpKGUpKXtsZXQgdD1lLiRlbDtyZXR1cm4gJG4odCkmJlpuKHQpPT09YCNjb21tZW50YD9udWxsOnR9cmV0dXJuIGV9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UoKTpiKGUpfWZ1bmN0aW9uIG9pKGUpe3JldHVybntuYW1lOmBhcnJvd2Asb3B0aW9uczplLGZuKHQpe2xldCBuPWlpKGFpKGUuZWxlbWVudCkpO3JldHVybiBuPT1udWxsP3t9OmVpKHtlbGVtZW50Om4scGFkZGluZzplLnBhZGRpbmd9KS5mbih0KX19fWZ1bmN0aW9uIHNpKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PmB1YD8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBjaShlLHQpe2xldCBuPXNpKGUpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1mdW5jdGlvbiBsaShlLHQsbil7bj09PXZvaWQgMCYmKG49e30pO2xldCByPW4ud2hpbGVFbGVtZW50c01vdW50ZWQsaT1NKCgpPT5haShuLm9wZW4pPz8hMCksYT1NKCgpPT5haShuLm1pZGRsZXdhcmUpKSxvPU0oKCk9PmFpKG4ucGxhY2VtZW50KT8/YGJvdHRvbWApLHM9TSgoKT0+YWkobi5zdHJhdGVneSk/P2BhYnNvbHV0ZWApLGM9TSgoKT0+YWkobi50cmFuc2Zvcm0pPz8hMCksbD1NKCgpPT5paShlLnZhbHVlKSksZD1NKCgpPT5paSh0LnZhbHVlKSksZj1GKDApLHA9RigwKSxtPUYocy52YWx1ZSksaD1GKG8udmFsdWUpLGc9dyh7fSksXz1GKCExKSx2PU0oKCk9PntsZXQgZT17cG9zaXRpb246bS52YWx1ZSxsZWZ0OmAwYCx0b3A6YDBgfTtpZighZC52YWx1ZSlyZXR1cm4gZTtsZXQgdD1jaShkLnZhbHVlLGYudmFsdWUpLG49Y2koZC52YWx1ZSxwLnZhbHVlKTtyZXR1cm4gYy52YWx1ZT97Li4uZSx0cmFuc2Zvcm06YHRyYW5zbGF0ZShgK3QrYHB4LCBgK24rYHB4KWAsLi4uc2koZC52YWx1ZSk+PTEuNSYme3dpbGxDaGFuZ2U6YHRyYW5zZm9ybWB9fTp7cG9zaXRpb246bS52YWx1ZSxsZWZ0OnQrYHB4YCx0b3A6bitgcHhgfX0pLHk7ZnVuY3Rpb24gYigpe2lmKGwudmFsdWU9PW51bGx8fGQudmFsdWU9PW51bGwpcmV0dXJuO2xldCBlPWkudmFsdWU7bmkobC52YWx1ZSxkLnZhbHVlLHttaWRkbGV3YXJlOmEudmFsdWUscGxhY2VtZW50Om8udmFsdWUsc3RyYXRlZ3k6cy52YWx1ZX0pLnRoZW4odD0+e2YudmFsdWU9dC54LHAudmFsdWU9dC55LG0udmFsdWU9dC5zdHJhdGVneSxoLnZhbHVlPXQucGxhY2VtZW50LGcudmFsdWU9dC5taWRkbGV3YXJlRGF0YSxfLnZhbHVlPWUhPT0hMX0pfWZ1bmN0aW9uIHgoKXt0eXBlb2YgeT09YGZ1bmN0aW9uYCYmKHkoKSx5PXZvaWQgMCl9ZnVuY3Rpb24gQygpe2lmKHgoKSxyPT09dm9pZCAwKXtiKCk7cmV0dXJufWlmKGwudmFsdWUhPW51bGwmJmQudmFsdWUhPW51bGwpe3k9cihsLnZhbHVlLGQudmFsdWUsYik7cmV0dXJufX1mdW5jdGlvbiBUKCl7aS52YWx1ZXx8KF8udmFsdWU9ITEpfXJldHVybiBWKFthLG8scyxpXSxiLHtmbHVzaDpgc3luY2B9KSxWKFtsLGRdLEMse2ZsdXNoOmBzeW5jYH0pLFYoaSxULHtmbHVzaDpgc3luY2B9KSx1KCkmJk9lKHgpLHt4OlMoZikseTpTKHApLHN0cmF0ZWd5OlMobSkscGxhY2VtZW50OlMoaCksbWlkZGxld2FyZURhdGE6UyhnKSxpc1Bvc2l0aW9uZWQ6UyhfKSxmbG9hdGluZ1N0eWxlczp2LHVwZGF0ZTpifX12YXIgdWk9W2BkaXJgXSxkaT17c2lkZTpgYm90dG9tYCxzaWRlT2Zmc2V0OjAsc2lkZUZsaXA6ITAsYWxpZ246YGNlbnRlcmAsYWxpZ25PZmZzZXQ6MCxhbGlnbkZsaXA6ITAsYXJyb3dQYWRkaW5nOjAsaGlkZVNoaWZ0ZWRBcnJvdzohMCxhdm9pZENvbGxpc2lvbnM6ITAsY29sbGlzaW9uQm91bmRhcnk6KCk9PltdLGNvbGxpc2lvblBhZGRpbmc6MCxzdGlja3k6YHBhcnRpYWxgLGhpZGVXaGVuRGV0YWNoZWQ6ITEscG9zaXRpb25TdHJhdGVneTpgZml4ZWRgLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6YG9wdGltaXplZGAscHJpb3JpdGl6ZVBvc2l0aW9uOiExfSxbZmkscGldPW9lKGBQb3BwZXJDb250ZW50YCksbWk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyQ29udGVudGAscHJvcHM6V2Uoe21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSx7Li4uZGl9KSxlbWl0czpbYHBsYWNlZGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGE9JHQoKSx7Zm9yd2FyZFJlZjpzLGN1cnJlbnRFbGVtZW50OmN9PWllKCksdT1sKE0oKCk9Pm4uZGlyKSksZD1GKCksZj1GKCkse3dpZHRoOnAsaGVpZ2h0Om19PUN0KGYpLGg9TSgoKT0+bi5zaWRlKyhuLmFsaWduPT09YGNlbnRlcmA/YGA6YC0ke24uYWxpZ259YCkpLGc9TSgoKT0+dHlwZW9mIG4uY29sbGlzaW9uUGFkZGluZz09YG51bWJlcmA/bi5jb2xsaXNpb25QYWRkaW5nOnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MCwuLi5uLmNvbGxpc2lvblBhZGRpbmd9KSxfPU0oKCk9PkFycmF5LmlzQXJyYXkobi5jb2xsaXNpb25Cb3VuZGFyeSk/bi5jb2xsaXNpb25Cb3VuZGFyeTpbbi5jb2xsaXNpb25Cb3VuZGFyeV0pLHY9TSgoKT0+KHtwYWRkaW5nOmcudmFsdWUsYm91bmRhcnk6Xy52YWx1ZS5maWx0ZXIocm4pLGFsdEJvdW5kYXJ5Ol8udmFsdWUubGVuZ3RoPjB9KSkseT1NKCgpPT4oe21haW5BeGlzOm4uc2lkZUZsaXAsY3Jvc3NBeGlzOm4uYWxpZ25GbGlwfSkpLHg9TSgoKT0+W1lyKHttYWluQXhpczpuLnNpZGVPZmZzZXQrbS52YWx1ZSxhbGlnbm1lbnRBeGlzOm4uYWxpZ25PZmZzZXR9KSxuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxuLmF2b2lkQ29sbGlzaW9ucyYmWHIoe21haW5BeGlzOiEwLGNyb3NzQXhpczohIW4ucHJpb3JpdGl6ZVBvc2l0aW9uLGxpbWl0ZXI6bi5zdGlja3k9PT1gcGFydGlhbGA/dGkoKTp2b2lkIDAsLi4udi52YWx1ZX0pLCFuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxRcih7Li4udi52YWx1ZSxhcHBseTooe2VsZW1lbnRzOmUscmVjdHM6dCxhdmFpbGFibGVXaWR0aDpuLGF2YWlsYWJsZUhlaWdodDpyfSk9PntsZXR7d2lkdGg6aSxoZWlnaHQ6YX09dC5yZWZlcmVuY2Usbz1lLmZsb2F0aW5nLnN0eWxlO28uc2V0UHJvcGVydHkoYC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoYCxgJHtufXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0YCxgJHtyfXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGhgLGAke2l9cHhgKSxvLnNldFByb3BlcnR5KGAtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHRgLGAke2F9cHhgKX19KSxmLnZhbHVlJiZvaSh7ZWxlbWVudDpmLnZhbHVlLHBhZGRpbmc6bi5hcnJvd1BhZGRpbmd9KSxhbih7YXJyb3dXaWR0aDpwLnZhbHVlLGFycm93SGVpZ2h0Om0udmFsdWUsZGlyOnUudmFsdWV9KSxuLmhpZGVXaGVuRGV0YWNoZWQmJiRyKHtzdHJhdGVneTpgcmVmZXJlbmNlSGlkZGVuYCwuLi52LnZhbHVlfSldKSx7ZmxvYXRpbmdTdHlsZXM6UyxwbGFjZW1lbnQ6Qyxpc1Bvc2l0aW9uZWQ6dyxtaWRkbGV3YXJlRGF0YTpULHVwZGF0ZTpFfT1saShNKCgpPT5uLnJlZmVyZW5jZT8/YS5hbmNob3IudmFsdWUpLGQse3N0cmF0ZWd5Om4ucG9zaXRpb25TdHJhdGVneSxwbGFjZW1lbnQ6aCx3aGlsZUVsZW1lbnRzTW91bnRlZDooLi4uZSk9PkpyKC4uLmUse2xheW91dFNoaWZ0OiFuLmRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0LGFuaW1hdGlvbkZyYW1lOm4udXBkYXRlUG9zaXRpb25TdHJhdGVneT09PWBhbHdheXNgfSksbWlkZGxld2FyZTp4fSksRD1NKCgpPT5vbihDLnZhbHVlKVswXSksTz1NKCgpPT5vbihDLnZhbHVlKVsxXSk7bygoKT0+e3cudmFsdWUmJnIoYHBsYWNlZGApfSk7bGV0IGs9TSgoKT0+e2xldCBlPVQudmFsdWUuYXJyb3c/LmNlbnRlck9mZnNldCE9PTA7cmV0dXJuIG4uaGlkZVNoaWZ0ZWRBcnJvdyYmZX0pLGVlPUYoYGApO3JldHVybiByZSgoKT0+e2MudmFsdWUmJihlZS52YWx1ZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjLnZhbHVlKS56SW5kZXgpfSkscGkoe3BsYWNlZFNpZGU6RCxvbkFycm93Q2hhbmdlOmU9PmYudmFsdWU9ZSxhcnJvd1g6TSgoKT0+VC52YWx1ZS5hcnJvdz8ueD8/MCksYXJyb3dZOk0oKCk9PlQudmFsdWUuYXJyb3c/Lnk/PzApLHNob3VsZEhpZGVBcnJvdzprfSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgZmxvYXRpbmdSZWZgLHJlZjpkLCJkYXRhLXJla2EtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6YGAsZGlyOmIodSksc3R5bGU6aSh7Li4uYihTKSx0cmFuc2Zvcm06Yih3KT9iKFMpLnRyYW5zZm9ybTpgdHJhbnNsYXRlKDAsIC0yMDAlKWAsbWluV2lkdGg6YG1heC1jb250ZW50YCx6SW5kZXg6ZWUudmFsdWUsIi0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6W2IoVCkudHJhbnNmb3JtT3JpZ2luPy54LGIoVCkudHJhbnNmb3JtT3JpZ2luPy55XS5qb2luKGAgYCksLi4uYihUKS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4mJnt2aXNpYmlsaXR5OmBoaWRkZW5gLHBvaW50ZXJFdmVudHM6YG5vbmVgfX0pfSxbbi5tZW1vRGVwZW5kZW5jaWVzP2FlKFtuLmFzQ2hpbGQsbi5hcyxELnZhbHVlLE8udmFsdWUsYih3KSwuLi5PYmplY3QudmFsdWVzKGUuJGF0dHJzKSwuLi5uLm1lbW9EZXBlbmRlbmNpZXNdLCgpPT4oTigpLEkoYihBKSxqKHtrZXk6MCxyZWY6YihzKX0sZS4kYXR0cnMseyJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOm4uYXMsImRhdGEtc2lkZSI6RC52YWx1ZSwiZGF0YS1hbGlnbiI6Ty52YWx1ZSxzdHlsZTp7YW5pbWF0aW9uOmIodyk/dm9pZCAwOmBub25lYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGFzLWNoaWxkYCxgYXNgLGBkYXRhLXNpZGVgLGBkYXRhLWFsaWduYCxgc3R5bGVgXSkpLHQsMCk6KE4oKSxJKGIoQSksaih7a2V5OjEscmVmOmIocyl9LGUuJGF0dHJzLHsiYXMtY2hpbGQiOm4uYXNDaGlsZCxhczpuLmFzLCJkYXRhLXNpZGUiOkQudmFsdWUsImRhdGEtYWxpZ24iOk8udmFsdWUsZGlyOmIodSksc3R5bGU6e2FuaW1hdGlvbjpiKHcpP3ZvaWQgMDpgbm9uZWB9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2Bhcy1jaGlsZGAsYGFzYCxgZGF0YS1zaWRlYCxgZGF0YS1hbGlnbmAsYGRpcmAsYHN0eWxlYF0pKV0sMTIsdWkpKX19KTtmdW5jdGlvbiBoaShlKXtsZXQgdD1zKHtub25jZTpGKCl9KTtyZXR1cm4gTSgoKT0+ZT8udmFsdWV8fHQubm9uY2U/LnZhbHVlKX12YXIgZ2k9W2AgYCxgRW50ZXJgLGBBcnJvd1VwYCxgQXJyb3dEb3duYF0sX2k9W2AgYCxgRW50ZXJgXTtmdW5jdGlvbiB2aShlLHQsbil7cmV0dXJuIGU9PT12b2lkIDA/ITE6QXJyYXkuaXNBcnJheShlKT9lLnNvbWUoZT0+eWkoZSx0LG4pKTp5aShlLHQsbil9ZnVuY3Rpb24geWkoZSx0LG4pe3JldHVybiBlPT09dm9pZCAwfHx0PT09dm9pZCAwPyExOnR5cGVvZiBlPT1gc3RyaW5nYD9lPT09dDp0eXBlb2Ygbj09YGZ1bmN0aW9uYD9uKGUsdCk6dHlwZW9mIG49PWBzdHJpbmdgP2U/LltuXT09PXQ/LltuXTpsZShlLHQpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlPT1udWxsfHxlPT09YGB8fEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MH12YXIgeGk9W2B2YWx1ZWBdLFtTaSxDaV09b2UoYFNlbGVjdFJvb3RgKSx3aT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RSb290YCxwcm9wczp7b3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxkZWZhdWx0VmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sbW9kZWxWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxudWxsYWJsZVZhbHVlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxieTp7dHlwZTpbU3RyaW5nLEZ1bmN0aW9uXSxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sbmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYCxgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7cmVxdWlyZWQ6aSxkaXNhYmxlZDphLG11bHRpcGxlOm8sZGlyOnN9PWYobiksYz1DKG4sYG1vZGVsVmFsdWVgLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZT8/KG8udmFsdWU/W106dm9pZCAwKSxwYXNzaXZlOm4ubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSksdT1DKG4sYG9wZW5gLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRPcGVuLHBhc3NpdmU6bi5vcGVuPT09dm9pZCAwfSksZD1GKCkscD1GKCksbT1GKHt4OjAseTowfSksaD1NKCgpPT5vLnZhbHVlJiZBcnJheS5pc0FycmF5KGMudmFsdWUpP2MudmFsdWU/Lmxlbmd0aD09PTA6c2UoYy52YWx1ZSkpO0plKHtpc1Byb3ZpZGVyOiEwfSk7bGV0IGc9bChzKSxfPWZ0KGQpLHY9RihuZXcgU2V0KSx5PU0oKCk9PkFycmF5LmZyb20odi52YWx1ZSkubWFwKGU9PmUudmFsdWUpLmpvaW4oYDtgKSk7ZnVuY3Rpb24geChlKXtpZihvLnZhbHVlKXtsZXQgdD1BcnJheS5pc0FycmF5KGMudmFsdWUpP1suLi5jLnZhbHVlXTpbXSxyPXQuZmluZEluZGV4KHQ9PnlpKHQsZSxuLmJ5KSk7cj09PS0xP3QucHVzaChlKTp0LnNwbGljZShyLDEpLGMudmFsdWU9Wy4uLnRdfWVsc2UgYy52YWx1ZT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIEFycmF5LmZyb20odi52YWx1ZSkuZmluZCh0PT52aShlLHQudmFsdWUsbi5ieSkpfXJldHVybiBDaSh7dHJpZ2dlckVsZW1lbnQ6ZCxvblRyaWdnZXJDaGFuZ2U6ZT0+e2QudmFsdWU9ZX0sdmFsdWVFbGVtZW50OnAsb25WYWx1ZUVsZW1lbnRDaGFuZ2U6ZT0+e3AudmFsdWU9ZX0sY29udGVudElkOmBgLG1vZGVsVmFsdWU6YyxvblZhbHVlQ2hhbmdlOngsYnk6bi5ieSxvcGVuOnUsbXVsdGlwbGU6byxyZXF1aXJlZDppLG9uT3BlbkNoYW5nZTplPT57dS52YWx1ZT1lfSxkaXI6Zyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6bSxkaXNhYmxlZDphLGlzRW1wdHlNb2RlbFZhbHVlOmgsb3B0aW9uc1NldDp2LG9uT3B0aW9uQWRkOmU9PntsZXQgdD1TKGUudmFsdWUpO3QmJnYudmFsdWUuZGVsZXRlKHQpLHYudmFsdWUuYWRkKGUpfSxvbk9wdGlvblJlbW92ZTplPT57bGV0IHQ9UyhlLnZhbHVlKTt0JiZ2LnZhbHVlLmRlbGV0ZSh0KX19KSwoZSx0KT0+KE4oKSxJKGIodG4pLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOmIoYyksb3BlbjpiKHUpfSksYihfKSYmZS5uYW1lPyhOKCksSShUaSx7a2V5OnkudmFsdWUsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsdGFiaW5kZXg6YC0xYCxtdWx0aXBsZTpiKG8pLHJlcXVpcmVkOmIoaSksbmFtZTplLm5hbWUsYXV0b2NvbXBsZXRlOmUuYXV0b2NvbXBsZXRlLGRpc2FibGVkOmIoYSksdmFsdWU6YihjKX0se2RlZmF1bHQ6QigoKT0+W2Ioc2UpKGIoYykpPyhOKCksUChgb3B0aW9uYCx7a2V5OjAsdmFsdWU6ZS5udWxsYWJsZVZhbHVlfSxudWxsLDgseGkpKTp6ZShgdi1pZmAsITApLChOKCEwKSxQKGssbnVsbCxtZShBcnJheS5mcm9tKHYudmFsdWUpLGU9PihOKCksUChgb3B0aW9uYCxqKHtrZXk6ZS52YWx1ZT8/YGB9LHtyZWZfZm9yOiEwfSxlKSxudWxsLDE2KSkpLDEyOCkpXSksXzoxfSw4LFtgbXVsdGlwbGVgLGByZXF1aXJlZGAsYG5hbWVgLGBhdXRvY29tcGxldGVgLGBkaXNhYmxlZGAsYHZhbHVlYF0pKTp6ZShgdi1pZmAsITApXSksXzozfSkpfX0pLFRpPVIoe19fbmFtZTpgQnViYmxlU2VsZWN0YCxwcm9wczp7YXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcm06e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxuYW1lOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc2l6ZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49RigpLHI9U2koKTtWKCgpPT50LnZhbHVlLChlLHQpPT57bGV0IHI9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixgdmFsdWVgKS5zZXQ7aWYoZSE9PXQmJmkmJm4udmFsdWUpe2xldCB0PW5ldyBFdmVudChgY2hhbmdlYCx7YnViYmxlczohMH0pO2kuY2FsbChuLnZhbHVlLGUpLG4udmFsdWUuZGlzcGF0Y2hFdmVudCh0KX19KTtmdW5jdGlvbiBpKGUpe3Iub25WYWx1ZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9cmV0dXJuKGUscik9PihOKCksSShiKFF0KSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0hlKGBzZWxlY3RgLGooe3JlZl9rZXk6YHNlbGVjdEVsZW1lbnRgLHJlZjpufSx0LHtvbklucHV0Oml9KSxbeihlLiRzbG90cyxgZGVmYXVsdGApXSwxNildKSxfOjN9KSl9fSksRWk9Uih7X19uYW1lOmBTZWxlY3RQb3BwZXJQb3NpdGlvbmAscHJvcHM6e21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITEsZGVmYXVsdDoxMH0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1LZShlKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIobWkpLGooYih0KSx7c3R5bGU6e2JveFNpemluZzpgYm9yZGVyLWJveGAsIi0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjpgdmFyKC0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilgLCItLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKWAsIi0tcmVrYS1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClgLCItLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgiOmB2YXIoLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGgpYCwiLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6YHZhcigtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHQpYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLERpPXtvblZpZXdwb3J0Q2hhbmdlOigpPT57fSxpdGVtVGV4dFJlZkNhbGxiYWNrOigpPT57fSxpdGVtUmVmQ2FsbGJhY2s6KCk9Pnt9fSxbT2ksa2ldPW9lKGBTZWxlY3RDb250ZW50YCksQWk9Uih7X19uYW1lOmBTZWxlY3RDb250ZW50SW1wbGAscHJvcHM6e3Bvc2l0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBpdGVtLWFsaWduZWRgfSxib2R5TG9jazp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITF9LGFycm93UGFkZGluZzp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc3RpY2t5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0saGlkZVdoZW5EZXRhY2hlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sdXBkYXRlUG9zaXRpb25TdHJhdGVneTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxyZWZlcmVuY2U6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPVNpKCk7dXQoKSxvdChuLmJvZHlMb2NrKTtsZXR7Q29sbGVjdGlvblNsb3Q6YSxnZXRJdGVtczpvfT1KZSgpLHM9RigpO1N0KHMpO2xldHtzZWFyY2g6YyxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6bH09d3QoKSx1PUYoKSxkPUYoKSxmPUYoKSxwPUYoITEpLG09RighMSksaD1GKCExKTtmdW5jdGlvbiBnKCl7ZC52YWx1ZSYmcy52YWx1ZSYmWHQoW2QudmFsdWUscy52YWx1ZV0pfVYocCwoKT0+e2coKX0pO2xldHtvbk9wZW5DaGFuZ2U6Xyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6dn09aTtyZShlPT57aWYoIXMudmFsdWUpcmV0dXJuO2xldCB0PXt4OjAseTowfSxuPWU9Pnt0PXt4Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWCktKHYudmFsdWU/Lng/PzApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWSktKHYudmFsdWU/Lnk/PzApKX19LHI9ZT0+e2UucG9pbnRlclR5cGUhPT1gdG91Y2hgJiYodC54PD0xMCYmdC55PD0xMD9lLnByZXZlbnREZWZhdWx0KCk6cy52YWx1ZT8uY29udGFpbnMoZS50YXJnZXQpfHxfKCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksdi52YWx1ZT1udWxsKX07di52YWx1ZSE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihgcG9pbnRlcnVwYCxyLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksZSgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBvaW50ZXJtb3ZlYCxuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVydXBgLHIse2NhcHR1cmU6ITB9KX0pfSk7ZnVuY3Rpb24geShlKXtsZXQgdD1lLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXk7aWYoZS5rZXk9PT1gVGFiYCYmZS5wcmV2ZW50RGVmYXVsdCgpLCF0JiZlLmtleS5sZW5ndGg9PT0xJiZsKGUua2V5LG8oKSksW2BBcnJvd1VwYCxgQXJyb3dEb3duYCxgSG9tZWAsYEVuZGBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IHQ9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpXTtpZihbYEFycm93VXBgLGBFbmRgXS5pbmNsdWRlcyhlLmtleSkmJih0PXQuc2xpY2UoKS5yZXZlcnNlKCkpLFtgQXJyb3dVcGAsYEFycm93RG93bmBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IG49ZS50YXJnZXQscj10LmluZGV4T2Yobik7dD10LnNsaWNlKHIrMSl9c2V0VGltZW91dCgoKT0+WHQodCkpLGUucHJldmVudERlZmF1bHQoKX19bGV0IHg9TSgoKT0+bi5wb3NpdGlvbj09PWBwb3BwZXJgP246e30pLFM9S2UoeC52YWx1ZSk7cmV0dXJuIGtpKHtjb250ZW50OnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmU9Pnt1LnZhbHVlPWV9LGl0ZW1SZWZDYWxsYmFjazooZSx0LG4pPT57bGV0IHI9IW0udmFsdWUmJiFuLGE9dmkoaS5tb2RlbFZhbHVlLnZhbHVlLHQsaS5ieSk7aWYoaS5tdWx0aXBsZS52YWx1ZSl7aWYoaC52YWx1ZSlyZXR1cm47KGF8fHIpJiYoZC52YWx1ZT1lLGEmJihoLnZhbHVlPSEwKSl9ZWxzZShhfHxyKSYmKGQudmFsdWU9ZSk7ciYmKG0udmFsdWU9ITApfSxzZWxlY3RlZEl0ZW06ZCxzZWxlY3RlZEl0ZW1UZXh0OmYsb25JdGVtTGVhdmU6KCk9PntzLnZhbHVlPy5mb2N1cygpfSxpdGVtVGV4dFJlZkNhbGxiYWNrOihlLHQsbik9PntsZXQgcj0hbS52YWx1ZSYmIW47KHZpKGkubW9kZWxWYWx1ZS52YWx1ZSx0LGkuYnkpfHxyKSYmKGYudmFsdWU9ZSl9LGZvY3VzU2VsZWN0ZWRJdGVtOmcscG9zaXRpb246bi5wb3NpdGlvbixpc1Bvc2l0aW9uZWQ6cCxzZWFyY2hSZWY6Y30pLChlLHQpPT4oTigpLEkoYihhKSxudWxsLHtkZWZhdWx0OkIoKCk9PltMKGIoS3QpLHsiYXMtY2hpbGQiOmBgLG9uTW91bnRBdXRvRm9jdXM6dFs2XXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25Vbm1vdW50QXV0b0ZvY3VzOnRbN118fD1lPT57cihgY2xvc2VBdXRvRm9jdXNgLGUpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihiKGkpLnRyaWdnZXJFbGVtZW50LnZhbHVlPy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLGUucHJldmVudERlZmF1bHQoKSl9fSx7ZGVmYXVsdDpCKCgpPT5bTChiKE10KSx7ImFzLWNoaWxkIjpgYCwiZGlzYWJsZS1vdXRzaWRlLXBvaW50ZXItZXZlbnRzIjplLmRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxvbkZvY3VzT3V0c2lkZTp0WzJdfHw9ZmUoKCk9Pnt9LFtgcHJldmVudGBdKSxvbkRpc21pc3M6dFszXXx8PWU9PmIoaSkub25PcGVuQ2hhbmdlKCExKSxvbkVzY2FwZUtleURvd246dFs0XXx8PWU9PnIoYGVzY2FwZUtleURvd25gLGUpLG9uUG9pbnRlckRvd25PdXRzaWRlOnRbNV18fD1lPT5yKGBwb2ludGVyRG93bk91dHNpZGVgLGUpfSx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxJKFllKGUucG9zaXRpb249PT1gcG9wcGVyYD9FaTpOaSksaih7Li4uZS4kYXR0cnMsLi4uYihTKX0se2lkOmIoaSkuY29udGVudElkLHJlZjplPT57aWYoIWUpcmV0dXJuO2xldCB0PWIoRGUpKGUpO3Q/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9zLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6cy52YWx1ZT10fSxyb2xlOmBsaXN0Ym94YCwiZGF0YS1zdGF0ZSI6YihpKS5vcGVuLnZhbHVlP2BvcGVuYDpgY2xvc2VkYCxkaXI6YihpKS5kaXIudmFsdWUsc3R5bGU6e2Rpc3BsYXk6YGZsZXhgLGZsZXhEaXJlY3Rpb246YGNvbHVtbmAsb3V0bGluZTpgbm9uZWB9LG9uQ29udGV4dG1lbnU6dFswXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25QbGFjZWQ6dFsxXXx8PWU9PnAudmFsdWU9ITAsb25LZXlkb3duOnl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGlkYCxgZGF0YS1zdGF0ZWAsYGRpcmAsYG9uS2V5ZG93bmBdKSldKSxfOjN9LDgsW2BkaXNhYmxlLW91dHNpZGUtcG9pbnRlci1ldmVudHNgXSldKSxfOjN9KV0pLF86M30pKX19KSxbamksTWldPW9lKGBTZWxlY3RJdGVtQWxpZ25lZFBvc2l0aW9uYCksTmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0SXRlbUFsaWduZWRQb3NpdGlvbmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgcGxhY2VkYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2dldEl0ZW1zOmF9PUplKCksbz1TaSgpLHM9T2koKSxjPUYoITEpLGw9RighMCksdT1GKCkse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1pZSgpLHt2aWV3cG9ydDpwLHNlbGVjdGVkSXRlbTptLHNlbGVjdGVkSXRlbVRleHQ6aCxmb2N1c1NlbGVjdGVkSXRlbTpnfT1zO2Z1bmN0aW9uIF8oKXtpZihvLnRyaWdnZXJFbGVtZW50LnZhbHVlJiZvLnZhbHVlRWxlbWVudC52YWx1ZSYmdS52YWx1ZSYmZi52YWx1ZSYmcD8udmFsdWUmJm0/LnZhbHVlJiZoPy52YWx1ZSl7bGV0IGU9by50cmlnZ2VyRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1vLnZhbHVlRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWgudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoby5kaXIudmFsdWUhPT1gcnRsYCl7bGV0IHI9aS5sZWZ0LXQubGVmdCxhPW4ubGVmdC1yLG89ZS5sZWZ0LWEscz1lLndpZHRoK28sYz1NYXRoLm1heChzLHQud2lkdGgpLGw9d2luZG93LmlubmVyV2lkdGgtMTAsZD1RZShhLDEwLE1hdGgubWF4KDEwLGwtYykpO3UudmFsdWUuc3R5bGUubWluV2lkdGg9YCR7c31weGAsdS52YWx1ZS5zdHlsZS5sZWZ0PWAke2R9cHhgfWVsc2V7bGV0IHI9dC5yaWdodC1pLnJpZ2h0LGE9d2luZG93LmlubmVyV2lkdGgtbi5yaWdodC1yLG89d2luZG93LmlubmVyV2lkdGgtZS5yaWdodC1hLHM9ZS53aWR0aCtvLGM9TWF0aC5tYXgocyx0LndpZHRoKSxsPXdpbmRvdy5pbm5lcldpZHRoLTEwLGQ9UWUoYSwxMCxNYXRoLm1heCgxMCxsLWMpKTt1LnZhbHVlLnN0eWxlLm1pbldpZHRoPWAke3N9cHhgLHUudmFsdWUuc3R5bGUucmlnaHQ9YCR7ZH1weGB9bGV0IHM9YSgpLm1hcChlPT5lLnJlZiksbD13aW5kb3cuaW5uZXJIZWlnaHQtMjAsZD1wLnZhbHVlLnNjcm9sbEhlaWdodCxnPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLF89TnVtYmVyLnBhcnNlSW50KGcuYm9yZGVyVG9wV2lkdGgsMTApLHY9TnVtYmVyLnBhcnNlSW50KGcucGFkZGluZ1RvcCwxMCkseT1OdW1iZXIucGFyc2VJbnQoZy5ib3JkZXJCb3R0b21XaWR0aCwxMCksYj1OdW1iZXIucGFyc2VJbnQoZy5wYWRkaW5nQm90dG9tLDEwKSx4PV8rditkK2IreSxTPU1hdGgubWluKG0udmFsdWUub2Zmc2V0SGVpZ2h0KjUseCksQz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwLnZhbHVlKSx3PU51bWJlci5wYXJzZUludChDLnBhZGRpbmdUb3AsMTApLFQ9TnVtYmVyLnBhcnNlSW50KEMucGFkZGluZ0JvdHRvbSwxMCksRT1lLnRvcCtlLmhlaWdodC8yLTEwLEQ9bC1FLE89bS52YWx1ZS5vZmZzZXRIZWlnaHQvMixrPW0udmFsdWUub2Zmc2V0VG9wK08sZWU9Xyt2K2ssdGU9eC1lZTtpZihlZTw9RSl7bGV0IGU9bS52YWx1ZT09PXMuYXQoLTEpO3UudmFsdWUuc3R5bGUuYm90dG9tPWAwcHhgO2xldCB0PWYudmFsdWUuY2xpZW50SGVpZ2h0LXAudmFsdWUub2Zmc2V0VG9wLXAudmFsdWUub2Zmc2V0SGVpZ2h0LG49ZWUrTWF0aC5tYXgoRCxPKyhlP1Q6MCkrdCt5KTt1LnZhbHVlLnN0eWxlLmhlaWdodD1gJHtufXB4YH1lbHNle2xldCBlPW0udmFsdWU9PT1zWzBdO3UudmFsdWUuc3R5bGUudG9wPWAwcHhgO2xldCB0PU1hdGgubWF4KEUsXytwLnZhbHVlLm9mZnNldFRvcCsoZT93OjApK08pK3RlO3UudmFsdWUuc3R5bGUuaGVpZ2h0PWAke3R9cHhgLHAudmFsdWUuc2Nyb2xsVG9wPWVlLUUrcC52YWx1ZS5vZmZzZXRUb3B9dS52YWx1ZS5zdHlsZS5tYXJnaW49YDEwcHggMGAsdS52YWx1ZS5zdHlsZS5taW5IZWlnaHQ9YCR7U31weGAsdS52YWx1ZS5zdHlsZS5tYXhIZWlnaHQ9YCR7bH1weGAscihgcGxhY2VkYCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5jLnZhbHVlPSEwKX19bGV0IHY9RihgYCk7TWUoYXN5bmMoKT0+e2F3YWl0IHhlKCksXygpLGYudmFsdWUmJih2LnZhbHVlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLnpJbmRleCl9KTtmdW5jdGlvbiB5KGUpe2UmJmwudmFsdWU9PT0hMCYmKF8oKSxnPy4oKSxsLnZhbHVlPSExKX1yZXR1cm4geChvLnRyaWdnZXJFbGVtZW50LCgpPT57XygpfSksTWkoe2NvbnRlbnRXcmFwcGVyOnUsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6YyxvblNjcm9sbEJ1dHRvbkNoYW5nZTp5fSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgY29udGVudFdyYXBwZXJFbGVtZW50YCxyZWY6dSxzdHlsZTppKHtkaXNwbGF5OmBmbGV4YCxmbGV4RGlyZWN0aW9uOmBjb2x1bW5gLHBvc2l0aW9uOmBmaXhlZGAsekluZGV4OnYudmFsdWV9KX0sW0woYihBKSxqKHtyZWY6YihkKSxzdHlsZTp7Ym94U2l6aW5nOmBib3JkZXItYm94YCxtYXhIZWlnaHQ6YDEwMCVgfX0sey4uLmUuJGF0dHJzLC4uLm59KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNildLDQpKX19KSxQaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RQcm92aWRlcmAscHJvcHM6e2NvbnRleHQ6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfX0sc2V0dXAoZSl7cmV0dXJuIENpKGUuY29udGV4dCksa2koRGkpLChlLHQpPT56KGUuJHNsb3RzLGBkZWZhdWx0YCl9fSksRmk9e2tleToxfSxJaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RDb250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cCh0LHtlbWl0Om59KXtsZXQgcj10LGk9YShyLG4pLG89U2koKSxzPUYoKTtNZSgoKT0+e3MudmFsdWU9bmV3IERvY3VtZW50RnJhZ21lbnR9KTtsZXQgYz1GKCksbD1NKCgpPT5yLmZvcmNlTW91bnR8fG8ub3Blbi52YWx1ZSksdT1GKGwudmFsdWUpLGQ7ZnVuY3Rpb24gZigpe2QmJj0oY2xlYXJUaW1lb3V0KGQpLHZvaWQgMCl9cmV0dXJuIFYobCwoZSx0LG4pPT57ZigpLGQ9c2V0VGltZW91dCgoKT0+e3UudmFsdWU9bC52YWx1ZSxkPXZvaWQgMH0pLG4oZil9KSx3ZShmKSwodCxuKT0+bC52YWx1ZXx8dS52YWx1ZXx8Yy52YWx1ZT8ucHJlc2VudD8oTigpLEkoYihxZSkse2tleTowLHJlZl9rZXk6YHByZXNlbmNlUmVmYCxyZWY6YyxwcmVzZW50OmwudmFsdWV9LHtkZWZhdWx0OkIoKCk9PltMKEFpLFplKHZlKHsuLi5iKGkpLC4uLnQuJGF0dHJzfSkpLHtkZWZhdWx0OkIoKCk9Plt6KHQuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2KV0pLF86M30sOCxbYHByZXNlbnRgXSkpOnMudmFsdWU/KE4oKSxQKGBkaXZgLEZpLFsoTigpLEkoZSx7dG86cy52YWx1ZX0sW0woUGkse2NvbnRleHQ6YihvKX0se2RlZmF1bHQ6QigoKT0+W3oodC4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGNvbnRleHRgXSldLDgsW2B0b2BdKSldKSk6emUoYHYtaWZgLCEwKX19KSxMaT1SKHtfX25hbWU6YFNlbGVjdEljb25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkseyJhcmlhLWhpZGRlbiI6YHRydWVgLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCx7fSwoKT0+W3RbMF18fD1nZShg4pa8YCldKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pLFtSaSx6aV09b2UoYFNlbGVjdEl0ZW1gKSxCaT1SKHtfX25hbWU6YFNlbGVjdEl0ZW1gLHByb3BzOnt2YWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSx0ZXh0VmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHNlbGVjdGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LHtkaXNhYmxlZDppfT1mKG4pLGE9U2koKSxvPU9pKCkse2ZvcndhcmRSZWY6cyxjdXJyZW50RWxlbWVudDpjfT1pZSgpLHtDb2xsZWN0aW9uSXRlbTpsfT1KZSgpLHU9TSgoKT0+dmkoYS5tb2RlbFZhbHVlPy52YWx1ZSxuLnZhbHVlLGEuYnkpKSxkPUYoITEpLHA9RihuLnRleHRWYWx1ZT8/YGApLGg9bmUodm9pZCAwLGByZWthLXNlbGVjdC1pdGVtLXRleHRgKTthc3luYyBmdW5jdGlvbiBnKGUpe2UuZGVmYXVsdFByZXZlbnRlZHx8JGUoYHNlbGVjdC5zZWxlY3RgLF8se29yaWdpbmFsRXZlbnQ6ZSx2YWx1ZTpuLnZhbHVlfSl9YXN5bmMgZnVuY3Rpb24gXyhlKXthd2FpdCB4ZSgpLHIoYHNlbGVjdGAsZSksIWUuZGVmYXVsdFByZXZlbnRlZCYmKGkudmFsdWV8fChhLm9uVmFsdWVDaGFuZ2Uobi52YWx1ZSksYS5tdWx0aXBsZS52YWx1ZXx8YS5vbk9wZW5DaGFuZ2UoITEpKSl9YXN5bmMgZnVuY3Rpb24gdihlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihpLnZhbHVlP28ub25JdGVtTGVhdmU/LigpOmUuY3VycmVudFRhcmdldD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9YXN5bmMgZnVuY3Rpb24geShlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJmUuY3VycmVudFRhcmdldD09PW0oKSYmby5vbkl0ZW1MZWF2ZT8uKCl9YXN5bmMgZnVuY3Rpb24geChlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihvLnNlYXJjaFJlZj8udmFsdWU9PT1gYHx8ZS5rZXkhPT1gIGApJiYoX2kuaW5jbHVkZXMoZS5rZXkpJiZnKGUpLGUua2V5PT09YCBgJiZlLnByZXZlbnREZWZhdWx0KCkpfWlmKG4udmFsdWU9PT1gYCl0aHJvdyBFcnJvcihgQSA8U2VsZWN0SXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuYCk7cmV0dXJuIE1lKCgpPT57Yy52YWx1ZSYmby5pdGVtUmVmQ2FsbGJhY2soYy52YWx1ZSxuLnZhbHVlLG4uZGlzYWJsZWQpfSksemkoe3ZhbHVlOm4udmFsdWUsZGlzYWJsZWQ6aSx0ZXh0SWQ6aCxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTplPT57cC52YWx1ZT0oKHAudmFsdWV8fGU/LnRleHRDb250ZW50KT8/YGApLnRyaW0oKX19KSwoZSx0KT0+KE4oKSxJKGIobCkse3ZhbHVlOnt0ZXh0VmFsdWU6cC52YWx1ZX19LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHMpLHJvbGU6YG9wdGlvbmAsImFyaWEtbGFiZWxsZWRieSI6YihoKSwiZGF0YS1oaWdobGlnaHRlZCI6ZC52YWx1ZT9gYDp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUudmFsdWUsImRhdGEtc3RhdGUiOnUudmFsdWU/YGNoZWNrZWRgOmB1bmNoZWNrZWRgLCJhcmlhLWRpc2FibGVkIjpiKGkpfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmIoaSk/YGA6dm9pZCAwLHRhYmluZGV4OmIoaSk/dm9pZCAwOi0xLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsb25Gb2N1czp0WzBdfHw9ZT0+ZC52YWx1ZT0hMCxvbkJsdXI6dFsxXXx8PWU9PmQudmFsdWU9ITEsb25Qb2ludGVydXA6ZyxvblBvaW50ZXJkb3duOnRbMl18fD1lPT57ZS5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LG9uVG91Y2hlbmQ6dFszXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgLGBzdG9wYF0pLG9uUG9pbnRlcm1vdmU6dixvblBvaW50ZXJsZWF2ZTp5LG9uS2V5ZG93bjp4fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXJpYS1sYWJlbGxlZGJ5YCxgZGF0YS1oaWdobGlnaHRlZGAsYGFyaWEtc2VsZWN0ZWRgLGBkYXRhLXN0YXRlYCxgYXJpYS1kaXNhYmxlZGAsYGRhdGEtZGlzYWJsZWRgLGB0YWJpbmRleGAsYGFzYCxgYXMtY2hpbGRgXSldKSxfOjN9LDgsW2B2YWx1ZWBdKSl9fSksVmk9Uih7X19uYW1lOmBTZWxlY3RJdGVtSW5kaWNhdG9yYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVJpKCk7cmV0dXJuKGUscik9PmIobikuaXNTZWxlY3RlZC52YWx1ZT8oTigpLEkoYihBKSxqKHtrZXk6MCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKTp6ZShgdi1pZmAsITApfX0pLEhpPVIoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YFNlbGVjdEl0ZW1UZXh0YCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVNpKCkscj1PaSgpLGk9UmkoKSx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT4oe3ZhbHVlOmkudmFsdWUsZGlzYWJsZWQ6aS5kaXNhYmxlZC52YWx1ZSx0ZXh0Q29udGVudDpvLnZhbHVlPy50ZXh0Q29udGVudD8/aS52YWx1ZT8udG9TdHJpbmcoKT8/YGB9KSk7cmV0dXJuIE1lKCgpPT57by52YWx1ZSYmKGkub25JdGVtVGV4dENoYW5nZShvLnZhbHVlKSxyLml0ZW1UZXh0UmVmQ2FsbGJhY2soby52YWx1ZSxpLnZhbHVlLGkuZGlzYWJsZWQudmFsdWUpLG4ub25PcHRpb25BZGQocy52YWx1ZSkpfSksd2UoKCk9PntuLm9uT3B0aW9uUmVtb3ZlKHMudmFsdWUpfSksKGUsbik9PihOKCksSShiKEEpLGooe2lkOmIoaSkudGV4dElkLHJlZjpiKGEpfSx7Li4udCwuLi5lLiRhdHRyc30pLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgaWRgXSkpfX0pLFVpPVIoe19fbmFtZTpgU2VsZWN0UG9ydGFsYCxwcm9wczp7dG86e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZGVmZXI6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoWnQpLFplKHZlKHQpKSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLFdpPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsQnV0dG9uSW1wbGAsZW1pdHM6W2BhdXRvU2Nyb2xsYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49dCx7Z2V0SXRlbXM6cn09SmUoKSxpPU9pKCksYT1GKG51bGwpO2Z1bmN0aW9uIG8oKXthLnZhbHVlIT09bnVsbCYmKHdpbmRvdy5jbGVhckludGVydmFsKGEudmFsdWUpLGEudmFsdWU9bnVsbCl9cmUoKCk9PntyKCkubWFwKGU9PmUucmVmKS5maW5kKGU9PmU9PT1tKCkpPy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6YG5lYXJlc3RgfSl9KTtmdW5jdGlvbiBzKCl7YS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1mdW5jdGlvbiBjKCl7aS5vbkl0ZW1MZWF2ZT8uKCksYS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1yZXR1cm4gSWUoKCk9Pm8oKSksKGUsdCk9PihOKCksSShiKEEpLGooeyJhcmlhLWhpZGRlbiI6YHRydWVgLHN0eWxlOntmbGV4U2hyaW5rOjB9fSxlLiRwYXJlbnQ/LiRwcm9wcyx7b25Qb2ludGVyZG93bjpzLG9uUG9pbnRlcm1vdmU6YyxvblBvaW50ZXJsZWF2ZTp0WzBdfHw9KCk9PntvKCl9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KSxHaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbERvd25CdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1PaSgpLG49dC5wb3NpdGlvbj09PWBpdGVtLWFsaWduZWRgP2ppKCk6dm9pZCAwLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPUYoITEpO3JldHVybiByZShlPT57aWYodC52aWV3cG9ydD8udmFsdWUmJnQuaXNQb3NpdGlvbmVkPy52YWx1ZSl7bGV0IG49dC52aWV3cG9ydC52YWx1ZTtmdW5jdGlvbiByKCl7bGV0IGU9bi5zY3JvbGxIZWlnaHQtbi5jbGllbnRIZWlnaHQ7YS52YWx1ZT1NYXRoLmNlaWwobi5zY3JvbGxUb3ApPGV9cigpLG4uYWRkRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSxlKCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHNjcm9sbGAscikpfX0pLFYoaSwoKT0+e2kudmFsdWUmJm4/Lm9uU2Nyb2xsQnV0dG9uQ2hhbmdlKGkudmFsdWUpfSksKGUsbik9PmEudmFsdWU/KE4oKSxJKFdpLHtrZXk6MCxyZWY6YihyKSxvbkF1dG9TY3JvbGw6blswXXx8PSgpPT57bGV0e3ZpZXdwb3J0OmUsc2VsZWN0ZWRJdGVtOm59PWIodCk7ZT8udmFsdWUmJm4/LnZhbHVlJiYoZS52YWx1ZS5zY3JvbGxUb3A9ZS52YWx1ZS5zY3JvbGxUb3Arbi52YWx1ZS5vZmZzZXRIZWlnaHQpfX0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sNTEyKSk6emUoYHYtaWZgLCEwKX19KSxLaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbFVwQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9T2koKSxuPXQucG9zaXRpb249PT1gaXRlbS1hbGlnbmVkYD9qaSgpOnZvaWQgMCx7Zm9yd2FyZFJlZjpyLGN1cnJlbnRFbGVtZW50Oml9PWllKCksYT1GKCExKTtyZXR1cm4gcmUoZT0+e2lmKHQudmlld3BvcnQ/LnZhbHVlJiZ0LmlzUG9zaXRpb25lZD8udmFsdWUpe2xldCBuPXQudmlld3BvcnQudmFsdWU7ZnVuY3Rpb24gcigpe2EudmFsdWU9bi5zY3JvbGxUb3A+MH1yKCksbi5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLHIpLGUoKCk9Pm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSl9fSksVihpLCgpPT57aS52YWx1ZSYmbj8ub25TY3JvbGxCdXR0b25DaGFuZ2UoaS52YWx1ZSl9KSwoZSxuKT0+YS52YWx1ZT8oTigpLEkoV2kse2tleTowLHJlZjpiKHIpLG9uQXV0b1Njcm9sbDpuWzBdfHw9KCk9PntsZXR7dmlld3BvcnQ6ZSxzZWxlY3RlZEl0ZW06bn09Yih0KTtlPy52YWx1ZSYmbj8udmFsdWUmJihlLnZhbHVlLnNjcm9sbFRvcD1lLnZhbHVlLnNjcm9sbFRvcC1uLnZhbHVlLm9mZnNldEhlaWdodCl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw1MTIpKTp6ZShgdi1pZmAsITApfX0pLHFpPVIoe19fbmFtZTpgU2VsZWN0VHJpZ2dlcmAscHJvcHM6e2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWUsbj1TaSgpLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPU0oKCk9Pm4uZGlzYWJsZWQ/LnZhbHVlfHx0LmRpc2FibGVkKTtuLmNvbnRlbnRJZHx8PW5lKHZvaWQgMCxgcmVrYS1zZWxlY3QtY29udGVudGApLE1lKCgpPT57bi5vblRyaWdnZXJDaGFuZ2UoaS52YWx1ZSl9KTtsZXR7Z2V0SXRlbXM6b309SmUoKSx7c2VhcmNoOnMsaGFuZGxlVHlwZWFoZWFkU2VhcmNoOmMscmVzZXRUeXBlYWhlYWQ6bH09d3QoKTtmdW5jdGlvbiB1KCl7YS52YWx1ZXx8KG4ub25PcGVuQ2hhbmdlKCEwKSxsKCkpfWZ1bmN0aW9uIGQoZSl7dSgpLG4udHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLnZhbHVlPXt4Ok1hdGgucm91bmQoZS5wYWdlWCkseTpNYXRoLnJvdW5kKGUucGFnZVkpfX1mdW5jdGlvbiBmKGUpe3JldHVybiBlLmJ1dHRvbj09PTAmJmUuY3RybEtleT09PSExfWxldCBwPSExO2Z1bmN0aW9uIG0oZSl7aWYoZS5wb2ludGVyVHlwZT09PWB0b3VjaGApcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtsZXQgdD1lLnRhcmdldDt0Lmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSYmdC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpLGYoZSkmJihkKGUpLHA9ITApfWZ1bmN0aW9uIGgoZSl7ZihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGcoZSl7cHx8ZS5jdXJyZW50VGFyZ2V0Py5mb2N1cygpLHA9ITF9cmV0dXJuKGUsdCk9PihOKCksSShiKG5uKSx7ImFzLWNoaWxkIjpgYCxyZWZlcmVuY2U6ZS5yZWZlcmVuY2V9LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHIpLHJvbGU6YGNvbWJvYm94YCx0eXBlOmUuYXM9PT1gYnV0dG9uYD9gYnV0dG9uYDp2b2lkIDAsImFyaWEtY29udHJvbHMiOmIobikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpiKG4pLm9wZW4udmFsdWV8fCExLCJhcmlhLXJlcXVpcmVkIjpiKG4pLnJlcXVpcmVkPy52YWx1ZSwiYXJpYS1hdXRvY29tcGxldGUiOmBub25lYCxkaXNhYmxlZDphLnZhbHVlLGRpcjpiKG4pPy5kaXIudmFsdWUsImRhdGEtc3RhdGUiOmIobik/Lm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjphLnZhbHVlP2BgOnZvaWQgMCwiZGF0YS1wbGFjZWhvbGRlciI6YihiaSkoYihuKS5tb2RlbFZhbHVlPy52YWx1ZSk/YGA6dm9pZCAwLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25DbGljazpnLG9uUG9pbnRlcmRvd246bSxvbk1vdXNlZG93bjpoLG9uUG9pbnRlcnVwOnRbMF18fD1mZShlPT57ZS5wb2ludGVyVHlwZT09PWB0b3VjaGAmJmQoZSl9LFtgcHJldmVudGBdKSxvbktleWRvd246dFsxXXx8PWU9PntsZXQgdD1iKHMpIT09YGA7IShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiZlLmtleS5sZW5ndGg9PT0xJiZ0JiZlLmtleT09PWAgYHx8KGIoYykoZS5rZXksYihvKSgpKSxiKGdpKS5pbmNsdWRlcyhlLmtleSkmJih1KCksZS5wcmV2ZW50RGVmYXVsdCgpKSl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFyaWEtY29udHJvbHNgLGBhcmlhLWV4cGFuZGVkYCxgYXJpYS1yZXF1aXJlZGAsYGRpc2FibGVkYCxgZGlyYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXBsYWNlaG9sZGVyYCxgYXMtY2hpbGRgLGBhc2BdKV0pLF86M30sOCxbYHJlZmVyZW5jZWBdKSl9fSksSmk9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPVNpKCk7TWUoKCk9PntpLnZhbHVlRWxlbWVudD1yfSk7bGV0IGE9TSgoKT0+e2xldCBlPVtdLHQ9QXJyYXkuZnJvbShpLm9wdGlvbnNTZXQudmFsdWUpLG49ZT0+dC5maW5kKHQ9PnZpKGUsdC52YWx1ZSxpLmJ5KSk7cmV0dXJuIGU9QXJyYXkuaXNBcnJheShpLm1vZGVsVmFsdWUudmFsdWUpP2kubW9kZWxWYWx1ZS52YWx1ZS5tYXAoZT0+bihlKT8udGV4dENvbnRlbnQ/P2BgKTpbbihpLm1vZGVsVmFsdWUudmFsdWUpPy50ZXh0Q29udGVudD8/YGBdLGUuZmlsdGVyKEJvb2xlYW4pfSksbz1NKCgpPT5hLnZhbHVlLmxlbmd0aD9hLnZhbHVlLmpvaW4oYCwgYCk6dC5wbGFjZWhvbGRlcik7cmV0dXJuKGUscik9PihOKCksSShiKEEpLHtyZWY6YihuKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLHN0eWxlOntwb2ludGVyRXZlbnRzOmBub25lYH0sImRhdGEtcGxhY2Vob2xkZXIiOmEudmFsdWUubGVuZ3RoP3ZvaWQgMDp0LnBsYWNlaG9sZGVyfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse3NlbGVjdGVkTGFiZWw6YS52YWx1ZSxtb2RlbFZhbHVlOmIoaSkubW9kZWxWYWx1ZS52YWx1ZX0sKCk9PltnZShjZShvLnZhbHVlKSwxKV0pXSksXzozfSw4LFtgYXNgLGBhcy1jaGlsZGAsYGRhdGEtcGxhY2Vob2xkZXJgXSkpfX0pLFlpPVIoe19fbmFtZTpgU2VsZWN0Vmlld3BvcnRgLHByb3BzOntub25jZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse25vbmNlOm59PWYodCkscj1oaShuKSxpPU9pKCksYT1pLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGA/amkoKTp2b2lkIDAse2ZvcndhcmRSZWY6byxjdXJyZW50RWxlbWVudDpzfT1pZSgpO01lKCgpPT57aT8ub25WaWV3cG9ydENoYW5nZShzLnZhbHVlKX0pO2xldCBjPUYoMCk7ZnVuY3Rpb24gbChlKXtsZXQgdD1lLmN1cnJlbnRUYXJnZXQse3Nob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOm4sY29udGVudFdyYXBwZXI6cn09YT8/e307aWYobj8udmFsdWUmJnI/LnZhbHVlKXtsZXQgZT1NYXRoLmFicyhjLnZhbHVlLXQuc2Nyb2xsVG9wKTtpZihlPjApe2xldCBuPXdpbmRvdy5pbm5lckhlaWdodC0yMCxpPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUubWluSGVpZ2h0KSxhPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUuaGVpZ2h0KSxvPU1hdGgubWF4KGksYSk7aWYobzxuKXtsZXQgaT1vK2UsYT1NYXRoLm1pbihuLGkpLHM9aS1hO3IudmFsdWUuc3R5bGUuaGVpZ2h0PWAke2F9cHhgLHIudmFsdWUuc3R5bGUuYm90dG9tPT09YDBweGAmJih0LnNjcm9sbFRvcD1zPjA/czowLHIudmFsdWUuc3R5bGUuanVzdGlmeUNvbnRlbnQ9YGZsZXgtZW5kYCl9fX1jLnZhbHVlPXQuc2Nyb2xsVG9wfXJldHVybihlLG4pPT4oTigpLFAoayxudWxsLFtMKGIoQSksaih7cmVmOmIobyksImRhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnQiOmBgLHJvbGU6YHByZXNlbnRhdGlvbmB9LHsuLi5lLiRhdHRycywuLi50fSx7c3R5bGU6e3Bvc2l0aW9uOmByZWxhdGl2ZWAsZmxleDoxLG92ZXJmbG93OmBoaWRkZW4gYXV0b2B9LG9uU2Nyb2xsOmx9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNiksTChiKEEpLHthczpgc3R5bGVgLG5vbmNlOmIocil9LHtkZWZhdWx0OkIoKCk9Pm5bMF18fD1bZ2UoYCAvKiBIaWRlIHNjcm9sbGJhcnMgY3Jvc3MtYnJvd3NlciBhbmQgZW5hYmxlIG1vbWVudHVtIHNjcm9sbCBmb3IgdG91Y2ggZGV2aWNlcyAqLyBbZGF0YS1yZWthLXNlbGVjdC12aWV3cG9ydF0geyBzY3JvbGxiYXItd2lkdGg6bm9uZTsgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7IH0gW2RhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmU7IH0gYCldKSxfOjEsX186WzBdfSw4LFtgbm9uY2VgXSldLDY0KSl9fSksWGk9Uih7X19uYW1lOmBTZWxlY3RgLHByb3BzOntvcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRPcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRWYWx1ZTp7fSxtb2RlbFZhbHVlOnt9LG51bGxhYmxlVmFsdWU6e30sYnk6e3R5cGU6W1N0cmluZyxGdW5jdGlvbl19LGRpcjp7fSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxhdXRvY29tcGxldGU6e30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sbmFtZTp7fSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWAsYHVwZGF0ZTpvcGVuYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49YShlLHQpO3JldHVybihlLHQpPT4oTigpLEkoYih3aSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdGB9LGIobikpLHtkZWZhdWx0OkIodD0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLFplKHZlKHQpKSldKSxfOjN9LDE2KSl9fSksWmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0Q29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb246e2RlZmF1bHQ6YGl0ZW0tYWxpZ25lZGB9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW59LG1lbW9EZXBlbmRlbmNpZXM6e30sc2lkZTp7fSxzaWRlT2Zmc2V0Ont9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW59LGFsaWduOntkZWZhdWx0OmBjZW50ZXJgfSxhbGlnbk9mZnNldDp7fSxhbGlnbkZsaXA6e3R5cGU6Qm9vbGVhbn0sYXZvaWRDb2xsaXNpb25zOnt0eXBlOkJvb2xlYW59LGNvbGxpc2lvbkJvdW5kYXJ5Ont9LGNvbGxpc2lvblBhZGRpbmc6e30sYXJyb3dQYWRkaW5nOnt9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbn0sc3RpY2t5Ont9LGhpZGVXaGVuRGV0YWNoZWQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25TdHJhdGVneTp7fSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW59LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFufSxyZWZlcmVuY2U6e30sZGlyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW59LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYGNsb3NlQXV0b0ZvY3VzYCxgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGk9ZWUobixgY2xhc3NgKSxvPWEoaSxyKTtyZXR1cm4odCxyKT0+KE4oKSxJKGIoVWkpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihJaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1jb250ZW50YCwiZGF0YS1hbGlnbi10cmlnZ2VyIjplLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGB9LHsuLi50LiRhdHRycywuLi5iKG8pfSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLW9wZW46YW5pbWF0ZS1pbiBkYXRhLWNsb3NlZDphbmltYXRlLW91dCBkYXRhLWNsb3NlZDpmYWRlLW91dC0wIGRhdGEtb3BlbjpmYWRlLWluLTAgZGF0YS1jbG9zZWQ6em9vbS1vdXQtOTUgZGF0YS1vcGVuOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgcmluZy1mb3JlZ3JvdW5kLzEwIG1pbi13LTM2IHJvdW5kZWQtbGcgc2hhZG93LW1kIHJpbmctMSBkdXJhdGlvbi0xMDAgZGF0YS1bc2lkZT1pbmxpbmUtc3RhcnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPWlubGluZS1lbmRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGNuLW1lbnUtdHJhbnNsdWNlbnQgcmVsYXRpdmUgei01MCBtYXgtaC0oLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQpIG9yaWdpbi0oLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byBkYXRhLVthbGlnbi10cmlnZ2VyPXRydWVdOmFuaW1hdGUtbm9uZWAsZS5wb3NpdGlvbj09PWBwb3BwZXJgJiZgZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMWAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bTChiKHRhKSksTChiKFlpKSx7ImRhdGEtcG9zaXRpb24iOmUucG9zaXRpb24sY2xhc3M6dGUoYihwKShgZGF0YS1bcG9zaXRpb249cG9wcGVyXTpoLSgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0KSBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOnctZnVsbCBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOm1pbi13LSgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpYCkpfSx7ZGVmYXVsdDpCKCgpPT5beih0LiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS1wb3NpdGlvbmAsYGNsYXNzYF0pLEwoYihlYSkpXSksXzozfSwxNixbYGRhdGEtYWxpZ24tdHJpZ2dlcmAsYGNsYXNzYF0pXSksXzozfSkpfX0pLFFpPXtjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSByaWdodC0yIGZsZXggc2l6ZS00IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcmB9LCRpPVIoe19fbmFtZTpgU2VsZWN0SXRlbWAscHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW59LHRleHRWYWx1ZTp7fSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihCaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1pdGVtYH0sYihyKSx7Y2xhc3M6YihwKShgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgbm90LWRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOmZvY3VzOioqOnRleHQtYWNjZW50LWZvcmVncm91bmQgZ2FwLTEuNSByb3VuZGVkLW1kIHB5LTEgcHItOCBwbC0xLjUgdGV4dC1zbSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00ICo6W3NwYW5dOmxhc3Q6ZmxleCAqOltzcGFuXTpsYXN0Oml0ZW1zLWNlbnRlciAqOltzcGFuXTpsYXN0OmdhcC0yIHJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bSGUoYHNwYW5gLFFpLFtMKGIoVmkpLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGluZGljYXRvci1pY29uYCx7fSwoKT0+W0woYih1ZSkse2ljb246Yih2KSxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTMuNWB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30pXSksTChiKEhpKSxudWxsLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9KV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksZWE9Uih7X19uYW1lOmBTZWxlY3RTY3JvbGxEb3duQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPWVlKHQsYGNsYXNzYCkscj1LZShuKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoR2kpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3Qtc2Nyb2xsLWRvd24tYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoTGUpLGNsYXNzOmBzaXplLTRgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLHRhPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsVXBCdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihLaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoXyksY2xhc3M6YHNpemUtNGB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksbmE9Uih7X19uYW1lOmBTZWxlY3RUcmlnZ2VyYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0scmVmZXJlbmNlOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sc2l6ZTp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgLGBzaXplYCkscj1LZShuKTtyZXR1cm4obixpKT0+KE4oKSxJKGIocWkpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3QtdHJpZ2dlcmAsImRhdGEtc2l6ZSI6ZS5zaXplfSxiKHIpLHtjbGFzczpiKHApKGBib3JkZXItaW5wdXQgZGF0YS1wbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZS81MCBnYXAtMS41IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB5LTIgcHItMiBwbC0yLjUgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycyBzZWxlY3Qtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGRhdGEtW3NpemU9ZGVmYXVsdF06aC04IGRhdGEtW3NpemU9c21dOmgtNyBkYXRhLVtzaXplPXNtXTpyb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMHB4KV0gKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06Z2FwLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00IGZsZXggdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB3aGl0ZXNwYWNlLW5vd3JhcCBvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06bGluZS1jbGFtcC0xICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmZsZXggKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06aXRlbXMtY2VudGVyIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx0LmNsYXNzKX0pLHtkZWZhdWx0OkIoKCk9Plt6KG4uJHNsb3RzLGBkZWZhdWx0YCksTChiKExpKSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0woYih1ZSkse2ljb246YihMZSksY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBzaXplLTQgcG9pbnRlci1ldmVudHMtbm9uZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9KV0pLF86M30sMTYsW2BkYXRhLXNpemVgLGBjbGFzc2BdKSl9fSkscmE9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e319LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihOKCksSShiKEppKSxqKHsiZGF0YS1zbG90Ijpgc2VsZWN0LXZhbHVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KTtmdW5jdGlvbiBpYShlKXtyZXR1cm4gZSsuNXwwfXZhciBhYT0oZSx0LG4pPT5NYXRoLm1heChNYXRoLm1pbihlLG4pLHQpO2Z1bmN0aW9uIG9hKGUpe3JldHVybiBhYShpYShlKjIuNTUpLDAsMjU1KX1mdW5jdGlvbiBzYShlKXtyZXR1cm4gYWEoaWEoZSoyNTUpLDAsMjU1KX1mdW5jdGlvbiBjYShlKXtyZXR1cm4gYWEoaWEoZS8yLjU1KS8xMDAsMCwxKX1mdW5jdGlvbiBsYShlKXtyZXR1cm4gYWEoaWEoZSoxMDApLDAsMTAwKX12YXIgdWE9ezA6MCwxOjEsMjoyLDM6Myw0OjQsNTo1LDY6Niw3OjcsODo4LDk6OSxBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNSxhOjEwLGI6MTEsYzoxMixkOjEzLGU6MTQsZjoxNX0sZGE9Wy4uLmAwMTIzNDU2Nzg5QUJDREVGYF0sZmE9ZT0+ZGFbZSYxNV0scGE9ZT0+ZGFbKGUmMjQwKT4+NF0rZGFbZSYxNV0sbWE9ZT0+KGUmMjQwKT4+ND09KGUmMTUpLGhhPWU9Pm1hKGUucikmJm1hKGUuZykmJm1hKGUuYikmJm1hKGUuYSk7ZnVuY3Rpb24gZ2EoZSl7dmFyIHQ9ZS5sZW5ndGgsbjtyZXR1cm4gZVswXT09PWAjYCYmKHQ9PT00fHx0PT09NT9uPXtyOjI1NSZ1YVtlWzFdXSoxNyxnOjI1NSZ1YVtlWzJdXSoxNyxiOjI1NSZ1YVtlWzNdXSoxNyxhOnQ9PT01P3VhW2VbNF1dKjE3OjI1NX06KHQ9PT03fHx0PT09OSkmJihuPXtyOnVhW2VbMV1dPDw0fHVhW2VbMl1dLGc6dWFbZVszXV08PDR8dWFbZVs0XV0sYjp1YVtlWzVdXTw8NHx1YVtlWzZdXSxhOnQ9PT05P3VhW2VbN11dPDw0fHVhW2VbOF1dOjI1NX0pKSxufXZhciBfYT0oZSx0KT0+ZTwyNTU/dChlKTpgYDtmdW5jdGlvbiB2YShlKXt2YXIgdD1oYShlKT9mYTpwYTtyZXR1cm4gZT9gI2ArdChlLnIpK3QoZS5nKSt0KGUuYikrX2EoZS5hLHQpOnZvaWQgMH12YXIgeWE9L14oaHNsYT98aHdifGhzdilcKFxzKihbLSsuZVxkXSspKD86ZGVnKT9bXHMsXSsoWy0rLmVcZF0rKSVbXHMsXSsoWy0rLmVcZF0rKSUoPzpbXHMsXSsoWy0rLmVcZF0rKSglKT8pP1xzKlwpJC87ZnVuY3Rpb24gYmEoZSx0LG4pe2xldCByPXQqTWF0aC5taW4obiwxLW4pLGk9KHQsaT0odCtlLzMwKSUxMik9Pm4tcipNYXRoLm1heChNYXRoLm1pbihpLTMsOS1pLDEpLC0xKTtyZXR1cm5baSgwKSxpKDgpLGkoNCldfWZ1bmN0aW9uIHhhKGUsdCxuKXtsZXQgcj0ocixpPShyK2UvNjApJTYpPT5uLW4qdCpNYXRoLm1heChNYXRoLm1pbihpLDQtaSwxKSwwKTtyZXR1cm5bcig1KSxyKDMpLHIoMSldfWZ1bmN0aW9uIFNhKGUsdCxuKXtsZXQgcj1iYShlLDEsLjUpLGk7Zm9yKHQrbj4xJiYoaT0xLyh0K24pLHQqPWksbio9aSksaT0wO2k8MztpKyspcltpXSo9MS10LW4scltpXSs9dDtyZXR1cm4gcn1mdW5jdGlvbiBDYShlLHQsbixyLGkpe3JldHVybiBlPT09aT8odC1uKS9yKyh0PG4/NjowKTp0PT09aT8obi1lKS9yKzI6KGUtdCkvcis0fWZ1bmN0aW9uIHdhKGUpe2xldCB0PWUuci8yNTUsbj1lLmcvMjU1LHI9ZS5iLzI1NSxpPU1hdGgubWF4KHQsbixyKSxhPU1hdGgubWluKHQsbixyKSxvPShpK2EpLzIscyxjLGw7cmV0dXJuIGkhPT1hJiYobD1pLWEsYz1vPi41P2wvKDItaS1hKTpsLyhpK2EpLHM9Q2EodCxuLHIsbCxpKSxzPXMqNjArLjUpLFtzfDAsY3x8MCxvXX1mdW5jdGlvbiBUYShlLHQsbixyKXtyZXR1cm4oQXJyYXkuaXNBcnJheSh0KT9lKHRbMF0sdFsxXSx0WzJdKTplKHQsbixyKSkubWFwKHNhKX1mdW5jdGlvbiBFYShlLHQsbil7cmV0dXJuIFRhKGJhLGUsdCxuKX1mdW5jdGlvbiBEYShlLHQsbil7cmV0dXJuIFRhKFNhLGUsdCxuKX1mdW5jdGlvbiBPYShlLHQsbil7cmV0dXJuIFRhKHhhLGUsdCxuKX1mdW5jdGlvbiBrYShlKXtyZXR1cm4oZSUzNjArMzYwKSUzNjB9ZnVuY3Rpb24gQWEoZSl7bGV0IHQ9eWEuZXhlYyhlKSxuPTI1NSxyO2lmKCF0KXJldHVybjt0WzVdIT09ciYmKG49dFs2XT9vYSgrdFs1XSk6c2EoK3RbNV0pKTtsZXQgaT1rYSgrdFsyXSksYT10WzNdLzEwMCxvPXRbNF0vMTAwO3JldHVybiByPXRbMV09PT1gaHdiYD9EYShpLGEsbyk6dFsxXT09PWBoc3ZgP09hKGksYSxvKTpFYShpLGEsbykse3I6clswXSxnOnJbMV0sYjpyWzJdLGE6bn19ZnVuY3Rpb24gamEoZSx0KXt2YXIgbj13YShlKTtuWzBdPWthKG5bMF0rdCksbj1FYShuKSxlLnI9blswXSxlLmc9blsxXSxlLmI9blsyXX1mdW5jdGlvbiBNYShlKXtpZighZSlyZXR1cm47bGV0IHQ9d2EoZSksbj10WzBdLHI9bGEodFsxXSksaT1sYSh0WzJdKTtyZXR1cm4gZS5hPDI1NT9gaHNsYSgke259LCAke3J9JSwgJHtpfSUsICR7Y2EoZS5hKX0pYDpgaHNsKCR7bn0sICR7cn0lLCAke2l9JSlgfXZhciBOYT17eDpgZGFya2AsWjpgbGlnaHRgLFk6YHJlYCxYOmBibHVgLFc6YGdyYCxWOmBtZWRpdW1gLFU6YHNsYXRlYCxBOmBlZWAsVDpgb2xgLFM6YG9yYCxCOmByYWAsQzpgbGF0ZWdgLEQ6YGlnaHRzYCxSOmBpbmAsUTpgdHVycXVvaXNgLEU6YGhpYCxQOmByb2AsTzpgYWxgLE46YGxlYCxNOmBkZWAsTDpgeWVsbG9gLEY6YGVuYCxLOmBjaGAsRzpgYXJrc2AsSDpgZWFgLEk6YGlnaHRnYCxKOmB3aGB9LFBhPXtPaWNlWGU6YGYwZjhmZmAsYW50aXF1ZXdFdGU6YGZhZWJkN2AsYXF1YTpgZmZmZmAsYXF1YW1hclJlOmA3ZmZmZDRgLGF6dVk6YGYwZmZmZmAsYmVpZ2U6YGY1ZjVkY2AsYmlzcXVlOmBmZmU0YzRgLGJsYWNrOmAwYCxibGFuS2VkT21vbmQ6YGZmZWJjZGAsWGU6YGZmYCxYZXZpVGV0OmA4YTJiZTJgLGJQd246YGE1MmEyYWAsYnVybHl3b29kOmBkZWI4ODdgLGNhTXRYZTpgNWY5ZWEwYCxLYXJ0WXVzZTpgN2ZmZjAwYCxLb2NUYXRlOmBkMjY5MWVgLGNTTzpgZmY3ZjUwYCxjU25mbG93ZXJYZTpgNjQ5NWVkYCxjU25zaWxrOmBmZmY4ZGNgLGNyaW1zb246YGRjMTQzY2AsY3lhbjpgZmZmZmAseFhlOmA4YmAseGN5YW46YDhiOGJgLHhnVE1uUGQ6YGI4ODYwYmAseFdheTpgYTlhOWE5YCx4Z1lGOmA2NDAwYCx4Z1l5OmBhOWE5YTlgLHhraGFraTpgYmRiNzZiYCx4bWFnRnRhOmA4YjAwOGJgLHhUaXZlZ1lGOmA1NTZiMmZgLHhTYW5nZTpgZmY4YzAwYCx4U2NFZDpgOTkzMmNjYCx4WWQ6YDhiMDAwMGAseHNPbW9uOmBlOTk2N2FgLHhzSGdZRjpgOGZiYzhmYCx4VVhlOmA0ODNkOGJgLHhVV2F5OmAyZjRmNGZgLHhVZ1l5OmAyZjRmNGZgLHhRZTpgY2VkMWAseHZpVGV0OmA5NDAwZDNgLGRBcHBSazpgZmYxNDkzYCxkQXBza3lYZTpgYmZmZmAsZGltV2F5OmA2OTY5NjlgLGRpbWdZeTpgNjk2OTY5YCxkb2RnZXJYZTpgMWU5MGZmYCxmaVlicmljazpgYjIyMjIyYCxmbFNPd0V0ZTpgZmZmYWYwYCxmb1lzdFdBbjpgMjI4YjIyYCxmdUtzaWE6YGZmMDBmZmAsZ2FSc2JTbzpgZGNkY2RjYCxnaG9zdHdFdGU6YGY4ZjhmZmAsZ1RkOmBmZmQ3MDBgLGdUTW5QZDpgZGFhNTIwYCxXYXk6YDgwODA4MGAsZ1lGOmA4MDAwYCxnWUZMdzpgYWRmZjJmYCxnWXk6YDgwODA4MGAsaG9uZXlNdzpgZjBmZmYwYCxob3RwUms6YGZmNjliNGAsUmRpYW5ZZDpgY2Q1YzVjYCxSZGlnbzpgNGIwMDgyYCxpdlN5OmBmZmZmZjBgLGtoYWtpOmBmMGU2OGNgLGxhdkZNcjpgZTZlNmZhYCxsYXZGTXJYc2g6YGZmZjBmNWAsbGF3bmdZRjpgN2NmYzAwYCxObW9uY0VmZm9uOmBmZmZhY2RgLFpYZTpgYWRkOGU2YCxaY1NPOmBmMDgwODBgLFpjeWFuOmBlMGZmZmZgLFpnVE1uUGRMdzpgZmFmYWQyYCxaV2F5OmBkM2QzZDNgLFpnWUY6YDkwZWU5MGAsWmdZeTpgZDNkM2QzYCxacFJrOmBmZmI2YzFgLFpzT21vbjpgZmZhMDdhYCxac0hnWUY6YDIwYjJhYWAsWnNreVhlOmA4N2NlZmFgLFpVV2F5OmA3Nzg4OTlgLFpVZ1l5OmA3Nzg4OTlgLFpzdEFsWGU6YGIwYzRkZWAsWkx3OmBmZmZmZTBgLGxpbWU6YGZmMDBgLGxpbWVnWUY6YDMyY2QzMmAsbFJGOmBmYWYwZTZgLG1hZ0Z0YTpgZmYwMGZmYCxtYVBvbjpgODAwMDAwYCxWYXF1YW1hclJlOmA2NmNkYWFgLFZYZTpgY2RgLFZTY0VkOmBiYTU1ZDNgLFZwdXJwTjpgOTM3MGRiYCxWc0hnWUY6YDNjYjM3MWAsVlVYZTpgN2I2OGVlYCxWc3ByUmdnWUY6YGZhOWFgLFZRZTpgNDhkMWNjYCxWdmlUZXRZZDpgYzcxNTg1YCxtaWRuaWdodFhlOmAxOTE5NzBgLG1SdGNZYW06YGY1ZmZmYWAsbWlzdHlQc2U6YGZmZTRlMWAsbW9jY2FzUjpgZmZlNGI1YCxuYXZham93RXRlOmBmZmRlYWRgLG5hdnk6YDgwYCxUZGxhY2U6YGZkZjVlNmAsVGl2ZTpgODA4MDAwYCxUaXZlZEJiOmA2YjhlMjNgLFNhbmdlOmBmZmE1MDBgLFNhbmdlWWQ6YGZmNDUwMGAsU2NFZDpgZGE3MGQ2YCxwT2VnVE1uUGQ6YGVlZThhYWAscE9lZ1lGOmA5OGZiOThgLHBPZVFlOmBhZmVlZWVgLHBPZXZpVGV0WWQ6YGRiNzA5M2AscGFwYXlhd0VwOmBmZmVmZDVgLHBIS3B1ZmY6YGZmZGFiOWAscGVydTpgY2Q4NTNmYCxwUms6YGZmYzBjYmAscGx1bTpgZGRhMGRkYCxwb3dNclhlOmBiMGUwZTZgLHB1cnBOOmA4MDAwODBgLFliZWNjYXB1cnBOOmA2NjMzOTlgLFlkOmBmZjAwMDBgLFBzeWJyb3duOmBiYzhmOGZgLFB5T1hlOmA0MTY5ZTFgLHNhZGROYlB3bjpgOGI0NTEzYCxzT21vbjpgZmE4MDcyYCxzYW5keWJQd246YGY0YTQ2MGAsc0hnWUY6YDJlOGI1N2Asc0hzaGVsbDpgZmZmNWVlYCxzaUZuYTpgYTA1MjJkYCxzaWx2ZXI6YGMwYzBjMGAsc2t5WGU6YDg3Y2VlYmAsVVhlOmA2YTVhY2RgLFVXYXk6YDcwODA5MGAsVWdZeTpgNzA4MDkwYCxzbm93OmBmZmZhZmFgLHNwclJnZ1lGOmBmZjdmYCxzdEFsWGU6YDQ2ODJiNGAsdGFuOmBkMmI0OGNgLHRlTzpgODA4MGAsdEVzdE46YGQ4YmZkOGAsdG9tYXRvOmBmZjYzNDdgLFFlOmA0MGUwZDBgLHZpVGV0OmBlZTgyZWVgLEpIdDpgZjVkZWIzYCx3RXRlOmBmZmZmZmZgLHdFdGVzbW9rZTpgZjVmNWY1YCxMdzpgZmZmZjAwYCxMd2dZRjpgOWFjZDMyYH07ZnVuY3Rpb24gRmEoKXtsZXQgZT17fSx0PU9iamVjdC5rZXlzKFBhKSxuPU9iamVjdC5rZXlzKE5hKSxyLGksYSxvLHM7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7Zm9yKG89cz10W3JdLGk9MDtpPG4ubGVuZ3RoO2krKylhPW5baV0scz1zLnJlcGxhY2UoYSxOYVthXSk7YT1wYXJzZUludChQYVtvXSwxNiksZVtzXT1bYT4+MTYmMjU1LGE+PjgmMjU1LGEmMjU1XX1yZXR1cm4gZX12YXIgSWE7ZnVuY3Rpb24gTGEoZSl7SWF8fChJYT1GYSgpLElhLnRyYW5zcGFyZW50PVswLDAsMCwwXSk7bGV0IHQ9SWFbZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdCYme3I6dFswXSxnOnRbMV0sYjp0WzJdLGE6dC5sZW5ndGg9PT00P3RbM106MjU1fX12YXIgUmE9L15yZ2JhP1woXHMqKFstKy5cZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT8oPzpbXHMsL10rKFstKy5lXGRdKykoJSk/KT9ccypcKSQvO2Z1bmN0aW9uIHphKGUpe2xldCB0PVJhLmV4ZWMoZSksbj0yNTUscixpLGE7aWYodCl7aWYodFs3XSE9PXIpe2xldCBlPSt0WzddO249dFs4XT9vYShlKTphYShlKjI1NSwwLDI1NSl9cmV0dXJuIHI9K3RbMV0saT0rdFszXSxhPSt0WzVdLHI9MjU1Jih0WzJdP29hKHIpOmFhKHIsMCwyNTUpKSxpPTI1NSYodFs0XT9vYShpKTphYShpLDAsMjU1KSksYT0yNTUmKHRbNl0/b2EoYSk6YWEoYSwwLDI1NSkpLHtyLGc6aSxiOmEsYTpufX19ZnVuY3Rpb24gQmEoZSl7cmV0dXJuIGUmJihlLmE8MjU1P2ByZ2JhKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0sICR7Y2EoZS5hKX0pYDpgcmdiKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0pYCl9dmFyIFZhPWU9PmU8PS4wMDMxMzA4P2UqMTIuOTI6ZSoqKDEvMi40KSoxLjA1NS0uMDU1LEhhPWU9PmU8PS4wNDA0NT9lLzEyLjkyOigoZSsuMDU1KS8xLjA1NSkqKjIuNDtmdW5jdGlvbiBVYShlLHQsbil7bGV0IHI9SGEoY2EoZS5yKSksaT1IYShjYShlLmcpKSxhPUhhKGNhKGUuYikpO3JldHVybntyOnNhKFZhKHIrbiooSGEoY2EodC5yKSktcikpKSxnOnNhKFZhKGkrbiooSGEoY2EodC5nKSktaSkpKSxiOnNhKFZhKGErbiooSGEoY2EodC5iKSktYSkpKSxhOmUuYStuKih0LmEtZS5hKX19ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUpe2xldCByPXdhKGUpO3JbdF09TWF0aC5tYXgoMCxNYXRoLm1pbihyW3RdK3JbdF0qbix0PT09MD8zNjA6MSkpLHI9RWEociksZS5yPXJbMF0sZS5nPXJbMV0sZS5iPXJbMl19fWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIGUmJk9iamVjdC5hc3NpZ24odHx8e30sZSl9ZnVuY3Rpb24gS2EoZSl7dmFyIHQ9e3I6MCxnOjAsYjowLGE6MjU1fTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aD49MyYmKHQ9e3I6ZVswXSxnOmVbMV0sYjplWzJdLGE6MjU1fSxlLmxlbmd0aD4zJiYodC5hPXNhKGVbM10pKSk6KHQ9R2EoZSx7cjowLGc6MCxiOjAsYToxfSksdC5hPXNhKHQuYSkpLHR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGUuY2hhckF0KDApPT09YHJgP3phKGUpOkFhKGUpfXZhciBKYT1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiB0O2xldCBuPXR5cGVvZiB0LHI7bj09PWBvYmplY3RgP3I9S2EodCk6bj09PWBzdHJpbmdgJiYocj1nYSh0KXx8TGEodCl8fHFhKHQpKSx0aGlzLl9yZ2I9cix0aGlzLl92YWxpZD0hIXJ9Z2V0IHZhbGlkKCl7cmV0dXJuIHRoaXMuX3ZhbGlkfWdldCByZ2IoKXt2YXIgZT1HYSh0aGlzLl9yZ2IpO3JldHVybiBlJiYoZS5hPWNhKGUuYSkpLGV9c2V0IHJnYihlKXt0aGlzLl9yZ2I9S2EoZSl9cmdiU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkP0JhKHRoaXMuX3JnYik6dm9pZCAwfWhleFN0cmluZygpe3JldHVybiB0aGlzLl92YWxpZD92YSh0aGlzLl9yZ2IpOnZvaWQgMH1oc2xTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdmFsaWQ/TWEodGhpcy5fcmdiKTp2b2lkIDB9bWl4KGUsdCl7aWYoZSl7bGV0IG49dGhpcy5yZ2Iscj1lLnJnYixpLGE9dD09PWk/LjU6dCxvPTIqYS0xLHM9bi5hLXIuYSxjPSgobypzPT09LTE/bzoobytzKS8oMStvKnMpKSsxKS8yO2k9MS1jLG4ucj0yNTUmYypuLnIraSpyLnIrLjUsbi5nPTI1NSZjKm4uZytpKnIuZysuNSxuLmI9MjU1JmMqbi5iK2kqci5iKy41LG4uYT1hKm4uYSsoMS1hKSpyLmEsdGhpcy5yZ2I9bn1yZXR1cm4gdGhpc31pbnRlcnBvbGF0ZShlLHQpe3JldHVybiBlJiYodGhpcy5fcmdiPVVhKHRoaXMuX3JnYixlLl9yZ2IsdCkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IGUodGhpcy5yZ2IpfWFscGhhKGUpe3JldHVybiB0aGlzLl9yZ2IuYT1zYShlKSx0aGlzfWNsZWFyZXIoZSl7bGV0IHQ9dGhpcy5fcmdiO3JldHVybiB0LmEqPTEtZSx0aGlzfWdyZXlzY2FsZSgpe2xldCBlPXRoaXMuX3JnYjtyZXR1cm4gZS5yPWUuZz1lLmI9aWEoZS5yKi4zK2UuZyouNTkrZS5iKi4xMSksdGhpc31vcGFxdWVyKGUpe2xldCB0PXRoaXMuX3JnYjtyZXR1cm4gdC5hKj0xK2UsdGhpc31uZWdhdGUoKXtsZXQgZT10aGlzLl9yZ2I7cmV0dXJuIGUucj0yNTUtZS5yLGUuZz0yNTUtZS5nLGUuYj0yNTUtZS5iLHRoaXN9bGlnaHRlbihlKXtyZXR1cm4gV2EodGhpcy5fcmdiLDIsZSksdGhpc31kYXJrZW4oZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwyLC1lKSx0aGlzfXNhdHVyYXRlKGUpe3JldHVybiBXYSh0aGlzLl9yZ2IsMSxlKSx0aGlzfWRlc2F0dXJhdGUoZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwxLC1lKSx0aGlzfXJvdGF0ZShlKXtyZXR1cm4gamEodGhpcy5fcmdiLGUpLHRoaXN9fTtmdW5jdGlvbiBZYSgpe312YXIgWGE9KCgpPT57bGV0IGU9MDtyZXR1cm4oKT0+ZSsrfSkoKTtmdW5jdGlvbiBVKGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIFcoZSl7aWYoQXJyYXkuaXNBcnJheSYmQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoMCw3KT09PWBbb2JqZWN0YCYmdC5zbGljZSgtNik9PT1gQXJyYXldYH1mdW5jdGlvbiBHKGUpe3JldHVybiBlIT09bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWB9ZnVuY3Rpb24gSyhlKXtyZXR1cm4odHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmaXNGaW5pdGUoK2UpfWZ1bmN0aW9uIFphKGUsdCl7cmV0dXJuIEsoZSk/ZTp0fWZ1bmN0aW9uIHEoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD90OmV9dmFyIFFhPShlLHQpPT50eXBlb2YgZT09YHN0cmluZ2AmJmUuZW5kc1dpdGgoYCVgKT9wYXJzZUZsb2F0KGUpLzEwMCp0OitlO2Z1bmN0aW9uIEooZSx0LG4pe2lmKGUmJnR5cGVvZiBlLmNhbGw9PWBmdW5jdGlvbmApcmV0dXJuIGUuYXBwbHkobix0KX1mdW5jdGlvbiBZKGUsdCxuLHIpe2xldCBpLGEsbztpZihXKGUpKXtpZihhPWUubGVuZ3RoLHIpZm9yKGk9YS0xO2k+PTA7aS0tKXQuY2FsbChuLGVbaV0saSk7ZWxzZSBmb3IoaT0wO2k8YTtpKyspdC5jYWxsKG4sZVtpXSxpKX1lbHNlIGlmKEcoZSkpZm9yKG89T2JqZWN0LmtleXMoZSksYT1vLmxlbmd0aCxpPTA7aTxhO2krKyl0LmNhbGwobixlW29baV1dLG9baV0pfWZ1bmN0aW9uICRhKGUsdCl7bGV0IG4scixpLGE7aWYoIWV8fCF0fHxlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKWlmKGk9ZVtuXSxhPXRbbl0saS5kYXRhc2V0SW5kZXghPT1hLmRhdGFzZXRJbmRleHx8aS5pbmRleCE9PWEuaW5kZXgpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZW8oZSl7aWYoVyhlKSlyZXR1cm4gZS5tYXAoZW8pO2lmKEcoZSkpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1PYmplY3Qua2V5cyhlKSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdFtuW2ldXT1lbyhlW25baV1dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiB0byhlKXtyZXR1cm5bYF9fcHJvdG9fX2AsYHByb3RvdHlwZWAsYGNvbnN0cnVjdG9yYF0uaW5kZXhPZihlKT09PS0xfWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKCF0byhlKSlyZXR1cm47bGV0IGk9dFtlXSxhPW5bZV07RyhpKSYmRyhhKT9ybyhpLGEscik6dFtlXT1lbyhhKX1mdW5jdGlvbiBybyhlLHQsbil7bGV0IHI9Vyh0KT90Olt0XSxpPXIubGVuZ3RoO2lmKCFHKGUpKXJldHVybiBlO258fD17fTtsZXQgYT1uLm1lcmdlcnx8bm8sbztmb3IobGV0IHQ9MDt0PGk7Kyt0KXtpZihvPXJbdF0sIUcobykpY29udGludWU7bGV0IGk9T2JqZWN0LmtleXMobyk7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7Kyt0KWEoaVt0XSxlLG8sbil9cmV0dXJuIGV9ZnVuY3Rpb24gaW8oZSx0KXtyZXR1cm4gcm8oZSx0LHttZXJnZXI6YW99KX1mdW5jdGlvbiBhbyhlLHQsbil7aWYoIXRvKGUpKXJldHVybjtsZXQgcj10W2VdLGk9bltlXTtHKHIpJiZHKGkpP2lvKHIsaSk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl8fCh0W2VdPWVvKGkpKX12YXIgb289eyIiOmU9PmUseDplPT5lLngseTplPT5lLnl9O2Z1bmN0aW9uIHNvKGUpe2xldCB0PWUuc3BsaXQoYC5gKSxuPVtdLHI9YGA7Zm9yKGxldCBlIG9mIHQpcis9ZSxyLmVuZHNXaXRoKGBcXGApP3I9ci5zbGljZSgwLC0xKStgLmA6KG4ucHVzaChyKSxyPWBgKTtyZXR1cm4gbn1mdW5jdGlvbiBjbyhlKXtsZXQgdD1zbyhlKTtyZXR1cm4gZT0+e2ZvcihsZXQgbiBvZiB0KXtpZihuPT09YGApYnJlYWs7ZSYmPWVbbl19cmV0dXJuIGV9fWZ1bmN0aW9uIGxvKGUsdCl7cmV0dXJuKG9vW3RdfHwob29bdF09Y28odCkpKShlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfXZhciBmbz1lPT5lIT09dm9pZCAwLHBvPWU9PnR5cGVvZiBlPT1gZnVuY3Rpb25gLG1vPShlLHQpPT57aWYoZS5zaXplIT09dC5zaXplKXJldHVybiExO2ZvcihsZXQgbiBvZiBlKWlmKCF0LmhhcyhuKSlyZXR1cm4hMTtyZXR1cm4hMH07ZnVuY3Rpb24gaG8oZSl7cmV0dXJuIGUudHlwZT09PWBtb3VzZXVwYHx8ZS50eXBlPT09YGNsaWNrYHx8ZS50eXBlPT09YGNvbnRleHRtZW51YH12YXIgWD1NYXRoLlBJLGdvPTIqWDtnbytYO3ZhciBfbz0xLzAsdm89WC8xODAseW89WC8yLGJvPVgvNCx4bz1YKjIvMyxTbz1NYXRoLmxvZzEwLENvPU1hdGguc2lnbjtmdW5jdGlvbiB3byhlLHQsbil7cmV0dXJuIE1hdGguYWJzKGUtdCk8bn1mdW5jdGlvbiBUbyhlKXtsZXQgdD1NYXRoLnJvdW5kKGUpO2U9d28oZSx0LGUvMWUzKT90OmU7bGV0IG49MTAqKk1hdGguZmxvb3IoU28oZSkpLHI9ZS9uO3JldHVybihyPD0xPzE6cjw9Mj8yOnI8PTU/NToxMCkqbn1mdW5jdGlvbiBFbyhlKXtsZXQgdD1bXSxuPU1hdGguc3FydChlKSxyO2ZvcihyPTE7cjxuO3IrKyllJXI9PT0wJiYodC5wdXNoKHIpLHQucHVzaChlL3IpKTtyZXR1cm4gbj09PShufDApJiZ0LnB1c2gobiksdC5zb3J0KChlLHQpPT5lLXQpLnBvcCgpLHR9ZnVuY3Rpb24gRG8oZSl7cmV0dXJuIHR5cGVvZiBlPT1gc3ltYm9sYHx8dHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJiEoU3ltYm9sLnRvUHJpbWl0aXZlIGluIGV8fGB0b1N0cmluZ2BpbiBlfHxgdmFsdWVPZmBpbiBlKX1mdW5jdGlvbiBPbyhlKXtyZXR1cm4hRG8oZSkmJiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24ga28oZSx0KXtsZXQgbj1NYXRoLnJvdW5kKGUpO3JldHVybiBuLXQ8PWUmJm4rdD49ZX1mdW5jdGlvbiBBbyhlLHQsbil7bGV0IHIsaSxhO2ZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKWE9ZVtyXVtuXSxpc05hTihhKXx8KHQubWluPU1hdGgubWluKHQubWluLGEpLHQubWF4PU1hdGgubWF4KHQubWF4LGEpKX1mdW5jdGlvbiBqbyhlKXtyZXR1cm4gWC8xODAqZX1mdW5jdGlvbiBNbyhlKXtyZXR1cm4gMTgwL1gqZX1mdW5jdGlvbiBObyhlKXtpZighSyhlKSlyZXR1cm47bGV0IHQ9MSxuPTA7Zm9yKDtNYXRoLnJvdW5kKGUqdCkvdCE9PWU7KXQqPTEwLG4rKztyZXR1cm4gbn1mdW5jdGlvbiBQbyhlLHQpe2xldCBuPXQueC1lLngscj10LnktZS55LGk9TWF0aC5zcXJ0KG4qbityKnIpLGE9TWF0aC5hdGFuMihyLG4pO3JldHVybiBhPC0uNSpYJiYoYSs9Z28pLHthbmdsZTphLGRpc3RhbmNlOml9fWZ1bmN0aW9uIEZvKGUsdCl7cmV0dXJuIE1hdGguc3FydCgodC54LWUueCkqKjIrKHQueS1lLnkpKioyKX1mdW5jdGlvbiBJbyhlKXtyZXR1cm4oZSVnbytnbyklZ299ZnVuY3Rpb24gTG8oZSx0LG4scil7bGV0IGk9SW8oZSksYT1Jbyh0KSxvPUlvKG4pLHM9SW8oYS1pKSxjPUlvKG8taSksbD1JbyhpLWEpLHU9SW8oaS1vKTtyZXR1cm4gaT09PWF8fGk9PT1vfHxyJiZhPT09b3x8cz5jJiZsPHV9ZnVuY3Rpb24gUm8oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfWZ1bmN0aW9uIHpvKGUpe3JldHVybiBSbyhlLC0zMjc2OCwzMjc2Nyl9ZnVuY3Rpb24gQm8oZSx0LG4scj0xZS02KXtyZXR1cm4gZT49TWF0aC5taW4odCxuKS1yJiZlPD1NYXRoLm1heCh0LG4pK3J9ZnVuY3Rpb24gVm8oZSx0LG4pe258fD0obj0+ZVtuXTx0KTtsZXQgcj1lLmxlbmd0aC0xLGk9MCxhO2Zvcig7ci1pPjE7KWE9aStyPj4xLG4oYSk/aT1hOnI9YTtyZXR1cm57bG86aSxoaTpyfX12YXIgSG89KGUsdCxuLHIpPT5WbyhlLG4scj9yPT57bGV0IGk9ZVtyXVt0XTtyZXR1cm4gaTxufHxpPT09biYmZVtyKzFdW3RdPT09bn06cj0+ZVtyXVt0XTxuKSxVbz0oZSx0LG4pPT5WbyhlLG4scj0+ZVtyXVt0XT49bik7ZnVuY3Rpb24gV28oZSx0LG4pe2xldCByPTAsaT1lLmxlbmd0aDtmb3IoO3I8aSYmZVtyXTx0OylyKys7Zm9yKDtpPnImJmVbaS0xXT5uOylpLS07cmV0dXJuIHI+MHx8aTxlLmxlbmd0aD9lLnNsaWNlKHIsaSk6ZX12YXIgR289W2BwdXNoYCxgcG9wYCxgc2hpZnRgLGBzcGxpY2VgLGB1bnNoaWZ0YF07ZnVuY3Rpb24gS28oZSx0KXtpZihlLl9jaGFydGpzKXtlLl9jaGFydGpzLmxpc3RlbmVycy5wdXNoKHQpO3JldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX2NoYXJ0anMiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTp7bGlzdGVuZXJzOlt0XX19KSxHby5mb3JFYWNoKHQ9PntsZXQgbj1gX29uRGF0YWArdW8odCkscj1lW3RdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlKC4uLnQpe2xldCBpPXIuYXBwbHkodGhpcyx0KTtyZXR1cm4gZS5fY2hhcnRqcy5saXN0ZW5lcnMuZm9yRWFjaChlPT57dHlwZW9mIGVbbl09PWBmdW5jdGlvbmAmJmVbbl0oLi4udCl9KSxpfX0pfSl9ZnVuY3Rpb24gcW8oZSx0KXtsZXQgbj1lLl9jaGFydGpzO2lmKCFuKXJldHVybjtsZXQgcj1uLmxpc3RlbmVycyxpPXIuaW5kZXhPZih0KTtpIT09LTEmJnIuc3BsaWNlKGksMSksIShyLmxlbmd0aD4wKSYmKEdvLmZvckVhY2godD0+e2RlbGV0ZSBlW3RdfSksZGVsZXRlIGUuX2NoYXJ0anMpfWZ1bmN0aW9uIEpvKGUpe2xldCB0PW5ldyBTZXQoZSk7cmV0dXJuIHQuc2l6ZT09PWUubGVuZ3RoP2U6QXJyYXkuZnJvbSh0KX12YXIgWW89ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz5gdWA/ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX06d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZX0oKTtmdW5jdGlvbiBYbyhlLHQpe2xldCBuPVtdLHI9ITE7cmV0dXJuIGZ1bmN0aW9uKC4uLmkpe249aSxyfHwocj0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3I9ITEsZS5hcHBseSh0LG4pfSkpfX1mdW5jdGlvbiBabyhlLHQpe2xldCBuO3JldHVybiBmdW5jdGlvbiguLi5yKXtyZXR1cm4gdD8oY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChlLHQscikpOmUuYXBwbHkodGhpcyxyKSx0fX12YXIgUW89ZT0+ZT09PWBzdGFydGA/YGxlZnRgOmU9PT1gZW5kYD9gcmlnaHRgOmBjZW50ZXJgLCRvPShlLHQsbik9PmU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246KHQrbikvMixlcz0oZSx0LG4scik9PmU9PT0ocj9gbGVmdGA6YHJpZ2h0YCk/bjplPT09YGNlbnRlcmA/KHQrbikvMjp0LHRzPWU9PmU9PT0wfHxlPT09MSxucz0oZSx0LG4pPT4tKDIqKigxMCotLWUpKk1hdGguc2luKChlLXQpKmdvL24pKSxycz0oZSx0LG4pPT4yKiooLTEwKmUpKk1hdGguc2luKChlLXQpKmdvL24pKzEsaXM9e2xpbmVhcjplPT5lLGVhc2VJblF1YWQ6ZT0+ZSplLGVhc2VPdXRRdWFkOmU9Pi1lKihlLTIpLGVhc2VJbk91dFF1YWQ6ZT0+KGUvPS41KTwxPy41KmUqZTotLjUqKC0tZSooZS0yKS0xKSxlYXNlSW5DdWJpYzplPT5lKmUqZSxlYXNlT3V0Q3ViaWM6ZT0+LS1lKmUqZSsxLGVhc2VJbk91dEN1YmljOmU9PihlLz0uNSk8MT8uNSplKmUqZTouNSooKGUtPTIpKmUqZSsyKSxlYXNlSW5RdWFydDplPT5lKmUqZSplLGVhc2VPdXRRdWFydDplPT4tKC0tZSplKmUqZS0xKSxlYXNlSW5PdXRRdWFydDplPT4oZS89LjUpPDE/LjUqZSplKmUqZTotLjUqKChlLT0yKSplKmUqZS0yKSxlYXNlSW5RdWludDplPT5lKmUqZSplKmUsZWFzZU91dFF1aW50OmU9Pi0tZSplKmUqZSplKzEsZWFzZUluT3V0UXVpbnQ6ZT0+KGUvPS41KTwxPy41KmUqZSplKmUqZTouNSooKGUtPTIpKmUqZSplKmUrMiksZWFzZUluU2luZTplPT4tTWF0aC5jb3MoZSp5bykrMSxlYXNlT3V0U2luZTplPT5NYXRoLnNpbihlKnlvKSxlYXNlSW5PdXRTaW5lOmU9Pi0uNSooTWF0aC5jb3MoWCplKS0xKSxlYXNlSW5FeHBvOmU9PmU9PT0wPzA6MioqKDEwKihlLTEpKSxlYXNlT3V0RXhwbzplPT5lPT09MT8xOi0oMioqKC0xMCplKSkrMSxlYXNlSW5PdXRFeHBvOmU9PnRzKGUpP2U6ZTwuNT8uNSoyKiooMTAqKGUqMi0xKSk6LjUqKC0oMioqKC0xMCooZSoyLTEpKSkrMiksZWFzZUluQ2lyYzplPT5lPj0xP2U6LShNYXRoLnNxcnQoMS1lKmUpLTEpLGVhc2VPdXRDaXJjOmU9Pk1hdGguc3FydCgxLSAtLWUqZSksZWFzZUluT3V0Q2lyYzplPT4oZS89LjUpPDE/LS41KihNYXRoLnNxcnQoMS1lKmUpLTEpOi41KihNYXRoLnNxcnQoMS0oZS09MikqZSkrMSksZWFzZUluRWxhc3RpYzplPT50cyhlKT9lOm5zKGUsLjA3NSwuMyksZWFzZU91dEVsYXN0aWM6ZT0+dHMoZSk/ZTpycyhlLC4wNzUsLjMpLGVhc2VJbk91dEVsYXN0aWMoZSl7bGV0IHQ9LjExMjUsbj0uNDU7cmV0dXJuIHRzKGUpP2U6ZTwuNT8uNSpucyhlKjIsdCxuKTouNSsuNSpycyhlKjItMSx0LG4pfSxlYXNlSW5CYWNrKGUpe3JldHVybiBlKmUqKDIuNzAxNTgqZS0xLjcwMTU4KX0sZWFzZU91dEJhY2soZSl7cmV0dXJuLS1lKmUqKDIuNzAxNTgqZSsxLjcwMTU4KSsxfSxlYXNlSW5PdXRCYWNrKGUpe2xldCB0PTEuNzAxNTg7cmV0dXJuKGUvPS41KTwxPy41KihlKmUqKCgodCo9MS41MjUpKzEpKmUtdCkpOi41KigoZS09MikqZSooKCh0Kj0xLjUyNSkrMSkqZSt0KSsyKX0sZWFzZUluQm91bmNlOmU9PjEtaXMuZWFzZU91dEJvdW5jZSgxLWUpLGVhc2VPdXRCb3VuY2UoZSl7bGV0IHQ9Ny41NjI1LG49Mi43NTtyZXR1cm4gZTwxL24/dCplKmU6ZTwyL24/dCooZS09MS41L24pKmUrLjc1OmU8Mi41L24/dCooZS09Mi4yNS9uKSplKy45Mzc1OnQqKGUtPTIuNjI1L24pKmUrLjk4NDM3NX0sZWFzZUluT3V0Qm91bmNlOmU9PmU8LjU/aXMuZWFzZUluQm91bmNlKGUqMikqLjU6aXMuZWFzZU91dEJvdW5jZShlKjItMSkqLjUrLjV9O2Z1bmN0aW9uIGFzKGUpe2lmKGUmJnR5cGVvZiBlPT1gb2JqZWN0YCl7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PT09YFtvYmplY3QgQ2FudmFzUGF0dGVybl1gfHx0PT09YFtvYmplY3QgQ2FudmFzR3JhZGllbnRdYH1yZXR1cm4hMX1mdW5jdGlvbiBvcyhlKXtyZXR1cm4gYXMoZSk/ZTpuZXcgSmEoZSl9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGFzKGUpP2U6bmV3IEphKGUpLnNhdHVyYXRlKC41KS5kYXJrZW4oLjEpLmhleFN0cmluZygpfXZhciBjcz1bYHhgLGB5YCxgYm9yZGVyV2lkdGhgLGByYWRpdXNgLGB0ZW5zaW9uYF0sbHM9W2Bjb2xvcmAsYGJvcmRlckNvbG9yYCxgYmFja2dyb3VuZENvbG9yYF07ZnVuY3Rpb24gdXMoZSl7ZS5zZXQoYGFuaW1hdGlvbmAse2RlbGF5OnZvaWQgMCxkdXJhdGlvbjoxZTMsZWFzaW5nOmBlYXNlT3V0UXVhcnRgLGZuOnZvaWQgMCxmcm9tOnZvaWQgMCxsb29wOnZvaWQgMCx0bzp2b2lkIDAsdHlwZTp2b2lkIDB9KSxlLmRlc2NyaWJlKGBhbmltYXRpb25gLHtfZmFsbGJhY2s6ITEsX2luZGV4YWJsZTohMSxfc2NyaXB0YWJsZTplPT5lIT09YG9uUHJvZ3Jlc3NgJiZlIT09YG9uQ29tcGxldGVgJiZlIT09YGZuYH0pLGUuc2V0KGBhbmltYXRpb25zYCx7Y29sb3JzOnt0eXBlOmBjb2xvcmAscHJvcGVydGllczpsc30sbnVtYmVyczp7dHlwZTpgbnVtYmVyYCxwcm9wZXJ0aWVzOmNzfX0pLGUuZGVzY3JpYmUoYGFuaW1hdGlvbnNgLHtfZmFsbGJhY2s6YGFuaW1hdGlvbmB9KSxlLnNldChgdHJhbnNpdGlvbnNgLHthY3RpdmU6e2FuaW1hdGlvbjp7ZHVyYXRpb246NDAwfX0scmVzaXplOnthbmltYXRpb246e2R1cmF0aW9uOjB9fSxzaG93OnthbmltYXRpb25zOntjb2xvcnM6e2Zyb206YHRyYW5zcGFyZW50YH0sdmlzaWJsZTp7dHlwZTpgYm9vbGVhbmAsZHVyYXRpb246MH19fSxoaWRlOnthbmltYXRpb25zOntjb2xvcnM6e3RvOmB0cmFuc3BhcmVudGB9LHZpc2libGU6e3R5cGU6YGJvb2xlYW5gLGVhc2luZzpgbGluZWFyYCxmbjplPT5lfDB9fX19KX1mdW5jdGlvbiBkcyhlKXtlLnNldChgbGF5b3V0YCx7YXV0b1BhZGRpbmc6ITAscGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fSl9dmFyIGZzPW5ldyBNYXA7ZnVuY3Rpb24gcHMoZSx0KXt0fHw9e307bGV0IG49ZStKU09OLnN0cmluZ2lmeSh0KSxyPWZzLmdldChuKTtyZXR1cm4gcnx8KHI9bmV3IEludGwuTnVtYmVyRm9ybWF0KGUsdCksZnMuc2V0KG4scikpLHJ9ZnVuY3Rpb24gbXMoZSx0LG4pe3JldHVybiBwcyh0LG4pLmZvcm1hdChlKX12YXIgaHM9e3ZhbHVlcyhlKXtyZXR1cm4gVyhlKT9lOmBgK2V9LG51bWVyaWMoZSx0LG4pe2lmKGU9PT0wKXJldHVybmAwYDtsZXQgcj10aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLGksYT1lO2lmKG4ubGVuZ3RoPjEpe2xldCB0PU1hdGgubWF4KE1hdGguYWJzKG5bMF0udmFsdWUpLE1hdGguYWJzKG5bbi5sZW5ndGgtMV0udmFsdWUpKTsodDwxZS00fHx0PjB4MzhkN2VhNGM2ODAwMCkmJihpPWBzY2llbnRpZmljYCksYT1ncyhlLG4pfWxldCBvPVNvKE1hdGguYWJzKGEpKSxzPWlzTmFOKG8pPzE6TWF0aC5tYXgoTWF0aC5taW4oLTEqTWF0aC5mbG9vcihvKSwyMCksMCksYz17bm90YXRpb246aSxtaW5pbXVtRnJhY3Rpb25EaWdpdHM6cyxtYXhpbXVtRnJhY3Rpb25EaWdpdHM6c307cmV0dXJuIE9iamVjdC5hc3NpZ24oYyx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KSxtcyhlLHIsYyl9LGxvZ2FyaXRobWljKGUsdCxuKXtpZihlPT09MClyZXR1cm5gMGA7bGV0IHI9blt0XS5zaWduaWZpY2FuZHx8ZS8xMCoqTWF0aC5mbG9vcihTbyhlKSk7cmV0dXJuWzEsMiwzLDUsMTAsMTVdLmluY2x1ZGVzKHIpfHx0Pi44Km4ubGVuZ3RoP2hzLm51bWVyaWMuY2FsbCh0aGlzLGUsdCxuKTpgYH19O2Z1bmN0aW9uIGdzKGUsdCl7bGV0IG49dC5sZW5ndGg+Mz90WzJdLnZhbHVlLXRbMV0udmFsdWU6dFsxXS52YWx1ZS10WzBdLnZhbHVlO3JldHVybiBNYXRoLmFicyhuKT49MSYmZSE9PU1hdGguZmxvb3IoZSkmJihuPWUtTWF0aC5mbG9vcihlKSksbn12YXIgX3M9e2Zvcm1hdHRlcnM6aHN9O2Z1bmN0aW9uIHZzKGUpe2Uuc2V0KGBzY2FsZWAse2Rpc3BsYXk6ITAsb2Zmc2V0OiExLHJldmVyc2U6ITEsYmVnaW5BdFplcm86ITEsYm91bmRzOmB0aWNrc2AsY2xpcDohMCxncmFjZTowLGdyaWQ6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsZHJhd09uQ2hhcnRBcmVhOiEwLGRyYXdUaWNrczohMCx0aWNrTGVuZ3RoOjgsdGlja1dpZHRoOihlLHQpPT50LmxpbmVXaWR0aCx0aWNrQ29sb3I6KGUsdCk9PnQuY29sb3Isb2Zmc2V0OiExfSxib3JkZXI6e2Rpc3BsYXk6ITAsZGFzaDpbXSxkYXNoT2Zmc2V0OjAsd2lkdGg6MX0sdGl0bGU6e2Rpc3BsYXk6ITEsdGV4dDpgYCxwYWRkaW5nOnt0b3A6NCxib3R0b206NH19LHRpY2tzOnttaW5Sb3RhdGlvbjowLG1heFJvdGF0aW9uOjUwLG1pcnJvcjohMSx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0U3Ryb2tlQ29sb3I6YGAscGFkZGluZzozLGRpc3BsYXk6ITAsYXV0b1NraXA6ITAsYXV0b1NraXBQYWRkaW5nOjMsbGFiZWxPZmZzZXQ6MCxjYWxsYmFjazpfcy5mb3JtYXR0ZXJzLnZhbHVlcyxtaW5vcjp7fSxtYWpvcjp7fSxhbGlnbjpgY2VudGVyYCxjcm9zc0FsaWduOmBuZWFyYCxzaG93TGFiZWxCYWNrZHJvcDohMSxiYWNrZHJvcENvbG9yOmByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpYCxiYWNrZHJvcFBhZGRpbmc6Mn19KSxlLnJvdXRlKGBzY2FsZS50aWNrc2AsYGNvbG9yYCxgYCxgY29sb3JgKSxlLnJvdXRlKGBzY2FsZS5ncmlkYCxgY29sb3JgLGBgLGBib3JkZXJDb2xvcmApLGUucm91dGUoYHNjYWxlLmJvcmRlcmAsYGNvbG9yYCxgYCxgYm9yZGVyQ29sb3JgKSxlLnJvdXRlKGBzY2FsZS50aXRsZWAsYGNvbG9yYCxgYCxgY29sb3JgKSxlLmRlc2NyaWJlKGBzY2FsZWAse19mYWxsYmFjazohMSxfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBiZWZvcmVgKSYmIWUuc3RhcnRzV2l0aChgYWZ0ZXJgKSYmZSE9PWBjYWxsYmFja2AmJmUhPT1gcGFyc2VyYCxfaW5kZXhhYmxlOmU9PmUhPT1gYm9yZGVyRGFzaGAmJmUhPT1gdGlja0JvcmRlckRhc2hgJiZlIT09YGRhc2hgfSksZS5kZXNjcmliZShgc2NhbGVzYCx7X2ZhbGxiYWNrOmBzY2FsZWB9KSxlLmRlc2NyaWJlKGBzY2FsZS50aWNrc2Ase19zY3JpcHRhYmxlOmU9PmUhPT1gYmFja2Ryb3BQYWRkaW5nYCYmZSE9PWBjYWxsYmFja2AsX2luZGV4YWJsZTplPT5lIT09YGJhY2tkcm9wUGFkZGluZ2B9KX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKSxicz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHhzKGUsdCl7aWYoIXQpcmV0dXJuIGU7bGV0IG49dC5zcGxpdChgLmApO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dDxyOysrdCl7bGV0IHI9blt0XTtlPWVbcl18fChlW3JdPU9iamVjdC5jcmVhdGUobnVsbCkpfXJldHVybiBlfWZ1bmN0aW9uIFNzKGUsdCxuKXtyZXR1cm4gdHlwZW9mIHQ9PWBzdHJpbmdgP3JvKHhzKGUsdCksbik6cm8oeHMoZSxgYCksdCl9dmFyIFo9bmV3IGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5hbmltYXRpb249dm9pZCAwLHRoaXMuYmFja2dyb3VuZENvbG9yPWByZ2JhKDAsMCwwLDAuMSlgLHRoaXMuYm9yZGVyQ29sb3I9YHJnYmEoMCwwLDAsMC4xKWAsdGhpcy5jb2xvcj1gIzY2NmAsdGhpcy5kYXRhc2V0cz17fSx0aGlzLmRldmljZVBpeGVsUmF0aW89ZT0+ZS5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCksdGhpcy5lbGVtZW50cz17fSx0aGlzLmV2ZW50cz1bYG1vdXNlbW92ZWAsYG1vdXNlb3V0YCxgY2xpY2tgLGB0b3VjaHN0YXJ0YCxgdG91Y2htb3ZlYF0sdGhpcy5mb250PXtmYW1pbHk6YCdIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmYCxzaXplOjEyLHN0eWxlOmBub3JtYWxgLGxpbmVIZWlnaHQ6MS4yLHdlaWdodDpudWxsfSx0aGlzLmhvdmVyPXt9LHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3I9KGUsdCk9PnNzKHQuYmFja2dyb3VuZENvbG9yKSx0aGlzLmhvdmVyQm9yZGVyQ29sb3I9KGUsdCk9PnNzKHQuYm9yZGVyQ29sb3IpLHRoaXMuaG92ZXJDb2xvcj0oZSx0KT0+c3ModC5jb2xvciksdGhpcy5pbmRleEF4aXM9YHhgLHRoaXMuaW50ZXJhY3Rpb249e21vZGU6YG5lYXJlc3RgLGludGVyc2VjdDohMCxpbmNsdWRlSW52aXNpYmxlOiExfSx0aGlzLm1haW50YWluQXNwZWN0UmF0aW89ITAsdGhpcy5vbkhvdmVyPW51bGwsdGhpcy5vbkNsaWNrPW51bGwsdGhpcy5wYXJzaW5nPSEwLHRoaXMucGx1Z2lucz17fSx0aGlzLnJlc3BvbnNpdmU9ITAsdGhpcy5zY2FsZT12b2lkIDAsdGhpcy5zY2FsZXM9e30sdGhpcy5zaG93TGluZT0hMCx0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wPSEwLHRoaXMuZGVzY3JpYmUoZSksdGhpcy5hcHBseSh0KX1zZXQoZSx0KXtyZXR1cm4gU3ModGhpcyxlLHQpfWdldChlKXtyZXR1cm4geHModGhpcyxlKX1kZXNjcmliZShlLHQpe3JldHVybiBTcyhicyxlLHQpfW92ZXJyaWRlKGUsdCl7cmV0dXJuIFNzKHlzLGUsdCl9cm91dGUoZSx0LG4scil7bGV0IGk9eHModGhpcyxlKSxhPXhzKHRoaXMsbiksbz1gX2ArdDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLHtbb106e3ZhbHVlOmlbdF0sd3JpdGFibGU6ITB9LFt0XTp7ZW51bWVyYWJsZTohMCxnZXQoKXtsZXQgZT10aGlzW29dLHQ9YVtyXTtyZXR1cm4gRyhlKT9PYmplY3QuYXNzaWduKHt9LHQsZSk6cShlLHQpfSxzZXQoZSl7dGhpc1tvXT1lfX19KX1hcHBseShlKXtlLmZvckVhY2goZT0+ZSh0aGlzKSl9fSh7X3NjcmlwdGFibGU6ZT0+IWUuc3RhcnRzV2l0aChgb25gKSxfaW5kZXhhYmxlOmU9PmUhPT1gZXZlbnRzYCxob3Zlcjp7X2ZhbGxiYWNrOmBpbnRlcmFjdGlvbmB9LGludGVyYWN0aW9uOntfc2NyaXB0YWJsZTohMSxfaW5kZXhhYmxlOiExfX0sW3VzLGRzLHZzXSk7ZnVuY3Rpb24gQ3MoZSl7cmV0dXJuIWV8fFUoZS5zaXplKXx8VShlLmZhbWlseSk/bnVsbDooZS5zdHlsZT9lLnN0eWxlK2AgYDpgYCkrKGUud2VpZ2h0P2Uud2VpZ2h0K2AgYDpgYCkrZS5zaXplK2BweCBgK2UuZmFtaWx5fWZ1bmN0aW9uIHdzKGUsdCxuLHIsaSl7bGV0IGE9dFtpXTtyZXR1cm4gYXx8KGE9dFtpXT1lLm1lYXN1cmVUZXh0KGkpLndpZHRoLG4ucHVzaChpKSksYT5yJiYocj1hKSxyfWZ1bmN0aW9uIFRzKGUsdCxuLHIpe3J8fD17fTtsZXQgaT1yLmRhdGE9ci5kYXRhfHx7fSxhPXIuZ2FyYmFnZUNvbGxlY3Q9ci5nYXJiYWdlQ29sbGVjdHx8W107ci5mb250IT09dCYmKGk9ci5kYXRhPXt9LGE9ci5nYXJiYWdlQ29sbGVjdD1bXSxyLmZvbnQ9dCksZS5zYXZlKCksZS5mb250PXQ7bGV0IG89MCxzPW4ubGVuZ3RoLGMsbCx1LGQsZjtmb3IoYz0wO2M8cztjKyspaWYoZD1uW2NdLGQhPW51bGwmJiFXKGQpKW89d3MoZSxpLGEsbyxkKTtlbHNlIGlmKFcoZCkpZm9yKGw9MCx1PWQubGVuZ3RoO2w8dTtsKyspZj1kW2xdLGYhPW51bGwmJiFXKGYpJiYobz13cyhlLGksYSxvLGYpKTtlLnJlc3RvcmUoKTtsZXQgcD1hLmxlbmd0aC8yO2lmKHA+bi5sZW5ndGgpe2ZvcihjPTA7YzxwO2MrKylkZWxldGUgaVthW2NdXTthLnNwbGljZSgwLHApfXJldHVybiBvfWZ1bmN0aW9uIEVzKGUsdCxuKXtsZXQgcj1lLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvLGk9bj09PTA/MDpNYXRoLm1heChuLzIsLjUpO3JldHVybiBNYXRoLnJvdW5kKCh0LWkpKnIpL3IraX1mdW5jdGlvbiBEcyhlLHQpeyF0JiYhZXx8KHR8fD1lLmdldENvbnRleHQoYDJkYCksdC5zYXZlKCksdC5yZXNldFRyYW5zZm9ybSgpLHQuY2xlYXJSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0LnJlc3RvcmUoKSl9ZnVuY3Rpb24gT3MoZSx0LG4scil7a3MoZSx0LG4scixudWxsKX1mdW5jdGlvbiBrcyhlLHQsbixyLGkpe2xldCBhLG8scyxjLGwsdSxkLGYscD10LnBvaW50U3R5bGUsbT10LnJvdGF0aW9uLGg9dC5yYWRpdXMsZz0obXx8MCkqdm87aWYocCYmdHlwZW9mIHA9PWBvYmplY3RgJiYoYT1wLnRvU3RyaW5nKCksYT09PWBbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdYHx8YT09PWBbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XWApKXtlLnNhdmUoKSxlLnRyYW5zbGF0ZShuLHIpLGUucm90YXRlKGcpLGUuZHJhd0ltYWdlKHAsLXAud2lkdGgvMiwtcC5oZWlnaHQvMixwLndpZHRoLHAuaGVpZ2h0KSxlLnJlc3RvcmUoKTtyZXR1cm59aWYoIShpc05hTihoKXx8aDw9MCkpe3N3aXRjaChlLmJlZ2luUGF0aCgpLHApe2RlZmF1bHQ6aT9lLmVsbGlwc2UobixyLGkvMixoLDAsMCxnbyk6ZS5hcmMobixyLGgsMCxnbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHRyaWFuZ2xlYDp1PWk/aS8yOmgsZS5tb3ZlVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RSb3VuZGVkYDpsPWgqLjUxNixjPWgtbCxvPU1hdGguY29zKGcrYm8pKmMsZD1NYXRoLmNvcyhnK2JvKSooaT9pLzItbDpjKSxzPU1hdGguc2luKGcrYm8pKmMsZj1NYXRoLnNpbihnK2JvKSooaT9pLzItbDpjKSxlLmFyYyhuLWQsci1zLGwsZy1YLGcteW8pLGUuYXJjKG4rZixyLW8sbCxnLXlvLGcpLGUuYXJjKG4rZCxyK3MsbCxnLGcreW8pLGUuYXJjKG4tZixyK28sbCxnK3lvLGcrWCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RgOmlmKCFtKXtjPU1hdGguU1FSVDFfMipoLHU9aT9pLzI6YyxlLnJlY3Qobi11LHItYywyKnUsMipjKTticmVha31nKz1ibztjYXNlYHJlY3RSb3RgOmQ9TWF0aC5jb3MoZykqKGk/aS8yOmgpLG89TWF0aC5jb3MoZykqaCxzPU1hdGguc2luKGcpKmgsZj1NYXRoLnNpbihnKSooaT9pLzI6aCksZS5tb3ZlVG8obi1kLHItcyksZS5saW5lVG8obitmLHItbyksZS5saW5lVG8obitkLHIrcyksZS5saW5lVG8obi1mLHIrbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYGNyb3NzUm90YDpnKz1ibztjYXNlYGNyb3NzYDpkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2Vgc3RhcmA6ZD1NYXRoLmNvcyhnKSooaT9pLzI6aCksbz1NYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxmPU1hdGguc2luKGcpKihpP2kvMjpoKSxlLm1vdmVUbyhuLWQsci1zKSxlLmxpbmVUbyhuK2QscitzKSxlLm1vdmVUbyhuK2Ysci1vKSxlLmxpbmVUbyhuLWYscitvKSxnKz1ibyxkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2VgbGluZWA6bz1pP2kvMjpNYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxlLm1vdmVUbyhuLW8sci1zKSxlLmxpbmVUbyhuK28scitzKTticmVhaztjYXNlYGRhc2hgOmUubW92ZVRvKG4sciksZS5saW5lVG8obitNYXRoLmNvcyhnKSooaT9pLzI6aCkscitNYXRoLnNpbihnKSpoKTticmVhaztjYXNlITE6ZS5jbG9zZVBhdGgoKX1lLmZpbGwoKSx0LmJvcmRlcldpZHRoPjAmJmUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEFzKGUsdCxuKXtyZXR1cm4gbnx8PS41LCF0fHxlJiZlLng+dC5sZWZ0LW4mJmUueDx0LnJpZ2h0K24mJmUueT50LnRvcC1uJiZlLnk8dC5ib3R0b20rbn1mdW5jdGlvbiBqcyhlLHQpe2Uuc2F2ZSgpLGUuYmVnaW5QYXRoKCksZS5yZWN0KHQubGVmdCx0LnRvcCx0LnJpZ2h0LXQubGVmdCx0LmJvdHRvbS10LnRvcCksZS5jbGlwKCl9ZnVuY3Rpb24gTXMoZSl7ZS5yZXN0b3JlKCl9ZnVuY3Rpb24gTnMoZSx0KXt0LnRyYW5zbGF0aW9uJiZlLnRyYW5zbGF0ZSh0LnRyYW5zbGF0aW9uWzBdLHQudHJhbnNsYXRpb25bMV0pLFUodC5yb3RhdGlvbil8fGUucm90YXRlKHQucm90YXRpb24pLHQuY29sb3ImJihlLmZpbGxTdHlsZT10LmNvbG9yKSx0LnRleHRBbGlnbiYmKGUudGV4dEFsaWduPXQudGV4dEFsaWduKSx0LnRleHRCYXNlbGluZSYmKGUudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lKX1mdW5jdGlvbiBQcyhlLHQsbixyLGkpe2lmKGkuc3RyaWtldGhyb3VnaHx8aS51bmRlcmxpbmUpe2xldCBhPWUubWVhc3VyZVRleHQociksbz10LWEuYWN0dWFsQm91bmRpbmdCb3hMZWZ0LHM9dCthLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQsYz1uLWEuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsbD1uK2EuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50LHU9aS5zdHJpa2V0aHJvdWdoPyhjK2wpLzI6bDtlLnN0cm9rZVN0eWxlPWUuZmlsbFN0eWxlLGUuYmVnaW5QYXRoKCksZS5saW5lV2lkdGg9aS5kZWNvcmF0aW9uV2lkdGh8fDIsZS5tb3ZlVG8obyx1KSxlLmxpbmVUbyhzLHUpLGUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEZzKGUsdCl7bGV0IG49ZS5maWxsU3R5bGU7ZS5maWxsU3R5bGU9dC5jb2xvcixlLmZpbGxSZWN0KHQubGVmdCx0LnRvcCx0LndpZHRoLHQuaGVpZ2h0KSxlLmZpbGxTdHlsZT1ufWZ1bmN0aW9uIElzKGUsdCxuLHIsaSxhPXt9KXtsZXQgbz1XKHQpP3Q6W3RdLHM9YS5zdHJva2VXaWR0aD4wJiZhLnN0cm9rZUNvbG9yIT09YGAsYyxsO2ZvcihlLnNhdmUoKSxlLmZvbnQ9aS5zdHJpbmcsTnMoZSxhKSxjPTA7YzxvLmxlbmd0aDsrK2MpbD1vW2NdLGEuYmFja2Ryb3AmJkZzKGUsYS5iYWNrZHJvcCkscyYmKGEuc3Ryb2tlQ29sb3ImJihlLnN0cm9rZVN0eWxlPWEuc3Ryb2tlQ29sb3IpLFUoYS5zdHJva2VXaWR0aCl8fChlLmxpbmVXaWR0aD1hLnN0cm9rZVdpZHRoKSxlLnN0cm9rZVRleHQobCxuLHIsYS5tYXhXaWR0aCkpLGUuZmlsbFRleHQobCxuLHIsYS5tYXhXaWR0aCksUHMoZSxuLHIsbCxhKSxyKz1OdW1iZXIoaS5saW5lSGVpZ2h0KTtlLnJlc3RvcmUoKX1mdW5jdGlvbiBMcyhlLHQpe2xldHt4Om4seTpyLHc6aSxoOmEscmFkaXVzOm99PXQ7ZS5hcmMobitvLnRvcExlZnQscitvLnRvcExlZnQsby50b3BMZWZ0LDEuNSpYLFgsITApLGUubGluZVRvKG4scithLW8uYm90dG9tTGVmdCksZS5hcmMobitvLmJvdHRvbUxlZnQscithLW8uYm90dG9tTGVmdCxvLmJvdHRvbUxlZnQsWCx5bywhMCksZS5saW5lVG8obitpLW8uYm90dG9tUmlnaHQscithKSxlLmFyYyhuK2ktby5ib3R0b21SaWdodCxyK2Etby5ib3R0b21SaWdodCxvLmJvdHRvbVJpZ2h0LHlvLDAsITApLGUubGluZVRvKG4raSxyK28udG9wUmlnaHQpLGUuYXJjKG4raS1vLnRvcFJpZ2h0LHIrby50b3BSaWdodCxvLnRvcFJpZ2h0LDAsLXlvLCEwKSxlLmxpbmVUbyhuK28udG9wTGVmdCxyKX12YXIgUnM9L14obm9ybWFsfChcZCsoPzpcLlxkKyk/KShweHxlbXwlKT8pJC8senM9L14obm9ybWFsfGl0YWxpY3xpbml0aWFsfGluaGVyaXR8dW5zZXR8KG9ibGlxdWUoIC0/WzAtOV0/WzAtOV1kZWcpPykpJC87ZnVuY3Rpb24gQnMoZSx0KXtsZXQgbj0oYGArZSkubWF0Y2goUnMpO2lmKCFufHxuWzFdPT09YG5vcm1hbGApcmV0dXJuIHQqMS4yO3N3aXRjaChlPStuWzJdLG5bM10pe2Nhc2VgcHhgOnJldHVybiBlO2Nhc2VgJWA6ZS89MTAwfXJldHVybiB0KmV9dmFyIFZzPWU9PitlfHwwO2Z1bmN0aW9uIEhzKGUsdCl7bGV0IG49e30scj1HKHQpLGk9cj9PYmplY3Qua2V5cyh0KTp0LGE9RyhlKT9yP249PnEoZVtuXSxlW3Rbbl1dKTp0PT5lW3RdOigpPT5lO2ZvcihsZXQgZSBvZiBpKW5bZV09VnMoYShlKSk7cmV0dXJuIG59ZnVuY3Rpb24gVXMoZSl7cmV0dXJuIEhzKGUse3RvcDpgeWAscmlnaHQ6YHhgLGJvdHRvbTpgeWAsbGVmdDpgeGB9KX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gSHMoZSxbYHRvcExlZnRgLGB0b3BSaWdodGAsYGJvdHRvbUxlZnRgLGBib3R0b21SaWdodGBdKX1mdW5jdGlvbiBRKGUpe2xldCB0PVVzKGUpO3JldHVybiB0LndpZHRoPXQubGVmdCt0LnJpZ2h0LHQuaGVpZ2h0PXQudG9wK3QuYm90dG9tLHR9ZnVuY3Rpb24gJChlLHQpe2V8fD17fSx0fHw9Wi5mb250O2xldCBuPXEoZS5zaXplLHQuc2l6ZSk7dHlwZW9mIG49PWBzdHJpbmdgJiYobj1wYXJzZUludChuLDEwKSk7bGV0IHI9cShlLnN0eWxlLHQuc3R5bGUpO3ImJiEoYGArcikubWF0Y2goenMpJiYoY29uc29sZS53YXJuKGBJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiAiYCtyK2AiYCkscj12b2lkIDApO2xldCBpPXtmYW1pbHk6cShlLmZhbWlseSx0LmZhbWlseSksbGluZUhlaWdodDpCcyhxKGUubGluZUhlaWdodCx0LmxpbmVIZWlnaHQpLG4pLHNpemU6bixzdHlsZTpyLHdlaWdodDpxKGUud2VpZ2h0LHQud2VpZ2h0KSxzdHJpbmc6YGB9O3JldHVybiBpLnN0cmluZz1DcyhpKSxpfWZ1bmN0aW9uIEdzKGUsdCxuLHIpe2xldCBpPSEwLGEsbyxzO2ZvcihhPTAsbz1lLmxlbmd0aDthPG87KythKWlmKHM9ZVthXSxzIT09dm9pZCAwJiYodCE9PXZvaWQgMCYmdHlwZW9mIHM9PWBmdW5jdGlvbmAmJihzPXModCksaT0hMSksbiE9PXZvaWQgMCYmVyhzKSYmKHM9c1tuJXMubGVuZ3RoXSxpPSExKSxzIT09dm9pZCAwKSlyZXR1cm4gciYmIWkmJihyLmNhY2hlYWJsZT0hMSksc31mdW5jdGlvbiBLcyhlLHQsbil7bGV0e21pbjpyLG1heDppfT1lLGE9UWEodCwoaS1yKS8yKSxvPShlLHQpPT5uJiZlPT09MD8wOmUrdDtyZXR1cm57bWluOm8ociwtTWF0aC5hYnMoYSkpLG1heDpvKGksYSl9fWZ1bmN0aW9uIHFzKGUsdCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShlKSx0KX1mdW5jdGlvbiBKcyhlLHQ9W2BgXSxuLHIsaT0oKT0+ZVswXSl7bGV0IGE9bnx8ZTtyZXR1cm4gcj09PXZvaWQgMCYmKHI9dWMoYF9mYWxsYmFja2AsZSkpLG5ldyBQcm94eSh7W1N5bWJvbC50b1N0cmluZ1RhZ106YE9iamVjdGAsX2NhY2hlYWJsZTohMCxfc2NvcGVzOmUsX3Jvb3RTY29wZXM6YSxfZmFsbGJhY2s6cixfZ2V0VGFyZ2V0Omksb3ZlcnJpZGU6bj0+SnMoW24sLi4uZV0sdCxhLHIpfSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIHQuX2tleXMsZGVsZXRlIGVbMF1bbl0sITB9LGdldChuLHIpe3JldHVybiAkcyhuLHIsKCk9PmxjKHIsdCxlLG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuX3Njb3Blc1swXSx0KX0sZ2V0UHJvdG90eXBlT2YoKXtyZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihlWzBdKX0saGFzKGUsdCl7cmV0dXJuIGRjKGUpLmluY2x1ZGVzKHQpfSxvd25LZXlzKGUpe3JldHVybiBkYyhlKX0sc2V0KGUsdCxuKXtsZXQgcj1lLl9zdG9yYWdlfHw9aSgpO3JldHVybiBlW3RdPXJbdF09bixkZWxldGUgZS5fa2V5cywhMH19KX1mdW5jdGlvbiBZcyhlLHQsbixyKXtsZXQgaT17X2NhY2hlYWJsZTohMSxfcHJveHk6ZSxfY29udGV4dDp0LF9zdWJQcm94eTpuLF9zdGFjazpuZXcgU2V0LF9kZXNjcmlwdG9yczpYcyhlLHIpLHNldENvbnRleHQ6dD0+WXMoZSx0LG4sciksb3ZlcnJpZGU6aT0+WXMoZS5vdmVycmlkZShpKSx0LG4scil9O3JldHVybiBuZXcgUHJveHkoaSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIGVbbl0sITB9LGdldChlLHQsbil7cmV0dXJuICRzKGUsdCwoKT0+ZWMoZSx0LG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7cmV0dXJuIHQuX2Rlc2NyaXB0b3JzLmFsbEtleXM/UmVmbGVjdC5oYXMoZSxuKT97ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9OnZvaWQgMDpSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pfSxnZXRQcm90b3R5cGVPZigpe3JldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGUpfSxoYXModCxuKXtyZXR1cm4gUmVmbGVjdC5oYXMoZSxuKX0sb3duS2V5cygpe3JldHVybiBSZWZsZWN0Lm93bktleXMoZSl9LHNldCh0LG4scil7cmV0dXJuIGVbbl09cixkZWxldGUgdFtuXSwhMH19KX1mdW5jdGlvbiBYcyhlLHQ9e3NjcmlwdGFibGU6ITAsaW5kZXhhYmxlOiEwfSl7bGV0e19zY3JpcHRhYmxlOm49dC5zY3JpcHRhYmxlLF9pbmRleGFibGU6cj10LmluZGV4YWJsZSxfYWxsS2V5czppPXQuYWxsS2V5c309ZTtyZXR1cm57YWxsS2V5czppLHNjcmlwdGFibGU6bixpbmRleGFibGU6cixpc1NjcmlwdGFibGU6cG8obik/bjooKT0+bixpc0luZGV4YWJsZTpwbyhyKT9yOigpPT5yfX12YXIgWnM9KGUsdCk9PmU/ZSt1byh0KTp0LFFzPShlLHQpPT5HKHQpJiZlIT09YGFkYXB0ZXJzYCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGx8fHQuY29uc3RydWN0b3I9PT1PYmplY3QpO2Z1bmN0aW9uICRzKGUsdCxuKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KXx8dD09PWBjb25zdHJ1Y3RvcmApcmV0dXJuIGVbdF07bGV0IHI9bigpO3JldHVybiBlW3RdPXIscn1mdW5jdGlvbiBlYyhlLHQsbil7bGV0e19wcm94eTpyLF9jb250ZXh0OmksX3N1YlByb3h5OmEsX2Rlc2NyaXB0b3JzOm99PWUscz1yW3RdO3JldHVybiBwbyhzKSYmby5pc1NjcmlwdGFibGUodCkmJihzPXRjKHQscyxlLG4pKSxXKHMpJiZzLmxlbmd0aCYmKHM9bmModCxzLGUsby5pc0luZGV4YWJsZSkpLFFzKHQscykmJihzPVlzKHMsaSxhJiZhW3RdLG8pKSxzfWZ1bmN0aW9uIHRjKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9zdGFjazpzfT1uO2lmKHMuaGFzKGUpKXRocm93IEVycm9yKGBSZWN1cnNpb24gZGV0ZWN0ZWQ6IGArQXJyYXkuZnJvbShzKS5qb2luKGAtPmApK2AtPmArZSk7cy5hZGQoZSk7bGV0IGM9dChhLG98fHIpO3JldHVybiBzLmRlbGV0ZShlKSxRcyhlLGMpJiYoYz1vYyhpLl9zY29wZXMsaSxlLGMpKSxjfWZ1bmN0aW9uIG5jKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9kZXNjcmlwdG9yczpzfT1uO2lmKGEuaW5kZXghPT12b2lkIDAmJnIoZSkpcmV0dXJuIHRbYS5pbmRleCV0Lmxlbmd0aF07aWYoRyh0WzBdKSl7bGV0IG49dCxyPWkuX3Njb3Blcy5maWx0ZXIoZT0+ZSE9PW4pO3Q9W107Zm9yKGxldCBjIG9mIG4pe2xldCBuPW9jKHIsaSxlLGMpO3QucHVzaChZcyhuLGEsbyYmb1tlXSxzKSl9fXJldHVybiB0fWZ1bmN0aW9uIHJjKGUsdCxuKXtyZXR1cm4gcG8oZSk/ZSh0LG4pOmV9dmFyIGljPShlLHQpPT5lPT09ITA/dDp0eXBlb2YgZT09YHN0cmluZ2A/bG8odCxlKTp2b2lkIDA7ZnVuY3Rpb24gYWMoZSx0LG4scixpKXtmb3IobGV0IGEgb2YgdCl7bGV0IHQ9aWMobixhKTtpZih0KXtlLmFkZCh0KTtsZXQgYT1yYyh0Ll9mYWxsYmFjayxuLGkpO2lmKGEhPT12b2lkIDAmJmEhPT1uJiZhIT09cilyZXR1cm4gYX1lbHNlIGlmKHQ9PT0hMSYmciE9PXZvaWQgMCYmbiE9PXIpcmV0dXJuIG51bGx9cmV0dXJuITF9ZnVuY3Rpb24gb2MoZSx0LG4scil7bGV0IGk9dC5fcm9vdFNjb3BlcyxhPXJjKHQuX2ZhbGxiYWNrLG4sciksbz1bLi4uZSwuLi5pXSxzPW5ldyBTZXQ7cy5hZGQocik7bGV0IGM9c2MocyxvLG4sYXx8bixyKTtyZXR1cm4gYz09PW51bGx8fGEhPT12b2lkIDAmJmEhPT1uJiYoYz1zYyhzLG8sYSxjLHIpLGM9PT1udWxsKT8hMTpKcyhBcnJheS5mcm9tKHMpLFtgYF0saSxhLCgpPT5jYyh0LG4scikpfWZ1bmN0aW9uIHNjKGUsdCxuLHIsaSl7Zm9yKDtuOyluPWFjKGUsdCxuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gY2MoZSx0LG4pe2xldCByPWUuX2dldFRhcmdldCgpO3QgaW4gcnx8KHJbdF09e30pO2xldCBpPXJbdF07cmV0dXJuIFcoaSkmJkcobik/bjppfHx7fX1mdW5jdGlvbiBsYyhlLHQsbixyKXtsZXQgaTtmb3IobGV0IGEgb2YgdClpZihpPXVjKFpzKGEsZSksbiksaSE9PXZvaWQgMClyZXR1cm4gUXMoZSxpKT9vYyhuLHIsZSxpKTppfWZ1bmN0aW9uIHVjKGUsdCl7Zm9yKGxldCBuIG9mIHQpe2lmKCFuKWNvbnRpbnVlO2xldCB0PW5bZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdH19ZnVuY3Rpb24gZGMoZSl7bGV0IHQ9ZS5fa2V5cztyZXR1cm4gdHx8PWUuX2tleXM9ZmMoZS5fc2NvcGVzKSx0fWZ1bmN0aW9uIGZjKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIGUpZm9yKGxldCBlIG9mIE9iamVjdC5rZXlzKG4pLmZpbHRlcihlPT4hZS5zdGFydHNXaXRoKGBfYCkpKXQuYWRkKGUpO3JldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8YHVgJiZ0eXBlb2YgZG9jdW1lbnQ8YHVgfWZ1bmN0aW9uIG1jKGUpe2xldCB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC50b1N0cmluZygpPT09YFtvYmplY3QgU2hhZG93Um9vdF1gJiYodD10Lmhvc3QpLHR9ZnVuY3Rpb24gaGMoZSx0LG4pe2xldCByO3JldHVybiB0eXBlb2YgZT09YHN0cmluZ2A/KHI9cGFyc2VJbnQoZSwxMCksZS5pbmRleE9mKGAlYCkhPT0tMSYmKHI9ci8xMDAqdC5wYXJlbnROb2RlW25dKSk6cj1lLHJ9dmFyIGdjPWU9PmUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCk7ZnVuY3Rpb24gX2MoZSx0KXtyZXR1cm4gZ2MoZSkuZ2V0UHJvcGVydHlWYWx1ZSh0KX12YXIgdmM9W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXTtmdW5jdGlvbiB5YyhlLHQsbil7bGV0IHI9e307bj1uP2AtYCtuOmBgO2ZvcihsZXQgaT0wO2k8NDtpKyspe2xldCBhPXZjW2ldO3JbYV09cGFyc2VGbG9hdChlW3QrYC1gK2Erbl0pfHwwfXJldHVybiByLndpZHRoPXIubGVmdCtyLnJpZ2h0LHIuaGVpZ2h0PXIudG9wK3IuYm90dG9tLHJ9dmFyIGJjPShlLHQsbik9PihlPjB8fHQ+MCkmJighbnx8IW4uc2hhZG93Um9vdCk7ZnVuY3Rpb24geGMoZSx0KXtsZXQgbj1lLnRvdWNoZXMscj1uJiZuLmxlbmd0aD9uWzBdOmUse29mZnNldFg6aSxvZmZzZXRZOmF9PXIsbz0hMSxzLGM7aWYoYmMoaSxhLGUudGFyZ2V0KSlzPWksYz1hO2Vsc2V7bGV0IGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtzPXIuY2xpZW50WC1lLmxlZnQsYz1yLmNsaWVudFktZS50b3Asbz0hMH1yZXR1cm57eDpzLHk6Yyxib3g6b319ZnVuY3Rpb24gU2MoZSx0KXtpZihgbmF0aXZlYGluIGUpcmV0dXJuIGU7bGV0e2NhbnZhczpuLGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvOnJ9PXQsaT1nYyhuKSxhPWkuYm94U2l6aW5nPT09YGJvcmRlci1ib3hgLG89eWMoaSxgcGFkZGluZ2ApLHM9eWMoaSxgYm9yZGVyYCxgd2lkdGhgKSx7eDpjLHk6bCxib3g6dX09eGMoZSxuKSxkPW8ubGVmdCsodSYmcy5sZWZ0KSxmPW8udG9wKyh1JiZzLnRvcCkse3dpZHRoOnAsaGVpZ2h0Om19PXQ7cmV0dXJuIGEmJihwLT1vLndpZHRoK3Mud2lkdGgsbS09by5oZWlnaHQrcy5oZWlnaHQpLHt4Ok1hdGgucm91bmQoKGMtZCkvcCpuLndpZHRoL3IpLHk6TWF0aC5yb3VuZCgobC1mKS9tKm4uaGVpZ2h0L3IpfX1mdW5jdGlvbiBDYyhlLHQsbil7bGV0IHIsaTtpZih0PT09dm9pZCAwfHxuPT09dm9pZCAwKXtsZXQgYT1lJiZtYyhlKTtpZighYSl0PWUuY2xpZW50V2lkdGgsbj1lLmNsaWVudEhlaWdodDtlbHNle2xldCBlPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1nYyhhKSxzPXljKG8sYGJvcmRlcmAsYHdpZHRoYCksYz15YyhvLGBwYWRkaW5nYCk7dD1lLndpZHRoLWMud2lkdGgtcy53aWR0aCxuPWUuaGVpZ2h0LWMuaGVpZ2h0LXMuaGVpZ2h0LHI9aGMoby5tYXhXaWR0aCxhLGBjbGllbnRXaWR0aGApLGk9aGMoby5tYXhIZWlnaHQsYSxgY2xpZW50SGVpZ2h0YCl9fXJldHVybnt3aWR0aDp0LGhlaWdodDpuLG1heFdpZHRoOnJ8fF9vLG1heEhlaWdodDppfHxfb319dmFyIHdjPWU9Pk1hdGgucm91bmQoZSoxMCkvMTA7ZnVuY3Rpb24gVGMoZSx0LG4scil7bGV0IGk9Z2MoZSksYT15YyhpLGBtYXJnaW5gKSxvPWhjKGkubWF4V2lkdGgsZSxgY2xpZW50V2lkdGhgKXx8X28scz1oYyhpLm1heEhlaWdodCxlLGBjbGllbnRIZWlnaHRgKXx8X28sYz1DYyhlLHQsbikse3dpZHRoOmwsaGVpZ2h0OnV9PWM7aWYoaS5ib3hTaXppbmc9PT1gY29udGVudC1ib3hgKXtsZXQgZT15YyhpLGBib3JkZXJgLGB3aWR0aGApLHQ9eWMoaSxgcGFkZGluZ2ApO2wtPXQud2lkdGgrZS53aWR0aCx1LT10LmhlaWdodCtlLmhlaWdodH1yZXR1cm4gbD1NYXRoLm1heCgwLGwtYS53aWR0aCksdT1NYXRoLm1heCgwLHI/bC9yOnUtYS5oZWlnaHQpLGw9d2MoTWF0aC5taW4obCxvLGMubWF4V2lkdGgpKSx1PXdjKE1hdGgubWluKHUscyxjLm1heEhlaWdodCkpLGwmJiF1JiYodT13YyhsLzIpKSwodCE9PXZvaWQgMHx8biE9PXZvaWQgMCkmJnImJmMuaGVpZ2h0JiZ1PmMuaGVpZ2h0JiYodT1jLmhlaWdodCxsPXdjKE1hdGguZmxvb3IodSpyKSkpLHt3aWR0aDpsLGhlaWdodDp1fX1mdW5jdGlvbiBFYyhlLHQsbil7bGV0IHI9dHx8MSxpPXdjKGUuaGVpZ2h0KnIpLGE9d2MoZS53aWR0aCpyKTtlLmhlaWdodD13YyhlLmhlaWdodCksZS53aWR0aD13YyhlLndpZHRoKTtsZXQgbz1lLmNhbnZhcztyZXR1cm4gby5zdHlsZSYmKG58fCFvLnN0eWxlLmhlaWdodCYmIW8uc3R5bGUud2lkdGgpJiYoby5zdHlsZS5oZWlnaHQ9YCR7ZS5oZWlnaHR9cHhgLG8uc3R5bGUud2lkdGg9YCR7ZS53aWR0aH1weGApLGUuY3VycmVudERldmljZVBpeGVsUmF0aW8hPT1yfHxvLmhlaWdodCE9PWl8fG8ud2lkdGghPT1hPyhlLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvPXIsby5oZWlnaHQ9aSxvLndpZHRoPWEsZS5jdHguc2V0VHJhbnNmb3JtKHIsMCwwLHIsMCwwKSwhMCk6ITF9dmFyIERjPWZ1bmN0aW9uKCl7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX07cGMoKSYmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpKX1jYXRjaHt9cmV0dXJuIGV9KCk7ZnVuY3Rpb24gT2MoZSx0KXtsZXQgbj1fYyhlLHQpLHI9biYmbi5tYXRjaCgvXihcZCspKFwuXGQrKT9weCQvKTtyZXR1cm4gcj8rclsxXTp2b2lkIDB9dmFyIGtjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3gobil7cmV0dXJuIGUrZSt0LW59LHNldFdpZHRoKGUpe3Q9ZX0sdGV4dEFsaWduKGUpe3JldHVybiBlPT09YGNlbnRlcmA/ZTplPT09YHJpZ2h0YD9gbGVmdGA6YHJpZ2h0YH0seFBsdXMoZSx0KXtyZXR1cm4gZS10fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGUtdH19fSxBYz1mdW5jdGlvbigpe3JldHVybnt4KGUpe3JldHVybiBlfSxzZXRXaWR0aChlKXt9LHRleHRBbGlnbihlKXtyZXR1cm4gZX0seFBsdXMoZSx0KXtyZXR1cm4gZSt0fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGV9fX07ZnVuY3Rpb24gamMoZSx0LG4pe3JldHVybiBlP2tjKHQsbik6QWMoKX1mdW5jdGlvbiBNYyhlLHQpe2xldCBuLHI7KHQ9PT1gbHRyYHx8dD09PWBydGxgKSYmKG49ZS5jYW52YXMuc3R5bGUscj1bbi5nZXRQcm9wZXJ0eVZhbHVlKGBkaXJlY3Rpb25gKSxuLmdldFByb3BlcnR5UHJpb3JpdHkoYGRpcmVjdGlvbmApXSxuLnNldFByb3BlcnR5KGBkaXJlY3Rpb25gLHQsYGltcG9ydGFudGApLGUucHJldlRleHREaXJlY3Rpb249cil9ZnVuY3Rpb24gTmMoZSx0KXt0IT09dm9pZCAwJiYoZGVsZXRlIGUucHJldlRleHREaXJlY3Rpb24sZS5jYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoYGRpcmVjdGlvbmAsdFswXSx0WzFdKSl9ZnVuY3Rpb24gUGMoZSx0LG4pe3JldHVybiBlLm9wdGlvbnMuY2xpcD9lW25dOnRbbl19ZnVuY3Rpb24gRmMoZSx0KXtsZXR7eFNjYWxlOm4seVNjYWxlOnJ9PWU7cmV0dXJuIG4mJnI/e2xlZnQ6UGMobix0LGBsZWZ0YCkscmlnaHQ6UGMobix0LGByaWdodGApLHRvcDpQYyhyLHQsYHRvcGApLGJvdHRvbTpQYyhyLHQsYGJvdHRvbWApfTp0fWZ1bmN0aW9uIEljKGUsdCl7bGV0IG49dC5fY2xpcDtpZihuLmRpc2FibGVkKXJldHVybiExO2xldCByPUZjKHQsZS5jaGFydEFyZWEpO3JldHVybntsZWZ0Om4ubGVmdD09PSExPzA6ci5sZWZ0LShuLmxlZnQ9PT0hMD8wOm4ubGVmdCkscmlnaHQ6bi5yaWdodD09PSExP2Uud2lkdGg6ci5yaWdodCsobi5yaWdodD09PSEwPzA6bi5yaWdodCksdG9wOm4udG9wPT09ITE/MDpyLnRvcC0obi50b3A9PT0hMD8wOm4udG9wKSxib3R0b206bi5ib3R0b209PT0hMT9lLmhlaWdodDpyLmJvdHRvbSsobi5ib3R0b209PT0hMD8wOm4uYm90dG9tKX19dmFyIExjPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9jaGFydHM9bmV3IE1hcCx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX2xhc3REYXRlPXZvaWQgMH1fbm90aWZ5KGUsdCxuLHIpe2xldCBpPXQubGlzdGVuZXJzW3JdLGE9dC5kdXJhdGlvbjtpLmZvckVhY2gocj0+cih7Y2hhcnQ6ZSxpbml0aWFsOnQuaW5pdGlhbCxudW1TdGVwczphLGN1cnJlbnRTdGVwOk1hdGgubWluKG4tdC5zdGFydCxhKX0pKX1fcmVmcmVzaCgpe3RoaXMuX3JlcXVlc3R8fD0odGhpcy5fcnVubmluZz0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3RoaXMuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZWZyZXNoKCl9KSl9X3VwZGF0ZShlPURhdGUubm93KCkpe2xldCB0PTA7dGhpcy5fY2hhcnRzLmZvckVhY2goKG4scik9PntpZighbi5ydW5uaW5nfHwhbi5pdGVtcy5sZW5ndGgpcmV0dXJuO2xldCBpPW4uaXRlbXMsYT1pLmxlbmd0aC0xLG89ITEscztmb3IoO2E+PTA7LS1hKXM9aVthXSxzLl9hY3RpdmU/KHMuX3RvdGFsPm4uZHVyYXRpb24mJihuLmR1cmF0aW9uPXMuX3RvdGFsKSxzLnRpY2soZSksbz0hMCk6KGlbYV09aVtpLmxlbmd0aC0xXSxpLnBvcCgpKTtvJiYoci5kcmF3KCksdGhpcy5fbm90aWZ5KHIsbixlLGBwcm9ncmVzc2ApKSxpLmxlbmd0aHx8KG4ucnVubmluZz0hMSx0aGlzLl9ub3RpZnkocixuLGUsYGNvbXBsZXRlYCksbi5pbml0aWFsPSExKSx0Kz1pLmxlbmd0aH0pLHRoaXMuX2xhc3REYXRlPWUsdD09PTAmJih0aGlzLl9ydW5uaW5nPSExKX1fZ2V0QW5pbXMoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLG49dC5nZXQoZSk7cmV0dXJuIG58fChuPXtydW5uaW5nOiExLGluaXRpYWw6ITAsaXRlbXM6W10sbGlzdGVuZXJzOntjb21wbGV0ZTpbXSxwcm9ncmVzczpbXX19LHQuc2V0KGUsbikpLG59bGlzdGVuKGUsdCxuKXt0aGlzLl9nZXRBbmltcyhlKS5saXN0ZW5lcnNbdF0ucHVzaChuKX1hZGQoZSx0KXshdHx8IXQubGVuZ3RofHx0aGlzLl9nZXRBbmltcyhlKS5pdGVtcy5wdXNoKC4uLnQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fZ2V0QW5pbXMoZSkuaXRlbXMubGVuZ3RoPjB9c3RhcnQoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTt0JiYodC5ydW5uaW5nPSEwLHQuc3RhcnQ9RGF0ZS5ub3coKSx0LmR1cmF0aW9uPXQuaXRlbXMucmVkdWNlKChlLHQpPT5NYXRoLm1heChlLHQuX2R1cmF0aW9uKSwwKSx0aGlzLl9yZWZyZXNoKCkpfXJ1bm5pbmcoZSl7aWYoIXRoaXMuX3J1bm5pbmcpcmV0dXJuITE7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtyZXR1cm4hKCF0fHwhdC5ydW5uaW5nfHwhdC5pdGVtcy5sZW5ndGgpfXN0b3AoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtpZighdHx8IXQuaXRlbXMubGVuZ3RoKXJldHVybjtsZXQgbj10Lml0ZW1zLHI9bi5sZW5ndGgtMTtmb3IoO3I+PTA7LS1yKW5bcl0uY2FuY2VsKCk7dC5pdGVtcz1bXSx0aGlzLl9ub3RpZnkoZSx0LERhdGUubm93KCksYGNvbXBsZXRlYCl9cmVtb3ZlKGUpe3JldHVybiB0aGlzLl9jaGFydHMuZGVsZXRlKGUpfX0sUmM9YHRyYW5zcGFyZW50YCx6Yz17Ym9vbGVhbihlLHQsbil7cmV0dXJuIG4+LjU/dDplfSxjb2xvcihlLHQsbil7bGV0IHI9b3MoZXx8UmMpLGk9ci52YWxpZCYmb3ModHx8UmMpO3JldHVybiBpJiZpLnZhbGlkP2kubWl4KHIsbikuaGV4U3RyaW5nKCk6dH0sbnVtYmVyKGUsdCxuKXtyZXR1cm4gZSsodC1lKSpufX0sQmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7bGV0IGk9dFtuXTtyPUdzKFtlLnRvLHIsaSxlLmZyb21dKTtsZXQgYT1HcyhbZS5mcm9tLGkscl0pO3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9mbj1lLmZufHx6Y1tlLnR5cGV8fHR5cGVvZiBhXSx0aGlzLl9lYXNpbmc9aXNbZS5lYXNpbmddfHxpcy5saW5lYXIsdGhpcy5fc3RhcnQ9TWF0aC5mbG9vcihEYXRlLm5vdygpKyhlLmRlbGF5fHwwKSksdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWw9TWF0aC5mbG9vcihlLmR1cmF0aW9uKSx0aGlzLl9sb29wPSEhZS5sb29wLHRoaXMuX3RhcmdldD10LHRoaXMuX3Byb3A9bix0aGlzLl9mcm9tPWEsdGhpcy5fdG89cix0aGlzLl9wcm9taXNlcz12b2lkIDB9YWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX11cGRhdGUoZSx0LG4pe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fbm90aWZ5KCExKTtsZXQgcj10aGlzLl90YXJnZXRbdGhpcy5fcHJvcF0saT1uLXRoaXMuX3N0YXJ0LGE9dGhpcy5fZHVyYXRpb24taTt0aGlzLl9zdGFydD1uLHRoaXMuX2R1cmF0aW9uPU1hdGguZmxvb3IoTWF0aC5tYXgoYSxlLmR1cmF0aW9uKSksdGhpcy5fdG90YWwrPWksdGhpcy5fbG9vcD0hIWUubG9vcCx0aGlzLl90bz1HcyhbZS50byx0LHIsZS5mcm9tXSksdGhpcy5fZnJvbT1HcyhbZS5mcm9tLHIsdF0pfX1jYW5jZWwoKXt0aGlzLl9hY3RpdmUmJih0aGlzLnRpY2soRGF0ZS5ub3coKSksdGhpcy5fYWN0aXZlPSExLHRoaXMuX25vdGlmeSghMSkpfXRpY2soZSl7bGV0IHQ9ZS10aGlzLl9zdGFydCxuPXRoaXMuX2R1cmF0aW9uLHI9dGhpcy5fcHJvcCxpPXRoaXMuX2Zyb20sYT10aGlzLl9sb29wLG89dGhpcy5fdG8scztpZih0aGlzLl9hY3RpdmU9aSE9PW8mJihhfHx0PG4pLCF0aGlzLl9hY3RpdmUpe3RoaXMuX3RhcmdldFtyXT1vLHRoaXMuX25vdGlmeSghMCk7cmV0dXJufWlmKHQ8MCl7dGhpcy5fdGFyZ2V0W3JdPWk7cmV0dXJufXM9dC9uJTIscz1hJiZzPjE/Mi1zOnMscz10aGlzLl9lYXNpbmcoTWF0aC5taW4oMSxNYXRoLm1heCgwLHMpKSksdGhpcy5fdGFyZ2V0W3JdPXRoaXMuX2ZuKGksbyxzKX13YWl0KCl7bGV0IGU9dGhpcy5fcHJvbWlzZXN8fD1bXTtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntlLnB1c2goe3Jlczp0LHJlajpufSl9KX1fbm90aWZ5KGUpe2xldCB0PWU/YHJlc2A6YHJlamAsbj10aGlzLl9wcm9taXNlc3x8W107Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXVt0XSgpfX0sVmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9jaGFydD1lLHRoaXMuX3Byb3BlcnRpZXM9bmV3IE1hcCx0aGlzLmNvbmZpZ3VyZSh0KX1jb25maWd1cmUoZSl7aWYoIUcoZSkpcmV0dXJuO2xldCB0PU9iamVjdC5rZXlzKFouYW5pbWF0aW9uKSxuPXRoaXMuX3Byb3BlcnRpZXM7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuZm9yRWFjaChyPT57bGV0IGk9ZVtyXTtpZighRyhpKSlyZXR1cm47bGV0IGE9e307Zm9yKGxldCBlIG9mIHQpYVtlXT1pW2VdOyhXKGkucHJvcGVydGllcykmJmkucHJvcGVydGllc3x8W3JdKS5mb3JFYWNoKGU9PnsoZT09PXJ8fCFuLmhhcyhlKSkmJm4uc2V0KGUsYSl9KX0pfV9hbmltYXRlT3B0aW9ucyhlLHQpe2xldCBuPXQub3B0aW9ucyxyPVVjKGUsbik7aWYoIXIpcmV0dXJuW107bGV0IGk9dGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhyLG4pO3JldHVybiBuLiRzaGFyZWQmJkhjKGUub3B0aW9ucy4kYW5pbWF0aW9ucyxuKS50aGVuKCgpPT57ZS5vcHRpb25zPW59LCgpPT57fSksaX1fY3JlYXRlQW5pbWF0aW9ucyhlLHQpe2xldCBuPXRoaXMuX3Byb3BlcnRpZXMscj1bXSxpPWUuJGFuaW1hdGlvbnN8fD17fSxhPU9iamVjdC5rZXlzKHQpLG89RGF0ZS5ub3coKSxzO2ZvcihzPWEubGVuZ3RoLTE7cz49MDstLXMpe2xldCBjPWFbc107aWYoYy5jaGFyQXQoMCk9PT1gJGApY29udGludWU7aWYoYz09PWBvcHRpb25zYCl7ci5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKGUsdCkpO2NvbnRpbnVlfWxldCBsPXRbY10sdT1pW2NdLGQ9bi5nZXQoYyk7aWYodSl7aWYoZCYmdS5hY3RpdmUoKSl7dS51cGRhdGUoZCxsLG8pO2NvbnRpbnVlfXUuY2FuY2VsKCl9aWYoIWR8fCFkLmR1cmF0aW9uKXtlW2NdPWw7Y29udGludWV9aVtjXT11PW5ldyBCYyhkLGUsYyxsKSxyLnB1c2godSl9cmV0dXJuIHJ9dXBkYXRlKGUsdCl7aWYodGhpcy5fcHJvcGVydGllcy5zaXplPT09MCl7T2JqZWN0LmFzc2lnbihlLHQpO3JldHVybn1sZXQgbj10aGlzLl9jcmVhdGVBbmltYXRpb25zKGUsdCk7aWYobi5sZW5ndGgpcmV0dXJuIExjLmFkZCh0aGlzLl9jaGFydCxuKSwhMH19O2Z1bmN0aW9uIEhjKGUsdCl7bGV0IG49W10scj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7bGV0IGk9ZVtyW3RdXTtpJiZpLmFjdGl2ZSgpJiZuLnB1c2goaS53YWl0KCkpfXJldHVybiBQcm9taXNlLmFsbChuKX1mdW5jdGlvbiBVYyhlLHQpe2lmKCF0KXJldHVybjtsZXQgbj1lLm9wdGlvbnM7aWYoIW4pe2Uub3B0aW9ucz10O3JldHVybn1yZXR1cm4gbi4kc2hhcmVkJiYoZS5vcHRpb25zPW49T2JqZWN0LmFzc2lnbih7fSxuLHskc2hhcmVkOiExLCRhbmltYXRpb25zOnt9fSkpLG59ZnVuY3Rpb24gV2MoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnN8fHt9LHI9bi5yZXZlcnNlLGk9bi5taW49PT12b2lkIDA/dDowLGE9bi5tYXg9PT12b2lkIDA/dDowO3JldHVybntzdGFydDpyP2E6aSxlbmQ6cj9pOmF9fWZ1bmN0aW9uIEdjKGUsdCxuKXtpZihuPT09ITEpcmV0dXJuITE7bGV0IHI9V2MoZSxuKSxpPVdjKHQsbik7cmV0dXJue3RvcDppLmVuZCxyaWdodDpyLmVuZCxib3R0b206aS5zdGFydCxsZWZ0OnIuc3RhcnR9fWZ1bmN0aW9uIEtjKGUpe2xldCB0LG4scixpO3JldHVybiBHKGUpPyh0PWUudG9wLG49ZS5yaWdodCxyPWUuYm90dG9tLGk9ZS5sZWZ0KTp0PW49cj1pPWUse3RvcDp0LHJpZ2h0Om4sYm90dG9tOnIsbGVmdDppLGRpc2FibGVkOmU9PT0hMX19ZnVuY3Rpb24gcWMoZSx0KXtsZXQgbj1bXSxyPWUuX2dldFNvcnRlZERhdGFzZXRNZXRhcyh0KSxpLGE7Zm9yKGk9MCxhPXIubGVuZ3RoO2k8YTsrK2kpbi5wdXNoKHJbaV0uaW5kZXgpO3JldHVybiBufWZ1bmN0aW9uIEpjKGUsdCxuLHI9e30pe2xldCBpPWUua2V5cyxhPXIubW9kZT09PWBzaW5nbGVgLG8scyxjLGw7aWYodD09PW51bGwpcmV0dXJuO2xldCB1PSExO2ZvcihvPTAscz1pLmxlbmd0aDtvPHM7KytvKXtpZihjPStpW29dLGM9PT1uKXtpZih1PSEwLHIuYWxsKWNvbnRpbnVlO2JyZWFrfWw9ZS52YWx1ZXNbY10sSyhsKSYmKGF8fHQ9PT0wfHxDbyh0KT09PUNvKGwpKSYmKHQrPWwpfXJldHVybiF1JiYhci5hbGw/MDp0fWZ1bmN0aW9uIFljKGUsdCl7bGV0e2lTY2FsZTpuLHZTY2FsZTpyfT10LGk9bi5heGlzPT09YHhgP2B4YDpgeWAsYT1yLmF4aXM9PT1geGA/YHhgOmB5YCxvPU9iamVjdC5rZXlzKGUpLHM9QXJyYXkoby5sZW5ndGgpLGMsbCx1O2ZvcihjPTAsbD1vLmxlbmd0aDtjPGw7KytjKXU9b1tjXSxzW2NdPXtbaV06dSxbYV06ZVt1XX07cmV0dXJuIHN9ZnVuY3Rpb24gWGMoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnMuc3RhY2tlZDtyZXR1cm4gbnx8bj09PXZvaWQgMCYmdC5zdGFjayE9PXZvaWQgMH1mdW5jdGlvbiBaYyhlLHQsbil7cmV0dXJuYCR7ZS5pZH0uJHt0LmlkfS4ke24uc3RhY2t8fG4udHlwZX1gfWZ1bmN0aW9uIFFjKGUpe2xldHttaW46dCxtYXg6bixtaW5EZWZpbmVkOnIsbWF4RGVmaW5lZDppfT1lLmdldFVzZXJCb3VuZHMoKTtyZXR1cm57bWluOnI/dDotMS8wLG1heDppP246MS8wfX1mdW5jdGlvbiAkYyhlLHQsbil7bGV0IHI9ZVt0XXx8KGVbdF09e30pO3JldHVybiByW25dfHwocltuXT17fSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7Zm9yKGxldCBpIG9mIHQuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMocikucmV2ZXJzZSgpKXtsZXQgdD1lW2kuaW5kZXhdO2lmKG4mJnQ+MHx8IW4mJnQ8MClyZXR1cm4gaS5pbmRleH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0bChlLHQpe2xldHtjaGFydDpuLF9jYWNoZWRNZXRhOnJ9PWUsaT1uLl9zdGFja3N8fD17fSx7aVNjYWxlOmEsdlNjYWxlOm8saW5kZXg6c309cixjPWEuYXhpcyxsPW8uYXhpcyx1PVpjKGEsbyxyKSxkPXQubGVuZ3RoLGY7Zm9yKGxldCBlPTA7ZTxkOysrZSl7bGV0IG49dFtlXSx7W2NdOmEsW2xdOmR9PW4scD1uLl9zdGFja3N8fD17fTtmPXBbbF09JGMoaSx1LGEpLGZbc109ZCxmLl90b3A9ZWwoZixvLCEwLHIudHlwZSksZi5fYm90dG9tPWVsKGYsbywhMSxyLnR5cGUpO2xldCBtPWYuX3Zpc3VhbFZhbHVlc3x8KGYuX3Zpc3VhbFZhbHVlcz17fSk7bVtzXT1kfX1mdW5jdGlvbiBubChlLHQpe2xldCBuPWUuc2NhbGVzO3JldHVybiBPYmplY3Qua2V5cyhuKS5maWx0ZXIoZT0+bltlXS5heGlzPT09dCkuc2hpZnQoKX1mdW5jdGlvbiBybChlLHQpe3JldHVybiBxcyhlLHthY3RpdmU6ITEsZGF0YXNldDp2b2lkIDAsZGF0YXNldEluZGV4OnQsaW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhc2V0YH0pfWZ1bmN0aW9uIGlsKGUsdCxuKXtyZXR1cm4gcXMoZSx7YWN0aXZlOiExLGRhdGFJbmRleDp0LHBhcnNlZDp2b2lkIDAscmF3OnZvaWQgMCxlbGVtZW50Om4saW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhYH0pfWZ1bmN0aW9uIGFsKGUsdCl7bGV0IG49ZS5jb250cm9sbGVyLmluZGV4LHI9ZS52U2NhbGUmJmUudlNjYWxlLmF4aXM7aWYocil7dHx8PWUuX3BhcnNlZDtmb3IobGV0IGUgb2YgdCl7bGV0IHQ9ZS5fc3RhY2tzO2lmKCF0fHx0W3JdPT09dm9pZCAwfHx0W3JdW25dPT09dm9pZCAwKXJldHVybjtkZWxldGUgdFtyXVtuXSx0W3JdLl92aXN1YWxWYWx1ZXMhPT12b2lkIDAmJnRbcl0uX3Zpc3VhbFZhbHVlc1tuXSE9PXZvaWQgMCYmZGVsZXRlIHRbcl0uX3Zpc3VhbFZhbHVlc1tuXX19fXZhciBvbD1lPT5lPT09YHJlc2V0YHx8ZT09PWBub25lYCxzbD0oZSx0KT0+dD9lOk9iamVjdC5hc3NpZ24oe30sZSksY2w9KGUsdCxuKT0+ZSYmIXQuaGlkZGVuJiZ0Ll9zdGFja2VkJiZ7a2V5czpxYyhuLCEwKSx2YWx1ZXM6bnVsbH0sbGw9Y2xhc3N7c3RhdGljIGRlZmF1bHRzPXt9O3N0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGU9bnVsbDtzdGF0aWMgZGF0YUVsZW1lbnRUeXBlPW51bGw7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoYXJ0PWUsdGhpcy5fY3R4PWUuY3R4LHRoaXMuaW5kZXg9dCx0aGlzLl9jYWNoZWREYXRhT3B0cz17fSx0aGlzLl9jYWNoZWRNZXRhPXRoaXMuZ2V0TWV0YSgpLHRoaXMuX3R5cGU9dGhpcy5fY2FjaGVkTWV0YS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5fcGFyc2luZz0hMSx0aGlzLl9kYXRhPXZvaWQgMCx0aGlzLl9vYmplY3REYXRhPXZvaWQgMCx0aGlzLl9zaGFyZWRPcHRpb25zPXZvaWQgMCx0aGlzLl9kcmF3U3RhcnQ9dm9pZCAwLHRoaXMuX2RyYXdDb3VudD12b2lkIDAsdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSExLHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlLHRoaXMuZGF0YUVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlLHRoaXMuaW5pdGlhbGl6ZSgpfWluaXRpYWxpemUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuY29uZmlndXJlKCksdGhpcy5saW5rU2NhbGVzKCksZS5fc3RhY2tlZD1YYyhlLnZTY2FsZSxlKSx0aGlzLmFkZEVsZW1lbnRzKCksdGhpcy5vcHRpb25zLmZpbGwmJiF0aGlzLmNoYXJ0LmlzUGx1Z2luRW5hYmxlZChgZmlsbGVyYCkmJmNvbnNvbGUud2FybihgVHJpZWQgdG8gdXNlIHRoZSAnZmlsbCcgb3B0aW9uIHdpdGhvdXQgdGhlICdGaWxsZXInIHBsdWdpbiBlbmFibGVkLiBQbGVhc2UgaW1wb3J0IGFuZCByZWdpc3RlciB0aGUgJ0ZpbGxlcicgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGRpc2FibGVkIGluIHRoZSBvcHRpb25zYCl9dXBkYXRlSW5kZXgoZSl7dGhpcy5pbmRleCE9PWUmJmFsKHRoaXMuX2NhY2hlZE1ldGEpLHRoaXMuaW5kZXg9ZX1saW5rU2NhbGVzKCl7bGV0IGU9dGhpcy5jaGFydCx0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPShlLHQsbixyKT0+ZT09PWB4YD90OmU9PT1gcmA/cjpuLGk9dC54QXhpc0lEPXEobi54QXhpc0lELG5sKGUsYHhgKSksYT10LnlBeGlzSUQ9cShuLnlBeGlzSUQsbmwoZSxgeWApKSxvPXQuckF4aXNJRD1xKG4uckF4aXNJRCxubChlLGByYCkpLHM9dC5pbmRleEF4aXMsYz10LmlBeGlzSUQ9cihzLGksYSxvKSxsPXQudkF4aXNJRD1yKHMsYSxpLG8pO3QueFNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChpKSx0LnlTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQoYSksdC5yU2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKG8pLHQuaVNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChjKSx0LnZTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQobCl9Z2V0RGF0YXNldCgpe3JldHVybiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbdGhpcy5pbmRleF19Z2V0TWV0YSgpe3JldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpfWdldFNjYWxlRm9ySWQoZSl7cmV0dXJuIHRoaXMuY2hhcnQuc2NhbGVzW2VdfV9nZXRPdGhlclNjYWxlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7cmV0dXJuIGU9PT10LmlTY2FsZT90LnZTY2FsZTp0LmlTY2FsZX1yZXNldCgpe3RoaXMuX3VwZGF0ZShgcmVzZXRgKX1fZGVzdHJveSgpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5fZGF0YSYmcW8odGhpcy5fZGF0YSx0aGlzKSxlLl9zdGFja2VkJiZhbChlKX1fZGF0YUNoZWNrKCl7bGV0IGU9dGhpcy5nZXREYXRhc2V0KCksdD1lLmRhdGF8fD1bXSxuPXRoaXMuX2RhdGE7aWYoRyh0KSl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLl9kYXRhPVljKHQsZSl9ZWxzZSBpZihuIT09dCl7aWYobil7cW8obix0aGlzKTtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO2FsKGUpLGUuX3BhcnNlZD1bXX10JiZPYmplY3QuaXNFeHRlbnNpYmxlKHQpJiZLbyh0LHRoaXMpLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuX2RhdGE9dH19YWRkRWxlbWVudHMoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuX2RhdGFDaGVjaygpLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlJiYoZS5kYXRhc2V0PW5ldyB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSl9YnVpbGRPclVwZGF0ZUVsZW1lbnRzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPSExO3RoaXMuX2RhdGFDaGVjaygpO2xldCBpPXQuX3N0YWNrZWQ7dC5fc3RhY2tlZD1YYyh0LnZTY2FsZSx0KSx0LnN0YWNrIT09bi5zdGFjayYmKHI9ITAsYWwodCksdC5zdGFjaz1uLnN0YWNrKSx0aGlzLl9yZXN5bmNFbGVtZW50cyhlKSwocnx8aSE9PXQuX3N0YWNrZWQpJiYodGwodGhpcyx0Ll9wYXJzZWQpLHQuX3N0YWNrZWQ9WGModC52U2NhbGUsdCkpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMuY2hhcnQuY29uZmlnLHQ9ZS5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpLG49ZS5nZXRPcHRpb25TY29wZXModGhpcy5nZXREYXRhc2V0KCksdCwhMCk7dGhpcy5vcHRpb25zPWUuY3JlYXRlUmVzb2x2ZXIobix0aGlzLmdldENvbnRleHQoKSksdGhpcy5fcGFyc2luZz10aGlzLm9wdGlvbnMucGFyc2luZyx0aGlzLl9jYWNoZWREYXRhT3B0cz17fX1wYXJzZShlLHQpe2xldHtfY2FjaGVkTWV0YTpuLF9kYXRhOnJ9PXRoaXMse2lTY2FsZTppLF9zdGFja2VkOmF9PW4sbz1pLmF4aXMscz1lPT09MCYmdD09PXIubGVuZ3RofHxuLl9zb3J0ZWQsYz1lPjAmJm4uX3BhcnNlZFtlLTFdLGwsdSxkO2lmKHRoaXMuX3BhcnNpbmc9PT0hMSluLl9wYXJzZWQ9cixuLl9zb3J0ZWQ9ITAsZD1yO2Vsc2V7ZD1XKHJbZV0pP3RoaXMucGFyc2VBcnJheURhdGEobixyLGUsdCk6RyhyW2VdKT90aGlzLnBhcnNlT2JqZWN0RGF0YShuLHIsZSx0KTp0aGlzLnBhcnNlUHJpbWl0aXZlRGF0YShuLHIsZSx0KTtsZXQgaT0oKT0+dVtvXT09PW51bGx8fGMmJnVbb108Y1tvXTtmb3IobD0wO2w8dDsrK2wpbi5fcGFyc2VkW2wrZV09dT1kW2xdLHMmJihpKCkmJihzPSExKSxjPXUpO24uX3NvcnRlZD1zfWEmJnRsKHRoaXMsZCl9cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSxvPWkuYXhpcyxzPWEuYXhpcyxjPWkuZ2V0TGFiZWxzKCksbD1pPT09YSx1PUFycmF5KHIpLGQsZixwO2ZvcihkPTAsZj1yO2Q8ZjsrK2QpcD1kK24sdVtkXT17W29dOmx8fGkucGFyc2UoY1twXSxwKSxbc106YS5wYXJzZSh0W3BdLHApfTtyZXR1cm4gdX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtsZXR7eFNjYWxlOmkseVNjYWxlOmF9PWUsbz1BcnJheShyKSxzLGMsbCx1O2ZvcihzPTAsYz1yO3M8YzsrK3MpbD1zK24sdT10W2xdLG9bc109e3g6aS5wYXJzZSh1WzBdLGwpLHk6YS5wYXJzZSh1WzFdLGwpfTtyZXR1cm4gb31wYXJzZU9iamVjdERhdGEoZSx0LG4scil7bGV0e3hTY2FsZTppLHlTY2FsZTphfT1lLHt4QXhpc0tleTpvPWB4YCx5QXhpc0tleTpzPWB5YH09dGhpcy5fcGFyc2luZyxjPUFycmF5KHIpLGwsdSxkLGY7Zm9yKGw9MCx1PXI7bDx1OysrbClkPWwrbixmPXRbZF0sY1tsXT17eDppLnBhcnNlKGxvKGYsbyksZCkseTphLnBhcnNlKGxvKGYscyksZCl9O3JldHVybiBjfWdldFBhcnNlZChlKXtyZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2VdfWdldERhdGFFbGVtZW50KGUpe3JldHVybiB0aGlzLl9jYWNoZWRNZXRhLmRhdGFbZV19YXBwbHlTdGFjayhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZE1ldGEsYT10W2UuYXhpc107cmV0dXJuIEpjKHtrZXlzOnFjKHIsITApLHZhbHVlczp0Ll9zdGFja3NbZS5heGlzXS5fdmlzdWFsVmFsdWVzfSxhLGkuaW5kZXgse21vZGU6bn0pfXVwZGF0ZVJhbmdlRnJvbVBhcnNlZChlLHQsbixyKXtsZXQgaT1uW3QuYXhpc10sYT1pPT09bnVsbD9OYU46aSxvPXImJm4uX3N0YWNrc1t0LmF4aXNdO3ImJm8mJihyLnZhbHVlcz1vLGE9SmMocixpLHRoaXMuX2NhY2hlZE1ldGEuaW5kZXgpKSxlLm1pbj1NYXRoLm1pbihlLm1pbixhKSxlLm1heD1NYXRoLm1heChlLm1heCxhKX1nZXRNaW5NYXgoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5fcGFyc2VkLGk9bi5fc29ydGVkJiZlPT09bi5pU2NhbGUsYT1yLmxlbmd0aCxvPXRoaXMuX2dldE90aGVyU2NhbGUoZSkscz1jbCh0LG4sdGhpcy5jaGFydCksYz17bWluOjEvMCxtYXg6LTEvMH0se21pbjpsLG1heDp1fT1RYyhvKSxkLGY7ZnVuY3Rpb24gcCgpe2Y9cltkXTtsZXQgdD1mW28uYXhpc107cmV0dXJuIUsoZltlLmF4aXNdKXx8bD50fHx1PHR9Zm9yKGQ9MDtkPGEmJiEoIXAoKSYmKHRoaXMudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGMsZSxmLHMpLGkpKTsrK2QpO2lmKGkpe2ZvcihkPWEtMTtkPj0wOy0tZClpZighcCgpKXt0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChjLGUsZixzKTticmVha319cmV0dXJuIGN9Z2V0QWxsUGFyc2VkVmFsdWVzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuX3BhcnNlZCxuPVtdLHIsaSxhO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWE9dFtyXVtlLmF4aXNdLEsoYSkmJm4ucHVzaChhKTtyZXR1cm4gbn1nZXRNYXhPdmVyZmxvdygpe3JldHVybiExfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0IHQ9dGhpcy5fY2FjaGVkTWV0YSxuPXQuaVNjYWxlLHI9dC52U2NhbGUsaT10aGlzLmdldFBhcnNlZChlKTtyZXR1cm57bGFiZWw6bj9gYCtuLmdldExhYmVsRm9yVmFsdWUoaVtuLmF4aXNdKTpgYCx2YWx1ZTpyP2BgK3IuZ2V0TGFiZWxGb3JWYWx1ZShpW3IuYXhpc10pOmBgfX1fdXBkYXRlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy51cGRhdGUoZXx8YGRlZmF1bHRgKSx0Ll9jbGlwPUtjKHEodGhpcy5vcHRpb25zLmNsaXAsR2ModC54U2NhbGUsdC55U2NhbGUsdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpfXVwZGF0ZShlKXt9ZHJhdygpe2xldCBlPXRoaXMuX2N0eCx0PXRoaXMuY2hhcnQsbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5kYXRhfHxbXSxpPXQuY2hhcnRBcmVhLGE9W10sbz10aGlzLl9kcmF3U3RhcnR8fDAscz10aGlzLl9kcmF3Q291bnR8fHIubGVuZ3RoLW8sYz10aGlzLm9wdGlvbnMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AsbDtmb3Iobi5kYXRhc2V0JiZuLmRhdGFzZXQuZHJhdyhlLGksbyxzKSxsPW87bDxvK3M7KytsKXtsZXQgdD1yW2xdO3QuaGlkZGVufHwodC5hY3RpdmUmJmM/YS5wdXNoKHQpOnQuZHJhdyhlLGkpKX1mb3IobD0wO2w8YS5sZW5ndGg7KytsKWFbbF0uZHJhdyhlLGkpfWdldFN0eWxlKGUsdCl7bGV0IG49dD9gYWN0aXZlYDpgZGVmYXVsdGA7cmV0dXJuIGU9PT12b2lkIDAmJnRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldD90aGlzLnJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMobik6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGV8fDAsbil9Z2V0Q29udGV4dChlLHQsbil7bGV0IHI9dGhpcy5nZXREYXRhc2V0KCksaTtpZihlPj0wJiZlPHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGgpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YVtlXTtpPXQuJGNvbnRleHR8fD1pbCh0aGlzLmdldENvbnRleHQoKSxlLHQpLGkucGFyc2VkPXRoaXMuZ2V0UGFyc2VkKGUpLGkucmF3PXIuZGF0YVtlXSxpLmluZGV4PWkuZGF0YUluZGV4PWV9ZWxzZSBpPXRoaXMuJGNvbnRleHR8fD1ybCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLmluZGV4KSxpLmRhdGFzZXQ9cixpLmluZGV4PWkuZGF0YXNldEluZGV4PXRoaXMuaW5kZXg7cmV0dXJuIGkuYWN0aXZlPSEhdCxpLm1vZGU9bixpfXJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCxlKX1yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGUsdCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCx0LGUpfV9yZXNvbHZlRWxlbWVudE9wdGlvbnMoZSx0PWBkZWZhdWx0YCxuKXtsZXQgcj10PT09YGFjdGl2ZWAsaT10aGlzLl9jYWNoZWREYXRhT3B0cyxhPWUrYC1gK3Qsbz1pW2FdLHM9dGhpcy5lbmFibGVPcHRpb25TaGFyaW5nJiZmbyhuKTtpZihvKXJldHVybiBzbChvLHMpO2xldCBjPXRoaXMuY2hhcnQuY29uZmlnLGw9Yy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLGUpLHU9cj9bYCR7ZX1Ib3ZlcmAsYGhvdmVyYCxlLGBgXTpbZSxgYF0sZD1jLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxsKSxmPU9iamVjdC5rZXlzKFouZWxlbWVudHNbZV0pLHA9Yy5yZXNvbHZlTmFtZWRPcHRpb25zKGQsZiwoKT0+dGhpcy5nZXRDb250ZXh0KG4scix0KSx1KTtyZXR1cm4gcC4kc2hhcmVkJiYocC4kc2hhcmVkPXMsaVthXT1PYmplY3QuZnJlZXplKHNsKHAscykpKSxwfV9yZXNvbHZlQW5pbWF0aW9ucyhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZERhdGFPcHRzLGE9YGFuaW1hdGlvbi0ke3R9YCxvPWlbYV07aWYobylyZXR1cm4gbztsZXQgcztpZihyLm9wdGlvbnMuYW5pbWF0aW9uIT09ITEpe2xldCByPXRoaXMuY2hhcnQuY29uZmlnLGk9ci5kYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKHRoaXMuX3R5cGUsdCksYT1yLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxpKTtzPXIuY3JlYXRlUmVzb2x2ZXIoYSx0aGlzLmdldENvbnRleHQoZSxuLHQpKX1sZXQgYz1uZXcgVmMocixzJiZzLmFuaW1hdGlvbnMpO3JldHVybiBzJiZzLl9jYWNoZWFibGUmJihpW2FdPU9iamVjdC5mcmVlemUoYykpLGN9Z2V0U2hhcmVkT3B0aW9ucyhlKXtpZihlLiRzaGFyZWQpcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnN8fD1PYmplY3QuYXNzaWduKHt9LGUpfWluY2x1ZGVPcHRpb25zKGUsdCl7cmV0dXJuIXR8fG9sKGUpfHx0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWR9X2dldFNoYXJlZE9wdGlvbnMoZSx0KXtsZXQgbj10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZSx0KSxyPXRoaXMuX3NoYXJlZE9wdGlvbnMsaT10aGlzLmdldFNoYXJlZE9wdGlvbnMobiksYT10aGlzLmluY2x1ZGVPcHRpb25zKHQsaSl8fGkhPT1yO3JldHVybiB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoaSx0LG4pLHtzaGFyZWRPcHRpb25zOmksaW5jbHVkZU9wdGlvbnM6YX19dXBkYXRlRWxlbWVudChlLHQsbixyKXtvbChyKT9PYmplY3QuYXNzaWduKGUsbik6dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxyKS51cGRhdGUoZSxuKX11cGRhdGVTaGFyZWRPcHRpb25zKGUsdCxuKXtlJiYhb2wodCkmJnRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCx0KS51cGRhdGUoZSxuKX1fc2V0U3R5bGUoZSx0LG4scil7ZS5hY3RpdmU9cjtsZXQgaT10aGlzLmdldFN0eWxlKHQscik7dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxuLHIpLnVwZGF0ZShlLHtvcHRpb25zOiFyJiZ0aGlzLmdldFNoYXJlZE9wdGlvbnMoaSl8fGl9KX1yZW1vdmVIb3ZlclN0eWxlKGUsdCxuKXt0aGlzLl9zZXRTdHlsZShlLG4sYGFjdGl2ZWAsITEpfXNldEhvdmVyU3R5bGUoZSx0LG4pe3RoaXMuX3NldFN0eWxlKGUsbixgYWN0aXZlYCwhMCl9X3JlbW92ZURhdGFzZXRIb3ZlclN0eWxlKCl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O2UmJnRoaXMuX3NldFN0eWxlKGUsdm9pZCAwLGBhY3RpdmVgLCExKX1fc2V0RGF0YXNldEhvdmVyU3R5bGUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7ZSYmdGhpcy5fc2V0U3R5bGUoZSx2b2lkIDAsYGFjdGl2ZWAsITApfV9yZXN5bmNFbGVtZW50cyhlKXtsZXQgdD10aGlzLl9kYXRhLG49dGhpcy5fY2FjaGVkTWV0YS5kYXRhO2ZvcihsZXRbZSx0LG5db2YgdGhpcy5fc3luY0xpc3QpdGhpc1tlXSh0LG4pO3RoaXMuX3N5bmNMaXN0PVtdO2xldCByPW4ubGVuZ3RoLGk9dC5sZW5ndGgsYT1NYXRoLm1pbihpLHIpO2EmJnRoaXMucGFyc2UoMCxhKSxpPnI/dGhpcy5faW5zZXJ0RWxlbWVudHMocixpLXIsZSk6aTxyJiZ0aGlzLl9yZW1vdmVFbGVtZW50cyhpLHItaSl9X2luc2VydEVsZW1lbnRzKGUsdCxuPSEwKXtsZXQgcj10aGlzLl9jYWNoZWRNZXRhLGk9ci5kYXRhLGE9ZSt0LG8scz1lPT57Zm9yKGUubGVuZ3RoKz10LG89ZS5sZW5ndGgtMTtvPj1hO28tLSllW29dPWVbby10XX07Zm9yKHMoaSksbz1lO288YTsrK28paVtvXT1uZXcgdGhpcy5kYXRhRWxlbWVudFR5cGU7dGhpcy5fcGFyc2luZyYmcyhyLl9wYXJzZWQpLHRoaXMucGFyc2UoZSx0KSxuJiZ0aGlzLnVwZGF0ZUVsZW1lbnRzKGksZSx0LGByZXNldGApfXVwZGF0ZUVsZW1lbnRzKGUsdCxuLHIpe31fcmVtb3ZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhO2lmKHRoaXMuX3BhcnNpbmcpe2xldCByPW4uX3BhcnNlZC5zcGxpY2UoZSx0KTtuLl9zdGFja2VkJiZhbChuLHIpfW4uZGF0YS5zcGxpY2UoZSx0KX1fc3luYyhlKXtpZih0aGlzLl9wYXJzaW5nKXRoaXMuX3N5bmNMaXN0LnB1c2goZSk7ZWxzZXtsZXRbdCxuLHJdPWU7dGhpc1t0XShuLHIpfXRoaXMuY2hhcnQuX2RhdGFDaGFuZ2VzLnB1c2goW3RoaXMuaW5kZXgsLi4uZV0pfV9vbkRhdGFQdXNoKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aDt0aGlzLl9zeW5jKFtgX2luc2VydEVsZW1lbnRzYCx0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aC1lLGVdKX1fb25EYXRhUG9wKCl7dGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aC0xLDFdKX1fb25EYXRhU2hpZnQoKXt0aGlzLl9zeW5jKFtgX3JlbW92ZUVsZW1lbnRzYCwwLDFdKX1fb25EYXRhU3BsaWNlKGUsdCl7dCYmdGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsZSx0XSk7bGV0IG49YXJndW1lbnRzLmxlbmd0aC0yO24mJnRoaXMuX3N5bmMoW2BfaW5zZXJ0RWxlbWVudHNgLGUsbl0pfV9vbkRhdGFVbnNoaWZ0KCl7dGhpcy5fc3luYyhbYF9pbnNlcnRFbGVtZW50c2AsMCxhcmd1bWVudHMubGVuZ3RoXSl9fTtmdW5jdGlvbiB1bChlLHQpe2lmKCFlLl9jYWNoZS4kYmFyKXtsZXQgbj1lLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHQpLHI9W107Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKXI9ci5jb25jYXQoblt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhlKSk7ZS5fY2FjaGUuJGJhcj1KbyhyLnNvcnQoKGUsdCk9PmUtdCkpfXJldHVybiBlLl9jYWNoZS4kYmFyfWZ1bmN0aW9uIGRsKGUpe2xldCB0PWUuaVNjYWxlLG49dWwodCxlLnR5cGUpLHI9dC5fbGVuZ3RoLGksYSxvLHMsYz0oKT0+e28hPT0zMjc2NyYmbyE9PS0zMjc2OCYmKGZvKHMpJiYocj1NYXRoLm1pbihyLE1hdGguYWJzKG8tcyl8fHIpKSxzPW8pfTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhOysraSlvPXQuZ2V0UGl4ZWxGb3JWYWx1ZShuW2ldKSxjKCk7Zm9yKHM9dm9pZCAwLGk9MCxhPXQudGlja3MubGVuZ3RoO2k8YTsrK2kpbz10LmdldFBpeGVsRm9yVGljayhpKSxjKCk7cmV0dXJuIHJ9ZnVuY3Rpb24gZmwoZSx0LG4scil7bGV0IGk9bi5iYXJUaGlja25lc3MsYSxvO3JldHVybiBVKGkpPyhhPXQubWluKm4uY2F0ZWdvcnlQZXJjZW50YWdlLG89bi5iYXJQZXJjZW50YWdlKTooYT1pKnIsbz0xKSx7Y2h1bms6YS9yLHJhdGlvOm8sc3RhcnQ6dC5waXhlbHNbZV0tYS8yfX1mdW5jdGlvbiBwbChlLHQsbixyKXtsZXQgaT10LnBpeGVscyxhPWlbZV0sbz1lPjA/aVtlLTFdOm51bGwscz1lPGkubGVuZ3RoLTE/aVtlKzFdOm51bGwsYz1uLmNhdGVnb3J5UGVyY2VudGFnZTtvPT09bnVsbCYmKG89YS0ocz09PW51bGw/dC5lbmQtdC5zdGFydDpzLWEpKSxzPT09bnVsbCYmKHM9YSthLW8pO2xldCBsPWEtKGEtTWF0aC5taW4obyxzKSkvMipjO3JldHVybntjaHVuazpNYXRoLmFicyhzLW8pLzIqYy9yLHJhdGlvOm4uYmFyUGVyY2VudGFnZSxzdGFydDpsfX1mdW5jdGlvbiBtbChlLHQsbixyKXtsZXQgaT1uLnBhcnNlKGVbMF0sciksYT1uLnBhcnNlKGVbMV0sciksbz1NYXRoLm1pbihpLGEpLHM9TWF0aC5tYXgoaSxhKSxjPW8sbD1zO01hdGguYWJzKG8pPk1hdGguYWJzKHMpJiYoYz1zLGw9byksdFtuLmF4aXNdPWwsdC5fY3VzdG9tPXtiYXJTdGFydDpjLGJhckVuZDpsLHN0YXJ0OmksZW5kOmEsbWluOm8sbWF4OnN9fWZ1bmN0aW9uIGhsKGUsdCxuLHIpe3JldHVybiBXKGUpP21sKGUsdCxuLHIpOnRbbi5heGlzXT1uLnBhcnNlKGUsciksdH1mdW5jdGlvbiBnbChlLHQsbixyKXtsZXQgaT1lLmlTY2FsZSxhPWUudlNjYWxlLG89aS5nZXRMYWJlbHMoKSxzPWk9PT1hLGM9W10sbCx1LGQsZjtmb3IobD1uLHU9bityO2w8dTsrK2wpZj10W2xdLGQ9e30sZFtpLmF4aXNdPXN8fGkucGFyc2Uob1tsXSxsKSxjLnB1c2goaGwoZixkLGEsbCkpO3JldHVybiBjfWZ1bmN0aW9uIF9sKGUpe3JldHVybiBlJiZlLmJhclN0YXJ0IT09dm9pZCAwJiZlLmJhckVuZCE9PXZvaWQgMH1mdW5jdGlvbiB2bChlLHQsbil7cmV0dXJuIGU9PT0wPyh0LmlzSG9yaXpvbnRhbCgpPzE6LTEpKih0Lm1pbj49bj8xOi0xKTpDbyhlKX1mdW5jdGlvbiB5bChlKXtsZXQgdCxuLHIsaSxhO3JldHVybiBlLmhvcml6b250YWw/KHQ9ZS5iYXNlPmUueCxuPWBsZWZ0YCxyPWByaWdodGApOih0PWUuYmFzZTxlLnksbj1gYm90dG9tYCxyPWB0b3BgKSx0PyhpPWBlbmRgLGE9YHN0YXJ0YCk6KGk9YHN0YXJ0YCxhPWBlbmRgKSx7c3RhcnQ6bixlbmQ6cixyZXZlcnNlOnQsdG9wOmksYm90dG9tOmF9fWZ1bmN0aW9uIGJsKGUsdCxuLHIpe2xldCBpPXQuYm9yZGVyU2tpcHBlZCxhPXt9O2lmKCFpKXtlLmJvcmRlclNraXBwZWQ9YTtyZXR1cm59aWYoaT09PSEwKXtlLmJvcmRlclNraXBwZWQ9e3RvcDohMCxyaWdodDohMCxib3R0b206ITAsbGVmdDohMH07cmV0dXJufWxldHtzdGFydDpvLGVuZDpzLHJldmVyc2U6Yyx0b3A6bCxib3R0b206dX09eWwoZSk7aT09PWBtaWRkbGVgJiZuJiYoZS5lbmFibGVCb3JkZXJSYWRpdXM9ITAsKG4uX3RvcHx8MCk9PT1yP2k9bDoobi5fYm90dG9tfHwwKT09PXI/aT11OihhW3hsKHUsbyxzLGMpXT0hMCxpPWwpKSxhW3hsKGksbyxzLGMpXT0hMCxlLmJvcmRlclNraXBwZWQ9YX1mdW5jdGlvbiB4bChlLHQsbixyKXtyZXR1cm4gcj8oZT1TbChlLHQsbiksZT1DbChlLG4sdCkpOmU9Q2woZSx0LG4pLGV9ZnVuY3Rpb24gU2woZSx0LG4pe3JldHVybiBlPT09dD9uOmU9PT1uP3Q6ZX1mdW5jdGlvbiBDbChlLHQsbil7cmV0dXJuIGU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246ZX1mdW5jdGlvbiB3bChlLHtpbmZsYXRlQW1vdW50OnR9LG4pe2UuaW5mbGF0ZUFtb3VudD10PT09YGF1dG9gP249PT0xPy4zMzowOnR9dmFyIFRsPWNsYXNzIGV4dGVuZHMgbGx7c3RhdGljIGlkPWBiYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiExLGRhdGFFbGVtZW50VHlwZTpgYmFyYCxjYXRlZ29yeVBlcmNlbnRhZ2U6LjgsYmFyUGVyY2VudGFnZTouOSxncm91cGVkOiEwLGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgYmFzZWAsYHdpZHRoYCxgaGVpZ2h0YF19fX07c3RhdGljIG92ZXJyaWRlcz17c2NhbGVzOntfaW5kZXhfOnt0eXBlOmBjYXRlZ29yeWAsb2Zmc2V0OiEwLGdyaWQ6e29mZnNldDohMH19LF92YWx1ZV86e3R5cGU6YGxpbmVhcmAsYmVnaW5BdFplcm86ITB9fX07cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe3JldHVybiBnbChlLHQsbixyKX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtyZXR1cm4gZ2woZSx0LG4scil9cGFyc2VPYmplY3REYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSx7eEF4aXNLZXk6bz1geGAseUF4aXNLZXk6cz1geWB9PXRoaXMuX3BhcnNpbmcsYz1pLmF4aXM9PT1geGA/bzpzLGw9YS5heGlzPT09YHhgP286cyx1PVtdLGQsZixwLG07Zm9yKGQ9bixmPW4rcjtkPGY7KytkKW09dFtkXSxwPXt9LHBbaS5heGlzXT1pLnBhcnNlKGxvKG0sYyksZCksdS5wdXNoKGhsKGxvKG0sbCkscCxhLGQpKTtyZXR1cm4gdX11cGRhdGVSYW5nZUZyb21QYXJzZWQoZSx0LG4scil7c3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGUsdCxuLHIpO2xldCBpPW4uX2N1c3RvbTtpJiZ0PT09dGhpcy5fY2FjaGVkTWV0YS52U2NhbGUmJihlLm1pbj1NYXRoLm1pbihlLm1pbixpLm1pbiksZS5tYXg9TWF0aC5tYXgoZS5tYXgsaS5tYXgpKX1nZXRNYXhPdmVyZmxvdygpe3JldHVybiAwfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0e2lTY2FsZTp0LHZTY2FsZTpufT10aGlzLl9jYWNoZWRNZXRhLHI9dGhpcy5nZXRQYXJzZWQoZSksaT1yLl9jdXN0b20sYT1fbChpKT9gW2AraS5zdGFydCtgLCBgK2kuZW5kK2BdYDpgYCtuLmdldExhYmVsRm9yVmFsdWUocltuLmF4aXNdKTtyZXR1cm57bGFiZWw6YGArdC5nZXRMYWJlbEZvclZhbHVlKHJbdC5heGlzXSksdmFsdWU6YX19aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCk7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTtlLnN0YWNrPXRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrfXVwZGF0ZShlKXtsZXQgdD10aGlzLl9jYWNoZWRNZXRhO3RoaXMudXBkYXRlRWxlbWVudHModC5kYXRhLDAsdC5kYXRhLmxlbmd0aCxlKX11cGRhdGVFbGVtZW50cyhlLHQsbixyKXtsZXQgaT1yPT09YHJlc2V0YCx7aW5kZXg6YSxfY2FjaGVkTWV0YTp7dlNjYWxlOm99fT10aGlzLHM9by5nZXRCYXNlUGl4ZWwoKSxjPW8uaXNIb3Jpem9udGFsKCksbD10aGlzLl9nZXRSdWxlcigpLHtzaGFyZWRPcHRpb25zOnUsaW5jbHVkZU9wdGlvbnM6ZH09dGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyh0LHIpO2ZvcihsZXQgZj10O2Y8dCtuO2YrKyl7bGV0IHQ9dGhpcy5nZXRQYXJzZWQoZiksbj1pfHxVKHRbby5heGlzXSk/e2Jhc2U6cyxoZWFkOnN9OnRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGYpLHA9dGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoZixsKSxtPSh0Ll9zdGFja3N8fHt9KVtvLmF4aXNdLGg9e2hvcml6b250YWw6YyxiYXNlOm4uYmFzZSxlbmFibGVCb3JkZXJSYWRpdXM6IW18fF9sKHQuX2N1c3RvbSl8fGE9PT1tLl90b3B8fGE9PT1tLl9ib3R0b20seDpjP24uaGVhZDpwLmNlbnRlcix5OmM/cC5jZW50ZXI6bi5oZWFkLGhlaWdodDpjP3Auc2l6ZTpNYXRoLmFicyhuLnNpemUpLHdpZHRoOmM/TWF0aC5hYnMobi5zaXplKTpwLnNpemV9O2QmJihoLm9wdGlvbnM9dXx8dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGYsZVtmXS5hY3RpdmU/YGFjdGl2ZWA6cikpO2xldCBnPWgub3B0aW9uc3x8ZVtmXS5vcHRpb25zO2JsKGgsZyxtLGEpLHdsKGgsZyxsLnJhdGlvKSx0aGlzLnVwZGF0ZUVsZW1lbnQoZVtmXSxmLGgscil9fV9nZXRTdGFja3MoZSx0KXtsZXR7aVNjYWxlOm59PXRoaXMuX2NhY2hlZE1ldGEscj1uLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHRoaXMuX3R5cGUpLmZpbHRlcihlPT5lLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKSxpPW4ub3B0aW9ucy5zdGFja2VkLGE9W10sbz10aGlzLl9jYWNoZWRNZXRhLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKHQpLHM9byYmb1tuLmF4aXNdLGM9ZT0+e2xldCB0PWUuX3BhcnNlZC5maW5kKGU9PmVbbi5heGlzXT09PXMpLHI9dCYmdFtlLnZTY2FsZS5heGlzXTtpZihVKHIpfHxpc05hTihyKSlyZXR1cm4hMH07Zm9yKGxldCBuIG9mIHIpaWYoISh0IT09dm9pZCAwJiZjKG4pKSYmKChpPT09ITF8fGEuaW5kZXhPZihuLnN0YWNrKT09PS0xfHxpPT09dm9pZCAwJiZuLnN0YWNrPT09dm9pZCAwKSYmYS5wdXNoKG4uc3RhY2spLG4uaW5kZXg9PT1lKSlicmVhaztyZXR1cm4gYS5sZW5ndGh8fGEucHVzaCh2b2lkIDApLGF9X2dldFN0YWNrQ291bnQoZSl7cmV0dXJuIHRoaXMuX2dldFN0YWNrcyh2b2lkIDAsZSkubGVuZ3RofV9nZXRBeGlzQ291bnQoKXtyZXR1cm4gdGhpcy5fZ2V0QXhpcygpLmxlbmd0aH1nZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKXtsZXQgZT10aGlzLmNoYXJ0LnNjYWxlcyx0PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZpbHRlcihuPT5lW25dLmF4aXM9PT10KS5zaGlmdCgpfV9nZXRBeGlzKCl7bGV0IGU9e30sdD10aGlzLmdldEZpcnN0U2NhbGVJZEZvckluZGV4QXhpcygpO2ZvcihsZXQgbiBvZiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpZVtxKHRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/bi54QXhpc0lEOm4ueUF4aXNJRCx0KV09ITA7cmV0dXJuIE9iamVjdC5rZXlzKGUpfV9nZXRTdGFja0luZGV4KGUsdCxuKXtsZXQgcj10aGlzLl9nZXRTdGFja3MoZSxuKSxpPXQ9PT12b2lkIDA/LTE6ci5pbmRleE9mKHQpO3JldHVybiBpPT09LTE/ci5sZW5ndGgtMTppfV9nZXRSdWxlcigpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2NhY2hlZE1ldGEsbj10LmlTY2FsZSxyPVtdLGksYTtmb3IoaT0wLGE9dC5kYXRhLmxlbmd0aDtpPGE7KytpKXIucHVzaChuLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbbi5heGlzXSxpKSk7bGV0IG89ZS5iYXJUaGlja25lc3M7cmV0dXJue21pbjpvfHxkbCh0KSxwaXhlbHM6cixzdGFydDpuLl9zdGFydFBpeGVsLGVuZDpuLl9lbmRQaXhlbCxzdGFja0NvdW50OnRoaXMuX2dldFN0YWNrQ291bnQoKSxzY2FsZTpuLGdyb3VwZWQ6ZS5ncm91cGVkLHJhdGlvOm8/MTplLmNhdGVnb3J5UGVyY2VudGFnZSplLmJhclBlcmNlbnRhZ2V9fV9jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhlKXtsZXR7X2NhY2hlZE1ldGE6e3ZTY2FsZTp0LF9zdGFja2VkOm4saW5kZXg6cn0sb3B0aW9uczp7YmFzZTppLG1pbkJhckxlbmd0aDphfX09dGhpcyxvPWl8fDAscz10aGlzLmdldFBhcnNlZChlKSxjPXMuX2N1c3RvbSxsPV9sKGMpLHU9c1t0LmF4aXNdLGQ9MCxmPW4/dGhpcy5hcHBseVN0YWNrKHQscyxuKTp1LHAsbTtmIT09dSYmKGQ9Zi11LGY9dSksbCYmKHU9Yy5iYXJTdGFydCxmPWMuYmFyRW5kLWMuYmFyU3RhcnQsdSE9PTAmJkNvKHUpIT09Q28oYy5iYXJFbmQpJiYoZD0wKSxkKz11KTtsZXQgaD0hVShpKSYmIWw/aTpkLGc9dC5nZXRQaXhlbEZvclZhbHVlKGgpO2lmKHA9dGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShlKT90LmdldFBpeGVsRm9yVmFsdWUoZCtmKTpnLG09cC1nLE1hdGguYWJzKG0pPGEpe209dmwobSx0LG8pKmEsdT09PW8mJihnLT1tLzIpO2xldCBlPXQuZ2V0UGl4ZWxGb3JEZWNpbWFsKDApLGk9dC5nZXRQaXhlbEZvckRlY2ltYWwoMSk7Zz1NYXRoLm1heChNYXRoLm1pbihnLE1hdGgubWF4KGUsaSkpLE1hdGgubWluKGUsaSkpLHA9ZyttLG4mJiFsJiYocy5fc3RhY2tzW3QuYXhpc10uX3Zpc3VhbFZhbHVlc1tyXT10LmdldFZhbHVlRm9yUGl4ZWwocCktdC5nZXRWYWx1ZUZvclBpeGVsKGcpKX1pZihnPT09dC5nZXRQaXhlbEZvclZhbHVlKG8pKXtsZXQgZT1DbyhtKSp0LmdldExpbmVXaWR0aEZvclZhbHVlKG8pLzI7Zys9ZSxtLT1lfXJldHVybntzaXplOm0sYmFzZTpnLGhlYWQ6cCxjZW50ZXI6cCttLzJ9fV9jYWxjdWxhdGVCYXJJbmRleFBpeGVscyhlLHQpe2xldCBuPXQuc2NhbGUscj10aGlzLm9wdGlvbnMsaT1yLnNraXBOdWxsLGE9cShyLm1heEJhclRoaWNrbmVzcywxLzApLG8scyxjPXRoaXMuX2dldEF4aXNDb3VudCgpO2lmKHQuZ3JvdXBlZCl7bGV0IG49aT90aGlzLl9nZXRTdGFja0NvdW50KGUpOnQuc3RhY2tDb3VudCxsPXIuYmFyVGhpY2tuZXNzPT09YGZsZXhgP3BsKGUsdCxyLG4qYyk6ZmwoZSx0LHIsbipjKSx1PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/dGhpcy5nZXREYXRhc2V0KCkueEF4aXNJRDp0aGlzLmdldERhdGFzZXQoKS55QXhpc0lELGQ9dGhpcy5fZ2V0QXhpcygpLmluZGV4T2YocSh1LHRoaXMuZ2V0Rmlyc3RTY2FsZUlkRm9ySW5kZXhBeGlzKCkpKSxmPXRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCx0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLGk/ZTp2b2lkIDApK2Q7bz1sLnN0YXJ0K2wuY2h1bmsqZitsLmNodW5rLzIscz1NYXRoLm1pbihhLGwuY2h1bmsqbC5yYXRpbyl9ZWxzZSBvPW4uZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChlKVtuLmF4aXNdLGUpLHM9TWF0aC5taW4oYSx0Lm1pbip0LnJhdGlvKTtyZXR1cm57YmFzZTpvLXMvMixoZWFkOm8rcy8yLGNlbnRlcjpvLHNpemU6c319ZHJhdygpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGEsdD1lLnZTY2FsZSxuPWUuZGF0YSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdGhpcy5nZXRQYXJzZWQoaSlbdC5heGlzXSE9PW51bGwmJiFuW2ldLmhpZGRlbiYmbltpXS5kcmF3KHRoaXMuX2N0eCl9fTtmdW5jdGlvbiBFbCgpe3Rocm93IEVycm9yKGBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuYCl9dmFyIERsPXtfZGF0ZTpjbGFzcyBle3N0YXRpYyBvdmVycmlkZSh0KXtPYmplY3QuYXNzaWduKGUucHJvdG90eXBlLHQpfW9wdGlvbnM7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fHt9fWluaXQoKXt9Zm9ybWF0cygpe3JldHVybiBFbCgpfXBhcnNlKCl7cmV0dXJuIEVsKCl9Zm9ybWF0KCl7cmV0dXJuIEVsKCl9YWRkKCl7cmV0dXJuIEVsKCl9ZGlmZigpe3JldHVybiBFbCgpfXN0YXJ0T2YoKXtyZXR1cm4gRWwoKX1lbmRPZigpe3JldHVybiBFbCgpfX19O2Z1bmN0aW9uIE9sKGUsdCxuLHIpe2xldHtjb250cm9sbGVyOmksZGF0YTphLF9zb3J0ZWQ6b309ZSxzPWkuX2NhY2hlZE1ldGEuaVNjYWxlLGM9ZS5kYXRhc2V0JiZlLmRhdGFzZXQub3B0aW9ucz9lLmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwczpudWxsO2lmKHMmJnQ9PT1zLmF4aXMmJnQhPT1gcmAmJm8mJmEubGVuZ3RoKXtsZXQgbz1zLl9yZXZlcnNlUGl4ZWxzP1VvOkhvO2lmKCFyKXtsZXQgcj1vKGEsdCxuKTtpZihjKXtsZXR7dlNjYWxlOnR9PWkuX2NhY2hlZE1ldGEse19wYXJzZWQ6bn09ZSxhPW4uc2xpY2UoMCxyLmxvKzEpLnJldmVyc2UoKS5maW5kSW5kZXgoZT0+IVUoZVt0LmF4aXNdKSk7ci5sby09TWF0aC5tYXgoMCxhKTtsZXQgbz1uLnNsaWNlKHIuaGkpLmZpbmRJbmRleChlPT4hVShlW3QuYXhpc10pKTtyLmhpKz1NYXRoLm1heCgwLG8pfXJldHVybiByfWlmKGkuX3NoYXJlZE9wdGlvbnMpe2xldCBlPWFbMF0scj10eXBlb2YgZS5nZXRSYW5nZT09YGZ1bmN0aW9uYCYmZS5nZXRSYW5nZSh0KTtpZihyKXtsZXQgZT1vKGEsdCxuLXIpLGk9byhhLHQsbityKTtyZXR1cm57bG86ZS5sbyxoaTppLmhpfX19fXJldHVybntsbzowLGhpOmEubGVuZ3RoLTF9fWZ1bmN0aW9uIGtsKGUsdCxuLHIsaSl7bGV0IGE9ZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCksbz1uW3RdO2ZvcihsZXQgZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7bGV0e2luZGV4Om4sZGF0YTpzfT1hW2VdLHtsbzpjLGhpOmx9PU9sKGFbZV0sdCxvLGkpO2ZvcihsZXQgZT1jO2U8PWw7KytlKXtsZXQgdD1zW2VdO3Quc2tpcHx8cih0LG4sZSl9fX1mdW5jdGlvbiBBbChlKXtsZXQgdD1lLmluZGV4T2YoYHhgKSE9PS0xLG49ZS5pbmRleE9mKGB5YCkhPT0tMTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtsZXQgaT10P01hdGguYWJzKGUueC1yLngpOjAsYT1uP01hdGguYWJzKGUueS1yLnkpOjA7cmV0dXJuIE1hdGguc3FydChpKioyK2EqKjIpfX1mdW5jdGlvbiBqbChlLHQsbixyLGkpe2xldCBhPVtdO3JldHVybiFpJiYhZS5pc1BvaW50SW5BcmVhKHQpfHxrbChlLG4sdCxmdW5jdGlvbihuLG8scyl7IWkmJiFBcyhuLGUuY2hhcnRBcmVhLDApfHxuLmluUmFuZ2UodC54LHQueSxyKSYmYS5wdXNoKHtlbGVtZW50Om4sZGF0YXNldEluZGV4Om8saW5kZXg6c30pfSwhMCksYX1mdW5jdGlvbiBNbChlLHQsbixyKXtsZXQgaT1bXTtmdW5jdGlvbiBhKGUsbixhKXtsZXR7c3RhcnRBbmdsZTpvLGVuZEFuZ2xlOnN9PWUuZ2V0UHJvcHMoW2BzdGFydEFuZ2xlYCxgZW5kQW5nbGVgXSxyKSx7YW5nbGU6Y309UG8oZSx7eDp0LngseTp0Lnl9KTtMbyhjLG8scykmJmkucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpuLGluZGV4OmF9KX1yZXR1cm4ga2woZSxuLHQsYSksaX1mdW5jdGlvbiBObChlLHQsbixyLGksYSl7bGV0IG89W10scz1BbChuKSxjPTEvMDtmdW5jdGlvbiBsKG4sbCx1KXtsZXQgZD1uLmluUmFuZ2UodC54LHQueSxpKTtpZihyJiYhZClyZXR1cm47bGV0IGY9bi5nZXRDZW50ZXJQb2ludChpKTtpZighKGF8fGUuaXNQb2ludEluQXJlYShmKSkmJiFkKXJldHVybjtsZXQgcD1zKHQsZik7cDxjPyhvPVt7ZWxlbWVudDpuLGRhdGFzZXRJbmRleDpsLGluZGV4OnV9XSxjPXApOnA9PT1jJiZvLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6bCxpbmRleDp1fSl9cmV0dXJuIGtsKGUsbix0LGwpLG99ZnVuY3Rpb24gUGwoZSx0LG4scixpLGEpe3JldHVybiFhJiYhZS5pc1BvaW50SW5BcmVhKHQpP1tdOm49PT1gcmAmJiFyP01sKGUsdCxuLGkpOk5sKGUsdCxuLHIsaSxhKX1mdW5jdGlvbiBGbChlLHQsbixyLGkpe2xldCBhPVtdLG89bj09PWB4YD9gaW5YUmFuZ2VgOmBpbllSYW5nZWAscz0hMTtyZXR1cm4ga2woZSxuLHQsKGUscixjKT0+e2Vbb10mJmVbb10odFtuXSxpKSYmKGEucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpyLGluZGV4OmN9KSxzfHw9ZS5pblJhbmdlKHQueCx0LnksaSkpfSksciYmIXM/W106YX12YXIgSWw9e2V2YWx1YXRlSW50ZXJhY3Rpb25JdGVtczprbCxtb2Rlczp7aW5kZXgoZSx0LG4scil7bGV0IGk9U2ModCxlKSxhPW4uYXhpc3x8YHhgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKSxjPVtdO3JldHVybiBzLmxlbmd0aD8oZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkuZm9yRWFjaChlPT57bGV0IHQ9c1swXS5pbmRleCxuPWUuZGF0YVt0XTtuJiYhbi5za2lwJiZjLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6ZS5pbmRleCxpbmRleDp0fSl9KSxjKTpbXX0sZGF0YXNldChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKTtpZihzLmxlbmd0aD4wKXtsZXQgdD1zWzBdLmRhdGFzZXRJbmRleCxuPWUuZ2V0RGF0YXNldE1ldGEodCkuZGF0YTtzPVtdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXMucHVzaCh7ZWxlbWVudDpuW2VdLGRhdGFzZXRJbmRleDp0LGluZGV4OmV9KX1yZXR1cm4gc30scG9pbnQoZSx0LG4scil7cmV0dXJuIGpsKGUsU2ModCxlKSxuLmF4aXN8fGB4eWAscixuLmluY2x1ZGVJbnZpc2libGV8fCExKX0sbmVhcmVzdChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMTtyZXR1cm4gUGwoZSxpLGEsbi5pbnRlcnNlY3QscixvKX0seChlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB4YCxuLmludGVyc2VjdCxyKX0seShlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB5YCxuLmludGVyc2VjdCxyKX19fSxMbD1bYGxlZnRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWBdO2Z1bmN0aW9uIFJsKGUsdCl7cmV0dXJuIGUuZmlsdGVyKGU9PmUucG9zPT09dCl9ZnVuY3Rpb24gemwoZSx0KXtyZXR1cm4gZS5maWx0ZXIoZT0+TGwuaW5kZXhPZihlLnBvcyk9PT0tMSYmZS5ib3guYXhpcz09PXQpfWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIGUuc29ydCgoZSxuKT0+e2xldCByPXQ/bjplLGk9dD9lOm47cmV0dXJuIHIud2VpZ2h0PT09aS53ZWlnaHQ/ci5pbmRleC1pLmluZGV4OnIud2VpZ2h0LWkud2VpZ2h0fSl9ZnVuY3Rpb24gVmwoZSl7bGV0IHQ9W10sbixyLGksYSxvLHM7Zm9yKG49MCxyPShlfHxbXSkubGVuZ3RoO248cjsrK24paT1lW25dLHtwb3NpdGlvbjphLG9wdGlvbnM6e3N0YWNrOm8sc3RhY2tXZWlnaHQ6cz0xfX09aSx0LnB1c2goe2luZGV4Om4sYm94OmkscG9zOmEsaG9yaXpvbnRhbDppLmlzSG9yaXpvbnRhbCgpLHdlaWdodDppLndlaWdodCxzdGFjazpvJiZhK28sc3RhY2tXZWlnaHQ6c30pO3JldHVybiB0fWZ1bmN0aW9uIEhsKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBvZiBlKXtsZXR7c3RhY2s6ZSxwb3M6cixzdGFja1dlaWdodDppfT1uO2lmKCFlfHwhTGwuaW5jbHVkZXMocikpY29udGludWU7bGV0IGE9dFtlXXx8KHRbZV09e2NvdW50OjAscGxhY2VkOjAsd2VpZ2h0OjAsc2l6ZTowfSk7YS5jb3VudCsrLGEud2VpZ2h0Kz1pfXJldHVybiB0fWZ1bmN0aW9uIFVsKGUsdCl7bGV0IG49SGwoZSkse3ZCb3hNYXhXaWR0aDpyLGhCb3hNYXhIZWlnaHQ6aX09dCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7cz1lW2FdO2xldHtmdWxsU2l6ZTpvfT1zLmJveCxjPW5bcy5zdGFja10sbD1jJiZzLnN0YWNrV2VpZ2h0L2Mud2VpZ2h0O3MuaG9yaXpvbnRhbD8ocy53aWR0aD1sP2wqcjpvJiZ0LmF2YWlsYWJsZVdpZHRoLHMuaGVpZ2h0PWkpOihzLndpZHRoPXIscy5oZWlnaHQ9bD9sKmk6byYmdC5hdmFpbGFibGVIZWlnaHQpfXJldHVybiBufWZ1bmN0aW9uIFdsKGUpe2xldCB0PVZsKGUpLG49QmwodC5maWx0ZXIoZT0+ZS5ib3guZnVsbFNpemUpLCEwKSxyPUJsKFJsKHQsYGxlZnRgKSwhMCksaT1CbChSbCh0LGByaWdodGApKSxhPUJsKFJsKHQsYHRvcGApLCEwKSxvPUJsKFJsKHQsYGJvdHRvbWApKSxzPXpsKHQsYHhgKSxjPXpsKHQsYHlgKTtyZXR1cm57ZnVsbFNpemU6bixsZWZ0QW5kVG9wOnIuY29uY2F0KGEpLHJpZ2h0QW5kQm90dG9tOmkuY29uY2F0KGMpLmNvbmNhdChvKS5jb25jYXQocyksY2hhcnRBcmVhOlJsKHQsYGNoYXJ0QXJlYWApLHZlcnRpY2FsOnIuY29uY2F0KGkpLmNvbmNhdChjKSxob3Jpem9udGFsOmEuY29uY2F0KG8pLmNvbmNhdChzKX19ZnVuY3Rpb24gR2woZSx0LG4scil7cmV0dXJuIE1hdGgubWF4KGVbbl0sdFtuXSkrTWF0aC5tYXgoZVtyXSx0W3JdKX1mdW5jdGlvbiBLbChlLHQpe2UudG9wPU1hdGgubWF4KGUudG9wLHQudG9wKSxlLmxlZnQ9TWF0aC5tYXgoZS5sZWZ0LHQubGVmdCksZS5ib3R0b209TWF0aC5tYXgoZS5ib3R0b20sdC5ib3R0b20pLGUucmlnaHQ9TWF0aC5tYXgoZS5yaWdodCx0LnJpZ2h0KX1mdW5jdGlvbiBxbChlLHQsbixyKXtsZXR7cG9zOmksYm94OmF9PW4sbz1lLm1heFBhZGRpbmc7aWYoIUcoaSkpe24uc2l6ZSYmKGVbaV0tPW4uc2l6ZSk7bGV0IHQ9cltuLnN0YWNrXXx8e3NpemU6MCxjb3VudDoxfTt0LnNpemU9TWF0aC5tYXgodC5zaXplLG4uaG9yaXpvbnRhbD9hLmhlaWdodDphLndpZHRoKSxuLnNpemU9dC5zaXplL3QuY291bnQsZVtpXSs9bi5zaXplfWEuZ2V0UGFkZGluZyYmS2wobyxhLmdldFBhZGRpbmcoKSk7bGV0IHM9TWF0aC5tYXgoMCx0Lm91dGVyV2lkdGgtR2wobyxlLGBsZWZ0YCxgcmlnaHRgKSksYz1NYXRoLm1heCgwLHQub3V0ZXJIZWlnaHQtR2wobyxlLGB0b3BgLGBib3R0b21gKSksbD1zIT09ZS53LHU9YyE9PWUuaDtyZXR1cm4gZS53PXMsZS5oPWMsbi5ob3Jpem9udGFsP3tzYW1lOmwsb3RoZXI6dX06e3NhbWU6dSxvdGhlcjpsfX1mdW5jdGlvbiBKbChlKXtsZXQgdD1lLm1heFBhZGRpbmc7ZnVuY3Rpb24gbihuKXtsZXQgcj1NYXRoLm1heCh0W25dLWVbbl0sMCk7cmV0dXJuIGVbbl0rPXIscn1lLnkrPW4oYHRvcGApLGUueCs9bihgbGVmdGApLG4oYHJpZ2h0YCksbihgYm90dG9tYCl9ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj10Lm1heFBhZGRpbmc7ZnVuY3Rpb24gcihlKXtsZXQgcj17bGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9O3JldHVybiBlLmZvckVhY2goZT0+e3JbZV09TWF0aC5tYXgodFtlXSxuW2VdKX0pLHJ9cmV0dXJuIHIoZT9bYGxlZnRgLGByaWdodGBdOltgdG9wYCxgYm90dG9tYF0pfWZ1bmN0aW9uIFhsKGUsdCxuLHIpe2xldCBpPVtdLGEsbyxzLGMsbCx1O2ZvcihhPTAsbz1lLmxlbmd0aCxsPTA7YTxvOysrYSl7cz1lW2FdLGM9cy5ib3gsYy51cGRhdGUocy53aWR0aHx8dC53LHMuaGVpZ2h0fHx0LmgsWWwocy5ob3Jpem9udGFsLHQpKTtsZXR7c2FtZTpvLG90aGVyOmR9PXFsKHQsbixzLHIpO2x8PW8mJmkubGVuZ3RoLHV8fD1kLGMuZnVsbFNpemV8fGkucHVzaChzKX1yZXR1cm4gbCYmWGwoaSx0LG4scil8fHV9ZnVuY3Rpb24gWmwoZSx0LG4scixpKXtlLnRvcD1uLGUubGVmdD10LGUucmlnaHQ9dCtyLGUuYm90dG9tPW4raSxlLndpZHRoPXIsZS5oZWlnaHQ9aX1mdW5jdGlvbiBRbChlLHQsbixyKXtsZXQgaT1uLnBhZGRpbmcse3g6YSx5Om99PXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBlPXMuYm94LGM9cltzLnN0YWNrXXx8e2NvdW50OjEscGxhY2VkOjAsd2VpZ2h0OjF9LGw9cy5zdGFja1dlaWdodC9jLndlaWdodHx8MTtpZihzLmhvcml6b250YWwpe2xldCByPXQudypsLGE9Yy5zaXplfHxlLmhlaWdodDtmbyhjLnN0YXJ0KSYmKG89Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGkubGVmdCxvLG4ub3V0ZXJXaWR0aC1pLnJpZ2h0LWkubGVmdCxhKTpabChlLHQubGVmdCtjLnBsYWNlZCxvLHIsYSksYy5zdGFydD1vLGMucGxhY2VkKz1yLG89ZS5ib3R0b219ZWxzZXtsZXQgcj10LmgqbCxvPWMuc2l6ZXx8ZS53aWR0aDtmbyhjLnN0YXJ0KSYmKGE9Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGEsaS50b3AsbyxuLm91dGVySGVpZ2h0LWkuYm90dG9tLWkudG9wKTpabChlLGEsdC50b3ArYy5wbGFjZWQsbyxyKSxjLnN0YXJ0PWEsYy5wbGFjZWQrPXIsYT1lLnJpZ2h0fX10Lng9YSx0Lnk9b312YXIgJGw9e2FkZEJveChlLHQpe2UuYm94ZXN8fD1bXSx0LmZ1bGxTaXplPXQuZnVsbFNpemV8fCExLHQucG9zaXRpb249dC5wb3NpdGlvbnx8YHRvcGAsdC53ZWlnaHQ9dC53ZWlnaHR8fDAsdC5fbGF5ZXJzPXQuX2xheWVyc3x8ZnVuY3Rpb24oKXtyZXR1cm5be3o6MCxkcmF3KGUpe3QuZHJhdyhlKX19XX0sZS5ib3hlcy5wdXNoKHQpfSxyZW1vdmVCb3goZSx0KXtsZXQgbj1lLmJveGVzP2UuYm94ZXMuaW5kZXhPZih0KTotMTtuIT09LTEmJmUuYm94ZXMuc3BsaWNlKG4sMSl9LGNvbmZpZ3VyZShlLHQsbil7dC5mdWxsU2l6ZT1uLmZ1bGxTaXplLHQucG9zaXRpb249bi5wb3NpdGlvbix0LndlaWdodD1uLndlaWdodH0sdXBkYXRlKGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXQgaT1RKGUub3B0aW9ucy5sYXlvdXQucGFkZGluZyksYT1NYXRoLm1heCh0LWkud2lkdGgsMCksbz1NYXRoLm1heChuLWkuaGVpZ2h0LDApLHM9V2woZS5ib3hlcyksYz1zLnZlcnRpY2FsLGw9cy5ob3Jpem9udGFsO1koZS5ib3hlcyxlPT57dHlwZW9mIGUuYmVmb3JlTGF5b3V0PT1gZnVuY3Rpb25gJiZlLmJlZm9yZUxheW91dCgpfSk7bGV0IHU9Yy5yZWR1Y2UoKGUsdCk9PnQuYm94Lm9wdGlvbnMmJnQuYm94Lm9wdGlvbnMuZGlzcGxheT09PSExP2U6ZSsxLDApfHwxLGQ9T2JqZWN0LmZyZWV6ZSh7b3V0ZXJXaWR0aDp0LG91dGVySGVpZ2h0Om4scGFkZGluZzppLGF2YWlsYWJsZVdpZHRoOmEsYXZhaWxhYmxlSGVpZ2h0Om8sdkJveE1heFdpZHRoOmEvMi91LGhCb3hNYXhIZWlnaHQ6by8yfSksZj1PYmplY3QuYXNzaWduKHt9LGkpO0tsKGYsUShyKSk7bGV0IHA9T2JqZWN0LmFzc2lnbih7bWF4UGFkZGluZzpmLHc6YSxoOm8seDppLmxlZnQseTppLnRvcH0saSksbT1VbChjLmNvbmNhdChsKSxkKTtYbChzLmZ1bGxTaXplLHAsZCxtKSxYbChjLHAsZCxtKSxYbChsLHAsZCxtKSYmWGwoYyxwLGQsbSksSmwocCksUWwocy5sZWZ0QW5kVG9wLHAsZCxtKSxwLngrPXAudyxwLnkrPXAuaCxRbChzLnJpZ2h0QW5kQm90dG9tLHAsZCxtKSxlLmNoYXJ0QXJlYT17bGVmdDpwLmxlZnQsdG9wOnAudG9wLHJpZ2h0OnAubGVmdCtwLncsYm90dG9tOnAudG9wK3AuaCxoZWlnaHQ6cC5oLHdpZHRoOnAud30sWShzLmNoYXJ0QXJlYSx0PT57bGV0IG49dC5ib3g7T2JqZWN0LmFzc2lnbihuLGUuY2hhcnRBcmVhKSxuLnVwZGF0ZShwLncscC5oLHtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0pfSl9fSxldT1jbGFzc3thY3F1aXJlQ29udGV4dChlLHQpe31yZWxlYXNlQ29udGV4dChlKXtyZXR1cm4hMX1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt9cmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsbil7fWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gMX1nZXRNYXhpbXVtU2l6ZShlLHQsbixyKXtyZXR1cm4gdD1NYXRoLm1heCgwLHR8fGUud2lkdGgpLG58fD1lLmhlaWdodCx7d2lkdGg6dCxoZWlnaHQ6TWF0aC5tYXgoMCxyP01hdGguZmxvb3IodC9yKTpuKX19aXNBdHRhY2hlZChlKXtyZXR1cm4hMH11cGRhdGVDb25maWcoZSl7fX0sdHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlKXtyZXR1cm4gZSYmZS5nZXRDb250ZXh0JiZlLmdldENvbnRleHQoYDJkYCl8fG51bGx9dXBkYXRlQ29uZmlnKGUpe2Uub3B0aW9ucy5hbmltYXRpb249ITF9fSxudT1gJGNoYXJ0anNgLHJ1PXt0b3VjaHN0YXJ0OmBtb3VzZWRvd25gLHRvdWNobW92ZTpgbW91c2Vtb3ZlYCx0b3VjaGVuZDpgbW91c2V1cGAscG9pbnRlcmVudGVyOmBtb3VzZWVudGVyYCxwb2ludGVyZG93bjpgbW91c2Vkb3duYCxwb2ludGVybW92ZTpgbW91c2Vtb3ZlYCxwb2ludGVydXA6YG1vdXNldXBgLHBvaW50ZXJsZWF2ZTpgbW91c2VvdXRgLHBvaW50ZXJvdXQ6YG1vdXNlb3V0YH0saXU9ZT0+ZT09PW51bGx8fGU9PT1gYDtmdW5jdGlvbiBhdShlLHQpe2xldCBuPWUuc3R5bGUscj1lLmdldEF0dHJpYnV0ZShgaGVpZ2h0YCksaT1lLmdldEF0dHJpYnV0ZShgd2lkdGhgKTtpZihlW251XT17aW5pdGlhbDp7aGVpZ2h0OnIsd2lkdGg6aSxzdHlsZTp7ZGlzcGxheTpuLmRpc3BsYXksaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGh9fX0sbi5kaXNwbGF5PW4uZGlzcGxheXx8YGJsb2NrYCxuLmJveFNpemluZz1uLmJveFNpemluZ3x8YGJvcmRlci1ib3hgLGl1KGkpKXtsZXQgdD1PYyhlLGB3aWR0aGApO3QhPT12b2lkIDAmJihlLndpZHRoPXQpfWlmKGl1KHIpKXtpZihlLnN0eWxlLmhlaWdodD09PWBgKWUuaGVpZ2h0PWUud2lkdGgvKHR8fDIpO2Vsc2V7bGV0IHQ9T2MoZSxgaGVpZ2h0YCk7dCE9PXZvaWQgMCYmKGUuaGVpZ2h0PXQpfX1yZXR1cm4gZX12YXIgb3U9RGM/e3Bhc3NpdmU6ITB9OiExO2Z1bmN0aW9uIHN1KGUsdCxuKXtlJiZlLmFkZEV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBjdShlLHQsbil7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBsdShlLHQpe2xldCBuPXJ1W2UudHlwZV18fGUudHlwZSx7eDpyLHk6aX09U2MoZSx0KTtyZXR1cm57dHlwZTpuLGNoYXJ0OnQsbmF0aXZlOmUseDpyPT09dm9pZCAwP251bGw6cix5Omk9PT12b2lkIDA/bnVsbDppfX1mdW5jdGlvbiB1dShlLHQpe2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHxuLmNvbnRhaW5zKHQpKXJldHVybiEwfWZ1bmN0aW9uIGR1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5hZGRlZE5vZGVzLHIpLHQmJj0hdXUobi5yZW1vdmVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfWZ1bmN0aW9uIGZ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5yZW1vdmVkTm9kZXMsciksdCYmPSF1dShuLmFkZGVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfXZhciBwdT1uZXcgTWFwLG11PTA7ZnVuY3Rpb24gaHUoKXtsZXQgZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztlIT09bXUmJihtdT1lLHB1LmZvckVhY2goKHQsbik9PntuLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIT09ZSYmdCgpfSkpfWZ1bmN0aW9uIGd1KGUsdCl7cHUuc2l6ZXx8d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHJlc2l6ZWAsaHUpLHB1LnNldChlLHQpfWZ1bmN0aW9uIF91KGUpe3B1LmRlbGV0ZShlKSxwdS5zaXplfHx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxodSl9ZnVuY3Rpb24gdnUoZSx0LG4pe2xldCByPWUuY2FudmFzLGk9ciYmbWMocik7aWYoIWkpcmV0dXJuO2xldCBhPVhvKChlLHQpPT57bGV0IHI9aS5jbGllbnRXaWR0aDtuKGUsdCkscjxpLmNsaWVudFdpZHRoJiZuKCl9LHdpbmRvdyksbz1uZXcgUmVzaXplT2JzZXJ2ZXIoZT0+e2xldCB0PWVbMF0sbj10LmNvbnRlbnRSZWN0LndpZHRoLHI9dC5jb250ZW50UmVjdC5oZWlnaHQ7KG4hPT0wfHxyIT09MCkmJmEobixyKX0pO3JldHVybiBvLm9ic2VydmUoaSksZ3UoZSxhKSxvfWZ1bmN0aW9uIHl1KGUsdCxuKXtuJiZuLmRpc2Nvbm5lY3QoKSx0PT09YHJlc2l6ZWAmJl91KGUpfWZ1bmN0aW9uIGJ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPVhvKHQ9PntlLmN0eCE9PW51bGwmJm4obHUodCxlKSl9LGUpO3JldHVybiBzdShyLHQsaSksaX12YXIgeHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlLHQpe2xldCBuPWUmJmUuZ2V0Q29udGV4dCYmZS5nZXRDb250ZXh0KGAyZGApO3JldHVybiBuJiZuLmNhbnZhcz09PWU/KGF1KGUsdCksbik6bnVsbH1yZWxlYXNlQ29udGV4dChlKXtsZXQgdD1lLmNhbnZhcztpZighdFtudV0pcmV0dXJuITE7bGV0IG49dFtudV0uaW5pdGlhbDtbYGhlaWdodGAsYHdpZHRoYF0uZm9yRWFjaChlPT57bGV0IHI9bltlXTtVKHIpP3QucmVtb3ZlQXR0cmlidXRlKGUpOnQuc2V0QXR0cmlidXRlKGUscil9KTtsZXQgcj1uLnN0eWxlfHx7fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChlPT57dC5zdHlsZVtlXT1yW2VdfSksdC53aWR0aD10LndpZHRoLGRlbGV0ZSB0W251XSwhMH1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KTtsZXQgcj1lLiRwcm94aWVzfHw9e307clt0XT0oe2F0dGFjaDpkdSxkZXRhY2g6ZnUscmVzaXplOnZ1fVt0XXx8YnUpKGUsdCxuKX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IG49ZS4kcHJveGllc3x8PXt9LHI9blt0XTtyJiYoKHthdHRhY2g6eXUsZGV0YWNoOnl1LHJlc2l6ZTp5dX1bdF18fGN1KShlLHQsciksblt0XT12b2lkIDApfWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW99Z2V0TWF4aW11bVNpemUoZSx0LG4scil7cmV0dXJuIFRjKGUsdCxuLHIpfWlzQXR0YWNoZWQoZSl7bGV0IHQ9ZSYmbWMoZSk7cmV0dXJuISEodCYmdC5pc0Nvbm5lY3RlZCl9fTtmdW5jdGlvbiBTdShlKXtyZXR1cm4hcGMoKXx8dHlwZW9mIE9mZnNjcmVlbkNhbnZhczxgdWAmJmUgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXM/dHU6eHV9dmFyIEN1PWNsYXNze3N0YXRpYyBkZWZhdWx0cz17fTtzdGF0aWMgZGVmYXVsdFJvdXRlcz12b2lkIDA7eDt5O2FjdGl2ZT0hMTtvcHRpb25zOyRhbmltYXRpb25zO3Rvb2x0aXBQb3NpdGlvbihlKXtsZXR7eDp0LHk6bn09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YF0sZSk7cmV0dXJue3g6dCx5Om59fWhhc1ZhbHVlKCl7cmV0dXJuIE9vKHRoaXMueCkmJk9vKHRoaXMueSl9Z2V0UHJvcHMoZSx0KXtsZXQgbj10aGlzLiRhbmltYXRpb25zO2lmKCF0fHwhbilyZXR1cm4gdGhpcztsZXQgcj17fTtyZXR1cm4gZS5mb3JFYWNoKGU9PntyW2VdPW5bZV0mJm5bZV0uYWN0aXZlKCk/bltlXS5fdG86dGhpc1tlXX0pLHJ9fTtmdW5jdGlvbiB3dShlLHQpe2xldCBuPWUub3B0aW9ucy50aWNrcyxyPVR1KGUpLGk9TWF0aC5taW4obi5tYXhUaWNrc0xpbWl0fHxyLHIpLGE9bi5tYWpvci5lbmFibGVkP0R1KHQpOltdLG89YS5sZW5ndGgscz1hWzBdLGM9YVtvLTFdLGw9W107aWYobz5pKXJldHVybiBPdSh0LGwsYSxvL2kpLGw7bGV0IHU9RXUoYSx0LGkpO2lmKG8+MCl7bGV0IGUsbixyPW8+MT9NYXRoLnJvdW5kKChjLXMpLyhvLTEpKTpudWxsO2ZvcihrdSh0LGwsdSxVKHIpPzA6cy1yLHMpLGU9MCxuPW8tMTtlPG47ZSsrKWt1KHQsbCx1LGFbZV0sYVtlKzFdKTtyZXR1cm4ga3UodCxsLHUsYyxVKHIpP3QubGVuZ3RoOmMrciksbH1yZXR1cm4ga3UodCxsLHUpLGx9ZnVuY3Rpb24gVHUoZSl7bGV0IHQ9ZS5vcHRpb25zLm9mZnNldCxuPWUuX3RpY2tTaXplKCkscj1lLl9sZW5ndGgvbisgKyF0LGk9ZS5fbWF4TGVuZ3RoL247cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5taW4ocixpKSl9ZnVuY3Rpb24gRXUoZSx0LG4pe2xldCByPUF1KGUpLGk9dC5sZW5ndGgvbjtpZighcilyZXR1cm4gTWF0aC5tYXgoaSwxKTtsZXQgYT1FbyhyKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoLTE7ZTx0O2UrKyl7bGV0IHQ9YVtlXTtpZih0PmkpcmV0dXJuIHR9cmV0dXJuIE1hdGgubWF4KGksMSl9ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9W10sbixyO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0ubWFqb3ImJnQucHVzaChuKTtyZXR1cm4gdH1mdW5jdGlvbiBPdShlLHQsbixyKXtsZXQgaT0wLGE9blswXSxvO2ZvcihyPU1hdGguY2VpbChyKSxvPTA7bzxlLmxlbmd0aDtvKyspbz09PWEmJih0LnB1c2goZVtvXSksaSsrLGE9bltpKnJdKX1mdW5jdGlvbiBrdShlLHQsbixyLGkpe2xldCBhPXEociwwKSxvPU1hdGgubWluKHEoaSxlLmxlbmd0aCksZS5sZW5ndGgpLHM9MCxjLGwsdTtmb3Iobj1NYXRoLmNlaWwobiksaSYmKGM9aS1yLG49Yy9NYXRoLmZsb29yKGMvbikpLHU9YTt1PDA7KXMrKyx1PU1hdGgucm91bmQoYStzKm4pO2ZvcihsPU1hdGgubWF4KGEsMCk7bDxvO2wrKylsPT09dSYmKHQucHVzaChlW2xdKSxzKyssdT1NYXRoLnJvdW5kKGErcypuKSl9ZnVuY3Rpb24gQXUoZSl7bGV0IHQ9ZS5sZW5ndGgsbixyO2lmKHQ8MilyZXR1cm4hMTtmb3Iocj1lWzBdLG49MTtuPHQ7KytuKWlmKGVbbl0tZVtuLTFdIT09cilyZXR1cm4hMTtyZXR1cm4gcn12YXIganU9ZT0+ZT09PWBsZWZ0YD9gcmlnaHRgOmU9PT1gcmlnaHRgP2BsZWZ0YDplLE11PShlLHQsbik9PnQ9PT1gdG9wYHx8dD09PWBsZWZ0YD9lW3RdK246ZVt0XS1uLE51PShlLHQpPT5NYXRoLm1pbih0fHxlLGUpO2Z1bmN0aW9uIFB1KGUsdCl7bGV0IG49W10scj1lLmxlbmd0aC90LGk9ZS5sZW5ndGgsYT0wO2Zvcig7YTxpO2ErPXIpbi5wdXNoKGVbTWF0aC5mbG9vcihhKV0pO3JldHVybiBufWZ1bmN0aW9uIEZ1KGUsdCxuKXtsZXQgcj1lLnRpY2tzLmxlbmd0aCxpPU1hdGgubWluKHQsci0xKSxhPWUuX3N0YXJ0UGl4ZWwsbz1lLl9lbmRQaXhlbCxzPTFlLTYsYz1lLmdldFBpeGVsRm9yVGljayhpKSxsO2lmKCEobiYmKGw9cj09PTE/TWF0aC5tYXgoYy1hLG8tYyk6dD09PTA/KGUuZ2V0UGl4ZWxGb3JUaWNrKDEpLWMpLzI6KGMtZS5nZXRQaXhlbEZvclRpY2soaS0xKSkvMixjKz1pPHQ/bDotbCxjPGEtc3x8Yz5vK3MpKSlyZXR1cm4gY31mdW5jdGlvbiBJdShlLHQpe1koZSxlPT57bGV0IG49ZS5nYyxyPW4ubGVuZ3RoLzIsaTtpZihyPnQpe2ZvcihpPTA7aTxyOysraSlkZWxldGUgZS5kYXRhW25baV1dO24uc3BsaWNlKDAscil9fSl9ZnVuY3Rpb24gTHUoZSl7cmV0dXJuIGUuZHJhd1RpY2tzP2UudGlja0xlbmd0aDowfWZ1bmN0aW9uIFJ1KGUsdCl7aWYoIWUuZGlzcGxheSlyZXR1cm4gMDtsZXQgbj0kKGUuZm9udCx0KSxyPVEoZS5wYWRkaW5nKTtyZXR1cm4oVyhlLnRleHQpP2UudGV4dC5sZW5ndGg6MSkqbi5saW5lSGVpZ2h0K3IuaGVpZ2h0fWZ1bmN0aW9uIHp1KGUsdCl7cmV0dXJuIHFzKGUse3NjYWxlOnQsdHlwZTpgc2NhbGVgfSl9ZnVuY3Rpb24gQnUoZSx0LG4pe3JldHVybiBxcyhlLHt0aWNrOm4saW5kZXg6dCx0eXBlOmB0aWNrYH0pfWZ1bmN0aW9uIFZ1KGUsdCxuKXtsZXQgcj1RbyhlKTtyZXR1cm4obiYmdCE9PWByaWdodGB8fCFuJiZ0PT09YHJpZ2h0YCkmJihyPWp1KHIpKSxyfWZ1bmN0aW9uIEh1KGUsdCxuLHIpe2xldHt0b3A6aSxsZWZ0OmEsYm90dG9tOm8scmlnaHQ6cyxjaGFydDpjfT1lLHtjaGFydEFyZWE6bCxzY2FsZXM6dX09YyxkPTAsZixwLG0saD1vLWksZz1zLWE7aWYoZS5pc0hvcml6b250YWwoKSl7aWYocD0kbyhyLGEscyksRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO209dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpK2gtdH1lbHNlIG09bj09PWBjZW50ZXJgPyhsLmJvdHRvbStsLnRvcCkvMitoLXQ6TXUoZSxuLHQpO2Y9cy1hfWVsc2V7aWYoRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO3A9dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpLWcrdH1lbHNlIHA9bj09PWBjZW50ZXJgPyhsLmxlZnQrbC5yaWdodCkvMi1nK3Q6TXUoZSxuLHQpO209JG8ocixvLGkpLGQ9bj09PWBsZWZ0YD8teW86eW99cmV0dXJue3RpdGxlWDpwLHRpdGxlWTptLG1heFdpZHRoOmYscm90YXRpb246ZH19dmFyIFV1PWNsYXNzIGUgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaWQ9ZS5pZCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5jdHg9ZS5jdHgsdGhpcy5jaGFydD1lLmNoYXJ0LHRoaXMudG9wPXZvaWQgMCx0aGlzLmJvdHRvbT12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5fbWFyZ2lucz17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9LHRoaXMubWF4V2lkdGg9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLnBhZGRpbmdUb3A9dm9pZCAwLHRoaXMucGFkZGluZ0JvdHRvbT12b2lkIDAsdGhpcy5wYWRkaW5nTGVmdD12b2lkIDAsdGhpcy5wYWRkaW5nUmlnaHQ9dm9pZCAwLHRoaXMuYXhpcz12b2lkIDAsdGhpcy5sYWJlbFJvdGF0aW9uPXZvaWQgMCx0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwLHRoaXMuX3JhbmdlPXZvaWQgMCx0aGlzLnRpY2tzPVtdLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2xlbmd0aD0wLHRoaXMuX21heExlbmd0aD0wLHRoaXMuX2xvbmdlc3RUZXh0Q2FjaGU9e30sdGhpcy5fc3RhcnRQaXhlbD12b2lkIDAsdGhpcy5fZW5kUGl4ZWw9dm9pZCAwLHRoaXMuX3JldmVyc2VQaXhlbHM9ITEsdGhpcy5fdXNlck1heD12b2lkIDAsdGhpcy5fdXNlck1pbj12b2lkIDAsdGhpcy5fc3VnZ2VzdGVkTWF4PXZvaWQgMCx0aGlzLl9zdWdnZXN0ZWRNaW49dm9pZCAwLHRoaXMuX3RpY2tzTGVuZ3RoPTAsdGhpcy5fYm9yZGVyVmFsdWU9MCx0aGlzLl9jYWNoZT17fSx0aGlzLl9kYXRhTGltaXRzQ2FjaGVkPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwfWluaXQoZSl7dGhpcy5vcHRpb25zPWUuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksdGhpcy5heGlzPWUuYXhpcyx0aGlzLl91c2VyTWluPXRoaXMucGFyc2UoZS5taW4pLHRoaXMuX3VzZXJNYXg9dGhpcy5wYXJzZShlLm1heCksdGhpcy5fc3VnZ2VzdGVkTWluPXRoaXMucGFyc2UoZS5zdWdnZXN0ZWRNaW4pLHRoaXMuX3N1Z2dlc3RlZE1heD10aGlzLnBhcnNlKGUuc3VnZ2VzdGVkTWF4KX1wYXJzZShlLHQpe3JldHVybiBlfWdldFVzZXJCb3VuZHMoKXtsZXR7X3VzZXJNaW46ZSxfdXNlck1heDp0LF9zdWdnZXN0ZWRNaW46bixfc3VnZ2VzdGVkTWF4OnJ9PXRoaXM7cmV0dXJuIGU9WmEoZSwxLzApLHQ9WmEodCwtMS8wKSxuPVphKG4sMS8wKSxyPVphKHIsLTEvMCkse21pbjpaYShlLG4pLG1heDpaYSh0LHIpLG1pbkRlZmluZWQ6SyhlKSxtYXhEZWZpbmVkOksodCl9fWdldE1pbk1heChlKXtsZXR7bWluOnQsbWF4Om4sbWluRGVmaW5lZDpyLG1heERlZmluZWQ6aX09dGhpcy5nZXRVc2VyQm91bmRzKCksYTtpZihyJiZpKXJldHVybnttaW46dCxtYXg6bn07bGV0IG89dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO2ZvcihsZXQgcz0wLGM9by5sZW5ndGg7czxjOysrcylhPW9bc10uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcyxlKSxyfHwodD1NYXRoLm1pbih0LGEubWluKSksaXx8KG49TWF0aC5tYXgobixhLm1heCkpO3JldHVybiB0PWkmJnQ+bj9uOnQsbj1yJiZ0Pm4/dDpuLHttaW46WmEodCxaYShuLHQpKSxtYXg6WmEobixaYSh0LG4pKX19Z2V0UGFkZGluZygpe3JldHVybntsZWZ0OnRoaXMucGFkZGluZ0xlZnR8fDAsdG9wOnRoaXMucGFkZGluZ1RvcHx8MCxyaWdodDp0aGlzLnBhZGRpbmdSaWdodHx8MCxib3R0b206dGhpcy5wYWRkaW5nQm90dG9tfHwwfX1nZXRUaWNrcygpe3JldHVybiB0aGlzLnRpY2tzfWdldExhYmVscygpe2xldCBlPXRoaXMuY2hhcnQuZGF0YTtyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsc3x8KHRoaXMuaXNIb3Jpem9udGFsKCk/ZS54TGFiZWxzOmUueUxhYmVscyl8fGUubGFiZWxzfHxbXX1nZXRMYWJlbEl0ZW1zKGU9dGhpcy5jaGFydC5jaGFydEFyZWEpe3JldHVybiB0aGlzLl9sYWJlbEl0ZW1zfHw9dGhpcy5fY29tcHV0ZUxhYmVsSXRlbXMoZSl9YmVmb3JlTGF5b3V0KCl7dGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMX1iZWZvcmVVcGRhdGUoKXtKKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsW3RoaXNdKX11cGRhdGUoZSx0LG4pe2xldHtiZWdpbkF0WmVybzpyLGdyYWNlOmksdGlja3M6YX09dGhpcy5vcHRpb25zLG89YS5zYW1wbGVTaXplO3RoaXMuYmVmb3JlVXBkYXRlKCksdGhpcy5tYXhXaWR0aD1lLHRoaXMubWF4SGVpZ2h0PXQsdGhpcy5fbWFyZ2lucz1uPU9iamVjdC5hc3NpZ24oe2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfSxuKSx0aGlzLnRpY2tzPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5iZWZvcmVTZXREaW1lbnNpb25zKCksdGhpcy5zZXREaW1lbnNpb25zKCksdGhpcy5hZnRlclNldERpbWVuc2lvbnMoKSx0aGlzLl9tYXhMZW5ndGg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLndpZHRoK24ubGVmdCtuLnJpZ2h0OnRoaXMuaGVpZ2h0K24udG9wK24uYm90dG9tLHRoaXMuX2RhdGFMaW1pdHNDYWNoZWR8fD0odGhpcy5iZWZvcmVEYXRhTGltaXRzKCksdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCksdGhpcy5hZnRlckRhdGFMaW1pdHMoKSx0aGlzLl9yYW5nZT1Lcyh0aGlzLGksciksITApLHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpLHRoaXMudGlja3M9dGhpcy5idWlsZFRpY2tzKCl8fFtdLHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7bGV0IHM9bzx0aGlzLnRpY2tzLmxlbmd0aDt0aGlzLl9jb252ZXJ0VGlja3NUb0xhYmVscyhzP1B1KHRoaXMudGlja3Msbyk6dGhpcy50aWNrcyksdGhpcy5jb25maWd1cmUoKSx0aGlzLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLGEuZGlzcGxheSYmKGEuYXV0b1NraXB8fGEuc291cmNlPT09YGF1dG9gKSYmKHRoaXMudGlja3M9d3UodGhpcyx0aGlzLnRpY2tzKSx0aGlzLl9sYWJlbFNpemVzPW51bGwsdGhpcy5hZnRlckF1dG9Ta2lwKCkpLHMmJnRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRoaXMudGlja3MpLHRoaXMuYmVmb3JlRml0KCksdGhpcy5maXQoKSx0aGlzLmFmdGVyRml0KCksdGhpcy5hZnRlclVwZGF0ZSgpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMub3B0aW9ucy5yZXZlcnNlLHQsbjt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0PXRoaXMubGVmdCxuPXRoaXMucmlnaHQpOih0PXRoaXMudG9wLG49dGhpcy5ib3R0b20sZT0hZSksdGhpcy5fc3RhcnRQaXhlbD10LHRoaXMuX2VuZFBpeGVsPW4sdGhpcy5fcmV2ZXJzZVBpeGVscz1lLHRoaXMuX2xlbmd0aD1uLXQsdGhpcy5fYWxpZ25Ub1BpeGVscz10aGlzLm9wdGlvbnMuYWxpZ25Ub1BpeGVsc31hZnRlclVwZGF0ZSgpe0oodGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlLFt0aGlzXSl9YmVmb3JlU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsW3RoaXNdKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD0wLHRoaXMucmlnaHQ9dGhpcy53aWR0aCk6KHRoaXMuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LHRoaXMudG9wPTAsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdUb3A9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wfWFmdGVyU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucyxbdGhpc10pfV9jYWxsSG9va3MoZSl7dGhpcy5jaGFydC5ub3RpZnlQbHVnaW5zKGUsdGhpcy5nZXRDb250ZXh0KCkpLEoodGhpcy5vcHRpb25zW2VdLFt0aGlzXSl9YmVmb3JlRGF0YUxpbWl0cygpe3RoaXMuX2NhbGxIb29rcyhgYmVmb3JlRGF0YUxpbWl0c2ApfWRldGVybWluZURhdGFMaW1pdHMoKXt9YWZ0ZXJEYXRhTGltaXRzKCl7dGhpcy5fY2FsbEhvb2tzKGBhZnRlckRhdGFMaW1pdHNgKX1iZWZvcmVCdWlsZFRpY2tzKCl7dGhpcy5fY2FsbEhvb2tzKGBiZWZvcmVCdWlsZFRpY2tzYCl9YnVpbGRUaWNrcygpe3JldHVybltdfWFmdGVyQnVpbGRUaWNrcygpe3RoaXMuX2NhbGxIb29rcyhgYWZ0ZXJCdWlsZFRpY2tzYCl9YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCl7Sih0aGlzLm9wdGlvbnMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9Z2VuZXJhdGVUaWNrTGFiZWxzKGUpe2xldCB0PXRoaXMub3B0aW9ucy50aWNrcyxuLHIsaTtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpPWVbbl0saS5sYWJlbD1KKHQuY2FsbGJhY2ssW2kudmFsdWUsbixlXSx0aGlzKX1hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpe0oodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9YmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpe0oodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1jYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPU51KHRoaXMudGlja3MubGVuZ3RoLGUudGlja3MubWF4VGlja3NMaW1pdCkscj10Lm1pblJvdGF0aW9ufHwwLGk9dC5tYXhSb3RhdGlvbixhPXIsbyxzLGM7aWYoIXRoaXMuX2lzVmlzaWJsZSgpfHwhdC5kaXNwbGF5fHxyPj1pfHxuPD0xfHwhdGhpcy5pc0hvcml6b250YWwoKSl7dGhpcy5sYWJlbFJvdGF0aW9uPXI7cmV0dXJufWxldCBsPXRoaXMuX2dldExhYmVsU2l6ZXMoKSx1PWwud2lkZXN0LndpZHRoLGQ9bC5oaWdoZXN0LmhlaWdodCxmPVJvKHRoaXMuY2hhcnQud2lkdGgtdSwwLHRoaXMubWF4V2lkdGgpO289ZS5vZmZzZXQ/dGhpcy5tYXhXaWR0aC9uOmYvKG4tMSksdSs2Pm8mJihvPWYvKG4tKGUub2Zmc2V0Py41OjEpKSxzPXRoaXMubWF4SGVpZ2h0LUx1KGUuZ3JpZCktdC5wYWRkaW5nLVJ1KGUudGl0bGUsdGhpcy5jaGFydC5vcHRpb25zLmZvbnQpLGM9TWF0aC5zcXJ0KHUqdStkKmQpLGE9TW8oTWF0aC5taW4oTWF0aC5hc2luKFJvKChsLmhpZ2hlc3QuaGVpZ2h0KzYpL28sLTEsMSkpLE1hdGguYXNpbihSbyhzL2MsLTEsMSkpLU1hdGguYXNpbihSbyhkL2MsLTEsMSkpKSksYT1NYXRoLm1heChyLE1hdGgubWluKGksYSkpKSx0aGlzLmxhYmVsUm90YXRpb249YX1hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKXtKKHRoaXMub3B0aW9ucy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1hZnRlckF1dG9Ta2lwKCl7fWJlZm9yZUZpdCgpe0oodGhpcy5vcHRpb25zLmJlZm9yZUZpdCxbdGhpc10pfWZpdCgpe2xldCBlPXt3aWR0aDowLGhlaWdodDowfSx7Y2hhcnQ6dCxvcHRpb25zOnt0aWNrczpuLHRpdGxlOnIsZ3JpZDppfX09dGhpcyxhPXRoaXMuX2lzVmlzaWJsZSgpLG89dGhpcy5pc0hvcml6b250YWwoKTtpZihhKXtsZXQgYT1SdShyLHQub3B0aW9ucy5mb250KTtpZihvPyhlLndpZHRoPXRoaXMubWF4V2lkdGgsZS5oZWlnaHQ9THUoaSkrYSk6KGUuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LGUud2lkdGg9THUoaSkrYSksbi5kaXNwbGF5JiZ0aGlzLnRpY2tzLmxlbmd0aCl7bGV0e2ZpcnN0OnQsbGFzdDpyLHdpZGVzdDppLGhpZ2hlc3Q6YX09dGhpcy5fZ2V0TGFiZWxTaXplcygpLHM9bi5wYWRkaW5nKjIsYz1qbyh0aGlzLmxhYmVsUm90YXRpb24pLGw9TWF0aC5jb3MoYyksdT1NYXRoLnNpbihjKTtpZihvKXtsZXQgdD1uLm1pcnJvcj8wOnUqaS53aWR0aCtsKmEuaGVpZ2h0O2UuaGVpZ2h0PU1hdGgubWluKHRoaXMubWF4SGVpZ2h0LGUuaGVpZ2h0K3Qrcyl9ZWxzZXtsZXQgdD1uLm1pcnJvcj8wOmwqaS53aWR0aCt1KmEuaGVpZ2h0O2Uud2lkdGg9TWF0aC5taW4odGhpcy5tYXhXaWR0aCxlLndpZHRoK3Qrcyl9dGhpcy5fY2FsY3VsYXRlUGFkZGluZyh0LHIsdSxsKX19dGhpcy5faGFuZGxlTWFyZ2lucygpLG8/KHRoaXMud2lkdGg9dGhpcy5fbGVuZ3RoPXQud2lkdGgtdGhpcy5fbWFyZ2lucy5sZWZ0LXRoaXMuX21hcmdpbnMucmlnaHQsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQpOih0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5fbGVuZ3RoPXQuaGVpZ2h0LXRoaXMuX21hcmdpbnMudG9wLXRoaXMuX21hcmdpbnMuYm90dG9tKX1fY2FsY3VsYXRlUGFkZGluZyhlLHQsbixyKXtsZXR7dGlja3M6e2FsaWduOmkscGFkZGluZzphfSxwb3NpdGlvbjpvfT10aGlzLm9wdGlvbnMscz10aGlzLmxhYmVsUm90YXRpb24hPT0wLGM9byE9PWB0b3BgJiZ0aGlzLmF4aXM9PT1geGA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7bGV0IG89dGhpcy5nZXRQaXhlbEZvclRpY2soMCktdGhpcy5sZWZ0LGw9dGhpcy5yaWdodC10aGlzLmdldFBpeGVsRm9yVGljayh0aGlzLnRpY2tzLmxlbmd0aC0xKSx1PTAsZD0wO3M/Yz8odT1yKmUud2lkdGgsZD1uKnQuaGVpZ2h0KToodT1uKmUuaGVpZ2h0LGQ9cip0LndpZHRoKTppPT09YHN0YXJ0YD9kPXQud2lkdGg6aT09PWBlbmRgP3U9ZS53aWR0aDppIT09YGlubmVyYCYmKHU9ZS53aWR0aC8yLGQ9dC53aWR0aC8yKSx0aGlzLnBhZGRpbmdMZWZ0PU1hdGgubWF4KCh1LW8rYSkqdGhpcy53aWR0aC8odGhpcy53aWR0aC1vKSwwKSx0aGlzLnBhZGRpbmdSaWdodD1NYXRoLm1heCgoZC1sK2EpKnRoaXMud2lkdGgvKHRoaXMud2lkdGgtbCksMCl9ZWxzZXtsZXQgbj10LmhlaWdodC8yLHI9ZS5oZWlnaHQvMjtpPT09YHN0YXJ0YD8obj0wLHI9ZS5oZWlnaHQpOmk9PT1gZW5kYCYmKG49dC5oZWlnaHQscj0wKSx0aGlzLnBhZGRpbmdUb3A9bithLHRoaXMucGFkZGluZ0JvdHRvbT1yK2F9fV9oYW5kbGVNYXJnaW5zKCl7dGhpcy5fbWFyZ2lucyYmKHRoaXMuX21hcmdpbnMubGVmdD1NYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMuX21hcmdpbnMubGVmdCksdGhpcy5fbWFyZ2lucy50b3A9TWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLHRoaXMuX21hcmdpbnMudG9wKSx0aGlzLl9tYXJnaW5zLnJpZ2h0PU1hdGgubWF4KHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMuX21hcmdpbnMucmlnaHQpLHRoaXMuX21hcmdpbnMuYm90dG9tPU1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLl9tYXJnaW5zLmJvdHRvbSkpfWFmdGVyRml0KCl7Sih0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsW3RoaXNdKX1pc0hvcml6b250YWwoKXtsZXR7YXhpczplLHBvc2l0aW9uOnR9PXRoaXMub3B0aW9ucztyZXR1cm4gdD09PWB0b3BgfHx0PT09YGJvdHRvbWB8fGU9PT1geGB9aXNGdWxsU2l6ZSgpe3JldHVybiB0aGlzLm9wdGlvbnMuZnVsbFNpemV9X2NvbnZlcnRUaWNrc1RvTGFiZWxzKGUpe3RoaXMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCksdGhpcy5nZW5lcmF0ZVRpY2tMYWJlbHMoZSk7bGV0IHQsbjtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKylVKGVbdF0ubGFiZWwpJiYoZS5zcGxpY2UodCwxKSxuLS0sdC0tKTt0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCl9X2dldExhYmVsU2l6ZXMoKXtsZXQgZT10aGlzLl9sYWJlbFNpemVzO2lmKCFlKXtsZXQgdD10aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZSxuPXRoaXMudGlja3M7dDxuLmxlbmd0aCYmKG49UHUobix0KSksdGhpcy5fbGFiZWxTaXplcz1lPXRoaXMuX2NvbXB1dGVMYWJlbFNpemVzKG4sbi5sZW5ndGgsdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpfXJldHVybiBlfV9jb21wdXRlTGFiZWxTaXplcyhlLHQsbil7bGV0e2N0eDpyLF9sb25nZXN0VGV4dENhY2hlOml9PXRoaXMsYT1bXSxvPVtdLHM9TWF0aC5mbG9vcih0L051KHQsbikpLGM9MCxsPTAsdSxkLGYscCxtLGgsZyxfLHYseSxiO2Zvcih1PTA7dTx0O3UrPXMpe2lmKHA9ZVt1XS5sYWJlbCxtPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnModSksci5mb250PWg9bS5zdHJpbmcsZz1pW2hdPWlbaF18fHtkYXRhOnt9LGdjOltdfSxfPW0ubGluZUhlaWdodCx2PXk9MCwhVShwKSYmIVcocCkpdj13cyhyLGcuZGF0YSxnLmdjLHYscCkseT1fO2Vsc2UgaWYoVyhwKSlmb3IoZD0wLGY9cC5sZW5ndGg7ZDxmOysrZCliPXBbZF0sIVUoYikmJiFXKGIpJiYodj13cyhyLGcuZGF0YSxnLmdjLHYsYikseSs9Xyk7YS5wdXNoKHYpLG8ucHVzaCh5KSxjPU1hdGgubWF4KHYsYyksbD1NYXRoLm1heCh5LGwpfUl1KGksdCk7bGV0IHg9YS5pbmRleE9mKGMpLFM9by5pbmRleE9mKGwpLEM9ZT0+KHt3aWR0aDphW2VdfHwwLGhlaWdodDpvW2VdfHwwfSk7cmV0dXJue2ZpcnN0OkMoMCksbGFzdDpDKHQtMSksd2lkZXN0OkMoeCksaGlnaGVzdDpDKFMpLHdpZHRoczphLGhlaWdodHM6b319Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZX1nZXRQaXhlbEZvclZhbHVlKGUsdCl7cmV0dXJuIE5hTn1nZXRWYWx1ZUZvclBpeGVsKGUpe31nZXRQaXhlbEZvclRpY2soZSl7bGV0IHQ9dGhpcy50aWNrcztyZXR1cm4gZTwwfHxlPnQubGVuZ3RoLTE/bnVsbDp0aGlzLmdldFBpeGVsRm9yVmFsdWUodFtlXS52YWx1ZSl9Z2V0UGl4ZWxGb3JEZWNpbWFsKGUpe3RoaXMuX3JldmVyc2VQaXhlbHMmJihlPTEtZSk7bGV0IHQ9dGhpcy5fc3RhcnRQaXhlbCtlKnRoaXMuX2xlbmd0aDtyZXR1cm4gem8odGhpcy5fYWxpZ25Ub1BpeGVscz9Fcyh0aGlzLmNoYXJ0LHQsMCk6dCl9Z2V0RGVjaW1hbEZvclBpeGVsKGUpe2xldCB0PShlLXRoaXMuX3N0YXJ0UGl4ZWwpL3RoaXMuX2xlbmd0aDtyZXR1cm4gdGhpcy5fcmV2ZXJzZVBpeGVscz8xLXQ6dH1nZXRCYXNlUGl4ZWwoKXtyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldEJhc2VWYWx1ZSgpe2xldHttaW46ZSxtYXg6dH09dGhpcztyZXR1cm4gZTwwJiZ0PDA/dDplPjAmJnQ+MD9lOjB9Z2V0Q29udGV4dChlKXtsZXQgdD10aGlzLnRpY2tzfHxbXTtpZihlPj0wJiZlPHQubGVuZ3RoKXtsZXQgbj10W2VdO3JldHVybiBuLiRjb250ZXh0fHw9QnUodGhpcy5nZXRDb250ZXh0KCksZSxuKX1yZXR1cm4gdGhpcy4kY29udGV4dHx8PXp1KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHRoaXMpfV90aWNrU2l6ZSgpe2xldCBlPXRoaXMub3B0aW9ucy50aWNrcyx0PWpvKHRoaXMubGFiZWxSb3RhdGlvbiksbj1NYXRoLmFicyhNYXRoLmNvcyh0KSkscj1NYXRoLmFicyhNYXRoLnNpbih0KSksaT10aGlzLl9nZXRMYWJlbFNpemVzKCksYT1lLmF1dG9Ta2lwUGFkZGluZ3x8MCxvPWk/aS53aWRlc3Qud2lkdGgrYTowLHM9aT9pLmhpZ2hlc3QuaGVpZ2h0K2E6MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT9zKm4+bypyP28vbjpzL3I6cypyPG8qbj9zL246by9yfV9pc1Zpc2libGUoKXtsZXQgZT10aGlzLm9wdGlvbnMuZGlzcGxheTtyZXR1cm4gZT09PWBhdXRvYD90aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCkubGVuZ3RoPjA6ISFlfV9jb21wdXRlR3JpZExpbmVJdGVtcyhlKXtsZXQgdD10aGlzLmF4aXMsbj10aGlzLmNoYXJ0LHI9dGhpcy5vcHRpb25zLHtncmlkOmkscG9zaXRpb246YSxib3JkZXI6b309cixzPWkub2Zmc2V0LGM9dGhpcy5pc0hvcml6b250YWwoKSxsPXRoaXMudGlja3MubGVuZ3RoKyArISFzLHU9THUoaSksZD1bXSxmPW8uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscD1mLmRpc3BsYXk/Zi53aWR0aDowLG09cC8yLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIEVzKG4sZSxwKX0sZyxfLHYseSxiLHgsUyxDLHcsVCxFLEQ7aWYoYT09PWB0b3BgKWc9aCh0aGlzLmJvdHRvbSkseD10aGlzLmJvdHRvbS11LEM9Zy1tLFQ9aChlLnRvcCkrbSxEPWUuYm90dG9tO2Vsc2UgaWYoYT09PWBib3R0b21gKWc9aCh0aGlzLnRvcCksVD1lLnRvcCxEPWgoZS5ib3R0b20pLW0seD1nK20sQz10aGlzLnRvcCt1O2Vsc2UgaWYoYT09PWBsZWZ0YClnPWgodGhpcy5yaWdodCksYj10aGlzLnJpZ2h0LXUsUz1nLW0sdz1oKGUubGVmdCkrbSxFPWUucmlnaHQ7ZWxzZSBpZihhPT09YHJpZ2h0YClnPWgodGhpcy5sZWZ0KSx3PWUubGVmdCxFPWgoZS5yaWdodCktbSxiPWcrbSxTPXRoaXMubGVmdCt1O2Vsc2UgaWYodD09PWB4YCl7aWYoYT09PWBjZW50ZXJgKWc9aCgoZS50b3ArZS5ib3R0b20pLzIrLjUpO2Vsc2UgaWYoRyhhKSl7bGV0IGU9T2JqZWN0LmtleXMoYSlbMF0sdD1hW2VdO2c9aCh0aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpKX1UPWUudG9wLEQ9ZS5ib3R0b20seD1nK20sQz14K3V9ZWxzZSBpZih0PT09YHlgKXtpZihhPT09YGNlbnRlcmApZz1oKChlLmxlZnQrZS5yaWdodCkvMik7ZWxzZSBpZihHKGEpKXtsZXQgZT1PYmplY3Qua2V5cyhhKVswXSx0PWFbZV07Zz1oKHRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCkpfWI9Zy1tLFM9Yi11LHc9ZS5sZWZ0LEU9ZS5yaWdodH1sZXQgTz1xKHIudGlja3MubWF4VGlja3NMaW1pdCxsKSxrPU1hdGgubWF4KDEsTWF0aC5jZWlsKGwvTykpO2ZvcihfPTA7XzxsO18rPWspe2xldCBlPXRoaXMuZ2V0Q29udGV4dChfKSx0PWkuc2V0Q29udGV4dChlKSxyPW8uc2V0Q29udGV4dChlKSxhPXQubGluZVdpZHRoLGw9dC5jb2xvcix1PXIuZGFzaHx8W10sZj1yLmRhc2hPZmZzZXQscD10LnRpY2tXaWR0aCxtPXQudGlja0NvbG9yLGg9dC50aWNrQm9yZGVyRGFzaHx8W10sZz10LnRpY2tCb3JkZXJEYXNoT2Zmc2V0O3Y9RnUodGhpcyxfLHMpLHYhPT12b2lkIDAmJih5PUVzKG4sdixhKSxjP2I9Uz13PUU9eTp4PUM9VD1EPXksZC5wdXNoKHt0eDE6Yix0eTE6eCx0eDI6Uyx0eTI6Qyx4MTp3LHkxOlQseDI6RSx5MjpELHdpZHRoOmEsY29sb3I6bCxib3JkZXJEYXNoOnUsYm9yZGVyRGFzaE9mZnNldDpmLHRpY2tXaWR0aDpwLHRpY2tDb2xvcjptLHRpY2tCb3JkZXJEYXNoOmgsdGlja0JvcmRlckRhc2hPZmZzZXQ6Z30pKX1yZXR1cm4gdGhpcy5fdGlja3NMZW5ndGg9bCx0aGlzLl9ib3JkZXJWYWx1ZT1nLGR9X2NvbXB1dGVMYWJlbEl0ZW1zKGUpe2xldCB0PXRoaXMuYXhpcyxuPXRoaXMub3B0aW9ucyx7cG9zaXRpb246cix0aWNrczppfT1uLGE9dGhpcy5pc0hvcml6b250YWwoKSxvPXRoaXMudGlja3Mse2FsaWduOnMsY3Jvc3NBbGlnbjpjLHBhZGRpbmc6bCxtaXJyb3I6dX09aSxkPUx1KG4uZ3JpZCksZj1kK2wscD11Py1sOmYsbT0tam8odGhpcy5sYWJlbFJvdGF0aW9uKSxoPVtdLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE89YG1pZGRsZWA7aWYocj09PWB0b3BgKXg9dGhpcy5ib3R0b20tcCxTPXRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtlbHNlIGlmKHI9PT1gYm90dG9tYCl4PXRoaXMudG9wK3AsUz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7ZWxzZSBpZihyPT09YGxlZnRgKXtsZXQgZT10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpO1M9ZS50ZXh0QWxpZ24sYj1lLnh9ZWxzZSBpZihyPT09YHJpZ2h0YCl7bGV0IGU9dGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudChkKTtTPWUudGV4dEFsaWduLGI9ZS54fWVsc2UgaWYodD09PWB4YCl7aWYocj09PWBjZW50ZXJgKXg9KGUudG9wK2UuYm90dG9tKS8yK2Y7ZWxzZSBpZihHKHIpKXtsZXQgZT1PYmplY3Qua2V5cyhyKVswXSx0PXJbZV07eD10aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpK2Z9Uz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl9ZWxzZSBpZih0PT09YHlgKXtpZihyPT09YGNlbnRlcmApYj0oZS5sZWZ0K2UucmlnaHQpLzItZjtlbHNlIGlmKEcocikpe2xldCBlPU9iamVjdC5rZXlzKHIpWzBdLHQ9cltlXTtiPXRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCl9Uz10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpLnRleHRBbGlnbn10PT09YHlgJiYocz09PWBzdGFydGA/Tz1gdG9wYDpzPT09YGVuZGAmJihPPWBib3R0b21gKSk7bGV0IGs9dGhpcy5fZ2V0TGFiZWxTaXplcygpO2ZvcihnPTAsXz1vLmxlbmd0aDtnPF87KytnKXt2PW9bZ10seT12LmxhYmVsO2xldCBlPWkuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoZykpO0M9dGhpcy5nZXRQaXhlbEZvclRpY2soZykraS5sYWJlbE9mZnNldCx3PXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZyksVD13LmxpbmVIZWlnaHQsRT1XKHkpP3kubGVuZ3RoOjE7bGV0IHQ9RS8yLG49ZS5jb2xvcixzPWUudGV4dFN0cm9rZUNvbG9yLGw9ZS50ZXh0U3Ryb2tlV2lkdGgsZD1TO2E/KGI9QyxTPT09YGlubmVyYCYmKGQ9Zz09PV8tMT90aGlzLm9wdGlvbnMucmV2ZXJzZT9gbGVmdGA6YHJpZ2h0YDpnPT09MD90aGlzLm9wdGlvbnMucmV2ZXJzZT9gcmlnaHRgOmBsZWZ0YDpgY2VudGVyYCksRD1yPT09YHRvcGA/Yz09PWBuZWFyYHx8bSE9PTA/LUUqVCtULzI6Yz09PWBjZW50ZXJgPy1rLmhpZ2hlc3QuaGVpZ2h0LzItdCpUK1Q6LWsuaGlnaGVzdC5oZWlnaHQrVC8yOmM9PT1gbmVhcmB8fG0hPT0wP1QvMjpjPT09YGNlbnRlcmA/ay5oaWdoZXN0LmhlaWdodC8yLXQqVDprLmhpZ2hlc3QuaGVpZ2h0LUUqVCx1JiYoRCo9LTEpLG0hPT0wJiYhZS5zaG93TGFiZWxCYWNrZHJvcCYmKGIrPVQvMipNYXRoLnNpbihtKSkpOih4PUMsRD0oMS1FKSpULzIpO2xldCBmO2lmKGUuc2hvd0xhYmVsQmFja2Ryb3Ape2xldCB0PVEoZS5iYWNrZHJvcFBhZGRpbmcpLG49ay5oZWlnaHRzW2ddLHI9ay53aWR0aHNbZ10saT1ELXQudG9wLGE9MC10LmxlZnQ7c3dpdGNoKE8pe2Nhc2VgbWlkZGxlYDppLT1uLzI7YnJlYWs7Y2FzZWBib3R0b21gOmktPW59c3dpdGNoKFMpe2Nhc2VgY2VudGVyYDphLT1yLzI7YnJlYWs7Y2FzZWByaWdodGA6YS09cjticmVhaztjYXNlYGlubmVyYDpnPT09Xy0xP2EtPXI6Zz4wJiYoYS09ci8yKX1mPXtsZWZ0OmEsdG9wOmksd2lkdGg6cit0LndpZHRoLGhlaWdodDpuK3QuaGVpZ2h0LGNvbG9yOmUuYmFja2Ryb3BDb2xvcn19aC5wdXNoKHtsYWJlbDp5LGZvbnQ6dyx0ZXh0T2Zmc2V0OkQsb3B0aW9uczp7cm90YXRpb246bSxjb2xvcjpuLHN0cm9rZUNvbG9yOnMsc3Ryb2tlV2lkdGg6bCx0ZXh0QWxpZ246ZCx0ZXh0QmFzZWxpbmU6Tyx0cmFuc2xhdGlvbjpbYix4XSxiYWNrZHJvcDpmfX0pfXJldHVybiBofV9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl7bGV0e3Bvc2l0aW9uOmUsdGlja3M6dH09dGhpcy5vcHRpb25zO2lmKC1qbyh0aGlzLmxhYmVsUm90YXRpb24pKXJldHVybiBlPT09YHRvcGA/YGxlZnRgOmByaWdodGA7bGV0IG49YGNlbnRlcmA7cmV0dXJuIHQuYWxpZ249PT1gc3RhcnRgP249YGxlZnRgOnQuYWxpZ249PT1gZW5kYD9uPWByaWdodGA6dC5hbGlnbj09PWBpbm5lcmAmJihuPWBpbm5lcmApLG59X2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZSl7bGV0e3Bvc2l0aW9uOnQsdGlja3M6e2Nyb3NzQWxpZ246bixtaXJyb3I6cixwYWRkaW5nOml9fT10aGlzLm9wdGlvbnMsYT10aGlzLl9nZXRMYWJlbFNpemVzKCksbz1lK2kscz1hLndpZGVzdC53aWR0aCxjLGw7cmV0dXJuIHQ9PT1gbGVmdGA/cj8obD10aGlzLnJpZ2h0K2ksbj09PWBuZWFyYD9jPWBsZWZ0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbCs9cy8yKTooYz1gcmlnaHRgLGwrPXMpKToobD10aGlzLnJpZ2h0LW8sbj09PWBuZWFyYD9jPWByaWdodGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwtPXMvMik6KGM9YGxlZnRgLGw9dGhpcy5sZWZ0KSk6dD09PWByaWdodGA/cj8obD10aGlzLmxlZnQraSxuPT09YG5lYXJgP2M9YHJpZ2h0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbC09cy8yKTooYz1gbGVmdGAsbC09cykpOihsPXRoaXMubGVmdCtvLG49PT1gbmVhcmA/Yz1gbGVmdGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwrPXMvMik6KGM9YHJpZ2h0YCxsPXRoaXMucmlnaHQpKTpjPWByaWdodGAse3RleHRBbGlnbjpjLHg6bH19X2NvbXB1dGVMYWJlbEFyZWEoKXtpZih0aGlzLm9wdGlvbnMudGlja3MubWlycm9yKXJldHVybjtsZXQgZT10aGlzLmNoYXJ0LHQ9dGhpcy5vcHRpb25zLnBvc2l0aW9uO2lmKHQ9PT1gbGVmdGB8fHQ9PT1gcmlnaHRgKXJldHVybnt0b3A6MCxsZWZ0OnRoaXMubGVmdCxib3R0b206ZS5oZWlnaHQscmlnaHQ6dGhpcy5yaWdodH07aWYodD09PWB0b3BgfHx0PT09YGJvdHRvbWApcmV0dXJue3RvcDp0aGlzLnRvcCxsZWZ0OjAsYm90dG9tOnRoaXMuYm90dG9tLHJpZ2h0OmUud2lkdGh9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2N0eDplLG9wdGlvbnM6e2JhY2tncm91bmRDb2xvcjp0fSxsZWZ0Om4sdG9wOnIsd2lkdGg6aSxoZWlnaHQ6YX09dGhpczt0JiYoZS5zYXZlKCksZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KG4scixpLGEpLGUucmVzdG9yZSgpKX1nZXRMaW5lV2lkdGhGb3JWYWx1ZShlKXtsZXQgdD10aGlzLm9wdGlvbnMuZ3JpZDtpZighdGhpcy5faXNWaXNpYmxlKCl8fCF0LmRpc3BsYXkpcmV0dXJuIDA7bGV0IG49dGhpcy50aWNrcy5maW5kSW5kZXgodD0+dC52YWx1ZT09PWUpO3JldHVybiBuPj0wP3Quc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobikpLmxpbmVXaWR0aDowfWRyYXdHcmlkKGUpe2xldCB0PXRoaXMub3B0aW9ucy5ncmlkLG49dGhpcy5jdHgscj10aGlzLl9ncmlkTGluZUl0ZW1zfHw9dGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXMoZSksaSxhLG89KGUsdCxyKT0+eyFyLndpZHRofHwhci5jb2xvcnx8KG4uc2F2ZSgpLG4ubGluZVdpZHRoPXIud2lkdGgsbi5zdHJva2VTdHlsZT1yLmNvbG9yLG4uc2V0TGluZURhc2goci5ib3JkZXJEYXNofHxbXSksbi5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQsbi5iZWdpblBhdGgoKSxuLm1vdmVUbyhlLngsZS55KSxuLmxpbmVUbyh0LngsdC55KSxuLnN0cm9rZSgpLG4ucmVzdG9yZSgpKX07aWYodC5kaXNwbGF5KWZvcihpPTAsYT1yLmxlbmd0aDtpPGE7KytpKXtsZXQgZT1yW2ldO3QuZHJhd09uQ2hhcnRBcmVhJiZvKHt4OmUueDEseTplLnkxfSx7eDplLngyLHk6ZS55Mn0sZSksdC5kcmF3VGlja3MmJm8oe3g6ZS50eDEseTplLnR5MX0se3g6ZS50eDIseTplLnR5Mn0se2NvbG9yOmUudGlja0NvbG9yLHdpZHRoOmUudGlja1dpZHRoLGJvcmRlckRhc2g6ZS50aWNrQm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OmUudGlja0JvcmRlckRhc2hPZmZzZXR9KX19ZHJhd0JvcmRlcigpe2xldHtjaGFydDplLGN0eDp0LG9wdGlvbnM6e2JvcmRlcjpuLGdyaWQ6cn19PXRoaXMsaT1uLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLGE9bi5kaXNwbGF5P2kud2lkdGg6MDtpZighYSlyZXR1cm47bGV0IG89ci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoLHM9dGhpcy5fYm9yZGVyVmFsdWUsYyxsLHUsZDt0aGlzLmlzSG9yaXpvbnRhbCgpPyhjPUVzKGUsdGhpcy5sZWZ0LGEpLWEvMixsPUVzKGUsdGhpcy5yaWdodCxvKStvLzIsdT1kPXMpOih1PUVzKGUsdGhpcy50b3AsYSktYS8yLGQ9RXMoZSx0aGlzLmJvdHRvbSxvKStvLzIsYz1sPXMpLHQuc2F2ZSgpLHQubGluZVdpZHRoPWkud2lkdGgsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oYyx1KSx0LmxpbmVUbyhsLGQpLHQuc3Ryb2tlKCksdC5yZXN0b3JlKCl9ZHJhd0xhYmVscyhlKXtpZighdGhpcy5vcHRpb25zLnRpY2tzLmRpc3BsYXkpcmV0dXJuO2xldCB0PXRoaXMuY3R4LG49dGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO24mJmpzKHQsbik7bGV0IHI9dGhpcy5nZXRMYWJlbEl0ZW1zKGUpO2ZvcihsZXQgZSBvZiByKXtsZXQgbj1lLm9wdGlvbnMscj1lLmZvbnQsaT1lLmxhYmVsLGE9ZS50ZXh0T2Zmc2V0O0lzKHQsaSwwLGEscixuKX1uJiZNcyh0KX1kcmF3VGl0bGUoKXtsZXR7Y3R4OmUsb3B0aW9uczp7cG9zaXRpb246dCx0aXRsZTpuLHJldmVyc2U6cn19PXRoaXM7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IGk9JChuLmZvbnQpLGE9UShuLnBhZGRpbmcpLG89bi5hbGlnbixzPWkubGluZUhlaWdodC8yO3Q9PT1gYm90dG9tYHx8dD09PWBjZW50ZXJgfHxHKHQpPyhzKz1hLmJvdHRvbSxXKG4udGV4dCkmJihzKz1pLmxpbmVIZWlnaHQqKG4udGV4dC5sZW5ndGgtMSkpKTpzKz1hLnRvcDtsZXR7dGl0bGVYOmMsdGl0bGVZOmwsbWF4V2lkdGg6dSxyb3RhdGlvbjpkfT1IdSh0aGlzLHMsdCxvKTtJcyhlLG4udGV4dCwwLDAsaSx7Y29sb3I6bi5jb2xvcixtYXhXaWR0aDp1LHJvdGF0aW9uOmQsdGV4dEFsaWduOlZ1KG8sdCxyKSx0ZXh0QmFzZWxpbmU6YG1pZGRsZWAsdHJhbnNsYXRpb246W2MsbF19KX1kcmF3KGUpe3RoaXMuX2lzVmlzaWJsZSgpJiYodGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQoZSksdGhpcy5kcmF3Qm9yZGVyKCksdGhpcy5kcmF3VGl0bGUoKSx0aGlzLmRyYXdMYWJlbHMoZSkpfV9sYXllcnMoKXtsZXQgdD10aGlzLm9wdGlvbnMsbj10LnRpY2tzJiZ0LnRpY2tzLnp8fDAscj1xKHQuZ3JpZCYmdC5ncmlkLnosLTEpLGk9cSh0LmJvcmRlciYmdC5ib3JkZXIueiwwKTtyZXR1cm4hdGhpcy5faXNWaXNpYmxlKCl8fHRoaXMuZHJhdyE9PWUucHJvdG90eXBlLmRyYXc/W3t6Om4sZHJhdzplPT57dGhpcy5kcmF3KGUpfX1dOlt7ejpyLGRyYXc6ZT0+e3RoaXMuZHJhd0JhY2tncm91bmQoKSx0aGlzLmRyYXdHcmlkKGUpLHRoaXMuZHJhd1RpdGxlKCl9fSx7ejppLGRyYXc6KCk9Pnt0aGlzLmRyYXdCb3JkZXIoKX19LHt6Om4sZHJhdzplPT57dGhpcy5kcmF3TGFiZWxzKGUpfX1dfWdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKGUpe2xldCB0PXRoaXMuY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLG49dGhpcy5heGlzK2BBeGlzSURgLHI9W10saSxhO2ZvcihpPTAsYT10Lmxlbmd0aDtpPGE7KytpKXtsZXQgYT10W2ldO2Fbbl09PT10aGlzLmlkJiYoIWV8fGEudHlwZT09PWUpJiZyLnB1c2goYSl9cmV0dXJuIHJ9X3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZSl7cmV0dXJuICQodGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGUpKS5mb250KX1fbWF4RGlnaXRzKCl7bGV0IGU9dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5saW5lSGVpZ2h0O3JldHVybih0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGg6dGhpcy5oZWlnaHQpL2V9fSxXdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5zY29wZT10LHRoaXMub3ZlcnJpZGU9bix0aGlzLml0ZW1zPU9iamVjdC5jcmVhdGUobnVsbCl9aXNGb3JUeXBlKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbCh0aGlzLnR5cGUucHJvdG90eXBlLGUucHJvdG90eXBlKX1yZWdpc3RlcihlKXtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSksbjtxdSh0KSYmKG49dGhpcy5yZWdpc3Rlcih0KSk7bGV0IHI9dGhpcy5pdGVtcyxpPWUuaWQsYT10aGlzLnNjb3BlK2AuYCtpO2lmKCFpKXRocm93IEVycm9yKGBjbGFzcyBkb2VzIG5vdCBoYXZlIGlkOiBgK2UpO3JldHVybiBpIGluIHI/YToocltpXT1lLEd1KGUsYSxuKSx0aGlzLm92ZXJyaWRlJiZaLm92ZXJyaWRlKGUuaWQsZS5vdmVycmlkZXMpLGEpfWdldChlKXtyZXR1cm4gdGhpcy5pdGVtc1tlXX11bnJlZ2lzdGVyKGUpe2xldCB0PXRoaXMuaXRlbXMsbj1lLmlkLHI9dGhpcy5zY29wZTtuIGluIHQmJmRlbGV0ZSB0W25dLHImJm4gaW4gWltyXSYmKGRlbGV0ZSBaW3JdW25dLHRoaXMub3ZlcnJpZGUmJmRlbGV0ZSB5c1tuXSl9fTtmdW5jdGlvbiBHdShlLHQsbil7bGV0IHI9cm8oT2JqZWN0LmNyZWF0ZShudWxsKSxbbj9aLmdldChuKTp7fSxaLmdldCh0KSxlLmRlZmF1bHRzXSk7Wi5zZXQodCxyKSxlLmRlZmF1bHRSb3V0ZXMmJkt1KHQsZS5kZWZhdWx0Um91dGVzKSxlLmRlc2NyaXB0b3JzJiZaLmRlc2NyaWJlKHQsZS5kZXNjcmlwdG9ycyl9ZnVuY3Rpb24gS3UoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49PntsZXQgcj1uLnNwbGl0KGAuYCksaT1yLnBvcCgpLGE9W2VdLmNvbmNhdChyKS5qb2luKGAuYCksbz10W25dLnNwbGl0KGAuYCkscz1vLnBvcCgpLGM9by5qb2luKGAuYCk7Wi5yb3V0ZShhLGksYyxzKX0pfWZ1bmN0aW9uIHF1KGUpe3JldHVybmBpZGBpbiBlJiZgZGVmYXVsdHNgaW4gZX12YXIgSnU9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jb250cm9sbGVycz1uZXcgV3UobGwsYGRhdGFzZXRzYCwhMCksdGhpcy5lbGVtZW50cz1uZXcgV3UoQ3UsYGVsZW1lbnRzYCksdGhpcy5wbHVnaW5zPW5ldyBXdShPYmplY3QsYHBsdWdpbnNgKSx0aGlzLnNjYWxlcz1uZXcgV3UoVXUsYHNjYWxlc2ApLHRoaXMuX3R5cGVkUmVnaXN0cmllcz1bdGhpcy5jb250cm9sbGVycyx0aGlzLnNjYWxlcyx0aGlzLmVsZW1lbnRzXX1hZGQoLi4uZSl7dGhpcy5fZWFjaChgcmVnaXN0ZXJgLGUpfXJlbW92ZSguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlKX1hZGRDb250cm9sbGVycyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1hZGRFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmVsZW1lbnRzKX1hZGRQbHVnaW5zKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMucGx1Z2lucyl9YWRkU2NhbGVzKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1nZXRDb250cm9sbGVyKGUpe3JldHVybiB0aGlzLl9nZXQoZSx0aGlzLmNvbnRyb2xsZXJzLGBjb250cm9sbGVyYCl9Z2V0RWxlbWVudChlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5lbGVtZW50cyxgZWxlbWVudGApfWdldFBsdWdpbihlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5wbHVnaW5zLGBwbHVnaW5gKX1nZXRTY2FsZShlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5zY2FsZXMsYHNjYWxlYCl9cmVtb3ZlQ29udHJvbGxlcnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1yZW1vdmVFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuZWxlbWVudHMpfXJlbW92ZVBsdWdpbnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLnBsdWdpbnMpfXJlbW92ZVNjYWxlcyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1fZWFjaChlLHQsbil7Wy4uLnRdLmZvckVhY2godD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTtufHxyLmlzRm9yVHlwZSh0KXx8cj09PXRoaXMucGx1Z2lucyYmdC5pZD90aGlzLl9leGVjKGUscix0KTpZKHQsdD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTt0aGlzLl9leGVjKGUscix0KX0pfSl9X2V4ZWMoZSx0LG4pe2xldCByPXVvKGUpO0oobltgYmVmb3JlYCtyXSxbXSxuKSx0W2VdKG4pLEoobltgYWZ0ZXJgK3JdLFtdLG4pfV9nZXRSZWdpc3RyeUZvclR5cGUoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLl90eXBlZFJlZ2lzdHJpZXMubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5fdHlwZWRSZWdpc3RyaWVzW3RdO2lmKG4uaXNGb3JUeXBlKGUpKXJldHVybiBufXJldHVybiB0aGlzLnBsdWdpbnN9X2dldChlLHQsbil7bGV0IHI9dC5nZXQoZSk7aWYocj09PXZvaWQgMCl0aHJvdyBFcnJvcihgImArZStgIiBpcyBub3QgYSByZWdpc3RlcmVkIGArbitgLmApO3JldHVybiByfX0sWXU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9pbml0PXZvaWQgMH1ub3RpZnkoZSx0LG4scil7aWYodD09PWBiZWZvcmVJbml0YCYmKHRoaXMuX2luaXQ9dGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoZSwhMCksdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsZSxgaW5zdGFsbGApKSx0aGlzLl9pbml0PT09dm9pZCAwKXJldHVybjtsZXQgaT1yP3RoaXMuX2Rlc2NyaXB0b3JzKGUpLmZpbHRlcihyKTp0aGlzLl9kZXNjcmlwdG9ycyhlKSxhPXRoaXMuX25vdGlmeShpLGUsdCxuKTtyZXR1cm4gdD09PWBhZnRlckRlc3Ryb3lgJiYodGhpcy5fbm90aWZ5KGksZSxgc3RvcGApLHRoaXMuX25vdGlmeSh0aGlzLl9pbml0LGUsYHVuaW5zdGFsbGApLHRoaXMuX2luaXQ9dm9pZCAwKSxhfV9ub3RpZnkoZSx0LG4scil7cnx8PXt9O2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1pLnBsdWdpbixhPWVbbl07aWYoSihhLFt0LHIsaS5vcHRpb25zXSxlKT09PSExJiZyLmNhbmNlbGFibGUpcmV0dXJuITF9cmV0dXJuITB9aW52YWxpZGF0ZSgpe1UodGhpcy5fY2FjaGUpfHwodGhpcy5fb2xkQ2FjaGU9dGhpcy5fY2FjaGUsdGhpcy5fY2FjaGU9dm9pZCAwKX1fZGVzY3JpcHRvcnMoZSl7aWYodGhpcy5fY2FjaGUpcmV0dXJuIHRoaXMuX2NhY2hlO2xldCB0PXRoaXMuX2NhY2hlPXRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGUpO3JldHVybiB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXMoZSksdH1fY3JlYXRlRGVzY3JpcHRvcnMoZSx0KXtsZXQgbj1lJiZlLmNvbmZpZyxyPXEobi5vcHRpb25zJiZuLm9wdGlvbnMucGx1Z2lucyx7fSksaT1YdShuKTtyZXR1cm4gcj09PSExJiYhdD9bXTpRdShlLGkscix0KX1fbm90aWZ5U3RhdGVDaGFuZ2VzKGUpe2xldCB0PXRoaXMuX29sZENhY2hlfHxbXSxuPXRoaXMuX2NhY2hlLHI9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5wbHVnaW4uaWQ9PT10LnBsdWdpbi5pZCkpO3RoaXMuX25vdGlmeShyKHQsbiksZSxgc3RvcGApLHRoaXMuX25vdGlmeShyKG4sdCksZSxgc3RhcnRgKX19O2Z1bmN0aW9uIFh1KGUpe2xldCB0PXt9LG49W10scj1PYmplY3Qua2V5cyhKdS5wbHVnaW5zLml0ZW1zKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKyluLnB1c2goSnUuZ2V0UGx1Z2luKHJbZV0pKTtsZXQgaT1lLnBsdWdpbnN8fFtdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgcj1pW2VdO24uaW5kZXhPZihyKT09PS0xJiYobi5wdXNoKHIpLHRbci5pZF09ITApfXJldHVybntwbHVnaW5zOm4sbG9jYWxJZHM6dH19ZnVuY3Rpb24gWnUoZSx0KXtyZXR1cm4hdCYmZT09PSExP251bGw6ZT09PSEwP3t9OmV9ZnVuY3Rpb24gUXUoZSx7cGx1Z2luczp0LGxvY2FsSWRzOm59LHIsaSl7bGV0IGE9W10sbz1lLmdldENvbnRleHQoKTtmb3IobGV0IHMgb2YgdCl7bGV0IHQ9cy5pZCxjPVp1KHJbdF0saSk7YyE9PW51bGwmJmEucHVzaCh7cGx1Z2luOnMsb3B0aW9uczokdShlLmNvbmZpZyx7cGx1Z2luOnMsbG9jYWw6blt0XX0sYyxvKX0pfXJldHVybiBhfWZ1bmN0aW9uICR1KGUse3BsdWdpbjp0LGxvY2FsOm59LHIsaSl7bGV0IGE9ZS5wbHVnaW5TY29wZUtleXModCksbz1lLmdldE9wdGlvblNjb3BlcyhyLGEpO3JldHVybiBuJiZ0LmRlZmF1bHRzJiZvLnB1c2godC5kZWZhdWx0cyksZS5jcmVhdGVSZXNvbHZlcihvLGksW2BgXSx7c2NyaXB0YWJsZTohMSxpbmRleGFibGU6ITEsYWxsS2V5czohMH0pfWZ1bmN0aW9uIGVkKGUsdCl7bGV0IG49Wi5kYXRhc2V0c1tlXXx8e307cmV0dXJuKCh0LmRhdGFzZXRzfHx7fSlbZV18fHt9KS5pbmRleEF4aXN8fHQuaW5kZXhBeGlzfHxuLmluZGV4QXhpc3x8YHhgfWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZTtyZXR1cm4gZT09PWBfaW5kZXhfYD9uPXQ6ZT09PWBfdmFsdWVfYCYmKG49dD09PWB4YD9geWA6YHhgKSxufWZ1bmN0aW9uIG5kKGUsdCl7cmV0dXJuIGU9PT10P2BfaW5kZXhfYDpgX3ZhbHVlX2B9ZnVuY3Rpb24gcmQoZSl7aWYoZT09PWB4YHx8ZT09PWB5YHx8ZT09PWByYClyZXR1cm4gZX1mdW5jdGlvbiBpZChlKXtpZihlPT09YHRvcGB8fGU9PT1gYm90dG9tYClyZXR1cm5geGA7aWYoZT09PWBsZWZ0YHx8ZT09PWByaWdodGApcmV0dXJuYHlgfWZ1bmN0aW9uIGFkKGUsLi4udCl7aWYocmQoZSkpcmV0dXJuIGU7Zm9yKGxldCBuIG9mIHQpe2xldCB0PW4uYXhpc3x8aWQobi5wb3NpdGlvbil8fGUubGVuZ3RoPjEmJnJkKGVbMF0udG9Mb3dlckNhc2UoKSk7aWYodClyZXR1cm4gdH10aHJvdyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke2V9JyBheGlzLiBQbGVhc2UgcHJvdmlkZSAnYXhpcycgb3IgJ3Bvc2l0aW9uJyBvcHRpb24uYCl9ZnVuY3Rpb24gb2QoZSx0LG4pe2lmKG5bdCtgQXhpc0lEYF09PT1lKXJldHVybntheGlzOnR9fWZ1bmN0aW9uIHNkKGUsdCl7aWYodC5kYXRhJiZ0LmRhdGEuZGF0YXNldHMpe2xldCBuPXQuZGF0YS5kYXRhc2V0cy5maWx0ZXIodD0+dC54QXhpc0lEPT09ZXx8dC55QXhpc0lEPT09ZSk7aWYobi5sZW5ndGgpcmV0dXJuIG9kKGUsYHhgLG5bMF0pfHxvZChlLGB5YCxuWzBdKX1yZXR1cm57fX1mdW5jdGlvbiBjZChlLHQpe2xldCBuPXlzW2UudHlwZV18fHtzY2FsZXM6e319LHI9dC5zY2FsZXN8fHt9LGk9ZWQoZS50eXBlLHQpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCh0PT57bGV0IG89clt0XTtpZighRyhvKSlyZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHt0fWApO2lmKG8uX3Byb3h5KXJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHt0fWApO2xldCBzPWFkKHQsbyxzZCh0LGUpLFouc2NhbGVzW28udHlwZV0pLGM9bmQocyxpKSxsPW4uc2NhbGVzfHx7fTthW3RdPWlvKE9iamVjdC5jcmVhdGUobnVsbCksW3theGlzOnN9LG8sbFtzXSxsW2NdXSl9KSxlLmRhdGEuZGF0YXNldHMuZm9yRWFjaChuPT57bGV0IGk9bi50eXBlfHxlLnR5cGUsbz1uLmluZGV4QXhpc3x8ZWQoaSx0KSxzPSh5c1tpXXx8e30pLnNjYWxlc3x8e307T2JqZWN0LmtleXMocykuZm9yRWFjaChlPT57bGV0IHQ9dGQoZSxvKSxpPW5bdCtgQXhpc0lEYF18fHQ7YVtpXT1hW2ldfHxPYmplY3QuY3JlYXRlKG51bGwpLGlvKGFbaV0sW3theGlzOnR9LHJbaV0sc1tlXV0pfSl9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGU9PntsZXQgdD1hW2VdO2lvKHQsW1ouc2NhbGVzW3QudHlwZV0sWi5zY2FsZV0pfSksYX1mdW5jdGlvbiBsZChlKXtsZXQgdD1lLm9wdGlvbnN8fD17fTt0LnBsdWdpbnM9cSh0LnBsdWdpbnMse30pLHQuc2NhbGVzPWNkKGUsdCl9ZnVuY3Rpb24gdWQoZSl7cmV0dXJuIGV8fD17fSxlLmRhdGFzZXRzPWUuZGF0YXNldHN8fFtdLGUubGFiZWxzPWUubGFiZWxzfHxbXSxlfWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlfHw9e30sZS5kYXRhPXVkKGUuZGF0YSksbGQoZSksZX12YXIgZmQ9bmV3IE1hcCxwZD1uZXcgU2V0O2Z1bmN0aW9uIG1kKGUsdCl7bGV0IG49ZmQuZ2V0KGUpO3JldHVybiBufHwobj10KCksZmQuc2V0KGUsbikscGQuYWRkKG4pKSxufXZhciBoZD0oZSx0LG4pPT57bGV0IHI9bG8odCxuKTtyIT09dm9pZCAwJiZlLmFkZChyKX0sZ2Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fY29uZmlnPWRkKGUpLHRoaXMuX3Njb3BlQ2FjaGU9bmV3IE1hcCx0aGlzLl9yZXNvbHZlckNhY2hlPW5ldyBNYXB9Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5wbGF0Zm9ybX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl9jb25maWcudHlwZX1zZXQgdHlwZShlKXt0aGlzLl9jb25maWcudHlwZT1lfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuX2NvbmZpZy5kYXRhPXVkKGUpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuX2NvbmZpZy5vcHRpb25zPWV9Z2V0IHBsdWdpbnMoKXtyZXR1cm4gdGhpcy5fY29uZmlnLnBsdWdpbnN9dXBkYXRlKCl7bGV0IGU9dGhpcy5fY29uZmlnO3RoaXMuY2xlYXJDYWNoZSgpLGxkKGUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9zY29wZUNhY2hlLmNsZWFyKCksdGhpcy5fcmVzb2x2ZXJDYWNoZS5jbGVhcigpfWRhdGFzZXRTY29wZUtleXMoZSl7cmV0dXJuIG1kKGUsKCk9PltbYGRhdGFzZXRzLiR7ZX1gLGBgXV0pfWRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0udHJhbnNpdGlvbi4ke3R9YCwoKT0+W1tgZGF0YXNldHMuJHtlfS50cmFuc2l0aW9ucy4ke3R9YCxgdHJhbnNpdGlvbnMuJHt0fWBdLFtgZGF0YXNldHMuJHtlfWAsYGBdXSl9ZGF0YXNldEVsZW1lbnRTY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0tJHt0fWAsKCk9PltbYGRhdGFzZXRzLiR7ZX0uZWxlbWVudHMuJHt0fWAsYGRhdGFzZXRzLiR7ZX1gLGBlbGVtZW50cy4ke3R9YCxgYF1dKX1wbHVnaW5TY29wZUtleXMoZSl7bGV0IHQ9ZS5pZCxuPXRoaXMudHlwZTtyZXR1cm4gbWQoYCR7bn0tcGx1Z2luLSR7dH1gLCgpPT5bW2BwbHVnaW5zLiR7dH1gLC4uLmUuYWRkaXRpb25hbE9wdGlvblNjb3Blc3x8W11dXSl9X2NhY2hlZFNjb3BlcyhlLHQpe2xldCBuPXRoaXMuX3Njb3BlQ2FjaGUscj1uLmdldChlKTtyZXR1cm4oIXJ8fHQpJiYocj1uZXcgTWFwLG4uc2V0KGUscikpLHJ9Z2V0T3B0aW9uU2NvcGVzKGUsdCxuKXtsZXR7b3B0aW9uczpyLHR5cGU6aX09dGhpcyxhPXRoaXMuX2NhY2hlZFNjb3BlcyhlLG4pLG89YS5nZXQodCk7aWYobylyZXR1cm4gbztsZXQgcz1uZXcgU2V0O3QuZm9yRWFjaCh0PT57ZSYmKHMuYWRkKGUpLHQuZm9yRWFjaCh0PT5oZChzLGUsdCkpKSx0LmZvckVhY2goZT0+aGQocyxyLGUpKSx0LmZvckVhY2goZT0+aGQocyx5c1tpXXx8e30sZSkpLHQuZm9yRWFjaChlPT5oZChzLFosZSkpLHQuZm9yRWFjaChlPT5oZChzLGJzLGUpKX0pO2xldCBjPUFycmF5LmZyb20ocyk7cmV0dXJuIGMubGVuZ3RoPT09MCYmYy5wdXNoKE9iamVjdC5jcmVhdGUobnVsbCkpLHBkLmhhcyh0KSYmYS5zZXQodCxjKSxjfWNoYXJ0T3B0aW9uU2NvcGVzKCl7bGV0e29wdGlvbnM6ZSx0eXBlOnR9PXRoaXM7cmV0dXJuW2UseXNbdF18fHt9LFouZGF0YXNldHNbdF18fHt9LHt0eXBlOnR9LFosYnNdfXJlc29sdmVOYW1lZE9wdGlvbnMoZSx0LG4scj1bYGBdKXtsZXQgaT17JHNoYXJlZDohMH0se3Jlc29sdmVyOmEsc3ViUHJlZml4ZXM6b309X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLHIpLHM9YTtpZih5ZChhLHQpKXtpLiRzaGFyZWQ9ITEsbj1wbyhuKT9uKCk6bjtsZXQgdD10aGlzLmNyZWF0ZVJlc29sdmVyKGUsbixvKTtzPVlzKGEsbix0KX1mb3IobGV0IGUgb2YgdClpW2VdPXNbZV07cmV0dXJuIGl9Y3JlYXRlUmVzb2x2ZXIoZSx0LG49W2BgXSxyKXtsZXR7cmVzb2x2ZXI6aX09X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLG4pO3JldHVybiBHKHQpP1lzKGksdCx2b2lkIDAscik6aX19O2Z1bmN0aW9uIF9kKGUsdCxuKXtsZXQgcj1lLmdldCh0KTtyfHwocj1uZXcgTWFwLGUuc2V0KHQscikpO2xldCBpPW4uam9pbigpLGE9ci5nZXQoaSk7cmV0dXJuIGF8fChhPXtyZXNvbHZlcjpKcyh0LG4pLHN1YlByZWZpeGVzOm4uZmlsdGVyKGU9PiFlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYGhvdmVyYCkpfSxyLnNldChpLGEpKSxhfXZhciB2ZD1lPT5HKGUpJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5zb21lKHQ9PnBvKGVbdF0pKTtmdW5jdGlvbiB5ZChlLHQpe2xldHtpc1NjcmlwdGFibGU6bixpc0luZGV4YWJsZTpyfT1YcyhlKTtmb3IobGV0IGkgb2YgdCl7bGV0IHQ9bihpKSxhPXIoaSksbz0oYXx8dCkmJmVbaV07aWYodCYmKHBvKG8pfHx2ZChvKSl8fGEmJlcobykpcmV0dXJuITB9cmV0dXJuITF9dmFyIGJkPWA0LjUuMWAseGQ9W2B0b3BgLGBib3R0b21gLGBsZWZ0YCxgcmlnaHRgLGBjaGFydEFyZWFgXTtmdW5jdGlvbiBTZChlLHQpe3JldHVybiBlPT09YHRvcGB8fGU9PT1gYm90dG9tYHx8eGQuaW5kZXhPZihlKT09PS0xJiZ0PT09YHhgfWZ1bmN0aW9uIENkKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bZV09PT1yW2VdP25bdF0tclt0XTpuW2VdLXJbZV19fWZ1bmN0aW9uIHdkKGUpe2xldCB0PWUuY2hhcnQsbj10Lm9wdGlvbnMuYW5pbWF0aW9uO3Qubm90aWZ5UGx1Z2lucyhgYWZ0ZXJSZW5kZXJgKSxKKG4mJm4ub25Db21wbGV0ZSxbZV0sdCl9ZnVuY3Rpb24gVGQoZSl7bGV0IHQ9ZS5jaGFydCxuPXQub3B0aW9ucy5hbmltYXRpb247SihuJiZuLm9uUHJvZ3Jlc3MsW2VdLHQpfWZ1bmN0aW9uIEVkKGUpe3JldHVybiBwYygpJiZ0eXBlb2YgZT09YHN0cmluZ2A/ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplJiZlLmxlbmd0aCYmKGU9ZVswXSksZSYmZS5jYW52YXMmJihlPWUuY2FudmFzKSxlfXZhciBEZD17fSxPZD1lPT57bGV0IHQ9RWQoZSk7cmV0dXJuIE9iamVjdC52YWx1ZXMoRGQpLmZpbHRlcihlPT5lLmNhbnZhcz09PXQpLnBvcCgpfTtmdW5jdGlvbiBrZChlLHQsbil7bGV0IHI9T2JqZWN0LmtleXMoZSk7Zm9yKGxldCBpIG9mIHIpe2xldCByPStpO2lmKHI+PXQpe2xldCBhPWVbaV07ZGVsZXRlIGVbaV0sKG4+MHx8cj50KSYmKGVbcituXT1hKX19fWZ1bmN0aW9uIEFkKGUsdCxuLHIpe3JldHVybiFufHxlLnR5cGU9PT1gbW91c2VvdXRgP251bGw6cj90OmV9dmFyIGpkPWNsYXNze3N0YXRpYyBkZWZhdWx0cz1aO3N0YXRpYyBpbnN0YW5jZXM9RGQ7c3RhdGljIG92ZXJyaWRlcz15cztzdGF0aWMgcmVnaXN0cnk9SnU7c3RhdGljIHZlcnNpb249YmQ7c3RhdGljIGdldENoYXJ0PU9kO3N0YXRpYyByZWdpc3RlciguLi5lKXtKdS5hZGQoLi4uZSksTWQoKX1zdGF0aWMgdW5yZWdpc3RlciguLi5lKXtKdS5yZW1vdmUoLi4uZSksTWQoKX1jb25zdHJ1Y3RvcihlLHQpe2xldCBuPXRoaXMuY29uZmlnPW5ldyBnZCh0KSxyPUVkKGUpLGk9T2Qocik7aWYoaSl0aHJvdyBFcnJvcihgQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEICdgK2kuaWQrYCcgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjYW52YXMgd2l0aCBJRCAnYCtpLmNhbnZhcy5pZCtgJyBjYW4gYmUgcmV1c2VkLmApO2xldCBhPW4uY3JlYXRlUmVzb2x2ZXIobi5jaGFydE9wdGlvblNjb3BlcygpLHRoaXMuZ2V0Q29udGV4dCgpKTt0aGlzLnBsYXRmb3JtPW5ldyhuLnBsYXRmb3JtfHwoU3UocikpKSx0aGlzLnBsYXRmb3JtLnVwZGF0ZUNvbmZpZyhuKTtsZXQgbz10aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KHIsYS5hc3BlY3RSYXRpbykscz1vJiZvLmNhbnZhcyxjPXMmJnMuaGVpZ2h0LGw9cyYmcy53aWR0aDtpZih0aGlzLmlkPVhhKCksdGhpcy5jdHg9byx0aGlzLmNhbnZhcz1zLHRoaXMud2lkdGg9bCx0aGlzLmhlaWdodD1jLHRoaXMuX29wdGlvbnM9YSx0aGlzLl9hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHRoaXMuX2xheWVycz1bXSx0aGlzLl9tZXRhc2V0cz1bXSx0aGlzLl9zdGFja3M9dm9pZCAwLHRoaXMuYm94ZXM9W10sdGhpcy5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz12b2lkIDAsdGhpcy5jaGFydEFyZWE9dm9pZCAwLHRoaXMuX2FjdGl2ZT1bXSx0aGlzLl9sYXN0RXZlbnQ9dm9pZCAwLHRoaXMuX2xpc3RlbmVycz17fSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zb3J0ZWRNZXRhc2V0cz1bXSx0aGlzLnNjYWxlcz17fSx0aGlzLl9wbHVnaW5zPW5ldyBZdSx0aGlzLiRwcm94aWVzPXt9LHRoaXMuX2hpZGRlbkluZGljZXM9e30sdGhpcy5hdHRhY2hlZD0hMSx0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQ9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX2RvUmVzaXplPVpvKGU9PnRoaXMudXBkYXRlKGUpLGEucmVzaXplRGVsYXl8fDApLHRoaXMuX2RhdGFDaGFuZ2VzPVtdLERkW3RoaXMuaWRdPXRoaXMsIW98fCFzKXtjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNoYXJ0OiBjYW4ndCBhY3F1aXJlIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gaXRlbWApO3JldHVybn1MYy5saXN0ZW4odGhpcyxgY29tcGxldGVgLHdkKSxMYy5saXN0ZW4odGhpcyxgcHJvZ3Jlc3NgLFRkKSx0aGlzLl9pbml0aWFsaXplKCksdGhpcy5hdHRhY2hlZCYmdGhpcy51cGRhdGUoKX1nZXQgYXNwZWN0UmF0aW8oKXtsZXR7b3B0aW9uczp7YXNwZWN0UmF0aW86ZSxtYWludGFpbkFzcGVjdFJhdGlvOnR9LHdpZHRoOm4saGVpZ2h0OnIsX2FzcGVjdFJhdGlvOml9PXRoaXM7cmV0dXJuIFUoZSk/dCYmaT9pOnI/bi9yOm51bGw6ZX1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmNvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuY29uZmlnLmRhdGE9ZX1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuY29uZmlnLm9wdGlvbnM9ZX1nZXQgcmVnaXN0cnkoKXtyZXR1cm4gSnV9X2luaXRpYWxpemUoKXtyZXR1cm4gdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVJbml0YCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5yZXNpemUoKTpFYyh0aGlzLHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmJpbmRFdmVudHMoKSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVySW5pdGApLHRoaXN9Y2xlYXIoKXtyZXR1cm4gRHModGhpcy5jYW52YXMsdGhpcy5jdHgpLHRoaXN9c3RvcCgpe3JldHVybiBMYy5zdG9wKHRoaXMpLHRoaXN9cmVzaXplKGUsdCl7TGMucnVubmluZyh0aGlzKT90aGlzLl9yZXNpemVCZWZvcmVEcmF3PXt3aWR0aDplLGhlaWdodDp0fTp0aGlzLl9yZXNpemUoZSx0KX1fcmVzaXplKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLHI9dGhpcy5jYW52YXMsaT1uLm1haW50YWluQXNwZWN0UmF0aW8mJnRoaXMuYXNwZWN0UmF0aW8sYT10aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKHIsZSx0LGkpLG89bi5kZXZpY2VQaXhlbFJhdGlvfHx0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKSxzPXRoaXMud2lkdGg/YHJlc2l6ZWA6YGF0dGFjaGA7dGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuX2FzcGVjdFJhdGlvPXRoaXMuYXNwZWN0UmF0aW8sRWModGhpcyxvLCEwKSYmKHRoaXMubm90aWZ5UGx1Z2lucyhgcmVzaXplYCx7c2l6ZTphfSksSihuLm9uUmVzaXplLFt0aGlzLGFdLHRoaXMpLHRoaXMuYXR0YWNoZWQmJnRoaXMuX2RvUmVzaXplKHMpJiZ0aGlzLnJlbmRlcigpKX1lbnN1cmVTY2FsZXNIYXZlSURzKCl7WSh0aGlzLm9wdGlvbnMuc2NhbGVzfHx7fSwoZSx0KT0+e2UuaWQ9dH0pfWJ1aWxkT3JVcGRhdGVTY2FsZXMoKXtsZXQgZT10aGlzLm9wdGlvbnMsdD1lLnNjYWxlcyxuPXRoaXMuc2NhbGVzLHI9T2JqZWN0LmtleXMobikucmVkdWNlKChlLHQpPT4oZVt0XT0hMSxlKSx7fSksaT1bXTt0JiYoaT1pLmNvbmNhdChPYmplY3Qua2V5cyh0KS5tYXAoZT0+e2xldCBuPXRbZV0scj1hZChlLG4pLGk9cj09PWByYCxhPXI9PT1geGA7cmV0dXJue29wdGlvbnM6bixkcG9zaXRpb246aT9gY2hhcnRBcmVhYDphP2Bib3R0b21gOmBsZWZ0YCxkdHlwZTppP2ByYWRpYWxMaW5lYXJgOmE/YGNhdGVnb3J5YDpgbGluZWFyYH19KSkpLFkoaSx0PT57bGV0IGk9dC5vcHRpb25zLGE9aS5pZCxvPWFkKGEsaSkscz1xKGkudHlwZSx0LmR0eXBlKTsoaS5wb3NpdGlvbj09PXZvaWQgMHx8U2QoaS5wb3NpdGlvbixvKSE9PVNkKHQuZHBvc2l0aW9uKSkmJihpLnBvc2l0aW9uPXQuZHBvc2l0aW9uKSxyW2FdPSEwO2xldCBjPW51bGw7YSBpbiBuJiZuW2FdLnR5cGU9PT1zP2M9blthXTooYz1uZXcoSnUuZ2V0U2NhbGUocykpKHtpZDphLHR5cGU6cyxjdHg6dGhpcy5jdHgsY2hhcnQ6dGhpc30pLG5bYy5pZF09YyksYy5pbml0KGksZSl9KSxZKHIsKGUsdCk9PntlfHxkZWxldGUgblt0XX0pLFkobixlPT57JGwuY29uZmlndXJlKHRoaXMsZSxlLm9wdGlvbnMpLCRsLmFkZEJveCh0aGlzLGUpfSl9X3VwZGF0ZU1ldGFzZXRzKCl7bGV0IGU9dGhpcy5fbWV0YXNldHMsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49ZS5sZW5ndGg7aWYoZS5zb3J0KChlLHQpPT5lLmluZGV4LXQuaW5kZXgpLG4+dCl7Zm9yKGxldCBlPXQ7ZTxuOysrZSl0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoZSk7ZS5zcGxpY2UodCxuLXQpfXRoaXMuX3NvcnRlZE1ldGFzZXRzPWUuc2xpY2UoMCkuc29ydChDZChgb3JkZXJgLGBpbmRleGApKX1fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKXtsZXR7X21ldGFzZXRzOmUsZGF0YTp7ZGF0YXNldHM6dH19PXRoaXM7ZS5sZW5ndGg+dC5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9zdGFja3MsZS5mb3JFYWNoKChlLG4pPT57dC5maWx0ZXIodD0+dD09PWUuX2RhdGFzZXQpLmxlbmd0aD09PTAmJnRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShuKX0pfWJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpe2xldCBlPVtdLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLG4scjtmb3IodGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtsZXQgcj10W25dLGk9dGhpcy5nZXREYXRhc2V0TWV0YShuKSxhPXIudHlwZXx8dGhpcy5jb25maWcudHlwZTtpZihpLnR5cGUmJmkudHlwZSE9PWEmJih0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEobiksaT10aGlzLmdldERhdGFzZXRNZXRhKG4pKSxpLnR5cGU9YSxpLmluZGV4QXhpcz1yLmluZGV4QXhpc3x8ZWQoYSx0aGlzLm9wdGlvbnMpLGkub3JkZXI9ci5vcmRlcnx8MCxpLmluZGV4PW4saS5sYWJlbD1gYCtyLmxhYmVsLGkudmlzaWJsZT10aGlzLmlzRGF0YXNldFZpc2libGUobiksaS5jb250cm9sbGVyKWkuY29udHJvbGxlci51cGRhdGVJbmRleChuKSxpLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO2Vsc2V7bGV0IHQ9SnUuZ2V0Q29udHJvbGxlcihhKSx7ZGF0YXNldEVsZW1lbnRUeXBlOnIsZGF0YUVsZW1lbnRUeXBlOm99PVouZGF0YXNldHNbYV07T2JqZWN0LmFzc2lnbih0LHtkYXRhRWxlbWVudFR5cGU6SnUuZ2V0RWxlbWVudChvKSxkYXRhc2V0RWxlbWVudFR5cGU6ciYmSnUuZ2V0RWxlbWVudChyKX0pLGkuY29udHJvbGxlcj1uZXcgdCh0aGlzLG4pLGUucHVzaChpLmNvbnRyb2xsZXIpfX1yZXR1cm4gdGhpcy5fdXBkYXRlTWV0YXNldHMoKSxlfV9yZXNldEVsZW1lbnRzKCl7WSh0aGlzLmRhdGEuZGF0YXNldHMsKGUsdCk9Pnt0aGlzLmdldERhdGFzZXRNZXRhKHQpLmNvbnRyb2xsZXIucmVzZXQoKX0sdGhpcyl9cmVzZXQoKXt0aGlzLl9yZXNldEVsZW1lbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKGByZXNldGApfXVwZGF0ZShlKXtsZXQgdD10aGlzLmNvbmZpZzt0LnVwZGF0ZSgpO2xldCBuPXRoaXMuX29wdGlvbnM9dC5jcmVhdGVSZXNvbHZlcih0LmNoYXJ0T3B0aW9uU2NvcGVzKCksdGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSFuLmFuaW1hdGlvbjtpZih0aGlzLl91cGRhdGVTY2FsZXMoKSx0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKSx0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCksdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCksdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVVcGRhdGVgLHttb2RlOmUsY2FuY2VsYWJsZTohMH0pPT09ITEpcmV0dXJuO2xldCBpPXRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVFbGVtZW50c1VwZGF0ZWApO2xldCBhPTA7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDtlKyspe2xldHtjb250cm9sbGVyOnR9PXRoaXMuZ2V0RGF0YXNldE1ldGEoZSksbj0hciYmaS5pbmRleE9mKHQpPT09LTE7dC5idWlsZE9yVXBkYXRlRWxlbWVudHMobiksYT1NYXRoLm1heCgrdC5nZXRNYXhPdmVyZmxvdygpLGEpfWE9dGhpcy5fbWluUGFkZGluZz1uLmxheW91dC5hdXRvUGFkZGluZz9hOjAsdGhpcy5fdXBkYXRlTGF5b3V0KGEpLHJ8fFkoaSxlPT57ZS5yZXNldCgpfSksdGhpcy5fdXBkYXRlRGF0YXNldHMoZSksdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlclVwZGF0ZWAse21vZGU6ZX0pLHRoaXMuX2xheWVycy5zb3J0KENkKGB6YCxgX2lkeGApKTtsZXR7X2FjdGl2ZTpvLF9sYXN0RXZlbnQ6c309dGhpcztzP3RoaXMuX2V2ZW50SGFuZGxlcihzLCEwKTpvLmxlbmd0aCYmdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMobyxvLCEwKSx0aGlzLnJlbmRlcigpfV91cGRhdGVTY2FsZXMoKXtZKHRoaXMuc2NhbGVzLGU9PnskbC5yZW1vdmVCb3godGhpcyxlKX0pLHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpLHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpfV9jaGVja0V2ZW50QmluZGluZ3MoKXtsZXQgZT10aGlzLm9wdGlvbnM7KCFtbyhuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpLG5ldyBTZXQoZS5ldmVudHMpKXx8ISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzIT09ZS5yZXNwb25zaXZlKSYmKHRoaXMudW5iaW5kRXZlbnRzKCksdGhpcy5iaW5kRXZlbnRzKCkpfV91cGRhdGVIaWRkZW5JbmRpY2VzKCl7bGV0e19oaWRkZW5JbmRpY2VzOmV9PXRoaXMsdD10aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXx8W107Zm9yKGxldHttZXRob2Q6bixzdGFydDpyLGNvdW50Oml9b2YgdClrZChlLHIsbj09PWBfcmVtb3ZlRWxlbWVudHNgPy1pOmkpfV9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXtsZXQgZT10aGlzLl9kYXRhQ2hhbmdlcztpZighZXx8IWUubGVuZ3RoKXJldHVybjt0aGlzLl9kYXRhQ2hhbmdlcz1bXTtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49dD0+bmV3IFNldChlLmZpbHRlcihlPT5lWzBdPT09dCkubWFwKChlLHQpPT50K2AsYCtlLnNwbGljZSgxKS5qb2luKGAsYCkpKSxyPW4oMCk7Zm9yKGxldCBlPTE7ZTx0O2UrKylpZighbW8ocixuKGUpKSlyZXR1cm47cmV0dXJuIEFycmF5LmZyb20ocikubWFwKGU9PmUuc3BsaXQoYCxgKSkubWFwKGU9Pih7bWV0aG9kOmVbMV0sc3RhcnQ6K2VbMl0sY291bnQ6K2VbM119KSl9X3VwZGF0ZUxheW91dChlKXtpZih0aGlzLm5vdGlmeVBsdWdpbnMoYGJlZm9yZUxheW91dGAse2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjskbC51cGRhdGUodGhpcyx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LGUpO2xldCB0PXRoaXMuY2hhcnRBcmVhLG49dC53aWR0aDw9MHx8dC5oZWlnaHQ8PTA7dGhpcy5fbGF5ZXJzPVtdLFkodGhpcy5ib3hlcyxlPT57biYmZS5wb3NpdGlvbj09PWBjaGFydEFyZWFgfHwoZS5jb25maWd1cmUmJmUuY29uZmlndXJlKCksdGhpcy5fbGF5ZXJzLnB1c2goLi4uZS5fbGF5ZXJzKCkpKX0sdGhpcyksdGhpcy5fbGF5ZXJzLmZvckVhY2goKGUsdCk9PntlLl9pZHg9dH0pLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJMYXlvdXRgKX1fdXBkYXRlRGF0YXNldHMoZSl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZSxjYW5jZWxhYmxlOiEwfSkhPT0hMSl7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDsrK2UpdGhpcy5nZXREYXRhc2V0TWV0YShlKS5jb250cm9sbGVyLmNvbmZpZ3VyZSgpO2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDt0PG47Kyt0KXRoaXMuX3VwZGF0ZURhdGFzZXQodCxwbyhlKT9lKHtkYXRhc2V0SW5kZXg6dH0pOmUpO3RoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZX0pfX1fdXBkYXRlRGF0YXNldChlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSkscj17bWV0YTpuLGluZGV4OmUsbW9kZTp0LGNhbmNlbGFibGU6ITB9O3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRGF0YXNldFVwZGF0ZWAscikhPT0hMSYmKG4uY29udHJvbGxlci5fdXBkYXRlKHQpLHIuY2FuY2VsYWJsZT0hMSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVyRGF0YXNldFVwZGF0ZWAscikpfXJlbmRlcigpe3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlUmVuZGVyYCx7Y2FuY2VsYWJsZTohMH0pIT09ITEmJihMYy5oYXModGhpcyk/dGhpcy5hdHRhY2hlZCYmIUxjLnJ1bm5pbmcodGhpcykmJkxjLnN0YXJ0KHRoaXMpOih0aGlzLmRyYXcoKSx3ZCh7Y2hhcnQ6dGhpc30pKSl9ZHJhdygpe2xldCBlO2lmKHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcpe2xldHt3aWR0aDplLGhlaWdodDp0fT10aGlzLl9yZXNpemVCZWZvcmVEcmF3O3RoaXMuX3Jlc2l6ZUJlZm9yZURyYXc9bnVsbCx0aGlzLl9yZXNpemUoZSx0KX1pZih0aGlzLmNsZWFyKCksdGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTB8fHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRHJhd2Ase2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjtsZXQgdD10aGlzLl9sYXllcnM7Zm9yKGU9MDtlPHQubGVuZ3RoJiZ0W2VdLno8PTA7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7Zm9yKHRoaXMuX2RyYXdEYXRhc2V0cygpO2U8dC5sZW5ndGg7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRyYXdgKX1fZ2V0U29ydGVkRGF0YXNldE1ldGFzKGUpe2xldCB0PXRoaXMuX3NvcnRlZE1ldGFzZXRzLG49W10scixpO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKXtsZXQgaT10W3JdOyghZXx8aS52aXNpYmxlKSYmbi5wdXNoKGkpfXJldHVybiBufWdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKXtyZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCEwKX1fZHJhd0RhdGFzZXRzKCl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c0RyYXdgLHtjYW5jZWxhYmxlOiEwfSk9PT0hMSlyZXR1cm47bGV0IGU9dGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5fZHJhd0RhdGFzZXQoZVt0XSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXRzRHJhd2ApfV9kcmF3RGF0YXNldChlKXtsZXQgdD10aGlzLmN0eCxuPXttZXRhOmUsaW5kZXg6ZS5pbmRleCxjYW5jZWxhYmxlOiEwfSxyPUljKHRoaXMsZSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0RHJhd2AsbikhPT0hMSYmKHImJmpzKHQsciksZS5jb250cm9sbGVyLmRyYXcoKSxyJiZNcyh0KSxuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXREcmF3YCxuKSl9aXNQb2ludEluQXJlYShlKXtyZXR1cm4gQXMoZSx0aGlzLmNoYXJ0QXJlYSx0aGlzLl9taW5QYWRkaW5nKX1nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsdCxuLHIpe2xldCBpPUlsLm1vZGVzW3RdO3JldHVybiB0eXBlb2YgaT09YGZ1bmN0aW9uYD9pKHRoaXMsZSxuLHIpOltdfWdldERhdGFzZXRNZXRhKGUpe2xldCB0PXRoaXMuZGF0YS5kYXRhc2V0c1tlXSxuPXRoaXMuX21ldGFzZXRzLHI9bi5maWx0ZXIoZT0+ZSYmZS5fZGF0YXNldD09PXQpLnBvcCgpO3JldHVybiByfHwocj17dHlwZTpudWxsLGRhdGE6W10sZGF0YXNldDpudWxsLGNvbnRyb2xsZXI6bnVsbCxoaWRkZW46bnVsbCx4QXhpc0lEOm51bGwseUF4aXNJRDpudWxsLG9yZGVyOnQmJnQub3JkZXJ8fDAsaW5kZXg6ZSxfZGF0YXNldDp0LF9wYXJzZWQ6W10sX3NvcnRlZDohMX0sbi5wdXNoKHIpKSxyfWdldENvbnRleHQoKXtyZXR1cm4gdGhpcy4kY29udGV4dHx8PXFzKG51bGwse2NoYXJ0OnRoaXMsdHlwZTpgY2hhcnRgfSl9Z2V0VmlzaWJsZURhdGFzZXRDb3VudCgpe3JldHVybiB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5sZW5ndGh9aXNEYXRhc2V0VmlzaWJsZShlKXtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHNbZV07aWYoIXQpcmV0dXJuITE7bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtyZXR1cm4gdHlwZW9mIG4uaGlkZGVuPT1gYm9vbGVhbmA/IW4uaGlkZGVuOiF0LmhpZGRlbn1zZXREYXRhc2V0VmlzaWJpbGl0eShlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSk7bi5oaWRkZW49IXR9dG9nZ2xlRGF0YVZpc2liaWxpdHkoZSl7dGhpcy5faGlkZGVuSW5kaWNlc1tlXT0hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1nZXREYXRhVmlzaWJpbGl0eShlKXtyZXR1cm4hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1fdXBkYXRlVmlzaWJpbGl0eShlLHQsbil7bGV0IHI9bj9gc2hvd2A6YGhpZGVgLGk9dGhpcy5nZXREYXRhc2V0TWV0YShlKSxhPWkuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModm9pZCAwLHIpO2ZvKHQpPyhpLmRhdGFbdF0uaGlkZGVuPSFuLHRoaXMudXBkYXRlKCkpOih0aGlzLnNldERhdGFzZXRWaXNpYmlsaXR5KGUsbiksYS51cGRhdGUoaSx7dmlzaWJsZTpufSksdGhpcy51cGRhdGUodD0+dC5kYXRhc2V0SW5kZXg9PT1lP3I6dm9pZCAwKSl9aGlkZShlLHQpe3RoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZSx0LCExKX1zaG93KGUsdCl7dGhpcy5fdXBkYXRlVmlzaWJpbGl0eShlLHQsITApfV9kZXN0cm95RGF0YXNldE1ldGEoZSl7bGV0IHQ9dGhpcy5fbWV0YXNldHNbZV07dCYmdC5jb250cm9sbGVyJiZ0LmNvbnRyb2xsZXIuX2Rlc3Ryb3koKSxkZWxldGUgdGhpcy5fbWV0YXNldHNbZV19X3N0b3AoKXtsZXQgZSx0O2Zvcih0aGlzLnN0b3AoKSxMYy5yZW1vdmUodGhpcyksZT0wLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtlPHQ7KytlKXRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShlKX1kZXN0cm95KCl7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEZXN0cm95YCk7bGV0e2NhbnZhczplLGN0eDp0fT10aGlzO3RoaXMuX3N0b3AoKSx0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCksZSYmKHRoaXMudW5iaW5kRXZlbnRzKCksRHMoZSx0KSx0aGlzLnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0KHQpLHRoaXMuY2FudmFzPW51bGwsdGhpcy5jdHg9bnVsbCksZGVsZXRlIERkW3RoaXMuaWRdLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEZXN0cm95YCl9dG9CYXNlNjRJbWFnZSguLi5lKXtyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmUpfWJpbmRFdmVudHMoKXt0aGlzLmJpbmRVc2VyRXZlbnRzKCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpOnRoaXMuYXR0YWNoZWQ9ITB9YmluZFVzZXJFdmVudHMoKXtsZXQgZT10aGlzLl9saXN0ZW5lcnMsdD10aGlzLnBsYXRmb3JtLG49KG4scik9Pnt0LmFkZEV2ZW50TGlzdGVuZXIodGhpcyxuLHIpLGVbbl09cn0scj0oZSx0LG4pPT57ZS5vZmZzZXRYPXQsZS5vZmZzZXRZPW4sdGhpcy5fZXZlbnRIYW5kbGVyKGUpfTtZKHRoaXMub3B0aW9ucy5ldmVudHMsZT0+bihlLHIpKX1iaW5kUmVzcG9uc2l2ZUV2ZW50cygpe3RoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnN8fD17fTtsZXQgZT10aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLHQ9dGhpcy5wbGF0Zm9ybSxuPShuLHIpPT57dC5hZGRFdmVudExpc3RlbmVyKHRoaXMsbixyKSxlW25dPXJ9LHI9KG4scik9PntlW25dJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsbixyKSxkZWxldGUgZVtuXSl9LGk9KGUsdCk9Pnt0aGlzLmNhbnZhcyYmdGhpcy5yZXNpemUoZSx0KX0sYSxvPSgpPT57cihgYXR0YWNoYCxvKSx0aGlzLmF0dGFjaGVkPSEwLHRoaXMucmVzaXplKCksbihgcmVzaXplYCxpKSxuKGBkZXRhY2hgLGEpfTthPSgpPT57dGhpcy5hdHRhY2hlZD0hMSxyKGByZXNpemVgLGkpLHRoaXMuX3N0b3AoKSx0aGlzLl9yZXNpemUoMCwwKSxuKGBhdHRhY2hgLG8pfSx0LmlzQXR0YWNoZWQodGhpcy5jYW52YXMpP28oKTphKCl9dW5iaW5kRXZlbnRzKCl7WSh0aGlzLl9saXN0ZW5lcnMsKGUsdCk9Pnt0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyx0LGUpfSksdGhpcy5fbGlzdGVuZXJzPXt9LFkodGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycywoZSx0KT0+e3RoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLHQsZSl9KSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMH11cGRhdGVIb3ZlclN0eWxlKGUsdCxuKXtsZXQgcj1uP2BzZXRgOmByZW1vdmVgLGksYSxvLHM7Zm9yKHQ9PT1gZGF0YXNldGAmJihpPXRoaXMuZ2V0RGF0YXNldE1ldGEoZVswXS5kYXRhc2V0SW5kZXgpLGkuY29udHJvbGxlcltgX2ArcitgRGF0YXNldEhvdmVyU3R5bGVgXSgpKSxvPTAscz1lLmxlbmd0aDtvPHM7KytvKXthPWVbb107bGV0IHQ9YSYmdGhpcy5nZXREYXRhc2V0TWV0YShhLmRhdGFzZXRJbmRleCkuY29udHJvbGxlcjt0JiZ0W3IrYEhvdmVyU3R5bGVgXShhLmVsZW1lbnQsYS5kYXRhc2V0SW5kZXgsYS5pbmRleCl9fWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSl7bGV0IHQ9dGhpcy5fYWN0aXZlfHxbXSxuPWUubWFwKCh7ZGF0YXNldEluZGV4OmUsaW5kZXg6dH0pPT57bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtpZighbil0aHJvdyBFcnJvcihgTm8gZGF0YXNldCBmb3VuZCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pOyRhKG4sdCl8fCh0aGlzLl9hY3RpdmU9bix0aGlzLl9sYXN0RXZlbnQ9bnVsbCx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhuLHQpKX1ub3RpZnlQbHVnaW5zKGUsdCxuKXtyZXR1cm4gdGhpcy5fcGx1Z2lucy5ub3RpZnkodGhpcyxlLHQsbil9aXNQbHVnaW5FbmFibGVkKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIodD0+dC5wbHVnaW4uaWQ9PT1lKS5sZW5ndGg9PT0xfV91cGRhdGVIb3ZlclN0eWxlcyhlLHQsbil7bGV0IHI9dGhpcy5vcHRpb25zLmhvdmVyLGk9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgpKSxhPWkodCxlKSxvPW4/ZTppKGUsdCk7YS5sZW5ndGgmJnRoaXMudXBkYXRlSG92ZXJTdHlsZShhLHIubW9kZSwhMSksby5sZW5ndGgmJnIubW9kZSYmdGhpcy51cGRhdGVIb3ZlclN0eWxlKG8sci5tb2RlLCEwKX1fZXZlbnRIYW5kbGVyKGUsdCl7bGV0IG49e2V2ZW50OmUscmVwbGF5OnQsY2FuY2VsYWJsZTohMCxpbkNoYXJ0QXJlYTp0aGlzLmlzUG9pbnRJbkFyZWEoZSl9LHI9dD0+KHQub3B0aW9ucy5ldmVudHN8fHRoaXMub3B0aW9ucy5ldmVudHMpLmluY2x1ZGVzKGUubmF0aXZlLnR5cGUpO2lmKHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRXZlbnRgLG4scik9PT0hMSlyZXR1cm47bGV0IGk9dGhpcy5faGFuZGxlRXZlbnQoZSx0LG4uaW5DaGFydEFyZWEpO3JldHVybiBuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckV2ZW50YCxuLHIpLChpfHxuLmNoYW5nZWQpJiZ0aGlzLnJlbmRlcigpLHRoaXN9X2hhbmRsZUV2ZW50KGUsdCxuKXtsZXR7X2FjdGl2ZTpyPVtdLG9wdGlvbnM6aX09dGhpcyxhPXQsbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLHIsbixhKSxzPWhvKGUpLGM9QWQoZSx0aGlzLl9sYXN0RXZlbnQsbixzKTtuJiYodGhpcy5fbGFzdEV2ZW50PW51bGwsSihpLm9uSG92ZXIsW2Usbyx0aGlzXSx0aGlzKSxzJiZKKGkub25DbGljayxbZSxvLHRoaXNdLHRoaXMpKTtsZXQgbD0hJGEobyxyKTtyZXR1cm4obHx8dCkmJih0aGlzLl9hY3RpdmU9byx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhvLHIsdCkpLHRoaXMuX2xhc3RFdmVudD1jLGx9X2dldEFjdGl2ZUVsZW1lbnRzKGUsdCxuLHIpe2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIW4pcmV0dXJuIHQ7bGV0IGk9dGhpcy5vcHRpb25zLmhvdmVyO3JldHVybiB0aGlzLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxyKX19O2Z1bmN0aW9uIE1kKCl7cmV0dXJuIFkoamQuaW5zdGFuY2VzLGU9PmUuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKX1mdW5jdGlvbiBOZChlLHQpe2xldHt4Om4seTpyLGJhc2U6aSx3aWR0aDphLGhlaWdodDpvfT1lLmdldFByb3BzKFtgeGAsYHlgLGBiYXNlYCxgd2lkdGhgLGBoZWlnaHRgXSx0KSxzLGMsbCx1LGQ7cmV0dXJuIGUuaG9yaXpvbnRhbD8oZD1vLzIscz1NYXRoLm1pbihuLGkpLGM9TWF0aC5tYXgobixpKSxsPXItZCx1PXIrZCk6KGQ9YS8yLHM9bi1kLGM9bitkLGw9TWF0aC5taW4ocixpKSx1PU1hdGgubWF4KHIsaSkpLHtsZWZ0OnMsdG9wOmwscmlnaHQ6Yyxib3R0b206dX19ZnVuY3Rpb24gUGQoZSx0LG4scil7cmV0dXJuIGU/MDpSbyh0LG4scil9ZnVuY3Rpb24gRmQoZSx0LG4pe2xldCByPWUub3B0aW9ucy5ib3JkZXJXaWR0aCxpPWUuYm9yZGVyU2tpcHBlZCxhPVVzKHIpO3JldHVybnt0OlBkKGkudG9wLGEudG9wLDAsbikscjpQZChpLnJpZ2h0LGEucmlnaHQsMCx0KSxiOlBkKGkuYm90dG9tLGEuYm90dG9tLDAsbiksbDpQZChpLmxlZnQsYS5sZWZ0LDAsdCl9fWZ1bmN0aW9uIElkKGUsdCxuKXtsZXR7ZW5hYmxlQm9yZGVyUmFkaXVzOnJ9PWUuZ2V0UHJvcHMoW2BlbmFibGVCb3JkZXJSYWRpdXNgXSksaT1lLm9wdGlvbnMuYm9yZGVyUmFkaXVzLGE9V3MoaSksbz1NYXRoLm1pbih0LG4pLHM9ZS5ib3JkZXJTa2lwcGVkLGM9cnx8RyhpKTtyZXR1cm57dG9wTGVmdDpQZCghY3x8cy50b3B8fHMubGVmdCxhLnRvcExlZnQsMCxvKSx0b3BSaWdodDpQZCghY3x8cy50b3B8fHMucmlnaHQsYS50b3BSaWdodCwwLG8pLGJvdHRvbUxlZnQ6UGQoIWN8fHMuYm90dG9tfHxzLmxlZnQsYS5ib3R0b21MZWZ0LDAsbyksYm90dG9tUmlnaHQ6UGQoIWN8fHMuYm90dG9tfHxzLnJpZ2h0LGEuYm90dG9tUmlnaHQsMCxvKX19ZnVuY3Rpb24gTGQoZSl7bGV0IHQ9TmQoZSksbj10LnJpZ2h0LXQubGVmdCxyPXQuYm90dG9tLXQudG9wLGk9RmQoZSxuLzIsci8yKSxhPUlkKGUsbi8yLHIvMik7cmV0dXJue291dGVyOnt4OnQubGVmdCx5OnQudG9wLHc6bixoOnIscmFkaXVzOmF9LGlubmVyOnt4OnQubGVmdCtpLmwseTp0LnRvcCtpLnQsdzpuLWkubC1pLnIsaDpyLWkudC1pLmIscmFkaXVzOnt0b3BMZWZ0Ok1hdGgubWF4KDAsYS50b3BMZWZ0LU1hdGgubWF4KGkudCxpLmwpKSx0b3BSaWdodDpNYXRoLm1heCgwLGEudG9wUmlnaHQtTWF0aC5tYXgoaS50LGkucikpLGJvdHRvbUxlZnQ6TWF0aC5tYXgoMCxhLmJvdHRvbUxlZnQtTWF0aC5tYXgoaS5iLGkubCkpLGJvdHRvbVJpZ2h0Ok1hdGgubWF4KDAsYS5ib3R0b21SaWdodC1NYXRoLm1heChpLmIsaS5yKSl9fX19ZnVuY3Rpb24gUmQoZSx0LG4scil7bGV0IGk9dD09PW51bGwsYT1uPT09bnVsbCxvPWUmJiEoaSYmYSkmJk5kKGUscik7cmV0dXJuIG8mJihpfHxCbyh0LG8ubGVmdCxvLnJpZ2h0KSkmJihhfHxCbyhuLG8udG9wLG8uYm90dG9tKSl9ZnVuY3Rpb24gemQoZSl7cmV0dXJuIGUudG9wTGVmdHx8ZS50b3BSaWdodHx8ZS5ib3R0b21MZWZ0fHxlLmJvdHRvbVJpZ2h0fWZ1bmN0aW9uIEJkKGUsdCl7ZS5yZWN0KHQueCx0LnksdC53LHQuaCl9ZnVuY3Rpb24gVmQoZSx0LG49e30pe2xldCByPWUueD09PW4ueD8wOi10LGk9ZS55PT09bi55PzA6LXQsYT0oZS54K2Uudz09PW4ueCtuLnc/MDp0KS1yLG89KGUueStlLmg9PT1uLnkrbi5oPzA6dCktaTtyZXR1cm57eDplLngrcix5OmUueStpLHc6ZS53K2EsaDplLmgrbyxyYWRpdXM6ZS5yYWRpdXN9fXZhciBIZD1jbGFzcyBleHRlbmRzIEN1e3N0YXRpYyBpZD1gYmFyYDtzdGF0aWMgZGVmYXVsdHM9e2JvcmRlclNraXBwZWQ6YHN0YXJ0YCxib3JkZXJXaWR0aDowLGJvcmRlclJhZGl1czowLGluZmxhdGVBbW91bnQ6YGF1dG9gLHBvaW50U3R5bGU6dm9pZCAwfTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17YmFja2dyb3VuZENvbG9yOmBiYWNrZ3JvdW5kQ29sb3JgLGJvcmRlckNvbG9yOmBib3JkZXJDb2xvcmB9O2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLmhvcml6b250YWw9dm9pZCAwLHRoaXMuYmFzZT12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMuaW5mbGF0ZUFtb3VudD12b2lkIDAsZSYmT2JqZWN0LmFzc2lnbih0aGlzLGUpfWRyYXcoZSl7bGV0e2luZmxhdGVBbW91bnQ6dCxvcHRpb25zOntib3JkZXJDb2xvcjpuLGJhY2tncm91bmRDb2xvcjpyfX09dGhpcyx7aW5uZXI6aSxvdXRlcjphfT1MZCh0aGlzKSxvPXpkKGEucmFkaXVzKT9MczpCZDtlLnNhdmUoKSwoYS53IT09aS53fHxhLmghPT1pLmgpJiYoZS5iZWdpblBhdGgoKSxvKGUsVmQoYSx0LGkpKSxlLmNsaXAoKSxvKGUsVmQoaSwtdCxhKSksZS5maWxsU3R5bGU9bixlLmZpbGwoYGV2ZW5vZGRgKSksZS5iZWdpblBhdGgoKSxvKGUsVmQoaSx0KSksZS5maWxsU3R5bGU9cixlLmZpbGwoKSxlLnJlc3RvcmUoKX1pblJhbmdlKGUsdCxuKXtyZXR1cm4gUmQodGhpcyxlLHQsbil9aW5YUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxlLG51bGwsdCl9aW5ZUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxudWxsLGUsdCl9Z2V0Q2VudGVyUG9pbnQoZSl7bGV0e3g6dCx5Om4sYmFzZTpyLGhvcml6b250YWw6aX09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YCxgYmFzZWAsYGhvcml6b250YWxgXSxlKTtyZXR1cm57eDppPyh0K3IpLzI6dCx5Omk/bjoobityKS8yfX1nZXRSYW5nZShlKXtyZXR1cm4gZT09PWB4YD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMn19LFVkPShlLHQpPT57bGV0e2JveEhlaWdodDpuPXQsYm94V2lkdGg6cj10fT1lO3JldHVybiBlLnVzZVBvaW50U3R5bGUmJihuPU1hdGgubWluKG4sdCkscj1lLnBvaW50U3R5bGVXaWR0aHx8TWF0aC5taW4ocix0KSkse2JveFdpZHRoOnIsYm94SGVpZ2h0Om4saXRlbUhlaWdodDpNYXRoLm1heCh0LG4pfX0sV2Q9KGUsdCk9PmUhPT1udWxsJiZ0IT09bnVsbCYmZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgsR2Q9Y2xhc3MgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2FkZGVkPSExLHRoaXMubGVnZW5kSGl0Qm94ZXM9W10sdGhpcy5faG92ZXJlZEl0ZW09bnVsbCx0aGlzLmRvdWdobnV0TW9kZT0hMSx0aGlzLmNoYXJ0PWUuY2hhcnQsdGhpcy5vcHRpb25zPWUub3B0aW9ucyx0aGlzLmN0eD1lLmN0eCx0aGlzLmxlZ2VuZEl0ZW1zPXZvaWQgMCx0aGlzLmNvbHVtblNpemVzPXZvaWQgMCx0aGlzLmxpbmVXaWR0aHM9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLm1heFdpZHRoPXZvaWQgMCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuX21hcmdpbnM9dm9pZCAwLHRoaXMucG9zaXRpb249dm9pZCAwLHRoaXMud2VpZ2h0PXZvaWQgMCx0aGlzLmZ1bGxTaXplPXZvaWQgMH11cGRhdGUoZSx0LG4pe3RoaXMubWF4V2lkdGg9ZSx0aGlzLm1heEhlaWdodD10LHRoaXMuX21hcmdpbnM9bix0aGlzLnNldERpbWVuc2lvbnMoKSx0aGlzLmJ1aWxkTGFiZWxzKCksdGhpcy5maXQoKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD10aGlzLl9tYXJnaW5zLmxlZnQsdGhpcy5yaWdodD10aGlzLndpZHRoKToodGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdGhpcy50b3A9dGhpcy5fbWFyZ2lucy50b3AsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpfWJ1aWxkTGFiZWxzKCl7bGV0IGU9dGhpcy5vcHRpb25zLmxhYmVsc3x8e30sdD1KKGUuZ2VuZXJhdGVMYWJlbHMsW3RoaXMuY2hhcnRdLHRoaXMpfHxbXTtlLmZpbHRlciYmKHQ9dC5maWx0ZXIodD0+ZS5maWx0ZXIodCx0aGlzLmNoYXJ0LmRhdGEpKSksZS5zb3J0JiYodD10LnNvcnQoKHQsbik9PmUuc29ydCh0LG4sdGhpcy5jaGFydC5kYXRhKSkpLHRoaXMub3B0aW9ucy5yZXZlcnNlJiZ0LnJldmVyc2UoKSx0aGlzLmxlZ2VuZEl0ZW1zPXR9Zml0KCl7bGV0e29wdGlvbnM6ZSxjdHg6dH09dGhpcztpZighZS5kaXNwbGF5KXt0aGlzLndpZHRoPXRoaXMuaGVpZ2h0PTA7cmV0dXJufWxldCBuPWUubGFiZWxzLHI9JChuLmZvbnQpLGk9ci5zaXplLGE9dGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCkse2JveFdpZHRoOm8saXRlbUhlaWdodDpzfT1VZChuLGkpLGMsbDt0LmZvbnQ9ci5zdHJpbmcsdGhpcy5pc0hvcml6b250YWwoKT8oYz10aGlzLm1heFdpZHRoLGw9dGhpcy5fZml0Um93cyhhLGksbyxzKSsxMCk6KGw9dGhpcy5tYXhIZWlnaHQsYz10aGlzLl9maXRDb2xzKGEscixvLHMpKzEwKSx0aGlzLndpZHRoPU1hdGgubWluKGMsZS5tYXhXaWR0aHx8dGhpcy5tYXhXaWR0aCksdGhpcy5oZWlnaHQ9TWF0aC5taW4obCxlLm1heEhlaWdodHx8dGhpcy5tYXhIZWlnaHQpfV9maXRSb3dzKGUsdCxuLHIpe2xldHtjdHg6aSxtYXhXaWR0aDphLG9wdGlvbnM6e2xhYmVsczp7cGFkZGluZzpvfX19PXRoaXMscz10aGlzLmxlZ2VuZEhpdEJveGVzPVtdLGM9dGhpcy5saW5lV2lkdGhzPVswXSxsPXIrbyx1PWU7aS50ZXh0QWxpZ249YGxlZnRgLGkudGV4dEJhc2VsaW5lPWBtaWRkbGVgO2xldCBkPS0xLGY9LWw7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxwKT0+e2xldCBtPW4rdC8yK2kubWVhc3VyZVRleHQoZS50ZXh0KS53aWR0aDsocD09PTB8fGNbYy5sZW5ndGgtMV0rbSsyKm8+YSkmJih1Kz1sLGNbYy5sZW5ndGgtKHA+MD8wOjEpXT0wLGYrPWwsZCsrKSxzW3BdPXtsZWZ0OjAsdG9wOmYscm93OmQsd2lkdGg6bSxoZWlnaHQ6cn0sY1tjLmxlbmd0aC0xXSs9bStvfSksdX1fZml0Q29scyhlLHQsbixyKXtsZXR7Y3R4OmksbWF4SGVpZ2h0OmEsb3B0aW9uczp7bGFiZWxzOntwYWRkaW5nOm99fX09dGhpcyxzPXRoaXMubGVnZW5kSGl0Qm94ZXM9W10sYz10aGlzLmNvbHVtblNpemVzPVtdLGw9YS1lLHU9byxkPTAsZj0wLHA9MCxtPTA7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxhKT0+e2xldHtpdGVtV2lkdGg6aCxpdGVtSGVpZ2h0Omd9PUtkKG4sdCxpLGUscik7YT4wJiZmK2crMipvPmwmJih1Kz1kK28sYy5wdXNoKHt3aWR0aDpkLGhlaWdodDpmfSkscCs9ZCtvLG0rKyxkPWY9MCksc1thXT17bGVmdDpwLHRvcDpmLGNvbDptLHdpZHRoOmgsaGVpZ2h0Omd9LGQ9TWF0aC5tYXgoZCxoKSxmKz1nK299KSx1Kz1kLGMucHVzaCh7d2lkdGg6ZCxoZWlnaHQ6Zn0pLHV9YWRqdXN0SGl0Qm94ZXMoKXtpZighdGhpcy5vcHRpb25zLmRpc3BsYXkpcmV0dXJuO2xldCBlPXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpLHtsZWdlbmRIaXRCb3hlczp0LG9wdGlvbnM6e2FsaWduOm4sbGFiZWxzOntwYWRkaW5nOnJ9LHJ0bDppfX09dGhpcyxhPWpjKGksdGhpcy5sZWZ0LHRoaXMud2lkdGgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2xldCBpPTAsbz0kbyhuLHRoaXMubGVmdCtyLHRoaXMucmlnaHQtdGhpcy5saW5lV2lkdGhzW2ldKTtmb3IobGV0IHMgb2YgdClpIT09cy5yb3cmJihpPXMucm93LG89JG8obix0aGlzLmxlZnQrcix0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tpXSkpLHMudG9wKz10aGlzLnRvcCtlK3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngobykscy53aWR0aCksbys9cy53aWR0aCtyfWVsc2V7bGV0IGk9MCxvPSRvKG4sdGhpcy50b3ArZStyLHRoaXMuYm90dG9tLXRoaXMuY29sdW1uU2l6ZXNbaV0uaGVpZ2h0KTtmb3IobGV0IHMgb2YgdClzLmNvbCE9PWkmJihpPXMuY29sLG89JG8obix0aGlzLnRvcCtlK3IsdGhpcy5ib3R0b20tdGhpcy5jb2x1bW5TaXplc1tpXS5oZWlnaHQpKSxzLnRvcD1vLHMubGVmdCs9dGhpcy5sZWZ0K3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngocy5sZWZ0KSxzLndpZHRoKSxvKz1zLmhlaWdodCtyfX1pc0hvcml6b250YWwoKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uPT09YHRvcGB8fHRoaXMub3B0aW9ucy5wb3NpdGlvbj09PWBib3R0b21gfWRyYXcoKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSl7bGV0IGU9dGhpcy5jdHg7anMoZSx0aGlzKSx0aGlzLl9kcmF3KCksTXMoZSl9fV9kcmF3KCl7bGV0e29wdGlvbnM6ZSxjb2x1bW5TaXplczp0LGxpbmVXaWR0aHM6bixjdHg6cn09dGhpcyx7YWxpZ246aSxsYWJlbHM6YX09ZSxvPVouY29sb3Iscz1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYz0kKGEuZm9udCkse3BhZGRpbmc6bH09YSx1PWMuc2l6ZSxkPXUvMixmO3RoaXMuZHJhd1RpdGxlKCksci50ZXh0QWxpZ249cy50ZXh0QWxpZ24oYGxlZnRgKSxyLnRleHRCYXNlbGluZT1gbWlkZGxlYCxyLmxpbmVXaWR0aD0uNSxyLmZvbnQ9Yy5zdHJpbmc7bGV0e2JveFdpZHRoOnAsYm94SGVpZ2h0Om0saXRlbUhlaWdodDpofT1VZChhLHUpLGc9ZnVuY3Rpb24oZSx0LG4pe2lmKGlzTmFOKHApfHxwPD0wfHxpc05hTihtKXx8bTwwKXJldHVybjtyLnNhdmUoKTtsZXQgaT1xKG4ubGluZVdpZHRoLDEpO2lmKHIuZmlsbFN0eWxlPXEobi5maWxsU3R5bGUsbyksci5saW5lQ2FwPXEobi5saW5lQ2FwLGBidXR0YCksci5saW5lRGFzaE9mZnNldD1xKG4ubGluZURhc2hPZmZzZXQsMCksci5saW5lSm9pbj1xKG4ubGluZUpvaW4sYG1pdGVyYCksci5saW5lV2lkdGg9aSxyLnN0cm9rZVN0eWxlPXEobi5zdHJva2VTdHlsZSxvKSxyLnNldExpbmVEYXNoKHEobi5saW5lRGFzaCxbXSkpLGEudXNlUG9pbnRTdHlsZSl7bGV0IG89e3JhZGl1czptKk1hdGguU1FSVDIvMixwb2ludFN0eWxlOm4ucG9pbnRTdHlsZSxyb3RhdGlvbjpuLnJvdGF0aW9uLGJvcmRlcldpZHRoOml9LGM9cy54UGx1cyhlLHAvMiksbD10K2Q7a3MocixvLGMsbCxhLnBvaW50U3R5bGVXaWR0aCYmcCl9ZWxzZXtsZXQgYT10K01hdGgubWF4KCh1LW0pLzIsMCksbz1zLmxlZnRGb3JMdHIoZSxwKSxjPVdzKG4uYm9yZGVyUmFkaXVzKTtyLmJlZ2luUGF0aCgpLE9iamVjdC52YWx1ZXMoYykuc29tZShlPT5lIT09MCk/THMocix7eDpvLHk6YSx3OnAsaDptLHJhZGl1czpjfSk6ci5yZWN0KG8sYSxwLG0pLHIuZmlsbCgpLGkhPT0wJiZyLnN0cm9rZSgpfXIucmVzdG9yZSgpfSxfPWZ1bmN0aW9uKGUsdCxuKXtJcyhyLG4udGV4dCxlLHQraC8yLGMse3N0cmlrZXRocm91Z2g6bi5oaWRkZW4sdGV4dEFsaWduOnMudGV4dEFsaWduKG4udGV4dEFsaWduKX0pfSx2PXRoaXMuaXNIb3Jpem9udGFsKCkseT10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtmPXY/e3g6JG8oaSx0aGlzLmxlZnQrbCx0aGlzLnJpZ2h0LW5bMF0pLHk6dGhpcy50b3ArbCt5LGxpbmU6MH06e3g6dGhpcy5sZWZ0K2wseTokbyhpLHRoaXMudG9wK3krbCx0aGlzLmJvdHRvbS10WzBdLmhlaWdodCksbGluZTowfSxNYyh0aGlzLmN0eCxlLnRleHREaXJlY3Rpb24pO2xldCBiPWgrbDt0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKG8sdSk9PntyLnN0cm9rZVN0eWxlPW8uZm9udENvbG9yLHIuZmlsbFN0eWxlPW8uZm9udENvbG9yO2xldCBtPXIubWVhc3VyZVRleHQoby50ZXh0KS53aWR0aCxoPXMudGV4dEFsaWduKG8udGV4dEFsaWdufHw9YS50ZXh0QWxpZ24pLHg9cCtkK20sUz1mLngsQz1mLnk7cy5zZXRXaWR0aCh0aGlzLndpZHRoKSx2P3U+MCYmUyt4K2w+dGhpcy5yaWdodCYmKEM9Zi55Kz1iLGYubGluZSsrLFM9Zi54PSRvKGksdGhpcy5sZWZ0K2wsdGhpcy5yaWdodC1uW2YubGluZV0pKTp1PjAmJkMrYj50aGlzLmJvdHRvbSYmKFM9Zi54PVMrdFtmLmxpbmVdLndpZHRoK2wsZi5saW5lKyssQz1mLnk9JG8oaSx0aGlzLnRvcCt5K2wsdGhpcy5ib3R0b20tdFtmLmxpbmVdLmhlaWdodCkpO2xldCB3PXMueChTKTtpZihnKHcsQyxvKSxTPWVzKGgsUytwK2Qsdj9TK3g6dGhpcy5yaWdodCxlLnJ0bCksXyhzLngoUyksQyxvKSx2KWYueCs9eCtsO2Vsc2UgaWYodHlwZW9mIG8udGV4dCE9YHN0cmluZ2Ape2xldCBlPWMubGluZUhlaWdodDtmLnkrPVlkKG8sZSkrbH1lbHNlIGYueSs9Yn0pLE5jKHRoaXMuY3R4LGUudGV4dERpcmVjdGlvbil9ZHJhd1RpdGxlKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aXRsZSxuPSQodC5mb250KSxyPVEodC5wYWRkaW5nKTtpZighdC5kaXNwbGF5KXJldHVybjtsZXQgaT1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYT10aGlzLmN0eCxvPXQucG9zaXRpb24scz1uLnNpemUvMixjPXIudG9wK3MsbCx1PXRoaXMubGVmdCxkPXRoaXMud2lkdGg7aWYodGhpcy5pc0hvcml6b250YWwoKSlkPU1hdGgubWF4KC4uLnRoaXMubGluZVdpZHRocyksbD10aGlzLnRvcCtjLHU9JG8oZS5hbGlnbix1LHRoaXMucmlnaHQtZCk7ZWxzZXtsZXQgdD10aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoZSx0KT0+TWF0aC5tYXgoZSx0LmhlaWdodCksMCk7bD1jKyRvKGUuYWxpZ24sdGhpcy50b3AsdGhpcy5ib3R0b20tdC1lLmxhYmVscy5wYWRkaW5nLXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKX1sZXQgZj0kbyhvLHUsdStkKTthLnRleHRBbGlnbj1pLnRleHRBbGlnbihRbyhvKSksYS50ZXh0QmFzZWxpbmU9YG1pZGRsZWAsYS5zdHJva2VTdHlsZT10LmNvbG9yLGEuZmlsbFN0eWxlPXQuY29sb3IsYS5mb250PW4uc3RyaW5nLElzKGEsdC50ZXh0LGYsbCxuKX1fY29tcHV0ZVRpdGxlSGVpZ2h0KCl7bGV0IGU9dGhpcy5vcHRpb25zLnRpdGxlLHQ9JChlLmZvbnQpLG49UShlLnBhZGRpbmcpO3JldHVybiBlLmRpc3BsYXk/dC5saW5lSGVpZ2h0K24uaGVpZ2h0OjB9X2dldExlZ2VuZEl0ZW1BdChlLHQpe2xldCBuLHIsaTtpZihCbyhlLHRoaXMubGVmdCx0aGlzLnJpZ2h0KSYmQm8odCx0aGlzLnRvcCx0aGlzLmJvdHRvbSkpe2ZvcihpPXRoaXMubGVnZW5kSGl0Qm94ZXMsbj0wO248aS5sZW5ndGg7KytuKWlmKHI9aVtuXSxCbyhlLHIubGVmdCxyLmxlZnQrci53aWR0aCkmJkJvKHQsci50b3Asci50b3Arci5oZWlnaHQpKXJldHVybiB0aGlzLmxlZ2VuZEl0ZW1zW25dfXJldHVybiBudWxsfWhhbmRsZUV2ZW50KGUpe2xldCB0PXRoaXMub3B0aW9ucztpZighWGQoZS50eXBlLHQpKXJldHVybjtsZXQgbj10aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LGUueSk7aWYoZS50eXBlPT09YG1vdXNlbW92ZWB8fGUudHlwZT09PWBtb3VzZW91dGApe2xldCByPXRoaXMuX2hvdmVyZWRJdGVtLGk9V2QocixuKTtyJiYhaSYmSih0Lm9uTGVhdmUsW2Uscix0aGlzXSx0aGlzKSx0aGlzLl9ob3ZlcmVkSXRlbT1uLG4mJiFpJiZKKHQub25Ib3ZlcixbZSxuLHRoaXNdLHRoaXMpfWVsc2UgbiYmSih0Lm9uQ2xpY2ssW2Usbix0aGlzXSx0aGlzKX19O2Z1bmN0aW9uIEtkKGUsdCxuLHIsaSl7cmV0dXJue2l0ZW1XaWR0aDpxZChyLGUsdCxuKSxpdGVtSGVpZ2h0OkpkKGkscix0LmxpbmVIZWlnaHQpfX1mdW5jdGlvbiBxZChlLHQsbixyKXtsZXQgaT1lLnRleHQ7cmV0dXJuIGkmJnR5cGVvZiBpIT1gc3RyaW5nYCYmKGk9aS5yZWR1Y2UoKGUsdCk9PmUubGVuZ3RoPnQubGVuZ3RoP2U6dCkpLHQrbi5zaXplLzIrci5tZWFzdXJlVGV4dChpKS53aWR0aH1mdW5jdGlvbiBKZChlLHQsbil7bGV0IHI9ZTtyZXR1cm4gdHlwZW9mIHQudGV4dCE9YHN0cmluZ2AmJihyPVlkKHQsbikpLHJ9ZnVuY3Rpb24gWWQoZSx0KXtyZXR1cm4gdCooZS50ZXh0P2UudGV4dC5sZW5ndGg6MCl9ZnVuY3Rpb24gWGQoZSx0KXtyZXR1cm4hISgoZT09PWBtb3VzZW1vdmVgfHxlPT09YG1vdXNlb3V0YCkmJih0Lm9uSG92ZXJ8fHQub25MZWF2ZSl8fHQub25DbGljayYmKGU9PT1gY2xpY2tgfHxlPT09YG1vdXNldXBgKSl9dmFyIFpkPXtpZDpgbGVnZW5kYCxfZWxlbWVudDpHZCxzdGFydChlLHQsbil7bGV0IHI9ZS5sZWdlbmQ9bmV3IEdkKHtjdHg6ZS5jdHgsb3B0aW9uczpuLGNoYXJ0OmV9KTskbC5jb25maWd1cmUoZSxyLG4pLCRsLmFkZEJveChlLHIpfSxzdG9wKGUpeyRsLnJlbW92ZUJveChlLGUubGVnZW5kKSxkZWxldGUgZS5sZWdlbmR9LGJlZm9yZVVwZGF0ZShlLHQsbil7bGV0IHI9ZS5sZWdlbmQ7JGwuY29uZmlndXJlKGUscixuKSxyLm9wdGlvbnM9bn0sYWZ0ZXJVcGRhdGUoZSl7bGV0IHQ9ZS5sZWdlbmQ7dC5idWlsZExhYmVscygpLHQuYWRqdXN0SGl0Qm94ZXMoKX0sYWZ0ZXJFdmVudChlLHQpe3QucmVwbGF5fHxlLmxlZ2VuZC5oYW5kbGVFdmVudCh0LmV2ZW50KX0sZGVmYXVsdHM6e2Rpc3BsYXk6ITAscG9zaXRpb246YHRvcGAsYWxpZ246YGNlbnRlcmAsZnVsbFNpemU6ITAscmV2ZXJzZTohMSx3ZWlnaHQ6MWUzLG9uQ2xpY2soZSx0LG4pe2xldCByPXQuZGF0YXNldEluZGV4LGk9bi5jaGFydDtpLmlzRGF0YXNldFZpc2libGUocik/KGkuaGlkZShyKSx0LmhpZGRlbj0hMCk6KGkuc2hvdyhyKSx0LmhpZGRlbj0hMSl9LG9uSG92ZXI6bnVsbCxvbkxlYXZlOm51bGwsbGFiZWxzOntjb2xvcjplPT5lLmNoYXJ0Lm9wdGlvbnMuY29sb3IsYm94V2lkdGg6NDAscGFkZGluZzoxMCxnZW5lcmF0ZUxhYmVscyhlKXtsZXQgdD1lLmRhdGEuZGF0YXNldHMse2xhYmVsczp7dXNlUG9pbnRTdHlsZTpuLHBvaW50U3R5bGU6cix0ZXh0QWxpZ246aSxjb2xvcjphLHVzZUJvcmRlclJhZGl1czpvLGJvcmRlclJhZGl1czpzfX09ZS5sZWdlbmQub3B0aW9ucztyZXR1cm4gZS5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCkubWFwKGU9PntsZXQgYz1lLmNvbnRyb2xsZXIuZ2V0U3R5bGUobj8wOnZvaWQgMCksbD1RKGMuYm9yZGVyV2lkdGgpO3JldHVybnt0ZXh0OnRbZS5pbmRleF0ubGFiZWwsZmlsbFN0eWxlOmMuYmFja2dyb3VuZENvbG9yLGZvbnRDb2xvcjphLGhpZGRlbjohZS52aXNpYmxlLGxpbmVDYXA6Yy5ib3JkZXJDYXBTdHlsZSxsaW5lRGFzaDpjLmJvcmRlckRhc2gsbGluZURhc2hPZmZzZXQ6Yy5ib3JkZXJEYXNoT2Zmc2V0LGxpbmVKb2luOmMuYm9yZGVySm9pblN0eWxlLGxpbmVXaWR0aDoobC53aWR0aCtsLmhlaWdodCkvNCxzdHJva2VTdHlsZTpjLmJvcmRlckNvbG9yLHBvaW50U3R5bGU6cnx8Yy5wb2ludFN0eWxlLHJvdGF0aW9uOmMucm90YXRpb24sdGV4dEFsaWduOml8fGMudGV4dEFsaWduLGJvcmRlclJhZGl1czpvJiYoc3x8Yy5ib3JkZXJSYWRpdXMpLGRhdGFzZXRJbmRleDplLmluZGV4fX0sdGhpcyl9fSx0aXRsZTp7Y29sb3I6ZT0+ZS5jaGFydC5vcHRpb25zLmNvbG9yLGRpc3BsYXk6ITEscG9zaXRpb246YGNlbnRlcmAsdGV4dDpgYH19LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBvbmApLGxhYmVsczp7X3NjcmlwdGFibGU6ZT0+IVtgZ2VuZXJhdGVMYWJlbHNgLGBmaWx0ZXJgLGBzb3J0YF0uaW5jbHVkZXMoZSl9fX0sUWQ9e2F2ZXJhZ2UoZSl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCB0LG4scj1uZXcgU2V0LGk9MCxhPTA7Zm9yKHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3Qpe2xldCBuPWVbdF0uZWxlbWVudDtpZihuJiZuLmhhc1ZhbHVlKCkpe2xldCBlPW4udG9vbHRpcFBvc2l0aW9uKCk7ci5hZGQoZS54KSxpKz1lLnksKythfX1yZXR1cm4gYT09PTB8fHIuc2l6ZT09PTA/ITE6e3g6Wy4uLnJdLnJlZHVjZSgoZSx0KT0+ZSt0KS9yLnNpemUseTppL2F9fSxuZWFyZXN0KGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCBuPXQueCxyPXQueSxpPTEvMCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7bGV0IG49ZVthXS5lbGVtZW50O2lmKG4mJm4uaGFzVmFsdWUoKSl7bGV0IGU9Rm8odCxuLmdldENlbnRlclBvaW50KCkpO2U8aSYmKGk9ZSxzPW4pfX1pZihzKXtsZXQgZT1zLnRvb2x0aXBQb3NpdGlvbigpO249ZS54LHI9ZS55fXJldHVybnt4Om4seTpyfX19O2Z1bmN0aW9uICRkKGUsdCl7cmV0dXJuIHQmJihXKHQpP0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsdCk6ZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGVmKGUpe3JldHVybih0eXBlb2YgZT09YHN0cmluZ2B8fGUgaW5zdGFuY2VvZiBTdHJpbmcpJiZlLmluZGV4T2YoYApgKT4tMT9lLnNwbGl0KGAKYCk6ZX1mdW5jdGlvbiB0ZihlLHQpe2xldHtlbGVtZW50Om4sZGF0YXNldEluZGV4OnIsaW5kZXg6aX09dCxhPWUuZ2V0RGF0YXNldE1ldGEocikuY29udHJvbGxlcix7bGFiZWw6byx2YWx1ZTpzfT1hLmdldExhYmVsQW5kVmFsdWUoaSk7cmV0dXJue2NoYXJ0OmUsbGFiZWw6byxwYXJzZWQ6YS5nZXRQYXJzZWQoaSkscmF3OmUuZGF0YS5kYXRhc2V0c1tyXS5kYXRhW2ldLGZvcm1hdHRlZFZhbHVlOnMsZGF0YXNldDphLmdldERhdGFzZXQoKSxkYXRhSW5kZXg6aSxkYXRhc2V0SW5kZXg6cixlbGVtZW50Om59fWZ1bmN0aW9uIG5mKGUsdCl7bGV0IG49ZS5jaGFydC5jdHgse2JvZHk6cixmb290ZXI6aSx0aXRsZTphfT1lLHtib3hXaWR0aDpvLGJveEhlaWdodDpzfT10LGM9JCh0LmJvZHlGb250KSxsPSQodC50aXRsZUZvbnQpLHU9JCh0LmZvb3RlckZvbnQpLGQ9YS5sZW5ndGgsZj1pLmxlbmd0aCxwPXIubGVuZ3RoLG09USh0LnBhZGRpbmcpLGg9bS5oZWlnaHQsZz0wLF89ci5yZWR1Y2UoKGUsdCk9PmUrdC5iZWZvcmUubGVuZ3RoK3QubGluZXMubGVuZ3RoK3QuYWZ0ZXIubGVuZ3RoLDApO2lmKF8rPWUuYmVmb3JlQm9keS5sZW5ndGgrZS5hZnRlckJvZHkubGVuZ3RoLGQmJihoKz1kKmwubGluZUhlaWdodCsoZC0xKSp0LnRpdGxlU3BhY2luZyt0LnRpdGxlTWFyZ2luQm90dG9tKSxfKXtsZXQgZT10LmRpc3BsYXlDb2xvcnM/TWF0aC5tYXgocyxjLmxpbmVIZWlnaHQpOmMubGluZUhlaWdodDtoKz1wKmUrKF8tcCkqYy5saW5lSGVpZ2h0KyhfLTEpKnQuYm9keVNwYWNpbmd9ZiYmKGgrPXQuZm9vdGVyTWFyZ2luVG9wK2YqdS5saW5lSGVpZ2h0KyhmLTEpKnQuZm9vdGVyU3BhY2luZyk7bGV0IHY9MCx5PWZ1bmN0aW9uKGUpe2c9TWF0aC5tYXgoZyxuLm1lYXN1cmVUZXh0KGUpLndpZHRoK3YpfTtyZXR1cm4gbi5zYXZlKCksbi5mb250PWwuc3RyaW5nLFkoZS50aXRsZSx5KSxuLmZvbnQ9Yy5zdHJpbmcsWShlLmJlZm9yZUJvZHkuY29uY2F0KGUuYWZ0ZXJCb2R5KSx5KSx2PXQuZGlzcGxheUNvbG9ycz9vKzIrdC5ib3hQYWRkaW5nOjAsWShyLGU9PntZKGUuYmVmb3JlLHkpLFkoZS5saW5lcyx5KSxZKGUuYWZ0ZXIseSl9KSx2PTAsbi5mb250PXUuc3RyaW5nLFkoZS5mb290ZXIseSksbi5yZXN0b3JlKCksZys9bS53aWR0aCx7d2lkdGg6ZyxoZWlnaHQ6aH19ZnVuY3Rpb24gcmYoZSx0KXtsZXR7eTpuLGhlaWdodDpyfT10O3JldHVybiBuPHIvMj9gdG9wYDpuPmUuaGVpZ2h0LXIvMj9gYm90dG9tYDpgY2VudGVyYH1mdW5jdGlvbiBhZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PXIsbz1uLmNhcmV0U2l6ZStuLmNhcmV0UGFkZGluZztpZihlPT09YGxlZnRgJiZpK2Erbz50LndpZHRofHxlPT09YHJpZ2h0YCYmaS1hLW88MClyZXR1cm4hMH1mdW5jdGlvbiBvZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PW4se3dpZHRoOm8sY2hhcnRBcmVhOntsZWZ0OnMscmlnaHQ6Y319PWUsbD1gY2VudGVyYDtyZXR1cm4gcj09PWBjZW50ZXJgP2w9aTw9KHMrYykvMj9gbGVmdGA6YHJpZ2h0YDppPD1hLzI/bD1gbGVmdGA6aT49by1hLzImJihsPWByaWdodGApLGFmKGwsZSx0LG4pJiYobD1gY2VudGVyYCksbH1mdW5jdGlvbiBzZihlLHQsbil7bGV0IHI9bi55QWxpZ258fHQueUFsaWdufHxyZihlLG4pO3JldHVybnt4QWxpZ246bi54QWxpZ258fHQueEFsaWdufHxvZihlLHQsbixyKSx5QWxpZ246cn19ZnVuY3Rpb24gY2YoZSx0KXtsZXR7eDpuLHdpZHRoOnJ9PWU7cmV0dXJuIHQ9PT1gcmlnaHRgP24tPXI6dD09PWBjZW50ZXJgJiYobi09ci8yKSxufWZ1bmN0aW9uIGxmKGUsdCxuKXtsZXR7eTpyLGhlaWdodDppfT1lO3JldHVybiB0PT09YHRvcGA/cis9bjpyLT10PT09YGJvdHRvbWA/aStuOmkvMixyfWZ1bmN0aW9uIHVmKGUsdCxuLHIpe2xldHtjYXJldFNpemU6aSxjYXJldFBhZGRpbmc6YSxjb3JuZXJSYWRpdXM6b309ZSx7eEFsaWduOnMseUFsaWduOmN9PW4sbD1pK2Ese3RvcExlZnQ6dSx0b3BSaWdodDpkLGJvdHRvbUxlZnQ6Zixib3R0b21SaWdodDpwfT1XcyhvKSxtPWNmKHQscyksaD1sZih0LGMsbCk7cmV0dXJuIGM9PT1gY2VudGVyYD9zPT09YGxlZnRgP20rPWw6cz09PWByaWdodGAmJihtLT1sKTpzPT09YGxlZnRgP20tPU1hdGgubWF4KHUsZikraTpzPT09YHJpZ2h0YCYmKG0rPU1hdGgubWF4KGQscCkraSkse3g6Um8obSwwLHIud2lkdGgtdC53aWR0aCkseTpSbyhoLDAsci5oZWlnaHQtdC5oZWlnaHQpfX1mdW5jdGlvbiBkZihlLHQsbil7bGV0IHI9UShuLnBhZGRpbmcpO3JldHVybiB0PT09YGNlbnRlcmA/ZS54K2Uud2lkdGgvMjp0PT09YHJpZ2h0YD9lLngrZS53aWR0aC1yLnJpZ2h0OmUueCtyLmxlZnR9ZnVuY3Rpb24gZmYoZSl7cmV0dXJuICRkKFtdLGVmKGUpKX1mdW5jdGlvbiBwZihlLHQsbil7cmV0dXJuIHFzKGUse3Rvb2x0aXA6dCx0b29sdGlwSXRlbXM6bix0eXBlOmB0b29sdGlwYH0pfWZ1bmN0aW9uIG1mKGUsdCl7bGV0IG49dCYmdC5kYXRhc2V0JiZ0LmRhdGFzZXQudG9vbHRpcCYmdC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO3JldHVybiBuP2Uub3ZlcnJpZGUobik6ZX12YXIgaGY9e2JlZm9yZVRpdGxlOllhLHRpdGxlKGUpe2lmKGUubGVuZ3RoPjApe2xldCB0PWVbMF0sbj10LmNoYXJ0LmRhdGEubGFiZWxzLHI9bj9uLmxlbmd0aDowO2lmKHRoaXMmJnRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm1vZGU9PT1gZGF0YXNldGApcmV0dXJuIHQuZGF0YXNldC5sYWJlbHx8YGA7aWYodC5sYWJlbClyZXR1cm4gdC5sYWJlbDtpZihyPjAmJnQuZGF0YUluZGV4PHIpcmV0dXJuIG5bdC5kYXRhSW5kZXhdfXJldHVybmBgfSxhZnRlclRpdGxlOllhLGJlZm9yZUJvZHk6WWEsYmVmb3JlTGFiZWw6WWEsbGFiZWwoZSl7aWYodGhpcyYmdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubW9kZT09PWBkYXRhc2V0YClyZXR1cm4gZS5sYWJlbCtgOiBgK2UuZm9ybWF0dGVkVmFsdWV8fGUuZm9ybWF0dGVkVmFsdWU7bGV0IHQ9ZS5kYXRhc2V0LmxhYmVsfHxgYDt0JiYodCs9YDogYCk7bGV0IG49ZS5mb3JtYXR0ZWRWYWx1ZTtyZXR1cm4gVShuKXx8KHQrPW4pLHR9LGxhYmVsQ29sb3IoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue2JvcmRlckNvbG9yOnQuYm9yZGVyQ29sb3IsYmFja2dyb3VuZENvbG9yOnQuYmFja2dyb3VuZENvbG9yLGJvcmRlcldpZHRoOnQuYm9yZGVyV2lkdGgsYm9yZGVyRGFzaDp0LmJvcmRlckRhc2gsYm9yZGVyRGFzaE9mZnNldDp0LmJvcmRlckRhc2hPZmZzZXQsYm9yZGVyUmFkaXVzOjB9fSxsYWJlbFRleHRDb2xvcigpe3JldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yfSxsYWJlbFBvaW50U3R5bGUoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue3BvaW50U3R5bGU6dC5wb2ludFN0eWxlLHJvdGF0aW9uOnQucm90YXRpb259fSxhZnRlckxhYmVsOllhLGFmdGVyQm9keTpZYSxiZWZvcmVGb290ZXI6WWEsZm9vdGVyOllhLGFmdGVyRm9vdGVyOllhfTtmdW5jdGlvbiBnZihlLHQsbixyKXtsZXQgaT1lW3RdLmNhbGwobixyKTtyZXR1cm4gaT09PXZvaWQgMD9oZlt0XS5jYWxsKG4scik6aX12YXIgX2Y9Y2xhc3MgZXh0ZW5kcyBDdXtzdGF0aWMgcG9zaXRpb25lcnM9UWQ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLm9wYWNpdHk9MCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fZXZlbnRQb3NpdGlvbj12b2lkIDAsdGhpcy5fc2l6ZT12b2lkIDAsdGhpcy5fY2FjaGVkQW5pbWF0aW9ucz12b2lkIDAsdGhpcy5fdG9vbHRpcEl0ZW1zPVtdLHRoaXMuJGFuaW1hdGlvbnM9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuY2hhcnQ9ZS5jaGFydCx0aGlzLm9wdGlvbnM9ZS5vcHRpb25zLHRoaXMuZGF0YVBvaW50cz12b2lkIDAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5iZWZvcmVCb2R5PXZvaWQgMCx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuYWZ0ZXJCb2R5PXZvaWQgMCx0aGlzLmZvb3Rlcj12b2lkIDAsdGhpcy54QWxpZ249dm9pZCAwLHRoaXMueUFsaWduPXZvaWQgMCx0aGlzLng9dm9pZCAwLHRoaXMueT12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuY2FyZXRYPXZvaWQgMCx0aGlzLmNhcmV0WT12b2lkIDAsdGhpcy5sYWJlbENvbG9ycz12b2lkIDAsdGhpcy5sYWJlbFBvaW50U3R5bGVzPXZvaWQgMCx0aGlzLmxhYmVsVGV4dENvbG9ycz12b2lkIDB9aW5pdGlhbGl6ZShlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLl9jYWNoZWRBbmltYXRpb25zPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMH1fcmVzb2x2ZUFuaW1hdGlvbnMoKXtsZXQgZT10aGlzLl9jYWNoZWRBbmltYXRpb25zO2lmKGUpcmV0dXJuIGU7bGV0IHQ9dGhpcy5jaGFydCxuPXRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKSxyPW4uZW5hYmxlZCYmdC5vcHRpb25zLmFuaW1hdGlvbiYmbi5hbmltYXRpb25zLGk9bmV3IFZjKHRoaXMuY2hhcnQscik7cmV0dXJuIHIuX2NhY2hlYWJsZSYmKHRoaXMuX2NhY2hlZEFuaW1hdGlvbnM9T2JqZWN0LmZyZWV6ZShpKSksaX1nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuJGNvbnRleHR8fD1wZih0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLHRoaXMuX3Rvb2x0aXBJdGVtcyl9Z2V0VGl0bGUoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVUaXRsZWAsdGhpcyxlKSxpPWdmKG4sYHRpdGxlYCx0aGlzLGUpLGE9Z2YobixgYWZ0ZXJUaXRsZWAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfWdldEJlZm9yZUJvZHkoZSx0KXtyZXR1cm4gZmYoZ2YodC5jYWxsYmFja3MsYGJlZm9yZUJvZHlgLHRoaXMsZSkpfWdldEJvZHkoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1bXTtyZXR1cm4gWShlLGU9PntsZXQgdD17YmVmb3JlOltdLGxpbmVzOltdLGFmdGVyOltdfSxpPW1mKG4sZSk7JGQodC5iZWZvcmUsZWYoZ2YoaSxgYmVmb3JlTGFiZWxgLHRoaXMsZSkpKSwkZCh0LmxpbmVzLGdmKGksYGxhYmVsYCx0aGlzLGUpKSwkZCh0LmFmdGVyLGVmKGdmKGksYGFmdGVyTGFiZWxgLHRoaXMsZSkpKSxyLnB1c2godCl9KSxyfWdldEFmdGVyQm9keShlLHQpe3JldHVybiBmZihnZih0LmNhbGxiYWNrcyxgYWZ0ZXJCb2R5YCx0aGlzLGUpKX1nZXRGb290ZXIoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVGb290ZXJgLHRoaXMsZSksaT1nZihuLGBmb290ZXJgLHRoaXMsZSksYT1nZihuLGBhZnRlckZvb3RlcmAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfV9jcmVhdGVJdGVtcyhlKXtsZXQgdD10aGlzLl9hY3RpdmUsbj10aGlzLmNoYXJ0LmRhdGEscj1bXSxpPVtdLGE9W10sbz1bXSxzLGM7Zm9yKHM9MCxjPXQubGVuZ3RoO3M8YzsrK3Mpby5wdXNoKHRmKHRoaXMuY2hhcnQsdFtzXSkpO3JldHVybiBlLmZpbHRlciYmKG89by5maWx0ZXIoKHQscixpKT0+ZS5maWx0ZXIodCxyLGksbikpKSxlLml0ZW1Tb3J0JiYobz1vLnNvcnQoKHQscik9PmUuaXRlbVNvcnQodCxyLG4pKSksWShvLHQ9PntsZXQgbj1tZihlLmNhbGxiYWNrcyx0KTtyLnB1c2goZ2YobixgbGFiZWxDb2xvcmAsdGhpcyx0KSksaS5wdXNoKGdmKG4sYGxhYmVsUG9pbnRTdHlsZWAsdGhpcyx0KSksYS5wdXNoKGdmKG4sYGxhYmVsVGV4dENvbG9yYCx0aGlzLHQpKX0pLHRoaXMubGFiZWxDb2xvcnM9cix0aGlzLmxhYmVsUG9pbnRTdHlsZXM9aSx0aGlzLmxhYmVsVGV4dENvbG9ycz1hLHRoaXMuZGF0YVBvaW50cz1vLG99dXBkYXRlKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYWN0aXZlLGksYT1bXTtpZighci5sZW5ndGgpdGhpcy5vcGFjaXR5IT09MCYmKGk9e29wYWNpdHk6MH0pO2Vsc2V7bGV0IGU9UWRbbi5wb3NpdGlvbl0uY2FsbCh0aGlzLHIsdGhpcy5fZXZlbnRQb3NpdGlvbik7YT10aGlzLl9jcmVhdGVJdGVtcyhuKSx0aGlzLnRpdGxlPXRoaXMuZ2V0VGl0bGUoYSxuKSx0aGlzLmJlZm9yZUJvZHk9dGhpcy5nZXRCZWZvcmVCb2R5KGEsbiksdGhpcy5ib2R5PXRoaXMuZ2V0Qm9keShhLG4pLHRoaXMuYWZ0ZXJCb2R5PXRoaXMuZ2V0QWZ0ZXJCb2R5KGEsbiksdGhpcy5mb290ZXI9dGhpcy5nZXRGb290ZXIoYSxuKTtsZXQgdD10aGlzLl9zaXplPW5mKHRoaXMsbiksbz1PYmplY3QuYXNzaWduKHt9LGUsdCkscz1zZih0aGlzLmNoYXJ0LG4sbyksYz11ZihuLG8scyx0aGlzLmNoYXJ0KTt0aGlzLnhBbGlnbj1zLnhBbGlnbix0aGlzLnlBbGlnbj1zLnlBbGlnbixpPXtvcGFjaXR5OjEseDpjLngseTpjLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsY2FyZXRYOmUueCxjYXJldFk6ZS55fX10aGlzLl90b29sdGlwSXRlbXM9YSx0aGlzLiRjb250ZXh0PXZvaWQgMCxpJiZ0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLGkpLGUmJm4uZXh0ZXJuYWwmJm4uZXh0ZXJuYWwuY2FsbCh0aGlzLHtjaGFydDp0aGlzLmNoYXJ0LHRvb2x0aXA6dGhpcyxyZXBsYXk6dH0pfWRyYXdDYXJldChlLHQsbixyKXtsZXQgaT10aGlzLmdldENhcmV0UG9zaXRpb24oZSxuLHIpO3QubGluZVRvKGkueDEsaS55MSksdC5saW5lVG8oaS54MixpLnkyKSx0LmxpbmVUbyhpLngzLGkueTMpfWdldENhcmV0UG9zaXRpb24oZSx0LG4pe2xldHt4QWxpZ246cix5QWxpZ246aX09dGhpcyx7Y2FyZXRTaXplOmEsY29ybmVyUmFkaXVzOm99PW4se3RvcExlZnQ6cyx0b3BSaWdodDpjLGJvdHRvbUxlZnQ6bCxib3R0b21SaWdodDp1fT1XcyhvKSx7eDpkLHk6Zn09ZSx7d2lkdGg6cCxoZWlnaHQ6bX09dCxoLGcsXyx2LHksYjtyZXR1cm4gaT09PWBjZW50ZXJgPyh5PWYrbS8yLHI9PT1gbGVmdGA/KGg9ZCxnPWgtYSx2PXkrYSxiPXktYSk6KGg9ZCtwLGc9aCthLHY9eS1hLGI9eSthKSxfPWgpOihnPXI9PT1gbGVmdGA/ZCtNYXRoLm1heChzLGwpK2E6cj09PWByaWdodGA/ZCtwLU1hdGgubWF4KGMsdSktYTp0aGlzLmNhcmV0WCxpPT09YHRvcGA/KHY9Zix5PXYtYSxoPWctYSxfPWcrYSk6KHY9ZittLHk9dithLGg9ZythLF89Zy1hKSxiPXYpLHt4MTpoLHgyOmcseDM6Xyx5MTp2LHkyOnkseTM6Yn19ZHJhd1RpdGxlKGUsdCxuKXtsZXQgcj10aGlzLnRpdGxlLGk9ci5sZW5ndGgsYSxvLHM7aWYoaSl7bGV0IGM9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpO2ZvcihlLng9ZGYodGhpcyxuLnRpdGxlQWxpZ24sbiksdC50ZXh0QWxpZ249Yy50ZXh0QWxpZ24obi50aXRsZUFsaWduKSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCxhPSQobi50aXRsZUZvbnQpLG89bi50aXRsZVNwYWNpbmcsdC5maWxsU3R5bGU9bi50aXRsZUNvbG9yLHQuZm9udD1hLnN0cmluZyxzPTA7czxpOysrcyl0LmZpbGxUZXh0KHJbc10sYy54KGUueCksZS55K2EubGluZUhlaWdodC8yKSxlLnkrPWEubGluZUhlaWdodCtvLHMrMT09PWkmJihlLnkrPW4udGl0bGVNYXJnaW5Cb3R0b20tbyl9fV9kcmF3Q29sb3JCb3goZSx0LG4scixpKXtsZXQgYT10aGlzLmxhYmVsQ29sb3JzW25dLG89dGhpcy5sYWJlbFBvaW50U3R5bGVzW25dLHtib3hIZWlnaHQ6cyxib3hXaWR0aDpjfT1pLGw9JChpLmJvZHlGb250KSx1PWRmKHRoaXMsYGxlZnRgLGkpLGQ9ci54KHUpLGY9czxsLmxpbmVIZWlnaHQ/KGwubGluZUhlaWdodC1zKS8yOjAscD10LnkrZjtpZihpLnVzZVBvaW50U3R5bGUpe2xldCB0PXtyYWRpdXM6TWF0aC5taW4oYyxzKS8yLHBvaW50U3R5bGU6by5wb2ludFN0eWxlLHJvdGF0aW9uOm8ucm90YXRpb24sYm9yZGVyV2lkdGg6MX0sbj1yLmxlZnRGb3JMdHIoZCxjKStjLzIsbD1wK3MvMjtlLnN0cm9rZVN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLE9zKGUsdCxuLGwpLGUuc3Ryb2tlU3R5bGU9YS5ib3JkZXJDb2xvcixlLmZpbGxTdHlsZT1hLmJhY2tncm91bmRDb2xvcixPcyhlLHQsbixsKX1lbHNle2UubGluZVdpZHRoPUcoYS5ib3JkZXJXaWR0aCk/TWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhhLmJvcmRlcldpZHRoKSk6YS5ib3JkZXJXaWR0aHx8MSxlLnN0cm9rZVN0eWxlPWEuYm9yZGVyQ29sb3IsZS5zZXRMaW5lRGFzaChhLmJvcmRlckRhc2h8fFtdKSxlLmxpbmVEYXNoT2Zmc2V0PWEuYm9yZGVyRGFzaE9mZnNldHx8MDtsZXQgdD1yLmxlZnRGb3JMdHIoZCxjKSxuPXIubGVmdEZvckx0cihyLnhQbHVzKGQsMSksYy0yKSxvPVdzKGEuYm9yZGVyUmFkaXVzKTtPYmplY3QudmFsdWVzKG8pLnNvbWUoZT0+ZSE9PTApPyhlLmJlZ2luUGF0aCgpLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLExzKGUse3g6dCx5OnAsdzpjLGg6cyxyYWRpdXM6b30pLGUuZmlsbCgpLGUuc3Ryb2tlKCksZS5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsZS5iZWdpblBhdGgoKSxMcyhlLHt4Om4seTpwKzEsdzpjLTIsaDpzLTIscmFkaXVzOm99KSxlLmZpbGwoKSk6KGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFJlY3QodCxwLGMscyksZS5zdHJva2VSZWN0KHQscCxjLHMpLGUuZmlsbFN0eWxlPWEuYmFja2dyb3VuZENvbG9yLGUuZmlsbFJlY3QobixwKzEsYy0yLHMtMikpfWUuZmlsbFN0eWxlPXRoaXMubGFiZWxUZXh0Q29sb3JzW25dfWRyYXdCb2R5KGUsdCxuKXtsZXR7Ym9keTpyfT10aGlzLHtib2R5U3BhY2luZzppLGJvZHlBbGlnbjphLGRpc3BsYXlDb2xvcnM6byxib3hIZWlnaHQ6cyxib3hXaWR0aDpjLGJveFBhZGRpbmc6bH09bix1PSQobi5ib2R5Rm9udCksZD11LmxpbmVIZWlnaHQsZj0wLHA9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpLG09ZnVuY3Rpb24obil7dC5maWxsVGV4dChuLHAueChlLngrZiksZS55K2QvMiksZS55Kz1kK2l9LGg9cC50ZXh0QWxpZ24oYSksZyxfLHYseSxiLHgsUztmb3IodC50ZXh0QWxpZ249YSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCx0LmZvbnQ9dS5zdHJpbmcsZS54PWRmKHRoaXMsaCxuKSx0LmZpbGxTdHlsZT1uLmJvZHlDb2xvcixZKHRoaXMuYmVmb3JlQm9keSxtKSxmPW8mJmghPT1gcmlnaHRgP2E9PT1gY2VudGVyYD9jLzIrbDpjKzIrbDowLHk9MCx4PXIubGVuZ3RoO3k8eDsrK3kpe2ZvcihnPXJbeV0sXz10aGlzLmxhYmVsVGV4dENvbG9yc1t5XSx0LmZpbGxTdHlsZT1fLFkoZy5iZWZvcmUsbSksdj1nLmxpbmVzLG8mJnYubGVuZ3RoJiYodGhpcy5fZHJhd0NvbG9yQm94KHQsZSx5LHAsbiksZD1NYXRoLm1heCh1LmxpbmVIZWlnaHQscykpLGI9MCxTPXYubGVuZ3RoO2I8UzsrK2IpbSh2W2JdKSxkPXUubGluZUhlaWdodDtZKGcuYWZ0ZXIsbSl9Zj0wLGQ9dS5saW5lSGVpZ2h0LFkodGhpcy5hZnRlckJvZHksbSksZS55LT1pfWRyYXdGb290ZXIoZSx0LG4pe2xldCByPXRoaXMuZm9vdGVyLGk9ci5sZW5ndGgsYSxvO2lmKGkpe2xldCBzPWpjKG4ucnRsLHRoaXMueCx0aGlzLndpZHRoKTtmb3IoZS54PWRmKHRoaXMsbi5mb290ZXJBbGlnbixuKSxlLnkrPW4uZm9vdGVyTWFyZ2luVG9wLHQudGV4dEFsaWduPXMudGV4dEFsaWduKG4uZm9vdGVyQWxpZ24pLHQudGV4dEJhc2VsaW5lPWBtaWRkbGVgLGE9JChuLmZvb3RlckZvbnQpLHQuZmlsbFN0eWxlPW4uZm9vdGVyQ29sb3IsdC5mb250PWEuc3RyaW5nLG89MDtvPGk7KytvKXQuZmlsbFRleHQocltvXSxzLngoZS54KSxlLnkrYS5saW5lSGVpZ2h0LzIpLGUueSs9YS5saW5lSGVpZ2h0K24uZm9vdGVyU3BhY2luZ319ZHJhd0JhY2tncm91bmQoZSx0LG4scil7bGV0e3hBbGlnbjppLHlBbGlnbjphfT10aGlzLHt4Om8seTpzfT1lLHt3aWR0aDpjLGhlaWdodDpsfT1uLHt0b3BMZWZ0OnUsdG9wUmlnaHQ6ZCxib3R0b21MZWZ0OmYsYm90dG9tUmlnaHQ6cH09V3Moci5jb3JuZXJSYWRpdXMpO3QuZmlsbFN0eWxlPXIuYmFja2dyb3VuZENvbG9yLHQuc3Ryb2tlU3R5bGU9ci5ib3JkZXJDb2xvcix0LmxpbmVXaWR0aD1yLmJvcmRlcldpZHRoLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8obyt1LHMpLGE9PT1gdG9wYCYmdGhpcy5kcmF3Q2FyZXQoZSx0LG4sciksdC5saW5lVG8obytjLWQscyksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzLG8rYyxzK2QpLGE9PT1gY2VudGVyYCYmaT09PWByaWdodGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rYyxzK2wtcCksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzK2wsbytjLXAscytsKSxhPT09YGJvdHRvbWAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rZixzK2wpLHQucXVhZHJhdGljQ3VydmVUbyhvLHMrbCxvLHMrbC1mKSxhPT09YGNlbnRlcmAmJmk9PT1gbGVmdGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8scyt1KSx0LnF1YWRyYXRpY0N1cnZlVG8obyxzLG8rdSxzKSx0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHIuYm9yZGVyV2lkdGg+MCYmdC5zdHJva2UoKX1fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KGUpe2xldCB0PXRoaXMuY2hhcnQsbj10aGlzLiRhbmltYXRpb25zLHI9biYmbi54LGk9biYmbi55O2lmKHJ8fGkpe2xldCBuPVFkW2UucG9zaXRpb25dLmNhbGwodGhpcyx0aGlzLl9hY3RpdmUsdGhpcy5fZXZlbnRQb3NpdGlvbik7aWYoIW4pcmV0dXJuO2xldCBhPXRoaXMuX3NpemU9bmYodGhpcyxlKSxvPU9iamVjdC5hc3NpZ24oe30sbix0aGlzLl9zaXplKSxzPXNmKHQsZSxvKSxjPXVmKGUsbyxzLHQpOyhyLl90byE9PWMueHx8aS5fdG8hPT1jLnkpJiYodGhpcy54QWxpZ249cy54QWxpZ24sdGhpcy55QWxpZ249cy55QWxpZ24sdGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuY2FyZXRYPW4ueCx0aGlzLmNhcmV0WT1uLnksdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcyxjKSl9fV93aWxsUmVuZGVyKCl7cmV0dXJuISF0aGlzLm9wYWNpdHl9ZHJhdyhlKXtsZXQgdD10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksbj10aGlzLm9wYWNpdHk7aWYoIW4pcmV0dXJuO3RoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldCh0KTtsZXQgcj17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9LGk9e3g6dGhpcy54LHk6dGhpcy55fTtuPU1hdGguYWJzKG4pPC4wMDE/MDpuO2xldCBhPVEodC5wYWRkaW5nKSxvPXRoaXMudGl0bGUubGVuZ3RofHx0aGlzLmJlZm9yZUJvZHkubGVuZ3RofHx0aGlzLmJvZHkubGVuZ3RofHx0aGlzLmFmdGVyQm9keS5sZW5ndGh8fHRoaXMuZm9vdGVyLmxlbmd0aDt0LmVuYWJsZWQmJm8mJihlLnNhdmUoKSxlLmdsb2JhbEFscGhhPW4sdGhpcy5kcmF3QmFja2dyb3VuZChpLGUscix0KSxNYyhlLHQudGV4dERpcmVjdGlvbiksaS55Kz1hLnRvcCx0aGlzLmRyYXdUaXRsZShpLGUsdCksdGhpcy5kcmF3Qm9keShpLGUsdCksdGhpcy5kcmF3Rm9vdGVyKGksZSx0KSxOYyhlLHQudGV4dERpcmVjdGlvbiksZS5yZXN0b3JlKCkpfWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9hY3RpdmUscj1lLm1hcCgoe2RhdGFzZXRJbmRleDplLGluZGV4OnR9KT0+e2xldCBuPXRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pLGk9ISRhKG4sciksYT10aGlzLl9wb3NpdGlvbkNoYW5nZWQocix0KTsoaXx8YSkmJih0aGlzLl9hY3RpdmU9cix0aGlzLl9ldmVudFBvc2l0aW9uPXQsdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzPSEwLHRoaXMudXBkYXRlKCEwKSl9aGFuZGxlRXZlbnQoZSx0LG49ITApe2lmKHQmJnRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cylyZXR1cm4hMTt0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHM9ITE7bGV0IHI9dGhpcy5vcHRpb25zLGk9dGhpcy5fYWN0aXZlfHxbXSxhPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsaSx0LG4pLG89dGhpcy5fcG9zaXRpb25DaGFuZ2VkKGEsZSkscz10fHwhJGEoYSxpKXx8bztyZXR1cm4gcyYmKHRoaXMuX2FjdGl2ZT1hLChyLmVuYWJsZWR8fHIuZXh0ZXJuYWwpJiYodGhpcy5fZXZlbnRQb3NpdGlvbj17eDplLngseTplLnl9LHRoaXMudXBkYXRlKCEwLHQpKSksc31fZ2V0QWN0aXZlRWxlbWVudHMoZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zO2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIXIpcmV0dXJuIHQuZmlsdGVyKGU9PnRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tlLmRhdGFzZXRJbmRleF0mJnRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZS5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKGUuaW5kZXgpIT09dm9pZCAwKTtsZXQgYT10aGlzLmNoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxuKTtyZXR1cm4gaS5yZXZlcnNlJiZhLnJldmVyc2UoKSxhfV9wb3NpdGlvbkNoYW5nZWQoZSx0KXtsZXR7Y2FyZXRYOm4sY2FyZXRZOnIsb3B0aW9uczppfT10aGlzLGE9UWRbaS5wb3NpdGlvbl0uY2FsbCh0aGlzLGUsdCk7cmV0dXJuIGEhPT0hMSYmKG4hPT1hLnh8fHIhPT1hLnkpfX0sdmY9e2lkOmB0b29sdGlwYCxfZWxlbWVudDpfZixwb3NpdGlvbmVyczpRZCxhZnRlckluaXQoZSx0LG4pe24mJihlLnRvb2x0aXA9bmV3IF9mKHtjaGFydDplLG9wdGlvbnM6bn0pKX0sYmVmb3JlVXBkYXRlKGUsdCxuKXtlLnRvb2x0aXAmJmUudG9vbHRpcC5pbml0aWFsaXplKG4pfSxyZXNldChlLHQsbil7ZS50b29sdGlwJiZlLnRvb2x0aXAuaW5pdGlhbGl6ZShuKX0sYWZ0ZXJEcmF3KGUpe2xldCB0PWUudG9vbHRpcDtpZih0JiZ0Ll93aWxsUmVuZGVyKCkpe2xldCBuPXt0b29sdGlwOnR9O2lmKGUubm90aWZ5UGx1Z2lucyhgYmVmb3JlVG9vbHRpcERyYXdgLHsuLi5uLGNhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjt0LmRyYXcoZS5jdHgpLGUubm90aWZ5UGx1Z2lucyhgYWZ0ZXJUb29sdGlwRHJhd2Asbil9fSxhZnRlckV2ZW50KGUsdCl7aWYoZS50b29sdGlwKXtsZXQgbj10LnJlcGxheTtlLnRvb2x0aXAuaGFuZGxlRXZlbnQodC5ldmVudCxuLHQuaW5DaGFydEFyZWEpJiYodC5jaGFuZ2VkPSEwKX19LGRlZmF1bHRzOntlbmFibGVkOiEwLGV4dGVybmFsOm51bGwscG9zaXRpb246YGF2ZXJhZ2VgLGJhY2tncm91bmRDb2xvcjpgcmdiYSgwLDAsMCwwLjgpYCx0aXRsZUNvbG9yOmAjZmZmYCx0aXRsZUZvbnQ6e3dlaWdodDpgYm9sZGB9LHRpdGxlU3BhY2luZzoyLHRpdGxlTWFyZ2luQm90dG9tOjYsdGl0bGVBbGlnbjpgbGVmdGAsYm9keUNvbG9yOmAjZmZmYCxib2R5U3BhY2luZzoyLGJvZHlGb250Ont9LGJvZHlBbGlnbjpgbGVmdGAsZm9vdGVyQ29sb3I6YCNmZmZgLGZvb3RlclNwYWNpbmc6Mixmb290ZXJNYXJnaW5Ub3A6Nixmb290ZXJGb250Ont3ZWlnaHQ6YGJvbGRgfSxmb290ZXJBbGlnbjpgbGVmdGAscGFkZGluZzo2LGNhcmV0UGFkZGluZzoyLGNhcmV0U2l6ZTo1LGNvcm5lclJhZGl1czo2LGJveEhlaWdodDooZSx0KT0+dC5ib2R5Rm9udC5zaXplLGJveFdpZHRoOihlLHQpPT50LmJvZHlGb250LnNpemUsbXVsdGlLZXlCYWNrZ3JvdW5kOmAjZmZmYCxkaXNwbGF5Q29sb3JzOiEwLGJveFBhZGRpbmc6MCxib3JkZXJDb2xvcjpgcmdiYSgwLDAsMCwwKWAsYm9yZGVyV2lkdGg6MCxhbmltYXRpb246e2R1cmF0aW9uOjQwMCxlYXNpbmc6YGVhc2VPdXRRdWFydGB9LGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgd2lkdGhgLGBoZWlnaHRgLGBjYXJldFhgLGBjYXJldFlgXX0sb3BhY2l0eTp7ZWFzaW5nOmBsaW5lYXJgLGR1cmF0aW9uOjIwMH19LGNhbGxiYWNrczpoZn0sZGVmYXVsdFJvdXRlczp7Ym9keUZvbnQ6YGZvbnRgLGZvb3RlckZvbnQ6YGZvbnRgLHRpdGxlRm9udDpgZm9udGB9LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT5lIT09YGZpbHRlcmAmJmUhPT1gaXRlbVNvcnRgJiZlIT09YGV4dGVybmFsYCxfaW5kZXhhYmxlOiExLGNhbGxiYWNrczp7X3NjcmlwdGFibGU6ITEsX2luZGV4YWJsZTohMX0sYW5pbWF0aW9uOntfZmFsbGJhY2s6ITF9LGFuaW1hdGlvbnM6e19mYWxsYmFjazpgYW5pbWF0aW9uYH19LGFkZGl0aW9uYWxPcHRpb25TY29wZXM6W2BpbnRlcmFjdGlvbmBdfSx5Zj0oZSx0LG4scik9Pih0eXBlb2YgdD09YHN0cmluZ2A/KG49ZS5wdXNoKHQpLTEsci51bnNoaWZ0KHtpbmRleDpuLGxhYmVsOnR9KSk6aXNOYU4odCkmJihuPW51bGwpLG4pO2Z1bmN0aW9uIGJmKGUsdCxuLHIpe2xldCBpPWUuaW5kZXhPZih0KTtyZXR1cm4gaT09PS0xP3lmKGUsdCxuLHIpOmk9PT1lLmxhc3RJbmRleE9mKHQpP2k6bn12YXIgeGY9KGUsdCk9PmU9PT1udWxsP251bGw6Um8oTWF0aC5yb3VuZChlKSwwLHQpO2Z1bmN0aW9uIFNmKGUpe2xldCB0PXRoaXMuZ2V0TGFiZWxzKCk7cmV0dXJuIGU+PTAmJmU8dC5sZW5ndGg/dFtlXTplfXZhciBDZj1jbGFzcyBleHRlbmRzIFV1e3N0YXRpYyBpZD1gY2F0ZWdvcnlgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOlNmfX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wLHRoaXMuX2FkZGVkTGFiZWxzPVtdfWluaXQoZSl7bGV0IHQ9dGhpcy5fYWRkZWRMYWJlbHM7aWYodC5sZW5ndGgpe2xldCBlPXRoaXMuZ2V0TGFiZWxzKCk7Zm9yKGxldHtpbmRleDpuLGxhYmVsOnJ9b2YgdCllW25dPT09ciYmZS5zcGxpY2UobiwxKTt0aGlzLl9hZGRlZExhYmVscz1bXX1zdXBlci5pbml0KGUpfXBhcnNlKGUsdCl7aWYoVShlKSlyZXR1cm4gbnVsbDtsZXQgbj10aGlzLmdldExhYmVscygpO3JldHVybiB0PWlzRmluaXRlKHQpJiZuW3RdPT09ZT90OmJmKG4sZSxxKHQsZSksdGhpcy5fYWRkZWRMYWJlbHMpLHhmKHQsbi5sZW5ndGgtMSl9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOm4sbWF4OnJ9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm9wdGlvbnMuYm91bmRzPT09YHRpY2tzYCYmKGV8fChuPTApLHR8fChyPXRoaXMuZ2V0TGFiZWxzKCkubGVuZ3RoLTEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMubWluLHQ9dGhpcy5tYXgsbj10aGlzLm9wdGlvbnMub2Zmc2V0LHI9W10saT10aGlzLmdldExhYmVscygpO2k9ZT09PTAmJnQ9PT1pLmxlbmd0aC0xP2k6aS5zbGljZShlLHQrMSksdGhpcy5fdmFsdWVSYW5nZT1NYXRoLm1heChpLmxlbmd0aC0rIW4sMSksdGhpcy5fc3RhcnRWYWx1ZT10aGlzLm1pbi0obj8uNTowKTtmb3IobGV0IG49ZTtuPD10O24rKylyLnB1c2goe3ZhbHVlOm59KTtyZXR1cm4gcn1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBTZi5jYWxsKHRoaXMsZSl9Y29uZmlndXJlKCl7c3VwZXIuY29uZmlndXJlKCksdGhpcy5pc0hvcml6b250YWwoKXx8KHRoaXMuX3JldmVyc2VQaXhlbHM9IXRoaXMuX3JldmVyc2VQaXhlbHMpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIHR5cGVvZiBlIT1gbnVtYmVyYCYmKGU9dGhpcy5wYXJzZShlKSksZT09PW51bGw/TmFOOnRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKChlLXRoaXMuX3N0YXJ0VmFsdWUpL3RoaXMuX3ZhbHVlUmFuZ2UpfWdldFBpeGVsRm9yVGljayhlKXtsZXQgdD10aGlzLnRpY2tzO3JldHVybiBlPDB8fGU+dC5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0W2VdLnZhbHVlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUrdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwoZSkqdGhpcy5fdmFsdWVSYW5nZSl9Z2V0QmFzZVBpeGVsKCl7cmV0dXJuIHRoaXMuYm90dG9tfX07ZnVuY3Rpb24gd2YoZSx0KXtsZXQgbj1bXSx7Ym91bmRzOnIsc3RlcDppLG1pbjphLG1heDpvLHByZWNpc2lvbjpzLGNvdW50OmMsbWF4VGlja3M6bCxtYXhEaWdpdHM6dSxpbmNsdWRlQm91bmRzOmR9PWUsZj1pfHwxLHA9bC0xLHttaW46bSxtYXg6aH09dCxnPSFVKGEpLF89IVUobyksdj0hVShjKSx5PShoLW0pLyh1KzEpLGI9VG8oKGgtbSkvcC9mKSpmLHgsUyxDLHc7aWYoYjwxZS0xNCYmIWcmJiFfKXJldHVyblt7dmFsdWU6bX0se3ZhbHVlOmh9XTt3PU1hdGguY2VpbChoL2IpLU1hdGguZmxvb3IobS9iKSx3PnAmJihiPVRvKHcqYi9wL2YpKmYpLFUocyl8fCh4PTEwKipzLGI9TWF0aC5jZWlsKGIqeCkveCkscj09PWB0aWNrc2A/KFM9TWF0aC5mbG9vcihtL2IpKmIsQz1NYXRoLmNlaWwoaC9iKSpiKTooUz1tLEM9aCksZyYmXyYmaSYma28oKG8tYSkvaSxiLzFlMyk/KHc9TWF0aC5yb3VuZChNYXRoLm1pbigoby1hKS9iLGwpKSxiPShvLWEpL3csUz1hLEM9byk6dj8oUz1nP2E6UyxDPV8/bzpDLHc9Yy0xLGI9KEMtUykvdyk6KHc9KEMtUykvYix3PXdvKHcsTWF0aC5yb3VuZCh3KSxiLzFlMyk/TWF0aC5yb3VuZCh3KTpNYXRoLmNlaWwodykpO2xldCBUPU1hdGgubWF4KE5vKGIpLE5vKFMpKTt4PTEwKiooVShzKT9UOnMpLFM9TWF0aC5yb3VuZChTKngpL3gsQz1NYXRoLnJvdW5kKEMqeCkveDtsZXQgRT0wO2ZvcihnJiYoZCYmUyE9PWE/KG4ucHVzaCh7dmFsdWU6YX0pLFM8YSYmRSsrLHdvKE1hdGgucm91bmQoKFMrRSpiKSp4KS94LGEsVGYoYSx5LGUpKSYmRSsrKTpTPGEmJkUrKyk7RTx3OysrRSl7bGV0IGU9TWF0aC5yb3VuZCgoUytFKmIpKngpL3g7aWYoXyYmZT5vKWJyZWFrO24ucHVzaCh7dmFsdWU6ZX0pfXJldHVybiBfJiZkJiZDIT09bz9uLmxlbmd0aCYmd28obltuLmxlbmd0aC0xXS52YWx1ZSxvLFRmKG8seSxlKSk/bltuLmxlbmd0aC0xXS52YWx1ZT1vOm4ucHVzaCh7dmFsdWU6b30pOighX3x8Qz09PW8pJiZuLnB1c2goe3ZhbHVlOkN9KSxufWZ1bmN0aW9uIFRmKGUsdCx7aG9yaXpvbnRhbDpuLG1pblJvdGF0aW9uOnJ9KXtsZXQgaT1qbyhyKSxhPShuP01hdGguc2luKGkpOk1hdGguY29zKGkpKXx8LjAwMSxvPS43NSp0KihgYCtlKS5sZW5ndGg7cmV0dXJuIE1hdGgubWluKHQvYSxvKX12YXIgRWY9Y2xhc3MgZXh0ZW5kcyBVdXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fZW5kVmFsdWU9dm9pZCAwLHRoaXMuX3ZhbHVlUmFuZ2U9MH1wYXJzZShlLHQpe3JldHVybiBVKGUpfHwodHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmIWlzRmluaXRlKCtlKT9udWxsOitlfWhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKXtsZXR7YmVnaW5BdFplcm86ZX09dGhpcy5vcHRpb25zLHttaW5EZWZpbmVkOnQsbWF4RGVmaW5lZDpufT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOnIsbWF4Oml9PXRoaXMsYT1lPT5yPXQ/cjplLG89ZT0+aT1uP2k6ZTtpZihlKXtsZXQgZT1DbyhyKSx0PUNvKGkpO2U8MCYmdDwwP28oMCk6ZT4wJiZ0PjAmJmEoMCl9aWYocj09PWkpe2xldCB0PWk9PT0wPzE6TWF0aC5hYnMoaSouMDUpO28oaSt0KSxlfHxhKHItdCl9dGhpcy5taW49cix0aGlzLm1heD1pfWdldFRpY2tMaW1pdCgpe2xldHttYXhUaWNrc0xpbWl0OmUsc3RlcFNpemU6dH09dGhpcy5vcHRpb25zLnRpY2tzLG47cmV0dXJuIHQ/KG49TWF0aC5jZWlsKHRoaXMubWF4L3QpLU1hdGguZmxvb3IodGhpcy5taW4vdCkrMSxuPjFlMyYmKGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7dH0gd291bGQgcmVzdWx0IGdlbmVyYXRpbmcgdXAgdG8gJHtufSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKSxuPTFlMykpOihuPXRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpLGV8fD0xMSksZSYmKG49TWF0aC5taW4oZSxuKSksbn1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIDEvMH1idWlsZFRpY2tzKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPXRoaXMuZ2V0VGlja0xpbWl0KCk7bj1NYXRoLm1heCgyLG4pO2xldCByPXdmKHttYXhUaWNrczpuLGJvdW5kczplLmJvdW5kcyxtaW46ZS5taW4sbWF4OmUubWF4LHByZWNpc2lvbjp0LnByZWNpc2lvbixzdGVwOnQuc3RlcFNpemUsY291bnQ6dC5jb3VudCxtYXhEaWdpdHM6dGhpcy5fbWF4RGlnaXRzKCksaG9yaXpvbnRhbDp0aGlzLmlzSG9yaXpvbnRhbCgpLG1pblJvdGF0aW9uOnQubWluUm90YXRpb258fDAsaW5jbHVkZUJvdW5kczp0LmluY2x1ZGVCb3VuZHMhPT0hMX0sdGhpcy5fcmFuZ2V8fHRoaXMpO3JldHVybiBlLmJvdW5kcz09PWB0aWNrc2AmJkFvKHIsdGhpcyxgdmFsdWVgKSxlLnJldmVyc2U/KHIucmV2ZXJzZSgpLHRoaXMuc3RhcnQ9dGhpcy5tYXgsdGhpcy5lbmQ9dGhpcy5taW4pOih0aGlzLnN0YXJ0PXRoaXMubWluLHRoaXMuZW5kPXRoaXMubWF4KSxyfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMudGlja3MsdD10aGlzLm1pbixuPXRoaXMubWF4O2lmKHN1cGVyLmNvbmZpZ3VyZSgpLHRoaXMub3B0aW9ucy5vZmZzZXQmJmUubGVuZ3RoKXtsZXQgcj0obi10KS9NYXRoLm1heChlLmxlbmd0aC0xLDEpLzI7dC09cixuKz1yfXRoaXMuX3N0YXJ0VmFsdWU9dCx0aGlzLl9lbmRWYWx1ZT1uLHRoaXMuX3ZhbHVlUmFuZ2U9bi10fWdldExhYmVsRm9yVmFsdWUoZSl7cmV0dXJuIG1zKGUsdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KX19LERmPWNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWBsaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY319O2RldGVybWluZURhdGFMaW1pdHMoKXtsZXR7bWluOmUsbWF4OnR9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1LKGUpP2U6MCx0aGlzLm1heD1LKHQpP3Q6MSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7bGV0IGU9dGhpcy5pc0hvcml6b250YWwoKSx0PWU/dGhpcy53aWR0aDp0aGlzLmhlaWdodCxuPWpvKHRoaXMub3B0aW9ucy50aWNrcy5taW5Sb3RhdGlvbikscj0oZT9NYXRoLnNpbihuKTpNYXRoLmNvcyhuKSl8fC4wMDEsaT10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApO3JldHVybiBNYXRoLmNlaWwodC9NYXRoLm1pbig0MCxpLmxpbmVIZWlnaHQvcikpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIGU9PT1udWxsP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgoZS10aGlzLl9zdGFydFZhbHVlKS90aGlzLl92YWx1ZVJhbmdlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiB0aGlzLl9zdGFydFZhbHVlK3RoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpKnRoaXMuX3ZhbHVlUmFuZ2V9fSxPZj1lPT5NYXRoLmZsb29yKFNvKGUpKSxrZj0oZSx0KT0+MTAqKihPZihlKSt0KTtmdW5jdGlvbiBBZihlKXtyZXR1cm4gZS8xMCoqT2YoZSk9PTF9ZnVuY3Rpb24gamYoZSx0LG4pe2xldCByPTEwKipuLGk9TWF0aC5mbG9vcihlL3IpO3JldHVybiBNYXRoLmNlaWwodC9yKS1pfWZ1bmN0aW9uIE1mKGUsdCl7bGV0IG49T2YodC1lKTtmb3IoO2pmKGUsdCxuKT4xMDspbisrO2Zvcig7amYoZSx0LG4pPDEwOyluLS07cmV0dXJuIE1hdGgubWluKG4sT2YoZSkpfWZ1bmN0aW9uIE5mKGUse21pbjp0LG1heDpufSl7dD1aYShlLm1pbix0KTtsZXQgcj1bXSxpPU9mKHQpLGE9TWYodCxuKSxvPWE8MD8xMCoqTWF0aC5hYnMoYSk6MSxzPTEwKiphLGM9aT5hPzEwKippOjAsbD1NYXRoLnJvdW5kKCh0LWMpKm8pL28sdT1NYXRoLmZsb29yKCh0LWMpL3MvMTApKnMqMTAsZD1NYXRoLmZsb29yKChsLXUpLzEwKiphKSxmPVphKGUubWluLE1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vKTtmb3IoO2Y8bjspci5wdXNoKHt2YWx1ZTpmLG1ham9yOkFmKGYpLHNpZ25pZmljYW5kOmR9KSxkPj0xMD9kPWQ8MTU/MTU6MjA6ZCsrLGQ+PTIwJiYoYSsrLGQ9MixvPWE+PTA/MTpvKSxmPU1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vO2xldCBwPVphKGUubWF4LGYpO3JldHVybiByLnB1c2goe3ZhbHVlOnAsbWFqb3I6QWYocCksc2lnbmlmaWNhbmQ6ZH0pLHJ9KGNsYXNzIGV4dGVuZHMgVXV7c3RhdGljIGlkPWBsb2dhcml0aG1pY2A7c3RhdGljIGRlZmF1bHRzPXt0aWNrczp7Y2FsbGJhY2s6X3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxtYWpvcjp7ZW5hYmxlZDohMH19fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKGUsdCl7bGV0IG49RWYucHJvdG90eXBlLnBhcnNlLmFwcGx5KHRoaXMsW2UsdF0pO2lmKG49PT0wKXt0aGlzLl96ZXJvPSEwO3JldHVybn1yZXR1cm4gSyhuKSYmbj4wP246bnVsbH1kZXRlcm1pbmVEYXRhTGltaXRzKCl7bGV0e21pbjplLG1heDp0fT10aGlzLmdldE1pbk1heCghMCk7dGhpcy5taW49SyhlKT9NYXRoLm1heCgwLGUpOm51bGwsdGhpcy5tYXg9Syh0KT9NYXRoLm1heCgwLHQpOm51bGwsdGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvJiYodGhpcy5femVybz0hMCksdGhpcy5femVybyYmdGhpcy5taW4hPT10aGlzLl9zdWdnZXN0ZWRNaW4mJiFLKHRoaXMuX3VzZXJNaW4pJiYodGhpcy5taW49ZT09PWtmKHRoaXMubWluLDApP2tmKHRoaXMubWluLC0xKTprZih0aGlzLm1pbiwwKSksdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCl9aGFuZGxlVGlja1JhbmdlT3B0aW9ucygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSxuPXRoaXMubWluLHI9dGhpcy5tYXgsaT10PT5uPWU/bjp0LGE9ZT0+cj10P3I6ZTtuPT09ciYmKG48PTA/KGkoMSksYSgxMCkpOihpKGtmKG4sLTEpKSxhKGtmKHIsMSkpKSksbjw9MCYmaShrZihyLC0xKSkscjw9MCYmYShrZihuLDEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PU5mKHttaW46dGhpcy5fdXNlck1pbixtYXg6dGhpcy5fdXNlck1heH0sdGhpcyk7cmV0dXJuIGUuYm91bmRzPT09YHRpY2tzYCYmQW8odCx0aGlzLGB2YWx1ZWApLGUucmV2ZXJzZT8odC5yZXZlcnNlKCksdGhpcy5zdGFydD10aGlzLm1heCx0aGlzLmVuZD10aGlzLm1pbik6KHRoaXMuc3RhcnQ9dGhpcy5taW4sdGhpcy5lbmQ9dGhpcy5tYXgpLHR9Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZT09PXZvaWQgMD9gMGA6bXMoZSx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMubWluO3N1cGVyLmNvbmZpZ3VyZSgpLHRoaXMuX3N0YXJ0VmFsdWU9U28oZSksdGhpcy5fdmFsdWVSYW5nZT1Tbyh0aGlzLm1heCktU28oZSl9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtyZXR1cm4oZT09PXZvaWQgMHx8ZT09PTApJiYoZT10aGlzLm1pbiksZT09PW51bGx8fGlzTmFOKGUpP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbChlPT09dGhpcy5taW4/MDooU28oZSktdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbChlKXtsZXQgdD10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKTtyZXR1cm4gMTAqKih0aGlzLl9zdGFydFZhbHVlK3QqdGhpcy5fdmFsdWVSYW5nZSl9fSk7ZnVuY3Rpb24gUGYoZSl7bGV0IHQ9ZS50aWNrcztpZih0LmRpc3BsYXkmJmUuZGlzcGxheSl7bGV0IGU9USh0LmJhY2tkcm9wUGFkZGluZyk7cmV0dXJuIHEodC5mb250JiZ0LmZvbnQuc2l6ZSxaLmZvbnQuc2l6ZSkrZS5oZWlnaHR9cmV0dXJuIDB9ZnVuY3Rpb24gRmYoZSx0LG4pe3JldHVybiBuPVcobik/bjpbbl0se3c6VHMoZSx0LnN0cmluZyxuKSxoOm4ubGVuZ3RoKnQubGluZUhlaWdodH19ZnVuY3Rpb24gSWYoZSx0LG4scixpKXtyZXR1cm4gZT09PXJ8fGU9PT1pP3tzdGFydDp0LW4vMixlbmQ6dCtuLzJ9OmU8cnx8ZT5pP3tzdGFydDp0LW4sZW5kOnR9OntzdGFydDp0LGVuZDp0K259fWZ1bmN0aW9uIExmKGUpe2xldCB0PXtsOmUubGVmdCtlLl9wYWRkaW5nLmxlZnQscjplLnJpZ2h0LWUuX3BhZGRpbmcucmlnaHQsdDplLnRvcCtlLl9wYWRkaW5nLnRvcCxiOmUuYm90dG9tLWUuX3BhZGRpbmcuYm90dG9tfSxuPU9iamVjdC5hc3NpZ24oe30sdCkscj1bXSxpPVtdLGE9ZS5fcG9pbnRMYWJlbHMubGVuZ3RoLG89ZS5vcHRpb25zLnBvaW50TGFiZWxzLHM9by5jZW50ZXJQb2ludExhYmVscz9YL2E6MDtmb3IobGV0IGM9MDtjPGE7YysrKXtsZXQgYT1vLnNldENvbnRleHQoZS5nZXRQb2ludExhYmVsQ29udGV4dChjKSk7aVtjXT1hLnBhZGRpbmc7bGV0IGw9ZS5nZXRQb2ludFBvc2l0aW9uKGMsZS5kcmF3aW5nQXJlYStpW2NdLHMpLHU9JChhLmZvbnQpLGQ9RmYoZS5jdHgsdSxlLl9wb2ludExhYmVsc1tjXSk7cltjXT1kO2xldCBmPUlvKGUuZ2V0SW5kZXhBbmdsZShjKStzKSxwPU1hdGgucm91bmQoTW8oZikpO1JmKG4sdCxmLElmKHAsbC54LGQudywwLDE4MCksSWYocCxsLnksZC5oLDkwLDI3MCkpfWUuc2V0Q2VudGVyUG9pbnQodC5sLW4ubCxuLnItdC5yLHQudC1uLnQsbi5iLXQuYiksZS5fcG9pbnRMYWJlbEl0ZW1zPVZmKGUscixpKX1mdW5jdGlvbiBSZihlLHQsbixyLGkpe2xldCBhPU1hdGguYWJzKE1hdGguc2luKG4pKSxvPU1hdGguYWJzKE1hdGguY29zKG4pKSxzPTAsYz0wO3Iuc3RhcnQ8dC5sPyhzPSh0Lmwtci5zdGFydCkvYSxlLmw9TWF0aC5taW4oZS5sLHQubC1zKSk6ci5lbmQ+dC5yJiYocz0oci5lbmQtdC5yKS9hLGUucj1NYXRoLm1heChlLnIsdC5yK3MpKSxpLnN0YXJ0PHQudD8oYz0odC50LWkuc3RhcnQpL28sZS50PU1hdGgubWluKGUudCx0LnQtYykpOmkuZW5kPnQuYiYmKGM9KGkuZW5kLXQuYikvbyxlLmI9TWF0aC5tYXgoZS5iLHQuYitjKSl9ZnVuY3Rpb24gemYoZSx0LG4pe2xldCByPWUuZHJhd2luZ0FyZWEse2V4dHJhOmksYWRkaXRpb25hbEFuZ2xlOmEscGFkZGluZzpvLHNpemU6c309bixjPWUuZ2V0UG9pbnRQb3NpdGlvbih0LHIraStvLGEpLGw9TWF0aC5yb3VuZChNbyhJbyhjLmFuZ2xlK3lvKSkpLHU9V2YoYy55LHMuaCxsKSxkPUhmKGwpLGY9VWYoYy54LHMudyxkKTtyZXR1cm57dmlzaWJsZTohMCx4OmMueCx5OnUsdGV4dEFsaWduOmQsbGVmdDpmLHRvcDp1LHJpZ2h0OmYrcy53LGJvdHRvbTp1K3MuaH19ZnVuY3Rpb24gQmYoZSx0KXtpZighdClyZXR1cm4hMDtsZXR7bGVmdDpuLHRvcDpyLHJpZ2h0OmksYm90dG9tOmF9PWU7cmV0dXJuIShBcyh7eDpuLHk6cn0sdCl8fEFzKHt4Om4seTphfSx0KXx8QXMoe3g6aSx5OnJ9LHQpfHxBcyh7eDppLHk6YX0sdCkpfWZ1bmN0aW9uIFZmKGUsdCxuKXtsZXQgcj1bXSxpPWUuX3BvaW50TGFiZWxzLmxlbmd0aCxhPWUub3B0aW9ucyx7Y2VudGVyUG9pbnRMYWJlbHM6byxkaXNwbGF5OnN9PWEucG9pbnRMYWJlbHMsYz17ZXh0cmE6UGYoYSkvMixhZGRpdGlvbmFsQW5nbGU6bz9YL2k6MH0sbDtmb3IobGV0IGE9MDthPGk7YSsrKXtjLnBhZGRpbmc9blthXSxjLnNpemU9dFthXTtsZXQgaT16ZihlLGEsYyk7ci5wdXNoKGkpLHM9PT1gYXV0b2AmJihpLnZpc2libGU9QmYoaSxsKSxpLnZpc2libGUmJihsPWkpKX1yZXR1cm4gcn1mdW5jdGlvbiBIZihlKXtyZXR1cm4gZT09PTB8fGU9PT0xODA/YGNlbnRlcmA6ZTwxODA/YGxlZnRgOmByaWdodGB9ZnVuY3Rpb24gVWYoZSx0LG4pe3JldHVybiBuPT09YHJpZ2h0YD9lLT10Om49PT1gY2VudGVyYCYmKGUtPXQvMiksZX1mdW5jdGlvbiBXZihlLHQsbil7cmV0dXJuIG49PT05MHx8bj09PTI3MD9lLT10LzI6KG4+MjcwfHxuPDkwKSYmKGUtPXQpLGV9ZnVuY3Rpb24gR2YoZSx0LG4pe2xldHtsZWZ0OnIsdG9wOmkscmlnaHQ6YSxib3R0b206b309bix7YmFja2Ryb3BDb2xvcjpzfT10O2lmKCFVKHMpKXtsZXQgbj1Xcyh0LmJvcmRlclJhZGl1cyksYz1RKHQuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxTdHlsZT1zO2xldCBsPXItYy5sZWZ0LHU9aS1jLnRvcCxkPWEtcitjLndpZHRoLGY9by1pK2MuaGVpZ2h0O09iamVjdC52YWx1ZXMobikuc29tZShlPT5lIT09MCk/KGUuYmVnaW5QYXRoKCksTHMoZSx7eDpsLHk6dSx3OmQsaDpmLHJhZGl1czpufSksZS5maWxsKCkpOmUuZmlsbFJlY3QobCx1LGQsZil9fWZ1bmN0aW9uIEtmKGUsdCl7bGV0e2N0eDpuLG9wdGlvbnM6e3BvaW50TGFiZWxzOnJ9fT1lO2ZvcihsZXQgaT10LTE7aT49MDtpLS0pe2xldCB0PWUuX3BvaW50TGFiZWxJdGVtc1tpXTtpZighdC52aXNpYmxlKWNvbnRpbnVlO2xldCBhPXIuc2V0Q29udGV4dChlLmdldFBvaW50TGFiZWxDb250ZXh0KGkpKTtHZihuLGEsdCk7bGV0IG89JChhLmZvbnQpLHt4OnMseTpjLHRleHRBbGlnbjpsfT10O0lzKG4sZS5fcG9pbnRMYWJlbHNbaV0scyxjK28ubGluZUhlaWdodC8yLG8se2NvbG9yOmEuY29sb3IsdGV4dEFsaWduOmwsdGV4dEJhc2VsaW5lOmBtaWRkbGVgfSl9fWZ1bmN0aW9uIHFmKGUsdCxuLHIpe2xldHtjdHg6aX09ZTtpZihuKWkuYXJjKGUueENlbnRlcixlLnlDZW50ZXIsdCwwLGdvKTtlbHNle2xldCBuPWUuZ2V0UG9pbnRQb3NpdGlvbigwLHQpO2kubW92ZVRvKG4ueCxuLnkpO2ZvcihsZXQgYT0xO2E8cjthKyspbj1lLmdldFBvaW50UG9zaXRpb24oYSx0KSxpLmxpbmVUbyhuLngsbi55KX19ZnVuY3Rpb24gSmYoZSx0LG4scixpKXtsZXQgYT1lLmN0eCxvPXQuY2lyY3VsYXIse2NvbG9yOnMsbGluZVdpZHRoOmN9PXQ7IW8mJiFyfHwhc3x8IWN8fG48MHx8KGEuc2F2ZSgpLGEuc3Ryb2tlU3R5bGU9cyxhLmxpbmVXaWR0aD1jLGEuc2V0TGluZURhc2goaS5kYXNofHxbXSksYS5saW5lRGFzaE9mZnNldD1pLmRhc2hPZmZzZXQsYS5iZWdpblBhdGgoKSxxZihlLG4sbyxyKSxhLmNsb3NlUGF0aCgpLGEuc3Ryb2tlKCksYS5yZXN0b3JlKCkpfWZ1bmN0aW9uIFlmKGUsdCxuKXtyZXR1cm4gcXMoZSx7bGFiZWw6bixpbmRleDp0LHR5cGU6YHBvaW50TGFiZWxgfSl9KGNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWByYWRpYWxMaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGlzcGxheTohMCxhbmltYXRlOiEwLHBvc2l0aW9uOmBjaGFydEFyZWFgLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjB9LGdyaWQ6e2NpcmN1bGFyOiExfSxzdGFydEFuZ2xlOjAsdGlja3M6e3Nob3dMYWJlbEJhY2tkcm9wOiEwLGNhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY30scG9pbnRMYWJlbHM6e2JhY2tkcm9wQ29sb3I6dm9pZCAwLGJhY2tkcm9wUGFkZGluZzoyLGRpc3BsYXk6ITAsZm9udDp7c2l6ZToxMH0sY2FsbGJhY2soZSl7cmV0dXJuIGV9LHBhZGRpbmc6NSxjZW50ZXJQb2ludExhYmVsczohMX19O3N0YXRpYyBkZWZhdWx0Um91dGVzPXsiYW5nbGVMaW5lcy5jb2xvciI6YGJvcmRlckNvbG9yYCwicG9pbnRMYWJlbHMuY29sb3IiOmBjb2xvcmAsInRpY2tzLmNvbG9yIjpgY29sb3JgfTtzdGF0aWMgZGVzY3JpcHRvcnM9e2FuZ2xlTGluZXM6e19mYWxsYmFjazpgZ3JpZGB9fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnhDZW50ZXI9dm9pZCAwLHRoaXMueUNlbnRlcj12b2lkIDAsdGhpcy5kcmF3aW5nQXJlYT12b2lkIDAsdGhpcy5fcG9pbnRMYWJlbHM9W10sdGhpcy5fcG9pbnRMYWJlbEl0ZW1zPVtdfXNldERpbWVuc2lvbnMoKXtsZXQgZT10aGlzLl9wYWRkaW5nPVEoUGYodGhpcy5vcHRpb25zKS8yKSx0PXRoaXMud2lkdGg9dGhpcy5tYXhXaWR0aC1lLndpZHRoLG49dGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQtZS5oZWlnaHQ7dGhpcy54Q2VudGVyPU1hdGguZmxvb3IodGhpcy5sZWZ0K3QvMitlLmxlZnQpLHRoaXMueUNlbnRlcj1NYXRoLmZsb29yKHRoaXMudG9wK24vMitlLnRvcCksdGhpcy5kcmF3aW5nQXJlYT1NYXRoLmZsb29yKE1hdGgubWluKHQsbikvMil9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW46ZSxtYXg6dH09dGhpcy5nZXRNaW5NYXgoITEpO3RoaXMubWluPUsoZSkmJiFpc05hTihlKT9lOjAsdGhpcy5tYXg9Syh0KSYmIWlzTmFOKHQpP3Q6MCx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhL1BmKHRoaXMub3B0aW9ucykpfWdlbmVyYXRlVGlja0xhYmVscyhlKXtFZi5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcyxlKSx0aGlzLl9wb2ludExhYmVscz10aGlzLmdldExhYmVscygpLm1hcCgoZSx0KT0+e2xldCBuPUoodGhpcy5vcHRpb25zLnBvaW50TGFiZWxzLmNhbGxiYWNrLFtlLHRdLHRoaXMpO3JldHVybiBufHxuPT09MD9uOmBgfSkuZmlsdGVyKChlLHQpPT50aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KHQpKX1maXQoKXtsZXQgZT10aGlzLm9wdGlvbnM7ZS5kaXNwbGF5JiZlLnBvaW50TGFiZWxzLmRpc3BsYXk/TGYodGhpcyk6dGhpcy5zZXRDZW50ZXJQb2ludCgwLDAsMCwwKX1zZXRDZW50ZXJQb2ludChlLHQsbixyKXt0aGlzLnhDZW50ZXIrPU1hdGguZmxvb3IoKGUtdCkvMiksdGhpcy55Q2VudGVyKz1NYXRoLmZsb29yKChuLXIpLzIpLHRoaXMuZHJhd2luZ0FyZWEtPU1hdGgubWluKHRoaXMuZHJhd2luZ0FyZWEvMixNYXRoLm1heChlLHQsbixyKSl9Z2V0SW5kZXhBbmdsZShlKXtsZXQgdD1nby8odGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RofHwxKSxuPXRoaXMub3B0aW9ucy5zdGFydEFuZ2xlfHwwO3JldHVybiBJbyhlKnQram8obikpfWdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbik7cmV0dXJuIHRoaXMub3B0aW9ucy5yZXZlcnNlPyh0aGlzLm1heC1lKSp0OihlLXRoaXMubWluKSp0fWdldFZhbHVlRm9yRGlzdGFuY2VGcm9tQ2VudGVyKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD1lLyh0aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbikpO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT90aGlzLm1heC10OnRoaXMubWluK3R9Z2V0UG9pbnRMYWJlbENvbnRleHQoZSl7bGV0IHQ9dGhpcy5fcG9pbnRMYWJlbHN8fFtdO2lmKGU+PTAmJmU8dC5sZW5ndGgpe2xldCBuPXRbZV07cmV0dXJuIFlmKHRoaXMuZ2V0Q29udGV4dCgpLGUsbil9fWdldFBvaW50UG9zaXRpb24oZSx0LG49MCl7bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKGUpLXlvK247cmV0dXJue3g6TWF0aC5jb3MocikqdCt0aGlzLnhDZW50ZXIseTpNYXRoLnNpbihyKSp0K3RoaXMueUNlbnRlcixhbmdsZTpyfX1nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGUsdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0KSl9Z2V0QmFzZVBvc2l0aW9uKGUpe3JldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShlfHwwLHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldFBvaW50TGFiZWxQb3NpdGlvbihlKXtsZXR7bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9PXRoaXMuX3BvaW50TGFiZWxJdGVtc1tlXTtyZXR1cm57bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2JhY2tncm91bmRDb2xvcjplLGdyaWQ6e2NpcmN1bGFyOnR9fT10aGlzLm9wdGlvbnM7aWYoZSl7bGV0IG49dGhpcy5jdHg7bi5zYXZlKCksbi5iZWdpblBhdGgoKSxxZih0aGlzLHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5fZW5kVmFsdWUpLHQsdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoKSxuLmNsb3NlUGF0aCgpLG4uZmlsbFN0eWxlPWUsbi5maWxsKCksbi5yZXN0b3JlKCl9fWRyYXdHcmlkKCl7bGV0IGU9dGhpcy5jdHgsdD10aGlzLm9wdGlvbnMse2FuZ2xlTGluZXM6bixncmlkOnIsYm9yZGVyOml9PXQsYT10aGlzLl9wb2ludExhYmVscy5sZW5ndGgsbyxzLGM7aWYodC5wb2ludExhYmVscy5kaXNwbGF5JiZLZih0aGlzLGEpLHIuZGlzcGxheSYmdGhpcy50aWNrcy5mb3JFYWNoKChlLHQpPT57aWYodCE9PTB8fHQ9PT0wJiZ0aGlzLm1pbjwwKXtzPXRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZS52YWx1ZSk7bGV0IG49dGhpcy5nZXRDb250ZXh0KHQpLG89ci5zZXRDb250ZXh0KG4pLGM9aS5zZXRDb250ZXh0KG4pO0pmKHRoaXMsbyxzLGEsYyl9fSksbi5kaXNwbGF5KXtmb3IoZS5zYXZlKCksbz1hLTE7bz49MDtvLS0pe2xldCByPW4uc2V0Q29udGV4dCh0aGlzLmdldFBvaW50TGFiZWxDb250ZXh0KG8pKSx7Y29sb3I6aSxsaW5lV2lkdGg6YX09cjshYXx8IWl8fChlLmxpbmVXaWR0aD1hLGUuc3Ryb2tlU3R5bGU9aSxlLnNldExpbmVEYXNoKHIuYm9yZGVyRGFzaCksZS5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQscz10aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHQucmV2ZXJzZT90aGlzLm1pbjp0aGlzLm1heCksYz10aGlzLmdldFBvaW50UG9zaXRpb24obyxzKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHRoaXMueENlbnRlcix0aGlzLnlDZW50ZXIpLGUubGluZVRvKGMueCxjLnkpLGUuc3Ryb2tlKCkpfWUucmVzdG9yZSgpfX1kcmF3Qm9yZGVyKCl7fWRyYXdMYWJlbHMoKXtsZXQgZT10aGlzLmN0eCx0PXRoaXMub3B0aW9ucyxuPXQudGlja3M7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKDApLGksYTtlLnNhdmUoKSxlLnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSxlLnJvdGF0ZShyKSxlLnRleHRBbGlnbj1gY2VudGVyYCxlLnRleHRCYXNlbGluZT1gbWlkZGxlYCx0aGlzLnRpY2tzLmZvckVhY2goKHIsbyk9PntpZihvPT09MCYmdGhpcy5taW4+PTAmJiF0LnJldmVyc2UpcmV0dXJuO2xldCBzPW4uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobykpLGM9JChzLmZvbnQpO2lmKGk9dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW29dLnZhbHVlKSxzLnNob3dMYWJlbEJhY2tkcm9wKXtlLmZvbnQ9Yy5zdHJpbmcsYT1lLm1lYXN1cmVUZXh0KHIubGFiZWwpLndpZHRoLGUuZmlsbFN0eWxlPXMuYmFja2Ryb3BDb2xvcjtsZXQgdD1RKHMuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxSZWN0KC1hLzItdC5sZWZ0LC1pLWMuc2l6ZS8yLXQudG9wLGErdC53aWR0aCxjLnNpemUrdC5oZWlnaHQpfUlzKGUsci5sYWJlbCwwLC1pLGMse2NvbG9yOnMuY29sb3Isc3Ryb2tlQ29sb3I6cy50ZXh0U3Ryb2tlQ29sb3Isc3Ryb2tlV2lkdGg6cy50ZXh0U3Ryb2tlV2lkdGh9KX0pLGUucmVzdG9yZSgpfWRyYXdUaXRsZSgpe319KTt2YXIgWGY9e21pbGxpc2Vjb25kOntjb21tb246ITAsc2l6ZToxLHN0ZXBzOjFlM30sc2Vjb25kOntjb21tb246ITAsc2l6ZToxZTMsc3RlcHM6NjB9LG1pbnV0ZTp7Y29tbW9uOiEwLHNpemU6NmU0LHN0ZXBzOjYwfSxob3VyOntjb21tb246ITAsc2l6ZTozNmU1LHN0ZXBzOjI0fSxkYXk6e2NvbW1vbjohMCxzaXplOjg2NGU1LHN0ZXBzOjMwfSx3ZWVrOntjb21tb246ITEsc2l6ZTo2MDQ4ZTUsc3RlcHM6NH0sbW9udGg6e2NvbW1vbjohMCxzaXplOjI2MjhlNixzdGVwczoxMn0scXVhcnRlcjp7Y29tbW9uOiExLHNpemU6Nzg4NGU2LHN0ZXBzOjR9LHllYXI6e2NvbW1vbjohMCxzaXplOjMxNTRlN319LFpmPU9iamVjdC5rZXlzKFhmKTtmdW5jdGlvbiBRZihlLHQpe3JldHVybiBlLXR9ZnVuY3Rpb24gJGYoZSx0KXtpZihVKHQpKXJldHVybiBudWxsO2xldCBuPWUuX2FkYXB0ZXIse3BhcnNlcjpyLHJvdW5kOmksaXNvV2Vla2RheTphfT1lLl9wYXJzZU9wdHMsbz10O3JldHVybiB0eXBlb2Ygcj09YGZ1bmN0aW9uYCYmKG89cihvKSksSyhvKXx8KG89dHlwZW9mIHI9PWBzdHJpbmdgP24ucGFyc2UobyxyKTpuLnBhcnNlKG8pKSxvPT09bnVsbD9udWxsOihpJiYobz1pPT09YHdlZWtgJiYoT28oYSl8fGE9PT0hMCk/bi5zdGFydE9mKG8sYGlzb1dlZWtgLGEpOm4uc3RhcnRPZihvLGkpKSwrbyl9ZnVuY3Rpb24gZXAoZSx0LG4scil7bGV0IGk9WmYubGVuZ3RoO2ZvcihsZXQgYT1aZi5pbmRleE9mKGUpO2E8aS0xOysrYSl7bGV0IGU9WGZbWmZbYV1dLGk9ZS5zdGVwcz9lLnN0ZXBzOjIqKjUzLTE7aWYoZS5jb21tb24mJk1hdGguY2VpbCgobi10KS8oaSplLnNpemUpKTw9cilyZXR1cm4gWmZbYV19cmV0dXJuIFpmW2ktMV19ZnVuY3Rpb24gdHAoZSx0LG4scixpKXtmb3IobGV0IGE9WmYubGVuZ3RoLTE7YT49WmYuaW5kZXhPZihuKTthLS0pe2xldCBuPVpmW2FdO2lmKFhmW25dLmNvbW1vbiYmZS5fYWRhcHRlci5kaWZmKGkscixuKT49dC0xKXJldHVybiBufXJldHVybiBaZltuP1pmLmluZGV4T2Yobik6MF19ZnVuY3Rpb24gbnAoZSl7Zm9yKGxldCB0PVpmLmluZGV4T2YoZSkrMSxuPVpmLmxlbmd0aDt0PG47Kyt0KWlmKFhmW1pmW3RdXS5jb21tb24pcmV0dXJuIFpmW3RdfWZ1bmN0aW9uIHJwKGUsdCxuKXtpZighbillW3RdPSEwO2Vsc2UgaWYobi5sZW5ndGgpe2xldHtsbzpyLGhpOml9PVZvKG4sdCksYT1uW3JdPj10P25bcl06bltpXTtlW2FdPSEwfX1mdW5jdGlvbiBpcChlLHQsbixyKXtsZXQgaT1lLl9hZGFwdGVyLGE9K2kuc3RhcnRPZih0WzBdLnZhbHVlLHIpLG89dFt0Lmxlbmd0aC0xXS52YWx1ZSxzLGM7Zm9yKHM9YTtzPD1vO3M9K2kuYWRkKHMsMSxyKSljPW5bc10sYz49MCYmKHRbY10ubWFqb3I9ITApO3JldHVybiB0fWZ1bmN0aW9uIGFwKGUsdCxuKXtsZXQgcj1bXSxpPXt9LGE9dC5sZW5ndGgsbyxzO2ZvcihvPTA7bzxhOysrbylzPXRbb10saVtzXT1vLHIucHVzaCh7dmFsdWU6cyxtYWpvcjohMX0pO3JldHVybiBhPT09MHx8IW4/cjppcChlLHIsaSxuKX12YXIgb3A9Y2xhc3MgZXh0ZW5kcyBVdXtzdGF0aWMgaWQ9YHRpbWVgO3N0YXRpYyBkZWZhdWx0cz17Ym91bmRzOmBkYXRhYCxhZGFwdGVyczp7fSx0aW1lOntwYXJzZXI6ITEsdW5pdDohMSxyb3VuZDohMSxpc29XZWVrZGF5OiExLG1pblVuaXQ6YG1pbGxpc2Vjb25kYCxkaXNwbGF5Rm9ybWF0czp7fX0sdGlja3M6e3NvdXJjZTpgYXV0b2AsY2FsbGJhY2s6ITEsbWFqb3I6e2VuYWJsZWQ6ITF9fX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX0sdGhpcy5fdW5pdD1gZGF5YCx0aGlzLl9tYWpvclVuaXQ9dm9pZCAwLHRoaXMuX29mZnNldHM9e30sdGhpcy5fbm9ybWFsaXplZD0hMSx0aGlzLl9wYXJzZU9wdHM9dm9pZCAwfWluaXQoZSx0PXt9KXtsZXQgbj1lLnRpbWV8fD17fSxyPXRoaXMuX2FkYXB0ZXI9bmV3IERsLl9kYXRlKGUuYWRhcHRlcnMuZGF0ZSk7ci5pbml0KHQpLGlvKG4uZGlzcGxheUZvcm1hdHMsci5mb3JtYXRzKCkpLHRoaXMuX3BhcnNlT3B0cz17cGFyc2VyOm4ucGFyc2VyLHJvdW5kOm4ucm91bmQsaXNvV2Vla2RheTpuLmlzb1dlZWtkYXl9LHN1cGVyLmluaXQoZSksdGhpcy5fbm9ybWFsaXplZD10Lm5vcm1hbGl6ZWR9cGFyc2UoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD9udWxsOiRmKHRoaXMsZSl9YmVmb3JlTGF5b3V0KCl7c3VwZXIuYmVmb3JlTGF5b3V0KCksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX19ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2FkYXB0ZXIsbj1lLnRpbWUudW5pdHx8YGRheWAse21pbjpyLG1heDppLG1pbkRlZmluZWQ6YSxtYXhEZWZpbmVkOm99PXRoaXMuZ2V0VXNlckJvdW5kcygpO2Z1bmN0aW9uIHMoZSl7IWEmJiFpc05hTihlLm1pbikmJihyPU1hdGgubWluKHIsZS5taW4pKSwhbyYmIWlzTmFOKGUubWF4KSYmKGk9TWF0aC5tYXgoaSxlLm1heCkpfSghYXx8IW8pJiYocyh0aGlzLl9nZXRMYWJlbEJvdW5kcygpKSwoZS5ib3VuZHMhPT1gdGlja3NgfHxlLnRpY2tzLnNvdXJjZSE9PWBsYWJlbHNgKSYmcyh0aGlzLmdldE1pbk1heCghMSkpKSxyPUsocikmJiFpc05hTihyKT9yOit0LnN0YXJ0T2YoRGF0ZS5ub3coKSxuKSxpPUsoaSkmJiFpc05hTihpKT9pOit0LmVuZE9mKERhdGUubm93KCksbikrMSx0aGlzLm1pbj1NYXRoLm1pbihyLGktMSksdGhpcy5tYXg9TWF0aC5tYXgocisxLGkpfV9nZXRMYWJlbEJvdW5kcygpe2xldCBlPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCksdD0xLzAsbj0tMS8wO3JldHVybiBlLmxlbmd0aCYmKHQ9ZVswXSxuPWVbZS5sZW5ndGgtMV0pLHttaW46dCxtYXg6bn19YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PWUudGltZSxuPWUudGlja3Mscj1uLnNvdXJjZT09PWBsYWJlbHNgP3RoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk6dGhpcy5fZ2VuZXJhdGUoKTtlLmJvdW5kcz09PWB0aWNrc2AmJnIubGVuZ3RoJiYodGhpcy5taW49dGhpcy5fdXNlck1pbnx8clswXSx0aGlzLm1heD10aGlzLl91c2VyTWF4fHxyW3IubGVuZ3RoLTFdKTtsZXQgaT10aGlzLm1pbixhPXRoaXMubWF4LG89V28ocixpLGEpO3JldHVybiB0aGlzLl91bml0PXQudW5pdHx8KG4uYXV0b1NraXA/ZXAodC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4LHRoaXMuX2dldExhYmVsQ2FwYWNpdHkoaSkpOnRwKHRoaXMsby5sZW5ndGgsdC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4KSksdGhpcy5fbWFqb3JVbml0PSFuLm1ham9yLmVuYWJsZWR8fHRoaXMuX3VuaXQ9PT1geWVhcmA/dm9pZCAwOm5wKHRoaXMuX3VuaXQpLHRoaXMuaW5pdE9mZnNldHMociksZS5yZXZlcnNlJiZvLnJldmVyc2UoKSxhcCh0aGlzLG8sdGhpcy5fbWFqb3JVbml0KX1hZnRlckF1dG9Ta2lwKCl7dGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXAmJnRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAoZT0+K2UudmFsdWUpKX1pbml0T2Zmc2V0cyhlPVtdKXtsZXQgdD0wLG49MCxyLGk7dGhpcy5vcHRpb25zLm9mZnNldCYmZS5sZW5ndGgmJihyPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbMF0pLHQ9ZS5sZW5ndGg9PT0xPzEtcjoodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVsxXSktcikvMixpPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbZS5sZW5ndGgtMV0pLG49ZS5sZW5ndGg9PT0xP2k6KGktdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVtlLmxlbmd0aC0yXSkpLzIpO2xldCBhPWUubGVuZ3RoPDM/LjU6LjI1O3Q9Um8odCwwLGEpLG49Um8obiwwLGEpLHRoaXMuX29mZnNldHM9e3N0YXJ0OnQsZW5kOm4sZmFjdG9yOjEvKHQrMStuKX19X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5fYWRhcHRlcix0PXRoaXMubWluLG49dGhpcy5tYXgscj10aGlzLm9wdGlvbnMsaT1yLnRpbWUsYT1pLnVuaXR8fGVwKGkubWluVW5pdCx0LG4sdGhpcy5fZ2V0TGFiZWxDYXBhY2l0eSh0KSksbz1xKHIudGlja3Muc3RlcFNpemUsMSkscz1hPT09YHdlZWtgJiZpLmlzb1dlZWtkYXksYz1PbyhzKXx8cz09PSEwLGw9e30sdT10LGQsZjtpZihjJiYodT0rZS5zdGFydE9mKHUsYGlzb1dlZWtgLHMpKSx1PStlLnN0YXJ0T2YodSxjP2BkYXlgOmEpLGUuZGlmZihuLHQsYSk+MWU1Km8pdGhyb3cgRXJyb3IodCtgIGFuZCBgK24rYCBhcmUgdG9vIGZhciBhcGFydCB3aXRoIHN0ZXBTaXplIG9mIGArbytgIGArYSk7bGV0IHA9ci50aWNrcy5zb3VyY2U9PT1gZGF0YWAmJnRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtmb3IoZD11LGY9MDtkPG47ZD0rZS5hZGQoZCxvLGEpLGYrKylycChsLGQscCk7cmV0dXJuKGQ9PT1ufHxyLmJvdW5kcz09PWB0aWNrc2B8fGY9PT0xKSYmcnAobCxkLHApLE9iamVjdC5rZXlzKGwpLnNvcnQoUWYpLm1hcChlPT4rZSl9Z2V0TGFiZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9hZGFwdGVyLG49dGhpcy5vcHRpb25zLnRpbWU7cmV0dXJuIG4udG9vbHRpcEZvcm1hdD90LmZvcm1hdChlLG4udG9vbHRpcEZvcm1hdCk6dC5mb3JtYXQoZSxuLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKX1mb3JtYXQoZSx0KXtsZXQgbj10aGlzLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cyxyPXRoaXMuX3VuaXQsaT10fHxuW3JdO3JldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdChlLGkpfV90aWNrRm9ybWF0RnVuY3Rpb24oZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zLGE9aS50aWNrcy5jYWxsYmFjaztpZihhKXJldHVybiBKKGEsW2UsdCxuXSx0aGlzKTtsZXQgbz1pLnRpbWUuZGlzcGxheUZvcm1hdHMscz10aGlzLl91bml0LGM9dGhpcy5fbWFqb3JVbml0LGw9cyYmb1tzXSx1PWMmJm9bY10sZD1uW3RdLGY9YyYmdSYmZCYmZC5tYWpvcjtyZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQoZSxyfHwoZj91OmwpKX1nZW5lcmF0ZVRpY2tMYWJlbHMoZSl7bGV0IHQsbixyO2Zvcih0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXI9ZVt0XSxyLmxhYmVsPXRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihyLnZhbHVlLHQsZSl9Z2V0RGVjaW1hbEZvclZhbHVlKGUpe3JldHVybiBlPT09bnVsbD9OYU46KGUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9vZmZzZXRzLG49dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZSk7cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh0LnN0YXJ0K24pKnQuZmFjdG9yKX1nZXRWYWx1ZUZvclBpeGVsKGUpe2xldCB0PXRoaXMuX29mZnNldHMsbj10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKS90LmZhY3Rvci10LmVuZDtyZXR1cm4gdGhpcy5taW4rbioodGhpcy5tYXgtdGhpcy5taW4pfV9nZXRMYWJlbFNpemUoZSl7bGV0IHQ9dGhpcy5vcHRpb25zLnRpY2tzLG49dGhpcy5jdHgubWVhc3VyZVRleHQoZSkud2lkdGgscj1qbyh0aGlzLmlzSG9yaXpvbnRhbCgpP3QubWF4Um90YXRpb246dC5taW5Sb3RhdGlvbiksaT1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLG89dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5zaXplO3JldHVybnt3Om4qaStvKmEsaDpuKmErbyppfX1fZ2V0TGFiZWxDYXBhY2l0eShlKXtsZXQgdD10aGlzLm9wdGlvbnMudGltZSxuPXQuZGlzcGxheUZvcm1hdHMscj1uW3QudW5pdF18fG4ubWlsbGlzZWNvbmQsaT10aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24oZSwwLGFwKHRoaXMsW2VdLHRoaXMuX21ham9yVW5pdCksciksYT10aGlzLl9nZXRMYWJlbFNpemUoaSksbz1NYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aC9hLnc6dGhpcy5oZWlnaHQvYS5oKS0xO3JldHVybiBvPjA/bzoxfWdldERhdGFUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUuZGF0YXx8W10sdCxuO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCByPXRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKTtpZih0aGlzLl9ub3JtYWxpemVkJiZyLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FjaGUuZGF0YT1yWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpO2Zvcih0PTAsbj1yLmxlbmd0aDt0PG47Kyt0KWU9ZS5jb25jYXQoclt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmRhdGE9dGhpcy5ub3JtYWxpemUoZSl9Z2V0TGFiZWxUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUubGFiZWxzfHxbXSx0LG47aWYoZS5sZW5ndGgpcmV0dXJuIGU7bGV0IHI9dGhpcy5nZXRMYWJlbHMoKTtmb3IodD0wLG49ci5sZW5ndGg7dDxuOysrdCllLnB1c2goJGYodGhpcyxyW3RdKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmxhYmVscz10aGlzLl9ub3JtYWxpemVkP2U6dGhpcy5ub3JtYWxpemUoZSl9bm9ybWFsaXplKGUpe3JldHVybiBKbyhlLnNvcnQoUWYpKX19O2Z1bmN0aW9uIHNwKGUsdCxuKXtsZXQgcj0wLGk9ZS5sZW5ndGgtMSxhLG8scyxjO24/KHQ+PWVbcl0ucG9zJiZ0PD1lW2ldLnBvcyYmKHtsbzpyLGhpOml9PUhvKGUsYHBvc2AsdCkpLHtwb3M6YSx0aW1lOnN9PWVbcl0se3BvczpvLHRpbWU6Y309ZVtpXSk6KHQ+PWVbcl0udGltZSYmdDw9ZVtpXS50aW1lJiYoe2xvOnIsaGk6aX09SG8oZSxgdGltZWAsdCkpLHt0aW1lOmEscG9zOnN9PWVbcl0se3RpbWU6byxwb3M6Y309ZVtpXSk7bGV0IGw9by1hO3JldHVybiBsP3MrKGMtcykqKHQtYSkvbDpzfShjbGFzcyBleHRlbmRzIG9we3N0YXRpYyBpZD1gdGltZXNlcmllc2A7c3RhdGljIGRlZmF1bHRzPW9wLmRlZmF1bHRzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuX3RhYmxlPVtdLHRoaXMuX21pblBvcz12b2lkIDAsdGhpcy5fdGFibGVSYW5nZT12b2lkIDB9aW5pdE9mZnNldHMoKXtsZXQgZT10aGlzLl9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKSx0PXRoaXMuX3RhYmxlPXRoaXMuYnVpbGRMb29rdXBUYWJsZShlKTt0aGlzLl9taW5Qb3M9c3AodCx0aGlzLm1pbiksdGhpcy5fdGFibGVSYW5nZT1zcCh0LHRoaXMubWF4KS10aGlzLl9taW5Qb3Msc3VwZXIuaW5pdE9mZnNldHMoZSl9YnVpbGRMb29rdXBUYWJsZShlKXtsZXR7bWluOnQsbWF4Om59PXRoaXMscj1bXSxpPVtdLGEsbyxzLGMsbDtmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSljPWVbYV0sYz49dCYmYzw9biYmci5wdXNoKGMpO2lmKHIubGVuZ3RoPDIpcmV0dXJuW3t0aW1lOnQscG9zOjB9LHt0aW1lOm4scG9zOjF9XTtmb3IoYT0wLG89ci5sZW5ndGg7YTxvOysrYSlsPXJbYSsxXSxzPXJbYS0xXSxjPXJbYV0sTWF0aC5yb3VuZCgobCtzKS8yKSE9PWMmJmkucHVzaCh7dGltZTpjLHBvczphLyhvLTEpfSk7cmV0dXJuIGl9X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5taW4sdD10aGlzLm1heCxuPXN1cGVyLmdldERhdGFUaW1lc3RhbXBzKCk7cmV0dXJuKCFuLmluY2x1ZGVzKGUpfHwhbi5sZW5ndGgpJiZuLnNwbGljZSgwLDAsZSksKCFuLmluY2x1ZGVzKHQpfHxuLmxlbmd0aD09PTEpJiZuLnB1c2godCksbi5zb3J0KChlLHQpPT5lLXQpfV9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKXtsZXQgZT10aGlzLl9jYWNoZS5hbGx8fFtdO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCB0PXRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKSxuPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7cmV0dXJuIGU9dC5sZW5ndGgmJm4ubGVuZ3RoP3RoaXMubm9ybWFsaXplKHQuY29uY2F0KG4pKTp0Lmxlbmd0aD90Om4sZT10aGlzLl9jYWNoZS5hbGw9ZSxlfWdldERlY2ltYWxGb3JWYWx1ZShlKXtyZXR1cm4oc3AodGhpcy5fdGFibGUsZSktdGhpcy5fbWluUG9zKS90aGlzLl90YWJsZVJhbmdlfWdldFZhbHVlRm9yUGl4ZWwoZSl7bGV0IHQ9dGhpcy5fb2Zmc2V0cyxuPXRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpL3QuZmFjdG9yLXQuZW5kO3JldHVybiBzcCh0aGlzLl90YWJsZSxuKnRoaXMuX3RhYmxlUmFuZ2UrdGhpcy5fbWluUG9zLCEwKX19KTt2YXIgY3A9e2RhdGE6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfSxvcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OigpPT4oe30pfSxwbHVnaW5zOnt0eXBlOkFycmF5LGRlZmF1bHQ6KCk9PltdfSxkYXRhc2V0SWRLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6YGxhYmVsYH0sdXBkYXRlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp2b2lkIDB9fSxscD17YXJpYUxhYmVsOnt0eXBlOlN0cmluZ30sYXJpYURlc2NyaWJlZGJ5Ont0eXBlOlN0cmluZ319LHVwPXt0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzdHJveURlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LC4uLmNwLC4uLmxwfSxkcD0oZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQpO2Z1bmN0aW9uIGZwKGUpe3JldHVybiBjKGUpP08oZSk6ZX1mdW5jdGlvbiBwcChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZTtyZXR1cm4gYyh0KT9uZXcgUHJveHkoZSx7fSk6ZX1mdW5jdGlvbiBtcChlLHQpe2xldCBuPWUub3B0aW9ucztuJiZ0JiZPYmplY3QuYXNzaWduKG4sdCl9ZnVuY3Rpb24gaHAoZSx0KXtlLmxhYmVscz10fWZ1bmN0aW9uIGdwKGUsdCxuKXtsZXQgcj1bXTtlLmRhdGFzZXRzPXQubWFwKHQ9PntsZXQgaT1lLmRhdGFzZXRzLmZpbmQoZT0+ZVtuXT09PXRbbl0pO3JldHVybiFpfHwhdC5kYXRhfHxyLmluY2x1ZGVzKGkpP3suLi50fTooci5wdXNoKGkpLE9iamVjdC5hc3NpZ24oaSx0KSxpKX0pfWZ1bmN0aW9uIF9wKGUsdCl7bGV0IG49e2xhYmVsczpbXSxkYXRhc2V0czpbXX07cmV0dXJuIGhwKG4sZS5sYWJlbHMpLGdwKG4sZS5kYXRhc2V0cyx0KSxufXZhciB2cD1SKHtwcm9wczp1cCxzZXR1cChlLHQpe2xldHtleHBvc2U6bixzbG90czpyfT10LGk9RihudWxsKSxhPXcobnVsbCk7bih7Y2hhcnQ6YX0pO2xldCBvPSgpPT57aWYoIWkudmFsdWUpcmV0dXJuO2xldHt0eXBlOnQsZGF0YTpuLG9wdGlvbnM6cixwbHVnaW5zOm8sZGF0YXNldElkS2V5OnN9PWUsYz1wcChfcChuLHMpLG4pO2EudmFsdWU9bmV3IGpkKGkudmFsdWUse3R5cGU6dCxkYXRhOmMsb3B0aW9uczp7Li4ucn0scGx1Z2luczpvfSl9LHM9KCk9PntsZXQgdD1PKGEudmFsdWUpO3QmJihlLmRlc3Ryb3lEZWxheT4wP3NldFRpbWVvdXQoKCk9Pnt0LmRlc3Ryb3koKSxhLnZhbHVlPW51bGx9LGUuZGVzdHJveURlbGF5KToodC5kZXN0cm95KCksYS52YWx1ZT1udWxsKSl9LGM9dD0+e3QudXBkYXRlKGUudXBkYXRlTW9kZSl9O3JldHVybiBNZShvKSx3ZShzKSxWKFsoKT0+ZS5vcHRpb25zLCgpPT5lLmRhdGFdLCh0LG4pPT57bGV0W3IsaV09dCxbbyxzXT1uLGw9TyhhLnZhbHVlKTtpZighbClyZXR1cm47bGV0IHU9ITE7aWYocil7bGV0IGU9ZnAociksdD1mcChvKTtlJiZlIT09dCYmKG1wKGwsZSksdT0hMCl9aWYoaSl7bGV0IHQ9ZnAoaS5sYWJlbHMpLG49ZnAocy5sYWJlbHMpLHI9ZnAoaS5kYXRhc2V0cyksYT1mcChzLmRhdGFzZXRzKTt0IT09biYmKGhwKGwuY29uZmlnLmRhdGEsdCksdT0hMCksciYmciE9PWEmJihncChsLmNvbmZpZy5kYXRhLHIsZS5kYXRhc2V0SWRLZXkpLHU9ITApfXUmJnhlKCgpPT57YyhsKX0pfSx7ZGVlcDohMH0pLCgpPT5BZShgY2FudmFzYCx7cm9sZTpgaW1nYCwiYXJpYS1sYWJlbCI6ZS5hcmlhTGFiZWwsImFyaWEtZGVzY3JpYmVkYnkiOmUuYXJpYURlc2NyaWJlZGJ5LHJlZjppfSxbQWUoYHBgLHt9LFtyLmRlZmF1bHQ/ci5kZWZhdWx0KCk6YGBdKV0pfX0pO2Z1bmN0aW9uIHlwKGUsdCl7cmV0dXJuIGpkLnJlZ2lzdGVyKHQpLFIoe3Byb3BzOmNwLHNldHVwKHQsbil7bGV0e2V4cG9zZTpyfT1uLGk9dyhudWxsKSxhPXcobnVsbCk7VigoKT0+YS52YWx1ZT8uY2hhcnQ/P251bGwsZT0+e2kudmFsdWU9ZX0se2ZsdXNoOmBzeW5jYH0pLHIoe2NoYXJ0Oml9KTtsZXQgbz1lPT57YS52YWx1ZT1lfTtyZXR1cm4oKT0+QWUodnAsZHAoe3JlZjpvfSx7dHlwZTplLC4uLnR9KSl9fSl9dmFyIGJwPXlwKGBiYXJgLFRsKTtqZC5yZWdpc3RlcihUbCxIZCxDZixEZixaZCx2Zik7ZnVuY3Rpb24geHAoKXtsZXQgZT1GKGBgKSx0PUYoYGApLG49RihgYCk7ZnVuY3Rpb24gcigpe2xldCByPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtlLnZhbHVlPXIuZ2V0UHJvcGVydHlWYWx1ZShgLS1mb3JlZ3JvdW5kYCkudHJpbSgpLHQudmFsdWU9ci5nZXRQcm9wZXJ0eVZhbHVlKGAtLW11dGVkLWZvcmVncm91bmRgKS50cmltKCksbi52YWx1ZT1yLmdldFByb3BlcnR5VmFsdWUoYC0tYm9yZGVyYCkudHJpbSgpfWxldCBpO3JldHVybiBNZSgoKT0+e3IoKSxpPXdpbmRvdy5tYXRjaE1lZGlhKGAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspYCksaS5hZGRFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSksSWUoKCk9PntpPy5yZW1vdmVFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSkse2ZvcmVncm91bmQ6ZSxtdXRlZEZvcmVncm91bmQ6dCxib3JkZXI6bn19dmFyIFNwPXtjb3N0OmBDb3N0YCxyZXE6YFJlcXVlc3RzYCx0b2tpbjpgVG9rZW5zIGluYCx0b2tvdXQ6YFRva2VucyBvdXRgfSxDcD0yMCx3cD0xMDAsVHA9M2U0LEVwPXtob3VyOjI0LGRheTozMCxtb250aDoxMn0sRHA9e2hvdXI6YDI0aGAsZGF5OmAzMGRgLG1vbnRoOmAxMm1vYH07ZnVuY3Rpb24gT3AoZSl7c3dpdGNoKGUpe2Nhc2VgcmVxdWVzdHNgOnJldHVybltgcmVxYF07Y2FzZWB0b2tlbnNgOnJldHVybltgdG9raW5gLGB0b2tvdXRgXTtjYXNlYGNvc3RgOnJldHVybltgY29zdGBdO2Nhc2VgbW9kZWxzYDpyZXR1cm5bXX19dmFyIGtwPWRlKGBoaXN0b3J5YCx7c3RhdGU6KCk9Pih7c2NvcGU6YHRvdGFsYCx3aW5kb3c6YGhvdXJgLHRhYjpgcmVxdWVzdHNgLG1vZGVsTWV0cmljOmBjb3N0YCxzZXJpZXNCeU1ldHJpYzp7fSxtb2RlbFJhbmtpbmc6W10sbW9kZWxPcHRpb25zOltdLGxvYWRpbmc6ITEsZXJyb3I6YGAsdGltZXI6dm9pZCAwfSksYWN0aW9uczp7c2V0U2NvcGUoZSl7ZSE9PXRoaXMuc2NvcGUmJih0aGlzLnNjb3BlPWUsdGhpcy5yZWZyZXNoKCkpfSxzZXRXaW5kb3coZSl7ZSE9PXRoaXMud2luZG93JiYodGhpcy53aW5kb3c9ZSx0aGlzLnJlZnJlc2goKSl9LHNldFRhYihlKXtlIT09dGhpcy50YWImJih0aGlzLnRhYj1lLHRoaXMucmVmcmVzaCgpKX0sc2V0TW9kZWxNZXRyaWMoZSl7ZSE9PXRoaXMubW9kZWxNZXRyaWMmJih0aGlzLm1vZGVsTWV0cmljPWUsdGhpcy5yZWZyZXNoKCkpfSxhc3luYyByZWZyZXNoKCl7YXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMudGFiPT09YG1vZGVsc2A/dGhpcy5mZXRjaE1vZGVsUmFua2luZygpOnRoaXMuZmV0Y2hTZXJpZXMoKSx0aGlzLmZldGNoTW9kZWxPcHRpb25zKCldKX0sYXN5bmMgZmV0Y2hTZXJpZXMoKXtpZihqZSgpLmlzQXV0aGVudGljYXRlZCl7dGhpcy5sb2FkaW5nPSEwO3RyeXtsZXQgZT1FcFt0aGlzLndpbmRvd10sdD1PcCh0aGlzLnRhYiksbj1hd2FpdCBQcm9taXNlLmFsbCh0Lm1hcCh0PT5GZShgL2FkbWluL2FwaS91c2FnZS9oaXN0b3J5P3Njb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2NvcGUpfSZtZXRyaWM9JHt0fSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mc3Bhbj0ke2V9YCkpKSxyPXt9O3QuZm9yRWFjaCgoZSx0KT0+e3JbZV09blt0XS5wb2ludHN9KSx0aGlzLnNlcmllc0J5TWV0cmljPXIsdGhpcy5lcnJvcj1gYH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgYmUmJihlLnN0YXR1cz09PTQwMXx8ZS5zdGF0dXM9PT00MDMpKXJldHVybjt0aGlzLmVycm9yPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWZpbmFsbHl7dGhpcy5sb2FkaW5nPSExfX19LGFzeW5jIGZldGNoTW9kZWxSYW5raW5nKCl7aWYoamUoKS5pc0F1dGhlbnRpY2F0ZWQpe3RoaXMubG9hZGluZz0hMDt0cnl7bGV0IGU9YXdhaXQgRmUoYC9hZG1pbi9hcGkvdXNhZ2UvbW9kZWxzP21ldHJpYz0ke3RoaXMubW9kZWxNZXRyaWN9JndpbmRvdz0ke3RoaXMud2luZG93fSZsaW1pdD0ke0NwfWApO3RoaXMubW9kZWxSYW5raW5nPWUubW9kZWxzLHRoaXMuZXJyb3I9YGB9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGJlJiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSlyZXR1cm47dGhpcy5lcnJvcj1lIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1maW5hbGx5e3RoaXMubG9hZGluZz0hMX19fSxhc3luYyBmZXRjaE1vZGVsT3B0aW9ucygpe2lmKGplKCkuaXNBdXRoZW50aWNhdGVkKXRyeXtsZXQgZT1hd2FpdCBGZShgL2FkbWluL2FwaS91c2FnZS9tb2RlbHM/bWV0cmljPXJlcSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mbGltaXQ9JHt3cH1gKTt0aGlzLm1vZGVsT3B0aW9ucz1lLm1vZGVsc31jYXRjaHt9fSxzdGFydEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lcj09PXZvaWQgMCYmKHRoaXMudGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgdGhpcy5yZWZyZXNoKCksVHApKX0sc3RvcEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxBcD17a2V5OjAsY2xhc3M6YHB5LTggdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxqcD1SKHtfX25hbWU6YE1vZGVsVXNhZ2VDaGFydGAscHJvcHM6e21ldHJpYzp7fSxtb2RlbHM6e319LHNldHVwKGUpe2xldCB0PWUse2ZvcmVncm91bmQ6bixtdXRlZEZvcmVncm91bmQ6cixib3JkZXI6YX09eHAoKSxvPXtyZXE6YC0tY2hhcnQtcmVxdWVzdHNgLHRva2luOmAtLWNoYXJ0LXRva2Vucy1pbmAsdG9rb3V0OmAtLWNoYXJ0LXRva2Vucy1vdXRgLGNvc3Q6YC0tY2hhcnQtY29zdGB9O2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZT09PWBjb3N0YD90LzFlNjp0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGUpLnRyaW0oKX1sZXQgbD1NKCgpPT4obi52YWx1ZSx7bGFiZWxzOnQubW9kZWxzLm1hcChlPT5lLmlkKSxkYXRhc2V0czpbe2xhYmVsOlNwW3QubWV0cmljXSxiYWNrZ3JvdW5kQ29sb3I6YyhvW3QubWV0cmljXSksZGF0YTp0Lm1vZGVscy5tYXAoZT0+cyh0Lm1ldHJpYyxlLnZhbHVlKSl9XX0pKSx1PU0oKCk9PmAke01hdGgubWF4KDE4MCx0Lm1vZGVscy5sZW5ndGgqMjgrNjApfXB4YCksZD1NKCgpPT4oe2luZGV4QXhpczpgeWAscmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e2JlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmEudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQubWV0cmljPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19LHk6e2dyaWQ6e2Rpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGF1dG9Ta2lwOiExfX19LHBsdWdpbnM6e2xlZ2VuZDp7ZGlzcGxheTohMX0sdG9vbHRpcDp7Y2FsbGJhY2tzOntsYWJlbDplPT57bGV0IG49ZS5wYXJzZWQueD8/MDtyZXR1cm4gdC5tZXRyaWM9PT1gY29zdGA/YCR7U3BbdC5tZXRyaWNdfTogJCR7bi50b0ZpeGVkKDQpfWA6YCR7U3BbdC5tZXRyaWNdfTogJHtrZShuKX0gKCR7VWUobil9KWB9fX19fSkpO3JldHVybih0LG4pPT5lLm1vZGVscy5sZW5ndGg9PT0wPyhOKCksUChgcGAsQXAsYCBObyBtb2RlbCByZWNvcmRlZCBhbnkgdXNhZ2UgaW4gdGhpcyB3aW5kb3cuIGApKTooTigpLFAoYGRpdmAse2tleToxLGNsYXNzOmB3LWZ1bGxgLHN0eWxlOmkoe2hlaWdodDp1LnZhbHVlfSl9LFtMKGIoYnApLHtkYXRhOmwudmFsdWUsb3B0aW9uczpkLnZhbHVlfSxudWxsLDgsW2BkYXRhYCxgb3B0aW9uc2BdKV0sNCkpfX0pLE1wPXtjbGFzczpgaC03MiB3LWZ1bGxgfSxOcD1SKHtfX25hbWU6YFVzYWdlQ2hhcnRgLHByb3BzOnt0YWI6e30sd2luZG93Ont9LHNlcmllc0J5TWV0cmljOnt9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3JlZ3JvdW5kOm4sbXV0ZWRGb3JlZ3JvdW5kOnIsYm9yZGVyOml9PXhwKCksYT17cmVxdWVzdHM6W3ttZXRyaWM6YHJlcWAsbGFiZWw6YFJlcXVlc3RzYCxjb2xvcjpgLS1jaGFydC1yZXF1ZXN0c2B9XSx0b2tlbnM6W3ttZXRyaWM6YHRva2luYCxsYWJlbDpgVG9rZW5zIGluYCxjb2xvcjpgLS1jaGFydC10b2tlbnMtaW5gfSx7bWV0cmljOmB0b2tvdXRgLGxhYmVsOmBUb2tlbnMgb3V0YCxjb2xvcjpgLS1jaGFydC10b2tlbnMtb3V0YH1dLGNvc3Q6W3ttZXRyaWM6YGNvc3RgLGxhYmVsOmBDb3N0IChVU0QpYCxjb2xvcjpgLS1jaGFydC1jb3N0YH1dfTtmdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGU9PT1gY29zdGA/dC8xZTY6dH1sZXQgcz1NKCgpPT57bGV0IGU9YVt0LnRhYl0sbj1uZXcgU2V0O2ZvcihsZXQgciBvZiBlKWZvcihsZXQgZSBvZiB0LnNlcmllc0J5TWV0cmljW3IubWV0cmljXT8/W10pbi5hZGQoZS5idWNrZXQpO3JldHVybiBBcnJheS5mcm9tKG4pLnNvcnQoKX0pLGM9TSgoKT0+cy52YWx1ZS5tYXAoZT0+X2UoZSx0LndpbmRvdykpKTtmdW5jdGlvbiBsKGUpe3JldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShlKS50cmltKCl9bGV0IHU9TSgoKT0+e24udmFsdWU7bGV0IGU9cy52YWx1ZTtyZXR1cm57bGFiZWxzOmMudmFsdWUsZGF0YXNldHM6YVt0LnRhYl0ubWFwKG49PntsZXQgcj1uZXcgTWFwKCh0LnNlcmllc0J5TWV0cmljW24ubWV0cmljXT8/W10pLm1hcChlPT5bZS5idWNrZXQsZS52YWx1ZV0pKTtyZXR1cm57bGFiZWw6bi5sYWJlbCxiYWNrZ3JvdW5kQ29sb3I6bChuLmNvbG9yKSxkYXRhOmUubWFwKGU9Pm8obi5tZXRyaWMsci5nZXQoZSk/PzApKX19KX19KSxkPU0oKCk9PmFbdC50YWJdLmxlbmd0aD4xKSxmPU0oKCk9Pih7cmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e3N0YWNrZWQ6ZC52YWx1ZSxncmlkOntjb2xvcjppLnZhbHVlLGRpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlfX0seTp7c3RhY2tlZDpkLnZhbHVlLGJlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmkudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQudGFiPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19fSxwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZC52YWx1ZSxsYWJlbHM6e2NvbG9yOm4udmFsdWV9fSx0b29sdGlwOntjYWxsYmFja3M6e2xhYmVsOmU9PntsZXQgbj1lLnBhcnNlZC55Pz8wO3JldHVybiB0LnRhYj09PWBjb3N0YD9gJHtlLmRhdGFzZXQubGFiZWx9OiAkJHtuLnRvRml4ZWQoNCl9YDpgJHtlLmRhdGFzZXQubGFiZWx9OiAke2tlKG4pfSAoJHtVZShuKX0pYH19fX19KSk7cmV0dXJuKGUsdCk9PihOKCksUChgZGl2YCxNcCxbTChiKGJwKSx7ZGF0YTp1LnZhbHVlLG9wdGlvbnM6Zi52YWx1ZX0sbnVsbCw4LFtgZGF0YWAsYG9wdGlvbnNgXSldKSl9fSksUHA9e2NsYXNzOmBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNgfSxGcD17a2V5OjAsY2xhc3M6YHRleHQtc20gdGV4dC1kZXN0cnVjdGl2ZWB9LElwPXtjbGFzczpgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxMcD1SKHtfX25hbWU6YENoYXJ0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXllKCksbj1rcCgpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT1QZSgpLG89TSgoKT0+e2xldCBlPXQudXNhZ2U/LnVzZXJzPz9bXSxyPXQudXNhZ2U/Lmdyb3Vwcz8/W10sbz1lLmZpbHRlcihlPT4hYS52YWx1ZXx8TmUoZSxpLnZhbHVlKXx8YHVzZXI6JHtlLmlkfWA9PT1uLnNjb3BlKS5tYXAoZT0+KHt2YWx1ZTpgdXNlcjoke2UuaWR9YCxsYWJlbDplLmlkfSkpLHM9ci5maWx0ZXIodD0+IWEudmFsdWV8fFZlKHQsZSxpLnZhbHVlKXx8YGdyb3VwOiR7dC5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YGdyb3VwOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSksYz0obi5tb2RlbE9wdGlvbnM/P1tdKS5maWx0ZXIoZT0+IWEudmFsdWV8fGUuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpLnZhbHVlKXx8YG1vZGVsOiR7ZS5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YG1vZGVsOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSk7cmV0dXJuIG4uc2NvcGUuc3RhcnRzV2l0aChgbW9kZWw6YCkmJiFjLnNvbWUoZT0+ZS52YWx1ZT09PW4uc2NvcGUpJiZjLnB1c2goe3ZhbHVlOm4uc2NvcGUsbGFiZWw6bi5zY29wZS5zbGljZSg2KX0pLFt7dmFsdWU6YHRvdGFsYCxsYWJlbDpgVG90YWwgKGFsbCB0cmFmZmljKWB9LC4uLnMsLi4ubywuLi5jXX0pLHM9W2Bob3VyYCxgZGF5YCxgbW9udGhgXSxjPVtgY29zdGAsYHJlcWAsYHRva2luYCxgdG9rb3V0YF0sbD1NKCgpPT5uLnRhYj09PWBtb2RlbHNgP2ByZXF1ZXN0c2A6bi50YWIpO2Z1bmN0aW9uIHUoZSl7bi5zZXRUYWIoZSl9ZnVuY3Rpb24gZChlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0U2NvcGUoZSl9ZnVuY3Rpb24gZihlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0TW9kZWxNZXRyaWMoZSl9cmV0dXJuIE1lKCgpPT57bi5yZWZyZXNoKCksbi5zdGFydEF1dG9SZWZyZXNoKCl9KSx3ZSgoKT0+e24uc3RvcEF1dG9SZWZyZXNoKCl9KSxWKG8sZT0+e2Uuc29tZShlPT5lLnZhbHVlPT09bi5zY29wZSl8fG4uc2V0U2NvcGUoYHRvdGFsYCl9KSwoZSx0KT0+KE4oKSxJKGIoR2UpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihTZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5gfSx7ZGVmYXVsdDpCKCgpPT5bTChiKENlKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsuLi50WzJdfHw9W2dlKGBVc2FnZSBjaGFydHNgLC0xKV1dKSxfOjF9KSxIZShgZGl2YCxQcCxbTChCZSx7bW9kZWxWYWx1ZTpiKHIpLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+RShyKT9yLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzLCBncm91cHMgb3IgbW9kZWxzYCxjbGFzczpgdy01NmB9LG51bGwsOCxbYG1vZGVsVmFsdWVgXSksYihuKS50YWI9PT1gbW9kZWxzYD8oTigpLEkoYihYaSkse2tleTowLCJtb2RlbC12YWx1ZSI6YihuKS5tb2RlbE1ldHJpYywib25VcGRhdGU6bW9kZWxWYWx1ZSI6Zn0se2RlZmF1bHQ6QigoKT0+W0woYihuYSkse2NsYXNzOmB3LTQwYCwiYXJpYS1sYWJlbCI6YFJhbmsgbW9kZWxzIGJ5YH0se2RlZmF1bHQ6QigoKT0+W0woYihyYSkse3BsYWNlaG9sZGVyOmBSYW5rIGJ5YH0pXSksXzoxfSksTChiKFppKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsoTigpLFAoayxudWxsLG1lKGMsZT0+TChiKCRpKSx7a2V5OmUsdmFsdWU6ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGIoU3ApW2VdKSwxKV0pLF86Mn0sMTAzMixbYHZhbHVlYF0pKSw2NCkpXSksXzoxfSldKSxfOjF9LDgsW2Btb2RlbC12YWx1ZWBdKSk6KE4oKSxJKGIoWGkpLHtrZXk6MSwibW9kZWwtdmFsdWUiOmIobikuc2NvcGUsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmR9LHtkZWZhdWx0OkIoKCk9PltMKGIobmEpLHtjbGFzczpgdy01NmB9LHtkZWZhdWx0OkIoKCk9PltMKGIocmEpLHtwbGFjZWhvbGRlcjpgU2NvcGVgfSldKSxfOjF9KSxMKGIoWmkpLG51bGwse2RlZmF1bHQ6QigoKT0+WyhOKCEwKSxQKGssbnVsbCxtZShvLnZhbHVlLGU9PihOKCksSShiKCRpKSx7a2V5OmUudmFsdWUsdmFsdWU6ZS52YWx1ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGUubGFiZWwpLDEpXSksXzoyfSwxMDMyLFtgdmFsdWVgXSkpKSwxMjgpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSkpLEwoYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS53aW5kb3csIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMV18fD1lPT5iKG4pLnNldFdpbmRvdyhlKX0se2RlZmF1bHQ6QigoKT0+W0woYihUZSksbnVsbCx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxQKGssbnVsbCxtZShzLGU9PkwoYihSZSkse2tleTplLHZhbHVlOmV9LHtkZWZhdWx0OkIoKCk9PltnZShjZShiKERwKVtlXSksMSldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSksNjQpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSldKV0pLF86MX0pLEwoYihwZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00YH0se2RlZmF1bHQ6QigoKT0+W0woYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS50YWIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnV9LHtkZWZhdWx0OkIoKCk9PltMKGIoVGUpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihSZSkse3ZhbHVlOmByZXF1ZXN0c2B9LHtkZWZhdWx0OkIoKCk9PlsuLi50WzNdfHw9W2dlKGBSZXF1ZXN0c2AsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmB0b2tlbnNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs0XXx8PVtnZShgVG9rZW5zYCwtMSldXSksXzoxfSksTChiKFJlKSx7dmFsdWU6YGNvc3RgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs1XXx8PVtnZShgQ29zdGAsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmBtb2RlbHNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs2XXx8PVtnZShgTW9kZWxzYCwtMSldXSksXzoxfSldKSxfOjF9KV0pLF86MX0sOCxbYG1vZGVsLXZhbHVlYF0pLGIobikuZXJyb3I/KE4oKSxQKGBwYCxGcCxjZShiKG4pLmVycm9yKSwxKSk6emUoYGAsITApLGIobikudGFiPT09YG1vZGVsc2A/KE4oKSxQKGsse2tleToxfSxbSGUoYHBgLElwLGAgTW9kZWxzIHdpdGggdXNhZ2UgaW4gdGhlIHNlbGVjdGVkIHdpbmRvdywgcmFua2VkIGJ5IGArY2UoYihTcClbYihuKS5tb2RlbE1ldHJpY10udG9Mb3dlckNhc2UoKSkrYC4gRWFjaCByb3cgaXMgdGhlIHByb3ZpZGVyIHRoYXQgc2VydmVkIHRoZSB0cmFmZmljLCBzbyBhIG1vZGVsIHJlYWNoZWQgdGhyb3VnaCBtb3JlIHRoYW4gb25lIHByb3ZpZGVyIGFwcGVhcnMgb25jZSBwZXIgcHJvdmlkZXIuIGAsMSksTChqcCx7bWV0cmljOmIobikubW9kZWxNZXRyaWMsbW9kZWxzOmIobikubW9kZWxSYW5raW5nfSxudWxsLDgsW2BtZXRyaWNgLGBtb2RlbHNgXSldLDY0KSk6KE4oKSxJKE5wLHtrZXk6Mix0YWI6bC52YWx1ZSx3aW5kb3c6YihuKS53aW5kb3csInNlcmllcy1ieS1tZXRyaWMiOmIobikuc2VyaWVzQnlNZXRyaWN9LG51bGwsOCxbYHRhYmAsYHdpbmRvd2AsYHNlcmllcy1ieS1tZXRyaWNgXSkpXSksXzoxfSldKSxfOjF9KSl9fSk7ZXhwb3J0e0xwIGFzIGRlZmF1bHR9Ow==", ), }, "index-CSkIItro.css": { @@ -52,10 +52,10 @@ var adminAssets = map[string]adminAsset{ "QGtleWZyYW1lcyBhdXRoZ2F0ZS1zaGFrZS00YmU2YmMwOXsxMCUsOTAle3RyYW5zZm9ybTp0cmFuc2xhdGUoLTFweCl9MjAlLDgwJXt0cmFuc2Zvcm06dHJhbnNsYXRlKDJweCl9MzAlLDUwJSw3MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNHB4KX00MCUsNjAle3RyYW5zZm9ybTp0cmFuc2xhdGUoNHB4KX19QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOm5vLXByZWZlcmVuY2Upey5hdXRoZ2F0ZS1zaGFrZVtkYXRhLXYtNGJlNmJjMDlde2FuaW1hdGlvbjouNHMgZWFzZS1pbi1vdXQgYXV0aGdhdGUtc2hha2UtNGJlNmJjMDl9fUBsYXllciBwcm9wZXJ0aWVze0BzdXBwb3J0cyAoKCgtd2Via2l0LWh5cGhlbnM6bm9uZSkpIGFuZCAobm90IChtYXJnaW4tdHJpbTppbmxpbmUpKSkgb3IgKCgtbW96LW9yaWVudDppbmxpbmUpIGFuZCAobm90IChjb2xvcjpyZ2IoZnJvbSByZWQgciBnIGIpKSkpezpyb290LDpob3N0ey0tc2hpbW1lci1hbmdsZToyMGRlZ30qLDpiZWZvcmUsOmFmdGVyLDo6YmFja2Ryb3B7LS10dy10cmFuc2xhdGUteDowOy0tdHctdHJhbnNsYXRlLXk6MDstLXR3LXRyYW5zbGF0ZS16OjA7LS10dy1yb3RhdGUteDppbml0aWFsOy0tdHctcm90YXRlLXk6aW5pdGlhbDstLXR3LXJvdGF0ZS16OmluaXRpYWw7LS10dy1za2V3LXg6aW5pdGlhbDstLXR3LXNrZXcteTppbml0aWFsOy0tdHctYm9yZGVyLXN0eWxlOnNvbGlkOy0tdHctbGVhZGluZzppbml0aWFsOy0tdHctZm9udC13ZWlnaHQ6aW5pdGlhbDstLXR3LXRyYWNraW5nOmluaXRpYWw7LS10dy1vcmRpbmFsOmluaXRpYWw7LS10dy1zbGFzaGVkLXplcm86aW5pdGlhbDstLXR3LW51bWVyaWMtZmlndXJlOmluaXRpYWw7LS10dy1udW1lcmljLXNwYWNpbmc6aW5pdGlhbDstLXR3LW51bWVyaWMtZnJhY3Rpb246aW5pdGlhbDstLXR3LXNoYWRvdzowIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3I6aW5pdGlhbDstLXR3LXNoYWRvdy1hbHBoYToxMDAlOy0tdHctaW5zZXQtc2hhZG93OjAgMCAjMDAwMDstLXR3LWluc2V0LXNoYWRvdy1jb2xvcjppbml0aWFsOy0tdHctaW5zZXQtc2hhZG93LWFscGhhOjEwMCU7LS10dy1yaW5nLWNvbG9yOmluaXRpYWw7LS10dy1yaW5nLXNoYWRvdzowIDAgIzAwMDA7LS10dy1pbnNldC1yaW5nLWNvbG9yOmluaXRpYWw7LS10dy1pbnNldC1yaW5nLXNoYWRvdzowIDAgIzAwMDA7LS10dy1yaW5nLWluc2V0OmluaXRpYWw7LS10dy1yaW5nLW9mZnNldC13aWR0aDowcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjojZmZmOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OjAgMCAjMDAwMDstLXR3LW91dGxpbmUtc3R5bGU6c29saWQ7LS10dy1ibHVyOmluaXRpYWw7LS10dy1icmlnaHRuZXNzOmluaXRpYWw7LS10dy1jb250cmFzdDppbml0aWFsOy0tdHctZ3JheXNjYWxlOmluaXRpYWw7LS10dy1odWUtcm90YXRlOmluaXRpYWw7LS10dy1pbnZlcnQ6aW5pdGlhbDstLXR3LW9wYWNpdHk6aW5pdGlhbDstLXR3LXNhdHVyYXRlOmluaXRpYWw7LS10dy1zZXBpYTppbml0aWFsOy0tdHctZHJvcC1zaGFkb3c6aW5pdGlhbDstLXR3LWRyb3Atc2hhZG93LWNvbG9yOmluaXRpYWw7LS10dy1kcm9wLXNoYWRvdy1hbHBoYToxMDAlOy0tdHctZHJvcC1zaGFkb3ctc2l6ZTppbml0aWFsOy0tdHctZHVyYXRpb246aW5pdGlhbDstLXR3LWNvbnRlbnQ6IiI7LS10dy1hbmltYXRpb24tZGVsYXk6MHM7LS10dy1hbmltYXRpb24tZGlyZWN0aW9uOm5vcm1hbDstLXR3LWFuaW1hdGlvbi1kdXJhdGlvbjppbml0aWFsOy0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZTpub25lOy0tdHctYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOy0tdHctZW50ZXItYmx1cjowOy0tdHctZW50ZXItb3BhY2l0eToxOy0tdHctZW50ZXItcm90YXRlOjA7LS10dy1lbnRlci1zY2FsZToxOy0tdHctZW50ZXItdHJhbnNsYXRlLXg6MDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OjA7LS10dy1leGl0LWJsdXI6MDstLXR3LWV4aXQtb3BhY2l0eToxOy0tdHctZXhpdC1yb3RhdGU6MDstLXR3LWV4aXQtc2NhbGU6MTstLXR3LWV4aXQtdHJhbnNsYXRlLXg6MDstLXR3LWV4aXQtdHJhbnNsYXRlLXk6MDstLXNjcm9sbC1mYWRlLXQ6MDstLXNjcm9sbC1mYWRlLWI6MDstLXNjcm9sbC1mYWRlLXM6MDstLXNjcm9sbC1mYWRlLWU6MDstLXNjcm9sbC1mYWRlLW1hc2s6aW5pdGlhbDstLXNoaW1tZXItaW1hZ2U6aW5pdGlhbDstLXNoaW1tZXItdGV4dC1maWxsOmluaXRpYWx9fX1AbGF5ZXIgdGhlbWV7OnJvb3QsOmhvc3R7LS1mb250LXNhbnM6dWktc2Fucy1zZXJpZiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCAiU2Vnb2UgVUkiLCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIEFyaWFsLCBzYW5zLXNlcmlmOy0tc3BhY2luZzouMjVyZW07LS1jb250YWluZXIteHM6MjByZW07LS1jb250YWluZXItc206MjRyZW07LS1jb250YWluZXItbWQ6MjhyZW07LS10ZXh0LXhzOi43NXJlbTstLXRleHQteHMtLWxpbmUtaGVpZ2h0OmNhbGMoMSAvIC43NSk7LS10ZXh0LXNtOi44NzVyZW07LS10ZXh0LXNtLS1saW5lLWhlaWdodDpjYWxjKDEuMjUgLyAuODc1KTstLXRleHQtYmFzZToxcmVtOy0tdGV4dC1iYXNlLS1saW5lLWhlaWdodDpjYWxjKDEuNSAvIDEpOy0tdGV4dC1sZzoxLjEyNXJlbTstLXRleHQtbGctLWxpbmUtaGVpZ2h0OmNhbGMoMS43NSAvIDEuMTI1KTstLXRleHQteGw6MS4yNXJlbTstLXRleHQteGwtLWxpbmUtaGVpZ2h0OmNhbGMoMS43NSAvIDEuMjUpOy0tZm9udC13ZWlnaHQtbm9ybWFsOjQwMDstLWZvbnQtd2VpZ2h0LW1lZGl1bTo1MDA7LS1mb250LXdlaWdodC1zZW1pYm9sZDo2MDA7LS10cmFja2luZy10aWdodDotLjAyNWVtOy0tbGVhZGluZy1zbnVnOjEuMzc1Oy0tcmFkaXVzLW1kOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCk7LS1yYWRpdXMtNHhsOjJyZW07LS1kZWZhdWx0LXRyYW5zaXRpb24tZHVyYXRpb246LjE1czstLWRlZmF1bHQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LCAwLCAuMiwgMSk7LS1kZWZhdWx0LWZvbnQtZmFtaWx5OnVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgIlNlZ29lIFVJIiwgUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBBcmlhbCwgc2Fucy1zZXJpZjstLWRlZmF1bHQtbW9uby1mb250LWZhbWlseTp1aS1tb25vc3BhY2UsICJTRiBNb25vIiwgIkNhc2NhZGlhIENvZGUiLCAiUm9ib3RvIE1vbm8iLCBDb25zb2xhcywgbW9ub3NwYWNlfX1AbGF5ZXIgYmFzZXsqLDphZnRlciw6YmVmb3JlLDo6YmFja2Ryb3B7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlcjowIHNvbGlkO21hcmdpbjowO3BhZGRpbmc6MH06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXI6MCBzb2xpZDttYXJnaW46MDtwYWRkaW5nOjB9aHRtbCw6aG9zdHstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTt0YWItc2l6ZTo0O2xpbmUtaGVpZ2h0OjEuNTtmb250LWZhbWlseTp2YXIoLS1kZWZhdWx0LWZvbnQtZmFtaWx5LC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCAiTm90byBTYW5zIiwgQXJpYWwsIHNhbnMtc2VyaWYsICJBcHBsZSBDb2xvciBFbW9qaSIsICJTZWdvZSBVSSBFbW9qaSIsICJTZWdvZSBVSSBTeW1ib2wiLCAiTm90byBDb2xvciBFbW9qaSIpO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczp2YXIoLS1kZWZhdWx0LWZvbnQtZmVhdHVyZS1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOnZhcigtLWRlZmF1bHQtZm9udC12YXJpYXRpb24tc2V0dGluZ3Msbm9ybWFsKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246aW5oZXJpdDstd2Via2l0LXRleHQtZGVjb3JhdGlvbjppbmhlcml0Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcCxwcmV7Zm9udC1mYW1pbHk6dmFyKC0tZGVmYXVsdC1tb25vLWZvbnQtZmFtaWx5LHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlKTtmb250LWZlYXR1cmUtc2V0dGluZ3M6dmFyKC0tZGVmYXVsdC1tb25vLWZvbnQtZmVhdHVyZS1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOnZhcigtLWRlZmF1bHQtbW9uby1mb250LXZhcmlhdGlvbi1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtc2l6ZToxZW19c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZX1zdWJ7Ym90dG9tOi0uMjVlbX1zdXB7dG9wOi0uNWVtfXRhYmxle3RleHQtaW5kZW50OjA7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfTotbW96LWZvY3VzcmluZzp3aGVyZSg6bm90KGlmcmFtZSkpe291dGxpbmU6YXV0b31wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lfWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7dmVydGljYWwtYWxpZ246bWlkZGxlO2Rpc3BsYXk6YmxvY2t9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfWJ1dHRvbixpbnB1dCxzZWxlY3Qsb3B0Z3JvdXAsdGV4dGFyZWF7Zm9udDppbmhlcml0O2ZvbnQtZmVhdHVyZS1zZXR0aW5nczppbmhlcml0O2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOmluaGVyaXQ7bGV0dGVyLXNwYWNpbmc6aW5oZXJpdDtjb2xvcjppbmhlcml0O29wYWNpdHk6MTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwO2JvcmRlci1yYWRpdXM6MH06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQ6aW5oZXJpdDtmb250LWZlYXR1cmUtc2V0dGluZ3M6aW5oZXJpdDtmb250LXZhcmlhdGlvbi1zZXR0aW5nczppbmhlcml0O2xldHRlci1zcGFjaW5nOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtvcGFjaXR5OjE7YmFja2dyb3VuZC1jb2xvcjojMDAwMDtib3JkZXItcmFkaXVzOjB9OndoZXJlKHNlbGVjdDppcyhbbXVsdGlwbGVdLFtzaXplXSkpIG9wdGdyb3Vwe2ZvbnQtd2VpZ2h0OmJvbGRlcn06d2hlcmUoc2VsZWN0OmlzKFttdWx0aXBsZV0sW3NpemVdKSkgb3B0Z3JvdXAgb3B0aW9ue3BhZGRpbmctaW5saW5lLXN0YXJ0OjIwcHh9OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbnttYXJnaW4taW5saW5lLWVuZDo0cHh9OjpwbGFjZWhvbGRlcntvcGFjaXR5OjF9QHN1cHBvcnRzIChub3QgKCgtd2Via2l0LWFwcGVhcmFuY2U6LWFwcGxlLXBheS1idXR0b24pKSkgb3IgKGNvbnRhaW4taW50cmluc2ljLXNpemU6MXB4KXs6OnBsYWNlaG9sZGVye2NvbG9yOmN1cnJlbnRDb2xvcn1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7OjpwbGFjZWhvbGRlcntjb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIGN1cnJlbnRjb2xvciA1MCUsIHRyYW5zcGFyZW50KX19fXRleHRhcmVhe3Jlc2l6ZTp2ZXJ0aWNhbH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWRhdGUtYW5kLXRpbWUtdmFsdWV7bWluLWhlaWdodDoxbGg7dGV4dC1hbGlnbjppbmhlcml0fTo6LXdlYmtpdC1kYXRldGltZS1lZGl0e2Rpc3BsYXk6aW5saW5lLWZsZXh9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtZmllbGRzLXdyYXBwZXJ7cGFkZGluZzowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0e3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC15ZWFyLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1tb250aC1maWVsZHtwYWRkaW5nLWJsb2NrOjB9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtZGF5LWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1ob3VyLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1taW51dGUtZmllbGR7cGFkZGluZy1ibG9jazowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0LXNlY29uZC1maWVsZHtwYWRkaW5nLWJsb2NrOjB9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtbWlsbGlzZWNvbmQtZmllbGR7cGFkZGluZy1ibG9jazowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0LW1lcmlkaWVtLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcntsaW5lLWhlaWdodDoxfTotbW96LXVpLWludmFsaWR7Ym94LXNoYWRvdzpub25lfWJ1dHRvbixpbnB1dDp3aGVyZShbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdKXthcHBlYXJhbmNlOmJ1dHRvbn06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2FwcGVhcmFuY2U6YnV0dG9ufTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b306Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W2hpZGRlbl06d2hlcmUoOm5vdChbaGlkZGVuPXVudGlsLWZvdW5kXSkpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9Kntib3JkZXItY29sb3I6dmFyKC0tYm9yZGVyKTtvdXRsaW5lLWNvbG9yOnZhcigtLXJpbmcpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsqe291dGxpbmUtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1yaW5nKSA1MCUsIHRyYW5zcGFyZW50KX19Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhY2tncm91bmQpO2NvbG9yOnZhcigtLWZvcmVncm91bmQpO2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtcztmb250LWZhbWlseTp1aS1zYW5zLXNlcmlmLHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxIZWx2ZXRpY2EgTmV1ZSxBcmlhbCxzYW5zLXNlcmlmfX1AbGF5ZXIgY29tcG9uZW50cztAbGF5ZXIgdXRpbGl0aWVzey5cQGNvbnRhaW5lclwvY2FyZC1oZWFkZXJ7Y29udGFpbmVyOmNhcmQtaGVhZGVyL2lubGluZS1zaXplfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmNvbGxhcHNle3Zpc2liaWxpdHk6Y29sbGFwc2V9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LnNyLW9ubHl7Y2xpcC1wYXRoOmluc2V0KDUwJSk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW59LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5maXhlZHtwb3NpdGlvbjpmaXhlZH0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LnRvcC0xXC8ye3RvcDo1MCV9LnRvcC0ye3RvcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9LnJpZ2h0LTF7cmlnaHQ6dmFyKC0tc3BhY2luZyl9LnJpZ2h0LTFcLjV7cmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEuNSl9LnJpZ2h0LTJ7cmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5sZWZ0LTJcLjV7bGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0uei0xMHt6LWluZGV4OjEwfS56LTUwe3otaW5kZXg6NTB9LmNvbC1zdGFydC0ye2dyaWQtY29sdW1uLXN0YXJ0OjJ9LnJvdy1zcGFuLTJ7Z3JpZC1yb3c6c3BhbiAyL3NwYW4gMn0ucm93LXN0YXJ0LTF7Z3JpZC1yb3ctc3RhcnQ6MX0uLW14LTF7bWFyZ2luLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpfS4tbXgtMVwuNXttYXJnaW4taW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAtMS41KX0ubXgtYXV0b3ttYXJnaW4taW5saW5lOmF1dG99Lm15LTF7bWFyZ2luLWJsb2NrOnZhcigtLXNwYWNpbmcpfS5tdC0wXC41e21hcmdpbi10b3A6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KX0ubXQtMnttYXJnaW4tdG9wOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ubXQtNHttYXJnaW4tdG9wOmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0ubWItMVwuNXttYXJnaW4tYm90dG9tOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5tYi0ze21hcmdpbi1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mbGV4e2Rpc3BsYXk6ZmxleH0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0udGFibGUtY2FwdGlvbntkaXNwbGF5OnRhYmxlLWNhcHRpb259LnRhYmxlLWNlbGx7ZGlzcGxheTp0YWJsZS1jZWxsfS50YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3d9LnNpemUtMlwuNXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnNpemUtM3t3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMyk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAzKX0uc2l6ZS0zXC41e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAzLjUpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMy41KX0uc2l6ZS00e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA0KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5zaXplLTV7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDUpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNSl9LnNpemUtNnt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNik7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA2KX0uc2l6ZS03e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA3KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5zaXplLTh7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LnNpemUtOXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogOSk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA5KX0uc2l6ZS0xMnt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMTIpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMTIpfS5oLTV7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA1KX0uaC02e2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNil9LmgtN3toZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5oLTh7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA4KX0uaC05e2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOSl9LmgtMTB7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxMCl9LmgtNzJ7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA3Mil9LmgtXFtjYWxjXCgxMDBcJS0xcHhcKVxde2hlaWdodDpjYWxjKDEwMCUgLSAxcHgpfS5oLXB4e2hlaWdodDoxcHh9Lm1heC1oLVwoLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHRcKXttYXgtaGVpZ2h0OnZhcigtLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCl9Lm1pbi1oLVxbNzB2aFxde21pbi1oZWlnaHQ6NzB2aH0udy00MHt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNDApfS53LTU2e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA1Nil9LnctZml0e3dpZHRoOmZpdC1jb250ZW50fS53LWZ1bGx7d2lkdGg6MTAwJX0ubWF4LXctbWR7bWF4LXdpZHRoOnZhcigtLWNvbnRhaW5lci1tZCl9Lm1heC13LXNte21heC13aWR0aDp2YXIoLS1jb250YWluZXItc20pfS5tYXgtdy14c3ttYXgtd2lkdGg6dmFyKC0tY29udGFpbmVyLXhzKX0ubWluLXctMHttaW4td2lkdGg6MH0ubWluLXctMzZ7bWluLXdpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAzNil9LmZsZXgtMXtmbGV4OjF9LnNocmluay0we2ZsZXgtc2hyaW5rOjB9Lmdyb3d7ZmxleC1ncm93OjF9LmNhcHRpb24tYm90dG9te2NhcHRpb24tc2lkZTpib3R0b219Lm9yaWdpbi1cKC0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luXCl7dHJhbnNmb3JtLW9yaWdpbjp2YXIoLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pfS4tdHJhbnNsYXRlLXktMVwvMnstLXR3LXRyYW5zbGF0ZS15OmNhbGMoY2FsYygxIC8gMiAqIDEwMCUpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnZhcigtLXR3LXJvdGF0ZS14LCkgdmFyKC0tdHctcm90YXRlLXksKSB2YXIoLS10dy1yb3RhdGUteiwpIHZhcigtLXR3LXNrZXcteCwpIHZhcigtLXR3LXNrZXcteSwpfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLXBvaW50ZXJ7Y3Vyc29yOnBvaW50ZXJ9LnNjcm9sbC1teS0xe3Njcm9sbC1tYXJnaW4tYmxvY2s6dmFyKC0tc3BhY2luZyl9LmF1dG8tcm93cy1taW57Z3JpZC1hdXRvLXJvd3M6bWluLWNvbnRlbnR9LmdyaWQtY29scy0ye2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMixtaW5tYXgoMCwxZnIpKX0uZmxleC1jb2x7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LXdyYXB7ZmxleC13cmFwOndyYXB9Lml0ZW1zLWNlbnRlcnthbGlnbi1pdGVtczpjZW50ZXJ9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uanVzdGlmeS1jZW50ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uZ2FwLTBcLjV7Z2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAuNSl9LmdhcC0xe2dhcDp2YXIoLS1zcGFjaW5nKX0uZ2FwLTFcLjV7Z2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5nYXAtMntnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5nYXAtM3tnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5nYXAtNHtnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5nYXAtNntnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfS5nYXAteC0ze2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5nYXAteC00e2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5nYXAteC02e2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfS5nYXAteS0xe3Jvdy1nYXA6dmFyKC0tc3BhY2luZyl9LmdhcC15LTFcLjV7cm93LWdhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMS41KX0uc2VsZi1zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnR9Lmp1c3RpZnktc2VsZi1lbmR7anVzdGlmeS1zZWxmOmZsZXgtZW5kfS50cnVuY2F0ZXt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LXgtYXV0b3tvdmVyZmxvdy14OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LWF1dG97b3ZlcmZsb3cteTphdXRvfS5yb3VuZGVke2JvcmRlci1yYWRpdXM6LjI1cmVtfS5yb3VuZGVkLTR4bHtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cy00eGwpfS5yb3VuZGVkLVxbbWluXCh2YXJcKC0tcmFkaXVzLW1kXClcLDEwcHhcKVxde2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEwcHgpfS5yb3VuZGVkLVxbbWluXCh2YXJcKC0tcmFkaXVzLW1kXClcLDEycHhcKVxde2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEycHgpfS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czoyMTQ3NDgzNjQ3cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC14bHtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCl9LnJvdW5kZWQtdC14bHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpICsgNHB4KX0ucm91bmRlZC1iLXhse2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpfS5ib3JkZXJ7Ym9yZGVyLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOjFweH0uYm9yZGVyLXR7Ym9yZGVyLXRvcC1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci10b3Atd2lkdGg6MXB4fS5ib3JkZXItYntib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ib3JkZXJ7Ym9yZGVyLWNvbG9yOnZhcigtLWJvcmRlcil9LmJvcmRlci1pbnB1dHtib3JkZXItY29sb3I6dmFyKC0taW5wdXQpfS5ib3JkZXItc3RhdHVzLXdhcm5cLzQwe2JvcmRlci1jb2xvcjp2YXIoLS1zdGF0dXMtd2Fybil9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5ib3JkZXItc3RhdHVzLXdhcm5cLzQwe2JvcmRlci1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXN0YXR1cy13YXJuKSA0MCUsIHRyYW5zcGFyZW50KX19LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6IzAwMDB9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1iYWNrZ3JvdW5kKX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tYm9yZGVyKX0uYmctY2FyZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNhcmQpfS5iZy1kZXN0cnVjdGl2ZVwvMTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5iZy1kZXN0cnVjdGl2ZVwvMTB7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSAxMCUsIHRyYW5zcGFyZW50KX19LmJnLW11dGVkLC5iZy1tdXRlZFwvNTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tdXRlZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5iZy1tdXRlZFwvNTB7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLW11dGVkKSA1MCUsIHRyYW5zcGFyZW50KX19LmJnLXBvcG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wb3BvdmVyKX0uYmctcHJpbWFyeSwuYmctcHJpbWFyeVwvMTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wcmltYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmJnLXByaW1hcnlcLzEwe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1wcmltYXJ5KSAxMCUsIHRyYW5zcGFyZW50KX19LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXNlY29uZGFyeSl9LmJnLXRyYW5zcGFyZW50e2JhY2tncm91bmQtY29sb3I6IzAwMDB9LmJnLWNsaXAtcGFkZGluZ3tiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3h9LnAtMFwuNzV7cGFkZGluZzpjYWxjKHZhcigtLXNwYWNpbmcpICogLjc1KX0ucC0xe3BhZGRpbmc6dmFyKC0tc3BhY2luZyl9LnAtMntwYWRkaW5nOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ucC00e3BhZGRpbmc6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5weC0xXC41e3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5weC0ye3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ucHgtMlwuNXtwYWRkaW5nLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0ucHgtM3twYWRkaW5nLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9LnB4LTR7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5weS0wXC41e3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KX0ucHktMXtwYWRkaW5nLWJsb2NrOnZhcigtLXNwYWNpbmcpfS5weS0ye3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5weS0yXC41e3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnB5LTR7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9LnB5LTZ7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogNil9LnB5LTh7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LnB5LTEwe3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEwKX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wci0ye3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5wci04e3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS5wci0xMHtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxMCl9LnBiLTJcLjV7cGFkZGluZy1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnBsLTFcLjV7cGFkZGluZy1sZWZ0OmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5wbC0yXC41e3BhZGRpbmctbGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0ucGwtOHtwYWRkaW5nLWxlZnQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS5hbGlnbi1taWRkbGV7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mb250LW1vbm97Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLFNGIE1vbm8sQ2FzY2FkaWEgQ29kZSxSb2JvdG8gTW9ubyxDb25zb2xhcyxtb25vc3BhY2V9LnRleHQtYmFzZXtmb250LXNpemU6dmFyKC0tdGV4dC1iYXNlKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtYmFzZS0tbGluZS1oZWlnaHQpKX0udGV4dC1sZ3tmb250LXNpemU6dmFyKC0tdGV4dC1sZyk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LWxnLS1saW5lLWhlaWdodCkpfS50ZXh0LXNte2ZvbnQtc2l6ZTp2YXIoLS10ZXh0LXNtKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtc20tLWxpbmUtaGVpZ2h0KSl9LnRleHQteGx7Zm9udC1zaXplOnZhcigtLXRleHQteGwpO2xpbmUtaGVpZ2h0OnZhcigtLXR3LWxlYWRpbmcsdmFyKC0tdGV4dC14bC0tbGluZS1oZWlnaHQpKX0udGV4dC14c3tmb250LXNpemU6dmFyKC0tdGV4dC14cyk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LXhzLS1saW5lLWhlaWdodCkpfS50ZXh0LVxbMFwuOHJlbVxde2ZvbnQtc2l6ZTouOHJlbX0ubGVhZGluZy1zbnVney0tdHctbGVhZGluZzp2YXIoLS1sZWFkaW5nLXNudWcpO2xpbmUtaGVpZ2h0OnZhcigtLWxlYWRpbmctc251Zyl9LmZvbnQtbWVkaXVtey0tdHctZm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbWVkaXVtKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1tZWRpdW0pfS5mb250LW5vcm1hbHstLXR3LWZvbnQtd2VpZ2h0OnZhcigtLWZvbnQtd2VpZ2h0LW5vcm1hbCk7Zm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbm9ybWFsKX0uZm9udC1zZW1pYm9sZHstLXR3LWZvbnQtd2VpZ2h0OnZhcigtLWZvbnQtd2VpZ2h0LXNlbWlib2xkKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1zZW1pYm9sZCl9LnRyYWNraW5nLXRpZ2h0ey0tdHctdHJhY2tpbmc6dmFyKC0tdHJhY2tpbmctdGlnaHQpO2xldHRlci1zcGFjaW5nOnZhcigtLXRyYWNraW5nLXRpZ2h0KX0udGV4dC1iYWxhbmNle3RleHQtd3JhcDpiYWxhbmNlfS5icmVhay1hbGx7d29yZC1icmVhazpicmVhay1hbGx9LndoaXRlc3BhY2Utbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0udGV4dC1jYXJkLWZvcmVncm91bmR7Y29sb3I6dmFyKC0tY2FyZC1mb3JlZ3JvdW5kKX0udGV4dC1jaGFydC1yZXF1ZXN0c3tjb2xvcjp2YXIoLS1jaGFydC1yZXF1ZXN0cyl9LnRleHQtZGVzdHJ1Y3RpdmV7Y29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfS50ZXh0LWZvcmVncm91bmQsLnRleHQtZm9yZWdyb3VuZFwvNjB7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey50ZXh0LWZvcmVncm91bmRcLzYwe2NvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZm9yZWdyb3VuZCkgNjAlLCB0cmFuc3BhcmVudCl9fS50ZXh0LW11dGVkLWZvcmVncm91bmQsLnRleHQtbXV0ZWQtZm9yZWdyb3VuZFwvNjB7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey50ZXh0LW11dGVkLWZvcmVncm91bmRcLzYwe2NvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkgNjAlLCB0cmFuc3BhcmVudCl9fS50ZXh0LXBvcG92ZXItZm9yZWdyb3VuZHtjb2xvcjp2YXIoLS1wb3BvdmVyLWZvcmVncm91bmQpfS50ZXh0LXByaW1hcnl7Y29sb3I6dmFyKC0tcHJpbWFyeSl9LnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5ke2NvbG9yOnZhcigtLXByaW1hcnktZm9yZWdyb3VuZCl9LnRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmR7Y29sb3I6dmFyKC0tc2Vjb25kYXJ5LWZvcmVncm91bmQpfS50ZXh0LXN0YXR1cy13YXJue2NvbG9yOnZhcigtLXN0YXR1cy13YXJuKX0ubG93ZXJjYXNle3RleHQtdHJhbnNmb3JtOmxvd2VyY2FzZX0udGFidWxhci1udW1zey0tdHctbnVtZXJpYy1zcGFjaW5nOnRhYnVsYXItbnVtcztmb250LXZhcmlhbnQtbnVtZXJpYzp2YXIoLS10dy1vcmRpbmFsLCkgdmFyKC0tdHctc2xhc2hlZC16ZXJvLCkgdmFyKC0tdHctbnVtZXJpYy1maWd1cmUsKSB2YXIoLS10dy1udW1lcmljLXNwYWNpbmcsKSB2YXIoLS10dy1udW1lcmljLWZyYWN0aW9uLCl9LnVuZGVybGluZS1vZmZzZXQtNHt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NHB4fS5zaGFkb3ctbWR7LS10dy1zaGFkb3c6MCA0cHggNnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yLCMwMDAwMDAxYSksIDAgMnB4IDRweCAtMnB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciwjMDAwMDAwMWEpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LnJpbmcsLnJpbmctMXstLXR3LXJpbmctc2hhZG93OnZhcigtLXR3LXJpbmctaW5zZXQsKSAwIDAgMCBjYWxjKDFweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcixjdXJyZW50Y29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LnJpbmctZm9yZWdyb3VuZFwvMTB7LS10dy1yaW5nLWNvbG9yOnZhcigtLWZvcmVncm91bmQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsucmluZy1mb3JlZ3JvdW5kXC8xMHstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mb3JlZ3JvdW5kKSAxMCUsIHRyYW5zcGFyZW50KX19Lm91dGxpbmUtaGlkZGVuey0tdHctb3V0bGluZS1zdHlsZTpub25lO291dGxpbmUtc3R5bGU6bm9uZX1AbWVkaWEgKGZvcmNlZC1jb2xvcnM6YWN0aXZlKXsub3V0bGluZS1oaWRkZW57b3V0bGluZS1vZmZzZXQ6MnB4O291dGxpbmU6MnB4IHNvbGlkICMwMDAwfX0ub3V0bGluZXtvdXRsaW5lLXN0eWxlOnZhcigtLXR3LW91dGxpbmUtc3R5bGUpO291dGxpbmUtd2lkdGg6MXB4fS5maWx0ZXJ7ZmlsdGVyOnZhcigtLXR3LWJsdXIsKSB2YXIoLS10dy1icmlnaHRuZXNzLCkgdmFyKC0tdHctY29udHJhc3QsKSB2YXIoLS10dy1ncmF5c2NhbGUsKSB2YXIoLS10dy1odWUtcm90YXRlLCkgdmFyKC0tdHctaW52ZXJ0LCkgdmFyKC0tdHctc2F0dXJhdGUsKSB2YXIoLS10dy1zZXBpYSwpIHZhcigtLXR3LWRyb3Atc2hhZG93LCl9LnRyYW5zaXRpb257dHJhbnNpdGlvbi1wcm9wZXJ0eTpjb2xvcixiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcixvdXRsaW5lLWNvbG9yLHRleHQtZGVjb3JhdGlvbi1jb2xvcixmaWxsLHN0cm9rZSwtLXR3LWdyYWRpZW50LWZyb20sLS10dy1ncmFkaWVudC12aWEsLS10dy1ncmFkaWVudC10byxvcGFjaXR5LGJveC1zaGFkb3csdHJhbnNmb3JtLHRyYW5zbGF0ZSxzY2FsZSxyb3RhdGUsZmlsdGVyLC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyLGJhY2tkcm9wLWZpbHRlcixkaXNwbGF5LGNvbnRlbnQtdmlzaWJpbGl0eSxvdmVybGF5LHBvaW50ZXItZXZlbnRzO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLXR3LWVhc2UsdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikpO3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tdHctZHVyYXRpb24sdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLWR1cmF0aW9uKSl9LnRyYW5zaXRpb24tYWxse3RyYW5zaXRpb24tcHJvcGVydHk6YWxsO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLXR3LWVhc2UsdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikpO3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tdHctZHVyYXRpb24sdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLWR1cmF0aW9uKSl9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3Isb3V0bGluZS1jb2xvcix0ZXh0LWRlY29yYXRpb24tY29sb3IsZmlsbCxzdHJva2UsLS10dy1ncmFkaWVudC1mcm9tLC0tdHctZ3JhZGllbnQtdmlhLC0tdHctZ3JhZGllbnQtdG87dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246dmFyKC0tdHctZWFzZSx2YXIoLS1kZWZhdWx0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKSk7dHJhbnNpdGlvbi1kdXJhdGlvbjp2YXIoLS10dy1kdXJhdGlvbix2YXIoLS1kZWZhdWx0LXRyYW5zaXRpb24tZHVyYXRpb24pKX0uZHVyYXRpb24tMTAwey0tdHctZHVyYXRpb246LjFzO3RyYW5zaXRpb24tZHVyYXRpb246LjFzfS5vdXRsaW5lLW5vbmV7LS10dy1vdXRsaW5lLXN0eWxlOm5vbmU7b3V0bGluZS1zdHlsZTpub25lfS5zZWxlY3Qtbm9uZXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uc2VsZWN0LXRleHR7LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHR9LnJ1bm5pbmd7YW5pbWF0aW9uLXBsYXktc3RhdGU6cnVubmluZ30ubm90LWxhc3RcOmJvcmRlci1iOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ncm91cC1oYXMtXFtcPnN2Z1xdXC9hbGVydFw6Y29sLXN0YXJ0LTI6aXMoOndoZXJlKC5ncm91cFwvYWxlcnQpOmhhcyg+c3ZnKSAqKXtncmlkLWNvbHVtbi1zdGFydDoyfS5ncm91cC1hcmlhLWV4cGFuZGVkXC9hY2NvcmRpb24tdHJpZ2dlclw6aGlkZGVuOmlzKDp3aGVyZSguZ3JvdXBcL2FjY29yZGlvbi10cmlnZ2VyKVthcmlhLWV4cGFuZGVkPXRydWVdICope2Rpc3BsYXk6bm9uZX0uZ3JvdXAtYXJpYS1leHBhbmRlZFwvYWNjb3JkaW9uLXRyaWdnZXJcOmlubGluZTppcyg6d2hlcmUoLmdyb3VwXC9hY2NvcmRpb24tdHJpZ2dlcilbYXJpYS1leHBhbmRlZD10cnVlXSAqKXtkaXNwbGF5OmlubGluZX0uZ3JvdXAtZGF0YS1cW3NpemVcPXNtXF1cL2NhcmRcOnAtMzppcyg6d2hlcmUoLmdyb3VwXC9jYXJkKVtkYXRhLXNpemU9c21dICope3BhZGRpbmc6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5ncm91cC1kYXRhLVxbc2l6ZVw9c21cXVwvY2FyZFw6cHgtMzppcyg6d2hlcmUoLmdyb3VwXC9jYXJkKVtkYXRhLXNpemU9c21dICope3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAzKX0uZ3JvdXAtZGF0YS1cW3NpemVcPXNtXF1cL2NhcmRcOnRleHQtc206aXMoOndoZXJlKC5ncm91cFwvY2FyZClbZGF0YS1zaXplPXNtXSAqKXtmb250LXNpemU6dmFyKC0tdGV4dC1zbSk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LXNtLS1saW5lLWhlaWdodCkpfS5ncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICope2JhY2tncm91bmQtY29sb3I6IzAwMDB9Lmdyb3VwLWRhdGEtaG9yaXpvbnRhbFwvdGFic1w6aC04OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKSAqKXtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDpoLWZpdDppcyg6d2hlcmUoLmdyb3VwXC90YWJzKTp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pICope2hlaWdodDpmaXQtY29udGVudH0uZ3JvdXAtZGF0YS12ZXJ0aWNhbFwvdGFic1w6dy1mdWxsOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgKil7d2lkdGg6MTAwJX0uZ3JvdXAtZGF0YS12ZXJ0aWNhbFwvdGFic1w6ZmxleC1jb2w6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lmdyb3VwLWRhdGEtdmVydGljYWxcL3RhYnNcOmp1c3RpZnktc3RhcnQ6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uZmlsZVw6aW5saW5lLWZsZXg6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXh9LmZpbGVcOmgtNjo6ZmlsZS1zZWxlY3Rvci1idXR0b257aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA2KX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDowfS5maWxlXDpiZy10cmFuc3BhcmVudDo6ZmlsZS1zZWxlY3Rvci1idXR0b257YmFja2dyb3VuZC1jb2xvcjojMDAwMH0uZmlsZVw6dGV4dC1zbTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC1zaXplOnZhcigtLXRleHQtc20pO2xpbmUtaGVpZ2h0OnZhcigtLXR3LWxlYWRpbmcsdmFyKC0tdGV4dC1zbS0tbGluZS1oZWlnaHQpKX0uZmlsZVw6Zm9udC1tZWRpdW06OmZpbGUtc2VsZWN0b3ItYnV0dG9uey0tdHctZm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbWVkaXVtKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1tZWRpdW0pfS5maWxlXDp0ZXh0LWZvcmVncm91bmQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2NvbG9yOnZhcigtLWZvcmVncm91bmQpfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjpwbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKX0uYWZ0ZXJcOmFic29sdXRlOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7cG9zaXRpb246YWJzb2x1dGV9LmFmdGVyXDpiZy1mb3JlZ3JvdW5kOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mb3JlZ3JvdW5kKX0uYWZ0ZXJcOm9wYWNpdHktMDphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO29wYWNpdHk6MH0uYWZ0ZXJcOnRyYW5zaXRpb24tb3BhY2l0eTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjp2YXIoLS10dy1lYXNlLHZhcigtLWRlZmF1bHQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24pKTt0cmFuc2l0aW9uLWR1cmF0aW9uOnZhcigtLXR3LWR1cmF0aW9uLHZhcigtLWRlZmF1bHQtdHJhbnNpdGlvbi1kdXJhdGlvbikpfS5ncm91cC1kYXRhLWhvcml6b250YWxcL3RhYnNcOmFmdGVyXDppbnNldC14LTA6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pICopOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7aW5zZXQtaW5saW5lOjB9Lmdyb3VwLWRhdGEtaG9yaXpvbnRhbFwvdGFic1w6YWZ0ZXJcOmJvdHRvbS1cWy01cHhcXTppcyg6d2hlcmUoLmdyb3VwXC90YWJzKTp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSkgKik6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtib3R0b206LTVweH0uZ3JvdXAtZGF0YS1ob3Jpem9udGFsXC90YWJzXDphZnRlclw6aC0wXC41OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogLjUpfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDphZnRlclw6aW5zZXQteS0wOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgKik6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtpbnNldC1ibG9jazowfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDphZnRlclw6LXJpZ2h0LTE6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3JpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAtMSl9Lmdyb3VwLWRhdGEtdmVydGljYWxcL3RhYnNcOmFmdGVyXDp3LTBcLjU6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAuNSl9QG1lZGlhIChob3Zlcjpob3Zlcil7LmhvdmVyXDpiZy1hY2NlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1hY2NlbnQpfS5ob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzIwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLWRlc3RydWN0aXZlXC8yMDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDIwJSwgdHJhbnNwYXJlbnQpfX0uaG92ZXJcOmJnLW11dGVkOmhvdmVyLC5ob3Zlclw6YmctbXV0ZWRcLzUwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbXV0ZWQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLW11dGVkXC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tbXV0ZWQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zZWNvbmRhcnkpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXNlY29uZGFyeSkgODAlLCB0cmFuc3BhcmVudCl9fS5ob3Zlclw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpob3Zlcntjb2xvcjp2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCl9LmhvdmVyXDp0ZXh0LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9LmhvdmVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9LmhvdmVyXDp1bmRlcmxpbmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWFjY2VudCl9LmZvY3VzXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmZvY3VzLDppcygubm90LWRhdGEtXFt2YXJpYW50XD1kZXN0cnVjdGl2ZVxdXDpmb2N1c1w6XCpcKlw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpub3QoW2RhdGEtdmFyaWFudD1kZXN0cnVjdGl2ZV0pOmZvY3VzICope2NvbG9yOnZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKX0uZm9jdXMtdmlzaWJsZVw6Ym9yZGVyLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxle2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5mb2N1cy12aXNpYmxlXDpib3JkZXItZGVzdHJ1Y3RpdmVcLzQwOmZvY3VzLXZpc2libGV7Ym9yZGVyLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDQwJSwgdHJhbnNwYXJlbnQpfX0uZm9jdXMtdmlzaWJsZVw6Ym9yZGVyLXJpbmc6Zm9jdXMtdmlzaWJsZXtib3JkZXItY29sb3I6dmFyKC0tcmluZyl9LmZvY3VzLXZpc2libGVcOnJpbmctMzpmb2N1cy12aXNpYmxley0tdHctcmluZy1zaGFkb3c6dmFyKC0tdHctcmluZy1pbnNldCwpIDAgMCAwIGNhbGMoM3B4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yLGN1cnJlbnRjb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1pbnNldC1zaGFkb3cpLCB2YXIoLS10dy1pbnNldC1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93KX0uZm9jdXMtdmlzaWJsZVw6cmluZy1kZXN0cnVjdGl2ZVwvMjA6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZm9jdXMtdmlzaWJsZVw6cmluZy1kZXN0cnVjdGl2ZVwvMjA6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMjAlLCB0cmFuc3BhcmVudCl9fS5mb2N1cy12aXNpYmxlXDpyaW5nLXJpbmdcLzUwOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOnZhcigtLXJpbmcpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nXC81MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXJpbmcpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS0xOmZvY3VzLXZpc2libGV7b3V0bGluZS1zdHlsZTp2YXIoLS10dy1vdXRsaW5lLXN0eWxlKTtvdXRsaW5lLXdpZHRoOjFweH0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS1yaW5nOmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjp2YXIoLS1yaW5nKX0uZm9jdXMtdmlzaWJsZVw6YWZ0ZXJcOmJvcmRlci1yaW5nOmZvY3VzLXZpc2libGU6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtib3JkZXItY29sb3I6dmFyKC0tcmluZyl9LmFjdGl2ZVw6bm90LWFyaWEtXFtoYXNwb3B1cFxdXDp0cmFuc2xhdGUteS1weDphY3RpdmU6bm90KFthcmlhLWhhc3BvcHVwXSl7LS10dy10cmFuc2xhdGUteToxcHg7dHJhbnNsYXRlOnZhcigtLXR3LXRyYW5zbGF0ZS14KSB2YXIoLS10dy10cmFuc2xhdGUteSl9LmRpc2FibGVkXDpwb2ludGVyLWV2ZW50cy1ub25lOmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9LmRpc2FibGVkXDpjdXJzb3Itbm90LWFsbG93ZWQ6ZGlzYWJsZWR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5kaXNhYmxlZFw6YmctaW5wdXRcLzUwOmRpc2FibGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGlzYWJsZWRcOmJnLWlucHV0XC81MDpkaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX06d2hlcmUoW2RhdGEtc2xvdD1idXR0b24tZ3JvdXBdKSAuaW4tZGF0YS1cW3Nsb3RcPWJ1dHRvbi1ncm91cFxdXDpyb3VuZGVkLWxne2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKX0uaGFzLWFyaWEtZXhwYW5kZWRcOmJnLW11dGVkXC81MDpoYXMoW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbXV0ZWQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaGFzLWFyaWEtZXhwYW5kZWRcOmJnLW11dGVkXC81MDpoYXMoW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0pe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1tdXRlZCkgNTAlLCB0cmFuc3BhcmVudCl9fS5oYXMtZGF0YS1cW2ljb25cPWlubGluZS1lbmRcXVw6cHItMTpoYXMoW2RhdGEtaWNvbj1pbmxpbmUtZW5kXSl7cGFkZGluZy1yaWdodDp2YXIoLS1zcGFjaW5nKX0uaGFzLWRhdGEtXFtpY29uXD1pbmxpbmUtZW5kXF1cOnByLTFcLjU6aGFzKFtkYXRhLWljb249aW5saW5lLWVuZF0pe3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEuNSl9Lmhhcy1kYXRhLVxbaWNvblw9aW5saW5lLWVuZFxdXDpwci0yOmhhcyhbZGF0YS1pY29uPWlubGluZS1lbmRdKXtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0uaGFzLWRhdGEtXFtpY29uXD1pbmxpbmUtc3RhcnRcXVw6cGwtMTpoYXMoW2RhdGEtaWNvbj1pbmxpbmUtc3RhcnRdKXtwYWRkaW5nLWxlZnQ6dmFyKC0tc3BhY2luZyl9Lmhhcy1kYXRhLVxbaWNvblw9aW5saW5lLXN0YXJ0XF1cOnBsLTFcLjU6aGFzKFtkYXRhLWljb249aW5saW5lLXN0YXJ0XSl7cGFkZGluZy1sZWZ0OmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5oYXMtZGF0YS1cW2ljb25cPWlubGluZS1zdGFydFxdXDpwbC0yOmhhcyhbZGF0YS1pY29uPWlubGluZS1zdGFydF0pe3BhZGRpbmctbGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9Lmhhcy1kYXRhLVxbc2xvdFw9YWxlcnQtYWN0aW9uXF1cOnJlbGF0aXZlOmhhcyhbZGF0YS1zbG90PWFsZXJ0LWFjdGlvbl0pe3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtZGF0YS1cW3Nsb3RcPWFsZXJ0LWFjdGlvblxdXDpwci0xODpoYXMoW2RhdGEtc2xvdD1hbGVydC1hY3Rpb25dKXtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxOCl9Lmhhcy1kYXRhLVxbc2xvdFw9Y2FyZC1hY3Rpb25cXVw6Z3JpZC1jb2xzLVxbMWZyX2F1dG9cXTpoYXMoW2RhdGEtc2xvdD1jYXJkLWFjdGlvbl0pe2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgYXV0b30uaGFzLWRhdGEtXFtzbG90XD1jYXJkLWRlc2NyaXB0aW9uXF1cOmdyaWQtcm93cy1cW2F1dG9fYXV0b1xdOmhhcyhbZGF0YS1zbG90PWNhcmQtZGVzY3JpcHRpb25dKXtncmlkLXRlbXBsYXRlLXJvd3M6YXV0byBhdXRvfS5oYXMtZGF0YS1cW3Nsb3RcPWNhcmQtZm9vdGVyXF1cOnBiLTA6aGFzKFtkYXRhLXNsb3Q9Y2FyZC1mb290ZXJdKXtwYWRkaW5nLWJvdHRvbTowfS5oYXMtXFtcPmltZ1w6Zmlyc3QtY2hpbGRcXVw6cHQtMDpoYXMoPmltZzpmaXJzdC1jaGlsZCl7cGFkZGluZy10b3A6MH0uaGFzLVxbXD5zdmdcXVw6Z3JpZC1jb2xzLVxbYXV0b18xZnJcXTpoYXMoPnN2Zyl7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gMWZyfS5oYXMtXFtcPnN2Z1xdXDpnYXAteC0yOmhhcyg+c3ZnKXtjb2x1bW4tZ2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0uYXJpYS1leHBhbmRlZFw6YmctbXV0ZWRbYXJpYS1leHBhbmRlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX0uYXJpYS1leHBhbmRlZFw6Ymctc2Vjb25kYXJ5W2FyaWEtZXhwYW5kZWQ9dHJ1ZV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zZWNvbmRhcnkpfS5hcmlhLWV4cGFuZGVkXDp0ZXh0LWZvcmVncm91bmRbYXJpYS1leHBhbmRlZD10cnVlXXtjb2xvcjp2YXIoLS1mb3JlZ3JvdW5kKX0uYXJpYS1leHBhbmRlZFw6dGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZFthcmlhLWV4cGFuZGVkPXRydWVde2NvbG9yOnZhcigtLXNlY29uZGFyeS1mb3JlZ3JvdW5kKX0uYXJpYS1pbnZhbGlkXDpib3JkZXItZGVzdHJ1Y3RpdmVbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9LmFyaWEtaW52YWxpZFw6cmluZy0zW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctc2hhZG93OnZhcigtLXR3LXJpbmctaW5zZXQsKSAwIDAgMCBjYWxjKDNweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcixjdXJyZW50Y29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LmFyaWEtaW52YWxpZFw6cmluZy1kZXN0cnVjdGl2ZVwvMjBbYXJpYS1pbnZhbGlkPXRydWVdey0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5hcmlhLWludmFsaWRcOnJpbmctZGVzdHJ1Y3RpdmVcLzIwW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMjAlLCB0cmFuc3BhcmVudCl9fS5kYXRhLXBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmRbZGF0YS1wbGFjZWhvbGRlcl17Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9LmRhdGEtXFthbGlnbi10cmlnZ2VyXD10cnVlXF1cOmFuaW1hdGUtbm9uZVtkYXRhLWFsaWduLXRyaWdnZXI9dHJ1ZV17YW5pbWF0aW9uOm5vbmV9LmRhdGEtXFtkaXNhYmxlZFxdXDpwb2ludGVyLWV2ZW50cy1ub25lW2RhdGEtZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmRhdGEtXFtkaXNhYmxlZFxdXDpvcGFjaXR5LTUwW2RhdGEtZGlzYWJsZWRde29wYWNpdHk6LjV9LmRhdGEtXFtwb3NpdGlvblw9cG9wcGVyXF1cOmgtXCgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClbZGF0YS1wb3NpdGlvbj1wb3BwZXJde2hlaWdodDp2YXIoLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmRhdGEtXFtwb3NpdGlvblw9cG9wcGVyXF1cOnctZnVsbFtkYXRhLXBvc2l0aW9uPXBvcHBlcl17d2lkdGg6MTAwJX0uZGF0YS1cW3Bvc2l0aW9uXD1wb3BwZXJcXVw6bWluLXctXCgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGhcKVtkYXRhLXBvc2l0aW9uPXBvcHBlcl17bWluLXdpZHRoOnZhcigtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpfS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPWJvdHRvbV17LS10dy10cmFuc2xhdGUteTp2YXIoLS1zcGFjaW5nKTt0cmFuc2xhdGU6dmFyKC0tdHctdHJhbnNsYXRlLXgpIHZhcigtLXR3LXRyYW5zbGF0ZS15KX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6Y2FsYygyKnZhcigtLXNwYWNpbmcpKi0xKX0uZGF0YS1cW3NpZGVcPWlubGluZS1lbmRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPWlubGluZS1lbmRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6Y2FsYygyKnZhcigtLXNwYWNpbmcpKi0xKX0uZGF0YS1cW3NpZGVcPWlubGluZS1zdGFydFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWlubGluZS1zdGFydF17LS10dy1lbnRlci10cmFuc2xhdGUteDpjYWxjKDIqdmFyKC0tc3BhY2luZykpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDotdHJhbnNsYXRlLXgtMVtkYXRhLXNpZGU9bGVmdF17LS10dy10cmFuc2xhdGUteDpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWxlZnRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6Y2FsYygyKnZhcigtLXNwYWNpbmcpKX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LXRyYW5zbGF0ZS14OnZhcigtLXNwYWNpbmcpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9cmlnaHRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OmNhbGMoMip2YXIoLS1zcGFjaW5nKSotMSl9LmRhdGEtXFtzaWRlXD10b3BcXVw6LXRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPXRvcF17LS10dy10cmFuc2xhdGUteTpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTpjYWxjKDIqdmFyKC0tc3BhY2luZykpfS5kYXRhLVxbc2l6ZVw9ZGVmYXVsdFxdXDpoLThbZGF0YS1zaXplPWRlZmF1bHRde2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LmRhdGEtXFtzaXplXD1zbVxdXDpoLTdbZGF0YS1zaXplPXNtXXtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5kYXRhLVxbc2l6ZVw9c21cXVw6Z2FwLTNbZGF0YS1zaXplPXNtXXtnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5kYXRhLVxbc2l6ZVw9c21cXVw6cm91bmRlZC1cW21pblwodmFyXCgtLXJhZGl1cy1tZFwpXCwxMHB4XClcXVtkYXRhLXNpemU9c21de2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEwcHgpfS5kYXRhLVxbc2l6ZVw9c21cXVw6cHktM1tkYXRhLXNpemU9c21de3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5kYXRhLVxbc2l6ZVw9c21cXVw6aGFzLWRhdGEtXFtzbG90XD1jYXJkLWZvb3RlclxdXDpwYi0wW2RhdGEtc2l6ZT1zbV06aGFzKFtkYXRhLXNsb3Q9Y2FyZC1mb290ZXJdKXtwYWRkaW5nLWJvdHRvbTowfTppcyguXCpcKlw6ZGF0YS1cW3Nsb3RcPWFjY29yZGlvbi10cmlnZ2VyLWljb25cXVw6bWwtYXV0byAqKVtkYXRhLXNsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl17bWFyZ2luLWxlZnQ6YXV0b306aXMoLlwqXCpcOmRhdGEtXFtzbG90XD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXF1cOnNpemUtNCAqKVtkYXRhLXNsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl17d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9OmlzKC5cKlwqXDpkYXRhLVxbc2xvdFw9YWNjb3JkaW9uLXRyaWdnZXItaWNvblxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmQgKilbZGF0YS1zbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25de2NvbG9yOnZhcigtLW11dGVkLWZvcmVncm91bmQpfTppcyguXCpcOmRhdGEtXFtzbG90XD1hbGVydC1kZXNjcmlwdGlvblxdXDp0ZXh0LWRlc3RydWN0aXZlXC85MD4qKVtkYXRhLXNsb3Q9YWxlcnQtZGVzY3JpcHRpb25de2NvbG9yOnZhcigtLWRlc3RydWN0aXZlKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7OmlzKC5cKlw6ZGF0YS1cW3Nsb3RcPWFsZXJ0LWRlc2NyaXB0aW9uXF1cOnRleHQtZGVzdHJ1Y3RpdmVcLzkwPiopW2RhdGEtc2xvdD1hbGVydC1kZXNjcmlwdGlvbl17Y29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgOTAlLCB0cmFuc3BhcmVudCl9fTppcyguXCpcOmRhdGEtXFtzbG90XD1zZWxlY3QtdmFsdWVcXVw6bGluZS1jbGFtcC0xPiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVdey13ZWJraXQtbGluZS1jbGFtcDoxOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDtkaXNwbGF5Oi13ZWJraXQtYm94O292ZXJmbG93OmhpZGRlbn06aXMoLlwqXDpkYXRhLVxbc2xvdFw9c2VsZWN0LXZhbHVlXF1cOmZsZXg+KilbZGF0YS1zbG90PXNlbGVjdC12YWx1ZV17ZGlzcGxheTpmbGV4fTppcyguXCpcOmRhdGEtXFtzbG90XD1zZWxlY3QtdmFsdWVcXVw6aXRlbXMtY2VudGVyPiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVde2FsaWduLWl0ZW1zOmNlbnRlcn06aXMoLlwqXDpkYXRhLVxbc2xvdFw9c2VsZWN0LXZhbHVlXF1cOmdhcC0xXC41PiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVde2dhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMS41KX0uZGF0YS1cW3N0YXRlXD1zZWxlY3RlZFxdXDpiZy1tdXRlZFtkYXRhLXN0YXRlPXNlbGVjdGVkXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX0uZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVw6cm91bmRlZC1ub25lW2RhdGEtdmFyaWFudD1saW5lXXtib3JkZXItcmFkaXVzOjB9QG1lZGlhICh3aWR0aD49NDByZW0pey5zbVw6Z3JpZC1jb2xzLTN7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgzLG1pbm1heCgwLDFmcikpfS5zbVw6Z3JpZC1jb2xzLTR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LG1pbm1heCgwLDFmcikpfS5zbVw6ZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5zbVw6aXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uc21cOmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uc21cOnB4LTZ7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfX1AbWVkaWEgKHdpZHRoPj00OHJlbSl7Lm1kXDp0ZXh0LXNte2ZvbnQtc2l6ZTp2YXIoLS10ZXh0LXNtKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtc20tLWxpbmUtaGVpZ2h0KSl9Lm1kXDp0ZXh0LXByZXR0eXt0ZXh0LXdyYXA6cHJldHR5fX1AbWVkaWEgKHdpZHRoPj02NHJlbSl7LmxnXDpweC04e3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiA4KX19QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXsuZGFya1w6Ym9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjp2YXIoLS1pbnB1dCl9LmRhcmtcOmJnLWRlc3RydWN0aXZlXC8yMHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWRlc3RydWN0aXZlKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmRhcmtcOmJnLWRlc3RydWN0aXZlXC8yMHtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDIwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6YmctaW5wdXRcLzMwe2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGFya1w6YmctaW5wdXRcLzMwe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1pbnB1dCkgMzAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDp0ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9QG1lZGlhIChob3Zlcjpob3Zlcil7LmRhcmtcOmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvMzA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzMwOmhvdmVye2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMzAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDpob3Zlclw6YmctaW5wdXRcLzUwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGFya1w6aG92ZXJcOmJnLWlucHV0XC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6aG92ZXJcOmJnLW11dGVkXC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmRhcmtcOmhvdmVyXDpiZy1tdXRlZFwvNTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLW11dGVkKSA1MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmhvdmVyXDp0ZXh0LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9fS5kYXJrXDpmb2N1cy12aXNpYmxlXDpyaW5nLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpmb2N1cy12aXNpYmxlXDpyaW5nLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSA0MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmRpc2FibGVkXDpiZy1pbnB1dFwvODA6ZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpkaXNhYmxlZFw6YmctaW5wdXRcLzgwOmRpc2FibGVke2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1pbnB1dCkgODAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDphcmlhLWludmFsaWRcOmJvcmRlci1kZXN0cnVjdGl2ZVwvNTBbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDphcmlhLWludmFsaWRcOmJvcmRlci1kZXN0cnVjdGl2ZVwvNTBbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSA1MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmFyaWEtaW52YWxpZFw6cmluZy1kZXN0cnVjdGl2ZVwvNDBbYXJpYS1pbnZhbGlkPXRydWVdey0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDphcmlhLWludmFsaWRcOnJpbmctZGVzdHJ1Y3RpdmVcLzQwW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgNDAlLCB0cmFuc3BhcmVudCl9fX0uZGF0YS1vcGVuXDphbmltYXRlLWFjY29yZGlvbi1kb3duOndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDphbmltYXRlLWFjY29yZGlvbi1kb3duOndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpe2FuaW1hdGlvbjphY2NvcmRpb24tZG93biB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjJzKSl2YXIoLS10dy1lYXNlLGVhc2Utb3V0KXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1vcGVuXDphbmltYXRlLWluOndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDphbmltYXRlLWluOndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpe2FuaW1hdGlvbjplbnRlciB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjE1cykpdmFyKC0tdHctZWFzZSxlYXNlKXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1vcGVuXDpmYWRlLWluLTA6d2hlcmUoW2RhdGEtc3RhdGU9b3Blbl0pLC5kYXRhLW9wZW5cOmZhZGUtaW4tMDp3aGVyZShbZGF0YS1vcGVuXTpub3QoW2RhdGEtb3Blbj1mYWxzZV0pKXstLXR3LWVudGVyLW9wYWNpdHk6MH0uZGF0YS1vcGVuXDp6b29tLWluLTk1OndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDp6b29tLWluLTk1OndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpey0tdHctZW50ZXItc2NhbGU6Ljk1fS5kYXRhLWNsb3NlZFw6YW5pbWF0ZS1hY2NvcmRpb24tdXA6d2hlcmUoW2RhdGEtc3RhdGU9Y2xvc2VkXSksLmRhdGEtY2xvc2VkXDphbmltYXRlLWFjY29yZGlvbi11cDp3aGVyZShbZGF0YS1jbG9zZWRdOm5vdChbZGF0YS1jbG9zZWQ9ZmFsc2VdKSl7YW5pbWF0aW9uOmFjY29yZGlvbi11cCB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjJzKSl2YXIoLS10dy1lYXNlLGVhc2Utb3V0KXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1jbG9zZWRcOmFuaW1hdGUtb3V0OndoZXJlKFtkYXRhLXN0YXRlPWNsb3NlZF0pLC5kYXRhLWNsb3NlZFw6YW5pbWF0ZS1vdXQ6d2hlcmUoW2RhdGEtY2xvc2VkXTpub3QoW2RhdGEtY2xvc2VkPWZhbHNlXSkpe2FuaW1hdGlvbjpleGl0IHZhcigtLXR3LWFuaW1hdGlvbi1kdXJhdGlvbix2YXIoLS10dy1kdXJhdGlvbiwuMTVzKSl2YXIoLS10dy1lYXNlLGVhc2UpdmFyKC0tdHctYW5pbWF0aW9uLWRlbGF5LDBzKXZhcigtLXR3LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsMSl2YXIoLS10dy1hbmltYXRpb24tZGlyZWN0aW9uLG5vcm1hbCl2YXIoLS10dy1hbmltYXRpb24tZmlsbC1tb2RlLG5vbmUpfS5kYXRhLWNsb3NlZFw6ZmFkZS1vdXQtMDp3aGVyZShbZGF0YS1zdGF0ZT1jbG9zZWRdKSwuZGF0YS1jbG9zZWRcOmZhZGUtb3V0LTA6d2hlcmUoW2RhdGEtY2xvc2VkXTpub3QoW2RhdGEtY2xvc2VkPWZhbHNlXSkpey0tdHctZXhpdC1vcGFjaXR5OjB9LmRhdGEtY2xvc2VkXDp6b29tLW91dC05NTp3aGVyZShbZGF0YS1zdGF0ZT1jbG9zZWRdKSwuZGF0YS1jbG9zZWRcOnpvb20tb3V0LTk1OndoZXJlKFtkYXRhLWNsb3NlZF06bm90KFtkYXRhLWNsb3NlZD1mYWxzZV0pKXstLXR3LWV4aXQtc2NhbGU6Ljk1fS5kYXRhLWFjdGl2ZVw6YmctYmFja2dyb3VuZDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGF0YS1hY3RpdmVcOmJnLWJhY2tncm91bmQ6d2hlcmUoW2RhdGEtYWN0aXZlXTpub3QoW2RhdGEtYWN0aXZlPWZhbHNlXSkpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tYmFja2dyb3VuZCl9LmRhdGEtYWN0aXZlXDp0ZXh0LWZvcmVncm91bmQ6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmRhdGEtYWN0aXZlXDp0ZXh0LWZvcmVncm91bmQ6d2hlcmUoW2RhdGEtYWN0aXZlXTpub3QoW2RhdGEtYWN0aXZlPWZhbHNlXSkpe2NvbG9yOnZhcigtLWZvcmVncm91bmQpfS5ncm91cC1kYXRhLVxbdmFyaWFudFw9ZGVmYXVsdFxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpzaGFkb3ctc206aXMoOndoZXJlKC5ncm91cFwvdGFicy1saXN0KVtkYXRhLXZhcmlhbnQ9ZGVmYXVsdF0gKik6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1kZWZhdWx0XF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOnNoYWRvdy1zbTppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1kZWZhdWx0XSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7LS10dy1zaGFkb3c6MCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yLCMwMDAwMDAxYSksIDAgMXB4IDJweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciwjMDAwMDAwMWEpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9Lmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5ncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpiZy10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjojMDAwMH0uZ3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6c2hhZG93LW5vbmU6aXMoOndoZXJlKC5ncm91cFwvdGFicy1saXN0KVtkYXRhLXZhcmlhbnQ9bGluZV0gKik6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOnNoYWRvdy1ub25lOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXstLXR3LXNoYWRvdzowIDAgIzAwMDA7Ym94LXNoYWRvdzp2YXIoLS10dy1pbnNldC1zaGFkb3cpLCB2YXIoLS10dy1pbnNldC1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93KX06aXMoLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmFmdGVyXDpvcGFjaXR5LTEwMDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZ3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6YWZ0ZXJcOm9wYWNpdHktMTAwOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKSk6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtvcGFjaXR5OjF9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXsuZGFya1w6ZGF0YS1hY3RpdmVcOmJvcmRlci1pbnB1dDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOmJvcmRlci1pbnB1dDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7Ym9yZGVyLWNvbG9yOnZhcigtLWlucHV0KX0uZGFya1w6ZGF0YS1hY3RpdmVcOmJnLWlucHV0XC8zMDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOmJnLWlucHV0XC8zMDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpkYXRhLWFjdGl2ZVw6YmctaW5wdXRcLzMwOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5kYXJrXDpkYXRhLWFjdGl2ZVw6YmctaW5wdXRcLzMwOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDMwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6ZGF0YS1hY3RpdmVcOnRleHQtZm9yZWdyb3VuZDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOnRleHQtZm9yZWdyb3VuZDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9LmRhcmtcOmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJvcmRlci10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6Z3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6Ym9yZGVyLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXtib3JkZXItY29sb3I6IzAwMDB9LmRhcmtcOmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5kYXJrXDpncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpiZy10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjojMDAwMH19LmRhdGEtaG9yaXpvbnRhbFw6ZmxleC1jb2w6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pe2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uXFtcJl9hXF1cOnVuZGVybGluZSBhe3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uXFtcJl9hXF1cOnVuZGVybGluZS1vZmZzZXQtMyBhe3RleHQtdW5kZXJsaW5lLW9mZnNldDozcHh9QG1lZGlhIChob3Zlcjpob3Zlcil7LlxbXCZfYVxdXDpob3Zlclw6dGV4dC1mb3JlZ3JvdW5kIGE6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9fS5cW1wmX3BcOm5vdFwoXDpsYXN0LWNoaWxkXClcXVw6bWItNCBwOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9LlxbXCZfc3ZnXF1cOnBvaW50ZXItZXZlbnRzLW5vbmUgc3Zne3BvaW50ZXItZXZlbnRzOm5vbmV9LlxbXCZfc3ZnXF1cOnNocmluay0wIHN2Z3tmbGV4LXNocmluazowfS5cW1wmX3N2Z1w6bm90XChcW2NsYXNzXCpcPXNpemUtXF1cKVxdXDpzaXplLTMgc3ZnOm5vdChbY2xhc3MqPXNpemUtXSl7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9LlxbXCZfc3ZnXDpub3RcKFxbY2xhc3NcKlw9c2l6ZS1cXVwpXF1cOnNpemUtM1wuNSBzdmc6bm90KFtjbGFzcyo9c2l6ZS1dKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMy41KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMuNSl9LlxbXCZfc3ZnXDpub3RcKFxbY2xhc3NcKlw9c2l6ZS1cXVwpXF1cOnNpemUtNCBzdmc6bm90KFtjbGFzcyo9c2l6ZS1dKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0uXFtcJl90clxdXDpib3JkZXItYiB0cntib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LlxbXCZfdHJcOmxhc3QtY2hpbGRcXVw6Ym9yZGVyLTAgdHI6bGFzdC1jaGlsZHtib3JkZXItc3R5bGU6dmFyKC0tdHctYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6MH0uXFtcJlw6aGFzXChcW3JvbGVcPWNoZWNrYm94XF1cKVxdXDpwci0wOmhhcyhbcm9sZT1jaGVja2JveF0pe3BhZGRpbmctcmlnaHQ6MH0uXFtcLmJvcmRlci1iXF1cOnBiLTQuYm9yZGVyLWJ7cGFkZGluZy1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5ncm91cC1kYXRhLVxbc2l6ZVw9c21cXVwvY2FyZFw6XFtcLmJvcmRlci1iXF1cOnBiLTM6aXMoOndoZXJlKC5ncm91cFwvY2FyZClbZGF0YS1zaXplPXNtXSAqKS5ib3JkZXItYntwYWRkaW5nLWJvdHRvbTpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9QG1lZGlhIChob3Zlcjpob3Zlcil7LlxbYVxdXDpob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzIwOmlzKGEpOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuXFthXF1cOmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvMjA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSAyMCUsIHRyYW5zcGFyZW50KX19LlxbYVxdXDpob3Zlclw6YmctbXV0ZWQ6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tdXRlZCl9LlxbYVxdXDpob3Zlclw6YmctcHJpbWFyeVwvODA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wcmltYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LlxbYVxdXDpob3Zlclw6YmctcHJpbWFyeVwvODA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXByaW1hcnkpIDgwJSwgdHJhbnNwYXJlbnQpfX0uXFthXF1cOmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmlzKGEpOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tc2Vjb25kYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LlxbYVxdXDpob3Zlclw6Ymctc2Vjb25kYXJ5XC84MDppcyhhKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tc2Vjb25kYXJ5KSA4MCUsIHRyYW5zcGFyZW50KX19LlxbYVxdXDpob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmlzKGEpOmhvdmVye2NvbG9yOnZhcigtLW11dGVkLWZvcmVncm91bmQpfX06aXMoLlwqXDpcW2ltZ1w6Zmlyc3QtY2hpbGRcXVw6cm91bmRlZC10LXhsPiopOmlzKGltZzpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCl9OmlzKC5cKlw6XFtpbWdcOmxhc3QtY2hpbGRcXVw6cm91bmRlZC1iLXhsPiopOmlzKGltZzpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpICsgNHB4KX06aXMoLlwqXDpcW3NwYW5cXVw6bGFzdFw6ZmxleD4qKTppcyhzcGFuKTpsYXN0LWNoaWxke2Rpc3BsYXk6ZmxleH06aXMoLlwqXDpcW3NwYW5cXVw6bGFzdFw6aXRlbXMtY2VudGVyPiopOmlzKHNwYW4pOmxhc3QtY2hpbGR7YWxpZ24taXRlbXM6Y2VudGVyfTppcyguXCpcOlxbc3BhblxdXDpsYXN0XDpnYXAtMj4qKTppcyhzcGFuKTpsYXN0LWNoaWxke2dhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9OmlzKC5cKlw6XFtzdmdcXVw6cm93LXNwYW4tMj4qKTppcyhzdmcpe2dyaWQtcm93OnNwYW4gMi9zcGFuIDJ9OmlzKC5cKlw6XFtzdmdcXVw6dHJhbnNsYXRlLXktMFwuNT4qKTppcyhzdmcpey0tdHctdHJhbnNsYXRlLXk6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KTt0cmFuc2xhdGU6dmFyKC0tdHctdHJhbnNsYXRlLXgpIHZhcigtLXR3LXRyYW5zbGF0ZS15KX06aXMoLlwqXDpcW3N2Z1xdXDp0ZXh0LWN1cnJlbnQ+Kik6aXMoc3ZnKXtjb2xvcjpjdXJyZW50Q29sb3J9OmlzKC5cKlw6XFtzdmdcOm5vdFwoXFtjbGFzc1wqXD1zaXplLVxdXClcXVw6c2l6ZS00PiopOmlzKHN2Zzpub3QoW2NsYXNzKj1zaXplLV0pKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0uXFtcJlw+c3ZnXF1cOnBvaW50ZXItZXZlbnRzLW5vbmU+c3Zne3BvaW50ZXItZXZlbnRzOm5vbmV9LlxbXCZcPnN2Z1xdXDpzaXplLTNcIT5zdmd7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpIWltcG9ydGFudDtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpIWltcG9ydGFudH0uXFtcJlw+dHJcXVw6bGFzdFw6Ym9yZGVyLWItMD50cjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tc3R5bGU6dmFyKC0tdHctYm9yZGVyLXN0eWxlKTtib3JkZXItYm90dG9tLXdpZHRoOjB9fUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1kZWxheXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MHN9QHByb3BlcnR5IC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6bm9ybWFsfUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1kdXJhdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1maWxsLW1vZGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOm5vbmV9QHByb3BlcnR5IC0tdHctYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MX1AcHJvcGVydHkgLS10dy1lbnRlci1ibHVye3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLW9wYWNpdHl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjF9QHByb3BlcnR5IC0tdHctZW50ZXItcm90YXRle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXNjYWxle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXRyYW5zbGF0ZS14e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXRyYW5zbGF0ZS15e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWV4aXQtYmx1cntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy1leGl0LW9wYWNpdHl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjF9QHByb3BlcnR5IC0tdHctZXhpdC1yb3RhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tdHctZXhpdC1zY2FsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MX1AcHJvcGVydHkgLS10dy1leGl0LXRyYW5zbGF0ZS14e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWV4aXQtdHJhbnNsYXRlLXl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tc2Nyb2xsLWZhZGUtdHtzeW50YXg6IjxsZW5ndGgtcGVyY2VudGFnZT4iO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS1zY3JvbGwtZmFkZS1ie3N5bnRheDoiPGxlbmd0aC1wZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXNjcm9sbC1mYWRlLXN7c3ludGF4OiI8bGVuZ3RoLXBlcmNlbnRhZ2U+Ijtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tc2Nyb2xsLWZhZGUtZXtzeW50YXg6IjxsZW5ndGgtcGVyY2VudGFnZT4iO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS1zY3JvbGwtZmFkZS1tYXNre3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tc2hpbW1lci1hbmdsZXtzeW50YXg6IjxhbmdsZT4iO2luaGVyaXRzOnRydWU7aW5pdGlhbC12YWx1ZToyMGRlZ31AcHJvcGVydHkgLS1zaGltbWVyLWltYWdle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tc2hpbW1lci10ZXh0LWZpbGx7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsuc2hpbW1lcnstd2Via2l0LXRleHQtZmlsbC1jb2xvcjpjdXJyZW50Q29sb3I7YmFja2dyb3VuZC1pbWFnZTpub25lO2FuaW1hdGlvbjpub25lfX06cm9vdHstLWJhY2tncm91bmQ6b2tsY2goOTklIC4wMDQgNzUpOy0tZm9yZWdyb3VuZDpva2xjaCgxOSUgLjAxMiA3NSk7LS1jYXJkOm9rbGNoKDk5LjUlIC4wMDMgNzUpOy0tY2FyZC1mb3JlZ3JvdW5kOm9rbGNoKDE5JSAuMDEyIDc1KTstLXBvcG92ZXI6b2tsY2goOTkuNSUgLjAwMyA3NSk7LS1wb3BvdmVyLWZvcmVncm91bmQ6b2tsY2goMTklIC4wMTIgNzUpOy0tcHJpbWFyeTpva2xjaCg0NiUgLjA5IDIwMCk7LS1wcmltYXJ5LWZvcmVncm91bmQ6b2tsY2goOTglIC4wMDYgMjAwKTstLXNlY29uZGFyeTpva2xjaCg5NSUgLjAwNiA3NSk7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDpva2xjaCgyMiUgLjAxIDc1KTstLW11dGVkOm9rbGNoKDk1JSAuMDA2IDc1KTstLW11dGVkLWZvcmVncm91bmQ6b2tsY2goNDglIC4wMTIgNzUpOy0tYWNjZW50Om9rbGNoKDkzJSAuMDIgMjAwKTstLWFjY2VudC1mb3JlZ3JvdW5kOm9rbGNoKDI4JSAuMDUgMjAwKTstLWRlc3RydWN0aXZlOm9rbGNoKDU1JSAuMiAyNSk7LS1ib3JkZXI6b2tsY2goOTAlIC4wMDcgNzUpOy0taW5wdXQ6b2tsY2goOTAlIC4wMDcgNzUpOy0tcmluZzpva2xjaCg1NSUgLjA5IDIwMCk7LS1yYWRpdXM6LjM3NXJlbTstLWNoYXJ0LXJlcXVlc3RzOiMwMDllNzM7LS1jaGFydC10b2tlbnMtaW46IzAwNzJiMjstLWNoYXJ0LXRva2Vucy1vdXQ6I2U2OWYwMDstLWNoYXJ0LWNvc3Q6I2Q1NWUwMDstLXN0YXR1cy13YXJuOiNhMzVjMDB9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6cm9vdHstLWJhY2tncm91bmQ6b2tsY2goMTclIC4wMDcgNzUpOy0tZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1jYXJkOm9rbGNoKDIxJSAuMDA5IDc1KTstLWNhcmQtZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1wb3BvdmVyOm9rbGNoKDIxJSAuMDA5IDc1KTstLXBvcG92ZXItZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1wcmltYXJ5Om9rbGNoKDc0JSAuMTEgMjAwKTstLXByaW1hcnktZm9yZWdyb3VuZDpva2xjaCgxNiUgLjAxMiAyMDApOy0tc2Vjb25kYXJ5Om9rbGNoKDI3JSAuMDExIDc1KTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOm9rbGNoKDkzJSAuMDA1IDc1KTstLW11dGVkOm9rbGNoKDI3JSAuMDExIDc1KTstLW11dGVkLWZvcmVncm91bmQ6b2tsY2goNjglIC4wMTIgNzUpOy0tYWNjZW50Om9rbGNoKDMyJSAuMDM1IDIwMCk7LS1hY2NlbnQtZm9yZWdyb3VuZDpva2xjaCg5MSUgLjAzIDIwMCk7LS1kZXN0cnVjdGl2ZTpva2xjaCg2OCUgLjE5IDI1KTstLWJvcmRlcjpva2xjaCgxMDAlIDAgMC8uMTIpOy0taW5wdXQ6b2tsY2goMTAwJSAwIDAvLjE2KTstLXJpbmc6b2tsY2goNjIlIC4xIDIwMCk7LS1jaGFydC1yZXF1ZXN0czojMTZiODkxOy0tY2hhcnQtdG9rZW5zLWluOiM0MDk4ZDc7LS1jaGFydC10b2tlbnMtb3V0OiNmMGFjMWY7LS1jaGFydC1jb3N0OiNlODc2M2E7LS1zdGF0dXMtd2FybjojZjBhYzFmfX1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUteHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUteXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUtentzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy1yb3RhdGUteHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXJvdGF0ZS15e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctcm90YXRlLXp7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1za2V3LXh7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1za2V3LXl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1ib3JkZXItc3R5bGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOnNvbGlkfUBwcm9wZXJ0eSAtLXR3LWxlYWRpbmd7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1mb250LXdlaWdodHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXRyYWNraW5ne3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctb3JkaW5hbHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNsYXNoZWQtemVyb3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LW51bWVyaWMtZmlndXJle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctbnVtZXJpYy1zcGFjaW5ne3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctbnVtZXJpYy1mcmFjdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LXNoYWRvdy1jb2xvcntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvdy1jb2xvcntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LXJpbmctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1yaW5nLXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXJpbmctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1pbnNldC1yaW5nLXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LXJpbmctaW5zZXR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1yaW5nLW9mZnNldC13aWR0aHtzeW50YXg6IjxsZW5ndGg+Ijtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tdHctcmluZy1vZmZzZXQtY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOiNmZmZ9QHByb3BlcnR5IC0tdHctcmluZy1vZmZzZXQtc2hhZG93e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowIDAgIzAwMDB9QHByb3BlcnR5IC0tdHctb3V0bGluZS1zdHlsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6c29saWR9QHByb3BlcnR5IC0tdHctYmx1cntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWJyaWdodG5lc3N7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1jb250cmFzdHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWdyYXlzY2FsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWh1ZS1yb3RhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1pbnZlcnR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1vcGFjaXR5e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctc2F0dXJhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1zZXBpYXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWRyb3Atc2hhZG93e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctZHJvcC1zaGFkb3ctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1kcm9wLXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LWRyb3Atc2hhZG93LXNpemV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1kdXJhdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWNvbnRlbnR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOiIifUBrZXlmcmFtZXMgZW50ZXJ7MCV7b3BhY2l0eTp2YXIoLS10dy1lbnRlci1vcGFjaXR5LDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteCwwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwwKSwwKXNjYWxlM2QodmFyKC0tdHctZW50ZXItc2NhbGUsMSksdmFyKC0tdHctZW50ZXItc2NhbGUsMSksdmFyKC0tdHctZW50ZXItc2NhbGUsMSkpcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwwKSk7ZmlsdGVyOmJsdXIodmFyKC0tdHctZW50ZXItYmx1ciwwKSl9fUBrZXlmcmFtZXMgZXhpdHt0b3tvcGFjaXR5OnZhcigtLXR3LWV4aXQtb3BhY2l0eSwxKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QodmFyKC0tdHctZXhpdC10cmFuc2xhdGUteCwwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LDApLDApc2NhbGUzZCh2YXIoLS10dy1leGl0LXNjYWxlLDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsMSksdmFyKC0tdHctZXhpdC1zY2FsZSwxKSlyb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsMCkpO2ZpbHRlcjpibHVyKHZhcigtLXR3LWV4aXQtYmx1ciwwKSl9fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJla2EtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0LHZhcigtLWFjY29yZGlvbi1wYW5lbC1oZWlnaHQsYXV0bykpfX1Aa2V5ZnJhbWVzIGFjY29yZGlvbi11cHswJXtoZWlnaHQ6dmFyKC0tcmVrYS1hY2NvcmRpb24tY29udGVudC1oZWlnaHQsdmFyKC0tYWNjb3JkaW9uLXBhbmVsLWhlaWdodCxhdXRvKSl9dG97aGVpZ2h0OjB9fQo=", ), }, - "index-D8B8ACGt.js": { + "index-CwP_MbOb.js": { contentType: "text/javascript; charset=utf-8", body: decodeAdminAsset( - "dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5LHQ9KHQsbik9PntsZXQgcj17fTtmb3IodmFyIGkgaW4gdCllKHIsaSx7Z2V0OnRbaV0sZW51bWVyYWJsZTohMH0pO3JldHVybiBufHxlKHIsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpgTW9kdWxlYH0pLHJ9O2Z1bmN0aW9uIG4oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG4gb2YgZS5zcGxpdChgLGApKXRbbl09MTtyZXR1cm4gZT0+ZSBpbiB0fXZhciByPXt9LGk9W10sYT0oKT0+e30sbz0oKT0+ITEscz1lPT5lLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmUuY2hhckNvZGVBdCgxKT09PTExMCYmKGUuY2hhckNvZGVBdCgyKT4xMjJ8fGUuY2hhckNvZGVBdCgyKTw5NyksYz1lPT5lLnN0YXJ0c1dpdGgoYG9uVXBkYXRlOmApLGw9T2JqZWN0LmFzc2lnbix1PShlLHQpPT57bGV0IG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9LGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmPShlLHQpPT5kLmNhbGwoZSx0KSxwPUFycmF5LmlzQXJyYXksbT1lPT53KGUpPT09YFtvYmplY3QgTWFwXWAsaD1lPT53KGUpPT09YFtvYmplY3QgU2V0XWAsZz1lPT53KGUpPT09YFtvYmplY3QgRGF0ZV1gLF89ZT0+dyhlKT09PWBbb2JqZWN0IFJlZ0V4cF1gLHY9ZT0+dHlwZW9mIGU9PWBmdW5jdGlvbmAseT1lPT50eXBlb2YgZT09YHN0cmluZ2AsYj1lPT50eXBlb2YgZT09YHN5bWJvbGAseD1lPT50eXBlb2YgZT09YG9iamVjdGAmJiEhZSxTPWU9Pih4KGUpfHx2KGUpKSYmdihlLnRoZW4pJiZ2KGUuY2F0Y2gpLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx3PWU9PkMuY2FsbChlKSxlZT1lPT53KGUpLnNsaWNlKDgsLTEpLHRlPWU9PncoZSk9PT1gW29iamVjdCBPYmplY3RdYCxUPWU9PnkoZSkmJmUhPT1gTmFOYCYmZVswXSE9PWAtYCYmYGArcGFyc2VJbnQoZSwxMCk9PT1lLG5lPW4oYCxrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkYCkscmU9ZT0+e2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuKG49PnRbbl18fCh0W25dPWUobikpKX0saWU9Ly1cdy9nLEU9cmUoZT0+ZS5yZXBsYWNlKGllLGU9PmUuc2xpY2UoMSkudG9VcHBlckNhc2UoKSkpLGFlPS9cQihbQS1aXSkvZyxvZT1yZShlPT5lLnJlcGxhY2UoYWUsYC0kMWApLnRvTG93ZXJDYXNlKCkpLHNlPXJlKGU9PmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSksY2U9cmUoZT0+ZT9gb24ke3NlKGUpfWA6YGApLEQ9KGUsdCk9PiFPYmplY3QuaXMoZSx0KSxsZT0oZSwuLi50KT0+e2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oLi4udCl9LHVlPShlLHQsbixyPSExKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOnIsdmFsdWU6bn0pfSxkZT1lPT57bGV0IHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fSxmZT1lPT57bGV0IHQ9eShlKT9OdW1iZXIoZSk6TmFOO3JldHVybiBpc05hTih0KT9lOnR9LHBlLG1lPSgpPT5wZXx8PXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPGB1YD9zZWxmOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6e30saGU9bihgSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3IsU3ltYm9sYCk7ZnVuY3Rpb24gZ2UoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0saT15KHIpP2JlKHIpOmdlKHIpO2lmKGkpZm9yKGxldCBlIGluIGkpdFtlXT1pW2VdfXJldHVybiB0fWlmKHkoZSl8fHgoZSkpcmV0dXJuIGV9dmFyIF9lPS87KD8hW14oXSpcKSkvZyx2ZT0vOihbXl0rKS8seWU9L1wvXCpbXl0qP1wqXC8vZztmdW5jdGlvbiBiZShlKXtsZXQgdD17fTtyZXR1cm4gZS5yZXBsYWNlKHllLGBgKS5zcGxpdChfZSkuZm9yRWFjaChlPT57aWYoZSl7bGV0IG49ZS5zcGxpdCh2ZSk7bi5sZW5ndGg+MSYmKHRbblswXS50cmltKCldPW5bMV0udHJpbSgpKX19KSx0fWZ1bmN0aW9uIE8oZSl7bGV0IHQ9YGA7aWYoeShlKSl0PWU7ZWxzZSBpZihwKGUpKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1PKGVbbl0pO3ImJih0Kz1yK2AgYCl9ZWxzZSBpZih4KGUpKWZvcihsZXQgbiBpbiBlKWVbbl0mJih0Kz1uK2AgYCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIHhlKGUpe2lmKCFlKXJldHVybiBudWxsO2xldHtjbGFzczp0LHN0eWxlOm59PWU7cmV0dXJuIHQmJiF5KHQpJiYoZS5jbGFzcz1PKHQpKSxuJiYoZS5zdHlsZT1nZShuKSksZX12YXIgU2U9YGl0ZW1zY29wZSxhbGxvd2Z1bGxzY3JlZW4sZm9ybW5vdmFsaWRhdGUsaXNtYXAsbm9tb2R1bGUsbm92YWxpZGF0ZSxyZWFkb25seWAsQ2U9bihTZSk7U2UrYGA7ZnVuY3Rpb24gd2UoZSl7cmV0dXJuISFlfHxlPT09YGB9ZnVuY3Rpb24gVGUoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2xldCBuPSEwO2ZvcihsZXQgcj0wO24mJnI8ZS5sZW5ndGg7cisrKW49RWUoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBFZShlLHQpe2lmKGU9PT10KXJldHVybiEwO2xldCBuPWcoZSkscj1nKHQpO2lmKG58fHIpcmV0dXJuIG4mJnI/ZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTohMTtpZihuPWIoZSkscj1iKHQpLG58fHIpcmV0dXJuIGU9PT10O2lmKG49cChlKSxyPXAodCksbnx8cilyZXR1cm4gbiYmcj9UZShlLHQpOiExO2lmKG49eChlKSxyPXgodCksbnx8cil7aWYoIW58fCFyfHxPYmplY3Qua2V5cyhlKS5sZW5ndGghPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuIGluIGUpe2xldCByPWUuaGFzT3duUHJvcGVydHkobiksaT10Lmhhc093blByb3BlcnR5KG4pO2lmKHImJiFpfHwhciYmaXx8IUVlKGVbbl0sdFtuXSkpcmV0dXJuITF9fXJldHVybiBTdHJpbmcoZSk9PT1TdHJpbmcodCl9ZnVuY3Rpb24gRGUoZSx0KXtyZXR1cm4gZS5maW5kSW5kZXgoZT0+RWUoZSx0KSl9dmFyIE9lPWU9PiEhKGUmJmUuX192X2lzUmVmPT09ITApLGs9ZT0+eShlKT9lOmU9PW51bGw/YGA6cChlKXx8eChlKSYmKGUudG9TdHJpbmc9PT1DfHwhdihlLnRvU3RyaW5nKSk/T2UoZSk/ayhlLnZhbHVlKTpKU09OLnN0cmluZ2lmeShlLGtlLDIpOlN0cmluZyhlKSxrZT0oZSx0KT0+T2UodCk/a2UoZSx0LnZhbHVlKTptKHQpP3tbYE1hcCgke3Quc2l6ZX0pYF06Wy4uLnQuZW50cmllcygpXS5yZWR1Y2UoKGUsW3Qsbl0scik9PihlW0FlKHQscikrYCA9PmBdPW4sZSkse30pfTpoKHQpP3tbYFNldCgke3Quc2l6ZX0pYF06Wy4uLnQudmFsdWVzKCldLm1hcChlPT5BZShlKSl9OmIodCk/QWUodCk6eCh0KSYmIXAodCkmJiF0ZSh0KT9TdHJpbmcodCk6dCxBZT0oZSx0PWBgKT0+YihlKT9gU3ltYm9sKCR7ZS5kZXNjcmlwdGlvbj8/dH0pYDplO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlPT1udWxsP2Bpbml0aWFsYDp0eXBlb2YgZT09YHN0cmluZ2A/ZT09PWBgP2AgYDplOlN0cmluZyhlKX12YXIgTWUsTmU9Y2xhc3N7Y29uc3RydWN0b3IoZT0hMSl7dGhpcy5kZXRhY2hlZD1lLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9vbj0wLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMuX2lzUGF1c2VkPSExLHRoaXMuX3dhcm5PblJ1bj0hMCx0aGlzLl9fdl9za2lwPSEwLCFlJiZNZSYmKE1lLmFjdGl2ZT8odGhpcy5wYXJlbnQ9TWUsdGhpcy5pbmRleD0oTWUuc2NvcGVzfHwoTWUuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKToodGhpcy5fYWN0aXZlPSExLHRoaXMuX3dhcm5PblJ1bj0hMSkpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXBhdXNlKCl7aWYodGhpcy5fYWN0aXZlKXt0aGlzLl9pc1BhdXNlZD0hMDtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucGF1c2UoKX1mb3IoZT0wLHQ9dGhpcy5lZmZlY3RzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZWZmZWN0c1tlXS5wYXVzZSgpfX1yZXN1bWUoKXtpZih0aGlzLl9hY3RpdmUmJnRoaXMuX2lzUGF1c2VkKXt0aGlzLl9pc1BhdXNlZD0hMTtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucmVzdW1lKCl9bGV0IG49dGhpcy5lZmZlY3RzLnNsaWNlKCk7Zm9yKGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspbltlXS5yZXN1bWUoKX19cnVuKGUpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IHQ9TWU7dHJ5e3JldHVybiBNZT10aGlzLGUoKX1maW5hbGx5e01lPXR9fX1vbigpeysrdGhpcy5fb249PT0xJiYodGhpcy5wcmV2U2NvcGU9TWUsTWU9dGhpcyl9b2ZmKCl7aWYodGhpcy5fb24+MCYmLS10aGlzLl9vbj09PTApe2lmKE1lPT09dGhpcylNZT10aGlzLnByZXZTY29wZTtlbHNle2xldCBlPU1lO2Zvcig7ZTspe2lmKGUucHJldlNjb3BlPT09dGhpcyl7ZS5wcmV2U2NvcGU9dGhpcy5wcmV2U2NvcGU7YnJlYWt9ZT1lLnByZXZTY29wZX19dGhpcy5wcmV2U2NvcGU9dm9pZCAwfX1zdG9wKGUpe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fYWN0aXZlPSExO2xldCB0LG47Zm9yKHQ9MCxuPXRoaXMuZWZmZWN0cy5sZW5ndGg7dDxuO3QrKyl0aGlzLmVmZmVjdHNbdF0uc3RvcCgpO2Zvcih0aGlzLmVmZmVjdHMubGVuZ3RoPTAsdD0wLG49dGhpcy5jbGVhbnVwcy5sZW5ndGg7dDxuO3QrKyl0aGlzLmNsZWFudXBzW3RdKCk7aWYodGhpcy5jbGVhbnVwcy5sZW5ndGg9MCx0aGlzLnNjb3Blcyl7bGV0IGU9dGhpcy5zY29wZXMuc2xpY2UoKTtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnN0b3AoITApO3RoaXMuc2NvcGVzLmxlbmd0aD0wfWlmKCF0aGlzLmRldGFjaGVkJiZ0aGlzLnBhcmVudCYmIWUpe2xldCBlPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtlJiZlIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1lLGUuaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwfX19O2Z1bmN0aW9uIFBlKGUpe3JldHVybiBuZXcgTmUoZSl9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gTWV9ZnVuY3Rpb24gSWUoZSx0PSExKXtNZSYmTWUuY2xlYW51cHMucHVzaChlKX12YXIgTGUsUmU9bmV3IFdlYWtTZXQsemU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5mbj1lLHRoaXMuZGVwcz12b2lkIDAsdGhpcy5kZXBzVGFpbD12b2lkIDAsdGhpcy5mbGFncz01LHRoaXMubmV4dD12b2lkIDAsdGhpcy5jbGVhbnVwPXZvaWQgMCx0aGlzLnNjaGVkdWxlcj12b2lkIDAsTWUmJihNZS5hY3RpdmU/TWUuZWZmZWN0cy5wdXNoKHRoaXMpOnRoaXMuZmxhZ3MmPS0yKX1wYXVzZSgpe3RoaXMuZmxhZ3N8PTY0fXJlc3VtZSgpe3RoaXMuZmxhZ3MmNjQmJih0aGlzLmZsYWdzJj0tNjUsUmUuaGFzKHRoaXMpJiYoUmUuZGVsZXRlKHRoaXMpLHRoaXMudHJpZ2dlcigpKSl9bm90aWZ5KCl7dGhpcy5mbGFncyYyJiYhKHRoaXMuZmxhZ3MmMzIpfHx0aGlzLmZsYWdzJjh8fFVlKHRoaXMpfXJ1bigpe2lmKCEodGhpcy5mbGFncyYxKSlyZXR1cm4gdGhpcy5mbigpO3RoaXMuZmxhZ3N8PTIsaXQodGhpcyksS2UodGhpcyk7bGV0IGU9TGUsdD1ldDtMZT10aGlzLGV0PSEwO3RyeXtyZXR1cm4gdGhpcy5mbigpfWZpbmFsbHl7cWUodGhpcyksTGU9ZSxldD10LHRoaXMuZmxhZ3MmPS0zfX1zdG9wKCl7aWYodGhpcy5mbGFncyYxKXtmb3IobGV0IGU9dGhpcy5kZXBzO2U7ZT1lLm5leHREZXApWGUoZSk7dGhpcy5kZXBzPXRoaXMuZGVwc1RhaWw9dm9pZCAwLGl0KHRoaXMpLHRoaXMub25TdG9wJiZ0aGlzLm9uU3RvcCgpLHRoaXMuZmxhZ3MmPS0yfX10cmlnZ2VyKCl7dGhpcy5mbGFncyY2ND9SZS5hZGQodGhpcyk6dGhpcy5zY2hlZHVsZXI/dGhpcy5zY2hlZHVsZXIoKTp0aGlzLnJ1bklmRGlydHkoKX1ydW5JZkRpcnR5KCl7SmUodGhpcykmJnRoaXMucnVuKCl9Z2V0IGRpcnR5KCl7cmV0dXJuIEplKHRoaXMpfX0sQmU9MCxWZSxIZTtmdW5jdGlvbiBVZShlLHQ9ITEpe2lmKGUuZmxhZ3N8PTgsdCl7ZS5uZXh0PUhlLEhlPWU7cmV0dXJufWUubmV4dD1WZSxWZT1lfWZ1bmN0aW9uIFdlKCl7QmUrK31mdW5jdGlvbiBHZSgpe2lmKC0tQmU+MClyZXR1cm47aWYoSGUpe2xldCBlPUhlO2ZvcihIZT12b2lkIDA7ZTspe2xldCB0PWUubmV4dDtlLm5leHQ9dm9pZCAwLGUuZmxhZ3MmPS05LGU9dH19bGV0IGU7Zm9yKDtWZTspe2xldCB0PVZlO2ZvcihWZT12b2lkIDA7dDspe2xldCBuPXQubmV4dDtpZih0Lm5leHQ9dm9pZCAwLHQuZmxhZ3MmPS05LHQuZmxhZ3MmMSl0cnl7dC50cmlnZ2VyKCl9Y2F0Y2godCl7ZXx8PXR9dD1ufX1pZihlKXRocm93IGV9ZnVuY3Rpb24gS2UoZSl7Zm9yKGxldCB0PWUuZGVwczt0O3Q9dC5uZXh0RGVwKXQudmVyc2lvbj0tMSx0LnByZXZBY3RpdmVMaW5rPXQuZGVwLmFjdGl2ZUxpbmssdC5kZXAuYWN0aXZlTGluaz10fWZ1bmN0aW9uIHFlKGUpe2xldCB0LG49ZS5kZXBzVGFpbCxyPW47Zm9yKDtyOyl7bGV0IGU9ci5wcmV2RGVwO3IudmVyc2lvbj09PS0xPyhyPT09biYmKG49ZSksWGUociksWmUocikpOnQ9cixyLmRlcC5hY3RpdmVMaW5rPXIucHJldkFjdGl2ZUxpbmssci5wcmV2QWN0aXZlTGluaz12b2lkIDAscj1lfWUuZGVwcz10LGUuZGVwc1RhaWw9bn1mdW5jdGlvbiBKZShlKXtmb3IobGV0IHQ9ZS5kZXBzO3Q7dD10Lm5leHREZXApaWYodC5kZXAudmVyc2lvbiE9PXQudmVyc2lvbnx8dC5kZXAuY29tcHV0ZWQmJihZZSh0LmRlcC5jb21wdXRlZCl8fHQuZGVwLnZlcnNpb24hPT10LnZlcnNpb24pKXJldHVybiEwO3JldHVybiEhZS5fZGlydHl9ZnVuY3Rpb24gWWUoZSl7aWYoZS5mbGFncyY0JiYhKGUuZmxhZ3MmMTYpfHwoZS5mbGFncyY9LTE3LGUuZ2xvYmFsVmVyc2lvbj09PWF0KXx8KGUuZ2xvYmFsVmVyc2lvbj1hdCwhZS5pc1NTUiYmZS5mbGFncyYxMjgmJighZS5kZXBzJiYhZS5fZGlydHl8fCFKZShlKSkpKXJldHVybjtlLmZsYWdzfD0yO2xldCB0PWUuZGVwLG49TGUscj1ldDtMZT1lLGV0PSEwO3RyeXtLZShlKTtsZXQgbj1lLmZuKGUuX3ZhbHVlKTsodC52ZXJzaW9uPT09MHx8RChuLGUuX3ZhbHVlKSkmJihlLmZsYWdzfD0xMjgsZS5fdmFsdWU9bix0LnZlcnNpb24rKyl9Y2F0Y2goZSl7dGhyb3cgdC52ZXJzaW9uKyssZX1maW5hbGx5e0xlPW4sZXQ9cixxZShlKSxlLmZsYWdzJj0tM319ZnVuY3Rpb24gWGUoZSx0PSExKXtsZXR7ZGVwOm4scHJldlN1YjpyLG5leHRTdWI6aX09ZTtpZihyJiYoci5uZXh0U3ViPWksZS5wcmV2U3ViPXZvaWQgMCksaSYmKGkucHJldlN1Yj1yLGUubmV4dFN1Yj12b2lkIDApLG4uc3Vicz09PWUmJihuLnN1YnM9ciwhciYmbi5jb21wdXRlZCkpe24uY29tcHV0ZWQuZmxhZ3MmPS01O2ZvcihsZXQgZT1uLmNvbXB1dGVkLmRlcHM7ZTtlPWUubmV4dERlcClYZShlLCEwKX0hdCYmIS0tbi5zYyYmbi5tYXAmJm4ubWFwLmRlbGV0ZShuLmtleSl9ZnVuY3Rpb24gWmUoZSl7bGV0e3ByZXZEZXA6dCxuZXh0RGVwOm59PWU7dCYmKHQubmV4dERlcD1uLGUucHJldkRlcD12b2lkIDApLG4mJihuLnByZXZEZXA9dCxlLm5leHREZXA9dm9pZCAwKX1mdW5jdGlvbiBRZShlLHQpe2UuZWZmZWN0IGluc3RhbmNlb2YgemUmJihlPWUuZWZmZWN0LmZuKTtsZXQgbj1uZXcgemUoZSk7dCYmbChuLHQpO3RyeXtuLnJ1bigpfWNhdGNoKGUpe3Rocm93IG4uc3RvcCgpLGV9bGV0IHI9bi5ydW4uYmluZChuKTtyZXR1cm4gci5lZmZlY3Q9bixyfWZ1bmN0aW9uICRlKGUpe2UuZWZmZWN0LnN0b3AoKX12YXIgZXQ9ITAsdHQ9W107ZnVuY3Rpb24gbnQoKXt0dC5wdXNoKGV0KSxldD0hMX1mdW5jdGlvbiBydCgpe2xldCBlPXR0LnBvcCgpO2V0PWU9PT12b2lkIDB8fGV9ZnVuY3Rpb24gaXQoZSl7bGV0e2NsZWFudXA6dH09ZTtpZihlLmNsZWFudXA9dm9pZCAwLHQpe2xldCBlPUxlO0xlPXZvaWQgMDt0cnl7dCgpfWZpbmFsbHl7TGU9ZX19fXZhciBhdD0wLG90PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zdWI9ZSx0aGlzLmRlcD10LHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5uZXh0RGVwPXRoaXMucHJldkRlcD10aGlzLm5leHRTdWI9dGhpcy5wcmV2U3ViPXRoaXMucHJldkFjdGl2ZUxpbms9dm9pZCAwfX0sc3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jb21wdXRlZD1lLHRoaXMudmVyc2lvbj0wLHRoaXMuYWN0aXZlTGluaz12b2lkIDAsdGhpcy5zdWJzPXZvaWQgMCx0aGlzLm1hcD12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMuc2M9MCx0aGlzLl9fdl9za2lwPSEwfXRyYWNrKGUpe2lmKCFMZXx8IWV0fHxMZT09PXRoaXMuY29tcHV0ZWQpcmV0dXJuO2xldCB0PXRoaXMuYWN0aXZlTGluaztpZih0PT09dm9pZCAwfHx0LnN1YiE9PUxlKXQ9dGhpcy5hY3RpdmVMaW5rPW5ldyBvdChMZSx0aGlzKSxMZS5kZXBzPyh0LnByZXZEZXA9TGUuZGVwc1RhaWwsTGUuZGVwc1RhaWwubmV4dERlcD10LExlLmRlcHNUYWlsPXQpOkxlLmRlcHM9TGUuZGVwc1RhaWw9dCxjdCh0KTtlbHNlIGlmKHQudmVyc2lvbj09PS0xJiYodC52ZXJzaW9uPXRoaXMudmVyc2lvbix0Lm5leHREZXApKXtsZXQgZT10Lm5leHREZXA7ZS5wcmV2RGVwPXQucHJldkRlcCx0LnByZXZEZXAmJih0LnByZXZEZXAubmV4dERlcD1lKSx0LnByZXZEZXA9TGUuZGVwc1RhaWwsdC5uZXh0RGVwPXZvaWQgMCxMZS5kZXBzVGFpbC5uZXh0RGVwPXQsTGUuZGVwc1RhaWw9dCxMZS5kZXBzPT09dCYmKExlLmRlcHM9ZSl9cmV0dXJuIHR9dHJpZ2dlcihlKXt0aGlzLnZlcnNpb24rKyxhdCsrLHRoaXMubm90aWZ5KGUpfW5vdGlmeShlKXtXZSgpO3RyeXtmb3IobGV0IGU9dGhpcy5zdWJzO2U7ZT1lLnByZXZTdWIpZS5zdWIubm90aWZ5KCkmJmUuc3ViLmRlcC5ub3RpZnkoKX1maW5hbGx5e0dlKCl9fX07ZnVuY3Rpb24gY3QoZSl7aWYoZS5kZXAuc2MrKyxlLnN1Yi5mbGFncyY0KXtsZXQgdD1lLmRlcC5jb21wdXRlZDtpZih0JiYhZS5kZXAuc3Vicyl7dC5mbGFnc3w9MjA7Zm9yKGxldCBlPXQuZGVwcztlO2U9ZS5uZXh0RGVwKWN0KGUpfWxldCBuPWUuZGVwLnN1YnM7biE9PWUmJihlLnByZXZTdWI9bixuJiYobi5uZXh0U3ViPWUpKSxlLmRlcC5zdWJzPWV9fXZhciBsdD1uZXcgV2Vha01hcCx1dD1TeW1ib2woYGApLGR0PVN5bWJvbChgYCksZnQ9U3ltYm9sKGBgKTtmdW5jdGlvbiBwdChlLHQsbil7aWYoZXQmJkxlKXtsZXQgdD1sdC5nZXQoZSk7dHx8bHQuc2V0KGUsdD1uZXcgTWFwKTtsZXQgcj10LmdldChuKTtyfHwodC5zZXQobixyPW5ldyBzdCksci5tYXA9dCxyLmtleT1uKSxyLnRyYWNrKCl9fWZ1bmN0aW9uIG10KGUsdCxuLHIsaSxhKXtsZXQgbz1sdC5nZXQoZSk7aWYoIW8pe2F0Kys7cmV0dXJufWxldCBzPWU9PntlJiZlLnRyaWdnZXIoKX07aWYoV2UoKSx0PT09YGNsZWFyYClvLmZvckVhY2gocyk7ZWxzZXtsZXQgaT1wKGUpLGE9aSYmVChuKTtpZihpJiZuPT09YGxlbmd0aGApe2xldCBlPU51bWJlcihyKTtvLmZvckVhY2goKHQsbik9Pnsobj09PWBsZW5ndGhgfHxuPT09ZnR8fCFiKG4pJiZuPj1lKSYmcyh0KX0pfWVsc2Ugc3dpdGNoKChuIT09dm9pZCAwfHxvLmhhcyh2b2lkIDApKSYmcyhvLmdldChuKSksYSYmcyhvLmdldChmdCkpLHQpe2Nhc2VgYWRkYDppP2EmJnMoby5nZXQoYGxlbmd0aGApKToocyhvLmdldCh1dCkpLG0oZSkmJnMoby5nZXQoZHQpKSk7YnJlYWs7Y2FzZWBkZWxldGVgOml8fChzKG8uZ2V0KHV0KSksbShlKSYmcyhvLmdldChkdCkpKTticmVhaztjYXNlYHNldGA6bShlKSYmcyhvLmdldCh1dCkpfX1HZSgpfWZ1bmN0aW9uIGh0KGUsdCl7bGV0IG49bHQuZ2V0KGUpO3JldHVybiBuJiZuLmdldCh0KX1mdW5jdGlvbiBndChlKXtsZXQgdD1BKGUpO3JldHVybiB0PT09ZT90OihwdCh0LGBpdGVyYXRlYCxmdCksYW4oZSk/dDp0Lm1hcChjbikpfWZ1bmN0aW9uIF90KGUpe3JldHVybiBwdChlPUEoZSksYGl0ZXJhdGVgLGZ0KSxlfWZ1bmN0aW9uIHZ0KGUsdCl7cmV0dXJuIHJuKGUpP2xuKG5uKGUpP2NuKHQpOnQpOmNuKHQpfXZhciB5dD17X19wcm90b19fOm51bGwsW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gYnQodGhpcyxTeW1ib2wuaXRlcmF0b3IsZT0+dnQodGhpcyxlKSl9LGNvbmNhdCguLi5lKXtyZXR1cm4gZ3QodGhpcykuY29uY2F0KC4uLmUubWFwKGU9PnAoZSk/Z3QoZSk6ZSkpfSxlbnRyaWVzKCl7cmV0dXJuIGJ0KHRoaXMsYGVudHJpZXNgLGU9PihlWzFdPXZ0KHRoaXMsZVsxXSksZSkpfSxldmVyeShlLHQpe3JldHVybiBTdCh0aGlzLGBldmVyeWAsZSx0LHZvaWQgMCxhcmd1bWVudHMpfSxmaWx0ZXIoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmlsdGVyYCxlLHQsZT0+ZS5tYXAoZT0+dnQodGhpcyxlKSksYXJndW1lbnRzKX0sZmluZChlLHQpe3JldHVybiBTdCh0aGlzLGBmaW5kYCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kSW5kZXgoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmluZEluZGV4YCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGZpbmRMYXN0KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0YCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kTGFzdEluZGV4KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0SW5kZXhgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sZm9yRWFjaChlLHQpe3JldHVybiBTdCh0aGlzLGBmb3JFYWNoYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGluY2x1ZGVzKC4uLmUpe3JldHVybiB3dCh0aGlzLGBpbmNsdWRlc2AsZSl9LGluZGV4T2YoLi4uZSl7cmV0dXJuIHd0KHRoaXMsYGluZGV4T2ZgLGUpfSxqb2luKGUpe3JldHVybiBndCh0aGlzKS5qb2luKGUpfSxsYXN0SW5kZXhPZiguLi5lKXtyZXR1cm4gd3QodGhpcyxgbGFzdEluZGV4T2ZgLGUpfSxtYXAoZSx0KXtyZXR1cm4gU3QodGhpcyxgbWFwYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LHBvcCgpe3JldHVybiBUdCh0aGlzLGBwb3BgKX0scHVzaCguLi5lKXtyZXR1cm4gVHQodGhpcyxgcHVzaGAsZSl9LHJlZHVjZShlLC4uLnQpe3JldHVybiBDdCh0aGlzLGByZWR1Y2VgLGUsdCl9LHJlZHVjZVJpZ2h0KGUsLi4udCl7cmV0dXJuIEN0KHRoaXMsYHJlZHVjZVJpZ2h0YCxlLHQpfSxzaGlmdCgpe3JldHVybiBUdCh0aGlzLGBzaGlmdGApfSxzb21lKGUsdCl7cmV0dXJuIFN0KHRoaXMsYHNvbWVgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sc3BsaWNlKC4uLmUpe3JldHVybiBUdCh0aGlzLGBzcGxpY2VgLGUpfSx0b1JldmVyc2VkKCl7cmV0dXJuIGd0KHRoaXMpLnRvUmV2ZXJzZWQoKX0sdG9Tb3J0ZWQoZSl7cmV0dXJuIGd0KHRoaXMpLnRvU29ydGVkKGUpfSx0b1NwbGljZWQoLi4uZSl7cmV0dXJuIGd0KHRoaXMpLnRvU3BsaWNlZCguLi5lKX0sdW5zaGlmdCguLi5lKXtyZXR1cm4gVHQodGhpcyxgdW5zaGlmdGAsZSl9LHZhbHVlcygpe3JldHVybiBidCh0aGlzLGB2YWx1ZXNgLGU9PnZ0KHRoaXMsZSkpfX07ZnVuY3Rpb24gYnQoZSx0LG4pe2xldCByPV90KGUpLGk9clt0XSgpO3JldHVybiByIT09ZSYmIWFuKGUpJiYoaS5fbmV4dD1pLm5leHQsaS5uZXh0PSgpPT57bGV0IGU9aS5fbmV4dCgpO3JldHVybiBlLmRvbmV8fChlLnZhbHVlPW4oZS52YWx1ZSkpLGV9KSxpfXZhciB4dD1BcnJheS5wcm90b3R5cGU7ZnVuY3Rpb24gU3QoZSx0LG4scixpLGEpe2xldCBvPV90KGUpLHM9byE9PWUmJiFhbihlKSxjPW9bdF07aWYoYyE9PXh0W3RdKXtsZXQgdD1jLmFwcGx5KGUsYSk7cmV0dXJuIHM/Y24odCk6dH1sZXQgbD1uO28hPT1lJiYocz9sPWZ1bmN0aW9uKHQscil7cmV0dXJuIG4uY2FsbCh0aGlzLHZ0KGUsdCkscixlKX06bi5sZW5ndGg+MiYmKGw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCxyLGUpfSkpO2xldCB1PWMuY2FsbChvLGwscik7cmV0dXJuIHMmJmk/aSh1KTp1fWZ1bmN0aW9uIEN0KGUsdCxuLHIpe2xldCBpPV90KGUpLGE9aSE9PWUmJiFhbihlKSxvPW4scz0hMTtpIT09ZSYmKGE/KHM9ci5sZW5ndGg9PT0wLG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBzJiYocz0hMSx0PXZ0KGUsdCkpLG4uY2FsbCh0aGlzLHQsdnQoZSxyKSxpLGUpfSk6bi5sZW5ndGg+MyYmKG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBuLmNhbGwodGhpcyx0LHIsaSxlKX0pKTtsZXQgYz1pW3RdKG8sLi4ucik7cmV0dXJuIHM/dnQoZSxjKTpjfWZ1bmN0aW9uIHd0KGUsdCxuKXtsZXQgcj1BKGUpO3B0KHIsYGl0ZXJhdGVgLGZ0KTtsZXQgaT1yW3RdKC4uLm4pO3JldHVybihpPT09LTF8fGk9PT0hMSkmJm9uKG5bMF0pPyhuWzBdPUEoblswXSksclt0XSguLi5uKSk6aX1mdW5jdGlvbiBUdChlLHQsbj1bXSl7bnQoKSxXZSgpO2xldCByPUEoZSlbdF0uYXBwbHkoZSxuKTtyZXR1cm4gR2UoKSxydCgpLHJ9dmFyIEV0PW4oYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApLER0PW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoZT0+ZSE9PWBhcmd1bWVudHNgJiZlIT09YGNhbGxlcmApLm1hcChlPT5TeW1ib2xbZV0pLmZpbHRlcihiKSk7ZnVuY3Rpb24gT3QoZSl7YihlKXx8KGU9U3RyaW5nKGUpKTtsZXQgdD1BKHRoaXMpO3JldHVybiBwdCh0LGBoYXNgLGUpLHQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGt0PWNsYXNze2NvbnN0cnVjdG9yKGU9ITEsdD0hMSl7dGhpcy5faXNSZWFkb25seT1lLHRoaXMuX2lzU2hhbGxvdz10fWdldChlLHQsbil7aWYodD09PWBfX3Zfc2tpcGApcmV0dXJuIGUuX192X3NraXA7bGV0IHI9dGhpcy5faXNSZWFkb25seSxpPXRoaXMuX2lzU2hhbGxvdztpZih0PT09YF9fdl9pc1JlYWN0aXZlYClyZXR1cm4hcjtpZih0PT09YF9fdl9pc1JlYWRvbmx5YClyZXR1cm4gcjtpZih0PT09YF9fdl9pc1NoYWxsb3dgKXJldHVybiBpO2lmKHQ9PT1gX192X3Jhd2ApcmV0dXJuIG49PT0ocj9pP1l0Okp0Omk/cXQ6S3QpLmdldChlKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pP2U6dm9pZCAwO2xldCBhPXAoZSk7aWYoIXIpe2xldCBlO2lmKGEmJihlPXl0W3RdKSlyZXR1cm4gZTtpZih0PT09YGhhc093blByb3BlcnR5YClyZXR1cm4gT3R9bGV0IG89UmVmbGVjdC5nZXQoZSx0LGooZSk/ZTpuKTtpZigoYih0KT9EdC5oYXModCk6RXQodCkpfHwocnx8cHQoZSxgZ2V0YCx0KSxpKSlyZXR1cm4gbztpZihqKG8pKXtsZXQgZT1hJiZUKHQpP286by52YWx1ZTtyZXR1cm4gciYmeChlKT8kdChlKTplfXJldHVybiB4KG8pP3I/JHQobyk6WnQobyk6b319LEF0PWNsYXNzIGV4dGVuZHMga3R7Y29uc3RydWN0b3IoZT0hMSl7c3VwZXIoITEsZSl9c2V0KGUsdCxuLHIpe2xldCBpPWVbdF0sYT1wKGUpJiZUKHQpO2lmKCF0aGlzLl9pc1NoYWxsb3cpe2xldCBlPXJuKGkpO2lmKCFhbihuKSYmIXJuKG4pJiYoaT1BKGkpLG49QShuKSksIWEmJmooaSkmJiFqKG4pKXJldHVybiBlfHwoaS52YWx1ZT1uKSwhMH1sZXQgbz1hP051bWJlcih0KTxlLmxlbmd0aDpmKGUsdCkscz1SZWZsZWN0LnNldChlLHQsbixqKGUpP2U6cik7cmV0dXJuIGU9PT1BKHIpJiZzJiYobz9EKG4saSkmJm10KGUsYHNldGAsdCxuLGkpOm10KGUsYGFkZGAsdCxuKSksc31kZWxldGVQcm9wZXJ0eShlLHQpe2xldCBuPWYoZSx0KSxyPWVbdF0saT1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsdCk7cmV0dXJuIGkmJm4mJm10KGUsYGRlbGV0ZWAsdCx2b2lkIDAsciksaX1oYXMoZSx0KXtsZXQgbj1SZWZsZWN0LmhhcyhlLHQpO3JldHVybighYih0KXx8IUR0Lmhhcyh0KSkmJnB0KGUsYGhhc2AsdCksbn1vd25LZXlzKGUpe3JldHVybiBwdChlLGBpdGVyYXRlYCxwKGUpP2BsZW5ndGhgOnV0KSxSZWZsZWN0Lm93bktleXMoZSl9fSxqdD1jbGFzcyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKGU9ITEpe3N1cGVyKCEwLGUpfXNldChlLHQpe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KGUsdCl7cmV0dXJuITB9fSxNdD1uZXcgQXQsTnQ9bmV3IGp0LFB0PW5ldyBBdCghMCksRnQ9bmV3IGp0KCEwKSxJdD1lPT5lLEx0PWU9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSk7ZnVuY3Rpb24gUnQoZSx0LG4pe3JldHVybiBmdW5jdGlvbiguLi5yKXtsZXQgaT10aGlzLl9fdl9yYXcsYT1BKGkpLG89bShhKSxzPWU9PT1gZW50cmllc2B8fGU9PT1TeW1ib2wuaXRlcmF0b3ImJm8sYz1lPT09YGtleXNgJiZvLHU9aVtlXSguLi5yKSxkPW4/SXQ6dD9sbjpjbjtyZXR1cm4hdCYmcHQoYSxgaXRlcmF0ZWAsYz9kdDp1dCksbChPYmplY3QuY3JlYXRlKHUpLHtuZXh0KCl7bGV0e3ZhbHVlOmUsZG9uZTp0fT11Lm5leHQoKTtyZXR1cm4gdD97dmFsdWU6ZSxkb25lOnR9Ont2YWx1ZTpzP1tkKGVbMF0pLGQoZVsxXSldOmQoZSksZG9uZTp0fX19KX19ZnVuY3Rpb24genQoZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLnQpe3JldHVybiBlPT09YGRlbGV0ZWA/ITE6ZT09PWBjbGVhcmA/dm9pZCAwOnRoaXN9fWZ1bmN0aW9uIEJ0KGUsdCl7bGV0IG49e2dldChuKXtsZXQgcj10aGlzLl9fdl9yYXcsaT1BKHIpLGE9QShuKTtlfHwoRChuLGEpJiZwdChpLGBnZXRgLG4pLHB0KGksYGdldGAsYSkpO2xldHtoYXM6b309THQoaSkscz10P0l0OmU/bG46Y247aWYoby5jYWxsKGksbikpcmV0dXJuIHMoci5nZXQobikpO2lmKG8uY2FsbChpLGEpKXJldHVybiBzKHIuZ2V0KGEpKTtyIT09aSYmci5nZXQobil9LGdldCBzaXplKCl7bGV0IHQ9dGhpcy5fX3ZfcmF3O3JldHVybiFlJiZwdChBKHQpLGBpdGVyYXRlYCx1dCksdC5zaXplfSxoYXModCl7bGV0IG49dGhpcy5fX3ZfcmF3LHI9QShuKSxpPUEodCk7cmV0dXJuIGV8fChEKHQsaSkmJnB0KHIsYGhhc2AsdCkscHQocixgaGFzYCxpKSksdD09PWk/bi5oYXModCk6bi5oYXModCl8fG4uaGFzKGkpfSxmb3JFYWNoKG4scil7bGV0IGk9dGhpcyxhPWkuX192X3JhdyxvPUEoYSkscz10P0l0OmU/bG46Y247cmV0dXJuIWUmJnB0KG8sYGl0ZXJhdGVgLHV0KSxhLmZvckVhY2goKGUsdCk9Pm4uY2FsbChyLHMoZSkscyh0KSxpKSl9fTtyZXR1cm4gbChuLGU/e2FkZDp6dChgYWRkYCksc2V0Onp0KGBzZXRgKSxkZWxldGU6enQoYGRlbGV0ZWApLGNsZWFyOnp0KGBjbGVhcmApfTp7YWRkKGUpe2xldCBuPUEodGhpcykscj1MdChuKSxpPUEoZSksYT0hdCYmIWFuKGUpJiYhcm4oZSk/aTplO3JldHVybiByLmhhcy5jYWxsKG4sYSl8fEQoZSxhKSYmci5oYXMuY2FsbChuLGUpfHxEKGksYSkmJnIuaGFzLmNhbGwobixpKXx8KG4uYWRkKGEpLG10KG4sYGFkZGAsYSxhKSksdGhpc30sc2V0KGUsbil7IXQmJiFhbihuKSYmIXJuKG4pJiYobj1BKG4pKTtsZXQgcj1BKHRoaXMpLHtoYXM6aSxnZXQ6YX09THQociksbz1pLmNhbGwocixlKTtvfHw9KGU9QShlKSxpLmNhbGwocixlKSk7bGV0IHM9YS5jYWxsKHIsZSk7cmV0dXJuIHIuc2V0KGUsbiksbz9EKG4scykmJm10KHIsYHNldGAsZSxuLHMpOm10KHIsYGFkZGAsZSxuKSx0aGlzfSxkZWxldGUoZSl7bGV0IHQ9QSh0aGlzKSx7aGFzOm4sZ2V0OnJ9PUx0KHQpLGk9bi5jYWxsKHQsZSk7aXx8PShlPUEoZSksbi5jYWxsKHQsZSkpO2xldCBhPXI/ci5jYWxsKHQsZSk6dm9pZCAwLG89dC5kZWxldGUoZSk7cmV0dXJuIGkmJm10KHQsYGRlbGV0ZWAsZSx2b2lkIDAsYSksb30sY2xlYXIoKXtsZXQgZT1BKHRoaXMpLHQ9ZS5zaXplIT09MCxuPWUuY2xlYXIoKTtyZXR1cm4gdCYmbXQoZSxgY2xlYXJgLHZvaWQgMCx2b2lkIDAsdm9pZCAwKSxufX0pLFtga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChyPT57bltyXT1SdChyLGUsdCl9KSxufWZ1bmN0aW9uIFZ0KGUsdCl7bGV0IG49QnQoZSx0KTtyZXR1cm4odCxyLGkpPT5yPT09YF9fdl9pc1JlYWN0aXZlYD8hZTpyPT09YF9fdl9pc1JlYWRvbmx5YD9lOnI9PT1gX192X3Jhd2A/dDpSZWZsZWN0LmdldChmKG4scikmJnIgaW4gdD9uOnQscixpKX12YXIgSHQ9e2dldDpWdCghMSwhMSl9LFV0PXtnZXQ6VnQoITEsITApfSxXdD17Z2V0OlZ0KCEwLCExKX0sR3Q9e2dldDpWdCghMCwhMCl9LEt0PW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLEp0PW5ldyBXZWFrTWFwLFl0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFh0KGUpe3N3aXRjaChlKXtjYXNlYE9iamVjdGA6Y2FzZWBBcnJheWA6cmV0dXJuIDE7Y2FzZWBNYXBgOmNhc2VgU2V0YDpjYXNlYFdlYWtNYXBgOmNhc2VgV2Vha1NldGA6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gWnQoZSl7cmV0dXJuIHJuKGUpP2U6dG4oZSwhMSxNdCxIdCxLdCl9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIHRuKGUsITEsUHQsVXQscXQpfWZ1bmN0aW9uICR0KGUpe3JldHVybiB0bihlLCEwLE50LFd0LEp0KX1mdW5jdGlvbiBlbihlKXtyZXR1cm4gdG4oZSwhMCxGdCxHdCxZdCl9ZnVuY3Rpb24gdG4oZSx0LG4scixpKXtpZigheChlKXx8ZS5fX3ZfcmF3JiYhKHQmJmUuX192X2lzUmVhY3RpdmUpfHxlLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSlyZXR1cm4gZTtsZXQgYT1pLmdldChlKTtpZihhKXJldHVybiBhO2xldCBvPVh0KGVlKGUpKTtpZihvPT09MClyZXR1cm4gZTtsZXQgcz1uZXcgUHJveHkoZSxvPT09Mj9yOm4pO3JldHVybiBpLnNldChlLHMpLHN9ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIHJuKGUpP25uKGUuX192X3Jhdyk6ISEoZSYmZS5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gcm4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZT8hIWUuX192X3JhdzohMX1mdW5jdGlvbiBBKGUpe2xldCB0PWUmJmUuX192X3JhdztyZXR1cm4gdD9BKHQpOmV9ZnVuY3Rpb24gc24oZSl7cmV0dXJuIWYoZSxgX192X3NraXBgKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmdWUoZSxgX192X3NraXBgLCEwKSxlfXZhciBjbj1lPT54KGUpP1p0KGUpOmUsbG49ZT0+eChlKT8kdChlKTplO2Z1bmN0aW9uIGooZSl7cmV0dXJuIGU/ZS5fX3ZfaXNSZWY9PT0hMDohMX1mdW5jdGlvbiBNKGUpe3JldHVybiBkbihlLCExKX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZG4oZSwhMCl9ZnVuY3Rpb24gZG4oZSx0KXtyZXR1cm4gaihlKT9lOm5ldyBmbihlLHQpfXZhciBmbj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVwPW5ldyBzdCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1NoYWxsb3c9ITEsdGhpcy5fcmF3VmFsdWU9dD9lOkEoZSksdGhpcy5fdmFsdWU9dD9lOmNuKGUpLHRoaXMuX192X2lzU2hhbGxvdz10fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLmRlcC50cmFjaygpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShlKXtsZXQgdD10aGlzLl9yYXdWYWx1ZSxuPXRoaXMuX192X2lzU2hhbGxvd3x8YW4oZSl8fHJuKGUpO2U9bj9lOkEoZSksRChlLHQpJiYodGhpcy5fcmF3VmFsdWU9ZSx0aGlzLl92YWx1ZT1uP2U6Y24oZSksdGhpcy5kZXAudHJpZ2dlcigpKX19O2Z1bmN0aW9uIHBuKGUpe2UuZGVwJiZlLmRlcC50cmlnZ2VyKCl9ZnVuY3Rpb24gTihlKXtyZXR1cm4gaihlKT9lLnZhbHVlOmV9ZnVuY3Rpb24gbW4oZSl7cmV0dXJuIHYoZSk/ZSgpOk4oZSl9dmFyIGhuPXtnZXQ6KGUsdCxuKT0+dD09PWBfX3ZfcmF3YD9lOk4oUmVmbGVjdC5nZXQoZSx0LG4pKSxzZXQ6KGUsdCxuLHIpPT57bGV0IGk9ZVt0XTtyZXR1cm4gaihpKSYmIWoobik/KGkudmFsdWU9biwhMCk6UmVmbGVjdC5zZXQoZSx0LG4scil9fTtmdW5jdGlvbiBnbihlKXtyZXR1cm4gbm4oZSk/ZTpuZXcgUHJveHkoZSxobil9dmFyIF9uPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMDtsZXQgdD10aGlzLmRlcD1uZXcgc3Qse2dldDpuLHNldDpyfT1lKHQudHJhY2suYmluZCh0KSx0LnRyaWdnZXIuYmluZCh0KSk7dGhpcy5fZ2V0PW4sdGhpcy5fc2V0PXJ9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldCgpfXNldCB2YWx1ZShlKXt0aGlzLl9zZXQoZSl9fTtmdW5jdGlvbiB2bihlKXtyZXR1cm4gbmV3IF9uKGUpfWZ1bmN0aW9uIHluKGUpe2xldCB0PXAoZSk/QXJyYXkoZS5sZW5ndGgpOnt9O2ZvcihsZXQgbiBpbiBlKXRbbl09Q24oZSxuKTtyZXR1cm4gdH12YXIgYm49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX29iamVjdD1lLHRoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9rZXk9Yih0KT90OlN0cmluZyh0KSx0aGlzLl9yYXc9QShlKTtsZXQgcj0hMCxpPWU7aWYoIXAoZSl8fGIodGhpcy5fa2V5KXx8IVQodGhpcy5fa2V5KSlkbyByPSFvbihpKXx8YW4oaSk7d2hpbGUociYmKGk9aS5fX3ZfcmF3KSk7dGhpcy5fc2hhbGxvdz1yfWdldCB2YWx1ZSgpe2xldCBlPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiB0aGlzLl9zaGFsbG93JiYoZT1OKGUpKSx0aGlzLl92YWx1ZT1lPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTplfXNldCB2YWx1ZShlKXtpZih0aGlzLl9zaGFsbG93JiZqKHRoaXMuX3Jhd1t0aGlzLl9rZXldKSl7bGV0IHQ9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07aWYoaih0KSl7dC52YWx1ZT1lO3JldHVybn19dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09ZX1nZXQgZGVwKCl7cmV0dXJuIGh0KHRoaXMuX3Jhdyx0aGlzLl9rZXkpfX0seG49Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fZ2V0dGVyPWUsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMCx0aGlzLl92YWx1ZT12b2lkIDB9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldHRlcigpfX07ZnVuY3Rpb24gU24oZSx0LG4pe3JldHVybiBqKGUpP2U6dihlKT9uZXcgeG4oZSk6eChlKSYmYXJndW1lbnRzLmxlbmd0aD4xP0NuKGUsdCxuKTpNKGUpfWZ1bmN0aW9uIENuKGUsdCxuKXtyZXR1cm4gbmV3IGJuKGUsdCxuKX12YXIgd249Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZm49ZSx0aGlzLnNldHRlcj10LHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLmRlcD1uZXcgc3QodGhpcyksdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5kZXBzPXZvaWQgMCx0aGlzLmRlcHNUYWlsPXZvaWQgMCx0aGlzLmZsYWdzPTE2LHRoaXMuZ2xvYmFsVmVyc2lvbj1hdC0xLHRoaXMubmV4dD12b2lkIDAsdGhpcy5lZmZlY3Q9dGhpcyx0aGlzLl9fdl9pc1JlYWRvbmx5PSF0LHRoaXMuaXNTU1I9bn1ub3RpZnkoKXtpZih0aGlzLmZsYWdzfD0xNiwhKHRoaXMuZmxhZ3MmOCkmJkxlIT09dGhpcylyZXR1cm4gVWUodGhpcywhMCksITB9Z2V0IHZhbHVlKCl7bGV0IGU9dGhpcy5kZXAudHJhY2soKTtyZXR1cm4gWWUodGhpcyksZSYmKGUudmVyc2lvbj10aGlzLmRlcC52ZXJzaW9uKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5zZXR0ZXImJnRoaXMuc2V0dGVyKGUpfX07ZnVuY3Rpb24gVG4oZSx0LG49ITEpe2xldCByLGk7cmV0dXJuIHYoZSk/cj1lOihyPWUuZ2V0LGk9ZS5zZXQpLG5ldyB3bihyLGksbil9dmFyIEVuPXtHRVQ6YGdldGAsSEFTOmBoYXNgLElURVJBVEU6YGl0ZXJhdGVgfSxEbj17U0VUOmBzZXRgLEFERDpgYWRkYCxERUxFVEU6YGRlbGV0ZWAsQ0xFQVI6YGNsZWFyYH0sT249e30sa249bmV3IFdlYWtNYXAsQW49dm9pZCAwO2Z1bmN0aW9uIGpuKCl7cmV0dXJuIEFufWZ1bmN0aW9uIE1uKGUsdD0hMSxuPUFuKXtpZihuKXtsZXQgdD1rbi5nZXQobik7dHx8a24uc2V0KG4sdD1bXSksdC5wdXNoKGUpfX1mdW5jdGlvbiBObihlLHQsbj1yKXtsZXR7aW1tZWRpYXRlOmksZGVlcDpvLG9uY2U6cyxzY2hlZHVsZXI6YyxhdWdtZW50Sm9iOmwsY2FsbDpkfT1uLGY9ZT0+bz9lOmFuKGUpfHxvPT09ITF8fG89PT0wP1BuKGUsMSk6UG4oZSksbSxoLGcsXyx5PSExLGI9ITE7aWYoaihlKT8oaD0oKT0+ZS52YWx1ZSx5PWFuKGUpKTpubihlKT8oaD0oKT0+ZihlKSx5PSEwKTpwKGUpPyhiPSEwLHk9ZS5zb21lKGU9Pm5uKGUpfHxhbihlKSksaD0oKT0+ZS5tYXAoZT0+e2lmKGooZSkpcmV0dXJuIGUudmFsdWU7aWYobm4oZSkpcmV0dXJuIGYoZSk7aWYodihlKSlyZXR1cm4gZD9kKGUsMik6ZSgpfSkpOmg9dihlKT90P2Q/KCk9PmQoZSwyKTplOigpPT57aWYoZyl7bnQoKTt0cnl7ZygpfWZpbmFsbHl7cnQoKX19bGV0IHQ9QW47QW49bTt0cnl7cmV0dXJuIGQ/ZChlLDMsW19dKTplKF8pfWZpbmFsbHl7QW49dH19OmEsdCYmbyl7bGV0IGU9aCx0PW89PT0hMD8xLzA6bztoPSgpPT5QbihlKCksdCl9bGV0IHg9RmUoKSxTPSgpPT57bS5zdG9wKCkseCYmeC5hY3RpdmUmJnUoeC5lZmZlY3RzLG0pfTtpZihzJiZ0KXtsZXQgZT10O3Q9KC4uLnQpPT57bGV0IG49ZSguLi50KTtyZXR1cm4gUygpLG59fWxldCBDPWI/QXJyYXkoZS5sZW5ndGgpLmZpbGwoT24pOk9uLHc9ZT0+e2lmKCEoIShtLmZsYWdzJjEpfHwhbS5kaXJ0eSYmIWUpKXtpZih0KXtsZXQgbj1tLnJ1bigpO2lmKGV8fG98fHl8fChiP24uc29tZSgoZSx0KT0+RChlLENbdF0pKTpEKG4sQykpKXtnJiZnKCk7bGV0IGU9QW47QW49bTt0cnl7bGV0IGU9W24sQz09PU9uP3ZvaWQgMDpiJiZDWzBdPT09T24/W106QyxfXTtDPW4sZD9kKHQsMyxlKTp0KC4uLmUpfWZpbmFsbHl7QW49ZX19fWVsc2UgbS5ydW4oKX19O3JldHVybiBsJiZsKHcpLG09bmV3IHplKGgpLG0uc2NoZWR1bGVyPWM/KCk9PmModywhMSk6dyxfPWU9Pk1uKGUsITEsbSksZz1tLm9uU3RvcD0oKT0+e2xldCBlPWtuLmdldChtKTtpZihlKXtpZihkKWQoZSw0KTtlbHNlIGZvcihsZXQgdCBvZiBlKXQoKTtrbi5kZWxldGUobSl9fSx0P2k/dyghMCk6Qz1tLnJ1bigpOmM/Yyh3LmJpbmQobnVsbCwhMCksITApOm0ucnVuKCksUy5wYXVzZT1tLnBhdXNlLmJpbmQobSksUy5yZXN1bWU9bS5yZXN1bWUuYmluZChtKSxTLnN0b3A9UyxTfWZ1bmN0aW9uIFBuKGUsdD0xLzAsbil7aWYodDw9MHx8IXgoZSl8fGUuX192X3NraXB8fChufHw9bmV3IE1hcCwobi5nZXQoZSl8fDApPj10KSlyZXR1cm4gZTtpZihuLnNldChlLHQpLHQtLSxqKGUpKVBuKGUudmFsdWUsdCxuKTtlbHNlIGlmKHAoZSkpZm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspUG4oZVtyXSx0LG4pO2Vsc2UgaWYoaChlKXx8bShlKSllLmZvckVhY2goZT0+e1BuKGUsdCxuKX0pO2Vsc2UgaWYodGUoZSkpe2ZvcihsZXQgciBpbiBlKVBuKGVbcl0sdCxuKTtmb3IobGV0IHIgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSlPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmUG4oZVtyXSx0LG4pfXJldHVybiBlfXZhciBGbj1bXTtmdW5jdGlvbiBJbihlKXtGbi5wdXNoKGUpfWZ1bmN0aW9uIExuKCl7Rm4ucG9wKCl9ZnVuY3Rpb24gUm4oZSx0KXt9dmFyIHpuPXtTRVRVUF9GVU5DVElPTjowLDA6YFNFVFVQX0ZVTkNUSU9OYCxSRU5ERVJfRlVOQ1RJT046MSwxOmBSRU5ERVJfRlVOQ1RJT05gLE5BVElWRV9FVkVOVF9IQU5ETEVSOjUsNTpgTkFUSVZFX0VWRU5UX0hBTkRMRVJgLENPTVBPTkVOVF9FVkVOVF9IQU5ETEVSOjYsNjpgQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJgLFZOT0RFX0hPT0s6Nyw3OmBWTk9ERV9IT09LYCxESVJFQ1RJVkVfSE9PSzo4LDg6YERJUkVDVElWRV9IT09LYCxUUkFOU0lUSU9OX0hPT0s6OSw5OmBUUkFOU0lUSU9OX0hPT0tgLEFQUF9FUlJPUl9IQU5ETEVSOjEwLDEwOmBBUFBfRVJST1JfSEFORExFUmAsQVBQX1dBUk5fSEFORExFUjoxMSwxMTpgQVBQX1dBUk5fSEFORExFUmAsRlVOQ1RJT05fUkVGOjEyLDEyOmBGVU5DVElPTl9SRUZgLEFTWU5DX0NPTVBPTkVOVF9MT0FERVI6MTMsMTM6YEFTWU5DX0NPTVBPTkVOVF9MT0FERVJgLFNDSEVEVUxFUjoxNCwxNDpgU0NIRURVTEVSYCxDT01QT05FTlRfVVBEQVRFOjE1LDE1OmBDT01QT05FTlRfVVBEQVRFYCxBUFBfVU5NT1VOVF9DTEVBTlVQOjE2LDE2OmBBUFBfVU5NT1VOVF9DTEVBTlVQYH0sQm49e3NwOmBzZXJ2ZXJQcmVmZXRjaCBob29rYCxiYzpgYmVmb3JlQ3JlYXRlIGhvb2tgLGM6YGNyZWF0ZWQgaG9va2AsYm06YGJlZm9yZU1vdW50IGhvb2tgLG06YG1vdW50ZWQgaG9va2AsYnU6YGJlZm9yZVVwZGF0ZSBob29rYCx1OmB1cGRhdGVkYCxidW06YGJlZm9yZVVubW91bnQgaG9va2AsdW06YHVubW91bnRlZCBob29rYCxhOmBhY3RpdmF0ZWQgaG9va2AsZGE6YGRlYWN0aXZhdGVkIGhvb2tgLGVjOmBlcnJvckNhcHR1cmVkIGhvb2tgLHJ0YzpgcmVuZGVyVHJhY2tlZCBob29rYCxydGc6YHJlbmRlclRyaWdnZXJlZCBob29rYCwwOmBzZXR1cCBmdW5jdGlvbmAsMTpgcmVuZGVyIGZ1bmN0aW9uYCwyOmB3YXRjaGVyIGdldHRlcmAsMzpgd2F0Y2hlciBjYWxsYmFja2AsNDpgd2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uYCw1OmBuYXRpdmUgZXZlbnQgaGFuZGxlcmAsNjpgY29tcG9uZW50IGV2ZW50IGhhbmRsZXJgLDc6YHZub2RlIGhvb2tgLDg6YGRpcmVjdGl2ZSBob29rYCw5OmB0cmFuc2l0aW9uIGhvb2tgLDEwOmBhcHAgZXJyb3JIYW5kbGVyYCwxMTpgYXBwIHdhcm5IYW5kbGVyYCwxMjpgcmVmIGZ1bmN0aW9uYCwxMzpgYXN5bmMgY29tcG9uZW50IGxvYWRlcmAsMTQ6YHNjaGVkdWxlciBmbHVzaGAsMTU6YGNvbXBvbmVudCB1cGRhdGVgLDE2OmBhcHAgdW5tb3VudCBjbGVhbnVwIGZ1bmN0aW9uYH07ZnVuY3Rpb24gVm4oZSx0LG4scil7dHJ5e3JldHVybiByP2UoLi4ucik6ZSgpfWNhdGNoKGUpe1VuKGUsdCxuKX19ZnVuY3Rpb24gSG4oZSx0LG4scil7aWYodihlKSl7bGV0IGk9Vm4oZSx0LG4scik7cmV0dXJuIGkmJlMoaSkmJmkuY2F0Y2goZT0+e1VuKGUsdCxuKX0pLGl9aWYocChlKSl7bGV0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspaS5wdXNoKEhuKGVbYV0sdCxuLHIpKTtyZXR1cm4gaX19ZnVuY3Rpb24gVW4oZSx0LG4saT0hMCl7bGV0IGE9dD90LnZub2RlOm51bGwse2Vycm9ySGFuZGxlcjpvLHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb246c309dCYmdC5hcHBDb250ZXh0LmNvbmZpZ3x8cjtpZih0KXtsZXQgcj10LnBhcmVudCxpPXQucHJveHksYT1gaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSR7bn1gO2Zvcig7cjspe2xldCB0PXIuZWM7aWYodCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXShlLGksYSk9PT0hMSlyZXR1cm59cj1yLnBhcmVudH1pZihvKXtudCgpLFZuKG8sbnVsbCwxMCxbZSxpLGFdKSxydCgpO3JldHVybn19V24oZSxuLGEsaSxzKX1mdW5jdGlvbiBXbihlLHQsbixyPSEwLGk9ITEpe2lmKGkpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBHbj1bXSxLbj0tMSxxbj1bXSxKbj1udWxsLFluPTAsWG49UHJvbWlzZS5yZXNvbHZlKCksWm49bnVsbDtmdW5jdGlvbiBRbihlKXtsZXQgdD1abnx8WG47cmV0dXJuIGU/dC50aGVuKHRoaXM/ZS5iaW5kKHRoaXMpOmUpOnR9ZnVuY3Rpb24gJG4oZSl7bGV0IHQ9S24rMSxuPUduLmxlbmd0aDtmb3IoO3Q8bjspe2xldCByPXQrbj4+PjEsaT1HbltyXSxhPWFyKGkpO2E8ZXx8YT09PWUmJmkuZmxhZ3MmMj90PXIrMTpuPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gZXIoZSl7aWYoIShlLmZsYWdzJjEpKXtsZXQgdD1hcihlKSxuPUduW0duLmxlbmd0aC0xXTshbnx8IShlLmZsYWdzJjIpJiZ0Pj1hcihuKT9Hbi5wdXNoKGUpOkduLnNwbGljZSgkbih0KSwwLGUpLGUuZmxhZ3N8PTEsdHIoKX19ZnVuY3Rpb24gdHIoKXtabnx8PVhuLnRoZW4ob3IpfWZ1bmN0aW9uIG5yKGUpe2lmKCFwKGUpKUpuJiZlLmlkPT09LTE/Sm4uc3BsaWNlKFluKzEsMCxlKTplLmZsYWdzJjF8fChxbi5wdXNoKGUpLGUuZmxhZ3N8PTEpO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspcW4ucHVzaChlW3RdKTt0cigpfWZ1bmN0aW9uIHJyKGUsdCxuPUtuKzEpe2Zvcig7bjxHbi5sZW5ndGg7bisrKXtsZXQgdD1HbltuXTtpZih0JiZ0LmZsYWdzJjIpe2lmKGUmJnQuaWQhPT1lLnVpZCljb250aW51ZTtHbi5zcGxpY2UobiwxKSxuLS0sdC5mbGFncyY0JiYodC5mbGFncyY9LTIpLHQoKSx0LmZsYWdzJjR8fCh0LmZsYWdzJj0tMil9fX1mdW5jdGlvbiBpcihlKXtpZihxbi5sZW5ndGgpe2xldCBlPVsuLi5uZXcgU2V0KHFuKV0uc29ydCgoZSx0KT0+YXIoZSktYXIodCkpO2lmKHFuLmxlbmd0aD0wLEpuKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylKbi5wdXNoKGVbdF0pO3JldHVybn1mb3IoSm49ZSxZbj0wO1luPEpuLmxlbmd0aDtZbisrKXtsZXQgZT1KbltZbl07ZS5mbGFncyY0JiYoZS5mbGFncyY9LTIpLGUuZmxhZ3MmOHx8ZSgpLGUuZmxhZ3MmPS0yfUpuPW51bGwsWW49MH19dmFyIGFyPWU9PmUuaWQ9PW51bGw/ZS5mbGFncyYyPy0xOjEvMDplLmlkO2Z1bmN0aW9uIG9yKGUpe3RyeXtmb3IoS249MDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJiEoZS5mbGFncyY4KSYmKGUuZmxhZ3MmNCYmKGUuZmxhZ3MmPS0yKSxWbihlLGUuaSxlLmk/MTU6MTQpLGUuZmxhZ3MmNHx8KGUuZmxhZ3MmPS0yKSl9fWZpbmFsbHl7Zm9yKDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJihlLmZsYWdzJj0tMil9S249LTEsR24ubGVuZ3RoPTAsaXIoZSksWm49bnVsbCwoR24ubGVuZ3RofHxxbi5sZW5ndGgpJiZvcihlKX19dmFyIHNyLGNyPVtdO2Z1bmN0aW9uIGxyKGUsdCl7c3I9ZSxzcj8oc3IuZW5hYmxlZD0hMCxjci5mb3JFYWNoKCh7ZXZlbnQ6ZSxhcmdzOnR9KT0+c3IuZW1pdChlLC4uLnQpKSxjcj1bXSk6dHlwZW9mIHdpbmRvdzxgdWAmJndpbmRvdy5IVE1MRWxlbWVudCYmISh3aW5kb3cubmF2aWdhdG9yPy51c2VyQWdlbnQpPy5pbmNsdWRlcyhganNkb21gKT8oKHQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz10Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdKS5wdXNoKGU9PntscihlLHQpfSksc2V0VGltZW91dCgoKT0+e3NyfHwodC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsY3I9W10pfSwzZTMpKTpjcj1bXX12YXIgdXI9bnVsbCxkcj1udWxsO2Z1bmN0aW9uIGZyKGUpe2xldCB0PXVyO3JldHVybiB1cj1lLGRyPWUmJmUudHlwZS5fX3Njb3BlSWR8fG51bGwsdH1mdW5jdGlvbiBwcihlKXtkcj1lfWZ1bmN0aW9uIG1yKCl7ZHI9bnVsbH12YXIgaHI9ZT0+UDtmdW5jdGlvbiBQKGUsdD11cixuKXtpZighdHx8ZS5fbilyZXR1cm4gZTtsZXQgcj0oLi4ubik9PntyLl9kJiZtcygtMSk7bGV0IGk9ZnIodCksYT11cy5sZW5ndGgsbzt0cnl7bz1lKC4uLm4pfWZpbmFsbHl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPmE7ZS0tKWZzKCk7ZnIoaSksci5fZCYmbXMoMSl9cmV0dXJuIG99O3JldHVybiByLl9uPSEwLHIuX2M9ITAsci5fZD0hMCxyfWZ1bmN0aW9uIGdyKGUsdCl7aWYodXI9PT1udWxsKXJldHVybiBlO2xldCBuPVFzKHVyKSxpPWUuZGlyc3x8PVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXRbYSxvLHMsYz1yXT10W2VdO2EmJih2KGEpJiYoYT17bW91bnRlZDphLHVwZGF0ZWQ6YX0pLGEuZGVlcCYmUG4obyksaS5wdXNoKHtkaXI6YSxpbnN0YW5jZTpuLHZhbHVlOm8sb2xkVmFsdWU6dm9pZCAwLGFyZzpzLG1vZGlmaWVyczpjfSkpfXJldHVybiBlfWZ1bmN0aW9uIF9yKGUsdCxuLHIpe2xldCBpPWUuZGlycyxhPXQmJnQuZGlycztmb3IobGV0IG89MDtvPGkubGVuZ3RoO28rKyl7bGV0IHM9aVtvXTthJiYocy5vbGRWYWx1ZT1hW29dLnZhbHVlKTtsZXQgYz1zLmRpcltyXTtjJiYobnQoKSxIbihjLG4sOCxbZS5lbCxzLGUsdF0pLHJ0KCkpfX1mdW5jdGlvbiB2cihlLHQpe2lmKFBzKXtsZXQgbj1Qcy5wcm92aWRlcyxyPVBzLnBhcmVudCYmUHMucGFyZW50LnByb3ZpZGVzO3I9PT1uJiYobj1Qcy5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHIpKSxuW2VdPXR9fWZ1bmN0aW9uIHlyKGUsdCxuPSExKXtsZXQgcj1GcygpO2lmKHJ8fG5vKXtsZXQgaT1ubz9uby5fY29udGV4dC5wcm92aWRlczpyP3IucGFyZW50PT1udWxsfHxyLmNlP3Iudm5vZGUuYXBwQ29udGV4dCYmci52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnIucGFyZW50LnByb3ZpZGVzOnZvaWQgMDtpZihpJiZlIGluIGkpcmV0dXJuIGlbZV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBuJiZ2KHQpP3QuY2FsbChyJiZyLnByb3h5KTp0fX1mdW5jdGlvbiBicigpe3JldHVybiEhKEZzKCl8fG5vKX12YXIgeHI9U3ltYm9sLmZvcihgdi1zY3hgKSxTcj0oKT0+eXIoeHIpO2Z1bmN0aW9uIENyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx0KX1mdW5jdGlvbiB3cihlLHQpe3JldHVybiBEcihlLG51bGwse2ZsdXNoOmBwb3N0YH0pfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx7Zmx1c2g6YHN5bmNgfSl9ZnVuY3Rpb24gRXIoZSx0LG4pe3JldHVybiBEcihlLHQsbil9ZnVuY3Rpb24gRHIoZSx0LG49cil7bGV0e2ltbWVkaWF0ZTppLGRlZXA6byxmbHVzaDpzLG9uY2U6Y309bix1PWwoe30sbiksZD10JiZpfHwhdCYmcyE9PWBwb3N0YCxmO2lmKFZzKXtpZihzPT09YHN5bmNgKXtsZXQgZT1TcigpO2Y9ZS5fX3dhdGNoZXJIYW5kbGVzfHw9W119ZWxzZSBpZighZCl7bGV0IGU9KCk9Pnt9O3JldHVybiBlLnN0b3A9YSxlLnJlc3VtZT1hLGUucGF1c2U9YSxlfX1sZXQgcD1Qczt1LmNhbGw9KGUsdCxuKT0+SG4oZSxwLHQsbik7bGV0IG09ITE7cz09PWBwb3N0YD91LnNjaGVkdWxlcj1lPT57SW8oZSxwJiZwLnN1c3BlbnNlKX06cyE9PWBzeW5jYCYmKG09ITAsdS5zY2hlZHVsZXI9KGUsdCk9Pnt0P2UoKTplcihlKX0pLHUuYXVnbWVudEpvYj1lPT57dCYmKGUuZmxhZ3N8PTQpLG0mJihlLmZsYWdzfD0yLHAmJihlLmlkPXAudWlkLGUuaT1wKSl9O2xldCBoPU5uKGUsdCx1KTtyZXR1cm4gVnMmJihmP2YucHVzaChoKTpkJiZoKCkpLGh9ZnVuY3Rpb24gT3IoZSx0LG4pe2xldCByPXRoaXMucHJveHksaT15KGUpP2UuaW5jbHVkZXMoYC5gKT9rcihyLGUpOigpPT5yW2VdOmUuYmluZChyLHIpLGE7dih0KT9hPXQ6KGE9dC5oYW5kbGVyLG49dCk7bGV0IG89UnModGhpcykscz1EcihpLGEuYmluZChyKSxuKTtyZXR1cm4gbygpLHN9ZnVuY3Rpb24ga3IoZSx0KXtsZXQgbj10LnNwbGl0KGAuYCk7cmV0dXJuKCk9PntsZXQgdD1lO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGgmJnQ7ZSsrKXQ9dFtuW2VdXTtyZXR1cm4gdH19dmFyIEFyPW5ldyBXZWFrTWFwLGpyPVN5bWJvbChgX3Z0ZWApLE1yPWU9PmUuX19pc1RlbGVwb3J0LE5yPWU9PmUmJihlLmRpc2FibGVkfHxlLmRpc2FibGVkPT09YGApLFByPWU9PmUmJihlLmRlZmVyfHxlLmRlZmVyPT09YGApLEZyPWU9PnR5cGVvZiBTVkdFbGVtZW50PGB1YCYmZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsSXI9ZT0+dHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50LExyPShlLHQpPT57bGV0IG49ZSYmZS50bztyZXR1cm4geShuKT90P3Qobik6bnVsbDpufSxScj17bmFtZTpgVGVsZXBvcnRgLF9faXNUZWxlcG9ydDohMCxwcm9jZXNzKGUsdCxuLHIsaSxhLG8scyxjLGwpe2xldHttYzp1LHBjOmQscGJjOmYsbzp7aW5zZXJ0OnAscXVlcnlTZWxlY3RvcjptLGNyZWF0ZVRleHQ6aCxjcmVhdGVDb21tZW50OmcscGFyZW50Tm9kZTpffX09bCx2PU5yKHQucHJvcHMpLHtkeW5hbWljQ2hpbGRyZW46eX09dCxiPShlLHQsbik9PntlLnNoYXBlRmxhZyYxNiYmdShlLmNoaWxkcmVuLHQsbixpLGEsbyxzLGMpfSx4PShlPXQpPT57bGV0IG49TnIoZS5wcm9wcykscj1lLnRhcmdldD1McihlLnByb3BzLG0pLGE9VXIocixlLGgscCk7ciYmKG8hPT1gc3ZnYCYmRnIocik/bz1gc3ZnYDpvIT09YG1hdGhtbGAmJklyKHIpJiYobz1gbWF0aG1sYCksaSYmaS5pc0NFJiYoaS5jZS5fdGVsZXBvcnRUYXJnZXRzfHwoaS5jZS5fdGVsZXBvcnRUYXJnZXRzPW5ldyBTZXQpKS5hZGQociksbnx8KGIoZSxyLGEpLEhyKGUsITEpKSl9LFM9ZT0+e2xldCB0PSgpPT57aWYoQXIuZ2V0KGUpPT09dCl7aWYoQXIuZGVsZXRlKGUpLE5yKGUucHJvcHMpKXtsZXQgdD1fKGUuZWwpfHxuO2IoZSx0LGUuYW5jaG9yKSxIcihlLCEwKX14KGUpfX07QXIuc2V0KGUsdCksSW8odCxhKX07aWYoZT09bnVsbCl7bGV0IGU9dC5lbD1oKGBgKSxpPXQuYW5jaG9yPWgoYGApO2lmKHAoZSxuLHIpLHAoaSxuLHIpLFByKHQucHJvcHMpfHxhJiZhLnBlbmRpbmdCcmFuY2gpe1ModCk7cmV0dXJufXYmJihiKHQsbixpKSxIcih0LCEwKSkseCgpfWVsc2V7dC5lbD1lLmVsO2xldCByPXQuYW5jaG9yPWUuYW5jaG9yLHU9QXIuZ2V0KGUpO2lmKHUpe3UuZmxhZ3N8PTgsQXIuZGVsZXRlKGUpLFModCk7cmV0dXJufXQudGFyZ2V0U3RhcnQ9ZS50YXJnZXRTdGFydDtsZXQgcD10LnRhcmdldD1lLnRhcmdldCxoPXQudGFyZ2V0QW5jaG9yPWUudGFyZ2V0QW5jaG9yLGc9TnIoZS5wcm9wcyksXz1nP246cCxiPWc/cjpoO2lmKG89PT1gc3ZnYHx8RnIocCk/bz1gc3ZnYDoobz09PWBtYXRobWxgfHxJcihwKSkmJihvPWBtYXRobWxgKSx5PyhmKGUuZHluYW1pY0NoaWxkcmVuLHksXyxpLGEsbyxzKSxVbyhlLHQsITApKTpjfHxkKGUsdCxfLGIsaSxhLG8scywhMSksdilnP3QucHJvcHMmJmUucHJvcHMmJnQucHJvcHMudG8hPT1lLnByb3BzLnRvJiYodC5wcm9wcy50bz1lLnByb3BzLnRvKTp6cih0LG4scixsLDEpO2Vsc2UgaWYoKHQucHJvcHMmJnQucHJvcHMudG8pIT09KGUucHJvcHMmJmUucHJvcHMudG8pKXtsZXQgZT1Mcih0LnByb3BzLG0pO2UmJih0LnRhcmdldD1lLHpyKHQsZSxudWxsLGwsMCkpfWVsc2UgZyYmenIodCxwLGgsbCwxKTtIcih0LHYpfX0scmVtb3ZlKGUsdCxuLHt1bTpyLG86e3JlbW92ZTppfX0sYSl7bGV0e3NoYXBlRmxhZzpvLGNoaWxkcmVuOnMsYW5jaG9yOmMsdGFyZ2V0U3RhcnQ6bCx0YXJnZXRBbmNob3I6dSx0YXJnZXQ6ZCxwcm9wczpmfT1lLHA9TnIoZiksbT1hfHwhcCxoPUFyLmdldChlKTtpZihoJiYoaC5mbGFnc3w9OCxBci5kZWxldGUoZSkpLGQmJihpKGwpLGkodSkpLGEmJmkoYyksIWgmJihwfHxkKSYmbyYxNilmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IGk9c1tlXTtyKGksdCxuLG0sISFpLmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOnpyLGh5ZHJhdGU6QnJ9O2Z1bmN0aW9uIHpyKGUsdCxuLHtvOntpbnNlcnQ6cn0sbTppfSxhPTIpe2E9PT0wJiZyKGUudGFyZ2V0QW5jaG9yLHQsbik7bGV0e2VsOm8sYW5jaG9yOnMsc2hhcGVGbGFnOmMsY2hpbGRyZW46bCxwcm9wczp1fT1lLGQ9YT09PTI7aWYoZCYmcihvLHQsbiksIUFyLmhhcyhlKSYmKCFkfHxOcih1KSkmJmMmMTYpZm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaShsW2VdLHQsbiwyKTtkJiZyKHMsdCxuKX1mdW5jdGlvbiBCcihlLHQsbixyLGksYSx7bzp7bmV4dFNpYmxpbmc6byxwYXJlbnROb2RlOnMscXVlcnlTZWxlY3RvcjpjLGluc2VydDpsLGNyZWF0ZVRleHQ6dX19LGQpe2Z1bmN0aW9uIGYoZSxuKXtsZXQgcj1uO2Zvcig7cjspe2lmKHImJnIubm9kZVR5cGU9PT04KXtpZihyLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnQgYW5jaG9yYCl0LnRhcmdldFN0YXJ0PXI7ZWxzZSBpZihyLmRhdGE9PT1gdGVsZXBvcnQgYW5jaG9yYCl7dC50YXJnZXRBbmNob3I9cixlLl9scGE9dC50YXJnZXRBbmNob3ImJm8odC50YXJnZXRBbmNob3IpO2JyZWFrfX1yPW8ocil9fWZ1bmN0aW9uIHAoZSx0KXt0LmFuY2hvcj1kKG8oZSksdCxzKGUpLG4scixpLGEpfWxldCBtPXQudGFyZ2V0PUxyKHQucHJvcHMsYyksaD1Ocih0LnByb3BzKTtpZihtKXtsZXQgYz1tLl9scGF8fG0uZmlyc3RDaGlsZDt0LnNoYXBlRmxhZyYxNiYmKGg/KHAoZSx0KSxmKG0sYyksdC50YXJnZXRBbmNob3J8fFVyKG0sdCx1LGwscyhlKT09PW0/ZTpudWxsKSk6KHQuYW5jaG9yPW8oZSksZihtLGMpLHQudGFyZ2V0QW5jaG9yfHxVcihtLHQsdSxsKSxkKGMmJm8oYyksdCxtLG4scixpLGEpKSksSHIodCxoKX1lbHNlIGgmJnQuc2hhcGVGbGFnJjE2JiYocChlLHQpLHQudGFyZ2V0U3RhcnQ9ZSx0LnRhcmdldEFuY2hvcj1vKGUpKTtyZXR1cm4gdC5hbmNob3ImJm8odC5hbmNob3IpfXZhciBWcj1ScjtmdW5jdGlvbiBIcihlLHQpe2xldCBuPWUuY3R4O2lmKG4mJm4udXQpe2xldCByLGk7Zm9yKHQ/KHI9ZS5lbCxpPWUuYW5jaG9yKToocj1lLnRhcmdldFN0YXJ0LGk9ZS50YXJnZXRBbmNob3IpO3ImJnIhPT1pOylyLm5vZGVUeXBlPT09MSYmci5zZXRBdHRyaWJ1dGUoYGRhdGEtdi1vd25lcmAsbi51aWQpLHI9ci5uZXh0U2libGluZztuLnV0KCl9fWZ1bmN0aW9uIFVyKGUsdCxuLHIsaT1udWxsKXtsZXQgYT10LnRhcmdldFN0YXJ0PW4oYGApLG89dC50YXJnZXRBbmNob3I9bihgYCk7cmV0dXJuIGFbanJdPW8sZSYmKHIoYSxlLGkpLHIobyxlLGkpKSxvfXZhciBXcj1TeW1ib2woYF9sZWF2ZUNiYCksR3I9U3ltYm9sKGBfZW50ZXJDYmApO2Z1bmN0aW9uIEtyKCl7bGV0IGU9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIFppKCgpPT57ZS5pc01vdW50ZWQ9ITB9KSxlYSgoKT0+e2UuaXNVbm1vdW50aW5nPSEwfSksZX12YXIgcXI9W0Z1bmN0aW9uLEFycmF5XSxKcj17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpxcixvbkVudGVyOnFyLG9uQWZ0ZXJFbnRlcjpxcixvbkVudGVyQ2FuY2VsbGVkOnFyLG9uQmVmb3JlTGVhdmU6cXIsb25MZWF2ZTpxcixvbkFmdGVyTGVhdmU6cXIsb25MZWF2ZUNhbmNlbGxlZDpxcixvbkJlZm9yZUFwcGVhcjpxcixvbkFwcGVhcjpxcixvbkFmdGVyQXBwZWFyOnFyLG9uQXBwZWFyQ2FuY2VsbGVkOnFyfSxZcj1lPT57bGV0IHQ9ZS5zdWJUcmVlO3JldHVybiB0LmNvbXBvbmVudD9Zcih0LmNvbXBvbmVudCk6dH0sWHI9e25hbWU6YEJhc2VUcmFuc2l0aW9uYCxwcm9wczpKcixzZXR1cChlLHtzbG90czp0fSl7bGV0IG49RnMoKSxyPUtyKCk7cmV0dXJuKCk9PntsZXQgaT10LmRlZmF1bHQmJmlpKHQuZGVmYXVsdCgpLCEwKSxhPWkmJmkubGVuZ3RoP1pyKGkpOm4uc3ViVHJlZT9UcygpOnZvaWQgMDtpZighYSlyZXR1cm47bGV0IG89QShlKSx7bW9kZTpzfT1vO2lmKHIuaXNMZWF2aW5nKXJldHVybiB0aShhKTtsZXQgYz1uaShhKTtpZighYylyZXR1cm4gdGkoYSk7bGV0IGw9ZWkoYyxvLHIsbixlPT5sPWUpO2MudHlwZSE9PWNzJiZyaShjLGwpO2xldCB1PW4uc3ViVHJlZSYmbmkobi5zdWJUcmVlKTtpZih1JiZ1LnR5cGUhPT1jcyYmIV9zKHUsYykmJllyKG4pLnR5cGUhPT1jcyl7bGV0IGU9ZWkodSxvLHIsbik7aWYocmkodSxlKSxzPT09YG91dC1pbmAmJmMudHlwZSE9PWNzKXJldHVybiByLmlzTGVhdmluZz0hMCxlLmFmdGVyTGVhdmU9KCk9PntyLmlzTGVhdmluZz0hMSxuLmpvYi5mbGFncyY4fHxuLnVwZGF0ZSgpLGRlbGV0ZSBlLmFmdGVyTGVhdmUsdT12b2lkIDB9LHRpKGEpO3M9PT1gaW4tb3V0YCYmYy50eXBlIT09Y3M/ZS5kZWxheUxlYXZlPShlLHQsbik9PntsZXQgaT0kcihyLHUpO2lbU3RyaW5nKHUua2V5KV09dSxlW1dyXT0oKT0+e3QoKSxlW1dyXT12b2lkIDAsZGVsZXRlIGwuZGVsYXllZExlYXZlLHU9dm9pZCAwfSxsLmRlbGF5ZWRMZWF2ZT0oKT0+e24oKSxkZWxldGUgbC5kZWxheWVkTGVhdmUsdT12b2lkIDB9fTp1PXZvaWQgMH1lbHNlIHUmJj12b2lkIDA7cmV0dXJuIGF9fX07ZnVuY3Rpb24gWnIoZSl7bGV0IHQ9ZVswXTtpZihlLmxlbmd0aD4xKXtmb3IobGV0IG4gb2YgZSlpZihuLnR5cGUhPT1jcyl7dD1uO2JyZWFrfX1yZXR1cm4gdH12YXIgUXI9WHI7ZnVuY3Rpb24gJHIoZSx0KXtsZXR7bGVhdmluZ1ZOb2RlczpufT1lLHI9bi5nZXQodC50eXBlKTtyZXR1cm4gcnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuLnNldCh0LnR5cGUscikpLHJ9ZnVuY3Rpb24gZWkoZSx0LG4scixpKXtsZXR7YXBwZWFyOmEsbW9kZTpvLHBlcnNpc3RlZDpzPSExLG9uQmVmb3JlRW50ZXI6YyxvbkVudGVyOmwsb25BZnRlckVudGVyOnUsb25FbnRlckNhbmNlbGxlZDpkLG9uQmVmb3JlTGVhdmU6ZixvbkxlYXZlOm0sb25BZnRlckxlYXZlOmgsb25MZWF2ZUNhbmNlbGxlZDpnLG9uQmVmb3JlQXBwZWFyOl8sb25BcHBlYXI6dixvbkFmdGVyQXBwZWFyOnksb25BcHBlYXJDYW5jZWxsZWQ6Yn09dCx4PVN0cmluZyhlLmtleSksUz0kcihuLGUpLEM9KGUsdCk9PntlJiZIbihlLHIsOSx0KX0sdz0oZSx0KT0+e2xldCBuPXRbMV07QyhlLHQpLHAoZSk/ZS5ldmVyeShlPT5lLmxlbmd0aDw9MSkmJm4oKTplLmxlbmd0aDw9MSYmbigpfSxlZT17bW9kZTpvLHBlcnNpc3RlZDpzLGJlZm9yZUVudGVyKHQpe2xldCByPWM7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9X3x8YztlbHNlIHJldHVybn10W1dyXSYmdFtXcl0oITApO2xldCBpPVNbeF07aSYmX3MoZSxpKSYmaS5lbFtXcl0mJmkuZWxbV3JdKCksQyhyLFt0XSl9LGVudGVyKHQpe2lmKFNbeF09PT1lKXJldHVybjtsZXQgcj1sLGk9dSxvPWQ7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9dnx8bCxpPXl8fHUsbz1ifHxkO2Vsc2UgcmV0dXJufWxldCBzPSExO3RbR3JdPWU9PntzfHwocz0hMCxDKGU/bzppLFt0XSksZWUuZGVsYXllZExlYXZlJiZlZS5kZWxheWVkTGVhdmUoKSx0W0dyXT12b2lkIDApfTtsZXQgYz10W0dyXS5iaW5kKG51bGwsITEpO3I/dyhyLFt0LGNdKTpjKCl9LGxlYXZlKHQscil7bGV0IGk9U3RyaW5nKGUua2V5KTtpZih0W0dyXSYmdFtHcl0oITApLG4uaXNVbm1vdW50aW5nKXJldHVybiByKCk7QyhmLFt0XSk7bGV0IGE9ITE7dFtXcl09bj0+e2F8fChhPSEwLHIoKSxDKG4/ZzpoLFt0XSksdFtXcl09dm9pZCAwLFNbaV09PT1lJiZkZWxldGUgU1tpXSl9O2xldCBvPXRbV3JdLmJpbmQobnVsbCwhMSk7U1tpXT1lLG0/dyhtLFt0LG9dKTpvKCl9LGNsb25lKGUpe2xldCBhPWVpKGUsdCxuLHIsaSk7cmV0dXJuIGkmJmkoYSksYX19O3JldHVybiBlZX1mdW5jdGlvbiB0aShlKXtpZih6aShlKSlyZXR1cm4gZT1DcyhlKSxlLmNoaWxkcmVuPW51bGwsZX1mdW5jdGlvbiBuaShlKXtpZighemkoZSkpcmV0dXJuIE1yKGUudHlwZSkmJmUuY2hpbGRyZW4/WnIoZS5jaGlsZHJlbik6ZTtpZihlLmNvbXBvbmVudClyZXR1cm4gZS5jb21wb25lbnQuc3ViVHJlZTtsZXR7c2hhcGVGbGFnOnQsY2hpbGRyZW46bn09ZTtpZihuKXtpZih0JjE2KXJldHVybiBuWzBdO2lmKHQmMzImJnYobi5kZWZhdWx0KSlyZXR1cm4gbi5kZWZhdWx0KCl9fWZ1bmN0aW9uIHJpKGUsdCl7aWYoZS5zaGFwZUZsYWcmNiYmZS5jb21wb25lbnQpe2UudHJhbnNpdGlvbj10O2xldCBuPWUuY29tcG9uZW50LnN1YlRyZWU7cmkoTXIobi50eXBlKSYmbmkobil8fG4sdCl9ZWxzZSBlLnNoYXBlRmxhZyYxMjg/KGUuc3NDb250ZW50LnRyYW5zaXRpb249dC5jbG9uZShlLnNzQ29udGVudCksZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249dC5jbG9uZShlLnNzRmFsbGJhY2spKTplLnRyYW5zaXRpb249dH1mdW5jdGlvbiBpaShlLHQ9ITEsbil7bGV0IHI9W10saT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgbz1lW2FdLHM9bj09bnVsbD9vLmtleTpTdHJpbmcobikrU3RyaW5nKG8ua2V5PT1udWxsP2E6by5rZXkpO28udHlwZT09PUw/KG8ucGF0Y2hGbGFnJjEyOCYmaSsrLHI9ci5jb25jYXQoaWkoby5jaGlsZHJlbix0LHMpKSk6KHR8fG8udHlwZSE9PWNzKSYmci5wdXNoKHM9PW51bGw/bzpDcyhvLHtrZXk6c30pKX1pZihpPjEpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspcltlXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHJ9ZnVuY3Rpb24gRihlLHQpe3JldHVybiB2KGUpP2woe25hbWU6ZS5uYW1lfSx0LHtzZXR1cDplfSk6ZX1mdW5jdGlvbiBhaSgpe2xldCBlPUZzKCk7cmV0dXJuIGU/KGUuYXBwQ29udGV4dC5jb25maWcuaWRQcmVmaXh8fGB2YCkrYC1gK2UuaWRzWzBdK2UuaWRzWzFdKys6YGB9ZnVuY3Rpb24gb2koZSl7ZS5pZHM9W2UuaWRzWzBdK2UuaWRzWzJdKysrYC1gLDAsMF19ZnVuY3Rpb24gc2koZSl7bGV0IHQ9RnMoKSxuPXVuKG51bGwpO2lmKHQpe2xldCBpPXQucmVmcz09PXI/dC5yZWZzPXt9OnQucmVmcztPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxlLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+bi52YWx1ZSxzZXQ6ZT0+bi52YWx1ZT1lfSl9cmV0dXJuIG59ZnVuY3Rpb24gY2koZSx0KXtsZXQgbjtyZXR1cm4hISgobj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkpJiYhbi5jb25maWd1cmFibGUpfXZhciBsaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB1aShlLHQsbixpLGE9ITEpe2lmKHAoZSkpe2UuZm9yRWFjaCgoZSxyKT0+dWkoZSx0JiYocCh0KT90W3JdOnQpLG4saSxhKSk7cmV0dXJufWlmKElpKGkpJiYhYSl7aS5zaGFwZUZsYWcmNTEyJiZpLnR5cGUuX19hc3luY1Jlc29sdmVkJiZpLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCYmdWkoZSx0LG4saS5jb21wb25lbnQuc3ViVHJlZSk7cmV0dXJufWxldCBzPWkuc2hhcGVGbGFnJjQ/UXMoaS5jb21wb25lbnQpOmkuZWwsYz1hP251bGw6cyx7aTpsLHI6ZH09ZSxtPXQmJnQucixoPWwucmVmcz09PXI/bC5yZWZzPXt9OmwucmVmcyxnPWwuc2V0dXBTdGF0ZSxfPUEoZyksYj1nPT09cj9vOmU9PiFjaShoLGUpJiZmKF8sZSkseD0oZSx0KT0+ISh0JiZjaShoLHQpKTtpZihtIT1udWxsJiZtIT09ZCl7aWYoZGkodCkseShtKSloW21dPW51bGwsYihtKSYmKGdbbV09bnVsbCk7ZWxzZSBpZihqKG0pKXtsZXQgZT10O3gobSxlLmspJiYobS52YWx1ZT1udWxsKSxlLmsmJihoW2Uua109bnVsbCl9fWlmKHYoZCkpVm4oZCxsLDEyLFtjLGhdKTtlbHNle2xldCB0PXkoZCkscj1qKGQpO2lmKHR8fHIpe2xldCBpPSgpPT57aWYoZS5mKXtsZXQgbj10P2IoZCk/Z1tkXTpoW2RdOngoZCl8fCFlLms/ZC52YWx1ZTpoW2Uua107aWYoYSlwKG4pJiZ1KG4scyk7ZWxzZSBpZihwKG4pKW4uaW5jbHVkZXMocyl8fG4ucHVzaChzKTtlbHNlIGlmKHQpaFtkXT1bc10sYihkKSYmKGdbZF09aFtkXSk7ZWxzZXtsZXQgdD1bc107eChkLGUuaykmJihkLnZhbHVlPXQpLGUuayYmKGhbZS5rXT10KX19ZWxzZSB0PyhoW2RdPWMsYihkKSYmKGdbZF09YykpOnImJih4KGQsZS5rKSYmKGQudmFsdWU9YyksZS5rJiYoaFtlLmtdPWMpKX07aWYoYyl7bGV0IHQ9KCk9PntpKCksbGkuZGVsZXRlKGUpfTt0LmlkPS0xLGxpLnNldChlLHQpLElvKHQsbil9ZWxzZSBkaShlKSxpKCl9fX1mdW5jdGlvbiBkaShlKXtsZXQgdD1saS5nZXQoZSk7dCYmKHQuZmxhZ3N8PTgsbGkuZGVsZXRlKGUpKX12YXIgZmk9ITEscGk9KCk9PntmaXx8PShjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApLCEwKX0sbWk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYHN2Z2ApJiZlLnRhZ05hbWUhPT1gZm9yZWlnbk9iamVjdGAsaGk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApLGdpPWU9PntpZihlLm5vZGVUeXBlPT09MSl7aWYobWkoZSkpcmV0dXJuYHN2Z2A7aWYoaGkoZSkpcmV0dXJuYG1hdGhtbGB9fSxfaT1lPT5lLm5vZGVUeXBlPT09ODtmdW5jdGlvbiB2aShlKXtsZXR7bXQ6dCxwOm4sbzp7cGF0Y2hQcm9wOnIsY3JlYXRlVGV4dDppLG5leHRTaWJsaW5nOmEscGFyZW50Tm9kZTpvLHJlbW92ZTpjLGluc2VydDpsLGNyZWF0ZUNvbW1lbnQ6dX19PWUsZD0oZSx0KT0+e2lmKCF0Lmhhc0NoaWxkTm9kZXMoKSl7bihudWxsLGUsdCksaXIoKSx0Ll92bm9kZT1lO3JldHVybn1mKHQuZmlyc3RDaGlsZCxlLG51bGwsbnVsbCxudWxsKSxpcigpLHQuX3Zub2RlPWV9LGY9KG4scixzLGMsdSxkPSExKT0+e2R8fD0hIXIuZHluYW1pY0NoaWxkcmVuO2xldCBiPV9pKG4pJiZuLmRhdGE9PT1gW2AseD0oKT0+ZyhuLHIscyxjLHUsYikse3R5cGU6UyxyZWY6QyxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6ZWV9PXIsdGU9bi5ub2RlVHlwZTtyLmVsPW4sZWU9PT0tMiYmKGQ9ITEsci5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0IFQ9bnVsbDtzd2l0Y2goUyl7Y2FzZSBzczp0ZT09PTM/KG4uZGF0YSE9PXIuY2hpbGRyZW4mJihwaSgpLG4uZGF0YT1yLmNoaWxkcmVuKSxUPWEobikpOnIuY2hpbGRyZW49PT1gYD8obChyLmVsPWkoYGApLG8obiksbiksVD1uKTpUPXgoKTticmVhaztjYXNlIGNzOnkobik/KFQ9YShuKSx2KHIuZWw9bi5jb250ZW50LmZpcnN0Q2hpbGQsbixzKSk6VD10ZSE9PTh8fGI/eCgpOmEobik7YnJlYWs7Y2FzZSBsczppZihiJiYobj1hKG4pLHRlPW4ubm9kZVR5cGUpLHRlPT09MXx8dGU9PT0zKXtUPW47bGV0IGU9IXIuY2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8ci5zdGF0aWNDb3VudDt0KyspZSYmKHIuY2hpbGRyZW4rPVQubm9kZVR5cGU9PT0xP1Qub3V0ZXJIVE1MOlQuZGF0YSksdD09PXIuc3RhdGljQ291bnQtMSYmKHIuYW5jaG9yPVQpLFQ9YShUKTtyZXR1cm4gYj9hKFQpOlR9eCgpO2JyZWFrO2Nhc2UgTDpUPWI/aChuLHIscyxjLHUsZCk6eCgpO2JyZWFrO2RlZmF1bHQ6aWYodyYxKVQ9KHRlIT09MXx8ci50eXBlLnRvTG93ZXJDYXNlKCkhPT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkmJiF5KG4pP3goKTpwKG4scixzLGMsdSxkKTtlbHNlIGlmKHcmNil7ci5zbG90U2NvcGVJZHM9dTtsZXQgZT1vKG4pO2lmKFQ9Yj9fKG4pOl9pKG4pJiZuLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnRgP18obixuLmRhdGEsYHRlbGVwb3J0IGVuZGApOmEobiksdChyLGUsbnVsbCxzLGMsZ2koZSksZCksSWkocikmJiFyLnR5cGUuX19hc3luY1Jlc29sdmVkKXtsZXQgdDtiPyh0PUgoTCksdC5hbmNob3I9VD9ULnByZXZpb3VzU2libGluZzplLmxhc3RDaGlsZCk6dD1uLm5vZGVUeXBlPT09Mz9VKGBgKTpIKGBkaXZgKSx0LmVsPW4sci5jb21wb25lbnQuc3ViVHJlZT10fX1lbHNlIHcmNjQ/VD10ZT09PTg/ci50eXBlLmh5ZHJhdGUobixyLHMsYyx1LGQsZSxtKTp4KCk6dyYxMjgmJihUPXIudHlwZS5oeWRyYXRlKG4scixzLGMsZ2kobyhuKSksdSxkLGUsZikpfXJldHVybiBDIT1udWxsJiZ1aShDLG51bGwsYyxyKSxUfSxwPShlLHQsbixpLGEsbyk9PntvfHw9ISF0LmR5bmFtaWNDaGlsZHJlbjtsZXR7dHlwZTpsLGR5bmFtaWNQcm9wczp1LHByb3BzOmQscGF0Y2hGbGFnOmYsc2hhcGVGbGFnOnAsZGlyczpoLHRyYW5zaXRpb246Z309dCxfPWw9PT1gaW5wdXRgfHxsPT09YG9wdGlvbmAsYj0hIXU7aWYoX3x8Ynx8ZiE9PS0xKXtoJiZfcih0LG51bGwsbixgY3JlYXRlZGApO2xldCBsPSExO2lmKHkoZSkpe2w9SG8obnVsbCxnKSYmbiYmbi52bm9kZS5wcm9wcyYmbi52bm9kZS5wcm9wcy5hcHBlYXI7bGV0IHI9ZS5jb250ZW50LmZpcnN0Q2hpbGQ7aWYobCl7bGV0IGU9ci5nZXRBdHRyaWJ1dGUoYGNsYXNzYCk7ZSYmKHIuJGNscz1lKSxnLmJlZm9yZUVudGVyKHIpfXYocixlLG4pLHQuZWw9ZT1yfWlmKHAmMTYmJiEoZCYmKGQuaW5uZXJIVE1MfHxkLnRleHRDb250ZW50KSkpe2xldCByPW0oZS5maXJzdENoaWxkLHQsZSxuLGksYSxvKTtmb3IociYmIUNpKGUsMSkmJnBpKCk7cjspe2xldCBlPXI7cj1yLm5leHRTaWJsaW5nLGMoZSl9fWVsc2UgaWYocCY4KXtsZXQgbj10LmNoaWxkcmVuO25bMF09PT1gCmAmJihlLnRhZ05hbWU9PT1gUFJFYHx8ZS50YWdOYW1lPT09YFRFWFRBUkVBYCkmJihuPW4uc2xpY2UoMSkpO2xldHt0ZXh0Q29udGVudDpyfT1lO3IhPT1uJiZyIT09bi5yZXBsYWNlKC9cclxufFxyL2csYApgKSYmKENpKGUsMCl8fHBpKCksZS50ZXh0Q29udGVudD10LmNoaWxkcmVuKX1pZihkKXtpZihffHxifHwhb3x8ZiY0OCl7bGV0IHQ9ZS50YWdOYW1lLmluY2x1ZGVzKGAtYCksaT1lLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhgc3ZnYCk/YHN2Z2A6ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApP2BtYXRobWxgOnZvaWQgMDtmb3IobGV0IGEgaW4gZClpZihfJiYoYS5lbmRzV2l0aChgdmFsdWVgKXx8YT09PWBpbmRldGVybWluYXRlYCl8fHMoYSkmJiFuZShhKXx8YVswXT09PWAuYHx8dCYmIW5lKGEpfHx1JiZ1LmluY2x1ZGVzKGEpKXtpZihiaShlLGEsZFthXSkpY29udGludWU7cihlLGEsbnVsbCxkW2FdLGksbil9fWVsc2UgaWYoZC5vbkNsaWNrKXIoZSxgb25DbGlja2AsbnVsbCxkLm9uQ2xpY2ssdm9pZCAwLG4pO2Vsc2UgaWYoZiY0JiZubihkLnN0eWxlKSlmb3IobGV0IGUgaW4gZC5zdHlsZSlkLnN0eWxlW2VdfWxldCB4Oyh4PWQmJmQub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoeCxuLHQpLGgmJl9yKHQsbnVsbCxuLGBiZWZvcmVNb3VudGApLCgoeD1kJiZkLm9uVm5vZGVNb3VudGVkKXx8aHx8bCkmJmlzKCgpPT57eCYmQXMoeCxuLHQpLGwmJmcuZW50ZXIoZSksaCYmX3IodCxudWxsLG4sYG1vdW50ZWRgKX0saSl9cmV0dXJuIGUubmV4dFNpYmxpbmd9LG09KGUsdCxyLG8scyxjLHUpPT57dXx8PSEhdC5keW5hbWljQ2hpbGRyZW47bGV0IGQ9dC5jaGlsZHJlbixwPWQubGVuZ3RoLG09ITE7Zm9yKGxldCB0PTA7dDxwO3QrKyl7bGV0IGg9dT9kW3RdOmRbdF09RXMoZFt0XSksZz1oLnR5cGU9PT1zcztlPyhnJiYhdSYmdCsxPHAmJkVzKGRbdCsxXSkudHlwZT09PXNzJiYobChpKGUuZGF0YS5zbGljZShoLmNoaWxkcmVuLmxlbmd0aCkpLHIsYShlKSksZS5kYXRhPWguY2hpbGRyZW4pLGU9ZihlLGgsbyxzLGMsdSkpOmcmJiFoLmNoaWxkcmVuP2woaC5lbD1pKGBgKSxyKToobXx8KG09ITAsQ2kociwxKXx8cGkoKSksbihudWxsLGgscixudWxsLG8scyxnaShyKSxjKSl9cmV0dXJuIGV9LGg9KGUsdCxuLHIsaSxzKT0+e2xldHtzbG90U2NvcGVJZHM6Y309dDtjJiYoaT1pP2kuY29uY2F0KGMpOmMpO2xldCBkPW8oZSksZj1tKGEoZSksdCxkLG4scixpLHMpO3JldHVybiBmJiZfaShmKSYmZi5kYXRhPT09YF1gP2EodC5hbmNob3I9Zik6KHBpKCksbCh0LmFuY2hvcj11KGBdYCksZCxmKSxmKX0sZz0oZSx0LHIsaSxzLGwpPT57aWYoVGkoZSx0KXx8cGkoKSx0LmVsPW51bGwsbCl7bGV0IHQ9XyhlKTtmb3IoOzspe2xldCBuPWEoZSk7aWYobiYmbiE9PXQpYyhuKTtlbHNlIGJyZWFrfX1sZXQgdT1hKGUpLGQ9byhlKTtyZXR1cm4gYyhlKSxuKG51bGwsdCxkLHUscixpLGdpKGQpLHMpLHImJihyLnZub2RlLmVsPXQuZWwsX28ocix0LmVsKSksdX0sXz0oZSx0PWBbYCxuPWBdYCk9PntsZXQgcj0wO2Zvcig7ZTspaWYoZT1hKGUpLGUmJl9pKGUpJiYoZS5kYXRhPT09dCYmcisrLGUuZGF0YT09PW4pKXtpZihyPT09MClyZXR1cm4gYShlKTtyLS19cmV0dXJuIGV9LHY9KGUsdCxuKT0+e2xldCByPXQucGFyZW50Tm9kZTtyJiZyLnJlcGxhY2VDaGlsZChlLHQpO2xldCBpPW47Zm9yKDtpOylpLnZub2RlLmVsPT09dCYmKGkudm5vZGUuZWw9aS5zdWJUcmVlLmVsPWUpLGk9aS5wYXJlbnR9LHk9ZT0+ZS5ub2RlVHlwZT09PTEmJmUudGFnTmFtZT09PWBURU1QTEFURWA7cmV0dXJuW2QsZl19dmFyIHlpPW5ldyBTZXQoW2BzcmNgLGBzcmNzZXRgLGBocmVmYCxgcG9zdGVyYF0pO2Z1bmN0aW9uIGJpKGUsdCxuKXtyZXR1cm4geWkuaGFzKHQpP2UuZ2V0QXR0cmlidXRlKHQpPT09KG49PW51bGw/bnVsbDpgJHtufWApOiExfXZhciB4aT1gZGF0YS1hbGxvdy1taXNtYXRjaGAsU2k9ezA6YHRleHRgLDE6YGNoaWxkcmVuYCwyOmBjbGFzc2AsMzpgc3R5bGVgLDQ6YGF0dHJpYnV0ZWB9O2Z1bmN0aW9uIENpKGUsdCl7aWYodD09PTB8fHQ9PT0xKWZvcig7ZSYmIWUuaGFzQXR0cmlidXRlKHhpKTspZT1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIHdpKGUmJmUuZ2V0QXR0cmlidXRlKHhpKSx0KX1mdW5jdGlvbiB3aShlLHQpe2lmKGU9PW51bGwpcmV0dXJuITE7aWYoZT09PWBgKXJldHVybiEwO3tsZXQgbj1lLnNwbGl0KGAsYCk7cmV0dXJuIHQ9PT0wJiZuLmluY2x1ZGVzKGBjaGlsZHJlbmApPyEwOm4uaW5jbHVkZXMoU2lbdF0pfX1mdW5jdGlvbiBUaShlLHQpe3JldHVybiBDaShlLnBhcmVudEVsZW1lbnQsMSl8fEVpKGUpfHxEaSh0KX1mdW5jdGlvbiBFaShlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTEmJndpKGUuZ2V0QXR0cmlidXRlKHhpKSwxKX1mdW5jdGlvbiBEaSh7cHJvcHM6ZX0pe2xldCB0PWUmJmVbeGldO3JldHVybiB0eXBlb2YgdD09YHN0cmluZ2AmJndpKHQsMSl9dmFyIE9pPW1lKCkucmVxdWVzdElkbGVDYWxsYmFja3x8KGU9PnNldFRpbWVvdXQoZSwxKSksa2k9bWUoKS5jYW5jZWxJZGxlQ2FsbGJhY2t8fChlPT5jbGVhclRpbWVvdXQoZSkpLEFpPShlPTFlNCk9PnQ9PntsZXQgbj1PaSh0LHt0aW1lb3V0OmV9KTtyZXR1cm4oKT0+a2kobil9O2Z1bmN0aW9uIGppKGUpe2xldHt0b3A6dCxsZWZ0Om4sYm90dG9tOnIscmlnaHQ6aX09ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7aW5uZXJIZWlnaHQ6YSxpbm5lcldpZHRoOm99PXdpbmRvdztyZXR1cm4odD4wJiZ0PGF8fHI+MCYmcjxhKSYmKG4+MCYmbjxvfHxpPjAmJmk8byl9dmFyIE1pPWU9Pih0LG4pPT57bGV0IHI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGU9Pntmb3IobGV0IG4gb2YgZSlpZihuLmlzSW50ZXJzZWN0aW5nKXtyLmRpc2Nvbm5lY3QoKSx0KCk7YnJlYWt9fSxlKTtyZXR1cm4gbihlPT57aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpe2lmKGppKGUpKXJldHVybiB0KCksci5kaXNjb25uZWN0KCksITE7ci5vYnNlcnZlKGUpfX0pLCgpPT5yLmRpc2Nvbm5lY3QoKX0sTmk9ZT0+dD0+e2lmKGUpe2xldCBuPW1hdGNoTWVkaWEoZSk7aWYobi5tYXRjaGVzKXQoKTtlbHNlIHJldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCx7b25jZTohMH0pLCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCl9fSxQaT0oZT1bXSk9Pih0LG4pPT57eShlKSYmKGU9W2VdKTtsZXQgcj0hMSxpPWU9PntyfHwocj0hMCxhKCksdCgpLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLGUpKSl9LGE9KCk9PntuKHQ9Pntmb3IobGV0IG4gb2YgZSl0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpKX0pfTtyZXR1cm4gbih0PT57Zm9yKGxldCBuIG9mIGUpdC5hZGRFdmVudExpc3RlbmVyKG4saSx7b25jZTohMH0pfSksYX07ZnVuY3Rpb24gRmkoZSx0KXtpZihfaShlKSYmZS5kYXRhPT09YFtgKXtsZXQgbj0xLHI9ZS5uZXh0U2libGluZztmb3IoO3I7KXtpZihyLm5vZGVUeXBlPT09MSl7aWYodChyKT09PSExKWJyZWFrfWVsc2UgaWYoX2kocikpe2lmKHIuZGF0YT09PWBdYCl7aWYoLS1uPT09MClicmVha31lbHNlIHIuZGF0YT09PWBbYCYmbisrfXI9ci5uZXh0U2libGluZ319ZWxzZSB0KGUpfXZhciBJaT1lPT4hIWUudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIExpKGUpe3YoZSkmJihlPXtsb2FkZXI6ZX0pO2xldHtsb2FkZXI6dCxsb2FkaW5nQ29tcG9uZW50Om4sZXJyb3JDb21wb25lbnQ6cixkZWxheTppPTIwMCxoeWRyYXRlOmEsdGltZW91dDpvLHN1c3BlbnNpYmxlOnM9ITAsb25FcnJvcjpjfT1lLGw9bnVsbCx1LGQ9MCxmPSgpPT4oZCsrLGw9bnVsbCxwKCkpLHA9KCk9PntsZXQgZTtyZXR1cm4gbHx8KGU9bD10KCkuY2F0Y2goZT0+e2lmKGU9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKSxjKXJldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2MoZSwoKT0+dChmKCkpLCgpPT5uKGUpLGQrMSl9KTt0aHJvdyBlfSkudGhlbih0PT5lIT09bCYmbD9sOih0JiYodC5fX2VzTW9kdWxlfHx0W1N5bWJvbC50b1N0cmluZ1RhZ109PT1gTW9kdWxlYCkmJih0PXQuZGVmYXVsdCksdT10LHQpKSl9O3JldHVybiBGKHtuYW1lOmBBc3luY0NvbXBvbmVudFdyYXBwZXJgLF9fYXN5bmNMb2FkZXI6cCxfX2FzeW5jSHlkcmF0ZShlLHQsbil7bGV0IHI9ZS5pc0Nvbm5lY3RlZCxpPSExOyh0LmJ1fHw9W10pLnB1c2goKCk9Pmk9ITApO2xldCBvPSgpPT57aXx8IWUucGFyZW50Tm9kZXx8ciYmIWUuaXNDb25uZWN0ZWR8fG4oKX0scz1hPygpPT57bGV0IG49YShvLHQ9PkZpKGUsdCkpO24mJih0LmJ1bXx8PVtdKS5wdXNoKG4pfTpvO3U/cygpOnAoKS50aGVuKCgpPT4hdC5pc1VubW91bnRlZCYmcygpKX0sZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiB1fSxzZXR1cCgpe2xldCBlPVBzO2lmKG9pKGUpLHUpcmV0dXJuKCk9PlJpKHUsZSk7bGV0IHQ9dD0+e2w9bnVsbCxVbih0LGUsMTMsIXIpfTtpZihzJiZlLnN1c3BlbnNlfHxWcylyZXR1cm4gcCgpLnRoZW4odD0+KCk9PlJpKHQsZSkpLmNhdGNoKGU9Pih0KGUpLCgpPT5yP0gocix7ZXJyb3I6ZX0pOm51bGwpKTtsZXQgYT1NKCExKSxjPU0oKSxkPU0oISFpKSxmLG07cmV0dXJuIHRhKCgpPT57ZiE9bnVsbCYmY2xlYXJUaW1lb3V0KGYpLG0hPW51bGwmJmNsZWFyVGltZW91dChtKX0pLGkmJihtPXNldFRpbWVvdXQoKCk9PntlLmlzVW5tb3VudGVkfHwoZC52YWx1ZT0hMSl9LGkpKSxvIT1udWxsJiYoZj1zZXRUaW1lb3V0KCgpPT57aWYoIWUuaXNVbm1vdW50ZWQmJiFhLnZhbHVlJiYhYy52YWx1ZSl7bGV0IGU9RXJyb3IoYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHtvfW1zLmApO3QoZSksYy52YWx1ZT1lfX0sbykpLHAoKS50aGVuKCgpPT57ZS5pc1VubW91bnRlZHx8KGEudmFsdWU9ITAsZS5wYXJlbnQmJnppKGUucGFyZW50LnZub2RlKSYmZS5wYXJlbnQudXBkYXRlKCkpfSkuY2F0Y2gobj0+e2lmKGUuaXNVbm1vdW50ZWQpe2w9bnVsbDtyZXR1cm59dChuKSxjLnZhbHVlPW59KSwoKT0+e2lmKGEudmFsdWUmJnUpcmV0dXJuIFJpKHUsZSk7aWYoYy52YWx1ZSYmcilyZXR1cm4gSChyLHtlcnJvcjpjLnZhbHVlfSk7aWYobiYmIWQudmFsdWUpcmV0dXJuIFJpKG4sZSl9fX0pfWZ1bmN0aW9uIFJpKGUsdCl7bGV0e3JlZjpuLHByb3BzOnIsY2hpbGRyZW46aSxjZTphfT10LnZub2RlLG89SChlLHIsaSk7cmV0dXJuIG8ucmVmPW4sby5jZT1hLGRlbGV0ZSB0LnZub2RlLmNlLG99dmFyIHppPWU9PmUudHlwZS5fX2lzS2VlcEFsaXZlLEJpPXtuYW1lOmBLZWVwQWxpdmVgLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9bi5jdHg7aWYoIXIucmVuZGVyZXIpcmV0dXJuKCk9PntsZXQgZT10LmRlZmF1bHQmJnQuZGVmYXVsdCgpO3JldHVybiBlJiZlLmxlbmd0aD09PTE/ZVswXTplfTtsZXQgaT1uZXcgTWFwLGE9bmV3IFNldCxvPW51bGwscz1uLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpjLG06bCx1bTp1LG86e2NyZWF0ZUVsZW1lbnQ6ZH19fT1yLGY9ZChgZGl2YCk7ci5hY3RpdmF0ZT0oZSx0LG4scixpKT0+e2xldCBhPWUuY29tcG9uZW50O2woZSx0LG4sMCxzKSxjKGEudm5vZGUsZSx0LG4sYSxzLHIsZS5zbG90U2NvcGVJZHMsaSksSW8oKCk9PnthLmlzRGVhY3RpdmF0ZWQ9ITEsYS5hJiZsZShhLmEpO2xldCB0PWUucHJvcHMmJmUucHJvcHMub25Wbm9kZU1vdW50ZWQ7dCYmQXModCxhLnBhcmVudCxlKX0scyl9LHIuZGVhY3RpdmF0ZT1lPT57bGV0IHQ9ZS5jb21wb25lbnQ7S28odC5tKSxLbyh0LmEpLGwoZSxmLG51bGwsMSxzKSxJbygoKT0+e3QuZGEmJmxlKHQuZGEpO2xldCBuPWUucHJvcHMmJmUucHJvcHMub25Wbm9kZVVubW91bnRlZDtuJiZBcyhuLHQucGFyZW50LGUpLHQuaXNEZWFjdGl2YXRlZD0hMH0scyl9O2Z1bmN0aW9uIHAoZSl7S2koZSksdShlLG4scywhMCl9ZnVuY3Rpb24gbShlKXtpLmZvckVhY2goKHQsbik9PntsZXQgcj0kcyhJaSh0KT90LnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTp0LnR5cGUpO3ImJiFlKHIpJiZoKG4pfSl9ZnVuY3Rpb24gaChlKXtsZXQgdD1pLmdldChlKTt0JiYoIW98fCFfcyh0LG8pKT9wKHQpOm8mJktpKG8pLGkuZGVsZXRlKGUpLGEuZGVsZXRlKGUpfUVyKCgpPT5bZS5pbmNsdWRlLGUuZXhjbHVkZV0sKFtlLHRdKT0+e2UmJm0odD0+VmkoZSx0KSksdCYmbShlPT4hVmkodCxlKSl9LHtmbHVzaDpgcG9zdGAsZGVlcDohMH0pO2xldCBnPW51bGwsXz0oKT0+e2chPW51bGwmJihKbyhuLnN1YlRyZWUudHlwZSk/SW8oKCk9PntpLnNldChnLHFpKG4uc3ViVHJlZSkpfSxuLnN1YlRyZWUuc3VzcGVuc2UpOmkuc2V0KGcscWkobi5zdWJUcmVlKSkpfTtyZXR1cm4gWmkoXyksJGkoXyksZWEoKCk9PntpLmZvckVhY2goZT0+e2xldHtzdWJUcmVlOnQsc3VzcGVuc2U6cn09bixpPXFpKHQpO2lmKGUudHlwZT09PWkudHlwZSYmZS5rZXk9PT1pLmtleSl7S2koaSk7bGV0IGU9aS5jb21wb25lbnQuZGE7ZSYmSW8oZSxyKTtyZXR1cm59cChlKX0pfSksKCk9PntpZihnPW51bGwsIXQuZGVmYXVsdClyZXR1cm4gbz1udWxsO2xldCBuPXQuZGVmYXVsdCgpLHI9blswXTtpZihuLmxlbmd0aD4xKXJldHVybiBvPW51bGwsbjtpZighZ3Mocil8fCEoci5zaGFwZUZsYWcmNCkmJiEoci5zaGFwZUZsYWcmMTI4KSlyZXR1cm4gbz1udWxsLHI7bGV0IHM9cWkocik7aWYocy50eXBlPT09Y3MpcmV0dXJuIG89bnVsbCxzO2xldCBjPXMudHlwZSxsPSRzKElpKHMpP3MudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmMpLHtpbmNsdWRlOnUsZXhjbHVkZTpkLG1heDpmfT1lO2lmKHUmJighbHx8IVZpKHUsbCkpfHxkJiZsJiZWaShkLGwpKXJldHVybiBzLnNoYXBlRmxhZyY9LTI1NyxvPXMscjtsZXQgcD1zLmtleT09bnVsbD9jOnMua2V5LG09aS5nZXQocCk7cmV0dXJuIHMuZWwmJihzPUNzKHMpLHIuc2hhcGVGbGFnJjEyOCYmKHIuc3NDb250ZW50PXMpKSxnPXAsbT8ocy5lbD1tLmVsLHMuY29tcG9uZW50PW0uY29tcG9uZW50LHMudHJhbnNpdGlvbiYmcmkocyxzLnRyYW5zaXRpb24pLHMuc2hhcGVGbGFnfD01MTIsYS5kZWxldGUocCksYS5hZGQocCkpOihhLmFkZChwKSxmJiZhLnNpemU+cGFyc2VJbnQoZiwxMCkmJmgoYS52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxzLnNoYXBlRmxhZ3w9MjU2LG89cyxKbyhyLnR5cGUpP3I6c319fTtmdW5jdGlvbiBWaShlLHQpe3JldHVybiBwKGUpP2Uuc29tZShlPT5WaShlLHQpKTp5KGUpP2Uuc3BsaXQoYCxgKS5pbmNsdWRlcyh0KTpfKGUpPyhlLmxhc3RJbmRleD0wLGUudGVzdCh0KSk6ITF9ZnVuY3Rpb24gSGkoZSx0KXtXaShlLGBhYCx0KX1mdW5jdGlvbiBVaShlLHQpe1dpKGUsYGRhYCx0KX1mdW5jdGlvbiBXaShlLHQsbj1Qcyl7bGV0IHI9ZS5fX3dkY3x8PSgpPT57bGV0IHQ9bjtmb3IoO3Q7KXtpZih0LmlzRGVhY3RpdmF0ZWQpcmV0dXJuO3Q9dC5wYXJlbnR9cmV0dXJuIGUoKX07aWYoSmkodCxyLG4pLG4pe2xldCBlPW4ucGFyZW50O2Zvcig7ZSYmZS5wYXJlbnQ7KXppKGUucGFyZW50LnZub2RlKSYmR2kocix0LG4sZSksZT1lLnBhcmVudH19ZnVuY3Rpb24gR2koZSx0LG4scil7bGV0IGk9SmkodCxlLHIsITApO3RhKCgpPT57dShyW3RdLGkpfSxuKX1mdW5jdGlvbiBLaShlKXtlLnNoYXBlRmxhZyY9LTI1NyxlLnNoYXBlRmxhZyY9LTUxM31mdW5jdGlvbiBxaShlKXtyZXR1cm4gZS5zaGFwZUZsYWcmMTI4P2Uuc3NDb250ZW50OmV9ZnVuY3Rpb24gSmkoZSx0LG49UHMscj0hMSl7aWYobil7bGV0IGk9bltlXXx8KG5bZV09W10pLGE9dC5fX3dlaHx8PSguLi5yKT0+e250KCk7bGV0IGk9UnMobiksYT1Ibih0LG4sZSxyKTtyZXR1cm4gaSgpLHJ0KCksYX07cmV0dXJuIHI/aS51bnNoaWZ0KGEpOmkucHVzaChhKSxhfX12YXIgWWk9ZT0+KHQsbj1Qcyk9PnsoIVZzfHxlPT09YHNwYCkmJkppKGUsKC4uLmUpPT50KC4uLmUpLG4pfSxYaT1ZaShgYm1gKSxaaT1ZaShgbWApLFFpPVlpKGBidWApLCRpPVlpKGB1YCksZWE9WWkoYGJ1bWApLHRhPVlpKGB1bWApLG5hPVlpKGBzcGApLHJhPVlpKGBydGdgKSxpYT1ZaShgcnRjYCk7ZnVuY3Rpb24gYWEoZSx0PVBzKXtKaShgZWNgLGUsdCl9dmFyIG9hPWBjb21wb25lbnRzYCxzYT1gZGlyZWN0aXZlc2A7ZnVuY3Rpb24gY2EoZSx0KXtyZXR1cm4gZmEob2EsZSwhMCx0KXx8ZX12YXIgbGE9U3ltYm9sLmZvcihgdi1uZGNgKTtmdW5jdGlvbiB1YShlKXtyZXR1cm4geShlKT9mYShvYSxlLCExKXx8ZTplfHxsYX1mdW5jdGlvbiBkYShlKXtyZXR1cm4gZmEoc2EsZSl9ZnVuY3Rpb24gZmEoZSx0LG49ITAscj0hMSl7bGV0IGk9dXJ8fFBzO2lmKGkpe2xldCBuPWkudHlwZTtpZihlPT09b2Epe2xldCBlPSRzKG4sITEpO2lmKGUmJihlPT09dHx8ZT09PUUodCl8fGU9PT1zZShFKHQpKSkpcmV0dXJuIG59bGV0IGE9cGEoaVtlXXx8bltlXSx0KXx8cGEoaS5hcHBDb250ZXh0W2VdLHQpO3JldHVybiFhJiZyP246YX19ZnVuY3Rpb24gcGEoZSx0KXtyZXR1cm4gZSYmKGVbdF18fGVbRSh0KV18fGVbc2UoRSh0KSldKX1mdW5jdGlvbiBtYShlLHQsbixyKXtsZXQgaSxhPW4mJm5bcl0sbz1wKGUpO2lmKG98fHkoZSkpe2xldCBuPW8mJm5uKGUpLHI9ITEscz0hMTtuJiYocj0hYW4oZSkscz1ybihlKSxlPV90KGUpKSxpPUFycmF5KGUubGVuZ3RoKTtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspaVtuXT10KHI/cz9sbihjbihlW25dKSk6Y24oZVtuXSk6ZVtuXSxuLHZvaWQgMCxhJiZhW25dKX1lbHNlIGlmKHR5cGVvZiBlPT1gbnVtYmVyYCl7aT1BcnJheShlKTtmb3IobGV0IG49MDtuPGU7bisrKWlbbl09dChuKzEsbix2b2lkIDAsYSYmYVtuXSl9ZWxzZSBpZih4KGUpKXtpZihlW1N5bWJvbC5pdGVyYXRvcl0paT1BcnJheS5mcm9tKGUsKGUsbik9PnQoZSxuLHZvaWQgMCxhJiZhW25dKSk7ZWxzZXtsZXQgbj1PYmplY3Qua2V5cyhlKTtpPUFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2xldCBvPW5bcl07aVtyXT10KGVbb10sbyxyLGEmJmFbcl0pfX19ZWxzZSBpPVtdO3JldHVybiBuJiYobltyXT1pKSxpfWZ1bmN0aW9uIGhhKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07aWYocChyKSlmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllW3JbdF0ubmFtZV09clt0XS5mbjtlbHNlIHImJihlW3IubmFtZV09ci5rZXk/KC4uLmUpPT57bGV0IHQ9ci5mbiguLi5lKTtyZXR1cm4gdCYmKHQua2V5PXIua2V5KSx0fTpyLmZuKX1yZXR1cm4gZX1mdW5jdGlvbiBJKGUsdCxuLHIsaSxhKXtpZihuPz89e30sdXIuY2V8fHVyLnBhcmVudCYmSWkodXIucGFyZW50KSYmdXIucGFyZW50LmNlKXtsZXQgZT1hIT1udWxsJiZuLmtleT09bnVsbD9sKHt9LG4se2tleTphfSk6bixpPU9iamVjdC5rZXlzKGUpLmxlbmd0aD4wO3JldHVybiB0IT09ImRlZmF1bHQiJiYoZS5uYW1lPXQpLFIoKSxCKEwsbnVsbCxbSChgc2xvdGAsZSxyJiZyKCkpXSxpPy0yOjY0KX1sZXQgbz1lW3RdO28mJm8uX2MmJihvLl9kPSExKTtsZXQgcz11cy5sZW5ndGg7UigpO2xldCBjO3RyeXtsZXQgaT1vJiZnYShvKG4pKSxzPW4ua2V5fHxhfHxpJiZpLmtleTtjPUIoTCx7a2V5OihzJiYhYihzKT9zOmBfJHt0fWApKyghaSYmcj9gX2ZiYDpgYCl9LGl8fChyP3IoKTpbXSksaSYmZS5fPT09MT82NDotMil9Y2F0Y2goZSl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPnM7ZS0tKWZzKCk7dGhyb3cgZX1maW5hbGx5e28mJm8uX2MmJihvLl9kPSEwKX1yZXR1cm4haSYmYy5zY29wZUlkJiYoYy5zbG90U2NvcGVJZHM9W2Muc2NvcGVJZCtgLXNgXSksY31mdW5jdGlvbiBnYShlKXtyZXR1cm4gZS5zb21lKGU9PiFncyhlKXx8IShlLnR5cGU9PT1jc3x8ZS50eXBlPT09TCYmIWdhKGUuY2hpbGRyZW4pKSk/ZTpudWxsfWZ1bmN0aW9uIF9hKGUsdCl7bGV0IG49e307Zm9yKGxldCByIGluIGUpblt0JiYvW0EtWl0vLnRlc3Qocik/YG9uOiR7cn1gOmNlKHIpXT1lW3JdO3JldHVybiBufXZhciB2YT1lPT5lP0JzKGUpP1FzKGUpOnZhKGUucGFyZW50KTpudWxsLHlhPWwoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDplPT5lLCRlbDplPT5lLnZub2RlLmVsLCRkYXRhOmU9PmUuZGF0YSwkcHJvcHM6ZT0+ZS5wcm9wcywkYXR0cnM6ZT0+ZS5hdHRycywkc2xvdHM6ZT0+ZS5zbG90cywkcmVmczplPT5lLnJlZnMsJHBhcmVudDplPT52YShlLnBhcmVudCksJHJvb3Q6ZT0+dmEoZS5yb290KSwkaG9zdDplPT5lLmNlLCRlbWl0OmU9PmUuZW1pdCwkb3B0aW9uczplPT5VYShlKSwkZm9yY2VVcGRhdGU6ZT0+ZS5mfHw9KCk9PntlcihlLnVwZGF0ZSl9LCRuZXh0VGljazplPT5lLm58fD1Rbi5iaW5kKGUucHJveHkpLCR3YXRjaDplPT5Pci5iaW5kKGUpfSksYmE9KGUsdCk9PmUhPT1yJiYhZS5fX2lzU2NyaXB0U2V0dXAmJmYoZSx0KSx4YT17Z2V0KHtfOmV9LHQpe2lmKHQ9PT1gX192X3NraXBgKXJldHVybiEwO2xldHtjdHg6bixzZXR1cFN0YXRlOmksZGF0YTphLHByb3BzOm8sYWNjZXNzQ2FjaGU6cyx0eXBlOmMsYXBwQ29udGV4dDpsfT1lO2lmKHRbMF0hPT1gJGApe2xldCBlPXNbdF07aWYoZSE9PXZvaWQgMClzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBpW3RdO2Nhc2UgMjpyZXR1cm4gYVt0XTtjYXNlIDQ6cmV0dXJuIG5bdF07Y2FzZSAzOnJldHVybiBvW3RdfWVsc2UgaWYoYmEoaSx0KSlyZXR1cm4gc1t0XT0xLGlbdF07ZWxzZSBpZihhIT09ciYmZihhLHQpKXJldHVybiBzW3RdPTIsYVt0XTtlbHNlIGlmKGYobyx0KSlyZXR1cm4gc1t0XT0zLG9bdF07ZWxzZSBpZihuIT09ciYmZihuLHQpKXJldHVybiBzW3RdPTQsblt0XTtlbHNlIFJhJiYoc1t0XT0wKX1sZXQgdT15YVt0XSxkLHA7aWYodSlyZXR1cm4gdD09PWAkYXR0cnNgJiZwdChlLmF0dHJzLGBnZXRgLGBgKSx1KGUpO2lmKChkPWMuX19jc3NNb2R1bGVzKSYmKGQ9ZFt0XSkpcmV0dXJuIGQ7aWYobiE9PXImJmYobix0KSlyZXR1cm4gc1t0XT00LG5bdF07aWYocD1sLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGYocCx0KSlyZXR1cm4gcFt0XX0sc2V0KHtfOmV9LHQsbil7bGV0e2RhdGE6aSxzZXR1cFN0YXRlOmEsY3R4Om99PWU7cmV0dXJuIGJhKGEsdCk/KGFbdF09biwhMCk6aSE9PXImJmYoaSx0KT8oaVt0XT1uLCEwKTpmKGUucHJvcHMsdCl8fHRbMF09PT1gJGAmJnQuc2xpY2UoMSlpbiBlPyExOihvW3RdPW4sITApfSxoYXMoe186e2RhdGE6ZSxzZXR1cFN0YXRlOnQsYWNjZXNzQ2FjaGU6bixjdHg6aSxhcHBDb250ZXh0OmEscHJvcHM6byx0eXBlOnN9fSxjKXtsZXQgbDtyZXR1cm4hIShuW2NdfHxlIT09ciYmY1swXSE9PWAkYCYmZihlLGMpfHxiYSh0LGMpfHxmKG8sYyl8fGYoaSxjKXx8Zih5YSxjKXx8ZihhLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGMpfHwobD1zLl9fY3NzTW9kdWxlcykmJmxbY10pfSxkZWZpbmVQcm9wZXJ0eShlLHQsbil7cmV0dXJuIG4uZ2V0PT1udWxsP2YobixgdmFsdWVgKSYmdGhpcy5zZXQoZSx0LG4udmFsdWUsbnVsbCk6ZS5fLmFjY2Vzc0NhY2hlW3RdPTAsUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbil9fSxTYT1sKHt9LHhhLHtnZXQoZSx0KXtpZih0IT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB4YS5nZXQoZSx0LGUpfSxoYXMoZSx0KXtyZXR1cm4gdFswXSE9PWBfYCYmIWhlKHQpfX0pO2Z1bmN0aW9uIENhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gd2EoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUYShlKXt9ZnVuY3Rpb24gRWEoZSl7fWZ1bmN0aW9uIERhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gT2EoKXt9ZnVuY3Rpb24ga2EoZSx0KXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBBYSgpe3JldHVybiBNYShgdXNlU2xvdHNgKS5zbG90c31mdW5jdGlvbiBqYSgpe3JldHVybiBNYShgdXNlQXR0cnNgKS5hdHRyc31mdW5jdGlvbiBNYShlKXtsZXQgdD1GcygpO3JldHVybiB0LnNldHVwQ29udGV4dHx8PVpzKHQpfWZ1bmN0aW9uIE5hKGUpe3JldHVybiBwKGUpP2UucmVkdWNlKChlLHQpPT4oZVt0XT1udWxsLGUpLHt9KTplfWZ1bmN0aW9uIFBhKGUsdCl7bGV0IG49TmEoZSk7Zm9yKGxldCBlIGluIHQpe2lmKGUuc3RhcnRzV2l0aChgX19za2lwYCkpY29udGludWU7bGV0IHI9bltlXTtyP3Aocil8fHYocik/cj1uW2VdPXt0eXBlOnIsZGVmYXVsdDp0W2VdfTpyLmRlZmF1bHQ9dFtlXTpyPT09bnVsbCYmKHI9bltlXT17ZGVmYXVsdDp0W2VdfSksciYmdFtgX19za2lwXyR7ZX1gXSYmKHIuc2tpcEZhY3Rvcnk9ITApfXJldHVybiBufWZ1bmN0aW9uIEZhKGUsdCl7cmV0dXJuIWV8fCF0P2V8fHQ6cChlKSYmcCh0KT9lLmNvbmNhdCh0KTpsKHt9LE5hKGUpLE5hKHQpKX1mdW5jdGlvbiBJYShlLHQpe2xldCBuPXt9O2ZvcihsZXQgciBpbiBlKXQuaW5jbHVkZXMocil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5lW3JdfSk7cmV0dXJuIG59ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9RnMoKSxuPVZzLHI9ZSgpO3pzKCksbiYmTHMoITEpO2xldCBpPSgpPT57UnModCksbiYmTHMoITApfSxhPSgpPT57RnMoKSE9PXQmJnQuc2NvcGUub2ZmKCksenMoKSxuJiZMcyghMSl9O3JldHVybiBTKHIpJiYocj1yLmNhdGNoKGU9Pnt0aHJvdyBpKCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhKSksZX0pKSxbciwoKT0+e2koKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfV19dmFyIFJhPSEwO2Z1bmN0aW9uIHphKGUpe2xldCB0PVVhKGUpLG49ZS5wcm94eSxyPWUuY3R4O1JhPSExLHQuYmVmb3JlQ3JlYXRlJiZWYSh0LmJlZm9yZUNyZWF0ZSxlLGBiY2ApO2xldHtkYXRhOmksY29tcHV0ZWQ6byxtZXRob2RzOnMsd2F0Y2g6Yyxwcm92aWRlOmwsaW5qZWN0OnUsY3JlYXRlZDpkLGJlZm9yZU1vdW50OmYsbW91bnRlZDptLGJlZm9yZVVwZGF0ZTpoLHVwZGF0ZWQ6ZyxhY3RpdmF0ZWQ6XyxkZWFjdGl2YXRlZDp5LGJlZm9yZURlc3Ryb3k6YixiZWZvcmVVbm1vdW50OlMsZGVzdHJveWVkOkMsdW5tb3VudGVkOncscmVuZGVyOmVlLHJlbmRlclRyYWNrZWQ6dGUscmVuZGVyVHJpZ2dlcmVkOlQsZXJyb3JDYXB0dXJlZDpuZSxzZXJ2ZXJQcmVmZXRjaDpyZSxleHBvc2U6aWUsaW5oZXJpdEF0dHJzOkUsY29tcG9uZW50czphZSxkaXJlY3RpdmVzOm9lLGZpbHRlcnM6c2V9PXQ7aWYodSYmQmEodSxyLG51bGwpLHMpZm9yKGxldCBlIGluIHMpe2xldCB0PXNbZV07dih0KSYmKHJbZV09dC5iaW5kKG4pKX1pZihpKXtsZXQgdD1pLmNhbGwobixuKTt4KHQpJiYoZS5kYXRhPVp0KHQpKX1pZihSYT0hMCxvKWZvcihsZXQgZSBpbiBvKXtsZXQgdD1vW2VdLGk9Vyh7Z2V0OnYodCk/dC5iaW5kKG4sbik6dih0LmdldCk/dC5nZXQuYmluZChuLG4pOmEsc2V0OiF2KHQpJiZ2KHQuc2V0KT90LnNldC5iaW5kKG4pOmF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmkudmFsdWUsc2V0OmU9PmkudmFsdWU9ZX0pfWlmKGMpZm9yKGxldCBlIGluIGMpSGEoY1tlXSxyLG4sZSk7aWYobCl7bGV0IGU9dihsKT9sLmNhbGwobik6bDtSZWZsZWN0Lm93bktleXMoZSkuZm9yRWFjaCh0PT57dnIodCxlW3RdKX0pfWQmJlZhKGQsZSxgY2ApO2Z1bmN0aW9uIGNlKGUsdCl7cCh0KT90LmZvckVhY2godD0+ZSh0LmJpbmQobikpKTp0JiZlKHQuYmluZChuKSl9aWYoY2UoWGksZiksY2UoWmksbSksY2UoUWksaCksY2UoJGksZyksY2UoSGksXyksY2UoVWkseSksY2UoYWEsbmUpLGNlKGlhLHRlKSxjZShyYSxUKSxjZShlYSxTKSxjZSh0YSx3KSxjZShuYSxyZSkscChpZSkpe2lmKGllLmxlbmd0aCl7bGV0IHQ9ZS5leHBvc2VkfHw9e307aWUuZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OigpPT5uW2VdLHNldDp0PT5uW2VdPXQsZW51bWVyYWJsZTohMH0pfSl9ZWxzZSBlLmV4cG9zZWR8fD17fX1lZSYmZS5yZW5kZXI9PT1hJiYoZS5yZW5kZXI9ZWUpLEUhPW51bGwmJihlLmluaGVyaXRBdHRycz1FKSxhZSYmKGUuY29tcG9uZW50cz1hZSksb2UmJihlLmRpcmVjdGl2ZXM9b2UpLHJlJiZvaShlKX1mdW5jdGlvbiBCYShlLHQsbj1hKXtwKGUpJiYoZT1KYShlKSk7Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl0saTtpPXgocik/YGRlZmF1bHRgaW4gcj95cihyLmZyb218fG4sci5kZWZhdWx0LCEwKTp5cihyLmZyb218fG4pOnlyKHIpLGooaSk/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pLnZhbHVlLHNldDplPT5pLnZhbHVlPWV9KTp0W25dPWl9fWZ1bmN0aW9uIFZhKGUsdCxuKXtIbihwKGUpP2UubWFwKGU9PmUuYmluZCh0LnByb3h5KSk6ZS5iaW5kKHQucHJveHkpLHQsbil9ZnVuY3Rpb24gSGEoZSx0LG4scil7bGV0IGk9ci5pbmNsdWRlcyhgLmApP2tyKG4scik6KCk9Pm5bcl07aWYoeShlKSl7bGV0IG49dFtlXTt2KG4pJiZFcihpLG4pfWVsc2UgaWYodihlKSlFcihpLGUuYmluZChuKSk7ZWxzZSBpZih4KGUpKXtpZihwKGUpKWUuZm9yRWFjaChlPT5IYShlLHQsbixyKSk7ZWxzZXtsZXQgcj12KGUuaGFuZGxlcik/ZS5oYW5kbGVyLmJpbmQobik6dFtlLmhhbmRsZXJdO3YocikmJkVyKGkscixlKX19fWZ1bmN0aW9uIFVhKGUpe2xldCB0PWUudHlwZSx7bWl4aW5zOm4sZXh0ZW5kczpyfT10LHttaXhpbnM6aSxvcHRpb25zQ2FjaGU6YSxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpvfX09ZS5hcHBDb250ZXh0LHM9YS5nZXQodCksYztyZXR1cm4gcz9jPXM6IWkubGVuZ3RoJiYhbiYmIXI/Yz10OihjPXt9LGkubGVuZ3RoJiZpLmZvckVhY2goZT0+V2EoYyxlLG8sITApKSxXYShjLHQsbykpLHgodCkmJmEuc2V0KHQsYyksY31mdW5jdGlvbiBXYShlLHQsbixyPSExKXtsZXR7bWl4aW5zOmksZXh0ZW5kczphfT10O2EmJldhKGUsYSxuLCEwKSxpJiZpLmZvckVhY2godD0+V2EoZSx0LG4sITApKTtmb3IobGV0IGkgaW4gdClpZighKHImJmk9PT1gZXhwb3NlYCkpe2xldCByPUdhW2ldfHxuJiZuW2ldO2VbaV09cj9yKGVbaV0sdFtpXSk6dFtpXX1yZXR1cm4gZX12YXIgR2E9e2RhdGE6S2EscHJvcHM6WmEsZW1pdHM6WmEsbWV0aG9kczpYYSxjb21wdXRlZDpYYSxiZWZvcmVDcmVhdGU6WWEsY3JlYXRlZDpZYSxiZWZvcmVNb3VudDpZYSxtb3VudGVkOllhLGJlZm9yZVVwZGF0ZTpZYSx1cGRhdGVkOllhLGJlZm9yZURlc3Ryb3k6WWEsYmVmb3JlVW5tb3VudDpZYSxkZXN0cm95ZWQ6WWEsdW5tb3VudGVkOllhLGFjdGl2YXRlZDpZYSxkZWFjdGl2YXRlZDpZYSxlcnJvckNhcHR1cmVkOllhLHNlcnZlclByZWZldGNoOllhLGNvbXBvbmVudHM6WGEsZGlyZWN0aXZlczpYYSx3YXRjaDpRYSxwcm92aWRlOkthLGluamVjdDpxYX07ZnVuY3Rpb24gS2EoZSx0KXtyZXR1cm4gdD9lP2Z1bmN0aW9uKCl7cmV0dXJuIGwodihlKT9lLmNhbGwodGhpcyx0aGlzKTplLHYodCk/dC5jYWxsKHRoaXMsdGhpcyk6dCl9OnQ6ZX1mdW5jdGlvbiBxYShlLHQpe3JldHVybiBYYShKYShlKSxKYSh0KSl9ZnVuY3Rpb24gSmEoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT1lW25dO3JldHVybiB0fXJldHVybiBlfWZ1bmN0aW9uIFlhKGUsdCl7cmV0dXJuIGU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGUsdCkpXTp0fWZ1bmN0aW9uIFhhKGUsdCl7cmV0dXJuIGU/bChPYmplY3QuY3JlYXRlKG51bGwpLGUsdCk6dH1mdW5jdGlvbiBaYShlLHQpe3JldHVybiBlP3AoZSkmJnAodCk/Wy4uLm5ldyBTZXQoWy4uLmUsLi4udF0pXTpsKE9iamVjdC5jcmVhdGUobnVsbCksTmEoZSksTmEodD8/e30pKTp0fWZ1bmN0aW9uIFFhKGUsdCl7aWYoIWUpcmV0dXJuIHQ7aWYoIXQpcmV0dXJuIGU7bGV0IG49bChPYmplY3QuY3JlYXRlKG51bGwpLGUpO2ZvcihsZXQgciBpbiB0KW5bcl09WWEoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiAkYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOm8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIGVvPTA7ZnVuY3Rpb24gdG8oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyPW51bGwpe3Yobil8fChuPWwoe30sbikpLHIhPW51bGwmJiF4KHIpJiYocj1udWxsKTtsZXQgaT0kYSgpLGE9bmV3IFdlYWtTZXQsbz1bXSxzPSExLGM9aS5hcHA9e191aWQ6ZW8rKyxfY29tcG9uZW50Om4sX3Byb3BzOnIsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OmksX2luc3RhbmNlOm51bGwsdmVyc2lvbjphYyxnZXQgY29uZmlnKCl7cmV0dXJuIGkuY29uZmlnfSxzZXQgY29uZmlnKGUpe30sdXNlKGUsLi4udCl7cmV0dXJuIGEuaGFzKGUpfHwoZSYmdihlLmluc3RhbGwpPyhhLmFkZChlKSxlLmluc3RhbGwoYywuLi50KSk6dihlKSYmKGEuYWRkKGUpLGUoYywuLi50KSkpLGN9LG1peGluKGUpe3JldHVybiBpLm1peGlucy5pbmNsdWRlcyhlKXx8aS5taXhpbnMucHVzaChlKSxjfSxjb21wb25lbnQoZSx0KXtyZXR1cm4gdD8oaS5jb21wb25lbnRzW2VdPXQsYyk6aS5jb21wb25lbnRzW2VdfSxkaXJlY3RpdmUoZSx0KXtyZXR1cm4gdD8oaS5kaXJlY3RpdmVzW2VdPXQsYyk6aS5kaXJlY3RpdmVzW2VdfSxtb3VudChhLG8sbCl7aWYoIXMpe2xldCB1PWMuX2NlVk5vZGV8fEgobixyKTtyZXR1cm4gdS5hcHBDb250ZXh0PWksbD09PSEwP2w9YHN2Z2A6bD09PSExJiYobD12b2lkIDApLG8mJnQ/dCh1LGEpOmUodSxhLGwpLHM9ITAsYy5fY29udGFpbmVyPWEsYS5fX3Z1ZV9hcHBfXz1jLFFzKHUuY29tcG9uZW50KX19LG9uVW5tb3VudChlKXtvLnB1c2goZSl9LHVubW91bnQoKXtzJiYoSG4obyxjLl9pbnN0YW5jZSwxNiksZShudWxsLGMuX2NvbnRhaW5lciksZGVsZXRlIGMuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUoZSx0KXtyZXR1cm4gaS5wcm92aWRlc1tlXT10LGN9LHJ1bldpdGhDb250ZXh0KGUpe2xldCB0PW5vO25vPWM7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtubz10fX19O3JldHVybiBjfX12YXIgbm89bnVsbDtmdW5jdGlvbiBybyhlLHQsbj1yKXtsZXQgaT1GcygpLGE9RSh0KSxvPW9lKHQpLHM9aW8oZSxhKSxjPXZuKChzLGMpPT57bGV0IGwsdT1yLGQ7cmV0dXJuIFRyKCgpPT57bGV0IHQ9ZVthXTtEKGwsdCkmJihsPXQsYygpKX0pLHtnZXQoKXtyZXR1cm4gcygpLG4uZ2V0P24uZ2V0KGwpOmx9LHNldChlKXtsZXQgcz1uLnNldD9uLnNldChlKTplO2lmKCFEKHMsbCkmJiEodSE9PXImJkQoZSx1KSkpcmV0dXJuO2xldCBmPWkudm5vZGUucHJvcHMscD0hIShmJiYodCBpbiBmfHxhIGluIGZ8fG8gaW4gZikmJihgb25VcGRhdGU6JHt0fWBpbiBmfHxgb25VcGRhdGU6JHthfWBpbiBmfHxgb25VcGRhdGU6JHtvfWBpbiBmKSk7cHx8KGw9ZSxjKCkpLGkuZW1pdChgdXBkYXRlOiR7dH1gLHMpLEQoZSx1KSYmKEQoZSxzKSYmIUQocyxkKXx8cCYmdSE9PXImJiFEKHMsbCkpJiZjKCksdT1lLGQ9c319fSk7cmV0dXJuIGNbU3ltYm9sLml0ZXJhdG9yXT0oKT0+e2xldCBlPTA7cmV0dXJue25leHQoKXtyZXR1cm4gZTwyP3t2YWx1ZTplKys/c3x8cjpjLGRvbmU6ITF9Ontkb25lOiEwfX19fSxjfXZhciBpbz0oZSx0KT0+dD09PWBtb2RlbFZhbHVlYHx8dD09PWBtb2RlbC12YWx1ZWA/ZS5tb2RlbE1vZGlmaWVyczplW2Ake3R9TW9kaWZpZXJzYF18fGVbYCR7RSh0KX1Nb2RpZmllcnNgXXx8ZVtgJHtvZSh0KX1Nb2RpZmllcnNgXTtmdW5jdGlvbiBhbyhlLHQsLi4ubil7aWYoZS5pc1VubW91bnRlZClyZXR1cm47bGV0IGk9ZS52bm9kZS5wcm9wc3x8cixhPW4sbz10LnN0YXJ0c1dpdGgoYHVwZGF0ZTpgKSxzPW8mJmlvKGksdC5zbGljZSg3KSk7cyYmKHMudHJpbSYmKGE9bi5tYXAoZT0+eShlKT9lLnRyaW0oKTplKSkscy5udW1iZXImJihhPW4ubWFwKGRlKSkpO2xldCBjLGw9aVtjPWNlKHQpXXx8aVtjPWNlKEUodCkpXTshbCYmbyYmKGw9aVtjPWNlKG9lKHQpKV0pLGwmJkhuKGwsZSw2LGEpO2xldCB1PWlbYytgT25jZWBdO2lmKHUpe2lmKCFlLmVtaXR0ZWQpZS5lbWl0dGVkPXt9O2Vsc2UgaWYoZS5lbWl0dGVkW2NdKXJldHVybjtlLmVtaXR0ZWRbY109ITAsSG4odSxlLDYsYSl9fXZhciBvbz1uZXcgV2Vha01hcDtmdW5jdGlvbiBzbyhlLHQsbj0hMSl7bGV0IHI9bj9vbzp0LmVtaXRzQ2FjaGUsaT1yLmdldChlKTtpZihpIT09dm9pZCAwKXJldHVybiBpO2xldCBhPWUuZW1pdHMsbz17fSxzPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57bGV0IG49c28oZSx0LCEwKTtuJiYocz0hMCxsKG8sbikpfTshbiYmdC5taXhpbnMubGVuZ3RoJiZ0Lm1peGlucy5mb3JFYWNoKHIpLGUuZXh0ZW5kcyYmcihlLmV4dGVuZHMpLGUubWl4aW5zJiZlLm1peGlucy5mb3JFYWNoKHIpfXJldHVybiFhJiYhcz8oeChlKSYmci5zZXQoZSxudWxsKSxudWxsKToocChhKT9hLmZvckVhY2goZT0+b1tlXT1udWxsKTpsKG8sYSkseChlKSYmci5zZXQoZSxvKSxvKX1mdW5jdGlvbiBjbyhlLHQpe3JldHVybiFlfHwhcyh0KT8hMToodD10LnNsaWNlKDIpLHQ9dD09PWBPbmNlYD90OnQucmVwbGFjZSgvT25jZSQvLGBgKSxmKGUsdFswXS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSkpfHxmKGUsb2UodCkpfHxmKGUsdCkpfWZ1bmN0aW9uIGxvKGUpe2xldHt0eXBlOnQsdm5vZGU6bixwcm94eTpyLHdpdGhQcm94eTppLHByb3BzT3B0aW9uczpbYV0sc2xvdHM6byxhdHRyczpzLGVtaXQ6bCxyZW5kZXI6dSxyZW5kZXJDYWNoZTpkLHByb3BzOmYsZGF0YTpwLHNldHVwU3RhdGU6bSxjdHg6aCxpbmhlcml0QXR0cnM6Z309ZSxfPWZyKGUpLHYseTt0cnl7aWYobi5zaGFwZUZsYWcmNCl7bGV0IGU9aXx8cix0PWU7dj1Fcyh1LmNhbGwodCxlLGQsZixtLHAsaCkpLHk9c31lbHNle2xldCBlPXQ7dj1FcyhlLmxlbmd0aD4xP2UoZix7YXR0cnM6cyxzbG90czpvLGVtaXQ6bH0pOmUoZixudWxsKSkseT10LnByb3BzP3M6Zm8ocyl9fWNhdGNoKHQpe3VzLmxlbmd0aD0wLFVuKHQsZSwxKSx2PUgoY3MpfWxldCBiPXY7aWYoeSYmZyE9PSExKXtsZXQgZT1PYmplY3Qua2V5cyh5KSx7c2hhcGVGbGFnOnR9PWI7ZS5sZW5ndGgmJnQmNyYmKGEmJmUuc29tZShjKSYmKHk9cG8oeSxhKSksYj1DcyhiLHksITEsITApKX1yZXR1cm4gbi5kaXJzJiYoYj1DcyhiLG51bGwsITEsITApLGIuZGlycz1iLmRpcnM/Yi5kaXJzLmNvbmNhdChuLmRpcnMpOm4uZGlycyksbi50cmFuc2l0aW9uJiZyaShNcihiLnR5cGUpJiZuaShiKXx8YixuLnRyYW5zaXRpb24pLHY9YixmcihfKSx2fWZ1bmN0aW9uIHVvKGUsdD0hMCl7bGV0IG47Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF07aWYoZ3Mocikpe2lmKHIudHlwZSE9PWNzfHxyLmNoaWxkcmVuPT09YHYtaWZgKXtpZihuKXJldHVybjtuPXJ9fWVsc2UgcmV0dXJufXJldHVybiBufXZhciBmbz1lPT57bGV0IHQ7Zm9yKGxldCBuIGluIGUpKG49PT1gY2xhc3NgfHxuPT09YHN0eWxlYHx8cyhuKSkmJigodHx8PXt9KVtuXT1lW25dKTtyZXR1cm4gdH0scG89KGUsdCk9PntsZXQgbj17fTtmb3IobGV0IHIgaW4gZSkoIWMocil8fCEoci5zbGljZSg5KWluIHQpKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59O2Z1bmN0aW9uIG1vKGUsdCxuKXtsZXR7cHJvcHM6cixjaGlsZHJlbjppLGNvbXBvbmVudDphfT1lLHtwcm9wczpvLGNoaWxkcmVuOnMscGF0Y2hGbGFnOmN9PXQsbD1hLmVtaXRzT3B0aW9ucztpZih0LmRpcnN8fHQudHJhbnNpdGlvbilyZXR1cm4hMDtpZihuJiZjPj0wKXtpZihjJjEwMjQpcmV0dXJuITA7aWYoYyYxNilyZXR1cm4gcj9obyhyLG8sbCk6ISFvO2lmKGMmOCl7bGV0IGU9dC5keW5hbWljUHJvcHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPWVbdF07aWYoZ28obyxyLG4pJiYhY28obCxuKSlyZXR1cm4hMH19fWVsc2UgcmV0dXJuKGl8fHMpJiYoIXN8fCFzLiRzdGFibGUpPyEwOnI9PT1vPyExOnI/IW98fGhvKHIsbyxsKTohIW87cmV0dXJuITF9ZnVuY3Rpb24gaG8oZSx0LG4pe2xldCByPU9iamVjdC5rZXlzKHQpO2lmKHIubGVuZ3RoIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXJldHVybiEwO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKXtsZXQgYT1yW2ldO2lmKGdvKHQsZSxhKSYmIWNvKG4sYSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZ28oZSx0LG4pe2xldCByPWVbbl0saT10W25dO3JldHVybiBuPT09YHN0eWxlYCYmeChyKSYmeChpKT8hRWUocixpKTpyIT09aX1mdW5jdGlvbiBfbyh7dm5vZGU6ZSxwYXJlbnQ6dCxzdXNwZW5zZTpufSxyKXtmb3IoO3Q7KXtsZXQgbj10LnN1YlRyZWU7aWYobi5zdXNwZW5zZSYmbi5zdXNwZW5zZS5hY3RpdmVCcmFuY2g9PT1lJiYobi5zdXNwZW5zZS52bm9kZS5lbD1uLmVsPXIsZT1uKSxuPT09ZSkoZT10LnZub2RlKS5lbD1yLHQ9dC5wYXJlbnQ7ZWxzZSBicmVha31uJiZuLmFjdGl2ZUJyYW5jaD09PWUmJihuLnZub2RlLmVsPXIpfXZhciB2bz17fSx5bz0oKT0+T2JqZWN0LmNyZWF0ZSh2byksYm89ZT0+T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09dm87ZnVuY3Rpb24geG8oZSx0LG4scj0hMSl7bGV0IGk9e30sYT15bygpO2UucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLENvKGUsdCxpLGEpO2ZvcihsZXQgdCBpbiBlLnByb3BzT3B0aW9uc1swXSl0IGluIGl8fChpW3RdPXZvaWQgMCk7ZS5wcm9wcz1uP3I/aTpRdChpKTplLnR5cGUucHJvcHM/aTphLGUuYXR0cnM9YX1mdW5jdGlvbiBTbyhlLHQsbixyKXtsZXR7cHJvcHM6aSxhdHRyczphLHZub2RlOntwYXRjaEZsYWc6b319PWUscz1BKGkpLFtjXT1lLnByb3BzT3B0aW9ucyxsPSExO2lmKChyfHxvPjApJiYhKG8mMTYpKXtpZihvJjgpe2xldCBuPWUudm5vZGUuZHluYW1pY1Byb3BzO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtsZXQgbz1uW3JdO2lmKGNvKGUuZW1pdHNPcHRpb25zLG8pKWNvbnRpbnVlO2xldCB1PXRbb107aWYoYyl7aWYoZihhLG8pKXUhPT1hW29dJiYoYVtvXT11LGw9ITApO2Vsc2V7bGV0IHQ9RShvKTtpW3RdPXdvKGMscyx0LHUsZSwhMSl9fWVsc2UgdSE9PWFbb10mJihhW29dPXUsbD0hMCl9fX1lbHNle0NvKGUsdCxpLGEpJiYobD0hMCk7bGV0IHI7Zm9yKGxldCBhIGluIHMpKCF0fHwhZih0LGEpJiYoKHI9b2UoYSkpPT09YXx8IWYodCxyKSkpJiYoYz9uJiYoblthXSE9PXZvaWQgMHx8bltyXSE9PXZvaWQgMCkmJihpW2FdPXdvKGMscyxhLHZvaWQgMCxlLCEwKSk6ZGVsZXRlIGlbYV0pO2lmKGEhPT1zKWZvcihsZXQgZSBpbiBhKSghdHx8IWYodCxlKSkmJihkZWxldGUgYVtlXSxsPSEwKX1sJiZtdChlLmF0dHJzLGBzZXRgLGBgKX1mdW5jdGlvbiBDbyhlLHQsbixpKXtsZXRbYSxvXT1lLnByb3BzT3B0aW9ucyxzPSExLGM7aWYodClmb3IobGV0IHIgaW4gdCl7aWYobmUocikpY29udGludWU7bGV0IGw9dFtyXSx1O2EmJmYoYSx1PUUocikpPyFvfHwhby5pbmNsdWRlcyh1KT9uW3VdPWw6KGN8fD17fSlbdV09bDpjbyhlLmVtaXRzT3B0aW9ucyxyKXx8KCEociBpbiBpKXx8bCE9PWlbcl0pJiYoaVtyXT1sLHM9ITApfWlmKG8pe2xldCB0PUEobiksaT1jfHxyO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKXtsZXQgcz1vW3JdO25bc109d28oYSx0LHMsaVtzXSxlLCFmKGkscykpfX1yZXR1cm4gc31mdW5jdGlvbiB3byhlLHQsbixyLGksYSl7bGV0IG89ZVtuXTtpZihvIT1udWxsKXtsZXQgZT1mKG8sYGRlZmF1bHRgKTtpZihlJiZyPT09dm9pZCAwKXtsZXQgZT1vLmRlZmF1bHQ7aWYoby50eXBlIT09RnVuY3Rpb24mJiFvLnNraXBGYWN0b3J5JiZ2KGUpKXtsZXR7cHJvcHNEZWZhdWx0czphfT1pO2lmKG4gaW4gYSlyPWFbbl07ZWxzZXtsZXQgbz1ScyhpKTtyPWFbbl09ZS5jYWxsKG51bGwsdCksbygpfX1lbHNlIHI9ZTtpLmNlJiZpLmNlLl9zZXRQcm9wKG4scil9b1swXSYmKGEmJiFlP3I9ITE6b1sxXSYmKHI9PT1gYHx8cj09PW9lKG4pKSYmKHI9ITApKX1yZXR1cm4gcn12YXIgVG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRW8oZSx0LG49ITEpe2xldCBhPW4/VG86dC5wcm9wc0NhY2hlLG89YS5nZXQoZSk7aWYobylyZXR1cm4gbztsZXQgcz1lLnByb3BzLGM9e30sdT1bXSxkPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57ZD0hMDtsZXRbbixyXT1FbyhlLHQsITApO2woYyxuKSxyJiZ1LnB1c2goLi4ucil9OyFuJiZ0Lm1peGlucy5sZW5ndGgmJnQubWl4aW5zLmZvckVhY2gociksZS5leHRlbmRzJiZyKGUuZXh0ZW5kcyksZS5taXhpbnMmJmUubWl4aW5zLmZvckVhY2gocil9aWYoIXMmJiFkKXJldHVybiB4KGUpJiZhLnNldChlLGkpLGk7aWYocChzKSlmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IHQ9RShzW2VdKTtEbyh0KSYmKGNbdF09cil9ZWxzZSBpZihzKWZvcihsZXQgZSBpbiBzKXtsZXQgdD1FKGUpO2lmKERvKHQpKXtsZXQgbj1zW2VdLHI9Y1t0XT1wKG4pfHx2KG4pP3t0eXBlOm59Omwoe30sbiksaT1yLnR5cGUsYT0hMSxvPSEwO2lmKHAoaSkpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2xldCB0PWlbZV0sbj12KHQpJiZ0Lm5hbWU7aWYobj09PWBCb29sZWFuYCl7YT0hMDticmVha31uPT09YFN0cmluZ2AmJihvPSExKX1lbHNlIGE9dihpKSYmaS5uYW1lPT09YEJvb2xlYW5gO3JbMF09YSxyWzFdPW8sKGF8fGYocixgZGVmYXVsdGApKSYmdS5wdXNoKHQpfX1sZXQgbT1bYyx1XTtyZXR1cm4geChlKSYmYS5zZXQoZSxtKSxtfWZ1bmN0aW9uIERvKGUpe3JldHVybiBlWzBdIT09YCRgJiYhbmUoZSl9dmFyIE9vPWU9PmU9PT1gX2B8fGU9PT1gX2N0eGB8fGU9PT1gJHN0YWJsZWAsa289ZT0+cChlKT9lLm1hcChFcyk6W0VzKGUpXSxBbz0oZSx0LG4pPT57aWYodC5fbilyZXR1cm4gdDtsZXQgcj1QKCguLi5lKT0+a28odCguLi5lKSksbik7cmV0dXJuIHIuX2M9ITEscn0sam89KGUsdCxuKT0+e2xldCByPWUuX2N0eDtmb3IobGV0IG4gaW4gZSl7aWYoT28obikpY29udGludWU7bGV0IGk9ZVtuXTtpZih2KGkpKXRbbl09QW8obixpLHIpO2Vsc2UgaWYoaSE9bnVsbCl7bGV0IGU9a28oaSk7dFtuXT0oKT0+ZX19fSxNbz0oZSx0KT0+e2xldCBuPWtvKHQpO2Uuc2xvdHMuZGVmYXVsdD0oKT0+bn0sTm89KGUsdCxuKT0+e2ZvcihsZXQgciBpbiB0KShufHwhT28ocikpJiYoZVtyXT10W3JdKX0sUG89KGUsdCxuKT0+e2xldCByPWUuc2xvdHM9eW8oKTtpZihlLnZub2RlLnNoYXBlRmxhZyYzMil7bGV0IGU9dC5fO2U/KE5vKHIsdCxuKSxuJiZ1ZShyLGBfYCxlLCEwKSk6am8odCxyKX1lbHNlIHQmJk1vKGUsdCl9LEZvPShlLHQsbik9PntsZXR7dm5vZGU6aSxzbG90czphfT1lLG89ITAscz1yO2lmKGkuc2hhcGVGbGFnJjMyKXtsZXQgZT10Ll87ZT9uJiZlPT09MT9vPSExOk5vKGEsdCxuKToobz0hdC4kc3RhYmxlLGpvKHQsYSkpLHM9dH1lbHNlIHQmJihNbyhlLHQpLHM9e2RlZmF1bHQ6MX0pO2lmKG8pZm9yKGxldCBlIGluIGEpIU9vKGUpJiZzW2VdPT1udWxsJiZkZWxldGUgYVtlXX0sSW89aXM7ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIHpvKGUpfWZ1bmN0aW9uIFJvKGUpe3JldHVybiB6byhlLHZpKX1mdW5jdGlvbiB6byhlLHQpe2xldCBuPW1lKCk7bi5fX1ZVRV9fPSEwO2xldHtpbnNlcnQ6byxyZW1vdmU6cyxwYXRjaFByb3A6YyxjcmVhdGVFbGVtZW50OmwsY3JlYXRlVGV4dDp1LGNyZWF0ZUNvbW1lbnQ6ZCxzZXRUZXh0OmYsc2V0RWxlbWVudFRleHQ6cCxwYXJlbnROb2RlOm0sbmV4dFNpYmxpbmc6aCxzZXRTY29wZUlkOmc9YSxpbnNlcnRTdGF0aWNDb250ZW50Ol99PWUsdj0oZSx0LG4scj1udWxsLGk9bnVsbCxhPW51bGwsbz12b2lkIDAscz1udWxsLGM9ISF0LmR5bmFtaWNDaGlsZHJlbik9PntpZihlPT09dClyZXR1cm47ZSYmIV9zKGUsdCkmJihyPU8oZSksZ2UoZSxpLGEsITApLGU9bnVsbCksdC5wYXRjaEZsYWc9PT0tMiYmKGM9ITEsdC5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0e3R5cGU6bCxyZWY6dSxzaGFwZUZsYWc6ZH09dDtzd2l0Y2gobCl7Y2FzZSBzczp5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgY3M6YihlLHQsbixyKTticmVhaztjYXNlIGxzOmU/P3godCxuLHIsbyk7YnJlYWs7Y2FzZSBMOmFlKGUsdCxuLHIsaSxhLG8scyxjKTticmVhaztkZWZhdWx0OmQmMT93KGUsdCxuLHIsaSxhLG8scyxjKTpkJjY/b2UoZSx0LG4scixpLGEsbyxzLGMpOihkJjY0fHxkJjEyOCkmJmwucHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxDZSl9dSE9bnVsbCYmaT91aSh1LGUmJmUucmVmLGEsdHx8ZSwhdCk6dT09bnVsbCYmZSYmZS5yZWYhPW51bGwmJnVpKGUucmVmLG51bGwsYSxlLCEwKX0seT0oZSx0LG4scik9PntpZihlPT1udWxsKW8odC5lbD11KHQuY2hpbGRyZW4pLG4scik7ZWxzZXtsZXQgbj10LmVsPWUuZWw7dC5jaGlsZHJlbiE9PWUuY2hpbGRyZW4mJmYobix0LmNoaWxkcmVuKX19LGI9KGUsdCxuLHIpPT57ZT09bnVsbD9vKHQuZWw9ZCh0LmNoaWxkcmVufHxgYCksbixyKTp0LmVsPWUuZWx9LHg9KGUsdCxuLHIpPT57W2UuZWwsZS5hbmNob3JdPV8oZS5jaGlsZHJlbix0LG4scixlLmVsLGUuYW5jaG9yKX0sUz0oe2VsOmUsYW5jaG9yOnR9LG4scik9PntsZXQgaTtmb3IoO2UmJmUhPT10OylpPWgoZSksbyhlLG4sciksZT1pO28odCxuLHIpfSxDPSh7ZWw6ZSxhbmNob3I6dH0pPT57bGV0IG47Zm9yKDtlJiZlIT09dDspbj1oKGUpLHMoZSksZT1uO3ModCl9LHc9KGUsdCxuLHIsaSxhLG8scyxjKT0+e2lmKHQudHlwZT09PWBzdmdgP289YHN2Z2A6dC50eXBlPT09YG1hdGhgJiYobz1gbWF0aG1sYCksZT09bnVsbCllZSh0LG4scixpLGEsbyxzLGMpO2Vsc2V7bGV0IG49ZS5lbCYmZS5lbC5faXNWdWVDRT9lLmVsOm51bGw7dHJ5e24mJm4uX2JlZ2luUGF0Y2goKSxyZShlLHQsaSxhLG8scyxjKX1maW5hbGx5e24mJm4uX2VuZFBhdGNoKCl9fX0sZWU9KGUsdCxuLHIsaSxhLHMsdSk9PntsZXQgZCxmLHtwcm9wczptLHNoYXBlRmxhZzpoLHRyYW5zaXRpb246ZyxkaXJzOl99PWU7aWYoZD1lLmVsPWwoZS50eXBlLGEsbSYmbS5pcyxtKSxoJjg/cChkLGUuY2hpbGRyZW4pOmgmMTYmJlQoZS5jaGlsZHJlbixkLG51bGwscixpLEJvKGUsYSkscyx1KSxfJiZfcihlLG51bGwscixgY3JlYXRlZGApLHRlKGQsZSxlLnNjb3BlSWQscyxyKSxtKXtmb3IobGV0IGUgaW4gbSllIT09YHZhbHVlYCYmIW5lKGUpJiZjKGQsZSxudWxsLG1bZV0sYSxyKTtgdmFsdWVgaW4gbSYmYyhkLGB2YWx1ZWAsbnVsbCxtLnZhbHVlLGEpLChmPW0ub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoZixyLGUpfV8mJl9yKGUsbnVsbCxyLGBiZWZvcmVNb3VudGApO2xldCB2PUhvKGksZyk7diYmZy5iZWZvcmVFbnRlcihkKSxvKGQsdCxuKSwoKGY9bSYmbS5vblZub2RlTW91bnRlZCl8fHZ8fF8pJiZJbygoKT0+e3RyeXtmJiZBcyhmLHIsZSksdiYmZy5lbnRlcihkKSxfJiZfcihlLG51bGwscixgbW91bnRlZGApfWZpbmFsbHl7fX0saSl9LHRlPShlLHQsbixyLGkpPT57aWYobiYmZyhlLG4pLHIpZm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspZyhlLHJbdF0pO2lmKGkpe2xldCBuPWkuc3ViVHJlZTtpZih0PT09bnx8Sm8obi50eXBlKSYmKG4uc3NDb250ZW50PT09dHx8bi5zc0ZhbGxiYWNrPT09dCkpe2xldCB0PWkudm5vZGU7dGUoZSx0LHQuc2NvcGVJZCx0LnNsb3RTY29wZUlkcyxpLnBhcmVudCl9fX0sVD0oZSx0LG4scixpLGEsbyxzLGM9MCk9Pntmb3IobGV0IGw9YztsPGUubGVuZ3RoO2wrKyl7bGV0IGM9ZVtsXT1zP0RzKGVbbF0pOkVzKGVbbF0pO3YobnVsbCxjLHQsbixyLGksYSxvLHMpfX0scmU9KGUsdCxuLGksYSxvLHMpPT57bGV0IGw9dC5lbD1lLmVsLHtwYXRjaEZsYWc6dSxkeW5hbWljQ2hpbGRyZW46ZCxkaXJzOmZ9PXQ7dXw9ZS5wYXRjaEZsYWcmMTY7bGV0IG09ZS5wcm9wc3x8cixoPXQucHJvcHN8fHIsZztpZihuJiZWbyhuLCExKSwoZz1oLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZBcyhnLG4sdCxlKSxmJiZfcih0LGUsbixgYmVmb3JlVXBkYXRlYCksbiYmVm8obiwhMCksZCYmKCFlLmR5bmFtaWNDaGlsZHJlbnx8ZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoIT09ZC5sZW5ndGgpJiYodT0wLHM9ITEsZD1udWxsKSwobS5pbm5lckhUTUwmJmguaW5uZXJIVE1MPT1udWxsfHxtLnRleHRDb250ZW50JiZoLnRleHRDb250ZW50PT1udWxsKSYmcChsLGBgKSxkP2llKGUuZHluYW1pY0NoaWxkcmVuLGQsbCxuLGksQm8odCxhKSxvKTpzfHxkZShlLHQsbCxudWxsLG4saSxCbyh0LGEpLG8sITEpLHU+MCl7aWYodSYxNilFKGwsbSxoLG4sYSk7ZWxzZSBpZih1JjImJm0uY2xhc3MhPT1oLmNsYXNzJiZjKGwsYGNsYXNzYCxudWxsLGguY2xhc3MsYSksdSY0JiZjKGwsYHN0eWxlYCxtLnN0eWxlLGguc3R5bGUsYSksdSY4KXtsZXQgZT10LmR5bmFtaWNQcm9wcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxpPW1bcl0sbz1oW3JdOyhvIT09aXx8cj09PWB2YWx1ZWApJiZjKGwscixpLG8sYSxuKX19dSYxJiZlLmNoaWxkcmVuIT09dC5jaGlsZHJlbiYmcChsLHQuY2hpbGRyZW4pfWVsc2UhcyYmZD09bnVsbCYmRShsLG0saCxuLGEpOygoZz1oLm9uVm5vZGVVcGRhdGVkKXx8ZikmJklvKCgpPT57ZyYmQXMoZyxuLHQsZSksZiYmX3IodCxlLG4sYHVwZGF0ZWRgKX0saSl9LGllPShlLHQsbixyLGksYSxvKT0+e2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgYz1lW3NdLGw9dFtzXSx1PWMuZWwmJihjLnR5cGU9PT1MfHwhX3MoYyxsKXx8Yy5zaGFwZUZsYWcmMTk4KT9tKGMuZWwpOm47dihjLGwsdSxudWxsLHIsaSxhLG8sITApfX0sRT0oZSx0LG4saSxhKT0+e2lmKHQhPT1uKXtpZih0IT09cilmb3IobGV0IHIgaW4gdCkhbmUocikmJiEociBpbiBuKSYmYyhlLHIsdFtyXSxudWxsLGEsaSk7Zm9yKGxldCByIGluIG4pe2lmKG5lKHIpKWNvbnRpbnVlO2xldCBvPW5bcl0scz10W3JdO28hPT1zJiZyIT09YHZhbHVlYCYmYyhlLHIscyxvLGEsaSl9YHZhbHVlYGluIG4mJmMoZSxgdmFsdWVgLHQudmFsdWUsbi52YWx1ZSxhKX19LGFlPShlLHQsbixyLGksYSxzLGMsbCk9PntsZXQgZD10LmVsPWU/ZS5lbDp1KGBgKSxmPXQuYW5jaG9yPWU/ZS5hbmNob3I6dShgYCkse3BhdGNoRmxhZzpwLGR5bmFtaWNDaGlsZHJlbjptLHNsb3RTY29wZUlkczpofT10O2gmJihjPWM/Yy5jb25jYXQoaCk6aCksZT09bnVsbD8obyhkLG4sciksbyhmLG4sciksVCh0LmNoaWxkcmVufHxbXSxuLGYsaSxhLHMsYyxsKSk6cD4wJiZwJjY0JiZtJiZlLmR5bmFtaWNDaGlsZHJlbiYmZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoPT09bS5sZW5ndGg/KGllKGUuZHluYW1pY0NoaWxkcmVuLG0sbixpLGEscyxjKSwodC5rZXkhPW51bGx8fGkmJnQ9PT1pLnN1YlRyZWUpJiZVbyhlLHQsITApKTpkZShlLHQsbixmLGksYSxzLGMsbCl9LG9lPShlLHQsbixyLGksYSxvLHMsYyk9Pnt0LnNsb3RTY29wZUlkcz1zLGU9PW51bGw/dC5zaGFwZUZsYWcmNTEyP2kuY3R4LmFjdGl2YXRlKHQsbixyLG8sYyk6c2UodCxuLHIsaSxhLG8sYyk6Y2UoZSx0LGMpfSxzZT0oZSx0LG4scixpLGEsbyk9PntsZXQgcz1lLmNvbXBvbmVudD1OcyhlLHIsaSk7aWYoemkoZSkmJihzLmN0eC5yZW5kZXJlcj1DZSksSHMocywhMSxvKSxzLmFzeW5jRGVwKXtpZihpJiZpLnJlZ2lzdGVyRGVwKHMsRCxvKSwhZS5lbCl7bGV0IHI9cy5zdWJUcmVlPUgoY3MpO2IobnVsbCxyLHQsbiksZS5wbGFjZWhvbGRlcj1yLmVsfX1lbHNlIEQocyxlLHQsbixpLGEsbyl9LGNlPShlLHQsbik9PntsZXQgcj10LmNvbXBvbmVudD1lLmNvbXBvbmVudDtpZihtbyhlLHQsbikpe2lmKHIuYXN5bmNEZXAmJiFyLmFzeW5jUmVzb2x2ZWQpe3VlKHIsdCxuKTtyZXR1cm59ci5uZXh0PXQsci51cGRhdGUoKX1lbHNlIHQuZWw9ZS5lbCxyLnZub2RlPXR9LEQ9KGUsdCxuLHIsaSxhLG8pPT57bGV0IHM9KCk9PntpZihlLmlzTW91bnRlZCl7bGV0e25leHQ6dCxidTpuLHU6cixwYXJlbnQ6cyx2bm9kZTpjfT1lO3tsZXQgbj1HbyhlKTtpZihuKXt0JiYodC5lbD1jLmVsLHVlKGUsdCxvKSksbi5hc3luY0RlcC50aGVuKCgpPT57SW8oKCk9PntlLmlzVW5tb3VudGVkfHxsKCl9LGkpfSk7cmV0dXJufX1sZXQgdT10LGQ7Vm8oZSwhMSksdD8odC5lbD1jLmVsLHVlKGUsdCxvKSk6dD1jLG4mJmxlKG4pLChkPXQucHJvcHMmJnQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkFzKGQscyx0LGMpLFZvKGUsITApO2xldCBmPWxvKGUpLHA9ZS5zdWJUcmVlO2Uuc3ViVHJlZT1mLHYocCxmLG0ocC5lbCksTyhwKSxlLGksYSksdC5lbD1mLmVsLHU9PT1udWxsJiZfbyhlLGYuZWwpLHImJklvKHIsaSksKGQ9dC5wcm9wcyYmdC5wcm9wcy5vblZub2RlVXBkYXRlZCkmJklvKCgpPT5BcyhkLHMsdCxjKSxpKX1lbHNle2xldCBvLHtlbDpzLHByb3BzOmN9PXQse2JtOmwsbTp1LHBhcmVudDpkLHJvb3Q6Zix0eXBlOnB9PWUsbT1JaSh0KTtpZihWbyhlLCExKSxsJiZsZShsKSwhbSYmKG89YyYmYy5vblZub2RlQmVmb3JlTW91bnQpJiZBcyhvLGQsdCksVm8oZSwhMCkscyYmVGUpe2xldCB0PSgpPT57ZS5zdWJUcmVlPWxvKGUpLFRlKHMsZS5zdWJUcmVlLGUsaSxudWxsKX07bSYmcC5fX2FzeW5jSHlkcmF0ZT9wLl9fYXN5bmNIeWRyYXRlKHMsZSx0KTp0KCl9ZWxzZXtmLmNlJiZmLmNlLl9oYXNTaGFkb3dSb290KCkmJmYuY2UuX2luamVjdENoaWxkU3R5bGUocCxlLnBhcmVudD9lLnBhcmVudC50eXBlOnZvaWQgMCk7bGV0IG89ZS5zdWJUcmVlPWxvKGUpO3YobnVsbCxvLG4scixlLGksYSksdC5lbD1vLmVsfWlmKHUmJklvKHUsaSksIW0mJihvPWMmJmMub25Wbm9kZU1vdW50ZWQpKXtsZXQgZT10O0lvKCgpPT5BcyhvLGQsZSksaSl9KHQuc2hhcGVGbGFnJjI1Nnx8ZCYmSWkoZC52bm9kZSkmJmQudm5vZGUuc2hhcGVGbGFnJjI1NikmJmUuYSYmSW8oZS5hLGkpLGUuaXNNb3VudGVkPSEwLHQ9bj1yPW51bGx9fTtlLnNjb3BlLm9uKCk7bGV0IGM9ZS5lZmZlY3Q9bmV3IHplKHMpO2Uuc2NvcGUub2ZmKCk7bGV0IGw9ZS51cGRhdGU9Yy5ydW4uYmluZChjKSx1PWUuam9iPWMucnVuSWZEaXJ0eS5iaW5kKGMpO3UuaT1lLHUuaWQ9ZS51aWQsYy5zY2hlZHVsZXI9KCk9PmVyKHUpLFZvKGUsITApLGwoKX0sdWU9KGUsdCxuKT0+e3QuY29tcG9uZW50PWU7bGV0IHI9ZS52bm9kZS5wcm9wcztlLnZub2RlPXQsZS5uZXh0PW51bGwsU28oZSx0LnByb3BzLHIsbiksRm8oZSx0LmNoaWxkcmVuLG4pLG50KCkscnIoZSkscnQoKX0sZGU9KGUsdCxuLHIsaSxhLG8scyxjPSExKT0+e2xldCBsPWUmJmUuY2hpbGRyZW4sdT1lP2Uuc2hhcGVGbGFnOjAsZD10LmNoaWxkcmVuLHtwYXRjaEZsYWc6ZixzaGFwZUZsYWc6bX09dDtpZihmPjApe2lmKGYmMTI4KXtwZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufWlmKGYmMjU2KXtmZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufX1tJjg/KHUmMTYmJmJlKGwsaSxhKSxkIT09bCYmcChuLGQpKTp1JjE2P20mMTY/cGUobCxkLG4scixpLGEsbyxzLGMpOmJlKGwsaSxhLCEwKToodSY4JiZwKG4sYGApLG0mMTYmJlQoZCxuLHIsaSxhLG8scyxjKSl9LGZlPShlLHQsbixyLGEsbyxzLGMsbCk9PntlfHw9aSx0fHw9aTtsZXQgdT1lLmxlbmd0aCxkPXQubGVuZ3RoLGY9TWF0aC5taW4odSxkKSxwO2ZvcihwPTA7cDxmO3ArKyl7bGV0IHI9dFtwXT1sP0RzKHRbcF0pOkVzKHRbcF0pO3YoZVtwXSxyLG4sbnVsbCxhLG8scyxjLGwpfXU+ZD9iZShlLGEsbywhMCwhMSxmKTpUKHQsbixyLGEsbyxzLGMsbCxmKX0scGU9KGUsdCxuLHIsYSxvLHMsYyxsKT0+e2xldCB1PTAsZD10Lmxlbmd0aCxmPWUubGVuZ3RoLTEscD1kLTE7Zm9yKDt1PD1mJiZ1PD1wOyl7bGV0IHI9ZVt1XSxpPXRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKTtpZihfcyhyLGkpKXYocixpLG4sbnVsbCxhLG8scyxjLGwpO2Vsc2UgYnJlYWs7dSsrfWZvcig7dTw9ZiYmdTw9cDspe2xldCByPWVbZl0saT10W3BdPWw/RHModFtwXSk6RXModFtwXSk7aWYoX3MocixpKSl2KHIsaSxuLG51bGwsYSxvLHMsYyxsKTtlbHNlIGJyZWFrO2YtLSxwLS19aWYodT5mKXtpZih1PD1wKXtsZXQgZT1wKzEsaT1lPGQ/dFtlXS5lbDpyO2Zvcig7dTw9cDspdihudWxsLHRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKSxuLGksYSxvLHMsYyxsKSx1Kyt9fWVsc2UgaWYodT5wKWZvcig7dTw9ZjspZ2UoZVt1XSxhLG8sITApLHUrKztlbHNle2xldCBtPXUsaD11LGc9bmV3IE1hcDtmb3IodT1oO3U8PXA7dSsrKXtsZXQgZT10W3VdPWw/RHModFt1XSk6RXModFt1XSk7ZS5rZXkhPW51bGwmJmcuc2V0KGUua2V5LHUpfWxldCBfLHk9MCxiPXAtaCsxLHg9ITEsUz0wLEM9QXJyYXkoYik7Zm9yKHU9MDt1PGI7dSsrKUNbdV09MDtmb3IodT1tO3U8PWY7dSsrKXtsZXQgcj1lW3VdO2lmKHk+PWIpe2dlKHIsYSxvLCEwKTtjb250aW51ZX1sZXQgaTtpZihyLmtleSE9bnVsbClpPWcuZ2V0KHIua2V5KTtlbHNlIGZvcihfPWg7Xzw9cDtfKyspaWYoQ1tfLWhdPT09MCYmX3Mocix0W19dKSl7aT1fO2JyZWFrfWk9PT12b2lkIDA/Z2UocixhLG8sITApOihDW2ktaF09dSsxLGk+PVM/Uz1pOng9ITAsdihyLHRbaV0sbixudWxsLGEsbyxzLGMsbCkseSsrKX1sZXQgdz14P1dvKEMpOmk7Zm9yKF89dy5sZW5ndGgtMSx1PWItMTt1Pj0wO3UtLSl7bGV0IGU9aCt1LGk9dFtlXSxmPXRbZSsxXSxwPWUrMTxkP2YuZWx8fHFvKGYpOnI7Q1t1XT09PTA/dihudWxsLGksbixwLGEsbyxzLGMsbCk6eCYmKF88MHx8dSE9PXdbX10/aGUoaSxuLHAsMik6Xy0tKX19fSxoZT0oZSx0LG4scixpPW51bGwpPT57bGV0e2VsOmEsdHlwZTpjLHRyYW5zaXRpb246bCxjaGlsZHJlbjp1LHNoYXBlRmxhZzpkfT1lO2lmKGQmNil7aGUoZS5jb21wb25lbnQuc3ViVHJlZSx0LG4scik7cmV0dXJufWlmKGQmMTI4KXtlLnN1c3BlbnNlLm1vdmUodCxuLHIpO3JldHVybn1pZihkJjY0KXtjLm1vdmUoZSx0LG4sQ2UpO3JldHVybn1pZihjPT09TCl7byhhLHQsbik7Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspaGUodVtlXSx0LG4scik7byhlLmFuY2hvcix0LG4pO3JldHVybn1pZihjPT09bHMpe1MoZSx0LG4pO3JldHVybn1pZihyIT09MiYmZCYxJiZsKXtpZihyPT09MClsLnBlcnNpc3RlZCYmIWFbV3JdP28oYSx0LG4pOihsLmJlZm9yZUVudGVyKGEpLG8oYSx0LG4pLElvKCgpPT5sLmVudGVyKGEpLGkpKTtlbHNle2xldHtsZWF2ZTpyLGRlbGF5TGVhdmU6aSxhZnRlckxlYXZlOmN9PWwsdT0oKT0+e2UuY3R4LmlzVW5tb3VudGVkP3MoYSk6byhhLHQsbil9LGQ9KCk9PntsZXQgZT1hLl9pc0xlYXZpbmd8fCEhYVtXcl07YS5faXNMZWF2aW5nJiZhW1dyXSghMCksbC5wZXJzaXN0ZWQmJiFlP3UoKTpyKGEsKCk9Pnt1KCksYyYmYygpfSl9O2k/aShhLHUsZCk6ZCgpfX1lbHNlIG8oYSx0LG4pfSxnZT0oZSx0LG4scj0hMSxpPSExKT0+e2xldHt0eXBlOmEscHJvcHM6byxyZWY6cyxjaGlsZHJlbjpjLGR5bmFtaWNDaGlsZHJlbjpsLHNoYXBlRmxhZzp1LHBhdGNoRmxhZzpkLGRpcnM6ZixjYWNoZUluZGV4OnAsbWVtbzptfT1lO2lmKGQ9PT0tMiYmKGk9ITEpLHMhPW51bGwmJihudCgpLHVpKHMsbnVsbCxuLGUsITApLHJ0KCkpLHAhPW51bGwmJih0LnJlbmRlckNhY2hlW3BdPXZvaWQgMCksdSYyNTYpe3QuY3R4LmRlYWN0aXZhdGUoZSk7cmV0dXJufWxldCBoPXUmMSYmZixnPSFJaShlKSxfO2lmKGcmJihfPW8mJm8ub25Wbm9kZUJlZm9yZVVubW91bnQpJiZBcyhfLHQsZSksdSY2KXllKGUuY29tcG9uZW50LG4scik7ZWxzZXtpZih1JjEyOCl7ZS5zdXNwZW5zZS51bm1vdW50KG4scik7cmV0dXJufWgmJl9yKGUsbnVsbCx0LGBiZWZvcmVVbm1vdW50YCksdSY2ND9lLnR5cGUucmVtb3ZlKGUsdCxuLENlLHIpOmwmJiFsLmhhc09uY2UmJihhIT09THx8ZD4wJiZkJjY0KT9iZShsLHQsbiwhMSwhMCk6KGE9PT1MJiZkJjM4NHx8IWkmJnUmMTYpJiZiZShjLHQsbiksciYmX2UoZSl9bGV0IHY9bSE9bnVsbCYmcD09bnVsbDsoZyYmKF89byYmby5vblZub2RlVW5tb3VudGVkKXx8aHx8dikmJklvKCgpPT57XyYmQXMoXyx0LGUpLGgmJl9yKGUsbnVsbCx0LGB1bm1vdW50ZWRgKSx2JiYoZS5lbD1udWxsKX0sbil9LF9lPWU9PntsZXR7dHlwZTp0LGVsOm4sYW5jaG9yOnIsdHJhbnNpdGlvbjppfT1lO2lmKHQ9PT1MKXt2ZShuLHIpO3JldHVybn1pZih0PT09bHMpe0MoZSk7cmV0dXJufWxldCBhPSgpPT57cyhuKSxpJiYhaS5wZXJzaXN0ZWQmJmkuYWZ0ZXJMZWF2ZSYmaS5hZnRlckxlYXZlKCl9O2lmKGUuc2hhcGVGbGFnJjEmJmkmJiFpLnBlcnNpc3RlZCl7bGV0e2xlYXZlOnQsZGVsYXlMZWF2ZTpyfT1pLG89KCk9PnQobixhKTtyP3IoZS5lbCxhLG8pOm8oKX1lbHNlIGEoKX0sdmU9KGUsdCk9PntsZXQgbjtmb3IoO2UhPT10OyluPWgoZSkscyhlKSxlPW47cyh0KX0seWU9KGUsdCxuKT0+e2xldHtidW06cixzY29wZTppLGpvYjphLHN1YlRyZWU6byx1bTpzLG06YyxhOmx9PWU7S28oYyksS28obCksciYmbGUociksaS5zdG9wKCksYSYmKGEuZmxhZ3N8PTgsZ2UobyxlLHQsbikpLHMmJklvKHMsdCksSW8oKCk9PntlLmlzVW5tb3VudGVkPSEwfSx0KX0sYmU9KGUsdCxuLHI9ITEsaT0hMSxhPTApPT57Zm9yKGxldCBvPWE7bzxlLmxlbmd0aDtvKyspZ2UoZVtvXSx0LG4scixpKX0sTz1lPT57aWYoZS5zaGFwZUZsYWcmNilyZXR1cm4gTyhlLmNvbXBvbmVudC5zdWJUcmVlKTtpZihlLnNoYXBlRmxhZyYxMjgpcmV0dXJuIGUuc3VzcGVuc2UubmV4dCgpO2xldCB0PWgoZS5hbmNob3J8fGUuZWwpLG49dCYmdFtqcl07cmV0dXJuIG4/aChuKTp0fSx4ZT0hMSxTZT0oZSx0LG4pPT57bGV0IHI7ZT09bnVsbD90Ll92bm9kZSYmKGdlKHQuX3Zub2RlLG51bGwsbnVsbCwhMCkscj10Ll92bm9kZS5jb21wb25lbnQpOnYodC5fdm5vZGV8fG51bGwsZSx0LG51bGwsbnVsbCxudWxsLG4pLHQuX3Zub2RlPWUseGV8fD0oeGU9ITAscnIociksaXIoKSwhMSl9LENlPXtwOnYsdW06Z2UsbTpoZSxyOl9lLG10OnNlLG1jOlQscGM6ZGUscGJjOmllLG46TyxvOmV9LHdlLFRlO3JldHVybiB0JiYoW3dlLFRlXT10KENlKSkse3JlbmRlcjpTZSxoeWRyYXRlOndlLGNyZWF0ZUFwcDp0byhTZSx3ZSl9fWZ1bmN0aW9uIEJvKHt0eXBlOmUscHJvcHM6dH0sbil7cmV0dXJuIG49PT1gc3ZnYCYmZT09PWBmb3JlaWduT2JqZWN0YHx8bj09PWBtYXRobWxgJiZlPT09YGFubm90YXRpb24teG1sYCYmdCYmdC5lbmNvZGluZyYmdC5lbmNvZGluZy5pbmNsdWRlcyhgaHRtbGApP3ZvaWQgMDpufWZ1bmN0aW9uIFZvKHtlZmZlY3Q6ZSxqb2I6dH0sbil7bj8oZS5mbGFnc3w9MzIsdC5mbGFnc3w9NCk6KGUuZmxhZ3MmPS0zMyx0LmZsYWdzJj0tNSl9ZnVuY3Rpb24gSG8oZSx0KXtyZXR1cm4oIWV8fGUmJiFlLnBlbmRpbmdCcmFuY2gpJiZ0JiYhdC5wZXJzaXN0ZWR9ZnVuY3Rpb24gVW8oZSx0LG49ITEpe2xldCByPWUuY2hpbGRyZW4saT10LmNoaWxkcmVuO2lmKHAocikmJnAoaSkpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCB0PXJbZV0sYT1pW2VdO2Euc2hhcGVGbGFnJjEmJiFhLmR5bmFtaWNDaGlsZHJlbiYmKChhLnBhdGNoRmxhZzw9MHx8YS5wYXRjaEZsYWc9PT0zMikmJihhPWlbZV09RHMoaVtlXSksYS5lbD10LmVsKSwhbiYmYS5wYXRjaEZsYWchPT0tMiYmVW8odCxhKSksYS50eXBlPT09c3MmJihhLnBhdGNoRmxhZz09PS0xJiYoYT1pW2VdPURzKGEpKSxhLmVsPXQuZWwpLGEudHlwZT09PWNzJiYhYS5lbCYmKGEuZWw9dC5lbCl9fWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKSxuPVswXSxyLGksYSxvLHMsYz1lLmxlbmd0aDtmb3Iocj0wO3I8YztyKyspe2xldCBjPWVbcl07aWYoYyE9PTApe2lmKGk9bltuLmxlbmd0aC0xXSxlW2ldPGMpe3Rbcl09aSxuLnB1c2gocik7Y29udGludWV9Zm9yKGE9MCxvPW4ubGVuZ3RoLTE7YTxvOylzPWErbz4+MSxlW25bc11dPGM/YT1zKzE6bz1zO2M8ZVtuW2FdXSYmKGE+MCYmKHRbcl09blthLTFdKSxuW2FdPXIpfX1mb3IoYT1uLmxlbmd0aCxvPW5bYS0xXTthLS0+MDspblthXT1vLG89dFtvXTtyZXR1cm4gbn1mdW5jdGlvbiBHbyhlKXtsZXQgdD1lLnN1YlRyZWUuY29tcG9uZW50O2lmKHQpcmV0dXJuIHQuYXN5bmNEZXAmJiF0LmFzeW5jUmVzb2x2ZWQ/dDpHbyh0KX1mdW5jdGlvbiBLbyhlKXtpZihlKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmxhZ3N8PTh9ZnVuY3Rpb24gcW8oZSl7aWYoZS5wbGFjZWhvbGRlcilyZXR1cm4gZS5wbGFjZWhvbGRlcjtsZXQgdD1lLmNvbXBvbmVudDtyZXR1cm4gdD9xbyh0LnN1YlRyZWUpOm51bGx9dmFyIEpvPWU9PmUuX19pc1N1c3BlbnNlLFlvPTAsWG89e25hbWU6YFN1c3BlbnNlYCxfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxsKXtpZihlPT1udWxsKVFvKHQsbixyLGksYSxvLHMsYyxsKTtlbHNle2lmKGEmJmEuZGVwcz4wJiYhZS5zdXNwZW5zZS5pc0luRmFsbGJhY2spe3Quc3VzcGVuc2U9ZS5zdXNwZW5zZSx0LnN1c3BlbnNlLnZub2RlPXQsdC5lbD1lLmVsO3JldHVybn0kbyhlLHQsbixyLGksbyxzLGMsbCl9fSxoeWRyYXRlOnRzLG5vcm1hbGl6ZTpuc307ZnVuY3Rpb24gWm8oZSx0KXtsZXQgbj1lLnByb3BzJiZlLnByb3BzW3RdO3YobikmJm4oKX1mdW5jdGlvbiBRbyhlLHQsbixyLGksYSxvLHMsYyl7bGV0e3A6bCxvOntjcmVhdGVFbGVtZW50OnV9fT1jLGQ9dShgZGl2YCksZj1lLnN1c3BlbnNlPWVzKGUsaSxyLHQsZCxuLGEsbyxzLGMpO2wobnVsbCxmLnBlbmRpbmdCcmFuY2g9ZS5zc0NvbnRlbnQsZCxudWxsLHIsZixhLG8pLGYuZGVwcz4wPyhabyhlLGBvblBlbmRpbmdgKSxabyhlLGBvbkZhbGxiYWNrYCksbChudWxsLGUuc3NGYWxsYmFjayx0LG4scixudWxsLGEsbyksYXMoZixlLnNzRmFsbGJhY2spKTpmLnJlc29sdmUoITEsITApfWZ1bmN0aW9uICRvKGUsdCxuLHIsaSxhLG8scyx7cDpjLHVtOmwsbzp7Y3JlYXRlRWxlbWVudDp1fX0pe2xldCBkPXQuc3VzcGVuc2U9ZS5zdXNwZW5zZTtkLnZub2RlPXQsdC5lbD1lLmVsO2xldCBmPXQuc3NDb250ZW50LHA9dC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6bSxwZW5kaW5nQnJhbmNoOmgsaXNJbkZhbGxiYWNrOmcsaXNIeWRyYXRpbmc6X309ZDtpZihoKWQucGVuZGluZ0JyYW5jaD1mLF9zKGgsZik/KGMoaCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6ZyYmKF98fChjKG0scCxuLHIsaSxudWxsLGEsbyxzKSxhcyhkLHApKSkpOihkLnBlbmRpbmdJZD1ZbysrLF8/KGQuaXNIeWRyYXRpbmc9ITEsZC5hY3RpdmVCcmFuY2g9aCk6bChoLGksZCksZC5kZXBzPTAsZC5lZmZlY3RzLmxlbmd0aD0wLGQuaGlkZGVuQ29udGFpbmVyPXUoYGRpdmApLGc/KGMobnVsbCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6KGMobSxwLG4scixpLG51bGwsYSxvLHMpLGFzKGQscCkpKTptJiZfcyhtLGYpPyhjKG0sZixuLHIsaSxkLGEsbyxzKSxkLnJlc29sdmUoITApKTooYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MCYmZC5yZXNvbHZlKCkpKTtlbHNlIGlmKG0mJl9zKG0sZikpYyhtLGYsbixyLGksZCxhLG8scyksYXMoZCxmKTtlbHNlIGlmKFpvKHQsYG9uUGVuZGluZ2ApLGQucGVuZGluZ0JyYW5jaD1mLGQucGVuZGluZ0lkPWYuc2hhcGVGbGFnJjUxMj9mLmNvbXBvbmVudC5zdXNwZW5zZUlkOllvKyssYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MClkLnJlc29sdmUoKTtlbHNle2xldHt0aW1lb3V0OmUscGVuZGluZ0lkOnR9PWQ7ZT4wP3NldFRpbWVvdXQoKCk9PntkLnBlbmRpbmdJZD09PXQmJmQuZmFsbGJhY2socCl9LGUpOmU9PT0wJiZkLmZhbGxiYWNrKHApfX1mdW5jdGlvbiBlcyhlLHQsbixyLGksYSxvLHMsYyxsLHU9ITEpe2xldHtwOmQsbTpmLHVtOnAsbjptLG86e3BhcmVudE5vZGU6aCxyZW1vdmU6Z319PWwsXyx2PW9zKGUpO3YmJnQmJnQucGVuZGluZ0JyYW5jaCYmKF89dC5wZW5kaW5nSWQsdC5kZXBzKyspO2xldCB5PWUucHJvcHM/ZmUoZS5wcm9wcy50aW1lb3V0KTp2b2lkIDAsYj1hLHg9e3Zub2RlOmUscGFyZW50OnQscGFyZW50Q29tcG9uZW50Om4sbmFtZXNwYWNlOm8sY29udGFpbmVyOnIsaGlkZGVuQ29udGFpbmVyOmksZGVwczowLHBlbmRpbmdJZDpZbysrLHRpbWVvdXQ6dHlwZW9mIHk9PWBudW1iZXJgP3k6LTEsYWN0aXZlQnJhbmNoOm51bGwsaXNGYWxsYmFja01vdW50UGVuZGluZzohMSxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiF1LGlzSHlkcmF0aW5nOnUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKGU9ITEsbj0hMSl7bGV0e3Zub2RlOnIsYWN0aXZlQnJhbmNoOmkscGVuZGluZ0JyYW5jaDpvLHBlbmRpbmdJZDpzLGVmZmVjdHM6YyxwYXJlbnRDb21wb25lbnQ6bCxjb250YWluZXI6dSxpc0luRmFsbGJhY2s6ZH09eCxnPSExO2lmKHguaXNIeWRyYXRpbmcpeC5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFlKXtnPWkmJm8udHJhbnNpdGlvbiYmby50cmFuc2l0aW9uLm1vZGU9PT1gb3V0LWluYDtsZXQgZT0hMTtnJiYoaS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntzPT09eC5wZW5kaW5nSWQmJihmKG8sdSxhPT09YiYmIWU/bShpKTphLDApLG5yKGMpLGQmJnIuc3NGYWxsYmFjayYmKHIuc3NGYWxsYmFjay5lbD1udWxsKSl9KSxpJiYheC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nJiYoaChpLmVsKT09PXUmJihhPW0oaSksZT0hMCkscChpLGwseCwhMCksIWcmJmQmJnIuc3NGYWxsYmFjayYmSW8oKCk9PnIuc3NGYWxsYmFjay5lbD1udWxsLHgpKSxnfHxmKG8sdSxhLDApfXguaXNGYWxsYmFja01vdW50UGVuZGluZz0hMSxhcyh4LG8pLHgucGVuZGluZ0JyYW5jaD1udWxsLHguaXNJbkZhbGxiYWNrPSExO2xldCB5PXgucGFyZW50LFM9ITE7Zm9yKDt5Oyl7aWYoeS5wZW5kaW5nQnJhbmNoKXtmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKyl5LmVmZmVjdHMucHVzaChjW2VdKTtTPSEwO2JyZWFrfXk9eS5wYXJlbnR9IVMmJiFnJiZucihjKSx4LmVmZmVjdHM9W10sdiYmdCYmdC5wZW5kaW5nQnJhbmNoJiZfPT09dC5wZW5kaW5nSWQmJih0LmRlcHMtLSx0LmRlcHM9PT0wJiYhbiYmdC5yZXNvbHZlKCkpLFpvKHIsYG9uUmVzb2x2ZWApfSxmYWxsYmFjayhlKXtpZigheC5wZW5kaW5nQnJhbmNoKXJldHVybjtsZXR7dm5vZGU6dCxhY3RpdmVCcmFuY2g6bixwYXJlbnRDb21wb25lbnQ6cixjb250YWluZXI6aSxuYW1lc3BhY2U6YX09eDtabyh0LGBvbkZhbGxiYWNrYCk7bGV0IG89bShuKSxsPSgpPT57eC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nPSExLHguaXNJbkZhbGxiYWNrJiYoZChudWxsLGUsaSxvLHIsbnVsbCxhLHMsYyksYXMoeCxlKSl9LHU9ZS50cmFuc2l0aW9uJiZlLnRyYW5zaXRpb24ubW9kZT09PWBvdXQtaW5gO3UmJih4LmlzRmFsbGJhY2tNb3VudFBlbmRpbmc9ITAsbi50cmFuc2l0aW9uLmFmdGVyTGVhdmU9bCkseC5pc0luRmFsbGJhY2s9ITAscChuLHIsbnVsbCwhMCksdXx8bCgpfSxtb3ZlKGUsdCxuKXt4LmFjdGl2ZUJyYW5jaCYmZih4LmFjdGl2ZUJyYW5jaCxlLHQsbikseC5jb250YWluZXI9ZX0sbmV4dCgpe3JldHVybiB4LmFjdGl2ZUJyYW5jaCYmbSh4LmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKGUsdCxuKXtsZXQgcj0hIXgucGVuZGluZ0JyYW5jaDtyJiZ4LmRlcHMrKztsZXQgaT1lLnZub2RlLmVsO2UuYXN5bmNEZXAuY2F0Y2godD0+e1VuKHQsZSwwKX0pLnRoZW4oYT0+e2lmKGUuaXNVbm1vdW50ZWR8fHguaXNVbm1vdW50ZWR8fHgucGVuZGluZ0lkIT09ZS5zdXNwZW5zZUlkKXJldHVybjt6cygpLGUuYXN5bmNSZXNvbHZlZD0hMDtsZXR7dm5vZGU6c309ZTtXcyhlLGEsITEpLGkmJihzLmVsPWkpO2xldCBjPSFpJiZlLnN1YlRyZWUuZWw7dChlLHMsaChpfHxlLnN1YlRyZWUuZWwpLGk/bnVsbDptKGUuc3ViVHJlZSkseCxvLG4pLGMmJihzLnBsYWNlaG9sZGVyPW51bGwsZyhjKSksX28oZSxzLmVsKSxyJiYtLXguZGVwcz09PTAmJngucmVzb2x2ZSgpfSl9LHVubW91bnQoZSx0KXt4LmlzVW5tb3VudGVkPSEwLHguYWN0aXZlQnJhbmNoJiZwKHguYWN0aXZlQnJhbmNoLG4sZSx0KSx4LnBlbmRpbmdCcmFuY2gmJnAoeC5wZW5kaW5nQnJhbmNoLG4sZSx0KX19O3JldHVybiB4fWZ1bmN0aW9uIHRzKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD10LnN1c3BlbnNlPWVzKHQscixuLGUucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBkaXZgKSxudWxsLGksYSxvLHMsITApLHU9YyhlLGwucGVuZGluZ0JyYW5jaD10LnNzQ29udGVudCxuLGwsYSxvKTtyZXR1cm4gbC5kZXBzPT09MCYmbC5yZXNvbHZlKCExLCEwKSx1fWZ1bmN0aW9uIG5zKGUpe2xldHtzaGFwZUZsYWc6dCxjaGlsZHJlbjpufT1lLHI9dCYzMjtlLnNzQ29udGVudD1ycyhyP24uZGVmYXVsdDpuKSxlLnNzRmFsbGJhY2s9cj9ycyhuLmZhbGxiYWNrKTpIKGNzKX1mdW5jdGlvbiBycyhlKXtsZXQgdDtpZih2KGUpKXtsZXQgbj1wcyYmZS5fYztuJiYoZS5fZD0hMSxSKCkpLGU9ZSgpLG4mJihlLl9kPSEwLHQ9ZHMsZnMoKSl9cmV0dXJuIHAoZSkmJihlPXVvKGUpKSxlPUVzKGUpLHQmJiFlLmR5bmFtaWNDaGlsZHJlbiYmKGUuZHluYW1pY0NoaWxkcmVuPXQuZmlsdGVyKHQ9PnQhPT1lKSksZX1mdW5jdGlvbiBpcyhlLHQpe3QmJnQucGVuZGluZ0JyYW5jaD9wKGUpP3QuZWZmZWN0cy5wdXNoKC4uLmUpOnQuZWZmZWN0cy5wdXNoKGUpOm5yKGUpfWZ1bmN0aW9uIGFzKGUsdCl7ZS5hY3RpdmVCcmFuY2g9dDtsZXR7dm5vZGU6bixwYXJlbnRDb21wb25lbnQ6cn09ZSxpPXQuZWw7Zm9yKDshaSYmdC5jb21wb25lbnQ7KXQ9dC5jb21wb25lbnQuc3ViVHJlZSxpPXQuZWw7bi5lbD1pLHImJnIuc3ViVHJlZT09PW4mJihyLnZub2RlLmVsPWksX28ocixpKSl9ZnVuY3Rpb24gb3MoZSl7bGV0IHQ9ZS5wcm9wcyYmZS5wcm9wcy5zdXNwZW5zaWJsZTtyZXR1cm4gdCE9bnVsbCYmdCE9PSExfXZhciBMPVN5bWJvbC5mb3IoYHYtZmd0YCksc3M9U3ltYm9sLmZvcihgdi10eHRgKSxjcz1TeW1ib2wuZm9yKGB2LWNtdGApLGxzPVN5bWJvbC5mb3IoYHYtc3RjYCksdXM9W10sZHM9bnVsbDtmdW5jdGlvbiBSKGU9ITEpe3VzLnB1c2goZHM9ZT9udWxsOltdKX1mdW5jdGlvbiBmcygpe3VzLnBvcCgpLGRzPXVzW3VzLmxlbmd0aC0xXXx8bnVsbH12YXIgcHM9MTtmdW5jdGlvbiBtcyhlLHQ9ITEpe3BzKz1lLGU8MCYmZHMmJnQmJihkcy5oYXNPbmNlPSEwKX1mdW5jdGlvbiBocyhlKXtyZXR1cm4gZS5keW5hbWljQ2hpbGRyZW49cHM+MD9kc3x8aTpudWxsLGZzKCkscHM+MCYmZHMmJmRzLnB1c2goZSksZX1mdW5jdGlvbiB6KGUsdCxuLHIsaSxhKXtyZXR1cm4gaHMoVihlLHQsbixyLGksYSwhMCkpfWZ1bmN0aW9uIEIoZSx0LG4scixpKXtyZXR1cm4gaHMoSChlLHQsbixyLGksITApKX1mdW5jdGlvbiBncyhlKXtyZXR1cm4gZT9lLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gX3MoZSx0KXtyZXR1cm4gZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQua2V5fWZ1bmN0aW9uIHZzKGUpe312YXIgeXM9KHtrZXk6ZX0pPT5lPz9udWxsLGJzPSh7cmVmOmUscmVmX2tleTp0LHJlZl9mb3I6bn0pPT4odHlwZW9mIGU9PWBudW1iZXJgJiYoZT1gYCtlKSxlPT1udWxsP251bGw6eShlKXx8aihlKXx8dihlKT97aTp1cixyOmUsazp0LGY6ISFufTplKTtmdW5jdGlvbiBWKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ZT09PUw/MDoxLG89ITEscz0hMSl7bGV0IGM9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6ZSxwcm9wczp0LGtleTp0JiZ5cyh0KSxyZWY6dCYmYnModCksc2NvcGVJZDpkcixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpuLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRTdGFydDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOmEscGF0Y2hGbGFnOnIsZHluYW1pY1Byb3BzOmksZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDp1cn07cmV0dXJuIHM/KE9zKGMsbiksYSYxMjgmJmUubm9ybWFsaXplKGMpKTpuJiYoYy5zaGFwZUZsYWd8PXkobik/ODoxNikscHM+MCYmIW8mJmRzJiYoYy5wYXRjaEZsYWc+MHx8YSY2KSYmYy5wYXRjaEZsYWchPT0zMiYmZHMucHVzaChjKSxjfXZhciBIPXhzO2Z1bmN0aW9uIHhzKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ITEpe2lmKCghZXx8ZT09PWxhKSYmKGU9Y3MpLGdzKGUpKXtsZXQgcj1DcyhlLHQsITApO3JldHVybiBuJiZPcyhyLG4pLHBzPjAmJiFhJiZkcyYmKHIuc2hhcGVGbGFnJjY/ZHNbZHMuaW5kZXhPZihlKV09cjpkcy5wdXNoKHIpKSxyLnBhdGNoRmxhZz0tMixyfWlmKGVjKGUpJiYoZT1lLl9fdmNjT3B0cyksdCl7dD1Tcyh0KTtsZXR7Y2xhc3M6ZSxzdHlsZTpufT10O2UmJiF5KGUpJiYodC5jbGFzcz1PKGUpKSx4KG4pJiYob24obikmJiFwKG4pJiYobj1sKHt9LG4pKSx0LnN0eWxlPWdlKG4pKX1sZXQgbz15KGUpPzE6Sm8oZSk/MTI4Ok1yKGUpPzY0OngoZSk/NDp2KGUpPzI6MDtyZXR1cm4gVihlLHQsbixyLGksbyxhLCEwKX1mdW5jdGlvbiBTcyhlKXtyZXR1cm4gZT9vbihlKXx8Ym8oZSk/bCh7fSxlKTplOm51bGx9ZnVuY3Rpb24gQ3MoZSx0LG49ITEscj0hMSl7bGV0e3Byb3BzOmkscmVmOmEscGF0Y2hGbGFnOm8sY2hpbGRyZW46cyx0cmFuc2l0aW9uOmN9PWUsbD10P2tzKGl8fHt9LHQpOmksdT17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTplLnR5cGUscHJvcHM6bCxrZXk6bCYmeXMobCkscmVmOnQmJnQucmVmP24mJmE/cChhKT9hLmNvbmNhdChicyh0KSk6W2EsYnModCldOmJzKHQpOmEsc2NvcGVJZDplLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmUuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOnMsdGFyZ2V0OmUudGFyZ2V0LHRhcmdldFN0YXJ0OmUudGFyZ2V0U3RhcnQsdGFyZ2V0QW5jaG9yOmUudGFyZ2V0QW5jaG9yLHN0YXRpY0NvdW50OmUuc3RhdGljQ291bnQsc2hhcGVGbGFnOmUuc2hhcGVGbGFnLHBhdGNoRmxhZzp0JiZlLnR5cGUhPT1MP289PT0tMT8xNjpvfDE2Om8sZHluYW1pY1Byb3BzOmUuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjplLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmUuYXBwQ29udGV4dCxkaXJzOmUuZGlycyx0cmFuc2l0aW9uOmMsY29tcG9uZW50OmUuY29tcG9uZW50LHN1c3BlbnNlOmUuc3VzcGVuc2Usc3NDb250ZW50OmUuc3NDb250ZW50JiZDcyhlLnNzQ29udGVudCksc3NGYWxsYmFjazplLnNzRmFsbGJhY2smJkNzKGUuc3NGYWxsYmFjaykscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcixlbDplLmVsLGFuY2hvcjplLmFuY2hvcixjdHg6ZS5jdHgsY2U6ZS5jZX07cmV0dXJuIGMmJnImJnJpKHUsYy5jbG9uZSh1KSksdX1mdW5jdGlvbiBVKGU9YCBgLHQ9MCl7cmV0dXJuIEgoc3MsbnVsbCxlLHQpfWZ1bmN0aW9uIHdzKGUsdCl7bGV0IG49SChscyxudWxsLGUpO3JldHVybiBuLnN0YXRpY0NvdW50PXQsbn1mdW5jdGlvbiBUcyhlPWBgLHQ9ITEpe3JldHVybiB0PyhSKCksQihjcyxudWxsLGUpKTpIKGNzLG51bGwsZSl9ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIGU9PW51bGx8fHR5cGVvZiBlPT1gYm9vbGVhbmA/SChjcyk6cChlKT9IKEwsbnVsbCxlLnNsaWNlKCkpOmdzKGUpP0RzKGUpOkgoc3MsbnVsbCxTdHJpbmcoZSkpfWZ1bmN0aW9uIERzKGUpe3JldHVybiBlLmVsPT09bnVsbCYmZS5wYXRjaEZsYWchPT0tMXx8ZS5tZW1vP2U6Q3MoZSl9ZnVuY3Rpb24gT3MoZSx0KXtsZXQgbj0wLHtzaGFwZUZsYWc6cn09ZTtpZih0PT1udWxsKXQ9bnVsbDtlbHNlIGlmKHAodCkpbj0xNjtlbHNlIGlmKHR5cGVvZiB0PT1gb2JqZWN0YCl7aWYociY2NSl7bGV0IG49dC5kZWZhdWx0O24mJihuLl9jJiYobi5fZD0hMSksT3MoZSxuKCkpLG4uX2MmJihuLl9kPSEwKSk7cmV0dXJufXtuPTMyO2xldCByPXQuXzshciYmIWJvKHQpP3QuX2N0eD11cjpyPT09MyYmdXImJih1ci5zbG90cy5fPT09MT90Ll89MToodC5fPTIsZS5wYXRjaEZsYWd8PTEwMjQpKX19ZWxzZSBpZih2KHQpKXtpZihyJjY1KXtPcyhlLHtkZWZhdWx0OnR9KTtyZXR1cm59dD17ZGVmYXVsdDp0LF9jdHg6dXJ9LG49MzJ9ZWxzZSB0PVN0cmluZyh0KSxyJjY0PyhuPTE2LHQ9W1UodCldKTpuPTg7ZS5jaGlsZHJlbj10LGUuc2hhcGVGbGFnfD1ufWZ1bmN0aW9uIGtzKC4uLmUpe2xldCB0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2ZvcihsZXQgZSBpbiByKWlmKGU9PT1gY2xhc3NgKXQuY2xhc3MhPT1yLmNsYXNzJiYodC5jbGFzcz1PKFt0LmNsYXNzLHIuY2xhc3NdKSk7ZWxzZSBpZihlPT09YHN0eWxlYCl0LnN0eWxlPWdlKFt0LnN0eWxlLHIuc3R5bGVdKTtlbHNlIGlmKHMoZSkpe2xldCBuPXRbZV0saT1yW2VdO2kmJm4hPT1pJiYhKHAobikmJm4uaW5jbHVkZXMoaSkpP3RbZV09bj9bXS5jb25jYXQobixpKTppOmk9PW51bGwmJm49PW51bGwmJiFjKGUpJiYodFtlXT1pKX1lbHNlIGUhPT1gYCYmKHRbZV09cltlXSl9cmV0dXJuIHR9ZnVuY3Rpb24gQXMoZSx0LG4scj1udWxsKXtIbihlLHQsNyxbbixyXSl9dmFyIGpzPSRhKCksTXM9MDtmdW5jdGlvbiBOcyhlLHQsbil7bGV0IGk9ZS50eXBlLGE9KHQ/dC5hcHBDb250ZXh0OmUuYXBwQ29udGV4dCl8fGpzLG89e3VpZDpNcysrLHZub2RlOmUsdHlwZTppLHBhcmVudDp0LGFwcENvbnRleHQ6YSxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxqb2I6bnVsbCxzY29wZTpuZXcgTmUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dD90LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoYS5wcm92aWRlcyksaWRzOnQ/dC5pZHM6W2BgLDAsMF0sYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpFbyhpLGEpLGVtaXRzT3B0aW9uczpzbyhpLGEpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpyLGluaGVyaXRBdHRyczppLmluaGVyaXRBdHRycyxjdHg6cixkYXRhOnIscHJvcHM6cixhdHRyczpyLHNsb3RzOnIscmVmczpyLHNldHVwU3RhdGU6cixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpuLHN1c3BlbnNlSWQ6bj9uLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIG8uY3R4PXtfOm99LG8ucm9vdD10P3Qucm9vdDpvLG8uZW1pdD1hby5iaW5kKG51bGwsbyksZS5jZSYmZS5jZShvKSxvfXZhciBQcz1udWxsLEZzPSgpPT5Qc3x8dXIsSXMsTHM7e2xldCBlPW1lKCksdD0odCxuKT0+e2xldCByO3JldHVybihyPWVbdF0pfHwocj1lW3RdPVtdKSxyLnB1c2gobiksZT0+e3IubGVuZ3RoPjE/ci5mb3JFYWNoKHQ9PnQoZSkpOnJbMF0oZSl9fTtJcz10KGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLGU9PlBzPWUpLExzPXQoYF9fVlVFX1NTUl9TRVRURVJTX19gLGU9PlZzPWUpfXZhciBScz1lPT57bGV0IHQ9UHM7cmV0dXJuIElzKGUpLGUuc2NvcGUub24oKSwoKT0+e2Uuc2NvcGUub2ZmKCksSXModCl9fSx6cz0oKT0+e1BzJiZQcy5zY29wZS5vZmYoKSxJcyhudWxsKX07ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIGUudm5vZGUuc2hhcGVGbGFnJjR9dmFyIFZzPSExO2Z1bmN0aW9uIEhzKGUsdD0hMSxuPSExKXt0JiZMcyh0KTtsZXR7cHJvcHM6cixjaGlsZHJlbjppfT1lLnZub2RlLGE9QnMoZSk7eG8oZSxyLGEsdCksUG8oZSxpLG58fHQpO2xldCBvPWE/VXMoZSx0KTp2b2lkIDA7cmV0dXJuIHQmJkxzKCExKSxvfWZ1bmN0aW9uIFVzKGUsdCl7bGV0IG49ZS50eXBlO2UuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLnByb3h5PW5ldyBQcm94eShlLmN0eCx4YSk7bGV0e3NldHVwOnJ9PW47aWYocil7bnQoKTtsZXQgbj1lLnNldHVwQ29udGV4dD1yLmxlbmd0aD4xP1pzKGUpOm51bGwsaT1ScyhlKSxhPVZuKHIsZSwwLFtlLnByb3BzLG5dKSxvPVMoYSk7aWYocnQoKSxpKCksKG98fGUuc3ApJiYhSWkoZSkmJm9pKGUpLG8pe2lmKGEudGhlbih6cyx6cyksdClyZXR1cm4gYS50aGVuKG49PntMcyghMCk7dHJ5e1dzKGUsbix0KX1maW5hbGx5e0xzKCExKX19KS5jYXRjaCh0PT57VW4odCxlLDApfSk7ZS5hc3luY0RlcD1hfWVsc2UgV3MoZSxhLHQpfWVsc2UgWXMoZSx0KX1mdW5jdGlvbiBXcyhlLHQsbil7dih0KT9lLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/ZS5zc3JSZW5kZXI9dDplLnJlbmRlcj10OngodCkmJihlLnNldHVwU3RhdGU9Z24odCkpLFlzKGUsbil9dmFyIEdzLEtzO2Z1bmN0aW9uIHFzKGUpe0dzPWUsS3M9ZT0+e2UucmVuZGVyLl9yYyYmKGUud2l0aFByb3h5PW5ldyBQcm94eShlLmN0eCxTYSkpfX12YXIgSnM9KCk9PiFHcztmdW5jdGlvbiBZcyhlLHQsbil7bGV0IHI9ZS50eXBlO2lmKCFlLnJlbmRlcil7aWYoIXQmJkdzJiYhci5yZW5kZXIpe2xldCB0PXIudGVtcGxhdGV8fFVhKGUpLnRlbXBsYXRlO2lmKHQpe2xldHtpc0N1c3RvbUVsZW1lbnQ6bixjb21waWxlck9wdGlvbnM6aX09ZS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczphLGNvbXBpbGVyT3B0aW9uczpvfT1yLHM9bChsKHtpc0N1c3RvbUVsZW1lbnQ6bixkZWxpbWl0ZXJzOmF9LGkpLG8pO3IucmVuZGVyPUdzKHQscyl9fWUucmVuZGVyPXIucmVuZGVyfHxhLEtzJiZLcyhlKX17bGV0IHQ9UnMoZSk7bnQoKTt0cnl7emEoZSl9ZmluYWxseXtydCgpLHQoKX19fXZhciBYcz17Z2V0KGUsdCl7cmV0dXJuIHB0KGUsYGdldGAsYGApLGVbdF19fTtmdW5jdGlvbiBacyhlKXtyZXR1cm57YXR0cnM6bmV3IFByb3h5KGUuYXR0cnMsWHMpLHNsb3RzOmUuc2xvdHMsZW1pdDplLmVtaXQsZXhwb3NlOnQ9PntlLmV4cG9zZWQ9dHx8e319fX1mdW5jdGlvbiBRcyhlKXtyZXR1cm4gZS5leHBvc2VkP2UuZXhwb3NlUHJveHl8fD1uZXcgUHJveHkoZ24oc24oZS5leHBvc2VkKSkse2dldCh0LG4pe2lmKG4gaW4gdClyZXR1cm4gdFtuXTtpZihuIGluIHlhKXJldHVybiB5YVtuXShlKX0saGFzKGUsdCl7cmV0dXJuIHQgaW4gZXx8dCBpbiB5YX19KTplLnByb3h5fWZ1bmN0aW9uICRzKGUsdD0hMCl7cmV0dXJuIHYoZSk/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOmUubmFtZXx8dCYmZS5fX25hbWV9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIHYoZSkmJmBfX3ZjY09wdHNgaW4gZX12YXIgVz0oZSx0KT0+VG4oZSx0LFZzKTtmdW5jdGlvbiB0YyhlLHQsbil7dHJ5e21zKC0xKTtsZXQgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByPT09Mj94KHQpJiYhcCh0KT9ncyh0KT9IKGUsbnVsbCxbdF0pOkgoZSx0KTpIKGUsbnVsbCx0KToocj4zP249QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOnI9PT0zJiZncyhuKSYmKG49W25dKSxIKGUsdCxuKSl9ZmluYWxseXttcygxKX19ZnVuY3Rpb24gbmMoKXt9ZnVuY3Rpb24gcmMoZSx0LG4scil7bGV0IGk9bltyXTtpZihpJiZpYyhpLGUpKXJldHVybiBpO2xldCBhPXQoKTtyZXR1cm4gYS5tZW1vPWUuc2xpY2UoKSxhLmNhY2hlSW5kZXg9cixuW3JdPWF9ZnVuY3Rpb24gaWMoZSx0KXtsZXQgbj1lLm1lbW87aWYobi5sZW5ndGghPXQubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKEQobltlXSx0W2VdKSlyZXR1cm4hMTtyZXR1cm4gcHM+MCYmZHMmJmRzLnB1c2goZSksITB9dmFyIGFjPWAzLjUuNDFgLG9jPWEsc2M9Qm4sY2M9c3IsbGM9bHIsdWM9e2NyZWF0ZUNvbXBvbmVudEluc3RhbmNlOk5zLHNldHVwQ29tcG9uZW50OkhzLHJlbmRlckNvbXBvbmVudFJvb3Q6bG8sc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlOmZyLGlzVk5vZGU6Z3Msbm9ybWFsaXplVk5vZGU6RXMsZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2U6UXMsZW5zdXJlVmFsaWRWTm9kZTpnYSxwdXNoV2FybmluZ0NvbnRleHQ6SW4scG9wV2FybmluZ0NvbnRleHQ6TG59LGRjPXZvaWQgMCxmYz10eXBlb2Ygd2luZG93PGB1YCYmd2luZG93LnRydXN0ZWRUeXBlcztpZihmYyl0cnl7ZGM9ZmMuY3JlYXRlUG9saWN5KGB2dWVgLHtjcmVhdGVIVE1MOmU9PmV9KX1jYXRjaHt9dmFyIHBjPWRjP2U9PmRjLmNyZWF0ZUhUTUwoZSk6ZT0+ZSxtYz1gaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdgLGhjPWBodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MYCxnYz10eXBlb2YgZG9jdW1lbnQ8YHVgP2RvY3VtZW50Om51bGwsX2M9Z2MmJmdjLmNyZWF0ZUVsZW1lbnQoYHRlbXBsYXRlYCksdmM9e2luc2VydDooZSx0LG4pPT57dC5pbnNlcnRCZWZvcmUoZSxufHxudWxsKX0scmVtb3ZlOmU9PntsZXQgdD1lLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZChlKX0sY3JlYXRlRWxlbWVudDooZSx0LG4scik9PntsZXQgaT10PT09YHN2Z2A/Z2MuY3JlYXRlRWxlbWVudE5TKG1jLGUpOnQ9PT1gbWF0aG1sYD9nYy5jcmVhdGVFbGVtZW50TlMoaGMsZSk6bj9nYy5jcmVhdGVFbGVtZW50KGUse2lzOm59KTpnYy5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlPT09YHNlbGVjdGAmJnImJnIubXVsdGlwbGUhPW51bGwmJmkuc2V0QXR0cmlidXRlKGBtdWx0aXBsZWAsci5tdWx0aXBsZSksaX0sY3JlYXRlVGV4dDplPT5nYy5jcmVhdGVUZXh0Tm9kZShlKSxjcmVhdGVDb21tZW50OmU9PmdjLmNyZWF0ZUNvbW1lbnQoZSksc2V0VGV4dDooZSx0KT0+e2Uubm9kZVZhbHVlPXR9LHNldEVsZW1lbnRUZXh0OihlLHQpPT57ZS50ZXh0Q29udGVudD10fSxwYXJlbnROb2RlOmU9PmUucGFyZW50Tm9kZSxuZXh0U2libGluZzplPT5lLm5leHRTaWJsaW5nLHF1ZXJ5U2VsZWN0b3I6ZT0+Z2MucXVlcnlTZWxlY3RvcihlKSxzZXRTY29wZUlkKGUsdCl7ZS5zZXRBdHRyaWJ1dGUodCxgYCl9LGluc2VydFN0YXRpY0NvbnRlbnQoZSx0LG4scixpLGEpe2xldCBvPW4/bi5wcmV2aW91c1NpYmxpbmc6dC5sYXN0Q2hpbGQ7aWYoaSYmKGk9PT1hfHxpLm5leHRTaWJsaW5nKSlmb3IoO3QuaW5zZXJ0QmVmb3JlKGkuY2xvbmVOb2RlKCEwKSxuKSwhKGk9PT1hfHwhKGk9aS5uZXh0U2libGluZykpOyk7ZWxzZXtfYy5pbm5lckhUTUw9cGMocj09PWBzdmdgP2A8c3ZnPiR7ZX08L3N2Zz5gOnI9PT1gbWF0aG1sYD9gPG1hdGg+JHtlfTwvbWF0aD5gOmUpO2xldCBpPV9jLmNvbnRlbnQ7aWYocj09PWBzdmdgfHxyPT09YG1hdGhtbGApe2xldCBlPWkuZmlyc3RDaGlsZDtmb3IoO2UuZmlyc3RDaGlsZDspaS5hcHBlbmRDaGlsZChlLmZpcnN0Q2hpbGQpO2kucmVtb3ZlQ2hpbGQoZSl9dC5pbnNlcnRCZWZvcmUoaSxuKX1yZXR1cm5bbz9vLm5leHRTaWJsaW5nOnQuZmlyc3RDaGlsZCxuP24ucHJldmlvdXNTaWJsaW5nOnQubGFzdENoaWxkXX19LHljPWB0cmFuc2l0aW9uYCxiYz1gYW5pbWF0aW9uYCx4Yz1TeW1ib2woYF92dGNgKSxTYz17bmFtZTpTdHJpbmcsdHlwZTpTdHJpbmcsY3NzOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sZHVyYXRpb246W1N0cmluZyxOdW1iZXIsT2JqZWN0XSxlbnRlckZyb21DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxhcHBlYXJGcm9tQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxsZWF2ZUZyb21DbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZ30sQ2M9bCh7fSxKcixTYyksd2M9KGU9PihlLmRpc3BsYXlOYW1lPWBUcmFuc2l0aW9uYCxlLnByb3BzPUNjLGUpKSgoZSx7c2xvdHM6dH0pPT50YyhRcixEYyhlKSx0KSksVGM9KGUsdD1bXSk9PntwKGUpP2UuZm9yRWFjaChlPT5lKC4uLnQpKTplJiZlKC4uLnQpfSxFYz1lPT5lP3AoZSk/ZS5zb21lKGU9PmUubGVuZ3RoPjEpOmUubGVuZ3RoPjE6ITE7ZnVuY3Rpb24gRGMoZSl7bGV0IHQ9e307Zm9yKGxldCBuIGluIGUpbiBpbiBTY3x8KHRbbl09ZVtuXSk7aWYoZS5jc3M9PT0hMSlyZXR1cm4gdDtsZXR7bmFtZTpuPWB2YCx0eXBlOnIsZHVyYXRpb246aSxlbnRlckZyb21DbGFzczphPWAke259LWVudGVyLWZyb21gLGVudGVyQWN0aXZlQ2xhc3M6bz1gJHtufS1lbnRlci1hY3RpdmVgLGVudGVyVG9DbGFzczpzPWAke259LWVudGVyLXRvYCxhcHBlYXJGcm9tQ2xhc3M6Yz1hLGFwcGVhckFjdGl2ZUNsYXNzOnU9byxhcHBlYXJUb0NsYXNzOmQ9cyxsZWF2ZUZyb21DbGFzczpmPWAke259LWxlYXZlLWZyb21gLGxlYXZlQWN0aXZlQ2xhc3M6cD1gJHtufS1sZWF2ZS1hY3RpdmVgLGxlYXZlVG9DbGFzczptPWAke259LWxlYXZlLXRvYH09ZSxoPU9jKGkpLGc9aCYmaFswXSxfPWgmJmhbMV0se29uQmVmb3JlRW50ZXI6dixvbkVudGVyOnksb25FbnRlckNhbmNlbGxlZDpiLG9uTGVhdmU6eCxvbkxlYXZlQ2FuY2VsbGVkOlMsb25CZWZvcmVBcHBlYXI6Qz12LG9uQXBwZWFyOnc9eSxvbkFwcGVhckNhbmNlbGxlZDplZT1ifT10LHRlPShlLHQsbixyKT0+e2UuX2VudGVyQ2FuY2VsbGVkPXIsamMoZSx0P2Q6cyksamMoZSx0P3U6byksbiYmbigpfSxUPShlLHQpPT57ZS5faXNMZWF2aW5nPSExLGpjKGUsZiksamMoZSxtKSxqYyhlLHApLHQmJnQoKX0sbmU9ZT0+KHQsbik9PntsZXQgaT1lP3c6eSxvPSgpPT50ZSh0LGUsbik7VGMoaSxbdCxvXSksTWMoKCk9PntqYyh0LGU/YzphKSxBYyh0LGU/ZDpzKSxFYyhpKXx8UGModCxyLGcsbyl9KX07cmV0dXJuIGwodCx7b25CZWZvcmVFbnRlcihlKXtUYyh2LFtlXSksQWMoZSxhKSxBYyhlLG8pfSxvbkJlZm9yZUFwcGVhcihlKXtUYyhDLFtlXSksQWMoZSxjKSxBYyhlLHUpfSxvbkVudGVyOm5lKCExKSxvbkFwcGVhcjpuZSghMCksb25MZWF2ZShlLHQpe2UuX2lzTGVhdmluZz0hMDtsZXQgbj0oKT0+VChlLHQpO0FjKGUsZiksZS5fZW50ZXJDYW5jZWxsZWQ/KEFjKGUscCksUmMoZSkpOihSYyhlKSxBYyhlLHApKSxNYygoKT0+e2UuX2lzTGVhdmluZyYmKGpjKGUsZiksQWMoZSxtKSxFYyh4KXx8UGMoZSxyLF8sbikpfSksVGMoeCxbZSxuXSl9LG9uRW50ZXJDYW5jZWxsZWQoZSl7dGUoZSwhMSx2b2lkIDAsITApLFRjKGIsW2VdKX0sb25BcHBlYXJDYW5jZWxsZWQoZSl7dGUoZSwhMCx2b2lkIDAsITApLFRjKGVlLFtlXSl9LG9uTGVhdmVDYW5jZWxsZWQoZSl7VChlKSxUYyhTLFtlXSl9fSl9ZnVuY3Rpb24gT2MoZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZih4KGUpKXJldHVybltrYyhlLmVudGVyKSxrYyhlLmxlYXZlKV07e2xldCB0PWtjKGUpO3JldHVyblt0LHRdfX1mdW5jdGlvbiBrYyhlKXtyZXR1cm4gZmUoZSl9ZnVuY3Rpb24gQWMoZSx0KXt0LnNwbGl0KC9ccysvKS5mb3JFYWNoKHQ9PnQmJmUuY2xhc3NMaXN0LmFkZCh0KSksKGVbeGNdfHwoZVt4Y109bmV3IFNldCkpLmFkZCh0KX1mdW5jdGlvbiBqYyhlLHQpe3Quc3BsaXQoL1xzKy8pLmZvckVhY2godD0+dCYmZS5jbGFzc0xpc3QucmVtb3ZlKHQpKTtsZXQgbj1lW3hjXTtuJiYobi5kZWxldGUodCksbi5zaXplfHwoZVt4Y109dm9pZCAwKSl9ZnVuY3Rpb24gTWMoZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpfSl9dmFyIE5jPTA7ZnVuY3Rpb24gUGMoZSx0LG4scil7bGV0IGk9ZS5fZW5kSWQ9KytOYyxhPSgpPT57aT09PWUuX2VuZElkJiZyKCl9O2lmKG4hPW51bGwpcmV0dXJuIHNldFRpbWVvdXQoYSxuKTtsZXR7dHlwZTpvLHRpbWVvdXQ6cyxwcm9wQ291bnQ6Y309RmMoZSx0KTtpZighbylyZXR1cm4gcigpO2xldCBsPW8rYGVuZGAsdT0wLGQ9KCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIobCxmKSxhKCl9LGY9dD0+e3QudGFyZ2V0PT09ZSYmKyt1Pj1jJiZkKCl9O3NldFRpbWVvdXQoKCk9Pnt1PGMmJmQoKX0scysxKSxlLmFkZEV2ZW50TGlzdGVuZXIobCxmKX1mdW5jdGlvbiBGYyhlLHQpe2xldCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLHI9ZT0+KG5bZV18fGBgKS5zcGxpdChgLCBgKSxpPXIoYCR7eWN9RGVsYXlgKSxhPXIoYCR7eWN9RHVyYXRpb25gKSxvPUljKGksYSkscz1yKGAke2JjfURlbGF5YCksYz1yKGAke2JjfUR1cmF0aW9uYCksbD1JYyhzLGMpLHU9bnVsbCxkPTAsZj0wO3Q9PT15Yz9vPjAmJih1PXljLGQ9byxmPWEubGVuZ3RoKTp0PT09YmM/bD4wJiYodT1iYyxkPWwsZj1jLmxlbmd0aCk6KGQ9TWF0aC5tYXgobyxsKSx1PWQ+MD9vPmw/eWM6YmM6bnVsbCxmPXU/dT09PXljP2EubGVuZ3RoOmMubGVuZ3RoOjApO2xldCBwPXU9PT15YyYmL1xiKD86dHJhbnNmb3JtfGFsbCkoPzosfCQpLy50ZXN0KHIoYCR7eWN9UHJvcGVydHlgKS50b1N0cmluZygpKTtyZXR1cm57dHlwZTp1LHRpbWVvdXQ6ZCxwcm9wQ291bnQ6ZixoYXNUcmFuc2Zvcm06cH19ZnVuY3Rpb24gSWMoZSx0KXtmb3IoO2UubGVuZ3RoPHQubGVuZ3RoOyllPWUuY29uY2F0KGUpO3JldHVybiBNYXRoLm1heCguLi50Lm1hcCgodCxuKT0+TGModCkrTGMoZVtuXSkpKX1mdW5jdGlvbiBMYyhlKXtyZXR1cm4gZT09PWBhdXRvYD8wOk51bWJlcihlLnNsaWNlKDAsLTEpLnJlcGxhY2UoYCxgLGAuYCkpKjFlM31mdW5jdGlvbiBSYyhlKXtyZXR1cm4oZT9lLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQpLmJvZHkub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIHpjKGUsdCxuKXtsZXQgcj1lW3hjXTtyJiYodD0odD9bdCwuLi5yXTpbLi4ucl0pLmpvaW4oYCBgKSksdD09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZShgY2xhc3NgKTpuP2Uuc2V0QXR0cmlidXRlKGBjbGFzc2AsdCk6ZS5jbGFzc05hbWU9dH12YXIgQmM9U3ltYm9sKGBfdm9kYCksVmM9U3ltYm9sKGBfdnNoYCksSGM9e25hbWU6YHNob3dgLGJlZm9yZU1vdW50KGUse3ZhbHVlOnR9LHt0cmFuc2l0aW9uOm59KXtlW0JjXT1lLnN0eWxlLmRpc3BsYXk9PT1gbm9uZWA/YGA6ZS5zdHlsZS5kaXNwbGF5LG4mJnQ/bi5iZWZvcmVFbnRlcihlKTpVYyhlLHQpfSxtb3VudGVkKGUse3ZhbHVlOnR9LHt0cmFuc2l0aW9uOm59KXtuJiZ0JiZuLmVudGVyKGUpfSx1cGRhdGVkKGUse3ZhbHVlOnQsb2xkVmFsdWU6bn0se3RyYW5zaXRpb246cn0peyF0IT0hbiYmKHI/dD8oci5iZWZvcmVFbnRlcihlKSxVYyhlLCEwKSxyLmVudGVyKGUpKTpyLmxlYXZlKGUsKCk9PntVYyhlLCExKX0pOlVjKGUsdCkpfSxiZWZvcmVVbm1vdW50KGUse3ZhbHVlOnR9KXtVYyhlLHQpfX07ZnVuY3Rpb24gVWMoZSx0KXtlLnN0eWxlLmRpc3BsYXk9dD9lW0JjXTpgbm9uZWAsZVtWY109IXR9ZnVuY3Rpb24gV2MoKXtIYy5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9KT0+e2lmKCFlKXJldHVybntzdHlsZTp7ZGlzcGxheTpgbm9uZWB9fX19dmFyIEdjPVN5bWJvbChgYCk7ZnVuY3Rpb24gS2MoZSl7bGV0IHQ9RnMoKTtpZighdClyZXR1cm47bGV0IG49dC51dD0obj1lKHQucHJveHkpKT0+e0FycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdi1vd25lcj0iJHt0LnVpZH0iXWApKS5mb3JFYWNoKGU9PkpjKGUsbikpfSxyPSgpPT57bGV0IHI9ZSh0LnByb3h5KTt0LmNlP0pjKHQuY2Uscik6cWModC5zdWJUcmVlLHIpLG4ocil9O1FpKCgpPT57bnIocil9KSxaaSgoKT0+e0VyKHIsYSx7Zmx1c2g6YHBvc3RgfSk7bGV0IGU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIocik7ZS5vYnNlcnZlKHQuc3ViVHJlZS5lbC5wYXJlbnROb2RlLHtjaGlsZExpc3Q6ITB9KSx0YSgoKT0+ZS5kaXNjb25uZWN0KCkpfSl9ZnVuY3Rpb24gcWMoZSx0KXtpZihlLnNoYXBlRmxhZyYxMjgpe2xldCBuPWUuc3VzcGVuc2U7ZT1uLmFjdGl2ZUJyYW5jaCxuLnBlbmRpbmdCcmFuY2gmJiFuLmlzSHlkcmF0aW5nJiZuLmVmZmVjdHMucHVzaCgoKT0+e3FjKG4uYWN0aXZlQnJhbmNoLHQpfSl9Zm9yKDtlLmNvbXBvbmVudDspZT1lLmNvbXBvbmVudC5zdWJUcmVlO2lmKGUuc2hhcGVGbGFnJjEmJmUuZWwpSmMoZS5lbCx0KTtlbHNlIGlmKGUudHlwZT09PUwpZS5jaGlsZHJlbi5mb3JFYWNoKGU9PnFjKGUsdCkpO2Vsc2UgaWYoZS50eXBlPT09bHMpe2xldHtlbDpuLGFuY2hvcjpyfT1lO2Zvcig7biYmKEpjKG4sdCksbiE9PXIpOyluPW4ubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIEpjKGUsdCl7aWYoZS5ub2RlVHlwZT09PTEpe2xldCBuPWUuc3R5bGUscj1gYDtmb3IobGV0IGUgaW4gdCl7bGV0IGk9amUodFtlXSk7bi5zZXRQcm9wZXJ0eShgLS0ke2V9YCxpKSxyKz1gLS0ke2V9OiAke2l9O2B9bltHY109cn19dmFyIFljPS8oPzpefDspXHMqZGlzcGxheVxzKjovO2Z1bmN0aW9uIFhjKGUsdCxuKXtsZXQgcj1lLnN0eWxlLGk9eShuKSxhPSExO2lmKG4mJiFpKXtpZih0KXtpZih5KHQpKWZvcihsZXQgZSBvZiB0LnNwbGl0KGA7YCkpe2xldCB0PWUuc2xpY2UoMCxlLmluZGV4T2YoYDpgKSkudHJpbSgpO25bdF0/P1FjKHIsdCxgYCl9ZWxzZSBmb3IobGV0IGUgaW4gdCluW2VdPz9RYyhyLGUsYGApfWZvcihsZXQgaSBpbiBuKXtpPT09YGRpc3BsYXlgJiYoYT0hMCk7bGV0IG89bltpXTtvPT1udWxsP1FjKHIsaSxgYCk6bmwoZSxpLCF5KHQpJiZ0P3RbaV06dm9pZCAwLG8pfHxRYyhyLGksbyl9fWVsc2UgaWYoaSl7aWYodCE9PW4pe2xldCBlPXJbR2NdO2UmJihuKz1gO2ArZSksci5jc3NUZXh0PW4sYT1ZYy50ZXN0KG4pfX1lbHNlIHQmJmUucmVtb3ZlQXR0cmlidXRlKGBzdHlsZWApO0JjIGluIGUmJihlW0JjXT1hP3IuZGlzcGxheTpgYCxlW1ZjXSYmKHIuZGlzcGxheT1gbm9uZWApKX12YXIgWmM9L1xzKiFpbXBvcnRhbnQkLztmdW5jdGlvbiBRYyhlLHQsbil7aWYocChuKSluLmZvckVhY2gobj0+UWMoZSx0LG4pKTtlbHNlIGlmKG4/Pz1gYCx0LnN0YXJ0c1dpdGgoYC0tYCkpZS5zZXRQcm9wZXJ0eSh0LG4pO2Vsc2V7bGV0IHI9dGwoZSx0KTtaYy50ZXN0KG4pP2Uuc2V0UHJvcGVydHkob2Uociksbi5yZXBsYWNlKFpjLGBgKSxgaW1wb3J0YW50YCk6ZVtyXT1ufX12YXIgJGM9W2BXZWJraXRgLGBNb3pgLGBtc2BdLGVsPXt9O2Z1bmN0aW9uIHRsKGUsdCl7bGV0IG49ZWxbdF07aWYobilyZXR1cm4gbjtsZXQgcj1FKHQpO2lmKHIhPT1gZmlsdGVyYCYmciBpbiBlKXJldHVybiBlbFt0XT1yO3I9c2Uocik7Zm9yKGxldCBuPTA7bjwkYy5sZW5ndGg7bisrKXtsZXQgaT0kY1tuXStyO2lmKGkgaW4gZSlyZXR1cm4gZWxbdF09aX1yZXR1cm4gdH1mdW5jdGlvbiBubChlLHQsbixyKXtyZXR1cm4gZS50YWdOYW1lPT09YFRFWFRBUkVBYCYmKHQ9PT1gd2lkdGhgfHx0PT09YGhlaWdodGApJiZ5KHIpJiZuPT09cn12YXIgcmw9YGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtgO2Z1bmN0aW9uIGlsKGUsdCxuLHIsaSxhPUNlKHQpKXtyJiZ0LnN0YXJ0c1dpdGgoYHhsaW5rOmApP249PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhybCx0LnNsaWNlKDYsdC5sZW5ndGgpKTplLnNldEF0dHJpYnV0ZU5TKHJsLHQsbik6bj09bnVsbHx8YSYmIXdlKG4pP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsYT9gYDpiKG4pP1N0cmluZyhuKTpuKX1mdW5jdGlvbiBhbChlLHQsbixyLGkpe2lmKHQ9PT1gaW5uZXJIVE1MYHx8dD09PWB0ZXh0Q29udGVudGApe24hPW51bGwmJihlW3RdPXQ9PT1gaW5uZXJIVE1MYD9wYyhuKTpuKTtyZXR1cm59bGV0IGE9ZS50YWdOYW1lO2lmKHQ9PT1gdmFsdWVgJiZhIT09YFBST0dSRVNTYCYmIWEuaW5jbHVkZXMoYC1gKSl7bGV0IHI9YT09PWBPUFRJT05gP2UuZ2V0QXR0cmlidXRlKGB2YWx1ZWApfHxgYDplLnZhbHVlLGk9bj09bnVsbD9lLnR5cGU9PT1gY2hlY2tib3hgP2BvbmA6YGA6U3RyaW5nKG4pOyhyIT09aXx8IShgX3ZhbHVlYGluIGUpKSYmKGUudmFsdWU9aSksbj8/ZS5yZW1vdmVBdHRyaWJ1dGUodCksZS5fdmFsdWU9bjtyZXR1cm59bGV0IG89ITE7aWYobj09PWBgfHxuPT1udWxsKXtsZXQgcj10eXBlb2YgZVt0XTtyPT09YGJvb2xlYW5gP249d2Uobik6bj09bnVsbCYmcj09PWBzdHJpbmdgPyhuPWBgLG89ITApOnI9PT1gbnVtYmVyYCYmKG49MCxvPSEwKX10cnl7ZVt0XT1ufWNhdGNoe31vJiZlLnJlbW92ZUF0dHJpYnV0ZShpfHx0KX1mdW5jdGlvbiBvbChlLHQsbixyKXtlLmFkZEV2ZW50TGlzdGVuZXIodCxuLHIpfWZ1bmN0aW9uIHNsKGUsdCxuLHIpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4scil9dmFyIGNsPVN5bWJvbChgX3ZlaWApO2Z1bmN0aW9uIGxsKGUsdCxuLHIsaT1udWxsKXtsZXQgYT1lW2NsXXx8KGVbY2xdPXt9KSxvPWFbdF07aWYociYmbylvLnZhbHVlPXI7ZWxzZXtsZXRbbixzXT1mbCh0KTtyP29sKGUsbixhW3RdPWdsKHIsaSkscyk6byYmKHNsKGUsbixvLHMpLGFbdF09dm9pZCAwKX19dmFyIHVsPS8oT25jZXxQYXNzaXZlfENhcHR1cmUpJC8sZGw9L15vbjo/KD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gZmwoZSl7bGV0IHQsbjtmb3IoOyhuPWUubWF0Y2godWwpKSYmIWRsLnRlc3QoZSk7KXR8fD17fSxlPWUuc2xpY2UoMCxlLmxlbmd0aC1uWzFdLmxlbmd0aCksdFtuWzFdLnRvTG93ZXJDYXNlKCldPSEwO3JldHVybltlWzJdPT09YDpgP2Uuc2xpY2UoMyk6b2UoZS5zbGljZSgyKSksdF19dmFyIHBsPTAsbWw9UHJvbWlzZS5yZXNvbHZlKCksaGw9KCk9PnBsfHw9KG1sLnRoZW4oKCk9PnBsPTApLERhdGUubm93KCkpO2Z1bmN0aW9uIGdsKGUsdCl7bGV0IG49ZT0+e2lmKCFlLl92dHMpZS5fdnRzPURhdGUubm93KCk7ZWxzZSBpZihlLl92dHM8PW4uYXR0YWNoZWQpcmV0dXJuO2xldCByPW4udmFsdWU7aWYocChyKSl7bGV0IG49ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249KCk9PntuLmNhbGwoZSksZS5fc3RvcHBlZD0hMH07bGV0IGk9ci5zbGljZSgpLGE9W2VdO2ZvcihsZXQgbj0wO248aS5sZW5ndGgmJiFlLl9zdG9wcGVkO24rKyl7bGV0IGU9aVtuXTtlJiZIbihlLHQsNSxhKX19ZWxzZSBIbihyLHQsNSxbZV0pfTtyZXR1cm4gbi52YWx1ZT1lLG4uYXR0YWNoZWQ9aGwoKSxufXZhciBfbD1lPT5lLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmUuY2hhckNvZGVBdCgxKT09PTExMCYmZS5jaGFyQ29kZUF0KDIpPjk2JiZlLmNoYXJDb2RlQXQoMik8MTIzLHZsPShlLHQsbixyLGksYSk9PntsZXQgbz1pPT09YHN2Z2A7dD09PWBjbGFzc2A/emMoZSxyLG8pOnQ9PT1gc3R5bGVgP1hjKGUsbixyKTpzKHQpP2ModCl8fGxsKGUsdCxuLHIsYSk6KHRbMF09PT1gLmA/KHQ9dC5zbGljZSgxKSwhMCk6dFswXT09PWBeYD8odD10LnNsaWNlKDEpLCExKTp5bChlLHQscixvKSk/KGFsKGUsdCxyKSwhZS50YWdOYW1lLmluY2x1ZGVzKGAtYCkmJih0PT09YHZhbHVlYHx8dD09PWBjaGVja2VkYHx8dD09PWBzZWxlY3RlZGApJiZpbChlLHQscixvLGEsdCE9PWB2YWx1ZWApKTplLl9pc1Z1ZUNFJiYoYmwoZSx0KXx8ZS5fZGVmLl9fYXN5bmNMb2FkZXImJigvW0EtWl0vLnRlc3QodCl8fCF5KHIpKSk/YWwoZSxFKHQpLHIsYSx0KToodD09PWB0cnVlLXZhbHVlYD9lLl90cnVlVmFsdWU9cjp0PT09YGZhbHNlLXZhbHVlYCYmKGUuX2ZhbHNlVmFsdWU9ciksaWwoZSx0LHIsbykpfTtmdW5jdGlvbiB5bChlLHQsbixyKXtpZihyKXJldHVybiEhKHQ9PT1gaW5uZXJIVE1MYHx8dD09PWB0ZXh0Q29udGVudGB8fHQgaW4gZSYmX2wodCkmJnYobikpO2lmKHQ9PT1gc3BlbGxjaGVja2B8fHQ9PT1gZHJhZ2dhYmxlYHx8dD09PWB0cmFuc2xhdGVgfHx0PT09YGF1dG9jb3JyZWN0YHx8dD09PWBzYW5kYm94YCYmZS50YWdOYW1lPT09YElGUkFNRWB8fHQ9PT1gZm9ybWB8fHQ9PT1gbGlzdGAmJmUudGFnTmFtZT09PWBJTlBVVGB8fHQ9PT1gdHlwZWAmJmUudGFnTmFtZT09PWBURVhUQVJFQWApcmV0dXJuITE7aWYodD09PWB3aWR0aGB8fHQ9PT1gaGVpZ2h0YCl7bGV0IHQ9ZS50YWdOYW1lO2lmKHQ9PT1gSU1HYHx8dD09PWBWSURFT2B8fHQ9PT1gQ0FOVkFTYHx8dD09PWBTT1VSQ0VgKXJldHVybiExfXJldHVybiBfbCh0KSYmeShuKT8hMTp0IGluIGV9ZnVuY3Rpb24gYmwoZSx0KXtsZXQgbj1lLl9kZWYucHJvcHM7aWYoIW4pcmV0dXJuITE7bGV0IHI9RSh0KTtyZXR1cm4gQXJyYXkuaXNBcnJheShuKT9uLnNvbWUoZT0+RShlKT09PXIpOk9iamVjdC5rZXlzKG4pLnNvbWUoZT0+RShlKT09PXIpfXZhciB4bD17fTtmdW5jdGlvbiBTbChlLHQsbil7bGV0IHI9RihlLHQpO3RlKHIpJiYocj1sKHt9LHIsdCkpO2NsYXNzIGkgZXh0ZW5kcyBUbHtjb25zdHJ1Y3RvcihlKXtzdXBlcihyLGUsbil9fXJldHVybiBpLmRlZj1yLGl9dmFyIENsPSgoZSx0KT0+U2woZSx0LGd1KSksd2w9dHlwZW9mIEhUTUxFbGVtZW50PGB1YD9IVE1MRWxlbWVudDpjbGFzc3t9LFRsPWNsYXNzIGUgZXh0ZW5kcyB3bHtjb25zdHJ1Y3RvcihlLHQ9e30sbj1odSl7c3VwZXIoKSx0aGlzLl9kZWY9ZSx0aGlzLl9wcm9wcz10LHRoaXMuX2NyZWF0ZUFwcD1uLHRoaXMuX2lzVnVlQ0U9ITAsdGhpcy5faW5zdGFuY2U9bnVsbCx0aGlzLl9hcHA9bnVsbCx0aGlzLl9ub25jZT10aGlzLl9kZWYubm9uY2UsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuX3Jlc29sdmVkPSExLHRoaXMuX3BhdGNoaW5nPSExLHRoaXMuX2RpcnR5PSExLHRoaXMuX251bWJlclByb3BzPW51bGwsdGhpcy5fc3R5bGVDaGlsZHJlbj1uZXcgV2Vha1NldCx0aGlzLl9zdHlsZUFuY2hvcnM9bmV3IFdlYWtNYXAsdGhpcy5fb2I9bnVsbCx0aGlzLnNoYWRvd1Jvb3QmJm4hPT1odT90aGlzLl9yb290PXRoaXMuc2hhZG93Um9vdDplLnNoYWRvd1Jvb3Q9PT0hMT90aGlzLl9yb290PXRoaXM6KHRoaXMuYXR0YWNoU2hhZG93KGwoe30sZS5zaGFkb3dSb290T3B0aW9ucyx7bW9kZTpgb3BlbmB9KSksdGhpcy5fcm9vdD10aGlzLnNoYWRvd1Jvb3QpfWNvbm5lY3RlZENhbGxiYWNrKCl7aWYoIXRoaXMuaXNDb25uZWN0ZWQpcmV0dXJuOyF0aGlzLnNoYWRvd1Jvb3QmJiF0aGlzLl9yZXNvbHZlZCYmdGhpcy5fcGFyc2VTbG90cygpLHRoaXMuX2Nvbm5lY3RlZD0hMDtsZXQgdD10aGlzO2Zvcig7dCYmPXQuYXNzaWduZWRTbG90fHx0LnBhcmVudE5vZGV8fHQuaG9zdDspaWYodCBpbnN0YW5jZW9mIGUpe3RoaXMuX3BhcmVudD10O2JyZWFrfXRoaXMuX2luc3RhbmNlfHwodGhpcy5fcmVzb2x2ZWQ/dGhpcy5fbW91bnQodGhpcy5fZGVmKTp0JiZ0Ll9wZW5kaW5nUmVzb2x2ZT90aGlzLl9wZW5kaW5nUmVzb2x2ZT10Ll9wZW5kaW5nUmVzb2x2ZS50aGVuKCgpPT57aWYodGhpcy5fcGVuZGluZ1Jlc29sdmU9dm9pZCAwLHRoaXMuaXNDb25uZWN0ZWQpcmV0dXJuIHRoaXMuX3Jlc29sdmVEZWYoKX0pOnRoaXMuX3Jlc29sdmVEZWYoKSl9X3NldFBhcmVudChlPXRoaXMuX3BhcmVudCl7ZSYmKHRoaXMuX2luc3RhbmNlLnBhcmVudD1lLl9pbnN0YW5jZSx0aGlzLl9pbmhlcml0UGFyZW50Q29udGV4dChlKSl9X2luaGVyaXRQYXJlbnRDb250ZXh0KGU9dGhpcy5fcGFyZW50KXtlJiZ0aGlzLl9hcHAmJk9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLl9hcHAuX2NvbnRleHQucHJvdmlkZXMsZS5faW5zdGFuY2UucHJvdmlkZXMpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fY29ubmVjdGVkPSExLFFuKCgpPT57dGhpcy5fY29ubmVjdGVkfHwodGhpcy5fb2ImJj0odGhpcy5fb2IuZGlzY29ubmVjdCgpLG51bGwpLHRoaXMuX2FwcCYmdGhpcy5fYXBwLnVubW91bnQoKSx0aGlzLl9pbnN0YW5jZSYmKHRoaXMuX2luc3RhbmNlLmNlPXZvaWQgMCksdGhpcy5fYXBwPXRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fdGVsZXBvcnRUYXJnZXRzJiY9KHRoaXMuX3RlbGVwb3J0VGFyZ2V0cy5jbGVhcigpLHZvaWQgMCkpfSl9X3Byb2Nlc3NNdXRhdGlvbnMoZSl7Zm9yKGxldCB0IG9mIGUpdGhpcy5fc2V0QXR0cih0LmF0dHJpYnV0ZU5hbWUpfV9yZXNvbHZlRGVmKCl7aWYodGhpcy5fcGVuZGluZ1Jlc29sdmUpcmV0dXJuIHRoaXMuX3BlbmRpbmdSZXNvbHZlO2ZvcihsZXQgZT0wO2U8dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDtlKyspdGhpcy5fc2V0QXR0cih0aGlzLmF0dHJpYnV0ZXNbZV0ubmFtZSk7dGhpcy5fb2I9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5fcHJvY2Vzc011dGF0aW9ucy5iaW5kKHRoaXMpKSx0aGlzLl9vYi5vYnNlcnZlKHRoaXMse2F0dHJpYnV0ZXM6ITB9KTtsZXQgZT0oZSx0PSExKT0+e3RoaXMuX3Jlc29sdmVkPSEwLHRoaXMuX3BlbmRpbmdSZXNvbHZlPXZvaWQgMDtsZXR7cHJvcHM6bixzdHlsZXM6cn09ZSxpO2lmKG4mJiFwKG4pKWZvcihsZXQgZSBpbiBuKXtsZXQgdD1uW2VdOyh0PT09TnVtYmVyfHx0JiZ0LnR5cGU9PT1OdW1iZXIpJiYoZSBpbiB0aGlzLl9wcm9wcyYmKHRoaXMuX3Byb3BzW2VdPWZlKHRoaXMuX3Byb3BzW2VdKSksKGl8fD1PYmplY3QuY3JlYXRlKG51bGwpKVtFKGUpXT0hMCl9dGhpcy5fbnVtYmVyUHJvcHM9aSx0aGlzLl9yZXNvbHZlUHJvcHMoZSksdGhpcy5zaGFkb3dSb290JiZ0aGlzLl9hcHBseVN0eWxlcyhyKSx0aGlzLl9tb3VudChlKX0sdD10aGlzLl9kZWYuX19hc3luY0xvYWRlcjtpZih0KXJldHVybiB0aGlzLl9wZW5kaW5nUmVzb2x2ZT10KCkudGhlbih0PT57dC5jb25maWd1cmVBcHA9dGhpcy5fZGVmLmNvbmZpZ3VyZUFwcCxlKHRoaXMuX2RlZj10LCEwKX0pLHRoaXMuX3BlbmRpbmdSZXNvbHZlO2UodGhpcy5fZGVmKX1fbW91bnQoZSl7dGhpcy5fYXBwPXRoaXMuX2NyZWF0ZUFwcChlKSx0aGlzLl9pbmhlcml0UGFyZW50Q29udGV4dCgpLGUuY29uZmlndXJlQXBwJiZlLmNvbmZpZ3VyZUFwcCh0aGlzLl9hcHApLHRoaXMuX2FwcC5fY2VWTm9kZT10aGlzLl9jcmVhdGVWTm9kZSgpLHRoaXMuX2FwcC5tb3VudCh0aGlzLl9yb290KTtsZXQgdD10aGlzLl9pbnN0YW5jZSYmdGhpcy5faW5zdGFuY2UuZXhwb3NlZDtpZih0KWZvcihsZXQgZSBpbiB0KWYodGhpcyxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7Z2V0OigpPT5OKHRbZV0pfSl9X3Jlc29sdmVQcm9wcyhlKXtsZXR7cHJvcHM6dH09ZSxuPXAodCk/dDpPYmplY3Qua2V5cyh0fHx7fSk7Zm9yKGxldCBlIG9mIE9iamVjdC5rZXlzKHRoaXMpKWVbMF0hPT1gX2AmJm4uaW5jbHVkZXMoZSkmJnRoaXMuX3NldFByb3AoZSx0aGlzW2VdKTtmb3IobGV0IGUgb2Ygbi5tYXAoRSkpT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7Z2V0KCl7cmV0dXJuIHRoaXMuX2dldFByb3AoZSl9LHNldCh0KXt0aGlzLl9zZXRQcm9wKGUsdCwhMCwhdGhpcy5fcGF0Y2hpbmcpfX0pfV9zZXRBdHRyKGUpe2lmKGUuc3RhcnRzV2l0aChgZGF0YS12LWApKXJldHVybjtsZXQgdD10aGlzLmhhc0F0dHJpYnV0ZShlKSxuPXQ/dGhpcy5nZXRBdHRyaWJ1dGUoZSk6eGwscj1FKGUpO3QmJnRoaXMuX251bWJlclByb3BzJiZ0aGlzLl9udW1iZXJQcm9wc1tyXSYmKG49ZmUobikpLHRoaXMuX3NldFByb3AocixuLCExLCEwKX1fZ2V0UHJvcChlKXtyZXR1cm4gdGhpcy5fcHJvcHNbZV19X3NldFByb3AoZSx0LG49ITAscj0hMSl7aWYodCE9PXRoaXMuX3Byb3BzW2VdJiYodGhpcy5fZGlydHk9ITAsdD09PXhsP2RlbGV0ZSB0aGlzLl9wcm9wc1tlXToodGhpcy5fcHJvcHNbZV09dCxlPT09YGtleWAmJnRoaXMuX2FwcCYmKHRoaXMuX2FwcC5fY2VWTm9kZS5rZXk9dCkpLHImJnRoaXMuX2luc3RhbmNlJiZ0aGlzLl91cGRhdGUoKSxuKSl7bGV0IG49dGhpcy5fb2I7biYmKHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobi50YWtlUmVjb3JkcygpKSxuLmRpc2Nvbm5lY3QoKSksdD09PSEwP3RoaXMuc2V0QXR0cmlidXRlKG9lKGUpLGBgKTp0eXBlb2YgdD09YHN0cmluZ2B8fHR5cGVvZiB0PT1gbnVtYmVyYD90aGlzLnNldEF0dHJpYnV0ZShvZShlKSx0K2BgKTp0fHx0aGlzLnJlbW92ZUF0dHJpYnV0ZShvZShlKSksbiYmbi5vYnNlcnZlKHRoaXMse2F0dHJpYnV0ZXM6ITB9KX19X3VwZGF0ZSgpe2xldCBlPXRoaXMuX2NyZWF0ZVZOb2RlKCk7dGhpcy5fYXBwJiYoZS5hcHBDb250ZXh0PXRoaXMuX2FwcC5fY29udGV4dCkscHUoZSx0aGlzLl9yb290KX1fY3JlYXRlVk5vZGUoKXtsZXQgZT17fTt0aGlzLnNoYWRvd1Jvb3R8fChlLm9uVm5vZGVNb3VudGVkPWUub25Wbm9kZVVwZGF0ZWQ9dGhpcy5fcmVuZGVyU2xvdHMuYmluZCh0aGlzKSk7bGV0IHQ9SCh0aGlzLl9kZWYsbChlLHRoaXMuX3Byb3BzKSk7cmV0dXJuIHRoaXMuX2luc3RhbmNlfHwodC5jZT1lPT57dGhpcy5faW5zdGFuY2U9ZSxlLmNlPXRoaXMsZS5pc0NFPSEwO2xldCB0PShlLHQpPT57dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChlLHRlKHRbMF0pP2woe2RldGFpbDp0fSx0WzBdKTp7ZGV0YWlsOnR9KSl9O2UuZW1pdD0oZSwuLi5uKT0+e3QoZSxuKSxvZShlKSE9PWUmJnQob2UoZSksbil9LHRoaXMuX3NldFBhcmVudCgpfSksdH1fYXBwbHlTdHlsZXMoZSx0LG4pe2lmKCFlKXJldHVybjtpZih0KXtpZih0PT09dGhpcy5fZGVmfHx0aGlzLl9zdHlsZUNoaWxkcmVuLmhhcyh0KSlyZXR1cm47dGhpcy5fc3R5bGVDaGlsZHJlbi5hZGQodCl9bGV0IHI9dGhpcy5fbm9uY2UsaT10aGlzLnNoYWRvd1Jvb3QsYT1uP3RoaXMuX2dldFN0eWxlQW5jaG9yKG4pfHx0aGlzLl9nZXRTdHlsZUFuY2hvcih0aGlzLl9kZWYpOnRoaXMuX2dldFJvb3RTdHlsZUluc2VydGlvbkFuY2hvcihpKSxvPW51bGw7Zm9yKGxldCBzPWUubGVuZ3RoLTE7cz49MDtzLS0pe2xldCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYHN0eWxlYCk7ciYmYy5zZXRBdHRyaWJ1dGUoYG5vbmNlYCxyKSxjLnRleHRDb250ZW50PWVbc10saS5pbnNlcnRCZWZvcmUoYyxvfHxhKSxvPWMscz09PTAmJihufHx0aGlzLl9zdHlsZUFuY2hvcnMuc2V0KHRoaXMuX2RlZixjKSx0JiZ0aGlzLl9zdHlsZUFuY2hvcnMuc2V0KHQsYykpfX1fZ2V0U3R5bGVBbmNob3IoZSl7aWYoIWUpcmV0dXJuIG51bGw7bGV0IHQ9dGhpcy5fc3R5bGVBbmNob3JzLmdldChlKTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlPT09dGhpcy5zaGFkb3dSb290P3Q6KHQmJnRoaXMuX3N0eWxlQW5jaG9ycy5kZWxldGUoZSksbnVsbCl9X2dldFJvb3RTdHlsZUluc2VydGlvbkFuY2hvcihlKXtmb3IobGV0IHQ9MDt0PGUuY2hpbGROb2Rlcy5sZW5ndGg7dCsrKXtsZXQgbj1lLmNoaWxkTm9kZXNbdF07aWYoIShuIGluc3RhbmNlb2YgSFRNTFN0eWxlRWxlbWVudCkpcmV0dXJuIG59cmV0dXJuIG51bGx9X3BhcnNlU2xvdHMoKXtsZXQgZT10aGlzLl9zbG90cz17fSx0O2Zvcig7dD10aGlzLmZpcnN0Q2hpbGQ7KXtsZXQgbj10Lm5vZGVUeXBlPT09MSYmdC5nZXRBdHRyaWJ1dGUoYHNsb3RgKXx8YGRlZmF1bHRgOyhlW25dfHwoZVtuXT1bXSkpLnB1c2godCksdGhpcy5yZW1vdmVDaGlsZCh0KX19X3JlbmRlclNsb3RzKCl7bGV0IGU9dGhpcy5fZ2V0U2xvdHMoKSx0PXRoaXMuX2luc3RhbmNlLnR5cGUuX19zY29wZUlkO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dLGk9ci5nZXRBdHRyaWJ1dGUoYG5hbWVgKXx8YGRlZmF1bHRgLGE9dGhpcy5fc2xvdHNbaV0sbz1yLnBhcmVudE5vZGU7aWYoYSlmb3IobGV0IGUgb2YgYSl7aWYodCYmZS5ub2RlVHlwZT09PTEpe2xldCBuPXQrYC1zYCxyPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSwxKTtlLnNldEF0dHJpYnV0ZShuLGBgKTtsZXQgaTtmb3IoO2k9ci5uZXh0Tm9kZSgpOylpLnNldEF0dHJpYnV0ZShuLGBgKX1vLmluc2VydEJlZm9yZShlLHIpfWVsc2UgZm9yKDtyLmZpcnN0Q2hpbGQ7KW8uaW5zZXJ0QmVmb3JlKHIuZmlyc3RDaGlsZCxyKTtvLnJlbW92ZUNoaWxkKHIpfX1fZ2V0U2xvdHMoKXtsZXQgZT1bdGhpc107dGhpcy5fdGVsZXBvcnRUYXJnZXRzJiZlLnB1c2goLi4udGhpcy5fdGVsZXBvcnRUYXJnZXRzKTtsZXQgdD1uZXcgU2V0O2ZvcihsZXQgbiBvZiBlKXtsZXQgZT1uLnF1ZXJ5U2VsZWN0b3JBbGwoYHNsb3RgKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LmFkZChlW25dKX1yZXR1cm4gQXJyYXkuZnJvbSh0KX1faW5qZWN0Q2hpbGRTdHlsZShlLHQpe3RoaXMuX2FwcGx5U3R5bGVzKGUuc3R5bGVzLGUsdCl9X2JlZ2luUGF0Y2goKXt0aGlzLl9wYXRjaGluZz0hMCx0aGlzLl9kaXJ0eT0hMX1fZW5kUGF0Y2goKXt0aGlzLl9wYXRjaGluZz0hMSx0aGlzLl9kaXJ0eSYmdGhpcy5faW5zdGFuY2UmJnRoaXMuX3VwZGF0ZSgpfV9oYXNTaGFkb3dSb290KCl7cmV0dXJuIHRoaXMuX2RlZi5zaGFkb3dSb290IT09ITF9X3JlbW92ZUNoaWxkU3R5bGUoZSl7fX07ZnVuY3Rpb24gRWwoZSl7bGV0IHQ9RnMoKTtyZXR1cm4gdCYmdC5jZXx8bnVsbH1mdW5jdGlvbiBEbCgpe2xldCBlPUVsKCk7cmV0dXJuIGUmJmUuc2hhZG93Um9vdH1mdW5jdGlvbiBPbChlPWAkc3R5bGVgKXt7bGV0IHQ9RnMoKTtpZighdClyZXR1cm4gcjtsZXQgbj10LnR5cGUuX19jc3NNb2R1bGVzO3JldHVybiBuJiZuW2VdfHxyfX12YXIga2w9bmV3IFdlYWtNYXAsQWw9bmV3IFdlYWtNYXAsamw9U3ltYm9sKGBfbW92ZUNiYCksTWw9U3ltYm9sKGBfZW50ZXJDYmApLE5sPShlPT4oZGVsZXRlIGUucHJvcHMubW9kZSxlKSkoe25hbWU6YFRyYW5zaXRpb25Hcm91cGAscHJvcHM6bCh7fSxDYyx7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoZSx7c2xvdHM6dH0pe2xldCBuPUZzKCkscj1LcigpLGksYTtyZXR1cm4gJGkoKCk9PntpZighaS5sZW5ndGgpcmV0dXJuO2xldCB0PWUubW92ZUNsYXNzfHxgJHtlLm5hbWV8fGB2YH0tbW92ZWA7aWYoIVJsKGlbMF0uZWwsbi52bm9kZS5lbCx0KSl7aT1bXTtyZXR1cm59aS5mb3JFYWNoKFBsKSxpLmZvckVhY2goRmwpO2xldCByPWkuZmlsdGVyKElsKTtSYyhuLnZub2RlLmVsKSxyLmZvckVhY2goZT0+e2xldCBuPWUuZWwscj1uLnN0eWxlO0FjKG4sdCksci50cmFuc2Zvcm09ci53ZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249YGA7bGV0IGk9bltqbF09ZT0+e2UmJmUudGFyZ2V0IT09bnx8KCFlfHxlLnByb3BlcnR5TmFtZS5lbmRzV2l0aChgdHJhbnNmb3JtYCkpJiYobi5yZW1vdmVFdmVudExpc3RlbmVyKGB0cmFuc2l0aW9uZW5kYCxpKSxuW2psXT1udWxsLGpjKG4sdCkpfTtuLmFkZEV2ZW50TGlzdGVuZXIoYHRyYW5zaXRpb25lbmRgLGkpfSksaT1bXX0pLCgpPT57bGV0IG89QShlKSxzPURjKG8pLGM9by50YWd8fEw7aWYoaT1bXSxhKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKXtsZXQgdD1hW2VdO3QuZWwmJnQuZWwgaW5zdGFuY2VvZiBFbGVtZW50JiYhdC5lbFtWY10mJihpLnB1c2godCkscmkodCxlaSh0LHMscixuKSksa2wuc2V0KHQsTGwodC5lbCkpKX1hPXQuZGVmYXVsdD9paSh0LmRlZmF1bHQoKSk6W107Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspe2xldCB0PWFbZV07dC5rZXkhPW51bGwmJnJpKHQsZWkodCxzLHIsbikpfXJldHVybiBIKGMsbnVsbCxhKX19fSk7ZnVuY3Rpb24gUGwoZSl7bGV0IHQ9ZS5lbDt0W2psXSYmdFtqbF0oKSx0W01sXSYmdFtNbF0oKX1mdW5jdGlvbiBGbChlKXtBbC5zZXQoZSxMbChlLmVsKSl9ZnVuY3Rpb24gSWwoZSl7bGV0IHQ9a2wuZ2V0KGUpLG49QWwuZ2V0KGUpLHI9dC5sZWZ0LW4ubGVmdCxpPXQudG9wLW4udG9wO2lmKHJ8fGkpe2xldCB0PWUuZWwsbj10LnN0eWxlLGE9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPTEscz0xO3JldHVybiB0Lm9mZnNldFdpZHRoJiYobz1hLndpZHRoL3Qub2Zmc2V0V2lkdGgpLHQub2Zmc2V0SGVpZ2h0JiYocz1hLmhlaWdodC90Lm9mZnNldEhlaWdodCksKCFOdW1iZXIuaXNGaW5pdGUobyl8fG89PT0wKSYmKG89MSksKCFOdW1iZXIuaXNGaW5pdGUocyl8fHM9PT0wKSYmKHM9MSksTWF0aC5hYnMoby0xKTwuMDEmJihvPTEpLE1hdGguYWJzKHMtMSk8LjAxJiYocz0xKSxuLnRyYW5zZm9ybT1uLndlYmtpdFRyYW5zZm9ybT1gdHJhbnNsYXRlKCR7ci9vfXB4LCR7aS9zfXB4KWAsbi50cmFuc2l0aW9uRHVyYXRpb249YDBzYCxlfX1mdW5jdGlvbiBMbChlKXtsZXQgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybntsZWZ0OnQubGVmdCx0b3A6dC50b3B9fWZ1bmN0aW9uIFJsKGUsdCxuKXtsZXQgcj1lLmNsb25lTm9kZSgpLGk9ZVt4Y107aSYmaS5mb3JFYWNoKGU9PntlLnNwbGl0KC9ccysvKS5mb3JFYWNoKGU9PmUmJnIuY2xhc3NMaXN0LnJlbW92ZShlKSl9KSxuLnNwbGl0KC9ccysvKS5mb3JFYWNoKGU9PmUmJnIuY2xhc3NMaXN0LmFkZChlKSksci5zdHlsZS5kaXNwbGF5PWBub25lYDtsZXQgYT10Lm5vZGVUeXBlPT09MT90OnQucGFyZW50Tm9kZTthLmFwcGVuZENoaWxkKHIpO2xldHtoYXNUcmFuc2Zvcm06b309RmMocik7cmV0dXJuIGEucmVtb3ZlQ2hpbGQociksb312YXIgemw9ZT0+e2xldCB0PWUucHJvcHNbYG9uVXBkYXRlOm1vZGVsVmFsdWVgXXx8ITE7cmV0dXJuIHAodCk/ZT0+bGUodCxlKTp0fTtmdW5jdGlvbiBCbChlKXtlLnRhcmdldC5jb21wb3Npbmc9ITB9ZnVuY3Rpb24gVmwoZSl7bGV0IHQ9ZS50YXJnZXQ7dC5jb21wb3NpbmcmJih0LmNvbXBvc2luZz0hMSx0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGBpbnB1dGApKSl9dmFyIEhsPVN5bWJvbChgX2Fzc2lnbmApLFVsPVN5bWJvbChgX2luaXRpYWxWYWx1ZWApO2Z1bmN0aW9uIFdsKGUsdCxuKXtyZXR1cm4gdCYmKGU9ZS50cmltKCkpLG4mJihlPWRlKGUpKSxlfXZhciBHbD17Y3JlYXRlZChlLHttb2RpZmllcnM6e2xhenk6dCx0cmltOm4sbnVtYmVyOnJ9fSxpKXtlLnBhcmVudE5vZGUmJihlLnR5cGU9PT1gdGV4dGA/ZVtVbF09ZS5kZWZhdWx0VmFsdWUucmVwbGFjZSgvW1xyXG5dL2csYGApOmUudHlwZT09PWB0ZXh0YXJlYWAmJihlW1VsXT1lLmRlZmF1bHRWYWx1ZS5yZXBsYWNlKC9cclxuPy9nLGAKYCkpKSxlW0hsXT16bChpKTtsZXQgYT1yfHxpLnByb3BzJiZpLnByb3BzLnR5cGU9PT1gbnVtYmVyYDtvbChlLHQ/YGNoYW5nZWA6YGlucHV0YCx0PT57dC50YXJnZXQuY29tcG9zaW5nfHxlW0hsXShXbChlLnZhbHVlLG4sYSkpfSksKG58fGEpJiZvbChlLGBjaGFuZ2VgLCgpPT57ZS52YWx1ZT1XbChlLnZhbHVlLG4sYSl9KSx0fHwob2woZSxgY29tcG9zaXRpb25zdGFydGAsQmwpLG9sKGUsYGNvbXBvc2l0aW9uZW5kYCxWbCksb2woZSxgY2hhbmdlYCxWbCkpfSxtb3VudGVkKGUse3ZhbHVlOnQsbW9kaWZpZXJzOnt0cmltOm4sbnVtYmVyOnJ9fSl7bGV0IGk9dD8/YGAsYT1lW1VsXTtkZWxldGUgZVtVbF0sYSE9PXZvaWQgMCYmKGUudHlwZT09PWB0ZXh0YHx8ZS50eXBlPT09YHRleHRhcmVhYCkmJmUudmFsdWUhPT1hP2VbSGxdKFdsKGUudmFsdWUsbixyKSk6ZS52YWx1ZT1pfSxiZWZvcmVVcGRhdGUoZSx7dmFsdWU6dCxvbGRWYWx1ZTpuLG1vZGlmaWVyczp7bGF6eTpyLHRyaW06aSxudW1iZXI6YX19LG8pe2lmKGVbSGxdPXpsKG8pLGUuY29tcG9zaW5nKXJldHVybjtsZXQgcz0oYXx8ZS50eXBlPT09YG51bWJlcmApJiYhL14wXGQvLnRlc3QoZS52YWx1ZSk/ZGUoZS52YWx1ZSk6ZS52YWx1ZSxjPXQ/P2BgO2lmKHM9PT1jKXJldHVybjtsZXQgbD1lLmdldFJvb3ROb2RlKCk7KGwgaW5zdGFuY2VvZiBEb2N1bWVudHx8bCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpJiZsLmFjdGl2ZUVsZW1lbnQ9PT1lJiZlLnR5cGUhPT1gcmFuZ2VgJiYociYmdD09PW58fGkmJmUudmFsdWUudHJpbSgpPT09Yyl8fChlLnZhbHVlPWMpfX0sS2w9e2RlZXA6ITAsY3JlYXRlZChlLHQsbil7ZVtIbF09emwobiksb2woZSxgY2hhbmdlYCwoKT0+e2xldCB0PWUuX21vZGVsVmFsdWUsbj1abChlKSxyPWUuY2hlY2tlZCxpPWVbSGxdO2lmKHAodCkpe2xldCBlPURlKHQsbiksYT1lIT09LTE7aWYociYmIWEpaSh0LmNvbmNhdChuKSk7ZWxzZSBpZighciYmYSl7bGV0IG49Wy4uLnRdO24uc3BsaWNlKGUsMSksaShuKX19ZWxzZSBpZihoKHQpKXtsZXQgZT1uZXcgU2V0KHQpO3I/ZS5hZGQobik6ZS5kZWxldGUobiksaShlKX1lbHNlIGkoUWwoZSxyKSl9KX0sbW91bnRlZDpxbCxiZWZvcmVVcGRhdGUoZSx0LG4pe2VbSGxdPXpsKG4pLHFsKGUsdCxuKX19O2Z1bmN0aW9uIHFsKGUse3ZhbHVlOnQsb2xkVmFsdWU6bn0scil7ZS5fbW9kZWxWYWx1ZT10O2xldCBpO2lmKHAodCkpaT1EZSh0LHIucHJvcHMudmFsdWUpPi0xO2Vsc2UgaWYoaCh0KSlpPXQuaGFzKHIucHJvcHMudmFsdWUpO2Vsc2V7aWYodD09PW4pcmV0dXJuO2k9RWUodCxRbChlLCEwKSl9ZS5jaGVja2VkIT09aSYmKGUuY2hlY2tlZD1pKX12YXIgSmw9e2NyZWF0ZWQoZSx7dmFsdWU6dH0sbil7ZS5jaGVja2VkPUVlKHQsbi5wcm9wcy52YWx1ZSksZVtIbF09emwobiksb2woZSxgY2hhbmdlYCwoKT0+e2VbSGxdKFpsKGUpKX0pfSxiZWZvcmVVcGRhdGUoZSx7dmFsdWU6dCxvbGRWYWx1ZTpufSxyKXtlW0hsXT16bChyKSx0IT09biYmKGUuY2hlY2tlZD1FZSh0LHIucHJvcHMudmFsdWUpKX19LFlsPXtkZWVwOiEwLGNyZWF0ZWQoZSx7dmFsdWU6dCxtb2RpZmllcnM6e251bWJlcjpufX0scil7ZS5fbW9kZWxWYWx1ZT10LG9sKGUsYGNoYW5nZWAsKCk9PntsZXQgdD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZS5vcHRpb25zLGU9PmUuc2VsZWN0ZWQpLm1hcChlPT5uP2RlKFpsKGUpKTpabChlKSk7ZVtIbF0oZS5tdWx0aXBsZT9oKGUuX21vZGVsVmFsdWUpP25ldyBTZXQodCk6dDp0WzBdKSxlLl9hc3NpZ25pbmc9ITAsUW4oKCk9PntlLl9hc3NpZ25pbmc9ITF9KX0pLGVbSGxdPXpsKHIpfSxtb3VudGVkKGUse3ZhbHVlOnR9KXtYbChlLHQpfSxiZWZvcmVVcGRhdGUoZSx7dmFsdWU6dH0sbil7ZS5fbW9kZWxWYWx1ZT10LGVbSGxdPXpsKG4pfSx1cGRhdGVkKGUse3ZhbHVlOnR9KXtlLl9hc3NpZ25pbmd8fFhsKGUsdCl9fTtmdW5jdGlvbiBYbChlLHQpe2xldCBuPWUubXVsdGlwbGUscj1wKHQpO2lmKCEobiYmIXImJiFoKHQpKSl7Zm9yKGxldCBpPTAsYT1lLm9wdGlvbnMubGVuZ3RoO2k8YTtpKyspe2xldCBhPWUub3B0aW9uc1tpXSxvPVpsKGEpO2lmKG4pe2lmKHIpe2xldCBlPXR5cGVvZiBvO2Euc2VsZWN0ZWQ9ZT09PWBzdHJpbmdgfHxlPT09YG51bWJlcmA/dC5zb21lKGU9PlN0cmluZyhlKT09PVN0cmluZyhvKSk6RGUodCxvKT4tMX1lbHNlIGEuc2VsZWN0ZWQ9dC5oYXMobyl9ZWxzZSBpZihFZShabChhKSx0KSl7ZS5zZWxlY3RlZEluZGV4IT09aSYmKGUuc2VsZWN0ZWRJbmRleD1pKTtyZXR1cm59fSFuJiZlLnNlbGVjdGVkSW5kZXghPT0tMSYmKGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIFpsKGUpe3JldHVybmBfdmFsdWVgaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIFFsKGUsdCl7bGV0IG49dD9gX3RydWVWYWx1ZWA6YF9mYWxzZVZhbHVlYDtyZXR1cm4gbiBpbiBlP2Vbbl06dH12YXIgJGw9e2NyZWF0ZWQoZSx0LG4pe3R1KGUsdCxuLG51bGwsYGNyZWF0ZWRgKX0sbW91bnRlZChlLHQsbil7dHUoZSx0LG4sbnVsbCxgbW91bnRlZGApfSxiZWZvcmVVcGRhdGUoZSx0LG4scil7dHUoZSx0LG4scixgYmVmb3JlVXBkYXRlYCl9LHVwZGF0ZWQoZSx0LG4scil7dHUoZSx0LG4scixgdXBkYXRlZGApfX07ZnVuY3Rpb24gZXUoZSx0KXtzd2l0Y2goZSl7Y2FzZWBTRUxFQ1RgOnJldHVybiBZbDtjYXNlYFRFWFRBUkVBYDpyZXR1cm4gR2w7ZGVmYXVsdDpzd2l0Y2godCl7Y2FzZWBjaGVja2JveGA6cmV0dXJuIEtsO2Nhc2VgcmFkaW9gOnJldHVybiBKbDtkZWZhdWx0OnJldHVybiBHbH19fWZ1bmN0aW9uIHR1KGUsdCxuLHIsaSl7bGV0IGE9ZXUoZS50YWdOYW1lLG4ucHJvcHMmJm4ucHJvcHMudHlwZSlbaV07YSYmYShlLHQsbixyKX1mdW5jdGlvbiBudSgpe0dsLmdldFNTUlByb3BzPSh7dmFsdWU6ZX0pPT4oe3ZhbHVlOmV9KSxKbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9LHQpPT57aWYodC5wcm9wcyYmRWUodC5wcm9wcy52YWx1ZSxlKSlyZXR1cm57Y2hlY2tlZDohMH19LEtsLmdldFNTUlByb3BzPSh7dmFsdWU6ZX0sdCk9PntpZihwKGUpKXtpZih0LnByb3BzJiZEZShlLHQucHJvcHMudmFsdWUpPi0xKXJldHVybntjaGVja2VkOiEwfX1lbHNlIGlmKGgoZSkpe2lmKHQucHJvcHMmJmUuaGFzKHQucHJvcHMudmFsdWUpKXJldHVybntjaGVja2VkOiEwfX1lbHNlIGlmKGUpcmV0dXJue2NoZWNrZWQ6ITB9fSwkbC5nZXRTU1JQcm9wcz0oZSx0KT0+e2lmKHR5cGVvZiB0LnR5cGUhPWBzdHJpbmdgKXJldHVybjtsZXQgbj1ldSh0LnR5cGUudG9VcHBlckNhc2UoKSx0LnByb3BzJiZ0LnByb3BzLnR5cGUpO2lmKG4uZ2V0U1NSUHJvcHMpcmV0dXJuIG4uZ2V0U1NSUHJvcHMoZSx0KX19dmFyIHJ1PVtgY3RybGAsYHNoaWZ0YCxgYWx0YCxgbWV0YWBdLGl1PXtzdG9wOmU9PmUuc3RvcFByb3BhZ2F0aW9uKCkscHJldmVudDplPT5lLnByZXZlbnREZWZhdWx0KCksc2VsZjplPT5lLnRhcmdldCE9PWUuY3VycmVudFRhcmdldCxjdHJsOmU9PiFlLmN0cmxLZXksc2hpZnQ6ZT0+IWUuc2hpZnRLZXksYWx0OmU9PiFlLmFsdEtleSxtZXRhOmU9PiFlLm1ldGFLZXksbGVmdDplPT5gYnV0dG9uYGluIGUmJmUuYnV0dG9uIT09MCxtaWRkbGU6ZT0+YGJ1dHRvbmBpbiBlJiZlLmJ1dHRvbiE9PTEscmlnaHQ6ZT0+YGJ1dHRvbmBpbiBlJiZlLmJ1dHRvbiE9PTIsZXhhY3Q6KGUsdCk9PnJ1LnNvbWUobj0+ZVtgJHtufUtleWBdJiYhdC5pbmNsdWRlcyhuKSl9LGF1PShlLHQpPT57aWYoIWUpcmV0dXJuIGU7bGV0IG49ZS5fd2l0aE1vZHN8fD17fSxyPXQuam9pbihgLmApO3JldHVybiBuW3JdfHwobltyXT0oKG4sLi4ucik9Pntmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IHI9aXVbdFtlXV07aWYociYmcihuLHQpKXJldHVybn1yZXR1cm4gZShuLC4uLnIpfSkpfSxvdT17ZXNjOmBlc2NhcGVgLHNwYWNlOmAgYCx1cDpgYXJyb3ctdXBgLGxlZnQ6YGFycm93LWxlZnRgLHJpZ2h0OmBhcnJvdy1yaWdodGAsZG93bjpgYXJyb3ctZG93bmAsZGVsZXRlOmBiYWNrc3BhY2VgfSxzdT0oZSx0KT0+e2xldCBuPWUuX3dpdGhLZXlzfHw9e30scj10LmpvaW4oYC5gKTtyZXR1cm4gbltyXXx8KG5bcl09KG49PntpZighKGBrZXlgaW4gbikpcmV0dXJuO2xldCByPW9lKG4ua2V5KTtpZih0LnNvbWUoZT0+ZT09PXJ8fG91W2VdPT09cikpcmV0dXJuIGUobil9KSl9LGN1PWwoe3BhdGNoUHJvcDp2bH0sdmMpLGx1LHV1PSExO2Z1bmN0aW9uIGR1KCl7cmV0dXJuIGx1fHw9TG8oY3UpfWZ1bmN0aW9uIGZ1KCl7cmV0dXJuIGx1PXV1P2x1OlJvKGN1KSx1dT0hMCxsdX12YXIgcHU9KCguLi5lKT0+e2R1KCkucmVuZGVyKC4uLmUpfSksbXU9KCguLi5lKT0+e2Z1KCkuaHlkcmF0ZSguLi5lKX0pLGh1PSgoLi4uZSk9PntsZXQgdD1kdSgpLmNyZWF0ZUFwcCguLi5lKSx7bW91bnQ6bn09dDtyZXR1cm4gdC5tb3VudD1lPT57bGV0IHI9dnUoZSk7aWYoIXIpcmV0dXJuO2xldCBpPXQuX2NvbXBvbmVudDshdihpKSYmIWkucmVuZGVyJiYhaS50ZW1wbGF0ZSYmKGkudGVtcGxhdGU9ci5pbm5lckhUTUwpLHIubm9kZVR5cGU9PT0xJiYoci50ZXh0Q29udGVudD1gYCk7bGV0IGE9bihyLCExLF91KHIpKTtyZXR1cm4gciBpbnN0YW5jZW9mIEVsZW1lbnQmJihyLnJlbW92ZUF0dHJpYnV0ZShgdi1jbG9ha2ApLHIuc2V0QXR0cmlidXRlKGBkYXRhLXYtYXBwYCxgYCkpLGF9LHR9KSxndT0oKC4uLmUpPT57bGV0IHQ9ZnUoKS5jcmVhdGVBcHAoLi4uZSkse21vdW50Om59PXQ7cmV0dXJuIHQubW91bnQ9ZT0+e2xldCB0PXZ1KGUpO2lmKHQpcmV0dXJuIG4odCwhMCxfdSh0KSl9LHR9KTtmdW5jdGlvbiBfdShlKXtpZihlIGluc3RhbmNlb2YgU1ZHRWxlbWVudClyZXR1cm5gc3ZnYDtpZih0eXBlb2YgTWF0aE1MRWxlbWVudD09YGZ1bmN0aW9uYCYmZSBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQpcmV0dXJuYG1hdGhtbGB9ZnVuY3Rpb24gdnUoZSl7cmV0dXJuIHkoZSk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTplfXZhciB5dT0hMSxidT0oKT0+e3l1fHwoeXU9ITAsbnUoKSxXYygpKX0seHU9dCh7QmFzZVRyYW5zaXRpb246KCk9PlFyLEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzOigpPT5KcixDb21tZW50OigpPT5jcyxEZXByZWNhdGlvblR5cGVzOigpPT5udWxsLEVmZmVjdFNjb3BlOigpPT5OZSxFcnJvckNvZGVzOigpPT56bixFcnJvclR5cGVTdHJpbmdzOigpPT5zYyxGcmFnbWVudDooKT0+TCxLZWVwQWxpdmU6KCk9PkJpLFJlYWN0aXZlRWZmZWN0OigpPT56ZSxTdGF0aWM6KCk9PmxzLFN1c3BlbnNlOigpPT5YbyxUZWxlcG9ydDooKT0+VnIsVGV4dDooKT0+c3MsVHJhY2tPcFR5cGVzOigpPT5FbixUcmFuc2l0aW9uOigpPT53YyxUcmFuc2l0aW9uR3JvdXA6KCk9Pk5sLFRyaWdnZXJPcFR5cGVzOigpPT5EbixWdWVFbGVtZW50OigpPT5UbCxhc3NlcnROdW1iZXI6KCk9PlJuLGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nOigpPT5IbixjYWxsV2l0aEVycm9ySGFuZGxpbmc6KCk9PlZuLGNhbWVsaXplOigpPT5FLGNhcGl0YWxpemU6KCk9PnNlLGNsb25lVk5vZGU6KCk9PkNzLGNvbXBhdFV0aWxzOigpPT5udWxsLGNvbXBpbGU6KCk9PlN1LGNvbXB1dGVkOigpPT5XLGNyZWF0ZUFwcDooKT0+aHUsY3JlYXRlQmxvY2s6KCk9PkIsY3JlYXRlQ29tbWVudFZOb2RlOigpPT5UcyxjcmVhdGVFbGVtZW50QmxvY2s6KCk9PnosY3JlYXRlRWxlbWVudFZOb2RlOigpPT5WLGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyOigpPT5SbyxjcmVhdGVQcm9wc1Jlc3RQcm94eTooKT0+SWEsY3JlYXRlUmVuZGVyZXI6KCk9PkxvLGNyZWF0ZVNTUkFwcDooKT0+Z3UsY3JlYXRlU2xvdHM6KCk9PmhhLGNyZWF0ZVN0YXRpY1ZOb2RlOigpPT53cyxjcmVhdGVUZXh0Vk5vZGU6KCk9PlUsY3JlYXRlVk5vZGU6KCk9PkgsY3VzdG9tUmVmOigpPT52bixkZWZpbmVBc3luY0NvbXBvbmVudDooKT0+TGksZGVmaW5lQ29tcG9uZW50OigpPT5GLGRlZmluZUN1c3RvbUVsZW1lbnQ6KCk9PlNsLGRlZmluZUVtaXRzOigpPT53YSxkZWZpbmVFeHBvc2U6KCk9PlRhLGRlZmluZU1vZGVsOigpPT5PYSxkZWZpbmVPcHRpb25zOigpPT5FYSxkZWZpbmVQcm9wczooKT0+Q2EsZGVmaW5lU1NSQ3VzdG9tRWxlbWVudDooKT0+Q2wsZGVmaW5lU2xvdHM6KCk9PkRhLGRldnRvb2xzOigpPT5jYyxlZmZlY3Q6KCk9PlFlLGVmZmVjdFNjb3BlOigpPT5QZSxnZXRDdXJyZW50SW5zdGFuY2U6KCk9PkZzLGdldEN1cnJlbnRTY29wZTooKT0+RmUsZ2V0Q3VycmVudFdhdGNoZXI6KCk9PmpuLGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbjooKT0+aWksZ3VhcmRSZWFjdGl2ZVByb3BzOigpPT5TcyxoOigpPT50YyxoYW5kbGVFcnJvcjooKT0+VW4saGFzSW5qZWN0aW9uQ29udGV4dDooKT0+YnIsaHlkcmF0ZTooKT0+bXUsaHlkcmF0ZU9uSWRsZTooKT0+QWksaHlkcmF0ZU9uSW50ZXJhY3Rpb246KCk9PlBpLGh5ZHJhdGVPbk1lZGlhUXVlcnk6KCk9Pk5pLGh5ZHJhdGVPblZpc2libGU6KCk9Pk1pLGluaXRDdXN0b21Gb3JtYXR0ZXI6KCk9Pm5jLGluaXREaXJlY3RpdmVzRm9yU1NSOigpPT5idSxpbmplY3Q6KCk9PnlyLGlzTWVtb1NhbWU6KCk9PmljLGlzUHJveHk6KCk9Pm9uLGlzUmVhY3RpdmU6KCk9Pm5uLGlzUmVhZG9ubHk6KCk9PnJuLGlzUmVmOigpPT5qLGlzUnVudGltZU9ubHk6KCk9PkpzLGlzU2hhbGxvdzooKT0+YW4saXNWTm9kZTooKT0+Z3MsbWFya1JhdzooKT0+c24sbWVyZ2VEZWZhdWx0czooKT0+UGEsbWVyZ2VNb2RlbHM6KCk9PkZhLG1lcmdlUHJvcHM6KCk9PmtzLG5leHRUaWNrOigpPT5Rbixub2RlT3BzOigpPT52Yyxub3JtYWxpemVDbGFzczooKT0+Tyxub3JtYWxpemVQcm9wczooKT0+eGUsbm9ybWFsaXplU3R5bGU6KCk9PmdlLG9uQWN0aXZhdGVkOigpPT5IaSxvbkJlZm9yZU1vdW50OigpPT5YaSxvbkJlZm9yZVVubW91bnQ6KCk9PmVhLG9uQmVmb3JlVXBkYXRlOigpPT5RaSxvbkRlYWN0aXZhdGVkOigpPT5VaSxvbkVycm9yQ2FwdHVyZWQ6KCk9PmFhLG9uTW91bnRlZDooKT0+Wmksb25SZW5kZXJUcmFja2VkOigpPT5pYSxvblJlbmRlclRyaWdnZXJlZDooKT0+cmEsb25TY29wZURpc3Bvc2U6KCk9PkllLG9uU2VydmVyUHJlZmV0Y2g6KCk9Pm5hLG9uVW5tb3VudGVkOigpPT50YSxvblVwZGF0ZWQ6KCk9PiRpLG9uV2F0Y2hlckNsZWFudXA6KCk9Pk1uLG9wZW5CbG9jazooKT0+UixwYXRjaFByb3A6KCk9PnZsLHBvcFNjb3BlSWQ6KCk9Pm1yLHByb3ZpZGU6KCk9PnZyLHByb3h5UmVmczooKT0+Z24scHVzaFNjb3BlSWQ6KCk9PnByLHF1ZXVlUG9zdEZsdXNoQ2I6KCk9Pm5yLHJlYWN0aXZlOigpPT5adCxyZWFkb25seTooKT0+JHQscmVmOigpPT5NLHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyOigpPT5xcyxyZW5kZXI6KCk9PnB1LHJlbmRlckxpc3Q6KCk9Pm1hLHJlbmRlclNsb3Q6KCk9PkkscmVzb2x2ZUNvbXBvbmVudDooKT0+Y2EscmVzb2x2ZURpcmVjdGl2ZTooKT0+ZGEscmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ6KCk9PnVhLHJlc29sdmVGaWx0ZXI6KCk9Pm51bGwscmVzb2x2ZVRyYW5zaXRpb25Ib29rczooKT0+ZWksc2V0QmxvY2tUcmFja2luZzooKT0+bXMsc2V0RGV2dG9vbHNIb29rOigpPT5sYyxzZXRUcmFuc2l0aW9uSG9va3M6KCk9PnJpLHNoYWxsb3dSZWFjdGl2ZTooKT0+UXQsc2hhbGxvd1JlYWRvbmx5OigpPT5lbixzaGFsbG93UmVmOigpPT51bixzc3JDb250ZXh0S2V5OigpPT54cixzc3JVdGlsczooKT0+dWMsc3RvcDooKT0+JGUsdG9EaXNwbGF5U3RyaW5nOigpPT5rLHRvSGFuZGxlcktleTooKT0+Y2UsdG9IYW5kbGVyczooKT0+X2EsdG9SYXc6KCk9PkEsdG9SZWY6KCk9PlNuLHRvUmVmczooKT0+eW4sdG9WYWx1ZTooKT0+bW4sdHJhbnNmb3JtVk5vZGVBcmdzOigpPT52cyx0cmlnZ2VyUmVmOigpPT5wbix1bnJlZjooKT0+Tix1c2VBdHRyczooKT0+amEsdXNlQ3NzTW9kdWxlOigpPT5PbCx1c2VDc3NWYXJzOigpPT5LYyx1c2VIb3N0OigpPT5FbCx1c2VJZDooKT0+YWksdXNlTW9kZWw6KCk9PnJvLHVzZVNTUkNvbnRleHQ6KCk9PlNyLHVzZVNoYWRvd1Jvb3Q6KCk9PkRsLHVzZVNsb3RzOigpPT5BYSx1c2VUZW1wbGF0ZVJlZjooKT0+c2ksdXNlVHJhbnNpdGlvblN0YXRlOigpPT5Lcix2TW9kZWxDaGVja2JveDooKT0+S2wsdk1vZGVsRHluYW1pYzooKT0+JGwsdk1vZGVsUmFkaW86KCk9PkpsLHZNb2RlbFNlbGVjdDooKT0+WWwsdk1vZGVsVGV4dDooKT0+R2wsdlNob3c6KCk9PkhjLHZlcnNpb246KCk9PmFjLHdhcm46KCk9Pm9jLHdhdGNoOigpPT5Fcix3YXRjaEVmZmVjdDooKT0+Q3Isd2F0Y2hQb3N0RWZmZWN0OigpPT53cix3YXRjaFN5bmNFZmZlY3Q6KCk9PlRyLHdpdGhBc3luY0NvbnRleHQ6KCk9PkxhLHdpdGhDdHg6KCk9PlAsd2l0aERlZmF1bHRzOigpPT5rYSx3aXRoRGlyZWN0aXZlczooKT0+Z3Isd2l0aEtleXM6KCk9PnN1LHdpdGhNZW1vOigpPT5yYyx3aXRoTW9kaWZpZXJzOigpPT5hdSx3aXRoU2NvcGVJZDooKT0+aHJ9KSxTdT0oKT0+e307ZnVuY3Rpb24gQ3UoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPUFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIHd1KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gVHUoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gQ3UoZSl9ZnVuY3Rpb24gRXUoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbmApfWZ1bmN0aW9uIER1KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsYHZhbHVlYGluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxSdShyLmtleSkscil9fWZ1bmN0aW9uIE91KGUsdCxuKXtyZXR1cm4gdCYmRHUoZS5wcm90b3R5cGUsdCksbiYmRHUoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIGt1KGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVtgQEBpdGVyYXRvcmBdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj1CdShlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09YG51bWJlcmApe24mJihlPW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6aX19dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgYSxvPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBlPW4ubmV4dCgpO3JldHVybiBvPWUuZG9uZSxlfSxlOmZ1bmN0aW9uKGUpe3M9ITAsYT1lfSxmOmZ1bmN0aW9uKCl7dHJ5e298fG4ucmV0dXJuPT1udWxsfHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX19fWZ1bmN0aW9uIEcoZSx0LG4pe3JldHVybih0PVJ1KHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIEF1KGUpe2lmKHR5cGVvZiBTeW1ib2w8YHVgJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbYEBAaXRlcmF0b3JgXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBqdShlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPGB1YCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlW2BAQGl0ZXJhdG9yYF07aWYobiE9bnVsbCl7dmFyIHIsaSxhLG8scz1bXSxjPSEwLGw9ITE7dHJ5e2lmKGE9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9YS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXtsPSEwLGk9ZX1maW5hbGx5e3RyeXtpZighYyYmbi5yZXR1cm4hPW51bGwmJihvPW4ucmV0dXJuKCksT2JqZWN0KG8pIT09bykpcmV0dXJufWZpbmFsbHl7aWYobCl0aHJvdyBpfX1yZXR1cm4gc319ZnVuY3Rpb24gTXUoKXt0aHJvdyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBOdSgpe3Rocm93IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBQdShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIEsoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/UHUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0coZSx0LG5bdF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6UHUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfWZ1bmN0aW9uIEZ1KGUsdCl7cmV0dXJuIHd1KGUpfHxqdShlLHQpfHxCdShlLHQpfHxNdSgpfWZ1bmN0aW9uIEl1KGUpe3JldHVybiBUdShlKXx8QXUoZSl8fEJ1KGUpfHxOdSgpfWZ1bmN0aW9uIEx1KGUsdCl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4gZTt2YXIgbj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGUsdHx8YGRlZmF1bHRgKTtpZih0eXBlb2YgciE9YG9iamVjdGApcmV0dXJuIHI7dGhyb3cgVHlwZUVycm9yKGBAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLmApfXJldHVybih0PT09YHN0cmluZ2A/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gUnUoZSl7dmFyIHQ9THUoZSxgc3RyaW5nYCk7cmV0dXJuIHR5cGVvZiB0PT1gc3ltYm9sYD90OnQrYGB9ZnVuY3Rpb24genUoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4genU9dHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09YHN5bWJvbGA/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmdHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/YHN5bWJvbGA6dHlwZW9mIGV9LHp1KGUpfWZ1bmN0aW9uIEJ1KGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBDdShlLHQpO3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7cmV0dXJuIG49PT1gT2JqZWN0YCYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxuPT09YE1hcGB8fG49PT1gU2V0YD9BcnJheS5mcm9tKGUpOm49PT1gQXJndW1lbnRzYHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/Q3UoZSx0KTp2b2lkIDB9fXZhciBWdT1mdW5jdGlvbigpe30sSHU9e30sVXU9e30sV3U9bnVsbCxHdT17bWFyazpWdSxtZWFzdXJlOlZ1fTt0cnl7dHlwZW9mIHdpbmRvdzxgdWAmJihIdT13aW5kb3cpLHR5cGVvZiBkb2N1bWVudDxgdWAmJihVdT1kb2N1bWVudCksdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI8YHVgJiYoV3U9TXV0YXRpb25PYnNlcnZlciksdHlwZW9mIHBlcmZvcm1hbmNlPGB1YCYmKEd1PXBlcmZvcm1hbmNlKX1jYXRjaHt9dmFyIEt1PShIdS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQscXU9S3U9PT12b2lkIDA/YGA6S3UsSnU9SHUsWXU9VXUsWHU9V3UsWnU9R3U7SnUuZG9jdW1lbnQ7dmFyIFF1PSEhWXUuZG9jdW1lbnRFbGVtZW50JiYhIVl1LmhlYWQmJnR5cGVvZiBZdS5hZGRFdmVudExpc3RlbmVyPT1gZnVuY3Rpb25gJiZ0eXBlb2YgWXUuY3JlYXRlRWxlbWVudD09YGZ1bmN0aW9uYCwkdT1+cXUuaW5kZXhPZihgTVNJRWApfHx+cXUuaW5kZXhPZihgVHJpZGVudC9gKSxlZCx0ZD0vZmEoa3xrZHxzfHJ8bHx0fGR8ZHJ8ZGx8ZHR8YnxzbHJ8c2xwcnx3c2J8dGx8bnN8bmRzfGVzfGd0fGpyfGpmcnxqZHJ8dXNifHVmc2J8dWRzYnxjcnxzc3xzcnxzbHxzdHxzZHN8c2RyfHNkbHxzZHR8c2xkcnxzbHBkcnxwcnxtc3x2cyk/W1wtXCBdLyxuZD0vRm9udCA/QXdlc29tZSA/KFs1NjcgXSopKFNvbGlkfFJlZ3VsYXJ8TGlnaHR8VGhpbnxEdW90b25lfEJyYW5kc3xGcmVlfFByb3xTaGFycCBEdW90b25lfFNoYXJwfEtpdHxOb3Rkb2cgRHVvfE5vdGRvZ3xDaGlzZWx8RXRjaHxHcmFwaGl0ZXxUaHVtYnByaW50fEplbGx5IEZpbGx8SmVsbHkgRHVvfEplbGx5fFV0aWxpdHl8VXRpbGl0eSBGaWxsfFV0aWxpdHkgRHVvfFNsYWIgUHJlc3N8U2xhYnxTbGFiIER1b3xTbGFiIFByZXNzIER1b3xQaXhlbHxNb3NhaWN8VmVsbHVtfFdoaXRlYm9hcmQpPy4qL2kscmQ9e2NsYXNzaWM6e2ZhOmBzb2xpZGAsZmFzOmBzb2xpZGAsImZhLXNvbGlkIjpgc29saWRgLGZhcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWw6YGxpZ2h0YCwiZmEtbGlnaHQiOmBsaWdodGAsZmF0OmB0aGluYCwiZmEtdGhpbiI6YHRoaW5gLGZhYjpgYnJhbmRzYCwiZmEtYnJhbmRzIjpgYnJhbmRzYH0sZHVvdG9uZTp7ZmE6YHNvbGlkYCxmYWQ6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsImZhLWR1b3RvbmUiOmBzb2xpZGAsZmFkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWRsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhZHQ6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LHNoYXJwOntmYTpgc29saWRgLGZhc3M6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsZmFzcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhc3Q6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmE6YHNvbGlkYCxmYXNkczpgc29saWRgLCJmYS1zb2xpZCI6YHNvbGlkYCxmYXNkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNkbDpgbGlnaHRgLCJmYS1saWdodCI6YGxpZ2h0YCxmYXNkdDpgdGhpbmAsImZhLXRoaW4iOmB0aGluYH0sc2xhYjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscjpgcmVndWxhcmB9LCJzbGFiLXByZXNzIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscHI6YHJlZ3VsYXJgfSwic2xhYi1kdW8iOnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhc2xkcjpgcmVndWxhcmB9LCJzbGFiLXByZXNzLWR1byI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFzbHBkcjpgcmVndWxhcmB9LHRodW1icHJpbnQ6eyJmYS1saWdodCI6YGxpZ2h0YCxmYXRsOmBsaWdodGB9LHZlbGx1bTp7ImZhLXNvbGlkIjpgc29saWRgLGZhdnM6YHNvbGlkYH0scGl4ZWw6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFwcjpgcmVndWxhcmB9LG1vc2FpYzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbXM6YHNvbGlkYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhd3NiOmBzZW1pYm9sZGB9LG5vdGRvZzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbnM6YHNvbGlkYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBzb2xpZGAsZmFuZHM6YHNvbGlkYH0sZXRjaDp7ImZhLXNvbGlkIjpgc29saWRgLGZhZXM6YHNvbGlkYH0sZ3JhcGhpdGU6eyJmYS10aGluIjpgdGhpbmAsZmFndDpgdGhpbmB9LGplbGx5OnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhanI6YHJlZ3VsYXJgfSwiamVsbHktZmlsbCI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFqZnI6YHJlZ3VsYXJgfSwiamVsbHktZHVvIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWpkcjpgcmVndWxhcmB9LGNoaXNlbDp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWNyOmByZWd1bGFyYH0sdXRpbGl0eTp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhdXNiOmBzZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVkc2I6YHNlbWlib2xkYH0sInV0aWxpdHktZmlsbCI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVmc2I6YHNlbWlib2xkYH19LGlkPXtHUk9VUDpgZHVvdG9uZS1ncm91cGAsU1dBUF9PUEFDSVRZOmBzd2FwLW9wYWNpdHlgLFBSSU1BUlk6YHByaW1hcnlgLFNFQ09OREFSWTpgc2Vjb25kYXJ5YH0sYWQ9W2BmYS1jbGFzc2ljYCxgZmEtZHVvdG9uZWAsYGZhLXNoYXJwYCxgZmEtc2hhcnAtZHVvdG9uZWAsYGZhLXRodW1icHJpbnRgLGBmYS13aGl0ZWJvYXJkYCxgZmEtbm90ZG9nYCxgZmEtbm90ZG9nLWR1b2AsYGZhLWNoaXNlbGAsYGZhLWV0Y2hgLGBmYS1ncmFwaGl0ZWAsYGZhLWplbGx5YCxgZmEtamVsbHktZmlsbGAsYGZhLWplbGx5LWR1b2AsYGZhLXNsYWJgLGBmYS1zbGFiLXByZXNzYCxgZmEtc2xhYi1wcmVzcy1kdW9gLGBmYS1zbGFiLWR1b2AsYGZhLW1vc2FpY2AsYGZhLXBpeGVsYCxgZmEtdmVsbHVtYCxgZmEtdXRpbGl0eWAsYGZhLXV0aWxpdHktZHVvYCxgZmEtdXRpbGl0eS1maWxsYF0sb2Q9YGNsYXNzaWNgLHNkPWBkdW90b25lYCxjZD1gc2hhcnBgLGxkPWBzaGFycC1kdW90b25lYCx1ZD1gY2hpc2VsYCxkZD1gZXRjaGAsZmQ9YGdyYXBoaXRlYCxwZD1gamVsbHlgLG1kPWBqZWxseS1kdW9gLGhkPWBqZWxseS1maWxsYCxnZD1gbW9zYWljYCxfZD1gbm90ZG9nYCx2ZD1gbm90ZG9nLWR1b2AseWQ9YHBpeGVsYCxiZD1gc2xhYmAseGQ9YHNsYWItZHVvYCxTZD1gc2xhYi1wcmVzc2AsQ2Q9YHNsYWItcHJlc3MtZHVvYCx3ZD1gdGh1bWJwcmludGAsVGQ9YHV0aWxpdHlgLEVkPWB1dGlsaXR5LWR1b2AsRGQ9YHV0aWxpdHktZmlsbGAsT2Q9YHZlbGx1bWAsa2Q9YHdoaXRlYm9hcmRgLEFkPWBDbGFzc2ljYCxqZD1gRHVvdG9uZWAsTWQ9YFNoYXJwYCxOZD1gU2hhcnAgRHVvdG9uZWAsUGQ9YENoaXNlbGAsRmQ9YEV0Y2hgLElkPWBHcmFwaGl0ZWAsTGQ9YEplbGx5YCxSZD1gSmVsbHkgRHVvYCx6ZD1gSmVsbHkgRmlsbGAsQmQ9YE1vc2FpY2AsVmQ9YE5vdGRvZ2AsSGQ9YE5vdGRvZyBEdW9gLFVkPWBQaXhlbGAsV2Q9YFNsYWJgLEdkPWBTbGFiIER1b2AsS2Q9YFNsYWIgUHJlc3NgLHFkPWBTbGFiIFByZXNzIER1b2AsSmQ9YFRodW1icHJpbnRgLFlkPWBVdGlsaXR5YCxYZD1gVXRpbGl0eSBEdW9gLFpkPWBVdGlsaXR5IEZpbGxgLFFkPWBWZWxsdW1gLCRkPWBXaGl0ZWJvYXJkYCxlZj1bb2Qsc2QsY2QsbGQsdWQsZGQsZmQscGQsbWQsaGQsZ2QsX2QsdmQseWQsYmQseGQsU2QsQ2Qsd2QsVGQsRWQsRGQsT2Qsa2RdO2VkPXt9LEcoRyhHKEcoRyhHKEcoRyhHKEcoZWQsb2QsQWQpLHNkLGpkKSxjZCxNZCksbGQsTmQpLHVkLFBkKSxkZCxGZCksZmQsSWQpLHBkLExkKSxtZCxSZCksaGQsemQpLEcoRyhHKEcoRyhHKEcoRyhHKEcoZWQsZ2QsQmQpLF9kLFZkKSx2ZCxIZCkseWQsVWQpLGJkLFdkKSx4ZCxHZCksU2QsS2QpLENkLHFkKSx3ZCxKZCksVGQsWWQpLEcoRyhHKEcoZWQsRWQsWGQpLERkLFpkKSxPZCxRZCksa2QsJGQpO3ZhciB0Zj17Y2xhc3NpYzp7OTAwOmBmYXNgLDQwMDpgZmFyYCxub3JtYWw6YGZhcmAsMzAwOmBmYWxgLDEwMDpgZmF0YH0sZHVvdG9uZTp7OTAwOmBmYWRgLDQwMDpgZmFkcmAsMzAwOmBmYWRsYCwxMDA6YGZhZHRgfSxzaGFycDp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLDMwMDpgZmFzbGAsMTAwOmBmYXN0YH0sInNoYXJwLWR1b3RvbmUiOns5MDA6YGZhc2RzYCw0MDA6YGZhc2RyYCwzMDA6YGZhc2RsYCwxMDA6YGZhc2R0YH0sc2xhYjp7NDAwOmBmYXNscmB9LCJzbGFiLXByZXNzIjp7NDAwOmBmYXNscHJgfSwic2xhYi1kdW8iOns0MDA6YGZhc2xkcmB9LCJzbGFiLXByZXNzLWR1byI6ezQwMDpgZmFzbHBkcmB9LHZlbGx1bTp7OTAwOmBmYXZzYH0sbW9zYWljOns5MDA6YGZhbXNgfSxwaXhlbDp7NDAwOmBmYXByYH0sd2hpdGVib2FyZDp7NjAwOmBmYXdzYmB9LHRodW1icHJpbnQ6ezMwMDpgZmF0bGB9LG5vdGRvZzp7OTAwOmBmYW5zYH0sIm5vdGRvZy1kdW8iOns5MDA6YGZhbmRzYH0sZXRjaDp7OTAwOmBmYWVzYH0sZ3JhcGhpdGU6ezEwMDpgZmFndGB9LGNoaXNlbDp7NDAwOmBmYWNyYH0samVsbHk6ezQwMDpgZmFqcmB9LCJqZWxseS1maWxsIjp7NDAwOmBmYWpmcmB9LCJqZWxseS1kdW8iOns0MDA6YGZhamRyYH0sdXRpbGl0eTp7NjAwOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6ezYwMDpgZmF1ZHNiYH0sInV0aWxpdHktZmlsbCI6ezYwMDpgZmF1ZnNiYH19LG5mPXsiRm9udCBBd2Vzb21lIDcgRnJlZSI6ezkwMDpgZmFzYCw0MDA6YGZhcmB9LCJGb250IEF3ZXNvbWUgNyBQcm8iOns5MDA6YGZhc2AsNDAwOmBmYXJgLG5vcm1hbDpgZmFyYCwzMDA6YGZhbGAsMTAwOmBmYXRgfSwiRm9udCBBd2Vzb21lIDcgQnJhbmRzIjp7NDAwOmBmYWJgLG5vcm1hbDpgZmFiYH0sIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOns5MDA6YGZhZGAsNDAwOmBmYWRyYCxub3JtYWw6YGZhZHJgLDMwMDpgZmFkbGAsMTAwOmBmYWR0YH0sIkZvbnQgQXdlc29tZSA3IFNoYXJwIjp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLG5vcm1hbDpgZmFzcmAsMzAwOmBmYXNsYCwxMDA6YGZhc3RgfSwiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI6ezkwMDpgZmFzZHNgLDQwMDpgZmFzZHJgLG5vcm1hbDpgZmFzZHJgLDMwMDpgZmFzZGxgLDEwMDpgZmFzZHRgfSwiRm9udCBBd2Vzb21lIDcgSmVsbHkiOns0MDA6YGZhanJgLG5vcm1hbDpgZmFqcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsIjp7NDAwOmBmYWpmcmAsbm9ybWFsOmBmYWpmcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8iOns0MDA6YGZhamRyYCxub3JtYWw6YGZhamRyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIiOns0MDA6YGZhc2xyYCxub3JtYWw6YGZhc2xyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MiOns0MDA6YGZhc2xwcmAsbm9ybWFsOmBmYXNscHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBEdW8iOns0MDA6YGZhc2xkcmAsbm9ybWFsOmBmYXNsZHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyBEdW8iOns0MDA6YGZhc2xwZHJgLG5vcm1hbDpgZmFzbHBkcmB9LCJGb250IEF3ZXNvbWUgNyBQaXhlbCI6ezQwMDpgZmFwcmAsbm9ybWFsOmBmYXByYH0sIkZvbnQgQXdlc29tZSA3IE1vc2FpYyI6ezkwMDpgZmFtc2Asbm9ybWFsOmBmYW1zYH0sIkZvbnQgQXdlc29tZSA3IFZlbGx1bSI6ezkwMDpgZmF2c2Asbm9ybWFsOmBmYXZzYH0sIkZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQiOnszMDA6YGZhdGxgLG5vcm1hbDpgZmF0bGB9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2ciOns5MDA6YGZhbnNgLG5vcm1hbDpgZmFuc2B9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjp7OTAwOmBmYW5kc2Asbm9ybWFsOmBmYW5kc2B9LCJGb250IEF3ZXNvbWUgNyBFdGNoIjp7OTAwOmBmYWVzYCxub3JtYWw6YGZhZXNgfSwiRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUiOnsxMDA6YGZhZ3RgLG5vcm1hbDpgZmFndGB9LCJGb250IEF3ZXNvbWUgNyBDaGlzZWwiOns0MDA6YGZhY3JgLG5vcm1hbDpgZmFjcmB9LCJGb250IEF3ZXNvbWUgNyBXaGl0ZWJvYXJkIjp7NjAwOmBmYXdzYmAsbm9ybWFsOmBmYXdzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5Ijp7NjAwOmBmYXVzYmAsbm9ybWFsOmBmYXVzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byI6ezYwMDpgZmF1ZHNiYCxub3JtYWw6YGZhdWRzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOns2MDA6YGZhdWZzYmAsbm9ybWFsOmBmYXVmc2JgfX0scmY9bmV3IE1hcChbW2BjbGFzc2ljYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYCxgcmVndWxhcmAsYGxpZ2h0YCxgdGhpbmAsYGJyYW5kc2BdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZHVvdG9uZWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWRgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc3NgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwLWR1b3RvbmVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzZHNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYGNoaXNlbGAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWNyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BldGNoYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhZXNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZ3JhcGhpdGVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFndGAsZGVmYXVsdFN0eWxlSWQ6YHRoaW5gLHN0eWxlSWRzOltgdGhpbmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjEwMH1dLFtgamVsbHlgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFqcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgamVsbHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamRyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BqZWxseS1maWxsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamZyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2Btb3NhaWNgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFtc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2dgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFuc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2ctZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhbmRzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHBpeGVsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhcHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWJgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzbHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xkcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgc2xhYi1wcmVzc2Ase2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXNscHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItcHJlc3MtZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xwZHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHRodW1icHJpbnRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF0bGAsZGVmYXVsdFN0eWxlSWQ6YGxpZ2h0YCxzdHlsZUlkczpbYGxpZ2h0YF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6MzAwfV0sW2B1dGlsaXR5YCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdXNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHV0aWxpdHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdWRzYmAsZGVmYXVsdFN0eWxlSWQ6YHNlbWlib2xkYCxzdHlsZUlkczpbYHNlbWlib2xkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NjAwfV0sW2B1dGlsaXR5LWZpbGxgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF1ZnNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHZlbGx1bWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXZzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHdoaXRlYm9hcmRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF3c2JgLGRlZmF1bHRTdHlsZUlkOmBzZW1pYm9sZGAsc3R5bGVJZHM6W2BzZW1pYm9sZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjYwMH1dXSksYWY9e2NoaXNlbDp7cmVndWxhcjpgZmFjcmB9LGNsYXNzaWM6e2JyYW5kczpgZmFiYCxsaWdodDpgZmFsYCxyZWd1bGFyOmBmYXJgLHNvbGlkOmBmYXNgLHRoaW46YGZhdGB9LGR1b3RvbmU6e2xpZ2h0OmBmYWRsYCxyZWd1bGFyOmBmYWRyYCxzb2xpZDpgZmFkYCx0aGluOmBmYWR0YH0sZXRjaDp7c29saWQ6YGZhZXNgfSxncmFwaGl0ZTp7dGhpbjpgZmFndGB9LGplbGx5OntyZWd1bGFyOmBmYWpyYH0sImplbGx5LWR1byI6e3JlZ3VsYXI6YGZhamRyYH0sImplbGx5LWZpbGwiOntyZWd1bGFyOmBmYWpmcmB9LG1vc2FpYzp7c29saWQ6YGZhbXNgfSxub3Rkb2c6e3NvbGlkOmBmYW5zYH0sIm5vdGRvZy1kdW8iOntzb2xpZDpgZmFuZHNgfSxwaXhlbDp7cmVndWxhcjpgZmFwcmB9LHNoYXJwOntsaWdodDpgZmFzbGAscmVndWxhcjpgZmFzcmAsc29saWQ6YGZhc3NgLHRoaW46YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6e2xpZ2h0OmBmYXNkbGAscmVndWxhcjpgZmFzZHJgLHNvbGlkOmBmYXNkc2AsdGhpbjpgZmFzZHRgfSxzbGFiOntyZWd1bGFyOmBmYXNscmB9LCJzbGFiLWR1byI6e3JlZ3VsYXI6YGZhc2xkcmB9LCJzbGFiLXByZXNzIjp7cmVndWxhcjpgZmFzbHByYH0sInNsYWItcHJlc3MtZHVvIjp7cmVndWxhcjpgZmFzbHBkcmB9LHRodW1icHJpbnQ6e2xpZ2h0OmBmYXRsYH0sdXRpbGl0eTp7c2VtaWJvbGQ6YGZhdXNiYH0sInV0aWxpdHktZHVvIjp7c2VtaWJvbGQ6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOntzZW1pYm9sZDpgZmF1ZnNiYH0sdmVsbHVtOntzb2xpZDpgZmF2c2B9LHdoaXRlYm9hcmQ6e3NlbWlib2xkOmBmYXdzYmB9fSxvZj1bYGZha2AsYGZhLWtpdGAsYGZha2RgLGBmYS1raXQtZHVvdG9uZWBdLHNmPXtraXQ6e2Zhazpga2l0YCwiZmEta2l0Ijpga2l0YH0sImtpdC1kdW90b25lIjp7ZmFrZDpga2l0LWR1b3RvbmVgLCJmYS1raXQtZHVvdG9uZSI6YGtpdC1kdW90b25lYH19LGNmPVtga2l0YF07RyhHKHt9LGBraXRgLGBLaXRgKSxga2l0LWR1b3RvbmVgLGBLaXQgRHVvdG9uZWApO3ZhciBsZj17a2l0OnsiZmEta2l0IjpgZmFrYH0sImtpdC1kdW90b25lIjp7ImZhLWtpdC1kdW90b25lIjpgZmFrZGB9fSx1Zj17IkZvbnQgQXdlc29tZSBLaXQiOns0MDA6YGZha2Asbm9ybWFsOmBmYWtgfSwiRm9udCBBd2Vzb21lIEtpdCBEdW90b25lIjp7NDAwOmBmYWtkYCxub3JtYWw6YGZha2RgfX0sZGY9e2tpdDp7ZmFrOmBmYS1raXRgfSwia2l0LWR1b3RvbmUiOntmYWtkOmBmYS1raXQtZHVvdG9uZWB9fSxmZj17a2l0OntraXQ6YGZha2B9LCJraXQtZHVvdG9uZSI6eyJraXQtZHVvdG9uZSI6YGZha2RgfX0scGYsbWY9e0dST1VQOmBkdW90b25lLWdyb3VwYCxTV0FQX09QQUNJVFk6YHN3YXAtb3BhY2l0eWAsUFJJTUFSWTpgcHJpbWFyeWAsU0VDT05EQVJZOmBzZWNvbmRhcnlgfSxoZj1bYGZhLWNsYXNzaWNgLGBmYS1kdW90b25lYCxgZmEtc2hhcnBgLGBmYS1zaGFycC1kdW90b25lYCxgZmEtdGh1bWJwcmludGAsYGZhLXdoaXRlYm9hcmRgLGBmYS1ub3Rkb2dgLGBmYS1ub3Rkb2ctZHVvYCxgZmEtY2hpc2VsYCxgZmEtZXRjaGAsYGZhLWdyYXBoaXRlYCxgZmEtamVsbHlgLGBmYS1qZWxseS1maWxsYCxgZmEtamVsbHktZHVvYCxgZmEtc2xhYmAsYGZhLXNsYWItcHJlc3NgLGBmYS1zbGFiLXByZXNzLWR1b2AsYGZhLXNsYWItZHVvYCxgZmEtbW9zYWljYCxgZmEtcGl4ZWxgLGBmYS12ZWxsdW1gLGBmYS11dGlsaXR5YCxgZmEtdXRpbGl0eS1kdW9gLGBmYS11dGlsaXR5LWZpbGxgXTtwZj17fSxHKEcoRyhHKEcoRyhHKEcoRyhHKHBmLGBjbGFzc2ljYCxgQ2xhc3NpY2ApLGBkdW90b25lYCxgRHVvdG9uZWApLGBzaGFycGAsYFNoYXJwYCksYHNoYXJwLWR1b3RvbmVgLGBTaGFycCBEdW90b25lYCksYGNoaXNlbGAsYENoaXNlbGApLGBldGNoYCxgRXRjaGApLGBncmFwaGl0ZWAsYEdyYXBoaXRlYCksYGplbGx5YCxgSmVsbHlgKSxgamVsbHktZHVvYCxgSmVsbHkgRHVvYCksYGplbGx5LWZpbGxgLGBKZWxseSBGaWxsYCksRyhHKEcoRyhHKEcoRyhHKEcoRyhwZixgbW9zYWljYCxgTW9zYWljYCksYG5vdGRvZ2AsYE5vdGRvZ2ApLGBub3Rkb2ctZHVvYCxgTm90ZG9nIER1b2ApLGBwaXhlbGAsYFBpeGVsYCksYHNsYWJgLGBTbGFiYCksYHNsYWItZHVvYCxgU2xhYiBEdW9gKSxgc2xhYi1wcmVzc2AsYFNsYWIgUHJlc3NgKSxgc2xhYi1wcmVzcy1kdW9gLGBTbGFiIFByZXNzIER1b2ApLGB0aHVtYnByaW50YCxgVGh1bWJwcmludGApLGB1dGlsaXR5YCxgVXRpbGl0eWApLEcoRyhHKEcocGYsYHV0aWxpdHktZHVvYCxgVXRpbGl0eSBEdW9gKSxgdXRpbGl0eS1maWxsYCxgVXRpbGl0eSBGaWxsYCksYHZlbGx1bWAsYFZlbGx1bWApLGB3aGl0ZWJvYXJkYCxgV2hpdGVib2FyZGApLEcoRyh7fSxga2l0YCxgS2l0YCksYGtpdC1kdW90b25lYCxgS2l0IER1b3RvbmVgKTt2YXIgZ2Y9e2NsYXNzaWM6eyJmYS1icmFuZHMiOmBmYWJgLCJmYS1kdW90b25lIjpgZmFkYCwiZmEtbGlnaHQiOmBmYWxgLCJmYS1yZWd1bGFyIjpgZmFyYCwiZmEtc29saWQiOmBmYXNgLCJmYS10aGluIjpgZmF0YH0sZHVvdG9uZTp7ImZhLXJlZ3VsYXIiOmBmYWRyYCwiZmEtbGlnaHQiOmBmYWRsYCwiZmEtdGhpbiI6YGZhZHRgfSxzaGFycDp7ImZhLXNvbGlkIjpgZmFzc2AsImZhLXJlZ3VsYXIiOmBmYXNyYCwiZmEtbGlnaHQiOmBmYXNsYCwiZmEtdGhpbiI6YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6eyJmYS1zb2xpZCI6YGZhc2RzYCwiZmEtcmVndWxhciI6YGZhc2RyYCwiZmEtbGlnaHQiOmBmYXNkbGAsImZhLXRoaW4iOmBmYXNkdGB9LHNsYWI6eyJmYS1yZWd1bGFyIjpgZmFzbHJgfSwic2xhYi1wcmVzcyI6eyJmYS1yZWd1bGFyIjpgZmFzbHByYH0sInNsYWItZHVvIjp7ImZhLXJlZ3VsYXIiOmBmYXNsZHJgfSwic2xhYi1wcmVzcy1kdW8iOnsiZmEtcmVndWxhciI6YGZhc2xwZHJgfSxwaXhlbDp7ImZhLXJlZ3VsYXIiOmBmYXByYH0sbW9zYWljOnsiZmEtc29saWQiOmBmYW1zYH0sdmVsbHVtOnsiZmEtc29saWQiOmBmYXZzYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgZmF3c2JgfSx0aHVtYnByaW50OnsiZmEtbGlnaHQiOmBmYXRsYH0sbm90ZG9nOnsiZmEtc29saWQiOmBmYW5zYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBmYW5kc2B9LGV0Y2g6eyJmYS1zb2xpZCI6YGZhZXNgfSxncmFwaGl0ZTp7ImZhLXRoaW4iOmBmYWd0YH0samVsbHk6eyJmYS1yZWd1bGFyIjpgZmFqcmB9LCJqZWxseS1maWxsIjp7ImZhLXJlZ3VsYXIiOmBmYWpmcmB9LCJqZWxseS1kdW8iOnsiZmEtcmVndWxhciI6YGZhamRyYH0sY2hpc2VsOnsiZmEtcmVndWxhciI6YGZhY3JgfSx1dGlsaXR5OnsiZmEtc2VtaWJvbGQiOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOnsiZmEtc2VtaWJvbGQiOmBmYXVmc2JgfX0sX2Y9e2NsYXNzaWM6W2BmYXNgLGBmYXJgLGBmYWxgLGBmYXRgLGBmYWRgXSxkdW90b25lOltgZmFkcmAsYGZhZGxgLGBmYWR0YF0sc2hhcnA6W2BmYXNzYCxgZmFzcmAsYGZhc2xgLGBmYXN0YF0sInNoYXJwLWR1b3RvbmUiOltgZmFzZHNgLGBmYXNkcmAsYGZhc2RsYCxgZmFzZHRgXSxzbGFiOltgZmFzbHJgXSwic2xhYi1wcmVzcyI6W2BmYXNscHJgXSwic2xhYi1kdW8iOltgZmFzbGRyYF0sInNsYWItcHJlc3MtZHVvIjpbYGZhc2xwZHJgXSxwaXhlbDpbYGZhcHJgXSxtb3NhaWM6W2BmYW1zYF0sdmVsbHVtOltgZmF2c2BdLHdoaXRlYm9hcmQ6W2BmYXdzYmBdLHRodW1icHJpbnQ6W2BmYXRsYF0sbm90ZG9nOltgZmFuc2BdLCJub3Rkb2ctZHVvIjpbYGZhbmRzYF0sZXRjaDpbYGZhZXNgXSxncmFwaGl0ZTpbYGZhZ3RgXSxqZWxseTpbYGZhanJgXSwiamVsbHktZmlsbCI6W2BmYWpmcmBdLCJqZWxseS1kdW8iOltgZmFqZHJgXSxjaGlzZWw6W2BmYWNyYF0sdXRpbGl0eTpbYGZhdXNiYF0sInV0aWxpdHktZHVvIjpbYGZhdWRzYmBdLCJ1dGlsaXR5LWZpbGwiOltgZmF1ZnNiYF19LHZmPXtjbGFzc2ljOntmYWI6YGZhLWJyYW5kc2AsZmFkOmBmYS1kdW90b25lYCxmYWw6YGZhLWxpZ2h0YCxmYXI6YGZhLXJlZ3VsYXJgLGZhczpgZmEtc29saWRgLGZhdDpgZmEtdGhpbmB9LGR1b3RvbmU6e2ZhZHI6YGZhLXJlZ3VsYXJgLGZhZGw6YGZhLWxpZ2h0YCxmYWR0OmBmYS10aGluYH0sc2hhcnA6e2Zhc3M6YGZhLXNvbGlkYCxmYXNyOmBmYS1yZWd1bGFyYCxmYXNsOmBmYS1saWdodGAsZmFzdDpgZmEtdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmFzZHM6YGZhLXNvbGlkYCxmYXNkcjpgZmEtcmVndWxhcmAsZmFzZGw6YGZhLWxpZ2h0YCxmYXNkdDpgZmEtdGhpbmB9LHNsYWI6e2Zhc2xyOmBmYS1yZWd1bGFyYH0sInNsYWItcHJlc3MiOntmYXNscHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1kdW8iOntmYXNsZHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1wcmVzcy1kdW8iOntmYXNscGRyOmBmYS1yZWd1bGFyYH0scGl4ZWw6e2ZhcHI6YGZhLXJlZ3VsYXJgfSxtb3NhaWM6e2ZhbXM6YGZhLXNvbGlkYH0sdmVsbHVtOntmYXZzOmBmYS1zb2xpZGB9LHdoaXRlYm9hcmQ6e2Zhd3NiOmBmYS1zZW1pYm9sZGB9LHRodW1icHJpbnQ6e2ZhdGw6YGZhLWxpZ2h0YH0sbm90ZG9nOntmYW5zOmBmYS1zb2xpZGB9LCJub3Rkb2ctZHVvIjp7ZmFuZHM6YGZhLXNvbGlkYH0sZXRjaDp7ZmFlczpgZmEtc29saWRgfSxncmFwaGl0ZTp7ZmFndDpgZmEtdGhpbmB9LGplbGx5OntmYWpyOmBmYS1yZWd1bGFyYH0sImplbGx5LWZpbGwiOntmYWpmcjpgZmEtcmVndWxhcmB9LCJqZWxseS1kdW8iOntmYWpkcjpgZmEtcmVndWxhcmB9LGNoaXNlbDp7ZmFjcjpgZmEtcmVndWxhcmB9LHV0aWxpdHk6e2ZhdXNiOmBmYS1zZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6e2ZhdWRzYjpgZmEtc2VtaWJvbGRgfSwidXRpbGl0eS1maWxsIjp7ZmF1ZnNiOmBmYS1zZW1pYm9sZGB9fSx5Zj1gZmEuZmFzLmZhci5mYWwuZmF0LmZhZC5mYWRyLmZhZGwuZmFkdC5mYWIuZmFzcy5mYXNyLmZhc2wuZmFzdC5mYXNkcy5mYXNkci5mYXNkbC5mYXNkdC5mYXNsci5mYXNscHIuZmFzbGRyLmZhc2xwZHIuZmFwci5mYW1zLmZhdnMuZmF3c2IuZmF0bC5mYW5zLmZhbmRzLmZhZXMuZmFndC5mYWpyLmZhamZyLmZhamRyLmZhY3IuZmF1c2IuZmF1ZHNiLmZhdWZzYmAuc3BsaXQoYC5gKS5jb25jYXQoaGYsW2BmYS1zb2xpZGAsYGZhLXJlZ3VsYXJgLGBmYS1saWdodGAsYGZhLXRoaW5gLGBmYS1kdW90b25lYCxgZmEtYnJhbmRzYCxgZmEtc2VtaWJvbGRgXSksYmY9W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gLGBkdW90b25lYCxgYnJhbmRzYCxgc2VtaWJvbGRgXSx4Zj1bMSwyLDMsNCw1LDYsNyw4LDksMTBdLFNmPXhmLmNvbmNhdChbMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdKSxDZj1bXS5jb25jYXQoSXUoT2JqZWN0LmtleXMoX2YpKSxiZixbYGF3YCxgZndgLGBwdWxsLWxlZnRgLGBwdWxsLXJpZ2h0YF0sW2AyeHNgLGB4c2AsYHNtYCxgbGdgLGB4bGAsYDJ4bGAsYGJlYXRgLGBiZWF0LWZhZGVgLGBib3JkZXJgLGBib3VuY2VgLGBidXp6YCxgY2FudmFzLXNxdWFyZWAsYGNhbnZhcy1yb29teWAsYGZhZGVgLGBmbGlwLTM2MGAsYGZsaXAtYm90aGAsYGZsaXAtaG9yaXpvbnRhbGAsYGZsaXAtdmVydGljYWxgLGBmbGlwYCxgZmxvYXRgLGBpbnZlcnNlYCxgamVsbG9gLGBsYXllcnNgLGBsYXllcnMtYm90dG9tLWxlZnRgLGBsYXllcnMtYm90dG9tLXJpZ2h0YCxgbGF5ZXJzLWNvdW50ZXJgLGBsYXllcnMtdGV4dGAsYGxheWVycy10b3AtbGVmdGAsYGxheWVycy10b3AtcmlnaHRgLGBsaWAsYHB1bGwtZW5kYCxgcHVsbC1zdGFydGAsYHB1bHNlYCxgcm90YXRlLTE4MGAsYHJvdGF0ZS0yNzBgLGByb3RhdGUtOTBgLGByb3RhdGUtYnlgLGBzaGFrZWAsYHNwaW4tcHVsc2VgLGBzcGluLXJldmVyc2VgLGBzcGluYCxgc3Bpbi1zbmFwYCxgc3Bpbi1zbmFwLTRgLGBzcGluLXNuYXAtOGAsYHN0YWNrLTF4YCxgc3RhY2stMnhgLGBzdGFja2AsYHN3aW5nYCxgdWxgLGB3YWdgLGB3aWR0aC1hdXRvYCxgd2lkdGgtZml4ZWRgLG1mLkdST1VQLG1mLlNXQVBfT1BBQ0lUWSxtZi5QUklNQVJZLG1mLlNFQ09OREFSWV0seGYubWFwKGZ1bmN0aW9uKGUpe3JldHVybmAke2V9eGB9KSxTZi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYHctJHtlfWB9KSksd2Y9eyJGb250IEF3ZXNvbWUgNSBGcmVlIjp7OTAwOmBmYXNgLDQwMDpgZmFyYH0sIkZvbnQgQXdlc29tZSA1IFBybyI6ezkwMDpgZmFzYCw0MDA6YGZhcmAsbm9ybWFsOmBmYXJgLDMwMDpgZmFsYH0sIkZvbnQgQXdlc29tZSA1IEJyYW5kcyI6ezQwMDpgZmFiYCxub3JtYWw6YGZhYmB9LCJGb250IEF3ZXNvbWUgNSBEdW90b25lIjp7OTAwOmBmYWRgfX0sVGY9YF9fX0ZPTlRfQVdFU09NRV9fX2AsRWY9MTYsRGY9YGZhYCxPZj1gc3ZnLWlubGluZS0tZmFgLGtmPWBkYXRhLWZhLWkyc3ZnYCxBZj1gZGF0YS1mYS1wc2V1ZG8tZWxlbWVudGAsamY9YGRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZ2AsTWY9YGRhdGEtcHJlZml4YCxOZj1gZGF0YS1pY29uYCxQZj1gZm9udGF3ZXNvbWUtaTJzdmdgLEZmPWBhc3luY2AsSWY9W2BIVE1MYCxgSEVBRGAsYFNUWUxFYCxgU0NSSVBUYF0sTGY9W2A6OmJlZm9yZWAsYDo6YWZ0ZXJgLGA6YmVmb3JlYCxgOmFmdGVyYF0sUmY9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuITB9Y2F0Y2h7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIHpmKGUpe3JldHVybiBuZXcgUHJveHkoZSx7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQgaW4gZT9lW3RdOmVbb2RdfX0pfXZhciBCZj1LKHt9LHJkKTtCZltvZF09SyhLKEsoSyh7fSx7ImZhLWR1b3RvbmUiOmBkdW90b25lYH0pLHJkW29kXSksc2Yua2l0KSxzZltga2l0LWR1b3RvbmVgXSk7dmFyIFZmPXpmKEJmKSxIZj1LKHt9LGFmKTtIZltvZF09SyhLKEsoSyh7fSx7ZHVvdG9uZTpgZmFkYH0pLEhmW29kXSksZmYua2l0KSxmZltga2l0LWR1b3RvbmVgXSk7dmFyIFVmPXpmKEhmKSxXZj1LKHt9LHZmKTtXZltvZF09SyhLKHt9LFdmW29kXSksZGYua2l0KTt2YXIgR2Y9emYoV2YpLEtmPUsoe30sZ2YpO0tmW29kXT1LKEsoe30sS2Zbb2RdKSxsZi5raXQpLHpmKEtmKTt2YXIgcWY9dGQsSmY9YGZhLWxheWVycy10ZXh0YCxZZj1uZDt6ZihLKHt9LHRmKSk7dmFyIFhmPVtgY2xhc3NgLGBkYXRhLXByZWZpeGAsYGRhdGEtaWNvbmAsYGRhdGEtZmEtdHJhbnNmb3JtYCxgZGF0YS1mYS1tYXNrYF0sWmY9aWQsUWY9W10uY29uY2F0KEl1KGNmKSxJdShDZikpLCRmPUp1LkZvbnRBd2Vzb21lQ29uZmlnfHx7fTtmdW5jdGlvbiBlcChlKXt2YXIgdD1ZdS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbYCtlK2BdYCk7aWYodClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24gdHAoZSl7cmV0dXJuIGU9PT1gYD8hMDplPT09YGZhbHNlYD8hMTplPT09YHRydWVgfHxlfVl1JiZ0eXBlb2YgWXUucXVlcnlTZWxlY3Rvcj09YGZ1bmN0aW9uYCYmW1tgZGF0YS1mYW1pbHktcHJlZml4YCxgZmFtaWx5UHJlZml4YF0sW2BkYXRhLWNzcy1wcmVmaXhgLGBjc3NQcmVmaXhgXSxbYGRhdGEtZmFtaWx5LWRlZmF1bHRgLGBmYW1pbHlEZWZhdWx0YF0sW2BkYXRhLXN0eWxlLWRlZmF1bHRgLGBzdHlsZURlZmF1bHRgXSxbYGRhdGEtcmVwbGFjZW1lbnQtY2xhc3NgLGByZXBsYWNlbWVudENsYXNzYF0sW2BkYXRhLWF1dG8tcmVwbGFjZS1zdmdgLGBhdXRvUmVwbGFjZVN2Z2BdLFtgZGF0YS1hdXRvLWFkZC1jc3NgLGBhdXRvQWRkQ3NzYF0sW2BkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHNgLGBzZWFyY2hQc2V1ZG9FbGVtZW50c2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLXdhcm5pbmdzYCxgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5nc2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLWZ1bGwtc2NhbmAsYHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW5gXSxbYGRhdGEtb2JzZXJ2ZS1tdXRhdGlvbnNgLGBvYnNlcnZlTXV0YXRpb25zYF0sW2BkYXRhLW11dGF0ZS1hcHByb2FjaGAsYG11dGF0ZUFwcHJvYWNoYF0sW2BkYXRhLWtlZXAtb3JpZ2luYWwtc291cmNlYCxga2VlcE9yaWdpbmFsU291cmNlYF0sW2BkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2VgLGBtZWFzdXJlUGVyZm9ybWFuY2VgXSxbYGRhdGEtc2hvdy1taXNzaW5nLWljb25zYCxgc2hvd01pc3NpbmdJY29uc2BdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUZ1KGUsMiksbj10WzBdLHI9dFsxXSxpPXRwKGVwKG4pKTtpIT1udWxsJiYoJGZbcl09aSl9KTt2YXIgbnA9e3N0eWxlRGVmYXVsdDpgc29saWRgLGZhbWlseURlZmF1bHQ6b2QsY3NzUHJlZml4OkRmLHJlcGxhY2VtZW50Q2xhc3M6T2YsYXV0b1JlcGxhY2VTdmc6ITAsYXV0b0FkZENzczohMCxzZWFyY2hQc2V1ZG9FbGVtZW50czohMSxzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzOiEwLHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW46ITEsb2JzZXJ2ZU11dGF0aW9uczohMCxtdXRhdGVBcHByb2FjaDpgYXN5bmNgLGtlZXBPcmlnaW5hbFNvdXJjZTohMCxtZWFzdXJlUGVyZm9ybWFuY2U6ITEsc2hvd01pc3NpbmdJY29uczohMH07JGYuZmFtaWx5UHJlZml4JiYoJGYuY3NzUHJlZml4PSRmLmZhbWlseVByZWZpeCk7dmFyIHJwPUsoSyh7fSxucCksJGYpO3JwLmF1dG9SZXBsYWNlU3ZnfHwocnAub2JzZXJ2ZU11dGF0aW9ucz0hMSk7dmFyIHE9e307T2JqZWN0LmtleXMobnApLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHEsZSx7ZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24odCl7cnBbZV09dCxpcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHEpfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBycFtlXX19KX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJmYW1pbHlQcmVmaXgiLHtlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihlKXtycC5jc3NQcmVmaXg9ZSxpcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHEpfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBycC5jc3NQcmVmaXh9fSksSnUuRm9udEF3ZXNvbWVDb25maWc9cTt2YXIgaXA9W107ZnVuY3Rpb24gYXAoZSl7cmV0dXJuIGlwLnB1c2goZSksZnVuY3Rpb24oKXtpcC5zcGxpY2UoaXAuaW5kZXhPZihlKSwxKX19dmFyIG9wPUVmLHNwPXtzaXplOjE2LHg6MCx5OjAscm90YXRlOjAsZmxpcFg6ITEsZmxpcFk6ITF9O2Z1bmN0aW9uIGNwKGUpe2lmKCEoIWV8fCFRdSkpe3ZhciB0PVl1LmNyZWF0ZUVsZW1lbnQoYHN0eWxlYCk7dC5zZXRBdHRyaWJ1dGUoYHR5cGVgLGB0ZXh0L2Nzc2ApLHQuaW5uZXJIVE1MPWU7Zm9yKHZhciBuPVl1LmhlYWQuY2hpbGROb2RlcyxyPW51bGwsaT1uLmxlbmd0aC0xO2k+LTE7aS0tKXt2YXIgYT1uW2ldLG89KGEudGFnTmFtZXx8YGApLnRvVXBwZXJDYXNlKCk7W2BTVFlMRWAsYExJTktgXS5pbmRleE9mKG8pPi0xJiYocj1hKX1yZXR1cm4gWXUuaGVhZC5pbnNlcnRCZWZvcmUodCxyKSxlfX12YXIgbHA9YDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYDtmdW5jdGlvbiB1cCgpe2Zvcih2YXIgZT0xMix0PWBgO2UtLT4wOyl0Kz1scFtNYXRoLnJhbmRvbSgpKjYyfDBdO3JldHVybiB0fWZ1bmN0aW9uIGRwKGUpe2Zvcih2YXIgdD1bXSxuPShlfHxbXSkubGVuZ3RoPj4+MDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBmcChlKXtyZXR1cm4gZS5jbGFzc0xpc3Q/ZHAoZS5jbGFzc0xpc3QpOihlLmdldEF0dHJpYnV0ZShgY2xhc3NgKXx8YGApLnNwbGl0KGAgYCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9ZnVuY3Rpb24gcHAoZSl7cmV0dXJuYCR7ZX1gLnJlcGxhY2UoLyYvZyxgJmFtcDtgKS5yZXBsYWNlKC8iL2csYCZxdW90O2ApLnJlcGxhY2UoLycvZyxgJiMzOTtgKS5yZXBsYWNlKC88L2csYCZsdDtgKS5yZXBsYWNlKC8+L2csYCZndDtgKX1mdW5jdGlvbiBtcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259PSIke3BwKGVbbl0pfSIgYH0sYGApLnRyaW0oKX1mdW5jdGlvbiBocChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259OiAke2Vbbl0udHJpbSgpfTtgfSxgYCl9ZnVuY3Rpb24gZ3AoZSl7cmV0dXJuIGUuc2l6ZSE9PXNwLnNpemV8fGUueCE9PXNwLnh8fGUueSE9PXNwLnl8fGUucm90YXRlIT09c3Aucm90YXRlfHxlLmZsaXBYfHxlLmZsaXBZfWZ1bmN0aW9uIF9wKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS5jb250YWluZXJXaWR0aCxyPWUuaWNvbldpZHRoO3JldHVybntvdXRlcjp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtuLzJ9IDI1NilgfSxpbm5lcjp7dHJhbnNmb3JtOmAke2B0cmFuc2xhdGUoJHt0LngqMzJ9LCAke3QueSozMn0pIGB9ICR7YHNjYWxlKCR7dC5zaXplLzE2Kih0LmZsaXBYPy0xOjEpfSwgJHt0LnNpemUvMTYqKHQuZmxpcFk/LTE6MSl9KSBgfSAke2Byb3RhdGUoJHt0LnJvdGF0ZX0gMCAwKWB9YH0scGF0aDp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtyLzIqLTF9IC0yNTYpYH19fWZ1bmN0aW9uIHZwKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS53aWR0aCxyPW49PT12b2lkIDA/RWY6bixpPWUuaGVpZ2h0LGE9aT09PXZvaWQgMD9FZjppLG89ZS5zdGFydENlbnRlcmVkLHM9byE9PXZvaWQgMCYmbyxjPWBgO3JldHVybiBjKz1zJiYkdT9gdHJhbnNsYXRlKCR7dC54L29wLXIvMn1lbSwgJHt0Lnkvb3AtYS8yfWVtKSBgOnM/YHRyYW5zbGF0ZShjYWxjKC01MCUgKyAke3QueC9vcH1lbSksIGNhbGMoLTUwJSArICR7dC55L29wfWVtKSkgYDpgdHJhbnNsYXRlKCR7dC54L29wfWVtLCAke3QueS9vcH1lbSkgYCxjKz1gc2NhbGUoJHt0LnNpemUvb3AqKHQuZmxpcFg/LTE6MSl9LCAke3Quc2l6ZS9vcCoodC5mbGlwWT8tMToxKX0pIGAsYys9YHJvdGF0ZSgke3Qucm90YXRlfWRlZykgYCxjfXZhciB5cD1gOnJvb3QsIDpob3N0IHsKICAtLWZhLWZvbnQtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEZyZWUnOwogIC0tZmEtZm9udC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBGcmVlJzsKICAtLWZhLWZvbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LWR1b3RvbmU6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtZHVvdG9uZS10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBCcmFuZHMnOwogIC0tZmEtZm9udC1zaGFycC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAnOwogIC0tZmEtZm9udC1zaGFycC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJzsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zbGFiLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWInOwogIC0tZmEtZm9udC1zbGFiLXByZXNzLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MnOwogIC0tZmEtZm9udC1zbGFiLWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTbGFiIER1byc7CiAgLS1mYS1mb250LXNsYWItcHJlc3MtZHVvLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MgRHVvJzsKICAtLWZhLWZvbnQtcGl4ZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgUGl4ZWwnOwogIC0tZmEtZm9udC1tb3NhaWMtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE1vc2FpYyc7CiAgLS1mYS1mb250LXZlbGx1bS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVmVsbHVtJzsKICAtLWZhLWZvbnQtd2hpdGVib2FyZC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgV2hpdGVib2FyZCc7CiAgLS1mYS1mb250LXRodW1icHJpbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQnOwogIC0tZmEtZm9udC1ub3Rkb2ctc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyc7CiAgLS1mYS1mb250LW5vdGRvZy1kdW8tc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyBEdW8nOwogIC0tZmEtZm9udC1ldGNoLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBFdGNoJzsKICAtLWZhLWZvbnQtZ3JhcGhpdGUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUnOwogIC0tZmEtZm9udC1qZWxseS1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSc7CiAgLS1mYS1mb250LWplbGx5LWZpbGwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgSmVsbHkgRmlsbCc7CiAgLS1mYS1mb250LWplbGx5LWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8nOwogIC0tZmEtZm9udC1jaGlzZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgQ2hpc2VsJzsKICAtLWZhLWZvbnQtdXRpbGl0eS1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSc7CiAgLS1mYS1mb250LXV0aWxpdHktZHVvLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byc7CiAgLS1mYS1mb250LXV0aWxpdHktZmlsbC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBGaWxsJzsKfQoKLnN2Zy1pbmxpbmUtLWZhIHsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBkaXNwbGF5OiB2YXIoLS1mYS1kaXNwbGF5LCBpbmxpbmUtYmxvY2spOwogIGhlaWdodDogMWVtOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgsIDEuMjVlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4cyB7CiAgdmVydGljYWwtYWxpZ246IDAuMWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14cyB7CiAgdmVydGljYWwtYWxpZ246IDBlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtc20gewogIHZlcnRpY2FsLWFsaWduOiAtMC4wNzE0Mjg1NzE0ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMmVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjMxMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1sZWZ0LAouc3ZnLWlubGluZS0tZmEgLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXB1bGwtcmlnaHQsCi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxpIHsKICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIGluc2V0LWJsb2NrLXN0YXJ0OiAwLjI1ZW07IC8qIHN5bmNpbmcgdmVydGljYWwgYWxpZ25tZW50IHdpdGggV2ViIEZvbnQgcmVuZGVyaW5nICovCn0KCi5mYS1sYXllcnMtY291bnRlciwgLmZhLWxheWVycy10ZXh0IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZhLWxheWVycyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMWVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCwgMS4yNWVtKTsKfQouZmEtbGF5ZXJzIC5zdmctaW5saW5lLS1mYSB7CiAgaW5zZXQ6IDA7CiAgbWFyZ2luOiBhdXRvOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLXRleHQgewogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLWNvdW50ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhLWNvdW50ZXItYmFja2dyb3VuZC1jb2xvciwgI2ZmMjUzYSk7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZmEtY291bnRlci1ib3JkZXItcmFkaXVzLCAxZW0pOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS1mYS1jb3VudGVyLWxpbmUtaGVpZ2h0LCAxKTsKICBtYXgtd2lkdGg6IHZhcigtLWZhLWNvdW50ZXItbWF4LXdpZHRoLCA1ZW0pOwogIG1pbi13aWR0aDogdmFyKC0tZmEtY291bnRlci1taW4td2lkdGgsIDEuNWVtKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IHZhcigtLWZhLWNvdW50ZXItcGFkZGluZywgMC4yNWVtIDAuNWVtKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWNvdW50ZXItc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLXJpZ2h0IHsKICBib3R0b206IHZhcigtLWZhLWJvdHRvbSwgMCk7CiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLWxlZnQgewogIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDsKfQoKLmZhLWxheWVycy10b3AtcmlnaHQgewogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtbGF5ZXJzLXNjYWxlLCAwLjI1KSk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0Owp9CgouZmEtbGF5ZXJzLXRvcC1sZWZ0IHsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLmZhLTF4IHsKICBmb250LXNpemU6IDFlbTsKfQoKLmZhLTJ4IHsKICBmb250LXNpemU6IDJlbTsKfQoKLmZhLTN4IHsKICBmb250LXNpemU6IDNlbTsKfQoKLmZhLTR4IHsKICBmb250LXNpemU6IDRlbTsKfQoKLmZhLTV4IHsKICBmb250LXNpemU6IDVlbTsKfQoKLmZhLTZ4IHsKICBmb250LXNpemU6IDZlbTsKfQoKLmZhLTd4IHsKICBmb250LXNpemU6IDdlbTsKfQoKLmZhLTh4IHsKICBmb250LXNpemU6IDhlbTsKfQoKLmZhLTl4IHsKICBmb250LXNpemU6IDllbTsKfQoKLmZhLTEweCB7CiAgZm9udC1zaXplOiAxMGVtOwp9CgouZmEtMnhzIHsKICBmb250LXNpemU6IGNhbGMoMTAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteHMgewogIGZvbnQtc2l6ZTogY2FsYygxMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS1zbSB7CiAgZm9udC1zaXplOiBjYWxjKDE0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDE0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDE0IC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLWxnIHsKICBmb250LXNpemU6IGNhbGMoMjAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMjBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAyMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMjAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteGwgewogIGZvbnQtc2l6ZTogY2FsYygyNCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyNHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDI0ICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAyNCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS0yeGwgewogIGZvbnQtc2l6ZTogY2FsYygzMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAzMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDMyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAzMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS13aWR0aC1hdXRvIHsKICAtLWZhLXdpZHRoOiBhdXRvOwp9CgouZmEtZncsCi5mYS13aWR0aC1maXhlZCB7CiAgLS1mYS13aWR0aDogMS4yNWVtOwp9CgouZmEtY2FudmFzLXNxdWFyZSB7CiAgcGFkZGluZy1ibG9jazogMC4xMjVlbTsKICBtYXJnaW4tYmxvY2stZW5kOiAtMC4xMjVlbTsKfQoKLmZhLWNhbnZhcy1yb29teSB7CiAgcGFkZGluZy1ibG9jazogMC4yNWVtOwogIHBhZGRpbmctaW5saW5lOiAwLjEyNWVtOwogIG1hcmdpbi1ibG9jay1lbmQ6IC0wLjI1ZW07CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi5mYS11bCB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLWxpLW1hcmdpbiwgMi41ZW0pOwogIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0Owp9CgovKiBIZWFkcyBVcDogQm9yZGVyZWQgSWNvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUhCiAgLSBUaGlzIGZlYXR1cmUgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgRm9udCBBd2Vzb21lICh2OCkhCiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguCiovCi8qIE5vdGVzOgoqIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSkKKiAtLUB7di4kY3NzLXByZWZpeH0tYm9yZGVyLXBhZGRpbmcgPQogICoqIDMvMTYgZm9yIHZlcnRpY2FsIHBhZGRpbmcgKHRvIGdpdmUgfjJweCBvZiB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFyb3VuZCBhbiBpY29uIGNvbnNpZGVyaW5nIGl0J3MgdmVydGljYWwgYWxpZ25tZW50KQogICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbikKKi8KLmZhLWJvcmRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWJvcmRlci1yYWRpdXMsIDAuMWVtKTsKICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpOwogIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7CiAgYm94LXNpemluZzogdmFyKC0tZmEtYm9yZGVyLWJveC1zaXppbmcsIGNvbnRlbnQtYm94KTsKICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4xODc1ZW0gMC4yNWVtKTsKfQoKLmZhLXB1bGwtbGVmdCwKLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1wdWxsLXJpZ2h0LAouZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1iZWF0IHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtYm91bmNlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC4yOCwgMC44NCwgMC40MiwgMSkpOwp9CgouZmEtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKfQoKLmZhLWJlYXQtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZsaXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxLjVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcC0zNjAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwLTM2MDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc2hha2UgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zaGFrZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuNzVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc3BpbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXJldmVyc2UgewogIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsKfQoKLmZhLXB1bHNlLAouZmEtc3Bpbi1wdWxzZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7Cn0KCi5mYS1zcGluLXNuYXAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zcGluLXNuYXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtNCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC00OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMi40cyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtOCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC04OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgNHMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpOwp9CgouZmEtYnV6eiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJ1eno7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjZzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgbGluZWFyKTsKfQoKLmZhLXdhZyB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXdhZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuOXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIGNlbnRlcjsKfQoKLmZhLWZsb2F0IHsKICBhbmltYXRpb24tbmFtZTogZmEtZmxvYXQ7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwp9CgouZmEtc3dpbmcgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zd2luZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDEuMnMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGNlbnRlcjsKfQoKLmZhLWplbGxvIHsKICBhbmltYXRpb24tbmFtZTogZmEtamVsbG87CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjlzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1vdXQpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogIC5mYS1iZWF0LAogIC5mYS1ib3VuY2UsCiAgLmZhLWZhZGUsCiAgLmZhLWJlYXQtZmFkZSwKICAuZmEtZmxpcCwKICAuZmEtZmxpcC0zNjAsCiAgLmZhLXB1bHNlLAogIC5mYS1zaGFrZSwKICAuZmEtc3BpbiwKICAuZmEtc3Bpbi1wdWxzZSwKICAuZmEtYnV6eiwKICAuZmEtZmxvYXQsCiAgLmZhLWplbGxvLAogIC5mYS1zcGluLXNuYXAsCiAgLmZhLXNwaW4tc25hcC00LAogIC5mYS1zcGluLXNuYXAtOCwKICAuZmEtc3dpbmcsCiAgLmZhLXdhZyB7CiAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9Cn0KQGtleWZyYW1lcyBmYS1iZWF0IHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA0NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjIgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjIyKSkpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA5MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1ib3VuY2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcpOwogIH0KICAxNCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteCwgMS4wNiksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjk0KSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtYW50aWNpcGF0aW9uLCAzcHgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45NCksIHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXksIDEuMTIpKSB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAwLjVlbSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLjY2LCAwLjY2LCAxKTsKICB9CiAgNTIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0tZmEtYm91bmNlLWhlaWdodCwgMC41ZW0pICogMS4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAxLCAwLjUpOwogIH0KICA3MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA2KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45MikpIHRyYW5zbGF0ZVkoMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC4zMywgMC42NiwgMSk7CiAgfQogIDg1JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgsIDEuMDQpIHRyYW5zbGF0ZVkoY2FsYygtMnB4ICogdmFyKC0tZmEtYm91bmNlLXJlYm91bmQsIDEpKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZhZGUgewogIDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgNDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWZhZGUtb3BhY2l0eSwgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7CiAgMCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgMjUlIHsKICAgIG9wYWNpdHk6IGNhbGModmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCkgKyAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7CiAgfQogIDQ1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjUpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICBvcGFjaXR5OiBjYWxjKHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpICsgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjI4KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbGlwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIDAuNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICA5MiUgewogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyZW0pIHNjYWxlKDEpIHJvdGF0ZTNkKHZhcigtLWZhLWZsaXAteCwgMCksIHZhcigtLWZhLWZsaXAteSwgMSksIHZhcigtLWZhLWZsaXAteiwgMCksIGNhbGModmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykgKiB2YXIoLS1mYS1mbGlwLW92ZXJzaG9vdCwgMS4wNCkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZsaXAtMzYwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDgwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIHZhcigtLWZhLWZsaXAtb3ZlcnNob290LCAxLjA0KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc2hha2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDIwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpIHRyYW5zbGF0ZVgoLTFweCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA3OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoLTNkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgOTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLXNwaW4tc25hcCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxNi42NyUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDI4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDMzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDYyJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDY2LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDc4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDgzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDk1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtNCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtOCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEyLjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAyMS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAzNCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAzNy41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ2LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgNTklIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNjIuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICA3MS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDg0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMTVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDg3LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDMxNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOTYuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYnV6eiB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjEsIDAsIDAuOSwgMSk7CiAgfQogIDUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC41ZGVnKTsKICB9CiAgMTAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC41ZGVnKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC4zZGVnKTsKICB9CiAgMjAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC4zZGVnKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjcpKSByb3RhdGUoMC4yZGVnKTsKICB9CiAgMzAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSAqIDAuNykpIHJvdGF0ZSgtMC4yZGVnKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjQpKSByb3RhdGUoMC4xZGVnKTsKICB9CiAgNDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS13YWcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIsIDAsIDAuNiwgMSk7CiAgfQogIDM2JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZShjYWxjKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpICogMC44NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGModmFyKC0tZmEtd2FnLWFuZ2xlLCAxMmRlZykgKiAwLjYpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY4JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbG9hdCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHRyYW5zbGF0ZVgoMCkgcm90YXRlKDBkZWcpIHNjYWxlKHZhcigtLWZhLWZsb2F0LXNxdWFzaC14LCAxLjAyKSwgdmFyKC0tZmEtZmxvYXQtc3F1YXNoLXksIDAuOTgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0wLjQgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKHZhcigtLWZhLWZsb2F0LWRyaWZ0LCAxcHgpKSByb3RhdGUodmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpIHNjYWxlKDEsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXgsIDAuOTgpLCB2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXksIDEuMDMpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMCk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC45MiAqIHZhcigtLWZhLWZsb2F0LWhlaWdodCwgNnB4KSkpIHRyYW5zbGF0ZVgoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpKSBzY2FsZSgwLjk5NSwgMS4wMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMC4zMyk7CiAgfQogIDcwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC4zICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLWZsb2F0LXRpbHQsIDFkZWcpKSkgc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygwLjA1ICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZykgc2NhbGUodmFyKC0tZmEtZmxvYXQtc3F1YXNoLXgsIDEuMDIpLCB2YXIoLS1mYS1mbG9hdC1zcXVhc2gteSwgMC45OCkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zcXVhc2gteCwgMS4wMiksIHZhcigtLWZhLWZsb2F0LXNxdWFzaC15LCAwLjk4KSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc3dpbmcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tZmEtc3dpbmctYW5nbGUsIDIyZGVnKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAxOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjg1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAyOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC42NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuNjUsIDEpOwogIH0KICAzOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjQ1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA0OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4yNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTYlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGMoLTEgKiB2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtamVsbG8gewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjgsIDEpOwogIH0KICAxMiUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSwgY2FsYygyIC0gdmFyKC0tZmEtamVsbG8tc2NhbGUteCwgMS4xNSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKGNhbGMoMiAtIHZhcigtLWZhLWplbGxvLXNjYWxlLXksIDEuMTIpKSwgdmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMywgMCwgMC43LCAxKTsKICB9CiAgMzYlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygxICsgKHZhcigtLWZhLWplbGxvLXNjYWxlLXgsIDEuMTUpIC0gMSkgKiAwLjUpLCBjYWxjKDIgLSAoMSArICh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSAtIDEpICogMC41KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygyIC0gKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpLCBjYWxjKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMiwgMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogIH0KICA2OCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpOwogIH0KfQouZmEtcm90YXRlLTkwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KCi5mYS1yb3RhdGUtMTgwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwp9CgouZmEtcm90YXRlLTI3MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKfQoKLmZhLWZsaXAtaG9yaXpvbnRhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7Cn0KCi5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTsKfQoKLmZhLWZsaXAtYm90aCwKLmZhLWZsaXAtaG9yaXpvbnRhbC5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAtMSk7Cn0KCi5mYS1yb3RhdGUtYnkgewogIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgMCkpOwp9Cgouc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkgewogIGZpbGw6IHZhcigtLWZhLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTsKICBvcGFjaXR5OiB2YXIoLS1mYS1zZWNvbmRhcnktb3BhY2l0eSwgMC40KTsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLXN3YXAtb3BhY2l0eSAuZmEtcHJpbWFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXNlY29uZGFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksCi5zdmctaW5saW5lLS1mYSBtYXNrIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IGJsYWNrOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtaW52ZXJzZSB7CiAgZmlsbDogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7Cn0KCi5mYS1zdGFjayB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMmVtOwogIGxpbmUtaGVpZ2h0OiAyZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDIuNWVtOwp9CgouZmEtaW52ZXJzZSB7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXggewogIC0tZmEtd2lkdGg6IDEuMjVlbTsKICBoZWlnaHQ6IDFlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgpOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1zdGFjay0yeCB7CiAgLS1mYS13aWR0aDogMi41ZW07CiAgaGVpZ2h0OiAyZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTsKfQoKLmZhLXN0YWNrLTF4LAouZmEtc3RhY2stMnggewogIGluc2V0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogdmFyKC0tZmEtc3RhY2stei1pbmRleCwgYXV0byk7Cn1gO2Z1bmN0aW9uIGJwKCl7dmFyIGU9RGYsdD1PZixuPXEuY3NzUHJlZml4LHI9cS5yZXBsYWNlbWVudENsYXNzLGk9eXA7aWYobiE9PWV8fHIhPT10KXt2YXIgYT1SZWdFeHAoYFxcLiR7ZX1cXC1gLGBnYCksbz1SZWdFeHAoYFxcLS0ke2V9XFwtYCxgZ2ApLHM9UmVnRXhwKGBcXC4ke3R9YCxgZ2ApO2k9aS5yZXBsYWNlKGEsYC4ke259LWApLnJlcGxhY2UobyxgLS0ke259LWApLnJlcGxhY2UocyxgLiR7cn1gKX1yZXR1cm4gaX12YXIgeHA9ITE7ZnVuY3Rpb24gU3AoKXtxLmF1dG9BZGRDc3MmJiF4cCYmKGNwKGJwKCkpLHhwPSEwKX12YXIgQ3A9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e2NzczpicCxpbnNlcnRDc3M6U3B9fX0saG9va3M6ZnVuY3Rpb24oKXtyZXR1cm57YmVmb3JlRE9NRWxlbWVudENyZWF0aW9uOmZ1bmN0aW9uKCl7U3AoKX0sYmVmb3JlSTJzdmc6ZnVuY3Rpb24oKXtTcCgpfX19fSx3cD1KdXx8e307d3BbVGZdfHwod3BbVGZdPXt9KSx3cFtUZl0uc3R5bGVzfHwod3BbVGZdLnN0eWxlcz17fSksd3BbVGZdLmhvb2tzfHwod3BbVGZdLmhvb2tzPXt9KSx3cFtUZl0uc2hpbXN8fCh3cFtUZl0uc2hpbXM9W10pO3ZhciBUcD13cFtUZl0sRXA9W10sRHA9ZnVuY3Rpb24oKXtZdS5yZW1vdmVFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCxEcCksT3A9MSxFcC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pfSxPcD0hMTtRdSYmKE9wPShZdS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/L15sb2FkZWR8XmMvOi9ebG9hZGVkfF5pfF5jLykudGVzdChZdS5yZWFkeVN0YXRlKSxPcHx8WXUuYWRkRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsRHApKTtmdW5jdGlvbiBrcChlKXtRdSYmKE9wP3NldFRpbWVvdXQoZSwwKTpFcC5wdXNoKGUpKX1mdW5jdGlvbiBBcChlKXt2YXIgdD1lLnRhZyxuPWUuYXR0cmlidXRlcyxyPW49PT12b2lkIDA/e306bixpPWUuY2hpbGRyZW4sYT1pPT09dm9pZCAwP1tdOmk7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9wcChlKTpgPCR7dH0gJHttcChyKX0+JHthLm1hcChBcCkuam9pbihgYCl9PC8ke3R9PmB9ZnVuY3Rpb24ganAoZSx0LG4pe2lmKGUmJmVbdF0mJmVbdF1bbl0pcmV0dXJue3ByZWZpeDp0LGljb25OYW1lOm4saWNvbjplW3RdW25dfX12YXIgTXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyLGksYSl7cmV0dXJuIGUuY2FsbCh0LG4scixpLGEpfX0sTnA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmtleXMoZSksYT1pLmxlbmd0aCxvPXI9PT12b2lkIDA/dDpNcCh0LHIpLHMsYyxsO2ZvcihuPT09dm9pZCAwPyhzPTEsbD1lW2lbMF1dKToocz0wLGw9bik7czxhO3MrKyljPWlbc10sbD1vKGwsZVtjXSxjLGUpO3JldHVybiBsfTtmdW5jdGlvbiBQcChlKXtyZXR1cm4gSXUoZSkubGVuZ3RoPT09MT9lLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KTpudWxsfWZ1bmN0aW9uIEZwKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXt2YXIgcj1lW25dO3JldHVybiByLmljb24/dFtyLmljb25OYW1lXT1yLmljb246dFtuXT1yLHR9LHt9KX1mdW5jdGlvbiBJcChlLHQpe3ZhciBuPShhcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30pLnNraXBIb29rcyxyPW4hPT12b2lkIDAmJm4saT1GcCh0KTt0eXBlb2YgVHAuaG9va3MuYWRkUGFjaz09YGZ1bmN0aW9uYCYmIXI/VHAuaG9va3MuYWRkUGFjayhlLEZwKHQpKTpUcC5zdHlsZXNbZV09SyhLKHt9LFRwLnN0eWxlc1tlXXx8e30pLGkpLGU9PT1gZmFzYCYmSXAoYGZhYCx0KX12YXIgTHA9VHAuc3R5bGVzLFJwPVRwLnNoaW1zLHpwPU9iamVjdC5rZXlzKEdmKSxCcD16cC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT1PYmplY3Qua2V5cyhHZlt0XSksZX0se30pLFZwPW51bGwsSHA9e30sVXA9e30sV3A9e30sR3A9e30sS3A9e307ZnVuY3Rpb24gcXAoZSl7cmV0dXJuflFmLmluZGV4T2YoZSl9ZnVuY3Rpb24gSnAoZSx0KXt2YXIgbj10LnNwbGl0KGAtYCkscj1uWzBdLGk9bi5zbGljZSgxKS5qb2luKGAtYCk7cmV0dXJuIHI9PT1lJiZpIT09YGAmJiFxcChpKT9pOm51bGx9dmFyIFlwPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE5wKExwLGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtyXT1OcChuLGUse30pLHR9LHt9KX07SHA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRbM10mJihlW3RbM11dPW4pLHRbMl0mJnRbMl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmB9KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdC50b1N0cmluZygxNildPW59KSxlfSksVXA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbbl09bix0WzJdJiZ0WzJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSksS3A9ZShmdW5jdGlvbihlLHQsbil7dmFyIHI9dFsyXTtyZXR1cm4gZVtuXT1uLHIuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSk7dmFyIHQ9YGZhcmBpbiBMcHx8cS5hdXRvRmV0Y2hTdmcsbj1OcChScCxmdW5jdGlvbihlLG4pe3ZhciByPW5bMF0saT1uWzFdLGE9blsyXTtyZXR1cm4gaT09PWBmYXJgJiYhdCYmKGk9YGZhc2ApLHR5cGVvZiByPT1gc3RyaW5nYCYmKGUubmFtZXNbcl09e3ByZWZpeDppLGljb25OYW1lOmF9KSx0eXBlb2Ygcj09YG51bWJlcmAmJihlLnVuaWNvZGVzW3IudG9TdHJpbmcoMTYpXT17cHJlZml4OmksaWNvbk5hbWU6YX0pLGV9LHtuYW1lczp7fSx1bmljb2Rlczp7fX0pO1dwPW4ubmFtZXMsR3A9bi51bmljb2RlcyxWcD1pbShxLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OnEuZmFtaWx5RGVmYXVsdH0pfTthcChmdW5jdGlvbihlKXtWcD1pbShlLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OnEuZmFtaWx5RGVmYXVsdH0pfSksWXAoKTtmdW5jdGlvbiBYcChlLHQpe3JldHVybihIcFtlXXx8e30pW3RdfWZ1bmN0aW9uIFpwKGUsdCl7cmV0dXJuKFVwW2VdfHx7fSlbdF19ZnVuY3Rpb24gUXAoZSx0KXtyZXR1cm4oS3BbZV18fHt9KVt0XX1mdW5jdGlvbiAkcChlKXtyZXR1cm4gV3BbZV18fHtwcmVmaXg6bnVsbCxpY29uTmFtZTpudWxsfX1mdW5jdGlvbiBlbShlKXt2YXIgdD1HcFtlXSxuPVhwKGBmYXNgLGUpO3JldHVybiB0fHwobj97cHJlZml4OmBmYXNgLGljb25OYW1lOm59Om51bGwpfHx7cHJlZml4Om51bGwsaWNvbk5hbWU6bnVsbH19ZnVuY3Rpb24gdG0oKXtyZXR1cm4gVnB9dmFyIG5tPWZ1bmN0aW9uKCl7cmV0dXJue3ByZWZpeDpudWxsLGljb25OYW1lOm51bGwscmVzdDpbXX19O2Z1bmN0aW9uIHJtKGUpe3ZhciB0PW9kLG49enAucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09YCR7cS5jc3NQcmVmaXh9LSR7dH1gLGV9LHt9KTtyZXR1cm4gZWYuZm9yRWFjaChmdW5jdGlvbihyKXsoZS5pbmNsdWRlcyhuW3JdKXx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBCcFtyXS5pbmNsdWRlcyhlKX0pKSYmKHQ9cil9KSx0fWZ1bmN0aW9uIGltKGUpe3ZhciB0PShhcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30pLmZhbWlseSxuPXQ9PT12b2lkIDA/b2Q6dCxyPVZmW25dW2VdO2lmKG49PT1zZCYmIWUpcmV0dXJuYGZhZGA7dmFyIGk9VWZbbl1bZV18fFVmW25dW3JdLGE9ZSBpbiBUcC5zdHlsZXM/ZTpudWxsO3JldHVybiBpfHxhfHxudWxsfWZ1bmN0aW9uIGFtKGUpe3ZhciB0PVtdLG49bnVsbDtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPUpwKHEuY3NzUHJlZml4LGUpO3I/bj1yOmUmJnQucHVzaChlKX0pLHtpY29uTmFtZTpuLHJlc3Q6dH19ZnVuY3Rpb24gb20oZSl7cmV0dXJuIGUuc29ydCgpLmZpbHRlcihmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4uaW5kZXhPZihlKT09PXR9KX12YXIgc209eWYuY29uY2F0KG9mKTtmdW5jdGlvbiBjbShlKXt2YXIgdD0oYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9KS5za2lwTG9va3VwcyxuPXQhPT12b2lkIDAmJnQscj1udWxsLGk9b20oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHNtLmluY2x1ZGVzKGUpfSkpLGE9b20oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXNtLmluY2x1ZGVzKGUpfSkpLG89RnUoaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSwhYWQuaW5jbHVkZXMoZSl9KSwxKVswXSxzPW89PT12b2lkIDA/bnVsbDpvLGM9cm0oaSksbD1LKEsoe30sYW0oYSkpLHt9LHtwcmVmaXg6aW0ocyx7ZmFtaWx5OmN9KX0pO3JldHVybiBLKEsoSyh7fSxsKSxmbSh7dmFsdWVzOmUsZmFtaWx5OmMsc3R5bGVzOkxwLGNvbmZpZzpxLGNhbm9uaWNhbDpsLGdpdmVuUHJlZml4OnJ9KSksbG0obixyLGwpKX1mdW5jdGlvbiBsbShlLHQsbil7dmFyIHI9bi5wcmVmaXgsaT1uLmljb25OYW1lO2lmKGV8fCFyfHwhaSlyZXR1cm57cHJlZml4OnIsaWNvbk5hbWU6aX07dmFyIGE9dD09PWBmYWA/JHAoaSk6e30sbz1RcChyLGkpO3JldHVybiBpPWEuaWNvbk5hbWV8fG98fGkscj1hLnByZWZpeHx8cixyPT09YGZhcmAmJiFMcC5mYXImJkxwLmZhcyYmIXEuYXV0b0ZldGNoU3ZnJiYocj1gZmFzYCkse3ByZWZpeDpyLGljb25OYW1lOml9fXZhciB1bT1lZi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1vZHx8ZSE9PXNkfSksZG09T2JqZWN0LmtleXModmYpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PW9kfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyh2ZltlXSl9KS5mbGF0KCk7ZnVuY3Rpb24gZm0oZSl7dmFyIHQ9ZS52YWx1ZXMsbj1lLmZhbWlseSxyPWUuY2Fub25pY2FsLGk9ZS5naXZlblByZWZpeCxhPWk9PT12b2lkIDA/YGA6aSxvPWUuc3R5bGVzLHM9bz09PXZvaWQgMD97fTpvLGM9ZS5jb25maWcsbD1jPT09dm9pZCAwP3t9OmMsdT1uPT09c2QsZD10LmluY2x1ZGVzKGBmYS1kdW90b25lYCl8fHQuaW5jbHVkZXMoYGZhZGApLGY9bC5mYW1pbHlEZWZhdWx0PT09YGR1b3RvbmVgLHA9ci5wcmVmaXg9PT1gZmFkYHx8ci5wcmVmaXg9PT1gZmEtZHVvdG9uZWA7cmV0dXJuIXUmJihkfHxmfHxwKSYmKHIucHJlZml4PWBmYWRgKSwodC5pbmNsdWRlcyhgZmEtYnJhbmRzYCl8fHQuaW5jbHVkZXMoYGZhYmApKSYmKHIucHJlZml4PWBmYWJgKSwhci5wcmVmaXgmJnVtLmluY2x1ZGVzKG4pJiYoT2JqZWN0LmtleXMocykuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZG0uaW5jbHVkZXMoZSl9KXx8bC5hdXRvRmV0Y2hTdmcpJiYoci5wcmVmaXg9cmYuZ2V0KG4pLmRlZmF1bHRTaG9ydFByZWZpeElkLHIuaWNvbk5hbWU9UXAoci5wcmVmaXgsci5pY29uTmFtZSl8fHIuaWNvbk5hbWUpLChyLnByZWZpeD09PWBmYWB8fGE9PT1gZmFgKSYmKHIucHJlZml4PXRtKCl8fGBmYXNgKSxyfXZhciBwbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtFdSh0aGlzLGUpLHRoaXMuZGVmaW5pdGlvbnM9e319cmV0dXJuIE91KGUsW3trZXk6YGFkZGAsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Wy4uLmFyZ3VtZW50c10ucmVkdWNlKHRoaXMuX3B1bGxEZWZpbml0aW9ucyx7fSk7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtlLmRlZmluaXRpb25zW25dPUsoSyh7fSxlLmRlZmluaXRpb25zW25dfHx7fSksdFtuXSksSXAobix0W25dKTt2YXIgcj1HZltvZF1bbl07ciYmSXAocix0W25dKSxZcCgpfSl9fSx7a2V5OmByZXNldGAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRlZmluaXRpb25zPXt9fX0se2tleTpgX3B1bGxEZWZpbml0aW9uc2AsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnByZWZpeCYmdC5pY29uTmFtZSYmdC5pY29uP3swOnR9OnQ7cmV0dXJuIE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXt2YXIgcj1uW3RdLGk9ci5wcmVmaXgsYT1yLmljb25OYW1lLG89ci5pY29uLHM9b1syXTtlW2ldfHwoZVtpXT17fSkscy5sZW5ndGg+MCYmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT1gc3RyaW5nYCYmKGVbaV1bdF09byl9KSxlW2ldW2FdPW99KSxlfX1dKX0oKSxtbT1bXSxobT17fSxnbT17fSxfbT1PYmplY3Qua2V5cyhnbSk7ZnVuY3Rpb24gdm0oZSx0KXt2YXIgbj10Lm1peG91dHNUbztyZXR1cm4gbW09ZSxobT17fSxPYmplY3Qua2V5cyhnbSkuZm9yRWFjaChmdW5jdGlvbihlKXtfbS5pbmRleE9mKGUpPT09LTEmJmRlbGV0ZSBnbVtlXX0pLG1tLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5taXhvdXQ/ZS5taXhvdXQoKTp7fTtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3R5cGVvZiB0W2VdPT1gZnVuY3Rpb25gJiYobltlXT10W2VdKSx6dSh0W2VdKT09PWBvYmplY3RgJiZPYmplY3Qua2V5cyh0W2VdKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bZV18fChuW2VdPXt9KSxuW2VdW3JdPXRbZV1bcl19KX0pLGUuaG9va3Mpe3ZhciByPWUuaG9va3MoKTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2htW2VdfHwoaG1bZV09W10pLGhtW2VdLnB1c2gocltlXSl9KX1lLnByb3ZpZGVzJiZlLnByb3ZpZGVzKGdtKX0pLG59ZnVuY3Rpb24geW0oZSx0KXt2YXIgbj1bLi4uYXJndW1lbnRzXS5zbGljZSgyKTtyZXR1cm4oaG1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZS5hcHBseShudWxsLFt0XS5jb25jYXQobikpfSksdH1mdW5jdGlvbiBibShlKXt2YXIgdD1bLi4uYXJndW1lbnRzXS5zbGljZSgxKTsoaG1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkobnVsbCx0KX0pfWZ1bmN0aW9uIHhtKCl7dmFyIGU9YXJndW1lbnRzWzBdLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBnbVtlXT9nbVtlXS5hcHBseShudWxsLHQpOnZvaWQgMH1mdW5jdGlvbiBTbShlKXtlLnByZWZpeD09PWBmYWAmJihlLnByZWZpeD1gZmFzYCk7dmFyIHQ9ZS5pY29uTmFtZSxuPWUucHJlZml4fHx0bSgpO2lmKHQpcmV0dXJuIHQ9UXAobix0KXx8dCxqcChDbS5kZWZpbml0aW9ucyxuLHQpfHxqcChUcC5zdHlsZXMsbix0KX12YXIgQ209bmV3IHBtLHdtPXtub0F1dG86ZnVuY3Rpb24oKXtxLmF1dG9SZXBsYWNlU3ZnPSExLHEub2JzZXJ2ZU11dGF0aW9ucz0hMSxibShgbm9BdXRvYCl9LGNvbmZpZzpxLGRvbTp7aTJzdmc6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307cmV0dXJuIFF1PyhibShgYmVmb3JlSTJzdmdgLGUpLHhtKGBwc2V1ZG9FbGVtZW50czJzdmdgLGUpLHhtKGBpMnN2Z2AsZSkpOlByb21pc2UucmVqZWN0KEVycm9yKGBPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLmApKX0sd2F0Y2g6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sdD1lLmF1dG9SZXBsYWNlU3ZnUm9vdDtxLmF1dG9SZXBsYWNlU3ZnPT09ITEmJihxLmF1dG9SZXBsYWNlU3ZnPSEwKSxxLm9ic2VydmVNdXRhdGlvbnM9ITAsa3AoZnVuY3Rpb24oKXtUbSh7YXV0b1JlcGxhY2VTdmdSb290OnR9KSxibShgd2F0Y2hgLGUpfSl9fSxwYXJzZTp7aWNvbjpmdW5jdGlvbihlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtpZih6dShlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSlyZXR1cm57cHJlZml4OmUucHJlZml4LGljb25OYW1lOlFwKGUucHJlZml4LGUuaWNvbk5hbWUpfHxlLmljb25OYW1lfTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTIpe3ZhciB0PWVbMV0uaW5kZXhPZihgZmEtYCk9PT0wP2VbMV0uc2xpY2UoMyk6ZVsxXSxuPWltKGVbMF0pO3JldHVybntwcmVmaXg6bixpY29uTmFtZTpRcChuLHQpfHx0fX1pZih0eXBlb2YgZT09YHN0cmluZ2AmJihlLmluZGV4T2YoYCR7cS5jc3NQcmVmaXh9LWApPi0xfHxlLm1hdGNoKHFmKSkpe3ZhciByPWNtKGUuc3BsaXQoYCBgKSx7c2tpcExvb2t1cHM6ITB9KTtyZXR1cm57cHJlZml4OnIucHJlZml4fHx0bSgpLGljb25OYW1lOlFwKHIucHJlZml4LHIuaWNvbk5hbWUpfHxyLmljb25OYW1lfX1pZih0eXBlb2YgZT09YHN0cmluZ2Ape3ZhciBpPXRtKCk7cmV0dXJue3ByZWZpeDppLGljb25OYW1lOlFwKGksZSl8fGV9fX19LGxpYnJhcnk6Q20sZmluZEljb25EZWZpbml0aW9uOlNtLHRvSHRtbDpBcH0sVG09ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9KS5hdXRvUmVwbGFjZVN2Z1Jvb3QsdD1lPT09dm9pZCAwP1l1OmU7KE9iamVjdC5rZXlzKFRwLnN0eWxlcykubGVuZ3RoPjB8fHEuYXV0b0ZldGNoU3ZnKSYmUXUmJnEuYXV0b1JlcGxhY2VTdmcmJndtLmRvbS5pMnN2Zyh7bm9kZTp0fSl9O2Z1bmN0aW9uIEVtKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhYnN0cmFjdCIse2dldDp0fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImh0bWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hYnN0cmFjdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEFwKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZihRdSl7dmFyIHQ9WXUuY3JlYXRlRWxlbWVudChgZGl2YCk7cmV0dXJuIHQuaW5uZXJIVE1MPWUuaHRtbCx0LmNoaWxkcmVufX19KSxlfWZ1bmN0aW9uIERtKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLm1haW4scj1lLm1hc2ssaT1lLmF0dHJpYnV0ZXMsYT1lLnN0eWxlcyxvPWUudHJhbnNmb3JtO2lmKGdwKG8pJiZuLmZvdW5kJiYhci5mb3VuZCl7dmFyIHM9e3g6bi53aWR0aC9uLmhlaWdodC8yLHk6LjV9O2kuc3R5bGU9aHAoSyhLKHt9LGEpLHt9LHsidHJhbnNmb3JtLW9yaWdpbiI6YCR7cy54K28ueC8xNn1lbSAke3MueStvLnkvMTZ9ZW1gfSkpfXJldHVyblt7dGFnOmBzdmdgLGF0dHJpYnV0ZXM6aSxjaGlsZHJlbjp0fV19ZnVuY3Rpb24gT20oZSl7dmFyIHQ9ZS5wcmVmaXgsbj1lLmljb25OYW1lLHI9ZS5jaGlsZHJlbixpPWUuYXR0cmlidXRlcyxhPWUuc3ltYm9sLG89YT09PSEwP2Ake3R9LSR7cS5jc3NQcmVmaXh9LSR7bn1gOmE7cmV0dXJuW3t0YWc6YHN2Z2AsYXR0cmlidXRlczp7c3R5bGU6YGRpc3BsYXk6IG5vbmU7YH0sY2hpbGRyZW46W3t0YWc6YHN5bWJvbGAsYXR0cmlidXRlczpLKEsoe30saSkse30se2lkOm99KSxjaGlsZHJlbjpyfV19XX1mdW5jdGlvbiBrbShlKXtyZXR1cm5bYGFyaWEtbGFiZWxgLGBhcmlhLWxhYmVsbGVkYnlgLGB0aXRsZWAsYHJvbGVgXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluIGV9KX1mdW5jdGlvbiBBbShlKXt2YXIgdD1lLmljb25zLG49dC5tYWluLHI9dC5tYXNrLGk9ZS5wcmVmaXgsYT1lLmljb25OYW1lLG89ZS50cmFuc2Zvcm0scz1lLnN5bWJvbCxjPWUubWFza0lkLGw9ZS5leHRyYSx1PWUud2F0Y2hhYmxlLGQ9dSE9PXZvaWQgMCYmdSxmPXIuZm91bmQ/cjpuLHA9Zi53aWR0aCxtPWYuaGVpZ2h0LGg9W3EucmVwbGFjZW1lbnRDbGFzcyxhP2Ake3EuY3NzUHJlZml4fS0ke2F9YDpgYF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBsLmNsYXNzZXMuaW5kZXhPZihlKT09PS0xfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09YGB8fCEhZX0pLmNvbmNhdChsLmNsYXNzZXMpLmpvaW4oYCBgKSxnPXtjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOksoSyh7fSxsLmF0dHJpYnV0ZXMpLHt9LHsiZGF0YS1wcmVmaXgiOmksImRhdGEtaWNvbiI6YSxjbGFzczpoLHJvbGU6bC5hdHRyaWJ1dGVzLnJvbGV8fGBpbWdgLHZpZXdCb3g6YDAgMCAke3B9ICR7bX1gfSl9OyFrbShsLmF0dHJpYnV0ZXMpJiYhbC5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdJiYoZy5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdPWB0cnVlYCksZCYmKGcuYXR0cmlidXRlc1trZl09YGApO3ZhciBfPUsoSyh7fSxnKSx7fSx7cHJlZml4OmksaWNvbk5hbWU6YSxtYWluOm4sbWFzazpyLG1hc2tJZDpjLHRyYW5zZm9ybTpvLHN5bWJvbDpzLHN0eWxlczpLKHt9LGwuc3R5bGVzKX0pLHY9ci5mb3VuZCYmbi5mb3VuZD94bShgZ2VuZXJhdGVBYnN0cmFjdE1hc2tgLF8pfHx7Y2hpbGRyZW46W10sYXR0cmlidXRlczp7fX06eG0oYGdlbmVyYXRlQWJzdHJhY3RJY29uYCxfKXx8e2NoaWxkcmVuOltdLGF0dHJpYnV0ZXM6e319LHk9di5jaGlsZHJlbixiPXYuYXR0cmlidXRlcztyZXR1cm4gXy5jaGlsZHJlbj15LF8uYXR0cmlidXRlcz1iLHM/T20oXyk6RG0oXyl9ZnVuY3Rpb24gam0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS53aWR0aCxyPWUuaGVpZ2h0LGk9ZS50cmFuc2Zvcm0sYT1lLmV4dHJhLG89ZS53YXRjaGFibGUscz1vIT09dm9pZCAwJiZvLGM9SyhLKHt9LGEuYXR0cmlidXRlcykse30se2NsYXNzOmEuY2xhc3Nlcy5qb2luKGAgYCl9KTtzJiYoY1trZl09YGApO3ZhciBsPUsoe30sYS5zdHlsZXMpO2dwKGkpJiYobC50cmFuc2Zvcm09dnAoe3RyYW5zZm9ybTppLHN0YXJ0Q2VudGVyZWQ6ITAsd2lkdGg6bixoZWlnaHQ6cn0pLGxbYC13ZWJraXQtdHJhbnNmb3JtYF09bC50cmFuc2Zvcm0pO3ZhciB1PWhwKGwpO3UubGVuZ3RoPjAmJihjLnN0eWxlPXUpO3ZhciBkPVtdO3JldHVybiBkLnB1c2goe3RhZzpgc3BhbmAsYXR0cmlidXRlczpjLGNoaWxkcmVuOlt0XX0pLGR9ZnVuY3Rpb24gTW0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS5leHRyYSxyPUsoSyh7fSxuLmF0dHJpYnV0ZXMpLHt9LHtjbGFzczpuLmNsYXNzZXMuam9pbihgIGApfSksaT1ocChuLnN0eWxlcyk7aS5sZW5ndGg+MCYmKHIuc3R5bGU9aSk7dmFyIGE9W107cmV0dXJuIGEucHVzaCh7dGFnOmBzcGFuYCxhdHRyaWJ1dGVzOnIsY2hpbGRyZW46W3RdfSksYX12YXIgTm09VHAuc3R5bGVzO2Z1bmN0aW9uIFBtKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9RnUoZS5zbGljZSg0KSwxKVswXSxpPW51bGw7cmV0dXJuIGk9QXJyYXkuaXNBcnJheShyKT97dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtxLmNzc1ByZWZpeH0tJHtaZi5HUk9VUH1gfSxjaGlsZHJlbjpbe3RhZzpgcGF0aGAsYXR0cmlidXRlczp7Y2xhc3M6YCR7cS5jc3NQcmVmaXh9LSR7WmYuU0VDT05EQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMF19fSx7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtxLmNzc1ByZWZpeH0tJHtaZi5QUklNQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMV19fV19Ont0YWc6YHBhdGhgLGF0dHJpYnV0ZXM6e2ZpbGw6YGN1cnJlbnRDb2xvcmAsZDpyfX0se2ZvdW5kOiEwLHdpZHRoOnQsaGVpZ2h0Om4saWNvbjppfX12YXIgRm09e2ZvdW5kOiExLHdpZHRoOjUxMixoZWlnaHQ6NTEyfTtmdW5jdGlvbiBJbShlLHQpeyFSZiYmIXEuc2hvd01pc3NpbmdJY29ucyYmZSYmY29uc29sZS5lcnJvcihgSWNvbiB3aXRoIG5hbWUgIiR7ZX0iIGFuZCBwcmVmaXggIiR7dH0iIGlzIG1pc3NpbmcuYCl9ZnVuY3Rpb24gTG0oZSx0KXt2YXIgbj10O3JldHVybiB0PT09YGZhYCYmcS5zdHlsZURlZmF1bHQhPT1udWxsJiYodD10bSgpKSxuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe2lmKG49PT1gZmFgKXt2YXIgYT0kcChlKXx8e307ZT1hLmljb25OYW1lfHxlLHQ9YS5wcmVmaXh8fHR9aWYoZSYmdCYmTm1bdF0mJk5tW3RdW2VdKXt2YXIgbz1ObVt0XVtlXTtyZXR1cm4gcihQbShvKSl9SW0oZSx0KSxyKEsoSyh7fSxGbSkse30se2ljb246cS5zaG93TWlzc2luZ0ljb25zJiZlJiZ4bShgbWlzc2luZ0ljb25BYnN0cmFjdGApfHx7fX0pKX0pfXZhciBSbT1mdW5jdGlvbigpe30sem09cS5tZWFzdXJlUGVyZm9ybWFuY2UmJlp1JiZadS5tYXJrJiZadS5tZWFzdXJlP1p1OnttYXJrOlJtLG1lYXN1cmU6Um19LEJtPWBGQSAiNy4zLjEiYCxWbT1mdW5jdGlvbihlKXtyZXR1cm4gem0ubWFyayhgJHtCbX0gJHtlfSBiZWdpbnNgKSxmdW5jdGlvbigpe3JldHVybiBIbShlKX19LEhtPWZ1bmN0aW9uKGUpe3ptLm1hcmsoYCR7Qm19ICR7ZX0gZW5kc2ApLHptLm1lYXN1cmUoYCR7Qm19ICR7ZX1gLGAke0JtfSAke2V9IGJlZ2luc2AsYCR7Qm19ICR7ZX0gZW5kc2ApfSxVbT17YmVnaW46Vm0sZW5kOkhtfSxXbT1mdW5jdGlvbigpe307ZnVuY3Rpb24gR20oZSl7cmV0dXJuIHR5cGVvZihlLmdldEF0dHJpYnV0ZT9lLmdldEF0dHJpYnV0ZShrZik6bnVsbCk9PWBzdHJpbmdgfWZ1bmN0aW9uIEttKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlP2UuZ2V0QXR0cmlidXRlKE1mKTpudWxsLG49ZS5nZXRBdHRyaWJ1dGU/ZS5nZXRBdHRyaWJ1dGUoTmYpOm51bGw7cmV0dXJuIHQmJm59ZnVuY3Rpb24gcW0oZSl7cmV0dXJuIGUmJmUuY2xhc3NMaXN0JiZlLmNsYXNzTGlzdC5jb250YWlucyYmZS5jbGFzc0xpc3QuY29udGFpbnMocS5yZXBsYWNlbWVudENsYXNzKX1mdW5jdGlvbiBKbSgpe3JldHVybiBxLmF1dG9SZXBsYWNlU3ZnPT09ITA/JG0ucmVwbGFjZTokbVtxLmF1dG9SZXBsYWNlU3ZnXXx8JG0ucmVwbGFjZX1mdW5jdGlvbiBZbShlKXtyZXR1cm4gWXUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsZSl9ZnVuY3Rpb24gWG0oZSl7cmV0dXJuIFl1LmNyZWF0ZUVsZW1lbnQoZSl9ZnVuY3Rpb24gWm0oZSl7dmFyIHQ9KGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSkuY2VGbixuPXQ9PT12b2lkIDA/ZS50YWc9PT1gc3ZnYD9ZbTpYbTp0O2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gWXUuY3JlYXRlVGV4dE5vZGUoZSk7dmFyIHI9bihlLnRhZyk7cmV0dXJuIE9iamVjdC5rZXlzKGUuYXR0cmlidXRlc3x8W10pLmZvckVhY2goZnVuY3Rpb24odCl7ci5zZXRBdHRyaWJ1dGUodCxlLmF0dHJpYnV0ZXNbdF0pfSksKGUuY2hpbGRyZW58fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuYXBwZW5kQ2hpbGQoWm0oZSx7Y2VGbjpufSkpfSkscn1mdW5jdGlvbiBRbShlKXt2YXIgdD1gICR7ZS5vdXRlckhUTUx9IGA7cmV0dXJuIHQ9YCR7dH1Gb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tIGAsdH12YXIgJG09e3JlcGxhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZih0LnBhcmVudE5vZGUpe2lmKGVbMV0uZm9yRWFjaChmdW5jdGlvbihlKXt0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFptKGUpLHQpfSksdC5nZXRBdHRyaWJ1dGUoa2YpPT09bnVsbCYmcS5rZWVwT3JpZ2luYWxTb3VyY2Upe3ZhciBuPVl1LmNyZWF0ZUNvbW1lbnQoUW0odCkpO3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobix0KX1lbHNlIHQucmVtb3ZlKCl9fSxuZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2lmKH5mcCh0KS5pbmRleE9mKHEucmVwbGFjZW1lbnRDbGFzcykpcmV0dXJuICRtLnJlcGxhY2UoZSk7dmFyIHI9UmVnRXhwKGAke3EuY3NzUHJlZml4fS0uKmApO2lmKGRlbGV0ZSBuWzBdLmF0dHJpYnV0ZXMuaWQsblswXS5hdHRyaWJ1dGVzLmNsYXNzKXt2YXIgaT1uWzBdLmF0dHJpYnV0ZXMuY2xhc3Muc3BsaXQoYCBgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXEucmVwbGFjZW1lbnRDbGFzc3x8dC5tYXRjaChyKT9lLnRvU3ZnLnB1c2godCk6ZS50b05vZGUucHVzaCh0KSxlfSx7dG9Ob2RlOltdLHRvU3ZnOltdfSk7blswXS5hdHRyaWJ1dGVzLmNsYXNzPWkudG9Tdmcuam9pbihgIGApLGkudG9Ob2RlLmxlbmd0aD09PTA/dC5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6dC5zZXRBdHRyaWJ1dGUoYGNsYXNzYCxpLnRvTm9kZS5qb2luKGAgYCkpfXZhciBhPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBBcChlKX0pLmpvaW4oYApgKTt0LnNldEF0dHJpYnV0ZShrZixgYCksdC5pbm5lckhUTUw9YX19O2Z1bmN0aW9uIGVoKGUpe2UoKX1mdW5jdGlvbiB0aChlLHQpe3ZhciBuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3Q6V207aWYoZS5sZW5ndGg9PT0wKW4oKTtlbHNle3ZhciByPWVoO3EubXV0YXRlQXBwcm9hY2g9PT1GZiYmKHI9SnUucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxlaCkscihmdW5jdGlvbigpe3ZhciB0PUptKCkscj1VbS5iZWdpbihgbXV0YXRlYCk7ZS5tYXAodCkscigpLG4oKX0pfX12YXIgbmg9ITE7ZnVuY3Rpb24gcmgoKXtuaD0hMH1mdW5jdGlvbiBpaCgpe25oPSExfXZhciBhaD1udWxsO2Z1bmN0aW9uIG9oKGUpe2lmKFh1JiZxLm9ic2VydmVNdXRhdGlvbnMpe3ZhciB0PWUudHJlZUNhbGxiYWNrLG49dD09PXZvaWQgMD9XbTp0LHI9ZS5ub2RlQ2FsbGJhY2ssaT1yPT09dm9pZCAwP1dtOnIsYT1lLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2ssbz1hPT09dm9pZCAwP1dtOmEscz1lLm9ic2VydmVNdXRhdGlvbnNSb290LGM9cz09PXZvaWQgMD9ZdTpzO2FoPW5ldyBYdShmdW5jdGlvbihlKXtpZighbmgpe3ZhciB0PXRtKCk7ZHAoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnR5cGU9PT1gY2hpbGRMaXN0YCYmZS5hZGRlZE5vZGVzLmxlbmd0aD4wJiYhR20oZS5hZGRlZE5vZGVzWzBdKSYmKHEuc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oZS50YXJnZXQpLG4oZS50YXJnZXQpKSxlLnR5cGU9PT1gYXR0cmlidXRlc2AmJmUudGFyZ2V0LnBhcmVudE5vZGUmJnEuc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oW2UudGFyZ2V0XSwhMCksZS50eXBlPT09YGF0dHJpYnV0ZXNgJiZHbShlLnRhcmdldCkmJn5YZi5pbmRleE9mKGUuYXR0cmlidXRlTmFtZSkpe2lmKGUuYXR0cmlidXRlTmFtZT09PWBjbGFzc2AmJkttKGUudGFyZ2V0KSl7dmFyIHI9Y20oZnAoZS50YXJnZXQpKSxhPXIucHJlZml4LHM9ci5pY29uTmFtZTtlLnRhcmdldC5zZXRBdHRyaWJ1dGUoTWYsYXx8dCkscyYmZS50YXJnZXQuc2V0QXR0cmlidXRlKE5mLHMpfWVsc2UgcW0oZS50YXJnZXQpJiZpKGUudGFyZ2V0KX19KX19KSxRdSYmYWgub2JzZXJ2ZShjLHtjaGlsZExpc3Q6ITAsYXR0cmlidXRlczohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19ZnVuY3Rpb24gc2goKXthaCYmYWguZGlzY29ubmVjdCgpfWZ1bmN0aW9uIGNoKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKGBzdHlsZWApLG49W107cmV0dXJuIHQmJihuPXQuc3BsaXQoYDtgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwbGl0KGA6YCkscj1uWzBdLGk9bi5zbGljZSgxKTtyZXR1cm4gciYmaS5sZW5ndGg+MCYmKGVbcl09aS5qb2luKGA6YCkudHJpbSgpKSxlfSx7fSkpLG59ZnVuY3Rpb24gbGgoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoYGRhdGEtcHJlZml4YCksbj1lLmdldEF0dHJpYnV0ZShgZGF0YS1pY29uYCkscj1lLmlubmVyVGV4dD09PXZvaWQgMD9gYDplLmlubmVyVGV4dC50cmltKCksaT1jbShmcChlKSk7cmV0dXJuIGkucHJlZml4fHw9dG0oKSx0JiZuJiYoaS5wcmVmaXg9dCxpLmljb25OYW1lPW4pLGkuaWNvbk5hbWUmJmkucHJlZml4P2k6KGkucHJlZml4JiZyLmxlbmd0aD4wJiYoaS5pY29uTmFtZT1acChpLnByZWZpeCxlLmlubmVyVGV4dCl8fFhwKGkucHJlZml4LFBwKGUuaW5uZXJUZXh0KSkpLCFpLmljb25OYW1lJiZxLmF1dG9GZXRjaFN2ZyYmZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmKGkuaWNvbk5hbWU9ZS5maXJzdENoaWxkLmRhdGEpLGkpfWZ1bmN0aW9uIHVoKGUpe3JldHVybiBkcChlLmF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWUhPT1gY2xhc3NgJiZlLm5hbWUhPT1gc3R5bGVgJiYoZVt0Lm5hbWVdPXQudmFsdWUpLGV9LHt9KX1mdW5jdGlvbiBkaCgpe3JldHVybntpY29uTmFtZTpudWxsLHByZWZpeDpudWxsLHRyYW5zZm9ybTpzcCxzeW1ib2w6ITEsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxleHRyYTp7Y2xhc3NlczpbXSxzdHlsZXM6e30sYXR0cmlidXRlczp7fX19fWZ1bmN0aW9uIGZoKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7c3R5bGVQYXJzZXI6ITB9LG49bGgoZSkscj1uLmljb25OYW1lLGk9bi5wcmVmaXgsYT1uLnJlc3Qsbz11aChlKSxzPXltKGBwYXJzZU5vZGVBdHRyaWJ1dGVzYCx7fSxlKTtyZXR1cm4gSyh7aWNvbk5hbWU6cixwcmVmaXg6aSx0cmFuc2Zvcm06c3AsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxzeW1ib2w6ITEsZXh0cmE6e2NsYXNzZXM6YSxzdHlsZXM6dC5zdHlsZVBhcnNlcj9jaChlKTpbXSxhdHRyaWJ1dGVzOm99fSxzKX12YXIgcGg9VHAuc3R5bGVzO2Z1bmN0aW9uIG1oKGUpe3ZhciB0PXEuYXV0b1JlcGxhY2VTdmc9PT1gbmVzdGA/ZmgoZSx7c3R5bGVQYXJzZXI6ITF9KTpmaChlKTtyZXR1cm5+dC5leHRyYS5jbGFzc2VzLmluZGV4T2YoSmYpP3htKGBnZW5lcmF0ZUxheWVyc1RleHRgLGUsdCk6eG0oYGdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbmAsZSx0KX1mdW5jdGlvbiBoaCgpe3JldHVybltdLmNvbmNhdChJdShvZiksSXUoeWYpKX1mdW5jdGlvbiBnaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZighUXUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBuPVl1LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Qscj1mdW5jdGlvbihlKXtyZXR1cm4gbi5hZGQoYCR7UGZ9LSR7ZX1gKX0saT1mdW5jdGlvbihlKXtyZXR1cm4gbi5yZW1vdmUoYCR7UGZ9LSR7ZX1gKX0sYT1xLmF1dG9GZXRjaFN2Zz9oaCgpOmFkLmNvbmNhdChPYmplY3Qua2V5cyhwaCkpO2EuaW5jbHVkZXMoYGZhYCl8fGEucHVzaChgZmFgKTt2YXIgbz1bYC4ke0pmfTpub3QoWyR7a2Z9XSlgXS5jb25jYXQoYS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYC4ke2V9Om5vdChbJHtrZn1dKWB9KSkuam9pbihgLCBgKTtpZihvLmxlbmd0aD09PTApcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBzPVtdO3RyeXtzPWRwKGUucXVlcnlTZWxlY3RvckFsbChvKSl9Y2F0Y2h7fWlmKHMubGVuZ3RoPjApcihgcGVuZGluZ2ApLGkoYGNvbXBsZXRlYCk7ZWxzZSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGM9VW0uYmVnaW4oYG9uVHJlZWApLGw9cy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt0cnl7dmFyIG49bWgodCk7biYmZS5wdXNoKG4pfWNhdGNoKGUpe1JmfHxlLm5hbWU9PT1gTWlzc2luZ0ljb25gJiZjb25zb2xlLmVycm9yKGUpfXJldHVybiBlfSxbXSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7UHJvbWlzZS5hbGwobCkudGhlbihmdW5jdGlvbihuKXt0aChuLGZ1bmN0aW9uKCl7cihgYWN0aXZlYCkscihgY29tcGxldGVgKSxpKGBwZW5kaW5nYCksdHlwZW9mIHQ9PWBmdW5jdGlvbmAmJnQoKSxjKCksZSgpfSl9KS5jYXRjaChmdW5jdGlvbihlKXtjKCksbihlKX0pfSl9ZnVuY3Rpb24gX2goZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7bWgoZSkudGhlbihmdW5jdGlvbihlKXtlJiZ0aChbZV0sdCl9KX1mdW5jdGlvbiB2aChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHI9KHR8fHt9KS5pY29uP3Q6U20odHx8e30pLGk9bi5tYXNrO3JldHVybiBpJiY9KGl8fHt9KS5pY29uP2k6U20oaXx8e30pLGUocixLKEsoe30sbikse30se21hc2s6aX0pKX19dmFyIHloPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9zcDpuLGk9dC5zeW1ib2wsYT1pIT09dm9pZCAwJiZpLG89dC5tYXNrLHM9bz09PXZvaWQgMD9udWxsOm8sYz10Lm1hc2tJZCxsPWM9PT12b2lkIDA/bnVsbDpjLHU9dC5jbGFzc2VzLGQ9dT09PXZvaWQgMD9bXTp1LGY9dC5hdHRyaWJ1dGVzLHA9Zj09PXZvaWQgMD97fTpmLG09dC5zdHlsZXMsaD1tPT09dm9pZCAwP3t9Om07aWYoZSl7dmFyIGc9ZS5wcmVmaXgsXz1lLmljb25OYW1lLHY9ZS5pY29uO3JldHVybiBFbShLKHt0eXBlOmBpY29uYH0sZSksZnVuY3Rpb24oKXtyZXR1cm4gYm0oYGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbmAse2ljb25EZWZpbml0aW9uOmUscGFyYW1zOnR9KSxBbSh7aWNvbnM6e21haW46UG0odiksbWFzazpzP1BtKHMuaWNvbik6e2ZvdW5kOiExLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsaWNvbjp7fX19LHByZWZpeDpnLGljb25OYW1lOl8sdHJhbnNmb3JtOksoSyh7fSxzcCksciksc3ltYm9sOmEsbWFza0lkOmwsZXh0cmE6e2F0dHJpYnV0ZXM6cCxzdHlsZXM6aCxjbGFzc2VzOmR9fSl9KX19LGJoPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57aWNvbjp2aCh5aCl9fSxob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRyZWVDYWxsYmFjaz1naCxlLm5vZGVDYWxsYmFjaz1faCxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuaTJzdmc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlLG49dD09PXZvaWQgMD9ZdTp0LHI9ZS5jYWxsYmFjaztyZXR1cm4gZ2gobixyPT09dm9pZCAwP2Z1bmN0aW9uKCl7fTpyKX0sZS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmljb25OYW1lLHI9dC5wcmVmaXgsaT10LnRyYW5zZm9ybSxhPXQuc3ltYm9sLG89dC5tYXNrLHM9dC5tYXNrSWQsYz10LmV4dHJhO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGwpe1Byb21pc2UuYWxsKFtMbShuLHIpLG8uaWNvbk5hbWU/TG0oby5pY29uTmFtZSxvLnByZWZpeCk6UHJvbWlzZS5yZXNvbHZlKHtmb3VuZDohMSx3aWR0aDo1MTIsaGVpZ2h0OjUxMixpY29uOnt9fSldKS50aGVuKGZ1bmN0aW9uKG8pe3ZhciBsPUZ1KG8sMiksdT1sWzBdLGQ9bFsxXTt0KFtlLEFtKHtpY29uczp7bWFpbjp1LG1hc2s6ZH0scHJlZml4OnIsaWNvbk5hbWU6bix0cmFuc2Zvcm06aSxzeW1ib2w6YSxtYXNrSWQ6cyxleHRyYTpjLHdhdGNoYWJsZTohMH0pXSl9KS5jYXRjaChsKX0pfSxlLmdlbmVyYXRlQWJzdHJhY3RJY29uPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLnRyYW5zZm9ybSxhPWUuc3R5bGVzLG89aHAoYSk7by5sZW5ndGg+MCYmKG4uc3R5bGU9byk7dmFyIHM7cmV0dXJuIGdwKGkpJiYocz14bShgZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nYCx7bWFpbjpyLHRyYW5zZm9ybTppLGNvbnRhaW5lcldpZHRoOnIud2lkdGgsaWNvbldpZHRoOnIud2lkdGh9KSksdC5wdXNoKHN8fHIuaWNvbikse2NoaWxkcmVuOnQsYXR0cmlidXRlczpufX19fSx4aD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2xheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQuY2xhc3NlcyxyPW49PT12b2lkIDA/W106bjtyZXR1cm4gRW0oe3R5cGU6YGxheWVyYH0sZnVuY3Rpb24oKXtibShgYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uYCx7YXNzZW1ibGVyOmUscGFyYW1zOnR9KTt2YXIgbj1bXTtyZXR1cm4gZShmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpP2UubWFwKGZ1bmN0aW9uKGUpe249bi5jb25jYXQoZS5hYnN0cmFjdCl9KTpuPW4uY29uY2F0KGUuYWJzdHJhY3QpfSksW3t0YWc6YHNwYW5gLGF0dHJpYnV0ZXM6e2NsYXNzOltgJHtxLmNzc1ByZWZpeH0tbGF5ZXJzYF0uY29uY2F0KEl1KHIpKS5qb2luKGAgYCl9LGNoaWxkcmVuOm59XX0pfX19fSxTaD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2NvdW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LG49dC50aXRsZSxyPW49PT12b2lkIDA/bnVsbDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIEVtKHt0eXBlOmBjb3VudGVyYCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIGJtKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxNbSh7Y29udGVudDplLnRvU3RyaW5nKCksdGl0bGU6cixleHRyYTp7YXR0cmlidXRlczpzLHN0eWxlczpsLGNsYXNzZXM6W2Ake3EuY3NzUHJlZml4fS1sYXllcnMtY291bnRlcmBdLmNvbmNhdChJdShhKSl9fSl9KX19fX0sQ2g9e21peG91dDpmdW5jdGlvbigpe3JldHVybnt0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9zcDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIEVtKHt0eXBlOmB0ZXh0YCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIGJtKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxqbSh7Y29udGVudDplLHRyYW5zZm9ybTpLKEsoe30sc3ApLHIpLGV4dHJhOnthdHRyaWJ1dGVzOnMsc3R5bGVzOmwsY2xhc3NlczpbYCR7cS5jc3NQcmVmaXh9LWxheWVycy10ZXh0YF0uY29uY2F0KEl1KGEpKX19KX0pfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVMYXllcnNUZXh0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC50cmFuc2Zvcm0scj10LmV4dHJhLGk9bnVsbCxhPW51bGw7aWYoJHUpe3ZhciBvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZSkuZm9udFNpemUsMTApLHM9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpPXMud2lkdGgvbyxhPXMuaGVpZ2h0L299cmV0dXJuIFByb21pc2UucmVzb2x2ZShbZSxqbSh7Y29udGVudDplLmlubmVySFRNTCx3aWR0aDppLGhlaWdodDphLHRyYW5zZm9ybTpuLGV4dHJhOnIsd2F0Y2hhYmxlOiEwfSldKX19fSx3aD1SZWdFeHAoYCJgLGB1Z2ApLFRoPVsxMTA1OTIwLDExMTIzMTldLEVoPUsoSyhLKEsoe30se0ZvbnRBd2Vzb21lOntub3JtYWw6YGZhc2AsNDAwOmBmYXNgfX0pLG5mKSx3ZiksdWYpLERoPU9iamVjdC5rZXlzKEVoKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0LnRvTG93ZXJDYXNlKCldPUVoW3RdLGV9LHt9KSxPaD1PYmplY3Qua2V5cyhEaCkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49RGhbdF07cmV0dXJuIGVbdF09bls5MDBdfHxJdShPYmplY3QuZW50cmllcyhuKSlbMF1bMV0sZX0se30pO2Z1bmN0aW9uIGtoKGUpe3JldHVybiBQcChJdShlLnJlcGxhY2Uod2gsYGApKVswXXx8YGApfWZ1bmN0aW9uIEFoKGUpe3ZhciB0PWUuZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mZWF0dXJlLXNldHRpbmdzYCkuaW5jbHVkZXMoYHNzMDFgKSxuPWUuZ2V0UHJvcGVydHlWYWx1ZShgY29udGVudGApLnJlcGxhY2Uod2gsYGApLHI9bi5jb2RlUG9pbnRBdCgwKSxpPXI+PVRoWzBdJiZyPD1UaFsxXSxhPW4ubGVuZ3RoPT09MiYmblswXT09PW5bMV07cmV0dXJuIGl8fGF8fHR9ZnVuY3Rpb24gamgoZSx0KXt2YXIgbj1lLnJlcGxhY2UoL15bJyJdfFsnIl0kL2csYGApLnRvTG93ZXJDYXNlKCkscj1wYXJzZUludCh0KSxpPWlzTmFOKHIpP2Bub3JtYWxgOnI7cmV0dXJuKERoW25dfHx7fSlbaV18fE9oW25dfWZ1bmN0aW9uIE1oKGUsdCl7dmFyIG49YCR7amZ9JHt0LnJlcGxhY2UoYDpgLGAtYCl9YDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixpKXtpZihlLmdldEF0dHJpYnV0ZShuKSE9PW51bGwpcmV0dXJuIHIoKTt2YXIgYT1kcChlLmNoaWxkcmVuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKEFmKT09PXR9KVswXSxvPUp1LmdldENvbXB1dGVkU3R5bGUoZSx0KSxzPW8uZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mYW1pbHlgKSxjPXMubWF0Y2goWWYpLGw9by5nZXRQcm9wZXJ0eVZhbHVlKGBmb250LXdlaWdodGApLHU9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCk7aWYoYSYmIWMpcmV0dXJuIGUucmVtb3ZlQ2hpbGQoYSkscigpO2lmKGMmJnUhPT1gbm9uZWAmJnUhPT1gYCl7dmFyIGQ9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCksZj1qaChzLGwpLHA9a2goZCksbT1jWzBdLnN0YXJ0c1dpdGgoYEZvbnRBd2Vzb21lYCksaD1BaChvKSxnPVhwKGYscCksXz1nO2lmKG0pe3ZhciB2PWVtKHApO3YuaWNvbk5hbWUmJnYucHJlZml4JiYoZz12Lmljb25OYW1lLGY9di5wcmVmaXgpfWlmKGcmJiFoJiYoIWF8fGEuZ2V0QXR0cmlidXRlKE1mKSE9PWZ8fGEuZ2V0QXR0cmlidXRlKE5mKSE9PV8pKXtlLnNldEF0dHJpYnV0ZShuLF8pLGEmJmUucmVtb3ZlQ2hpbGQoYSk7dmFyIHk9ZGgoKSxiPXkuZXh0cmE7Yi5hdHRyaWJ1dGVzW0FmXT10LExtKGcsZikudGhlbihmdW5jdGlvbihpKXt2YXIgYT1BbShLKEsoe30seSkse30se2ljb25zOnttYWluOmksbWFzazpubSgpfSxwcmVmaXg6ZixpY29uTmFtZTpfLGV4dHJhOmIsd2F0Y2hhYmxlOiEwfSkpLG89WXUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsYHN2Z2ApO3Q9PT1gOjpiZWZvcmVgP2UuaW5zZXJ0QmVmb3JlKG8sZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKG8pLG8ub3V0ZXJIVE1MPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBBcChlKX0pLmpvaW4oYApgKSxlLnJlbW92ZUF0dHJpYnV0ZShuKSxyKCl9KS5jYXRjaChpKX1lbHNlIHIoKX1lbHNlIHIoKX0pfWZ1bmN0aW9uIE5oKGUpe3JldHVybiBQcm9taXNlLmFsbChbTWgoZSxgOjpiZWZvcmVgKSxNaChlLGA6OmFmdGVyYCldKX1mdW5jdGlvbiBQaChlKXtyZXR1cm4gZS5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmIX5JZi5pbmRleE9mKGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSYmIWUuZ2V0QXR0cmlidXRlKEFmKSYmKCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS50YWdOYW1lIT09YHN2Z2ApfXZhciBGaD1mdW5jdGlvbihlKXtyZXR1cm4hIWUmJkxmLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5jbHVkZXModCl9KX0sSWg9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9bmV3IFNldCxuPWUuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSk7bj1uLmZsYXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5jbHVkZXMoYChgKT9lOmUuc3BsaXQoYCxgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSl9KTt2YXIgcj1rdShuKSxpO3RyeXtmb3Ioci5zKCk7IShpPXIubigpKS5kb25lOyl7dmFyIGE9aS52YWx1ZTtpZihGaChhKSl7dmFyIG89TGYucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSh0LGBgKX0sYSk7byE9PWBgJiZvIT09YCpgJiZ0LmFkZChvKX19fWNhdGNoKGUpe3IuZShlKX1maW5hbGx5e3IuZigpfXJldHVybiB0fTtmdW5jdGlvbiBMaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMCYmYXJndW1lbnRzWzFdO2lmKFF1KXt2YXIgbjtpZih0KW49ZTtlbHNlIGlmKHEuc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiluPWUucXVlcnlTZWxlY3RvckFsbChgKmApO2Vsc2V7dmFyIHI9bmV3IFNldCxpPWt1KGRvY3VtZW50LnN0eWxlU2hlZXRzKSxhO3RyeXtmb3IoaS5zKCk7IShhPWkubigpKS5kb25lOyl7dmFyIG89YS52YWx1ZTt0cnl7dmFyIHM9a3Uoby5jc3NSdWxlcyksYzt0cnl7Zm9yKHMucygpOyEoYz1zLm4oKSkuZG9uZTspe3ZhciBsPWMudmFsdWUsdT1rdShJaChsLnNlbGVjdG9yVGV4dCkpLGQ7dHJ5e2Zvcih1LnMoKTshKGQ9dS5uKCkpLmRvbmU7KXt2YXIgZj1kLnZhbHVlO3IuYWRkKGYpfX1jYXRjaChlKXt1LmUoZSl9ZmluYWxseXt1LmYoKX19fWNhdGNoKGUpe3MuZShlKX1maW5hbGx5e3MuZigpfX1jYXRjaChlKXtxLnNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MmJmNvbnNvbGUud2FybihgRm9udCBBd2Vzb21lOiBjYW5ub3QgcGFyc2Ugc3R5bGVzaGVldDogJHtvLmhyZWZ9ICgke2UubWVzc2FnZX0pCklmIGl0IGRlY2xhcmVzIGFueSBGb250IEF3ZXNvbWUgQ1NTIHBzZXVkby1lbGVtZW50cywgdGhleSB3aWxsIG5vdCBiZSByZW5kZXJlZCBhcyBTVkcgaWNvbnMuIEFkZCBjcm9zc29yaWdpbj0iYW5vbnltb3VzIiB0byB0aGUgPGxpbms+LCBlbmFibGUgc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiBmb3Igc2xvd2VyIGJ1dCBtb3JlIHRob3JvdWdoIERPTSBwYXJzaW5nLCBvciBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzIHRvIGZhbHNlLmApfX19Y2F0Y2goZSl7aS5lKGUpfWZpbmFsbHl7aS5mKCl9aWYoIXIuc2l6ZSlyZXR1cm47dmFyIHA9QXJyYXkuZnJvbShyKS5qb2luKGAsIGApO3RyeXtuPWUucXVlcnlTZWxlY3RvckFsbChwKX1jYXRjaHt9fXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe3ZhciByPWRwKG4pLmZpbHRlcihQaCkubWFwKE5oKSxpPVVtLmJlZ2luKGBzZWFyY2hQc2V1ZG9FbGVtZW50c2ApO3JoKCksUHJvbWlzZS5hbGwocikudGhlbihmdW5jdGlvbigpe2koKSxpaCgpLGUoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aSgpLGloKCksdCgpfSl9KX19dmFyIFJoPXtob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2s9TGgsZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLnBzZXVkb0VsZW1lbnRzMnN2Zz1mdW5jdGlvbihlKXt2YXIgdD1lLm5vZGUsbj10PT09dm9pZCAwP1l1OnQ7cS5zZWFyY2hQc2V1ZG9FbGVtZW50cyYmTGgobil9fX0semg9ITEsQmg9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e3Vud2F0Y2g6ZnVuY3Rpb24oKXtyaCgpLHpoPSEwfX19fSxob29rczpmdW5jdGlvbigpe3JldHVybntib290c3RyYXA6ZnVuY3Rpb24oKXtvaCh5bShgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrc2Ase30pKX0sbm9BdXRvOmZ1bmN0aW9uKCl7c2goKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vYnNlcnZlTXV0YXRpb25zUm9vdDt6aD9paCgpOm9oKHltKGBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzYCx7b2JzZXJ2ZU11dGF0aW9uc1Jvb3Q6dH0pKX19fX0sVmg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5zcGxpdChgIGApLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQudG9Mb3dlckNhc2UoKS5zcGxpdChgLWApLHI9blswXSxpPW4uc2xpY2UoMSkuam9pbihgLWApO2lmKHImJmk9PT1gaGApcmV0dXJuIGUuZmxpcFg9ITAsZTtpZihyJiZpPT09YHZgKXJldHVybiBlLmZsaXBZPSEwLGU7aWYoaT1wYXJzZUZsb2F0KGkpLGlzTmFOKGkpKXJldHVybiBlO3N3aXRjaChyKXtjYXNlYGdyb3dgOmUuc2l6ZSs9aTticmVhaztjYXNlYHNocmlua2A6ZS5zaXplLT1pO2JyZWFrO2Nhc2VgbGVmdGA6ZS54LT1pO2JyZWFrO2Nhc2VgcmlnaHRgOmUueCs9aTticmVhaztjYXNlYHVwYDplLnktPWk7YnJlYWs7Y2FzZWBkb3duYDplLnkrPWk7YnJlYWs7Y2FzZWByb3RhdGVgOmUucm90YXRlKz1pfXJldHVybiBlfSx7c2l6ZToxNix4OjAseTowLGZsaXBYOiExLGZsaXBZOiExLHJvdGF0ZTowfSl9LEhoPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGFyc2U6e3RyYW5zZm9ybTpmdW5jdGlvbihlKXtyZXR1cm4gVmgoZSl9fX19LGhvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS10cmFuc2Zvcm1gKTtyZXR1cm4gbiYmKGUudHJhbnNmb3JtPVZoKG4pKSxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWFpbixuPWUudHJhbnNmb3JtLHI9ZS5jb250YWluZXJXaWR0aCxpPWUuaWNvbldpZHRoLGE9e291dGVyOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke3IvMn0gMjU2KWB9LGlubmVyOnt0cmFuc2Zvcm06YCR7YHRyYW5zbGF0ZSgke24ueCozMn0sICR7bi55KjMyfSkgYH0gJHtgc2NhbGUoJHtuLnNpemUvMTYqKG4uZmxpcFg/LTE6MSl9LCAke24uc2l6ZS8xNioobi5mbGlwWT8tMToxKX0pIGB9ICR7YHJvdGF0ZSgke24ucm90YXRlfSAwIDApYH1gfSxwYXRoOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke2kvMiotMX0gLTI1NilgfX07cmV0dXJue3RhZzpgZ2AsYXR0cmlidXRlczpLKHt9LGEub3V0ZXIpLGNoaWxkcmVuOlt7dGFnOmBnYCxhdHRyaWJ1dGVzOksoe30sYS5pbm5lciksY2hpbGRyZW46W3t0YWc6dC5pY29uLnRhZyxjaGlsZHJlbjp0Lmljb24uY2hpbGRyZW4sYXR0cmlidXRlczpLKEsoe30sdC5pY29uLmF0dHJpYnV0ZXMpLGEucGF0aCl9XX1dfX19fSxVaD17eDowLHk6MCx3aWR0aDpgMTAwJWAsaGVpZ2h0OmAxMDAlYH07ZnVuY3Rpb24gV2goZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBlLmF0dHJpYnV0ZXMmJihlLmF0dHJpYnV0ZXMuZmlsbHx8dCkmJihlLmF0dHJpYnV0ZXMuZmlsbD1gYmxhY2tgKSxlfWZ1bmN0aW9uIEdoKGUpe3JldHVybiBlLnRhZz09PWBnYD9lLmNoaWxkcmVuOltlXX12bShbQ3AsYmgseGgsU2gsQ2gsUmgsQmgsSGgse2hvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrYCkscj1uP2NtKG4uc3BsaXQoYCBgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSkpOm5tKCk7cmV0dXJuIHIucHJlZml4fHw9dG0oKSxlLm1hc2s9cixlLm1hc2tJZD10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrLWlkYCksZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLmdlbmVyYXRlQWJzdHJhY3RNYXNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLm1hc2ssYT1lLm1hc2tJZCxvPWUudHJhbnNmb3JtLHM9ci53aWR0aCxjPXIuaWNvbixsPWkud2lkdGgsdT1pLmljb24sZD1fcCh7dHJhbnNmb3JtOm8sY29udGFpbmVyV2lkdGg6bCxpY29uV2lkdGg6c30pLGY9e3RhZzpgcmVjdGAsYXR0cmlidXRlczpLKEsoe30sVWgpLHt9LHtmaWxsOmB3aGl0ZWB9KX0scD1jLmNoaWxkcmVuP3tjaGlsZHJlbjpjLmNoaWxkcmVuLm1hcChXaCl9Ont9LG09e3RhZzpgZ2AsYXR0cmlidXRlczpLKHt9LGQuaW5uZXIpLGNoaWxkcmVuOltXaChLKHt0YWc6Yy50YWcsYXR0cmlidXRlczpLKEsoe30sYy5hdHRyaWJ1dGVzKSxkLnBhdGgpfSxwKSldfSxoPXt0YWc6YGdgLGF0dHJpYnV0ZXM6Syh7fSxkLm91dGVyKSxjaGlsZHJlbjpbbV19LGc9YG1hc2stJHthfHx1cCgpfWAsXz1gY2xpcC0ke2F8fHVwKCl9YCx2PXt0YWc6YG1hc2tgLGF0dHJpYnV0ZXM6SyhLKHt9LFVoKSx7fSx7aWQ6ZyxtYXNrVW5pdHM6YHVzZXJTcGFjZU9uVXNlYCxtYXNrQ29udGVudFVuaXRzOmB1c2VyU3BhY2VPblVzZWB9KSxjaGlsZHJlbjpbZixoXX0seT17dGFnOmBkZWZzYCxjaGlsZHJlbjpbe3RhZzpgY2xpcFBhdGhgLGF0dHJpYnV0ZXM6e2lkOl99LGNoaWxkcmVuOkdoKHUpfSx2XX07cmV0dXJuIHQucHVzaCh5LHt0YWc6YHJlY3RgLGF0dHJpYnV0ZXM6Syh7ZmlsbDpgY3VycmVudENvbG9yYCwiY2xpcC1wYXRoIjpgdXJsKCMke199KWAsbWFzazpgdXJsKCMke2d9KWB9LFVoKX0pLHtjaGlsZHJlbjp0LGF0dHJpYnV0ZXM6bn19fX0se3Byb3ZpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PSExO0p1Lm1hdGNoTWVkaWEmJih0PUp1Lm1hdGNoTWVkaWEoYChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpYCkubWF0Y2hlcyksZS5taXNzaW5nSWNvbkFic3RyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9W10sbj17ZmlsbDpgY3VycmVudENvbG9yYH0scj17YXR0cmlidXRlVHlwZTpgWE1MYCxyZXBlYXRDb3VudDpgaW5kZWZpbml0ZWAsZHVyOmAyc2B9O2UucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOksoSyh7fSxuKSx7fSx7ZDpgTTE1Ni41LDQ0Ny43bC0xMi42LDI5LjVjLTE4LjctOS41LTM1LjktMjEuMi01MS41LTM0LjlsMjIuNy0yMi43QzEyNy42LDQzMC41LDE0MS41LDQ0MCwxNTYuNSw0NDcuN3ogTTQwLjYsMjcySDguNSBjMS40LDIxLjIsNS40LDQxLjcsMTEuNyw2MS4xTDUwLDMyMS4yQzQ1LjEsMzA1LjUsNDEuOCwyODksNDAuNiwyNzJ6IE00MC42LDI0MGMxLjQtMTguOCw1LjItMzcsMTEuMS01NC4xbC0yOS41LTEyLjYgQzE0LjcsMTk0LjMsMTAsMjE2LjcsOC41LDI0MEg0MC42eiBNNjQuMywxNTYuNWM3LjgtMTQuOSwxNy4yLTI4LjgsMjguMS00MS41TDY5LjcsOTIuM2MtMTMuNywxNS42LTI1LjUsMzIuOC0zNC45LDUxLjUgTDY0LjMsMTU2LjV6IE0zOTcsNDE5LjZjLTEzLjksMTItMjkuNCwyMi4zLTQ2LjEsMzAuNGwxMS45LDI5LjhjMjAuNy05LjksMzkuOC0yMi42LDU2LjktMzcuNkwzOTcsNDE5LjZ6IE0xMTUsOTIuNCBjMTMuOS0xMiwyOS40LTIyLjMsNDYuMS0zMC40bC0xMS45LTI5LjhjLTIwLjcsOS45LTM5LjgsMjIuNi01Ni44LDM3LjZMMTE1LDkyLjR6IE00NDcuNywzNTUuNWMtNy44LDE0LjktMTcuMiwyOC44LTI4LjEsNDEuNSBsMjIuNywyMi43YzEzLjctMTUuNiwyNS41LTMyLjksMzQuOS01MS41TDQ0Ny43LDM1NS41eiBNNDcxLjQsMjcyYy0xLjQsMTguOC01LjIsMzctMTEuMSw1NC4xbDI5LjUsMTIuNiBjNy41LTIxLjEsMTIuMi00My41LDEzLjYtNjYuOEg0NzEuNHogTTMyMS4yLDQ2MmMtMTUuNyw1LTMyLjIsOC4yLTQ5LjIsOS40djMyLjFjMjEuMi0xLjQsNDEuNy01LjQsNjEuMS0xMS43TDMyMS4yLDQ2MnogTTI0MCw0NzEuNGMtMTguOC0xLjQtMzctNS4yLTU0LjEtMTEuMWwtMTIuNiwyOS41YzIxLjEsNy41LDQzLjUsMTIuMiw2Ni44LDEzLjZWNDcxLjR6IE00NjIsMTkwLjhjNSwxNS43LDguMiwzMi4yLDkuNCw0OS4yaDMyLjEgYy0xLjQtMjEuMi01LjQtNDEuNy0xMS43LTYxLjFMNDYyLDE5MC44eiBNOTIuNCwzOTdjLTEyLTEzLjktMjIuMy0yOS40LTMwLjQtNDYuMWwtMjkuOCwxMS45YzkuOSwyMC43LDIyLjYsMzkuOCwzNy42LDU2LjkgTDkyLjQsMzk3eiBNMjcyLDQwLjZjMTguOCwxLjQsMzYuOSw1LjIsNTQuMSwxMS4xbDEyLjYtMjkuNUMzMTcuNywxNC43LDI5NS4zLDEwLDI3Miw4LjVWNDAuNnogTTE5MC44LDUwIGMxNS43LTUsMzIuMi04LjIsNDkuMi05LjRWOC41Yy0yMS4yLDEuNC00MS43LDUuNC02MS4xLDExLjdMMTkwLjgsNTB6IE00NDIuMyw5Mi4zTDQxOS42LDExNWMxMiwxMy45LDIyLjMsMjkuNCwzMC41LDQ2LjEgbDI5LjgtMTEuOUM0NzAsMTI4LjUsNDU3LjMsMTA5LjQsNDQyLjMsOTIuM3ogTTM5Nyw5Mi40bDIyLjctMjIuN2MtMTUuNi0xMy43LTMyLjgtMjUuNS01MS41LTM0LjlsLTEyLjYsMjkuNSBDMzcwLjQsNzIuMSwzODQuNCw4MS41LDM5Nyw5Mi40emB9KX0pO3ZhciBpPUsoSyh7fSxyKSx7fSx7YXR0cmlidXRlTmFtZTpgb3BhY2l0eWB9KSxhPXt0YWc6YGNpcmNsZWAsYXR0cmlidXRlczpLKEsoe30sbikse30se2N4OmAyNTZgLGN5OmAzNjRgLHI6YDI4YH0pLGNoaWxkcmVuOltdfTtyZXR1cm4gdHx8YS5jaGlsZHJlbi5wdXNoKHt0YWc6YGFuaW1hdGVgLGF0dHJpYnV0ZXM6SyhLKHt9LHIpLHt9LHthdHRyaWJ1dGVOYW1lOmByYCx2YWx1ZXM6YDI4OzE0OzI4OzI4OzE0OzI4O2B9KX0se3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpLKEsoe30saSkse30se3ZhbHVlczpgMTswOzE7MTswOzE7YH0pfSksZS5wdXNoKGEpLGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOksoSyh7fSxuKSx7fSx7b3BhY2l0eTpgMWAsZDpgTTI2My43LDMxMmgtMTZjLTYuNiwwLTEyLTUuNC0xMi0xMmMwLTcxLDc3LjQtNjMuOSw3Ny40LTEwNy44YzAtMjAtMTcuOC00MC4yLTU3LjQtNDAuMmMtMjkuMSwwLTQ0LjMsOS42LTU5LjIsMjguNyBjLTMuOSw1LTExLjEsNi0xNi4yLDIuNGwtMTMuMS05LjJjLTUuNi0zLjktNi45LTExLjgtMi42LTE3LjJjMjEuMi0yNy4yLDQ2LjQtNDQuNyw5MS4yLTQ0LjdjNTIuMywwLDk3LjQsMjkuOCw5Ny40LDgwLjIgYzAsNjcuNi03Ny40LDYzLjUtNzcuNCwxMDcuOEMyNzUuNywzMDYuNiwyNzAuMywzMTIsMjYzLjcsMzEyemB9KSxjaGlsZHJlbjp0P1tdOlt7dGFnOmBhbmltYXRlYCxhdHRyaWJ1dGVzOksoSyh7fSxpKSx7fSx7dmFsdWVzOmAxOzA7MDswOzA7MTtgfSl9XX0pLHR8fGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOksoSyh7fSxuKSx7fSx7b3BhY2l0eTpgMGAsZDpgTTIzMi41LDEzNC41bDcsMTY4YzAuMyw2LjQsNS42LDExLjUsMTIsMTEuNWg5YzYuNCwwLDExLjctNS4xLDEyLTExLjVsNy0xNjhjMC4zLTYuOC01LjItMTIuNS0xMi0xMi41aC0yMyBDMjM3LjcsMTIyLDIzMi4yLDEyNy43LDIzMi41LDEzNC41emB9KSxjaGlsZHJlbjpbe3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpLKEsoe30saSkse30se3ZhbHVlczpgMDswOzE7MTswOzA7YH0pfV19KSx7dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgbWlzc2luZ2B9LGNoaWxkcmVuOmV9fX19LHtob29rczpmdW5jdGlvbigpe3JldHVybntwYXJzZU5vZGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYGRhdGEtZmEtc3ltYm9sYCk7cmV0dXJuIGUuc3ltYm9sPW49PT1udWxsPyExOm49PT1gYHx8bixlfX19fV0se21peG91dHNUbzp3bX0pLHdtLm5vQXV0byx3bS5jb25maWcsd20ubGlicmFyeSx3bS5kb207dmFyIEtoPXdtLnBhcnNlO3dtLmZpbmRJY29uRGVmaW5pdGlvbix3bS50b0h0bWw7dmFyIHFoPXdtLmljb247d20ubGF5ZXIsd20udGV4dCx3bS5jb3VudGVyO2Z1bmN0aW9uIEpoKGUsdCl7KHQ9PW51bGx8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBZaChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBKaChlKX1mdW5jdGlvbiBYaChlLHQsbil7cmV0dXJuKHQ9YWcodCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gWmgoZSl7aWYodHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVtgQEBpdGVyYXRvcmBdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIFFoKCl7dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uICRoKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZWcoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/JGgoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1hoKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOiRoKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KX1yZXR1cm4gZX1mdW5jdGlvbiB0ZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG4scixpPW5nKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iocj0wO3I8YS5sZW5ndGg7cisrKW49YVtyXSx0LmluZGV4T2Yobik9PT0tMSYme30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYoaVtuXT1lW25dKX1yZXR1cm4gaX1mdW5jdGlvbiBuZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e307Zm9yKHZhciByIGluIGUpaWYoe30uaGFzT3duUHJvcGVydHkuY2FsbChlLHIpKXtpZih0LmluZGV4T2YocikhPT0tMSljb250aW51ZTtuW3JdPWVbcl19cmV0dXJuIG59ZnVuY3Rpb24gcmcoZSl7cmV0dXJuIFloKGUpfHxaaChlKXx8c2coZSl8fFFoKCl9ZnVuY3Rpb24gaWcoZSx0KXtpZih0eXBlb2YgZSE9YG9iamVjdGB8fCFlKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHxgZGVmYXVsdGApO2lmKHR5cGVvZiByIT1gb2JqZWN0YClyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoYEBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuYCl9cmV0dXJuKHQ9PT1gc3RyaW5nYD9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBhZyhlKXt2YXIgdD1pZyhlLGBzdHJpbmdgKTtyZXR1cm4gdHlwZW9mIHQ9PWBzeW1ib2xgP3Q6dCtgYH1mdW5jdGlvbiBvZyhlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBvZz10eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT1gc3ltYm9sYD9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT9gc3ltYm9sYDp0eXBlb2YgZX0sb2coZSl9ZnVuY3Rpb24gc2coZSx0KXtpZihlKXtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIEpoKGUsdCk7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4gbj09PWBPYmplY3RgJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT1gTWFwYHx8bj09PWBTZXRgP0FycmF5LmZyb20oZSk6bj09PWBBcmd1bWVudHNgfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9KaChlLHQpOnZvaWQgMH19ZnVuY3Rpb24gY2coZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MHx8IUFycmF5LmlzQXJyYXkodCkmJnQ/WGgoe30sZSx0KTp7fX1mdW5jdGlvbiBsZyhlKXt2YXIgdCxuPSh0PXsiZmEtc3BpbiI6ZS5zcGluLCJmYS1wdWxzZSI6ZS5wdWxzZSwiZmEtZnciOmUuZml4ZWRXaWR0aCwiZmEtYm9yZGVyIjplLmJvcmRlciwiZmEtbGkiOmUubGlzdEl0ZW0sImZhLWludmVyc2UiOmUuaW52ZXJzZSwiZmEtZmxpcCI6ZS5mbGlwPT09ITAsImZhLWZsaXAtaG9yaXpvbnRhbCI6ZS5mbGlwPT09YGhvcml6b250YWxgfHxlLmZsaXA9PT1gYm90aGAsImZhLWZsaXAtdmVydGljYWwiOmUuZmxpcD09PWB2ZXJ0aWNhbGB8fGUuZmxpcD09PWBib3RoYH0sWGgoWGgoWGgoWGgoWGgoWGgoWGgoWGgoWGgoWGgodCxgZmEtJHtlLnNpemV9YCxlLnNpemUhPT1udWxsKSxgZmEtcm90YXRlLSR7ZS5yb3RhdGlvbn1gLGUucm90YXRpb24hPT1udWxsKSxgZmEtcm90YXRlLWJ5YCxlLnJvdGF0ZUJ5KSxgZmEtcHVsbC0ke2UucHVsbH1gLGUucHVsbCE9PW51bGwpLGBmYS1zd2FwLW9wYWNpdHlgLGUuc3dhcE9wYWNpdHkpLGBmYS1ib3VuY2VgLGUuYm91bmNlKSxgZmEtc2hha2VgLGUuc2hha2UpLGBmYS1iZWF0YCxlLmJlYXQpLGBmYS1mYWRlYCxlLmZhZGUpLGBmYS1iZWF0LWZhZGVgLGUuYmVhdEZhZGUpLFhoKFhoKFhoKFhoKFhoKFhoKFhoKFhoKFhoKFhoKHQsYGZhLWZsYXNoYCxlLmZsYXNoKSxgZmEtc3Bpbi1wdWxzZWAsZS5zcGluUHVsc2UpLGBmYS1zcGluLXJldmVyc2VgLGUuc3BpblJldmVyc2UpLGBmYS13aWR0aC1hdXRvYCxlLndpZHRoQXV0byksYGZhLWNhbnZhcy1zcXVhcmVgLGUuY2FudmFzU3F1YXJlKSxgZmEtY2FudmFzLXJvb215YCxlLmNhbnZhc1Jvb215KSxgZmEtZmxpcC0zNjBgLGUuZmxpcDM2MCksYGZhLWJ1enpgLGUuYnV6eiksYGZhLWZsb2F0YCxlLmZsb2F0KSxgZmEtamVsbG9gLGUuamVsbG8pLFhoKFhoKFhoKFhoKFhoKHQsYGZhLXNwaW4tc25hcGAsZS5zcGluU25hcCksYGZhLXNwaW4tc25hcC00YCxlLnNwaW5TbmFwNCksYGZhLXNwaW4tc25hcC04YCxlLnNwaW5TbmFwOCksYGZhLXN3aW5nYCxlLnN3aW5nKSxgZmEtd2FnYCxlLndhZykpO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV0/ZTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9dmFyIHVnPXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6dHlwZW9mIHNlbGY8YHVgP3NlbGY6e30sZGc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7dmFyIG49ZnVuY3Rpb24oZSx0LHIpe2lmKCFsKHQpfHxkKHQpfHxmKHQpfHxwKHQpfHxjKHQpKXJldHVybiB0O3ZhciBpLGE9MCxvPTA7aWYodSh0KSlmb3IoaT1bXSxvPXQubGVuZ3RoO2E8bzthKyspaS5wdXNoKG4oZSx0W2FdLHIpKTtlbHNlIGZvcih2YXIgcyBpbiBpPXt9LHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihpW2UocyxyKV09bihlLHRbc10scikpO3JldHVybiBpfSxyPWZ1bmN0aW9uKGUsdCl7dHx8PXt9O3ZhciBuPXQuc2VwYXJhdG9yfHxgX2Ascj10LnNwbGl0fHwvKD89W0EtWl0pLztyZXR1cm4gZS5zcGxpdChyKS5qb2luKG4pfSxpPWZ1bmN0aW9uKGUpe3JldHVybiBtKGUpP2U6KGU9ZS5yZXBsYWNlKC9bXC1fXHNdKyguKT8vZyxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKTpgYH0pLGUuc3Vic3RyKDAsMSkudG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKSl9LGE9ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtyZXR1cm4gdC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpfSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSx0KS50b0xvd2VyQ2FzZSgpfSxzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBmdW5jdGlvbmB9LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1PYmplY3QoZSl9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQXJyYXldYH0sZD1mdW5jdGlvbihlKXtyZXR1cm4gcy5jYWxsKGUpPT1gW29iamVjdCBEYXRlXWB9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgUmVnRXhwXWB9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQm9vbGVhbl1gfSxtPWZ1bmN0aW9uKGUpe3JldHVybiBlLT0wLGU9PT1lfSxoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmYHByb2Nlc3NgaW4gdD90LnByb2Nlc3M6dDtyZXR1cm4gdHlwZW9mIG49PWBmdW5jdGlvbmA/ZnVuY3Rpb24odCxyKXtyZXR1cm4gbih0LGUscil9OmV9LGc9e2NhbWVsaXplOmksZGVjYW1lbGl6ZTpvLHBhc2NhbGl6ZTphLGRlcGFzY2FsaXplOm8sY2FtZWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChpLHQpLGUpfSxkZWNhbWVsaXplS2V5czpmdW5jdGlvbihlLHQpe3JldHVybiBuKGgobyx0KSxlLHQpfSxwYXNjYWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChhLHQpLGUpfSxkZXBhc2NhbGl6ZUtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNhbWVsaXplS2V5cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtlLmV4cG9ydHM/ZS5leHBvcnRzPWc6dC5odW1wcz1nfSkodWcpfSkoZGcpO3ZhciBmZz1kZy5leHBvcnRzLHBnPVtgZ3JhZGllbnRGaWxsYF0sbWc9W2BjbGFzc2AsYHN0eWxlYF0saGc9W2B0eXBlYCxgc3RvcHNgLGBpZGBdO2Z1bmN0aW9uIGdnKGUpe3JldHVybiBlLnNwbGl0KGA7YCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQuaW5kZXhPZihgOmApLHI9ZmcuY2FtZWxpemUodC5zbGljZSgwLG4pKTtyZXR1cm4gZVtyXT10LnNsaWNlKG4rMSkudHJpbSgpLGV9LHt9KX1mdW5jdGlvbiBfZyhlKXtyZXR1cm4gZS5zcGxpdCgvXHMrLykucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09ITAsZX0se30pfWZ1bmN0aW9uIHZnKGUsdCl7cmV0dXJuIHRjKGBzdG9wYCxlZyh7a2V5OmAke3R9LSR7ZS5vZmZzZXR9YCxvZmZzZXQ6ZS5vZmZzZXQsInN0b3AtY29sb3IiOmUuY29sb3J9LGUub3BhY2l0eSE9PXZvaWQgMCYmeyJzdG9wLW9wYWNpdHkiOmUub3BhY2l0eX0pKX1mdW5jdGlvbiB5ZyhlKXtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGU7dmFyIHQ9KGUuY2hpbGRyZW58fFtdKS5tYXAoeWcpO3JldHVybiBlLnRhZz09PWBwYXRoYCYmZS5hdHRyaWJ1dGVzJiZgZmlsbGBpbiBlLmF0dHJpYnV0ZXM/ZWcoZWcoe30sZSkse30se2F0dHJpYnV0ZXM6ZWcoZWcoe30sZS5hdHRyaWJ1dGVzKSx7fSx7ZmlsbDp2b2lkIDB9KSxjaGlsZHJlbjp0fSk6ZWcoZWcoe30sZSkse30se2NoaWxkcmVuOnR9KX1mdW5jdGlvbiBiZyhlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sbj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e307aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBlO3ZhciByPXQuZ3JhZGllbnRGaWxsLGk9cj09PXZvaWQgMD9udWxsOnIsYT10Zyh0LHBnKSxvPWl8fGBmaWxsYGluIG4/eWcoZSk6ZSxzPShvLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBiZyhlLHt9LHt9KX0pLGM9T2JqZWN0LmtleXMoby5hdHRyaWJ1dGVzfHx7fSkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49by5hdHRyaWJ1dGVzW3RdO3N3aXRjaCh0KXtjYXNlYGNsYXNzYDplLmNsYXNzPV9nKG4pO2JyZWFrO2Nhc2Vgc3R5bGVgOmUuc3R5bGU9Z2cobik7YnJlYWs7ZGVmYXVsdDplLmF0dHJzW3RdPW59cmV0dXJuIGV9LHthdHRyczp7fSxjbGFzczp7fSxzdHlsZTp7fX0pO24uY2xhc3M7dmFyIGw9bi5zdHlsZSx1PWw9PT12b2lkIDA/e306bCxkPXRnKG4sbWcpO2lmKGkmJmkuaWQmJihpLnR5cGU9PT1gbGluZWFyYHx8aS50eXBlPT09YHJhZGlhbGApKXt2YXIgZj1pLnR5cGUscD1pLnN0b3BzLG09cD09PXZvaWQgMD9bXTpwLGg9aS5pZCxnPXRnKGksaGcpLF89dGMoZj09PWBsaW5lYXJgP2BsaW5lYXJHcmFkaWVudGA6YHJhZGlhbEdyYWRpZW50YCxlZyhlZyh7fSxnKSx7fSx7aWQ6aH0pLG0ubWFwKHZnKSk7cmV0dXJuIHRjKG8udGFnLGVnKGVnKGVnKGVnKHt9LGEpLHt9LHtjbGFzczpjLmNsYXNzLHN0eWxlOmVnKGVnKHt9LGMuc3R5bGUpLHUpfSxjLmF0dHJzKSxkKSx7fSx7ZmlsbDpgdXJsKCMke2h9KWB9KSxbX10uY29uY2F0KHJnKHMpKSl9cmV0dXJuIHRjKGUudGFnLGVnKGVnKGVnKHt9LGEpLHt9LHtjbGFzczpjLmNsYXNzLHN0eWxlOmVnKGVnKHt9LGMuc3R5bGUpLHUpfSxjLmF0dHJzKSxkKSxzKX12YXIgeGc9ITE7dHJ5e3hnPSEwfWNhdGNoe31mdW5jdGlvbiBTZygpe2lmKCF4ZyYmY29uc29sZSYmdHlwZW9mIGNvbnNvbGUuZXJyb3I9PWBmdW5jdGlvbmApe3ZhciBlOyhlPWNvbnNvbGUpLmVycm9yLmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gQ2coZSl7aWYoZSYmb2coZSk9PT1gb2JqZWN0YCYmZS5wcmVmaXgmJmUuaWNvbk5hbWUmJmUuaWNvbilyZXR1cm4gZTtpZihLaC5pY29uKXJldHVybiBLaC5pY29uKGUpO2lmKGU9PT1udWxsKXJldHVybiBudWxsO2lmKG9nKGUpPT09YG9iamVjdGAmJmUucHJlZml4JiZlLmljb25OYW1lKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MilyZXR1cm57cHJlZml4OmVbMF0saWNvbk5hbWU6ZVsxXX07aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybntwcmVmaXg6YGZhc2AsaWNvbk5hbWU6ZX19dmFyIHdnPUYoe25hbWU6YEZvbnRBd2Vzb21lSWNvbmAscHJvcHM6e2JvcmRlcjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZpeGVkV2lkdGg6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxmbGlwOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuWyEwLCExLGBob3Jpem9udGFsYCxgdmVydGljYWxgLGBib3RoYF0uaW5kZXhPZihlKT4tMX19LGljb246e3R5cGU6W09iamVjdCxBcnJheSxTdHJpbmddLHJlcXVpcmVkOiEwfSxtYXNrOnt0eXBlOltPYmplY3QsQXJyYXksU3RyaW5nXSxkZWZhdWx0Om51bGx9LG1hc2tJZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsfSxsaXN0SXRlbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHB1bGw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuW2ByaWdodGAsYGxlZnRgXS5pbmRleE9mKGUpPi0xfX0scHVsc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxyb3RhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bOTAsMTgwLDI3MF0uaW5kZXhPZihOdW1iZXIucGFyc2VJbnQoZSwxMCkpPi0xfX0scm90YXRlQnk6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzd2FwT3BhY2l0eTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuW2AyeHNgLGB4c2AsYHNtYCxgbGdgLGB4bGAsYDJ4bGAsYDF4YCxgMnhgLGAzeGAsYDR4YCxgNXhgLGA2eGAsYDd4YCxgOHhgLGA5eGAsYDEweGBdLmluZGV4T2YoZSk+LTF9fSxzcGluOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdHJhbnNmb3JtOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxkZWZhdWx0Om51bGx9LHN5bWJvbDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHRpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0Om51bGx9LHRpdGxlSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbH0saW52ZXJzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJvdW5jZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNoYWtlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYmVhdDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZhZGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxiZWF0RmFkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsYXNoOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc3BpblB1bHNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc3BpblJldmVyc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx3aWR0aEF1dG86e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxjYW52YXNTcXVhcmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxjYW52YXNSb29teTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGdyYWRpZW50RmlsbDp7dHlwZTpPYmplY3QsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGUuaWQhPWBzdHJpbmdgfHwhZS5pZD8oY29uc29sZS53YXJuKGBGb250QXdlc29tZUljb246IGdyYWRpZW50RmlsbC5pZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApLCExKTplLnR5cGUhPT1gbGluZWFyYCYmZS50eXBlIT09YHJhZGlhbGA/KGNvbnNvbGUud2FybihgRm9udEF3ZXNvbWVJY29uOiBncmFkaWVudEZpbGwudHlwZSBtdXN0IGJlICJsaW5lYXIiIG9yICJyYWRpYWwiYCksITEpOiEwfX0sZmxpcDM2MDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJ1eno6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxmbG9hdDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGplbGxvOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc3BpblNuYXA6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluU25hcDQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluU25hcDg6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzd2luZzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHdhZzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxzZXR1cDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuYXR0cnMscj1XKGZ1bmN0aW9uKCl7cmV0dXJuIENnKGUuaWNvbil9KSxpPVcoZnVuY3Rpb24oKXtyZXR1cm4gY2coYGNsYXNzZXNgLGxnKGUpKX0pLGE9VyhmdW5jdGlvbigpe3JldHVybiBjZyhgdHJhbnNmb3JtYCx0eXBlb2YgZS50cmFuc2Zvcm09PWBzdHJpbmdgP0toLnRyYW5zZm9ybShlLnRyYW5zZm9ybSk6ZS50cmFuc2Zvcm0pfSksbz1XKGZ1bmN0aW9uKCl7cmV0dXJuIGNnKGBtYXNrYCxDZyhlLm1hc2spKX0pLHM9VyhmdW5jdGlvbigpe3ZhciB0PWVnKGVnKGVnKGVnKHt9LGkudmFsdWUpLGEudmFsdWUpLG8udmFsdWUpLHt9LHtzeW1ib2w6ZS5zeW1ib2wsbWFza0lkOmUubWFza0lkfSk7cmV0dXJuIHQudGl0bGU9ZS50aXRsZSx0LnRpdGxlSWQ9ZS50aXRsZUlkLHFoKHIudmFsdWUsdCl9KTtFcihzLGZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBTZyhgQ291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgaWNvbihzKWAsci52YWx1ZSxvLnZhbHVlKX0se2ltbWVkaWF0ZTohMH0pLGUuZ3JhZGllbnRGaWxsJiZlLnN5bWJvbCYmU2coYGdyYWRpZW50RmlsbCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gc3ltYm9sIGlzIHRydWUgYW5kIHdpbGwgYmUgaWdub3JlZGApO3ZhciBjPVcoZnVuY3Rpb24oKXtyZXR1cm4gcy52YWx1ZT9iZyhzLnZhbHVlLmFic3RyYWN0WzBdLHtncmFkaWVudEZpbGw6ZS5zeW1ib2w/bnVsbDplLmdyYWRpZW50RmlsbH0sbik6bnVsbH0pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjLnZhbHVlfX19KSxUZz10eXBlb2Ygd2luZG93PGB1YCxFZyxEZz1lPT5FZz1lLE9nPVN5bWJvbCgpO2Z1bmN0aW9uIGtnKGUpe3JldHVybiBlJiZ0eXBlb2YgZT09YG9iamVjdGAmJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKT09PWBbb2JqZWN0IE9iamVjdF1gJiZ0eXBlb2YgZS50b0pTT04hPWBmdW5jdGlvbmB9dmFyIEFnPXR5cGVvZiB3aW5kb3c9PWBvYmplY3RgJiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzp0eXBlb2Ygc2VsZj09YG9iamVjdGAmJnNlbGYuc2VsZj09PXNlbGY/c2VsZjp0eXBlb2YgZ2xvYmFsPT1gb2JqZWN0YCYmZ2xvYmFsLmdsb2JhbD09PWdsb2JhbD9nbG9iYWw6dHlwZW9mIGdsb2JhbFRoaXM9PWBvYmplY3RgP2dsb2JhbFRoaXM6e0hUTUxFbGVtZW50Om51bGx9O2Z1bmN0aW9uIGpnKGUse2F1dG9Cb206dD0hMX09e30pe3JldHVybiB0JiYvXlxzKig/OnRleHRcL1xTKnxhcHBsaWNhdGlvblwveG1sfFxTKlwvXFMqXCt4bWwpXHMqOy4qY2hhcnNldFxzKj1ccyp1dGYtOC9pLnRlc3QoZS50eXBlKT9uZXcgQmxvYihbYO+7v2AsZV0se3R5cGU6ZS50eXBlfSk6ZX1mdW5jdGlvbiBNZyhlLHQsbil7bGV0IHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3BlbihgR0VUYCxlKSxyLnJlc3BvbnNlVHlwZT1gYmxvYmAsci5vbmxvYWQ9ZnVuY3Rpb24oKXtMZyhyLnJlc3BvbnNlLHQsbil9LHIub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoYGNvdWxkIG5vdCBkb3dubG9hZCBmaWxlYCl9LHIuc2VuZCgpfWZ1bmN0aW9uIE5nKGUpe2xldCB0PW5ldyBYTUxIdHRwUmVxdWVzdDt0Lm9wZW4oYEhFQURgLGUsITEpO3RyeXt0LnNlbmQoKX1jYXRjaHt9cmV0dXJuIHQuc3RhdHVzPj0yMDAmJnQuc3RhdHVzPD0yOTl9ZnVuY3Rpb24gUGcoZSl7dHJ5e2UuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChgY2xpY2tgKSl9Y2F0Y2h7bGV0IHQ9bmV3IE1vdXNlRXZlbnQoYGNsaWNrYCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLHZpZXc6d2luZG93LGRldGFpbDowLHNjcmVlblg6ODAsc2NyZWVuWToyMCxjbGllbnRYOjgwLGNsaWVudFk6MjAsY3RybEtleTohMSxhbHRLZXk6ITEsc2hpZnRLZXk6ITEsbWV0YUtleTohMSxidXR0b246MCxyZWxhdGVkVGFyZ2V0Om51bGx9KTtlLmRpc3BhdGNoRXZlbnQodCl9fXZhciBGZz10eXBlb2YgbmF2aWdhdG9yPT1gb2JqZWN0YD9uYXZpZ2F0b3I6e3VzZXJBZ2VudDpgYH0sSWc9L01hY2ludG9zaC8udGVzdChGZy51c2VyQWdlbnQpJiYvQXBwbGVXZWJLaXQvLnRlc3QoRmcudXNlckFnZW50KSYmIS9TYWZhcmkvLnRlc3QoRmcudXNlckFnZW50KSxMZz1UZz90eXBlb2YgSFRNTEFuY2hvckVsZW1lbnQ8YHVgJiZgZG93bmxvYWRgaW4gSFRNTEFuY2hvckVsZW1lbnQucHJvdG90eXBlJiYhSWc/Umc6YG1zU2F2ZU9yT3BlbkJsb2JgaW4gRmc/emc6Qmc6KCk9Pnt9O2Z1bmN0aW9uIFJnKGUsdD1gZG93bmxvYWRgLG4pe2xldCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGFgKTtyLmRvd25sb2FkPXQsci5yZWw9YG5vb3BlbmVyYCx0eXBlb2YgZT09YHN0cmluZ2A/KHIuaHJlZj1lLHIub3JpZ2luPT09bG9jYXRpb24ub3JpZ2luP1BnKHIpOk5nKHIuaHJlZik/TWcoZSx0LG4pOihyLnRhcmdldD1gX2JsYW5rYCxQZyhyKSkpOihyLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VVJMLnJldm9rZU9iamVjdFVSTChyLmhyZWYpfSw0ZTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtQZyhyKX0sMCkpfWZ1bmN0aW9uIHpnKGUsdD1gZG93bmxvYWRgLG4pe2lmKHR5cGVvZiBlPT1gc3RyaW5nYCl7aWYoTmcoZSkpTWcoZSx0LG4pO2Vsc2V7bGV0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgYWApO3QuaHJlZj1lLHQudGFyZ2V0PWBfYmxhbmtgLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtQZyh0KX0pfX1lbHNlIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGpnKGUsbiksdCl9ZnVuY3Rpb24gQmcoZSx0LG4scil7aWYocnx8PW9wZW4oYGAsYF9ibGFua2ApLHImJihyLmRvY3VtZW50LnRpdGxlPXIuZG9jdW1lbnQuYm9keS5pbm5lclRleHQ9YGRvd25sb2FkaW5nLi4uYCksdHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBNZyhlLHQsbik7bGV0IGk9ZS50eXBlPT09YGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbWAsYT0vY29uc3RydWN0b3IvaS50ZXN0KFN0cmluZyhBZy5IVE1MRWxlbWVudCkpfHxgc2FmYXJpYGluIEFnLG89L0NyaU9TXC9bXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigob3x8aSYmYXx8SWcpJiZ0eXBlb2YgRmlsZVJlYWRlcjxgdWApe2xldCB0PW5ldyBGaWxlUmVhZGVyO3Qub25sb2FkZW5kPWZ1bmN0aW9uKCl7bGV0IGU9dC5yZXN1bHQ7aWYodHlwZW9mIGUhPWBzdHJpbmdgKXRocm93IHI9bnVsbCxFcnJvcihgV3JvbmcgcmVhZGVyLnJlc3VsdCB0eXBlYCk7ZT1vP2U6ZS5yZXBsYWNlKC9eZGF0YTpbXjtdKjsvLGBkYXRhOmF0dGFjaG1lbnQvZmlsZTtgKSxyP3IubG9jYXRpb24uaHJlZj1lOmxvY2F0aW9uLmFzc2lnbihlKSxyPW51bGx9LHQucmVhZEFzRGF0YVVSTChlKX1lbHNle2xldCB0PVVSTC5jcmVhdGVPYmplY3RVUkwoZSk7cj9yLmxvY2F0aW9uLmFzc2lnbih0KTpsb2NhdGlvbi5ocmVmPXQscj1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtVUkwucmV2b2tlT2JqZWN0VVJMKHQpfSw0ZTQpfX12YXJ7YXNzaWduOlZnfT1PYmplY3Q7ZnVuY3Rpb24gSGcoKXtsZXQgZT1QZSghMCksdD1lLnJ1bigoKT0+TSh7fSkpLG49W10scj1bXSxpPXNuKHtpbnN0YWxsKGUpe0RnKGkpLGkuX2E9ZSxlLnByb3ZpZGUoT2csaSksZS5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kcGluaWE9aSxyLmZvckVhY2goZT0+bi5wdXNoKGUpKSxyPVtdfSx1c2UoZSl7cmV0dXJuIHRoaXMuX2E/bi5wdXNoKGUpOnIucHVzaChlKSx0aGlzfSxfcDpuLF9hOm51bGwsX2U6ZSxfczpuZXcgTWFwLHN0YXRlOnR9KTtyZXR1cm4gaX12YXIgVWc9KCk9Pnt9O2Z1bmN0aW9uIFdnKGUsdCxuLHI9VWcpe2UuYWRkKHQpO2xldCBpPSgpPT57ZS5kZWxldGUodCkmJnIoKX07cmV0dXJuIW4mJkZlKCkmJkllKGkpLGl9ZnVuY3Rpb24gR2coZSwuLi50KXtlLmZvckVhY2goZT0+e2UoLi4udCl9KX12YXIgS2c9ZT0+ZSgpLHFnPVN5bWJvbCgpLEpnPVN5bWJvbCgpO2Z1bmN0aW9uIFlnKGUsdCl7ZSBpbnN0YW5jZW9mIE1hcCYmdCBpbnN0YW5jZW9mIE1hcD90LmZvckVhY2goKHQsbik9PmUuc2V0KG4sdCkpOmUgaW5zdGFuY2VvZiBTZXQmJnQgaW5zdGFuY2VvZiBTZXQmJnQuZm9yRWFjaChlLmFkZCxlKTtmb3IobGV0IG4gaW4gdCl7aWYoIU9iamVjdC5oYXNPd24odCxuKSljb250aW51ZTtsZXQgcj10W25dLGk9ZVtuXTtlW25dPWtnKGkpJiZrZyhyKSYmT2JqZWN0Lmhhc093bihlLG4pJiYhaihyKSYmIW5uKHIpP1lnKGkscik6cn1yZXR1cm4gZX12YXIgWGc9U3ltYm9sKCk7ZnVuY3Rpb24gWmcoZSl7cmV0dXJuIWV8fHR5cGVvZiBlIT1gb2JqZWN0YHx8IU9iamVjdC5oYXNPd24oZSxYZyl9dmFye2Fzc2lnbjpRZ309T2JqZWN0O2Z1bmN0aW9uICRnKGUpe3JldHVybiEhKGooZSkmJmUuZWZmZWN0KX1mdW5jdGlvbiBlXyhlLHQsbixyKXtsZXR7c3RhdGU6aSxhY3Rpb25zOmEsZ2V0dGVyczpvfT10LHM9bi5zdGF0ZS52YWx1ZVtlXSxjO2Z1bmN0aW9uIGwoKXtyZXR1cm4gc3x8KG4uc3RhdGUudmFsdWVbZV09aT9pKCk6e30pLFFnKHluKG4uc3RhdGUudmFsdWVbZV0pLGEsT2JqZWN0LmtleXMob3x8e30pLnJlZHVjZSgodCxyKT0+KHRbcl09c24oVygoKT0+e0RnKG4pO2xldCB0PW4uX3MuZ2V0KGUpO3JldHVybiBvW3JdLmNhbGwodCx0KX0pKSx0KSx7fSkpfXJldHVybiBjPXRfKGUsbCx0LG4sciwhMCksY31mdW5jdGlvbiB0XyhlLHQsbj17fSxyLGksYSl7bGV0IG8scz1RZyh7YWN0aW9uczp7fX0sbiksYz17ZGVlcDohMH0sbCx1LGQ9bmV3IFNldCxmPW5ldyBTZXQscCxtPXIuc3RhdGUudmFsdWVbZV07IWEmJiFtJiYoci5zdGF0ZS52YWx1ZVtlXT17fSk7bGV0IGg7ZnVuY3Rpb24gZyh0KXtsZXQgbjtsPXU9ITEsdHlwZW9mIHQ9PWBmdW5jdGlvbmA/KHQoci5zdGF0ZS52YWx1ZVtlXSksbj17dHlwZTpgcGF0Y2ggZnVuY3Rpb25gLHN0b3JlSWQ6ZSxldmVudHM6cH0pOihZZyhyLnN0YXRlLnZhbHVlW2VdLHQpLG49e3R5cGU6YHBhdGNoIG9iamVjdGAscGF5bG9hZDp0LHN0b3JlSWQ6ZSxldmVudHM6cH0pO2xldCBpPWg9U3ltYm9sKCk7UW4oKS50aGVuKCgpPT57aD09PWkmJihsPSEwKX0pLHU9ITAsR2coZCxuLHIuc3RhdGUudmFsdWVbZV0pfWxldCBfPWE/ZnVuY3Rpb24oKXtsZXR7c3RhdGU6ZX09bix0PWU/ZSgpOnt9O3RoaXMuJHBhdGNoKGU9PntRZyhlLHQpfSl9OlVnO2Z1bmN0aW9uIHYoKXtvLnN0b3AoKSxkLmNsZWFyKCksZi5jbGVhcigpLHIuX3MuZGVsZXRlKGUpfWxldCB5PSh0LG49YGApPT57aWYocWcgaW4gdClyZXR1cm4gdFtKZ109bix0O2xldCBpPWZ1bmN0aW9uKCl7RGcocik7bGV0IG49QXJyYXkuZnJvbShhcmd1bWVudHMpLGE9bmV3IFNldCxvPW5ldyBTZXQ7ZnVuY3Rpb24gcyhlKXthLmFkZChlKX1mdW5jdGlvbiBjKGUpe28uYWRkKGUpfUdnKGYse2FyZ3M6bixuYW1lOmlbSmddLHN0b3JlOmIsYWZ0ZXI6cyxvbkVycm9yOmN9KTtsZXQgbDt0cnl7bD10LmFwcGx5KHRoaXMmJnRoaXMuJGlkPT09ZT90aGlzOmIsbil9Y2F0Y2goZSl7dGhyb3cgR2cobyxlKSxlfXJldHVybiBsIGluc3RhbmNlb2YgUHJvbWlzZT9sLnRoZW4oZT0+KEdnKGEsZSksZSkpLmNhdGNoKGU9PihHZyhvLGUpLFByb21pc2UucmVqZWN0KGUpKSk6KEdnKGEsbCksbCl9O3JldHVybiBpW3FnXT0hMCxpW0pnXT1uLGl9LGI9WnQoe19wOnIsJGlkOmUsJG9uQWN0aW9uOldnLmJpbmQobnVsbCxmKSwkcGF0Y2g6ZywkcmVzZXQ6Xywkc3Vic2NyaWJlKHQsbj17fSl7aWYoZC5oYXModCkpcmV0dXJuIFVnO2xldCBpPVdnKGQsdCxuLmRldGFjaGVkLCgpPT5hKCkpLGE9by5ydW4oKCk9PkVyKCgpPT5yLnN0YXRlLnZhbHVlW2VdLHI9Pnsobi5mbHVzaD09PWBzeW5jYD91OmwpJiZ0KHtzdG9yZUlkOmUsdHlwZTpgZGlyZWN0YCxldmVudHM6cH0scil9LFFnKHt9LGMsbikpKTtyZXR1cm4gaX0sJGRpc3Bvc2U6dn0pO3IuX3Muc2V0KGUsYik7bGV0IHg9KHIuX2EmJnIuX2EucnVuV2l0aENvbnRleHR8fEtnKSgoKT0+ci5fZS5ydW4oKCk9PihvPVBlKCkpLnJ1bigoKT0+dCh7YWN0aW9uOnl9KSkpKTtmb3IobGV0IHQgaW4geCl7bGV0IG49eFt0XTtqKG4pJiYhJGcobil8fG5uKG4pP2F8fChtJiZaZyhuKSYmKGoobik/bi52YWx1ZT1tW3RdOigobiBpbnN0YW5jZW9mIFNldHx8biBpbnN0YW5jZW9mIE1hcCkmJm4uY2xlYXIoKSxZZyhuLG1bdF0pKSksci5zdGF0ZS52YWx1ZVtlXVt0XT1uKTp0eXBlb2Ygbj09YGZ1bmN0aW9uYCYmKHhbdF09eShuLHQpLHMuYWN0aW9uc1t0XT1uKX1yZXR1cm4gUWcoYix4KSxRZyhBKGIpLHgpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCIkc3RhdGUiLHtnZXQ6KCk9PnIuc3RhdGUudmFsdWVbZV0sc2V0OmU9PntnKHQ9PntRZyh0LGUpfSl9fSksci5fcC5mb3JFYWNoKGU9PntsZXQgdD1vLnJ1bigoKT0+ZSh7c3RvcmU6YixhcHA6ci5fYSxwaW5pYTpyLG9wdGlvbnM6c30pKTtRZyhiLHQpfSksbSYmYSYmbi5oeWRyYXRlJiZuLmh5ZHJhdGUoYi4kc3RhdGUsbSksbD0hMCx1PSEwLGJ9ZnVuY3Rpb24gbl8oZSx0LG4pe2xldCByLGk9dHlwZW9mIHQ9PWBmdW5jdGlvbmA7cj1pP246dDtmdW5jdGlvbiBhKG4sYSl7bGV0IG89YnIoKTtyZXR1cm4gbnx8PW8/eXIoT2csbnVsbCk6bnVsbCxuJiZEZyhuKSxuPUVnLG4uX3MuaGFzKGUpfHwoaT90XyhlLHQscixuKTplXyhlLHIsbikpLG4uX3MuZ2V0KGUpfXJldHVybiBhLiRpZD1lLGF9dmFyIHJfPXtwcmVmaXg6YGZhYmAsaWNvbk5hbWU6YGdpdGh1YmAsaWNvbjpbNTEyLDUxMixbXSxgZjA5YmAsYE0yMTYuNSAzNjIuNWMtNjYtOC0xMTIuNS01NS41LTExMi41LTExNyAwLTI1IDktNTIgMjQtNzAtNi41LTE2LjUtNS41LTUxLjUgMi02NiAyMC0yLjUgNDcgOCA2MyAyMi41IDE5LTYgMzktOSA2My41LTlzNDQuNSAzIDYyLjUgOC41YzE1LjUtMTQgNDMtMjQuNSA2My0yMiA3IDEzLjUgOCA0OC41IDEuNSA2NS41IDE2IDE5IDI0LjUgNDQuNSAyNC41IDcwLjUgMCA2MS41LTQ2LjUgMTA4LTExMy41IDExNi41IDE3IDExIDI4LjUgMzUgMjguNSA2Mi41bDAgNTJDMzIzIDQ5MS41IDMzNS41IDUwMCAzNTAuNSA0OTQgNDQxIDQ1OS41IDUxMiAzNjkgNTEyIDI1NyA1MTIgMTE1LjUgMzk3IDAgMjU1LjUgMFMwIDExNS41IDAgMjU3YzAgMTExIDcwLjUgMjAzIDE2NS41IDIzNy41IDEzLjUgNSAyNi41LTQgMjYuNS0xNy41bDAtNDBjLTcgMy0xNiA1LTI0IDUtMzMgMC01Mi41LTE4LTY2LjUtNTEuNS01LjUtMTMuNS0xMS41LTIxLjUtMjMtMjMtNi0uNS04LTMtOC02IDAtNiAxMC0xMC41IDIwLTEwLjUgMTQuNSAwIDI3IDkgNDAgMjcuNSAxMCAxNC41IDIwLjUgMjEgMzMgMjFzMjAuNS00LjUgMzItMTZjOC41LTguNSAxNS0xNiAyMS0yMXpgXX0saV89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgbWFnbmlmeWluZy1nbGFzc2AsaWNvbjpbNTEyLDUxMixbMTI4MjY5LGBzZWFyY2hgXSxgZjAwMmAsYE00MTYgMjA4YzAgNDUuOS0xNC45IDg4LjMtNDAgMTIyLjdMNTAyLjYgNDU3LjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMzMwLjcgMzc2QzI5Ni4zIDQwMS4xIDI1My45IDQxNiAyMDggNDE2IDkzLjEgNDE2IDAgMzIyLjkgMCAyMDhTOTMuMSAwIDIwOCAwIDQxNiA5My4xIDQxNiAyMDh6TTIwOCAzNTJhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4emBdfSxhXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBrZXlgLGljb246WzUxMiw1MTIsWzEyODI3M10sYGYwODRgLGBNMzM2IDM1MmM5Ny4yIDAgMTc2LTc4LjggMTc2LTE3NlM0MzMuMiAwIDMzNiAwIDE2MCA3OC44IDE2MCAxNzZjMCAxOC43IDIuOSAzNi44IDguMyA1My43TDcgMzkxYy00LjUgNC41LTcgMTAuNi03IDE3bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQwIDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00MCA0MCAwYzYuNCAwIDEyLjUtMi41IDE3LTdsMzMuMy0zMy4zYzE2LjkgNS40IDM1IDguMyA1My43IDguM3pNMzc2IDk2YTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHpgXX0sb189e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgc29ydC11cGAsaWNvbjpbMzg0LDUxMixbYHNvcnQtYXNjYF0sYGYwZGVgLGBNMzIgMjI0Yy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44Uy4yIDE3OC41IDkuNCAxNjkuNGwxNjAtMTYwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE2MCAxNjBjOS4yIDkuMiAxMS45IDIyLjkgNi45IDM0LjlTMzY0LjkgMjI0IDM1MiAyMjRMMzIgMjI0emBdfSxzXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBleWVgLGljb246WzU3Niw1MTIsWzEyODA2NV0sYGYwNmVgLGBNMjg4IDMyYy04MC44IDAtMTQ1LjUgMzYuOC0xOTIuNiA4MC42LTQ2LjggNDMuNS03OC4xIDk1LjQtOTMgMTMxLjEtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjYgMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMSA0Ny4xIDQzLjcgMTExLjggODAuNiAxOTIuNiA4MC42czE0NS41LTM2LjggMTkyLjYtODAuNmM0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNnpNMTQ0IDI1NmExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0xNDQtNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjQtMTEuNSAwLTIyLjMtMy0zMS43LTguNC0xIDEwLjktLjEgMjIuMSAyLjkgMzMuMiAxMy43IDUxLjIgNjYuNCA4MS42IDExNy42IDY3LjlzODEuNi02Ni40IDY3LjktMTE3LjZjLTEyLjItNDUuNy01NS41LTc0LjgtMTAxLjEtNzAuOCA1LjMgOS4zIDguNCAyMC4xIDguNCAzMS43emBdfSxjXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaGV2cm9uLXVwYCxpY29uOls0NDgsNTEyLFtdLGBmMDc3YCxgTTIwMS40IDEwNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE5MiAxOTJjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMjI0IDE3My4zIDU0LjYgMzQyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDE5Mi0xOTJ6YF19LGxfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS14bWFya2AsaWNvbjpbNTEyLDUxMixbNjE1MzIsYHRpbWVzLWNpcmNsZWAsYHhtYXJrLWNpcmNsZWBdLGBmMDU3YCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNjcgMTY3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDU1IDU1IDU1LTU1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNTUgNTUgNTUgNTVjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNTUtNTUtNTUgNTVjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNTUtNTUtNTUtNTVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45emBdfSx1Xz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaXJjbGUtZXhjbGFtYXRpb25gLGljb246WzUxMiw1MTIsW2BleGNsYW1hdGlvbi1jaXJjbGVgXSxgZjA2YWAsYE0yNTYgNTEyYTI1NiAyNTYgMCAxIDEgMC01MTIgMjU2IDI1NiAwIDEgMSAwIDUxMnptMC0xOTJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em0wLTE5MmMtMTguMiAwLTMyLjcgMTUuNS0zMS40IDMzLjdsNy40IDEwNGMuOSAxMi42IDExLjQgMjIuMyAyMy45IDIyLjMgMTIuNiAwIDIzLTkuNyAyMy45LTIyLjNsNy40LTEwNGMxLjMtMTguMi0xMy4xLTMzLjctMzEuNC0zMy43emBdfSxkXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaGVja2AsaWNvbjpbNDQ4LDUxMixbMTAwMDMsMTAwMDRdLGBmMDBjYCxgTTQzNC44IDcwLjFjMTQuMyAxMC40IDE3LjUgMzAuNCA3LjEgNDQuN2wtMjU2IDM1MmMtNS41IDcuNi0xNCAxMi4zLTIzLjQgMTMuMXMtMTguNS0yLjctMjUuMS05LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsMTAxLjUgMTAxLjUgMjM0LTMyMS43YzEwLjQtMTQuMyAzMC40LTE3LjUgNDQuNy03LjF6YF19LGZfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YHNvcnRgLGljb246WzM4NCw1MTIsW2B1bnNvcnRlZGBdLGBmMGRjYCxgTTIuNCAyMDQuMmM1IDEyIDE2LjYgMTkuOCAyOS42IDE5LjhsMzIwIDBjMTIuOSAwIDI0LjYtNy44IDI5LjYtMTkuOHMyLjItMjUuNy02LjktMzQuOWwtMTYwLTE2MGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjBjLTkuMiA5LjItMTEuOSAyMi45LTYuOSAzNC45em0wIDEwMy41Yy01IDEyLTIuMiAyNS43IDYuOSAzNC45bDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzNjQuOSAyODggMzUyIDI4OEwzMiAyODhjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5Ljh6YF19LHBfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YHhtYXJrYCxpY29uOlszODQsNTEyLFsxMjg0NzMsMTAwMDUsMTAwMDYsMTAwNjAsMjE1LGBjbG9zZWAsYG11bHRpcGx5YCxgcmVtb3ZlYCxgdGltZXNgXSxgZjAwZGAsYE01NS4xIDczLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDE0Ny4yIDI1NiA5LjkgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTkyLjUgMzAxLjMgMzI5LjkgNDM4LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wyMzcuOCAyNTYgMzc1LjEgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMMTkyLjUgMjEwLjcgNTUuMSA3My40emBdfSxtXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaXJjbGUtY2hlY2tgLGljb246WzUxMiw1MTIsWzYxNTMzLGBjaGVjay1jaXJjbGVgXSxgZjA1OGAsYE0yNTYgNTEyYTI1NiAyNTYgMCAxIDEgMC01MTIgMjU2IDI1NiAwIDEgMSAwIDUxMnpNMzc0IDE0NS43Yy0xMC43LTcuOC0yNS43LTUuNC0zMy41IDUuM0wyMjEuMSAzMTUuMiAxNjkgMjYzLjFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNzIgNzJjNSA1IDExLjggNy41IDE4LjggN3MxMy40LTQuMSAxNy41LTkuOEwzNzkuMyAxNzkuMmM3LjgtMTAuNyA1LjQtMjUuNy01LjMtMzMuNXpgXX0saF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgY2hldnJvbi1kb3duYCxpY29uOls0NDgsNTEyLFtdLGBmMDc4YCxgTTIwMS40IDQwNi42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE5Mi0xOTJjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMMjI0IDMzOC43IDU0LjYgMTY5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE5MiAxOTJ6YF19LGdfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YHRyaWFuZ2xlLWV4Y2xhbWF0aW9uYCxpY29uOls1MTIsNTEyLFs5ODg4LGBleGNsYW1hdGlvbi10cmlhbmdsZWAsYHdhcm5pbmdgXSxgZjA3MWAsYE0yNTYgMGMxNC43IDAgMjguMiA4LjEgMzUuMiAyMWwyMTYgNDAwYzYuNyAxMi40IDYuNCAyNy40LS44IDM5LjVTNDg2LjEgNDgwIDQ3MiA0ODBMNDAgNDgwYy0xNC4xIDAtMjcuMi03LjQtMzQuNC0xOS41cy03LjUtMjcuMS0uOC0zOS41bDIxNi00MDBjNy0xMi45IDIwLjUtMjEgMzUuMi0yMXptMCAzNTJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em0wLTE5MmMtMTguMiAwLTMyLjcgMTUuNS0zMS40IDMzLjdsNy40IDEwNGMuOSAxMi41IDExLjQgMjIuMyAyMy45IDIyLjMgMTIuNiAwIDIzLTkuNyAyMy45LTIyLjNsNy40LTEwNGMxLjMtMTguMi0xMy4xLTMzLjctMzEuNC0zMy43emBdfSxfXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjb3B5YCxpY29uOls0NDgsNTEyLFtdLGBmMGM1YCxgTTE5MiAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDI1NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIwMC42YzAtMTcuNC03LjEtMzQuMS0xOS43LTQ2LjJMMzcwLjYgMTcuOEMzNTguNyA2LjQgMzQyLjggMCAzMjYuMyAwTDE5MiAwek02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTYtNjQgMCAwIDE2LTE5MiAwIDAtMjU2IDE2IDAgMC02NC0xNiAwemBdfSx2Xz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBleWUtc2xhc2hgLGljb246WzU3Niw1MTIsW10sYGYwNzBgLGBNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTYuNC05Ni40YzIuNy0yLjQgNS40LTQuOCA4LTcuMiA0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNi01Ni44IDAtMTA1LjYgMTguMi0xNDYgNDQuMkw0MS0yNC45ek0yMDQuNSAxMzguN2MyMy41LTE2LjggNTIuNC0yNi43IDgzLjUtMjYuNyA3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDMxLjEtOS45IDU5LjktMjYuNyA4My41bC0zNC43LTM0LjdjMTIuNy0yMS40IDE3LTQ3LjcgMTAuMS03My43LTEzLjctNTEuMi02Ni40LTgxLjYtMTE3LjYtNjcuOS04LjYgMi4zLTE2LjcgNS43LTI0IDEwbC0zNC43LTM0Ljd6TTMyNS4zIDM5NS4xYy0xMS45IDMuMi0yNC40IDQuOS0zNy4zIDQuOS03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTEyLjkgMS43LTI1LjQgNC45LTM3LjNMNjkuNCAxMzkuMmMtMzIuNiAzNi44LTU1IDc1LjgtNjYuOSAxMDQuNS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjYgMzcuMyAwIDcxLjItNy45IDEwMS41LTIwLjZsLTY0LjItNjQuMnpgXX0seV89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgc29ydC1kb3duYCxpY29uOlszODQsNTEyLFtgc29ydC1kZXNjYF0sYGYwZGRgLGBNMzIgMjg4Yy0xMi45IDAtMjQuNiA3LjgtMjkuNiAxOS44Uy4yIDMzMy41IDkuNCAzNDIuNmwxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE2MC0xNjBjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzY0LjkgMjg4IDM1MiAyODhMMzIgMjg4emBdfTtmdW5jdGlvbiBiXyhlKXt2YXIgdCxuLHI9YGA7aWYodHlwZW9mIGU9PWBzdHJpbmdgfHx0eXBlb2YgZT09YG51bWJlcmApcis9ZTtlbHNlIGlmKHR5cGVvZiBlPT1gb2JqZWN0YCl7aWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIGk9ZS5sZW5ndGg7Zm9yKHQ9MDt0PGk7dCsrKWVbdF0mJihuPWJfKGVbdF0pKSYmKHImJihyKz1gIGApLHIrPW4pfWVsc2UgZm9yKG4gaW4gZSllW25dJiYociYmKHIrPWAgYCkscis9bil9cmV0dXJuIHJ9ZnVuY3Rpb24geF8oKXtmb3IodmFyIGUsdCxuPTAscj1gYCxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKykoZT1hcmd1bWVudHNbbl0pJiYodD1iXyhlKSkmJihyJiYocis9YCBgKSxyKz10KTtyZXR1cm4gcn12YXIgU189ZT0+dHlwZW9mIGU9PWBib29sZWFuYD9gJHtlfWA6ZT09PTA/YDBgOmUsQ189eF8sd189KGUsdCk9Pm49PntpZih0Py52YXJpYW50cz09bnVsbClyZXR1cm4gQ18oZSxuPy5jbGFzcyxuPy5jbGFzc05hbWUpO2xldHt2YXJpYW50czpyLGRlZmF1bHRWYXJpYW50czppfT10LGE9T2JqZWN0LmtleXMocikubWFwKGU9PntsZXQgdD1uPy5bZV0sYT1pPy5bZV07aWYodD09PW51bGwpcmV0dXJuIG51bGw7bGV0IG89U18odCl8fFNfKGEpO3JldHVybiByW2VdW29dfSksbz1uJiZPYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKGUsdCk9PntsZXRbbixyXT10O3JldHVybiByPT09dm9pZCAwfHwoZVtuXT1yKSxlfSx7fSk7cmV0dXJuIENfKGUsYSx0Py5jb21wb3VuZFZhcmlhbnRzPy5yZWR1Y2UoKGUsdCk9PntsZXR7Y2xhc3M6bixjbGFzc05hbWU6ciwuLi5hfT10O3JldHVybiBPYmplY3QuZW50cmllcyhhKS5ldmVyeShlPT57bGV0W3Qsbl09ZTtyZXR1cm4gQXJyYXkuaXNBcnJheShuKT9uLmluY2x1ZGVzKHsuLi5pLC4uLm99W3RdKTp7Li4uaSwuLi5vfVt0XT09PW59KT9bLi4uZSxuLHJdOmV9LFtdKSxuPy5jbGFzcyxuPy5jbGFzc05hbWUpfSxUXz0oZSx0KT0+e2xldCBuPUFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyluW3RdPWVbdF07Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbltlLmxlbmd0aCtyXT10W3JdO3JldHVybiBufSxFXz0oZSx0KT0+KHtjbGFzc0dyb3VwSWQ6ZSx2YWxpZGF0b3I6dH0pLERfPShlPW5ldyBNYXAsdD1udWxsLG4pPT4oe25leHRQYXJ0OmUsdmFsaWRhdG9yczp0LGNsYXNzR3JvdXBJZDpufSksT189YC1gLGtfPVtdLEFfPWBhcmJpdHJhcnkuLmAsal89ZT0+e2xldCB0PVBfKGUpLHtjb25mbGljdGluZ0NsYXNzR3JvdXBzOm4sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnJ9PWU7cmV0dXJue2dldENsYXNzR3JvdXBJZDplPT57aWYoZS5zdGFydHNXaXRoKGBbYCkmJmUuZW5kc1dpdGgoYF1gKSlyZXR1cm4gTl8oZSk7bGV0IG49ZS5zcGxpdChPXyk7cmV0dXJuIE1fKG4sKyhuWzBdPT09YGAmJm4ubGVuZ3RoPjEpLHQpfSxnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6KGUsdCk9PntpZih0KXtsZXQgdD1yW2VdLGk9bltlXTtyZXR1cm4gdD9pP1RfKGksdCk6dDppfHxrX31yZXR1cm4gbltlXXx8a199fX0sTV89KGUsdCxuKT0+e2lmKGUubGVuZ3RoLXQ9PT0wKXJldHVybiBuLmNsYXNzR3JvdXBJZDtsZXQgcj1lW3RdLGk9bi5uZXh0UGFydC5nZXQocik7aWYoaSl7bGV0IG49TV8oZSx0KzEsaSk7aWYobilyZXR1cm4gbn1sZXQgYT1uLnZhbGlkYXRvcnM7aWYoYT09PW51bGwpcmV0dXJuO2xldCBvPXQ9PT0wP2Uuam9pbihPXyk6ZS5zbGljZSh0KS5qb2luKE9fKSxzPWEubGVuZ3RoO2ZvcihsZXQgZT0wO2U8cztlKyspe2xldCB0PWFbZV07aWYodC52YWxpZGF0b3IobykpcmV0dXJuIHQuY2xhc3NHcm91cElkfX0sTl89ZT0+ZS5zbGljZSgxLC0xKS5pbmRleE9mKGA6YCk9PT0tMT92b2lkIDA6KCgpPT57bGV0IHQ9ZS5zbGljZSgxLC0xKSxuPXQuaW5kZXhPZihgOmApLHI9dC5zbGljZSgwLG4pO3JldHVybiByP0FfK3I6dm9pZCAwfSkoKSxQXz1lPT57bGV0e3RoZW1lOnQsY2xhc3NHcm91cHM6bn09ZTtyZXR1cm4gRl8obix0KX0sRl89KGUsdCk9PntsZXQgbj1EXygpO2ZvcihsZXQgciBpbiBlKXtsZXQgaT1lW3JdO0lfKGksbixyLHQpfXJldHVybiBufSxJXz0oZSx0LG4scik9PntsZXQgaT1lLmxlbmd0aDtmb3IobGV0IGE9MDthPGk7YSsrKXtsZXQgaT1lW2FdO0xfKGksdCxuLHIpfX0sTF89KGUsdCxuLHIpPT57aWYodHlwZW9mIGU9PWBzdHJpbmdgKXtSXyhlLHQsbik7cmV0dXJufWlmKHR5cGVvZiBlPT1gZnVuY3Rpb25gKXt6XyhlLHQsbixyKTtyZXR1cm59Ql8oZSx0LG4scil9LFJfPShlLHQsbik9PntsZXQgcj1lPT09YGA/dDpWXyh0LGUpO3IuY2xhc3NHcm91cElkPW59LHpfPShlLHQsbixyKT0+e2lmKEhfKGUpKXtJXyhlKHIpLHQsbixyKTtyZXR1cm59dC52YWxpZGF0b3JzPT09bnVsbCYmKHQudmFsaWRhdG9ycz1bXSksdC52YWxpZGF0b3JzLnB1c2goRV8obixlKSl9LEJfPShlLHQsbixyKT0+e2xldCBpPU9iamVjdC5lbnRyaWVzKGUpLGE9aS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7bGV0W2Esb109aVtlXTtJXyhvLFZfKHQsYSksbixyKX19LFZfPShlLHQpPT57bGV0IG49ZSxyPXQuc3BsaXQoT18pLGk9ci5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHQ9cltlXSxpPW4ubmV4dFBhcnQuZ2V0KHQpO2l8fChpPURfKCksbi5uZXh0UGFydC5zZXQodCxpKSksbj1pfXJldHVybiBufSxIXz1lPT5gaXNUaGVtZUdldHRlcmBpbiBlJiZlLmlzVGhlbWVHZXR0ZXI9PT0hMCxVXz1lPT57aWYoZTwxKXJldHVybntnZXQ6KCk9PnZvaWQgMCxzZXQ6KCk9Pnt9fTtsZXQgdD0wLG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPU9iamVjdC5jcmVhdGUobnVsbCksaT0oaSxhKT0+e25baV09YSx0KyssdD5lJiYodD0wLHI9bixuPU9iamVjdC5jcmVhdGUobnVsbCkpfTtyZXR1cm57Z2V0KGUpe2xldCB0PW5bZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdDtpZigodD1yW2VdKSE9PXZvaWQgMClyZXR1cm4gaShlLHQpLHR9LHNldChlLHQpe2UgaW4gbj9uW2VdPXQ6aShlLHQpfX19LFdfPWAhYCxHXz1gOmAsS189W10scV89KGUsdCxuLHIsaSk9Pih7bW9kaWZpZXJzOmUsaGFzSW1wb3J0YW50TW9kaWZpZXI6dCxiYXNlQ2xhc3NOYW1lOm4sbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbjpyLGlzRXh0ZXJuYWw6aX0pLEpfPWU9PntsZXR7cHJlZml4OnQsZXhwZXJpbWVudGFsUGFyc2VDbGFzc05hbWU6bn09ZSxyPWU9PntsZXQgdD1bXSxuPTAscj0wLGk9MCxhLG89ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IG89ZVtzXTtpZihuPT09MCYmcj09PTApe2lmKG89PT1HXyl7dC5wdXNoKGUuc2xpY2UoaSxzKSksaT1zKzE7Y29udGludWV9aWYobz09PWAvYCl7YT1zO2NvbnRpbnVlfX1vPT09YFtgP24rKzpvPT09YF1gP24tLTpvPT09YChgP3IrKzpvPT09YClgJiZyLS19bGV0IHM9dC5sZW5ndGg9PT0wP2U6ZS5zbGljZShpKSxjPXMsbD0hMTtzLmVuZHNXaXRoKFdfKT8oYz1zLnNsaWNlKDAsLTEpLGw9ITApOnMuc3RhcnRzV2l0aChXXykmJihjPXMuc2xpY2UoMSksbD0hMCk7bGV0IHU9YSYmYT5pP2EtaTp2b2lkIDA7cmV0dXJuIHFfKHQsbCxjLHUpfTtpZih0KXtsZXQgZT10K0dfLG49cjtyPXQ9PnQuc3RhcnRzV2l0aChlKT9uKHQuc2xpY2UoZS5sZW5ndGgpKTpxXyhLXywhMSx0LHZvaWQgMCwhMCl9aWYobil7bGV0IGU9cjtyPXQ9Pm4oe2NsYXNzTmFtZTp0LHBhcnNlQ2xhc3NOYW1lOmV9KX1yZXR1cm4gcn0sWV89ZT0+e2xldCB0PW5ldyBNYXA7cmV0dXJuIGUub3JkZXJTZW5zaXRpdmVNb2RpZmllcnMuZm9yRWFjaCgoZSxuKT0+e3Quc2V0KGUsMWU2K24pfSksZT0+e2xldCBuPVtdLHI9W107Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2xldCBhPWVbaV0sbz1hWzBdPT09YFtgLHM9dC5oYXMoYSk7b3x8cz8oci5sZW5ndGg+MCYmKHIuc29ydCgpLG4ucHVzaCguLi5yKSxyPVtdKSxuLnB1c2goYSkpOnIucHVzaChhKX1yZXR1cm4gci5sZW5ndGg+MCYmKHIuc29ydCgpLG4ucHVzaCguLi5yKSksbn19LFhfPWU9Pih7Y2FjaGU6VV8oZS5jYWNoZVNpemUpLHBhcnNlQ2xhc3NOYW1lOkpfKGUpLHNvcnRNb2RpZmllcnM6WV8oZSkscG9zdGZpeExvb2t1cENsYXNzR3JvdXBJZHM6Wl8oZSksLi4ual8oZSl9KSxaXz1lPT57bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxuPWUucG9zdGZpeExvb2t1cENsYXNzR3JvdXBzO2lmKG4pZm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspdFtuW2VdXT0hMDtyZXR1cm4gdH0sUV89L1xzKy8sJF89KGUsdCk9PntsZXR7cGFyc2VDbGFzc05hbWU6bixnZXRDbGFzc0dyb3VwSWQ6cixnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6aSxzb3J0TW9kaWZpZXJzOmEscG9zdGZpeExvb2t1cENsYXNzR3JvdXBJZHM6b309dCxzPVtdLGM9ZS50cmltKCkuc3BsaXQoUV8pLGw9YGA7Zm9yKGxldCBlPWMubGVuZ3RoLTE7ZT49MDstLWUpe2xldCB0PWNbZV0se2lzRXh0ZXJuYWw6dSxtb2RpZmllcnM6ZCxoYXNJbXBvcnRhbnRNb2RpZmllcjpmLGJhc2VDbGFzc05hbWU6cCxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOm19PW4odCk7aWYodSl7bD10KyhsLmxlbmd0aD4wP2AgYCtsOmwpO2NvbnRpbnVlfWxldCBoPSEhbSxnO2lmKGgpe2c9cihwLnN1YnN0cmluZygwLG0pKTtsZXQgZT1nJiZvW2ddP3IocCk6dm9pZCAwO2UmJmUhPT1nJiYoZz1lLGg9ITEpfWVsc2UgZz1yKHApO2lmKCFnKXtpZighaCl7bD10KyhsLmxlbmd0aD4wP2AgYCtsOmwpO2NvbnRpbnVlfWlmKGc9cihwKSwhZyl7bD10KyhsLmxlbmd0aD4wP2AgYCtsOmwpO2NvbnRpbnVlfWg9ITF9bGV0IF89ZC5sZW5ndGg9PT0wP2BgOmQubGVuZ3RoPT09MT9kWzBdOmEoZCkuam9pbihgOmApLHY9Zj9fK1dfOl8seT12K2c7aWYocy5pbmRleE9mKHkpPi0xKWNvbnRpbnVlO3MucHVzaCh5KTtsZXQgYj1pKGcsaCk7Zm9yKGxldCBlPTA7ZTxiLmxlbmd0aDsrK2Upe2xldCB0PWJbZV07cy5wdXNoKHYrdCl9bD10KyhsLmxlbmd0aD4wP2AgYCtsOmwpfXJldHVybiBsfSxldj0oLi4uZSk9PntsZXQgdD0wLG4scixpPWBgO2Zvcig7dDxlLmxlbmd0aDspKG49ZVt0KytdKSYmKHI9dHYobikpJiYoaSYmKGkrPWAgYCksaSs9cik7cmV0dXJuIGl9LHR2PWU9PntpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGU7bGV0IHQsbj1gYDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYodD10dihlW3JdKSkmJihuJiYobis9YCBgKSxuKz10KTtyZXR1cm4gbn0sbnY9KGUsLi4udCk9PntsZXQgbixyLGksYSxvPW89PihuPVhfKHQucmVkdWNlKChlLHQpPT50KGUpLGUoKSkpLHI9bi5jYWNoZS5nZXQsaT1uLmNhY2hlLnNldCxhPXMscyhvKSkscz1lPT57bGV0IHQ9cihlKTtpZih0KXJldHVybiB0O2xldCBhPSRfKGUsbik7cmV0dXJuIGkoZSxhKSxhfTtyZXR1cm4gYT1vLCguLi5lKT0+YShldiguLi5lKSl9LHJ2PVtdLGl2PWU9PntsZXQgdD10PT50W2VdfHxydjtyZXR1cm4gdC5pc1RoZW1lR2V0dGVyPSEwLHR9LGF2PS9eXFsoPzooXHdbXHctXSopOik/KC4rKVxdJC9pLG92PS9eXCgoPzooXHdbXHctXSopOik/KC4rKVwpJC9pLHN2PS9eXGQrKD86XC5cZCspP1wvXGQrKD86XC5cZCspPyQvLGN2PS9eKFxkKyhcLlxkKyk/KT8oeHN8c218bWR8bGd8eGwpJC8sbHY9L1xkKyglfHB4fHI/ZW18W3NkbF0/dihbaHdpYl18bWlufG1heCl8cHR8cGN8aW58Y218bW18Y2FwfGNofGV4fHI/bGh8Y3Eod3xofGl8YnxtaW58bWF4KSl8XGIoY2FsY3xtaW58bWF4fGNsYW1wKVwoLitcKXxeMCQvLHV2PS9eKHJnYmE/fGhzbGE/fGh3Ynwob2spPyhsYWJ8bGNoKXxjb2xvci1taXgpXCguK1wpJC8sZHY9L14oaW5zZXRfKT8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKV8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKS8sZnY9L14odXJsfGltYWdlfGltYWdlLXNldHxjcm9zcy1mYWRlfGVsZW1lbnR8KHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsfGNvbmljKS1ncmFkaWVudClcKC4rXCkkLyxwdj1lPT5zdi50ZXN0KGUpLEo9ZT0+ISFlJiYhTnVtYmVyLmlzTmFOKE51bWJlcihlKSksbXY9ZT0+ISFlJiZOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihlKSksaHY9ZT0+ZS5lbmRzV2l0aChgJWApJiZKKGUuc2xpY2UoMCwtMSkpLGd2PWU9PmN2LnRlc3QoZSksX3Y9KCk9PiEwLHZ2PWU9Pmx2LnRlc3QoZSkmJiF1di50ZXN0KGUpLHl2PSgpPT4hMSxidj1lPT5kdi50ZXN0KGUpLHh2PWU9PmZ2LnRlc3QoZSksU3Y9ZT0+IVkoZSkmJiFYKGUpLEN2PWU9PmUuc3RhcnRzV2l0aChgQGNvbnRhaW5lcmApJiYoZVsxMF09PT1gL2AmJmVbMTFdIT09dm9pZCAwfHxlWzExXT09PWBzYCYmZVsxNl0hPT12b2lkIDAmJmUuc3RhcnRzV2l0aChgLXNpemUvYCwxMCl8fGVbMTFdPT09YG5gJiZlWzE4XSE9PXZvaWQgMCYmZS5zdGFydHNXaXRoKGAtbm9ybWFsL2AsMTApKSx3dj1lPT56dihlLFV2LHl2KSxZPWU9PmF2LnRlc3QoZSksVHY9ZT0+enYoZSxXdix2diksRXY9ZT0+enYoZSxHdixKKSxEdj1lPT56dihlLHF2LF92KSxPdj1lPT56dihlLEt2LHl2KSxrdj1lPT56dihlLFZ2LHl2KSxBdj1lPT56dihlLEh2LHh2KSxqdj1lPT56dihlLEp2LGJ2KSxYPWU9Pm92LnRlc3QoZSksTXY9ZT0+QnYoZSxXdiksTnY9ZT0+QnYoZSxLdiksUHY9ZT0+QnYoZSxWdiksRnY9ZT0+QnYoZSxVdiksSXY9ZT0+QnYoZSxIdiksTHY9ZT0+QnYoZSxKdiwhMCksUnY9ZT0+QnYoZSxxdiwhMCksenY9KGUsdCxuKT0+e2xldCByPWF2LmV4ZWMoZSk7cmV0dXJuIHI/clsxXT90KHJbMV0pOm4oclsyXSk6ITF9LEJ2PShlLHQsbj0hMSk9PntsZXQgcj1vdi5leGVjKGUpO3JldHVybiByP3JbMV0/dChyWzFdKTpuOiExfSxWdj1lPT5lPT09YHBvc2l0aW9uYHx8ZT09PWBwZXJjZW50YWdlYCxIdj1lPT5lPT09YGltYWdlYHx8ZT09PWB1cmxgLFV2PWU9PmU9PT1gbGVuZ3RoYHx8ZT09PWBzaXplYHx8ZT09PWBiZy1zaXplYCxXdj1lPT5lPT09YGxlbmd0aGAsR3Y9ZT0+ZT09PWBudW1iZXJgLEt2PWU9PmU9PT1gZmFtaWx5LW5hbWVgLHF2PWU9PmU9PT1gbnVtYmVyYHx8ZT09PWB3ZWlnaHRgLEp2PWU9PmU9PT1gc2hhZG93YCxZdj1udigoKT0+e2xldCBlPWl2KGBjb2xvcmApLHQ9aXYoYGZvbnRgKSxuPWl2KGB0ZXh0YCkscj1pdihgZm9udC13ZWlnaHRgKSxpPWl2KGB0cmFja2luZ2ApLGE9aXYoYGxlYWRpbmdgKSxvPWl2KGBicmVha3BvaW50YCkscz1pdihgY29udGFpbmVyYCksYz1pdihgc3BhY2luZ2ApLGw9aXYoYHJhZGl1c2ApLHU9aXYoYHNoYWRvd2ApLGQ9aXYoYGluc2V0LXNoYWRvd2ApLGY9aXYoYHRleHQtc2hhZG93YCkscD1pdihgZHJvcC1zaGFkb3dgKSxtPWl2KGBibHVyYCksaD1pdihgcGVyc3BlY3RpdmVgKSxnPWl2KGBhc3BlY3RgKSxfPWl2KGBlYXNlYCksdj1pdihgYW5pbWF0ZWApLHk9KCk9PltgYXV0b2AsYGF2b2lkYCxgYWxsYCxgYXZvaWQtcGFnZWAsYHBhZ2VgLGBsZWZ0YCxgcmlnaHRgLGBjb2x1bW5gXSxiPSgpPT5bYGNlbnRlcmAsYHRvcGAsYGJvdHRvbWAsYGxlZnRgLGByaWdodGAsYHRvcC1sZWZ0YCxgbGVmdC10b3BgLGB0b3AtcmlnaHRgLGByaWdodC10b3BgLGBib3R0b20tcmlnaHRgLGByaWdodC1ib3R0b21gLGBib3R0b20tbGVmdGAsYGxlZnQtYm90dG9tYF0seD0oKT0+Wy4uLmIoKSxYLFldLFM9KCk9PltgYXV0b2AsYGhpZGRlbmAsYGNsaXBgLGB2aXNpYmxlYCxgc2Nyb2xsYF0sQz0oKT0+W2BhdXRvYCxgY29udGFpbmAsYG5vbmVgXSx3PSgpPT5bWCxZLGNdLGVlPSgpPT5bcHYsYGZ1bGxgLGBhdXRvYCwuLi53KCldLHRlPSgpPT5bbXYsYG5vbmVgLGBzdWJncmlkYCxYLFldLFQ9KCk9PltgYXV0b2Ase3NwYW46W2BmdWxsYCxtdixYLFldfSxtdixYLFldLG5lPSgpPT5bbXYsYGF1dG9gLFgsWV0scmU9KCk9PltgYXV0b2AsYG1pbmAsYG1heGAsYGZyYCxYLFldLGllPSgpPT5bYHN0YXJ0YCxgZW5kYCxgY2VudGVyYCxgYmV0d2VlbmAsYGFyb3VuZGAsYGV2ZW5seWAsYHN0cmV0Y2hgLGBiYXNlbGluZWAsYGNlbnRlci1zYWZlYCxgZW5kLXNhZmVgXSxFPSgpPT5bYHN0YXJ0YCxgZW5kYCxgY2VudGVyYCxgc3RyZXRjaGAsYGNlbnRlci1zYWZlYCxgZW5kLXNhZmVgXSxhZT0oKT0+W2BhdXRvYCwuLi53KCldLG9lPSgpPT5bcHYsYGF1dG9gLGBmdWxsYCxgZHZ3YCxgZHZoYCxgbHZ3YCxgbHZoYCxgc3Z3YCxgc3ZoYCxgbWluYCxgbWF4YCxgZml0YCwuLi53KCldLHNlPSgpPT5bcHYsYHNjcmVlbmAsYGZ1bGxgLGBkdndgLGBsdndgLGBzdndgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sY2U9KCk9Pltwdixgc2NyZWVuYCxgZnVsbGAsYGxoYCxgZHZoYCxgbHZoYCxgc3ZoYCxgbWluYCxgbWF4YCxgZml0YCwuLi53KCldLEQ9KCk9PltlLFgsWV0sbGU9KCk9PlsuLi5iKCksUHYsa3Yse3Bvc2l0aW9uOltYLFldfV0sdWU9KCk9Pltgbm8tcmVwZWF0YCx7cmVwZWF0OltgYCxgeGAsYHlgLGBzcGFjZWAsYHJvdW5kYF19XSxkZT0oKT0+W2BhdXRvYCxgY292ZXJgLGBjb250YWluYCxGdix3dix7c2l6ZTpbWCxZXX1dLGZlPSgpPT5baHYsTXYsVHZdLHBlPSgpPT5bYGAsYG5vbmVgLGBmdWxsYCxsLFgsWV0sbWU9KCk9PltgYCxKLE12LFR2XSxoZT0oKT0+W2Bzb2xpZGAsYGRhc2hlZGAsYGRvdHRlZGAsYGRvdWJsZWBdLGdlPSgpPT5bYG5vcm1hbGAsYG11bHRpcGx5YCxgc2NyZWVuYCxgb3ZlcmxheWAsYGRhcmtlbmAsYGxpZ2h0ZW5gLGBjb2xvci1kb2RnZWAsYGNvbG9yLWJ1cm5gLGBoYXJkLWxpZ2h0YCxgc29mdC1saWdodGAsYGRpZmZlcmVuY2VgLGBleGNsdXNpb25gLGBodWVgLGBzYXR1cmF0aW9uYCxgY29sb3JgLGBsdW1pbm9zaXR5YF0sX2U9KCk9PltKLGh2LFB2LGt2XSx2ZT0oKT0+W2BgLGBub25lYCxtLFgsWV0seWU9KCk9Pltgbm9uZWAsSixYLFldLGJlPSgpPT5bYG5vbmVgLEosWCxZXSxPPSgpPT5bSixYLFldLHhlPSgpPT5bcHYsYGZ1bGxgLC4uLncoKV07cmV0dXJue2NhY2hlU2l6ZTo1MDAsdGhlbWU6e2FuaW1hdGU6W2BzcGluYCxgcGluZ2AsYHB1bHNlYCxgYm91bmNlYF0sYXNwZWN0OltgdmlkZW9gXSxibHVyOltndl0sYnJlYWtwb2ludDpbZ3ZdLGNvbG9yOltfdl0sY29udGFpbmVyOltndl0sImRyb3Atc2hhZG93IjpbZ3ZdLGVhc2U6W2BpbmAsYG91dGAsYGluLW91dGBdLGZvbnQ6W1N2XSwiZm9udC13ZWlnaHQiOltgdGhpbmAsYGV4dHJhbGlnaHRgLGBsaWdodGAsYG5vcm1hbGAsYG1lZGl1bWAsYHNlbWlib2xkYCxgYm9sZGAsYGV4dHJhYm9sZGAsYGJsYWNrYF0sImluc2V0LXNoYWRvdyI6W2d2XSxsZWFkaW5nOltgbm9uZWAsYHRpZ2h0YCxgc251Z2AsYG5vcm1hbGAsYHJlbGF4ZWRgLGBsb29zZWBdLHBlcnNwZWN0aXZlOltgZHJhbWF0aWNgLGBuZWFyYCxgbm9ybWFsYCxgbWlkcmFuZ2VgLGBkaXN0YW50YCxgbm9uZWBdLHJhZGl1czpbZ3ZdLHNoYWRvdzpbZ3ZdLHNwYWNpbmc6W2BweGAsSl0sdGV4dDpbZ3ZdLCJ0ZXh0LXNoYWRvdyI6W2d2XSx0cmFja2luZzpbYHRpZ2h0ZXJgLGB0aWdodGAsYG5vcm1hbGAsYHdpZGVgLGB3aWRlcmAsYHdpZGVzdGBdfSxjbGFzc0dyb3Vwczp7YXNwZWN0Olt7YXNwZWN0OltgYXV0b2AsYHNxdWFyZWAscHYsWSxYLGddfV0sY29udGFpbmVyOltgY29udGFpbmVyYF0sImNvbnRhaW5lci10eXBlIjpbeyJAY29udGFpbmVyIjpbYGAsYG5vcm1hbGAsYHNpemVgLFgsWV19XSwiY29udGFpbmVyLW5hbWVkIjpbQ3ZdLGNvbHVtbnM6W3tjb2x1bW5zOltKLFksWCxzXX1dLCJicmVhay1hZnRlciI6W3siYnJlYWstYWZ0ZXIiOnkoKX1dLCJicmVhay1iZWZvcmUiOlt7ImJyZWFrLWJlZm9yZSI6eSgpfV0sImJyZWFrLWluc2lkZSI6W3siYnJlYWstaW5zaWRlIjpbYGF1dG9gLGBhdm9pZGAsYGF2b2lkLXBhZ2VgLGBhdm9pZC1jb2x1bW5gXX1dLCJib3gtZGVjb3JhdGlvbiI6W3siYm94LWRlY29yYXRpb24iOltgc2xpY2VgLGBjbG9uZWBdfV0sYm94Olt7Ym94OltgYm9yZGVyYCxgY29udGVudGBdfV0sZGlzcGxheTpbYGJsb2NrYCxgaW5saW5lLWJsb2NrYCxgaW5saW5lYCxgZmxleGAsYGlubGluZS1mbGV4YCxgdGFibGVgLGBpbmxpbmUtdGFibGVgLGB0YWJsZS1jYXB0aW9uYCxgdGFibGUtY2VsbGAsYHRhYmxlLWNvbHVtbmAsYHRhYmxlLWNvbHVtbi1ncm91cGAsYHRhYmxlLWZvb3Rlci1ncm91cGAsYHRhYmxlLWhlYWRlci1ncm91cGAsYHRhYmxlLXJvdy1ncm91cGAsYHRhYmxlLXJvd2AsYGZsb3ctcm9vdGAsYGdyaWRgLGBpbmxpbmUtZ3JpZGAsYGNvbnRlbnRzYCxgbGlzdC1pdGVtYCxgaGlkZGVuYF0sc3I6W2Bzci1vbmx5YCxgbm90LXNyLW9ubHlgXSxmbG9hdDpbe2Zsb2F0OltgcmlnaHRgLGBsZWZ0YCxgbm9uZWAsYHN0YXJ0YCxgZW5kYF19XSxjbGVhcjpbe2NsZWFyOltgbGVmdGAsYHJpZ2h0YCxgYm90aGAsYG5vbmVgLGBzdGFydGAsYGVuZGBdfV0saXNvbGF0aW9uOltgaXNvbGF0ZWAsYGlzb2xhdGlvbi1hdXRvYF0sIm9iamVjdC1maXQiOlt7b2JqZWN0OltgY29udGFpbmAsYGNvdmVyYCxgZmlsbGAsYG5vbmVgLGBzY2FsZS1kb3duYF19XSwib2JqZWN0LXBvc2l0aW9uIjpbe29iamVjdDp4KCl9XSxvdmVyZmxvdzpbe292ZXJmbG93OlMoKX1dLCJvdmVyZmxvdy14IjpbeyJvdmVyZmxvdy14IjpTKCl9XSwib3ZlcmZsb3cteSI6W3sib3ZlcmZsb3cteSI6UygpfV0sb3ZlcnNjcm9sbDpbe292ZXJzY3JvbGw6QygpfV0sIm92ZXJzY3JvbGwteCI6W3sib3ZlcnNjcm9sbC14IjpDKCl9XSwib3ZlcnNjcm9sbC15IjpbeyJvdmVyc2Nyb2xsLXkiOkMoKX1dLHBvc2l0aW9uOltgc3RhdGljYCxgZml4ZWRgLGBhYnNvbHV0ZWAsYHJlbGF0aXZlYCxgc3RpY2t5YF0saW5zZXQ6W3tpbnNldDplZSgpfV0sImluc2V0LXgiOlt7Imluc2V0LXgiOmVlKCl9XSwiaW5zZXQteSI6W3siaW5zZXQteSI6ZWUoKX1dLHN0YXJ0Olt7Imluc2V0LXMiOmVlKCksc3RhcnQ6ZWUoKX1dLGVuZDpbeyJpbnNldC1lIjplZSgpLGVuZDplZSgpfV0sImluc2V0LWJzIjpbeyJpbnNldC1icyI6ZWUoKX1dLCJpbnNldC1iZSI6W3siaW5zZXQtYmUiOmVlKCl9XSx0b3A6W3t0b3A6ZWUoKX1dLHJpZ2h0Olt7cmlnaHQ6ZWUoKX1dLGJvdHRvbTpbe2JvdHRvbTplZSgpfV0sbGVmdDpbe2xlZnQ6ZWUoKX1dLHZpc2liaWxpdHk6W2B2aXNpYmxlYCxgaW52aXNpYmxlYCxgY29sbGFwc2VgXSx6Olt7ejpbbXYsYGF1dG9gLFgsWV19XSxiYXNpczpbe2Jhc2lzOltwdixgZnVsbGAsYGF1dG9gLHMsLi4udygpXX1dLCJmbGV4LWRpcmVjdGlvbiI6W3tmbGV4Oltgcm93YCxgcm93LXJldmVyc2VgLGBjb2xgLGBjb2wtcmV2ZXJzZWBdfV0sImZsZXgtd3JhcCI6W3tmbGV4Oltgbm93cmFwYCxgd3JhcGAsYHdyYXAtcmV2ZXJzZWBdfV0sZmxleDpbe2ZsZXg6W0oscHYsYGF1dG9gLGBpbml0aWFsYCxgbm9uZWAsWV19XSxncm93Olt7Z3JvdzpbYGAsSixYLFldfV0sc2hyaW5rOlt7c2hyaW5rOltgYCxKLFgsWV19XSxvcmRlcjpbe29yZGVyOlttdixgZmlyc3RgLGBsYXN0YCxgbm9uZWAsWCxZXX1dLCJncmlkLWNvbHMiOlt7ImdyaWQtY29scyI6dGUoKX1dLCJjb2wtc3RhcnQtZW5kIjpbe2NvbDpUKCl9XSwiY29sLXN0YXJ0IjpbeyJjb2wtc3RhcnQiOm5lKCl9XSwiY29sLWVuZCI6W3siY29sLWVuZCI6bmUoKX1dLCJncmlkLXJvd3MiOlt7ImdyaWQtcm93cyI6dGUoKX1dLCJyb3ctc3RhcnQtZW5kIjpbe3JvdzpUKCl9XSwicm93LXN0YXJ0IjpbeyJyb3ctc3RhcnQiOm5lKCl9XSwicm93LWVuZCI6W3sicm93LWVuZCI6bmUoKX1dLCJncmlkLWZsb3ciOlt7ImdyaWQtZmxvdyI6W2Byb3dgLGBjb2xgLGBkZW5zZWAsYHJvdy1kZW5zZWAsYGNvbC1kZW5zZWBdfV0sImF1dG8tY29scyI6W3siYXV0by1jb2xzIjpyZSgpfV0sImF1dG8tcm93cyI6W3siYXV0by1yb3dzIjpyZSgpfV0sZ2FwOlt7Z2FwOncoKX1dLCJnYXAteCI6W3siZ2FwLXgiOncoKX1dLCJnYXAteSI6W3siZ2FwLXkiOncoKX1dLCJqdXN0aWZ5LWNvbnRlbnQiOlt7anVzdGlmeTpbLi4uaWUoKSxgbm9ybWFsYF19XSwianVzdGlmeS1pdGVtcyI6W3sianVzdGlmeS1pdGVtcyI6Wy4uLkUoKSxgbm9ybWFsYF19XSwianVzdGlmeS1zZWxmIjpbeyJqdXN0aWZ5LXNlbGYiOltgYXV0b2AsLi4uRSgpXX1dLCJhbGlnbi1jb250ZW50Ijpbe2NvbnRlbnQ6W2Bub3JtYWxgLC4uLmllKCldfV0sImFsaWduLWl0ZW1zIjpbe2l0ZW1zOlsuLi5FKCkse2Jhc2VsaW5lOltgYCxgbGFzdGBdfV19XSwiYWxpZ24tc2VsZiI6W3tzZWxmOltgYXV0b2AsLi4uRSgpLHtiYXNlbGluZTpbYGAsYGxhc3RgXX1dfV0sInBsYWNlLWNvbnRlbnQiOlt7InBsYWNlLWNvbnRlbnQiOmllKCl9XSwicGxhY2UtaXRlbXMiOlt7InBsYWNlLWl0ZW1zIjpbLi4uRSgpLGBiYXNlbGluZWBdfV0sInBsYWNlLXNlbGYiOlt7InBsYWNlLXNlbGYiOltgYXV0b2AsLi4uRSgpXX1dLHA6W3twOncoKX1dLHB4Olt7cHg6dygpfV0scHk6W3tweTp3KCl9XSxwczpbe3BzOncoKX1dLHBlOlt7cGU6dygpfV0scGJzOlt7cGJzOncoKX1dLHBiZTpbe3BiZTp3KCl9XSxwdDpbe3B0OncoKX1dLHByOlt7cHI6dygpfV0scGI6W3twYjp3KCl9XSxwbDpbe3BsOncoKX1dLG06W3ttOmFlKCl9XSxteDpbe214OmFlKCl9XSxteTpbe215OmFlKCl9XSxtczpbe21zOmFlKCl9XSxtZTpbe21lOmFlKCl9XSxtYnM6W3ttYnM6YWUoKX1dLG1iZTpbe21iZTphZSgpfV0sbXQ6W3ttdDphZSgpfV0sbXI6W3ttcjphZSgpfV0sbWI6W3ttYjphZSgpfV0sbWw6W3ttbDphZSgpfV0sInNwYWNlLXgiOlt7InNwYWNlLXgiOncoKX1dLCJzcGFjZS14LXJldmVyc2UiOltgc3BhY2UteC1yZXZlcnNlYF0sInNwYWNlLXkiOlt7InNwYWNlLXkiOncoKX1dLCJzcGFjZS15LXJldmVyc2UiOltgc3BhY2UteS1yZXZlcnNlYF0sc2l6ZTpbe3NpemU6b2UoKX1dLCJpbmxpbmUtc2l6ZSI6W3tpbmxpbmU6W2BhdXRvYCwuLi5zZSgpXX1dLCJtaW4taW5saW5lLXNpemUiOlt7Im1pbi1pbmxpbmUiOltgYXV0b2AsLi4uc2UoKV19XSwibWF4LWlubGluZS1zaXplIjpbeyJtYXgtaW5saW5lIjpbYG5vbmVgLC4uLnNlKCldfV0sImJsb2NrLXNpemUiOlt7YmxvY2s6W2BhdXRvYCwuLi5jZSgpXX1dLCJtaW4tYmxvY2stc2l6ZSI6W3sibWluLWJsb2NrIjpbYGF1dG9gLC4uLmNlKCldfV0sIm1heC1ibG9jay1zaXplIjpbeyJtYXgtYmxvY2siOltgbm9uZWAsLi4uY2UoKV19XSx3Olt7dzpbcyxgc2NyZWVuYCwuLi5vZSgpXX1dLCJtaW4tdyI6W3sibWluLXciOltzLGBzY3JlZW5gLGBub25lYCwuLi5vZSgpXX1dLCJtYXgtdyI6W3sibWF4LXciOltzLGBzY3JlZW5gLGBub25lYCxgcHJvc2VgLHtzY3JlZW46W29dfSwuLi5vZSgpXX1dLGg6W3toOltgc2NyZWVuYCxgbGhgLC4uLm9lKCldfV0sIm1pbi1oIjpbeyJtaW4taCI6W2BzY3JlZW5gLGBsaGAsYG5vbmVgLC4uLm9lKCldfV0sIm1heC1oIjpbeyJtYXgtaCI6W2BzY3JlZW5gLGBsaGAsLi4ub2UoKV19XSwiZm9udC1zaXplIjpbe3RleHQ6W2BiYXNlYCxuLE12LFR2XX1dLCJmb250LXNtb290aGluZyI6W2BhbnRpYWxpYXNlZGAsYHN1YnBpeGVsLWFudGlhbGlhc2VkYF0sImZvbnQtc3R5bGUiOltgaXRhbGljYCxgbm90LWl0YWxpY2BdLCJmb250LXdlaWdodCI6W3tmb250OltyLFJ2LER2XX1dLCJmb250LXN0cmV0Y2giOlt7ImZvbnQtc3RyZXRjaCI6W2B1bHRyYS1jb25kZW5zZWRgLGBleHRyYS1jb25kZW5zZWRgLGBjb25kZW5zZWRgLGBzZW1pLWNvbmRlbnNlZGAsYG5vcm1hbGAsYHNlbWktZXhwYW5kZWRgLGBleHBhbmRlZGAsYGV4dHJhLWV4cGFuZGVkYCxgdWx0cmEtZXhwYW5kZWRgLGh2LFldfV0sImZvbnQtZmFtaWx5Ijpbe2ZvbnQ6W052LE92LHRdfV0sImZvbnQtZmVhdHVyZXMiOlt7ImZvbnQtZmVhdHVyZXMiOltZXX1dLCJmdm4tbm9ybWFsIjpbYG5vcm1hbC1udW1zYF0sImZ2bi1vcmRpbmFsIjpbYG9yZGluYWxgXSwiZnZuLXNsYXNoZWQtemVybyI6W2BzbGFzaGVkLXplcm9gXSwiZnZuLWZpZ3VyZSI6W2BsaW5pbmctbnVtc2AsYG9sZHN0eWxlLW51bXNgXSwiZnZuLXNwYWNpbmciOltgcHJvcG9ydGlvbmFsLW51bXNgLGB0YWJ1bGFyLW51bXNgXSwiZnZuLWZyYWN0aW9uIjpbYGRpYWdvbmFsLWZyYWN0aW9uc2AsYHN0YWNrZWQtZnJhY3Rpb25zYF0sdHJhY2tpbmc6W3t0cmFja2luZzpbaSxYLFldfV0sImxpbmUtY2xhbXAiOlt7ImxpbmUtY2xhbXAiOltKLGBub25lYCxYLEV2XX1dLGxlYWRpbmc6W3tsZWFkaW5nOlthLC4uLncoKV19XSwibGlzdC1pbWFnZSI6W3sibGlzdC1pbWFnZSI6W2Bub25lYCxYLFldfV0sImxpc3Qtc3R5bGUtcG9zaXRpb24iOlt7bGlzdDpbYGluc2lkZWAsYG91dHNpZGVgXX1dLCJsaXN0LXN0eWxlLXR5cGUiOlt7bGlzdDpbYGRpc2NgLGBkZWNpbWFsYCxgbm9uZWAsWCxZXX1dLCJ0ZXh0LWFsaWdubWVudCI6W3t0ZXh0OltgbGVmdGAsYGNlbnRlcmAsYHJpZ2h0YCxganVzdGlmeWAsYHN0YXJ0YCxgZW5kYF19XSwicGxhY2Vob2xkZXItY29sb3IiOlt7cGxhY2Vob2xkZXI6RCgpfV0sInRleHQtY29sb3IiOlt7dGV4dDpEKCl9XSwidGV4dC1kZWNvcmF0aW9uIjpbYHVuZGVybGluZWAsYG92ZXJsaW5lYCxgbGluZS10aHJvdWdoYCxgbm8tdW5kZXJsaW5lYF0sInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6W3tkZWNvcmF0aW9uOlsuLi5oZSgpLGB3YXZ5YF19XSwidGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzcyI6W3tkZWNvcmF0aW9uOltKLGBmcm9tLWZvbnRgLGBhdXRvYCxYLFR2XX1dLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiOlt7ZGVjb3JhdGlvbjpEKCl9XSwidW5kZXJsaW5lLW9mZnNldCI6W3sidW5kZXJsaW5lLW9mZnNldCI6W0osYGF1dG9gLFgsWV19XSwidGV4dC10cmFuc2Zvcm0iOltgdXBwZXJjYXNlYCxgbG93ZXJjYXNlYCxgY2FwaXRhbGl6ZWAsYG5vcm1hbC1jYXNlYF0sInRleHQtb3ZlcmZsb3ciOltgdHJ1bmNhdGVgLGB0ZXh0LWVsbGlwc2lzYCxgdGV4dC1jbGlwYF0sInRleHQtd3JhcCI6W3t0ZXh0Oltgd3JhcGAsYG5vd3JhcGAsYGJhbGFuY2VgLGBwcmV0dHlgXX1dLGluZGVudDpbe2luZGVudDp3KCl9XSwidGFiLXNpemUiOlt7dGFiOlttdixYLFldfV0sInZlcnRpY2FsLWFsaWduIjpbe2FsaWduOltgYmFzZWxpbmVgLGB0b3BgLGBtaWRkbGVgLGBib3R0b21gLGB0ZXh0LXRvcGAsYHRleHQtYm90dG9tYCxgc3ViYCxgc3VwZXJgLFgsWV19XSx3aGl0ZXNwYWNlOlt7d2hpdGVzcGFjZTpbYG5vcm1hbGAsYG5vd3JhcGAsYHByZWAsYHByZS1saW5lYCxgcHJlLXdyYXBgLGBicmVhay1zcGFjZXNgXX1dLGJyZWFrOlt7YnJlYWs6W2Bub3JtYWxgLGB3b3Jkc2AsYGFsbGAsYGtlZXBgXX1dLHdyYXA6W3t3cmFwOltgYnJlYWstd29yZGAsYGFueXdoZXJlYCxgbm9ybWFsYF19XSxoeXBoZW5zOlt7aHlwaGVuczpbYG5vbmVgLGBtYW51YWxgLGBhdXRvYF19XSxjb250ZW50Olt7Y29udGVudDpbYG5vbmVgLFgsWV19XSwiYmctYXR0YWNobWVudCI6W3tiZzpbYGZpeGVkYCxgbG9jYWxgLGBzY3JvbGxgXX1dLCJiZy1jbGlwIjpbeyJiZy1jbGlwIjpbYGJvcmRlcmAsYHBhZGRpbmdgLGBjb250ZW50YCxgdGV4dGBdfV0sImJnLW9yaWdpbiI6W3siYmctb3JpZ2luIjpbYGJvcmRlcmAsYHBhZGRpbmdgLGBjb250ZW50YF19XSwiYmctcG9zaXRpb24iOlt7Ymc6bGUoKX1dLCJiZy1yZXBlYXQiOlt7Ymc6dWUoKX1dLCJiZy1zaXplIjpbe2JnOmRlKCl9XSwiYmctaW1hZ2UiOlt7Ymc6W2Bub25lYCx7bGluZWFyOlt7dG86W2B0YCxgdHJgLGByYCxgYnJgLGBiYCxgYmxgLGBsYCxgdGxgXX0sbXYsWCxZXSxyYWRpYWw6W2BgLFgsWV0sY29uaWM6W212LFgsWV19LEl2LEF2XX1dLCJiZy1jb2xvciI6W3tiZzpEKCl9XSwiZ3JhZGllbnQtZnJvbS1wb3MiOlt7ZnJvbTpmZSgpfV0sImdyYWRpZW50LXZpYS1wb3MiOlt7dmlhOmZlKCl9XSwiZ3JhZGllbnQtdG8tcG9zIjpbe3RvOmZlKCl9XSwiZ3JhZGllbnQtZnJvbSI6W3tmcm9tOkQoKX1dLCJncmFkaWVudC12aWEiOlt7dmlhOkQoKX1dLCJncmFkaWVudC10byI6W3t0bzpEKCl9XSxyb3VuZGVkOlt7cm91bmRlZDpwZSgpfV0sInJvdW5kZWQtcyI6W3sicm91bmRlZC1zIjpwZSgpfV0sInJvdW5kZWQtZSI6W3sicm91bmRlZC1lIjpwZSgpfV0sInJvdW5kZWQtdCI6W3sicm91bmRlZC10IjpwZSgpfV0sInJvdW5kZWQtciI6W3sicm91bmRlZC1yIjpwZSgpfV0sInJvdW5kZWQtYiI6W3sicm91bmRlZC1iIjpwZSgpfV0sInJvdW5kZWQtbCI6W3sicm91bmRlZC1sIjpwZSgpfV0sInJvdW5kZWQtc3MiOlt7InJvdW5kZWQtc3MiOnBlKCl9XSwicm91bmRlZC1zZSI6W3sicm91bmRlZC1zZSI6cGUoKX1dLCJyb3VuZGVkLWVlIjpbeyJyb3VuZGVkLWVlIjpwZSgpfV0sInJvdW5kZWQtZXMiOlt7InJvdW5kZWQtZXMiOnBlKCl9XSwicm91bmRlZC10bCI6W3sicm91bmRlZC10bCI6cGUoKX1dLCJyb3VuZGVkLXRyIjpbeyJyb3VuZGVkLXRyIjpwZSgpfV0sInJvdW5kZWQtYnIiOlt7InJvdW5kZWQtYnIiOnBlKCl9XSwicm91bmRlZC1ibCI6W3sicm91bmRlZC1ibCI6cGUoKX1dLCJib3JkZXItdyI6W3tib3JkZXI6bWUoKX1dLCJib3JkZXItdy14IjpbeyJib3JkZXIteCI6bWUoKX1dLCJib3JkZXItdy15IjpbeyJib3JkZXIteSI6bWUoKX1dLCJib3JkZXItdy1zIjpbeyJib3JkZXItcyI6bWUoKX1dLCJib3JkZXItdy1lIjpbeyJib3JkZXItZSI6bWUoKX1dLCJib3JkZXItdy1icyI6W3siYm9yZGVyLWJzIjptZSgpfV0sImJvcmRlci13LWJlIjpbeyJib3JkZXItYmUiOm1lKCl9XSwiYm9yZGVyLXctdCI6W3siYm9yZGVyLXQiOm1lKCl9XSwiYm9yZGVyLXctciI6W3siYm9yZGVyLXIiOm1lKCl9XSwiYm9yZGVyLXctYiI6W3siYm9yZGVyLWIiOm1lKCl9XSwiYm9yZGVyLXctbCI6W3siYm9yZGVyLWwiOm1lKCl9XSwiZGl2aWRlLXgiOlt7ImRpdmlkZS14IjptZSgpfV0sImRpdmlkZS14LXJldmVyc2UiOltgZGl2aWRlLXgtcmV2ZXJzZWBdLCJkaXZpZGUteSI6W3siZGl2aWRlLXkiOm1lKCl9XSwiZGl2aWRlLXktcmV2ZXJzZSI6W2BkaXZpZGUteS1yZXZlcnNlYF0sImJvcmRlci1zdHlsZSI6W3tib3JkZXI6Wy4uLmhlKCksYGhpZGRlbmAsYG5vbmVgXX1dLCJkaXZpZGUtc3R5bGUiOlt7ZGl2aWRlOlsuLi5oZSgpLGBoaWRkZW5gLGBub25lYF19XSwiYm9yZGVyLWNvbG9yIjpbe2JvcmRlcjpEKCl9XSwiYm9yZGVyLWNvbG9yLXgiOlt7ImJvcmRlci14IjpEKCl9XSwiYm9yZGVyLWNvbG9yLXkiOlt7ImJvcmRlci15IjpEKCl9XSwiYm9yZGVyLWNvbG9yLXMiOlt7ImJvcmRlci1zIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWUiOlt7ImJvcmRlci1lIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWJzIjpbeyJib3JkZXItYnMiOkQoKX1dLCJib3JkZXItY29sb3ItYmUiOlt7ImJvcmRlci1iZSI6RCgpfV0sImJvcmRlci1jb2xvci10IjpbeyJib3JkZXItdCI6RCgpfV0sImJvcmRlci1jb2xvci1yIjpbeyJib3JkZXItciI6RCgpfV0sImJvcmRlci1jb2xvci1iIjpbeyJib3JkZXItYiI6RCgpfV0sImJvcmRlci1jb2xvci1sIjpbeyJib3JkZXItbCI6RCgpfV0sImRpdmlkZS1jb2xvciI6W3tkaXZpZGU6RCgpfV0sIm91dGxpbmUtc3R5bGUiOlt7b3V0bGluZTpbLi4uaGUoKSxgbm9uZWAsYGhpZGRlbmBdfV0sIm91dGxpbmUtb2Zmc2V0IjpbeyJvdXRsaW5lLW9mZnNldCI6W0osWCxZXX1dLCJvdXRsaW5lLXciOlt7b3V0bGluZTpbYGAsSixNdixUdl19XSwib3V0bGluZS1jb2xvciI6W3tvdXRsaW5lOkQoKX1dLHNoYWRvdzpbe3NoYWRvdzpbYGAsYG5vbmVgLHUsTHYsanZdfV0sInNoYWRvdy1jb2xvciI6W3tzaGFkb3c6RCgpfV0sImluc2V0LXNoYWRvdyI6W3siaW5zZXQtc2hhZG93IjpbYG5vbmVgLGQsTHYsanZdfV0sImluc2V0LXNoYWRvdy1jb2xvciI6W3siaW5zZXQtc2hhZG93IjpEKCl9XSwicmluZy13Ijpbe3Jpbmc6bWUoKX1dLCJyaW5nLXctaW5zZXQiOltgcmluZy1pbnNldGBdLCJyaW5nLWNvbG9yIjpbe3Jpbmc6RCgpfV0sInJpbmctb2Zmc2V0LXciOlt7InJpbmctb2Zmc2V0IjpbSixUdl19XSwicmluZy1vZmZzZXQtY29sb3IiOlt7InJpbmctb2Zmc2V0IjpEKCl9XSwiaW5zZXQtcmluZy13IjpbeyJpbnNldC1yaW5nIjptZSgpfV0sImluc2V0LXJpbmctY29sb3IiOlt7Imluc2V0LXJpbmciOkQoKX1dLCJ0ZXh0LXNoYWRvdyI6W3sidGV4dC1zaGFkb3ciOltgbm9uZWAsZixMdixqdl19XSwidGV4dC1zaGFkb3ctY29sb3IiOlt7InRleHQtc2hhZG93IjpEKCl9XSxvcGFjaXR5Olt7b3BhY2l0eTpbSixYLFldfV0sIm1peC1ibGVuZCI6W3sibWl4LWJsZW5kIjpbLi4uZ2UoKSxgcGx1cy1kYXJrZXJgLGBwbHVzLWxpZ2h0ZXJgXX1dLCJiZy1ibGVuZCI6W3siYmctYmxlbmQiOmdlKCl9XSwibWFzay1jbGlwIjpbeyJtYXNrLWNsaXAiOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGBmaWxsYCxgc3Ryb2tlYCxgdmlld2BdfSxgbWFzay1uby1jbGlwYF0sIm1hc2stY29tcG9zaXRlIjpbe21hc2s6W2BhZGRgLGBzdWJ0cmFjdGAsYGludGVyc2VjdGAsYGV4Y2x1ZGVgXX1dLCJtYXNrLWltYWdlLWxpbmVhci1wb3MiOlt7Im1hc2stbGluZWFyIjpbSl19XSwibWFzay1pbWFnZS1saW5lYXItZnJvbS1wb3MiOlt7Im1hc2stbGluZWFyLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1saW5lYXItdG8tcG9zIjpbeyJtYXNrLWxpbmVhci10byI6X2UoKX1dLCJtYXNrLWltYWdlLWxpbmVhci1mcm9tLWNvbG9yIjpbeyJtYXNrLWxpbmVhci1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS1saW5lYXItdG8tY29sb3IiOlt7Im1hc2stbGluZWFyLXRvIjpEKCl9XSwibWFzay1pbWFnZS10LWZyb20tcG9zIjpbeyJtYXNrLXQtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLXQtdG8tcG9zIjpbeyJtYXNrLXQtdG8iOl9lKCl9XSwibWFzay1pbWFnZS10LWZyb20tY29sb3IiOlt7Im1hc2stdC1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS10LXRvLWNvbG9yIjpbeyJtYXNrLXQtdG8iOkQoKX1dLCJtYXNrLWltYWdlLXItZnJvbS1wb3MiOlt7Im1hc2stci1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2Utci10by1wb3MiOlt7Im1hc2stci10byI6X2UoKX1dLCJtYXNrLWltYWdlLXItZnJvbS1jb2xvciI6W3sibWFzay1yLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXItdG8tY29sb3IiOlt7Im1hc2stci10byI6RCgpfV0sIm1hc2staW1hZ2UtYi1mcm9tLXBvcyI6W3sibWFzay1iLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1iLXRvLXBvcyI6W3sibWFzay1iLXRvIjpfZSgpfV0sIm1hc2staW1hZ2UtYi1mcm9tLWNvbG9yIjpbeyJtYXNrLWItZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtYi10by1jb2xvciI6W3sibWFzay1iLXRvIjpEKCl9XSwibWFzay1pbWFnZS1sLWZyb20tcG9zIjpbeyJtYXNrLWwtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWwtdG8tcG9zIjpbeyJtYXNrLWwtdG8iOl9lKCl9XSwibWFzay1pbWFnZS1sLWZyb20tY29sb3IiOlt7Im1hc2stbC1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS1sLXRvLWNvbG9yIjpbeyJtYXNrLWwtdG8iOkQoKX1dLCJtYXNrLWltYWdlLXgtZnJvbS1wb3MiOlt7Im1hc2steC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UteC10by1wb3MiOlt7Im1hc2steC10byI6X2UoKX1dLCJtYXNrLWltYWdlLXgtZnJvbS1jb2xvciI6W3sibWFzay14LWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXgtdG8tY29sb3IiOlt7Im1hc2steC10byI6RCgpfV0sIm1hc2staW1hZ2UteS1mcm9tLXBvcyI6W3sibWFzay15LWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS15LXRvLXBvcyI6W3sibWFzay15LXRvIjpfZSgpfV0sIm1hc2staW1hZ2UteS1mcm9tLWNvbG9yIjpbeyJtYXNrLXktZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UteS10by1jb2xvciI6W3sibWFzay15LXRvIjpEKCl9XSwibWFzay1pbWFnZS1yYWRpYWwiOlt7Im1hc2stcmFkaWFsIjpbWCxZXX1dLCJtYXNrLWltYWdlLXJhZGlhbC1mcm9tLXBvcyI6W3sibWFzay1yYWRpYWwtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLXJhZGlhbC10by1wb3MiOlt7Im1hc2stcmFkaWFsLXRvIjpfZSgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLWZyb20tY29sb3IiOlt7Im1hc2stcmFkaWFsLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXJhZGlhbC10by1jb2xvciI6W3sibWFzay1yYWRpYWwtdG8iOkQoKX1dLCJtYXNrLWltYWdlLXJhZGlhbC1zaGFwZSI6W3sibWFzay1yYWRpYWwiOltgY2lyY2xlYCxgZWxsaXBzZWBdfV0sIm1hc2staW1hZ2UtcmFkaWFsLXNpemUiOlt7Im1hc2stcmFkaWFsIjpbe2Nsb3Nlc3Q6W2BzaWRlYCxgY29ybmVyYF0sZmFydGhlc3Q6W2BzaWRlYCxgY29ybmVyYF19XX1dLCJtYXNrLWltYWdlLXJhZGlhbC1wb3MiOlt7Im1hc2stcmFkaWFsLWF0IjpiKCl9XSwibWFzay1pbWFnZS1jb25pYy1wb3MiOlt7Im1hc2stY29uaWMiOltKXX1dLCJtYXNrLWltYWdlLWNvbmljLWZyb20tcG9zIjpbeyJtYXNrLWNvbmljLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1jb25pYy10by1wb3MiOlt7Im1hc2stY29uaWMtdG8iOl9lKCl9XSwibWFzay1pbWFnZS1jb25pYy1mcm9tLWNvbG9yIjpbeyJtYXNrLWNvbmljLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWNvbmljLXRvLWNvbG9yIjpbeyJtYXNrLWNvbmljLXRvIjpEKCl9XSwibWFzay1tb2RlIjpbe21hc2s6W2BhbHBoYWAsYGx1bWluYW5jZWAsYG1hdGNoYF19XSwibWFzay1vcmlnaW4iOlt7Im1hc2stb3JpZ2luIjpbYGJvcmRlcmAsYHBhZGRpbmdgLGBjb250ZW50YCxgZmlsbGAsYHN0cm9rZWAsYHZpZXdgXX1dLCJtYXNrLXBvc2l0aW9uIjpbe21hc2s6bGUoKX1dLCJtYXNrLXJlcGVhdCI6W3ttYXNrOnVlKCl9XSwibWFzay1zaXplIjpbe21hc2s6ZGUoKX1dLCJtYXNrLXR5cGUiOlt7Im1hc2stdHlwZSI6W2BhbHBoYWAsYGx1bWluYW5jZWBdfV0sIm1hc2staW1hZ2UiOlt7bWFzazpbYG5vbmVgLFgsWV19XSxmaWx0ZXI6W3tmaWx0ZXI6W2BgLGBub25lYCxYLFldfV0sYmx1cjpbe2JsdXI6dmUoKX1dLGJyaWdodG5lc3M6W3ticmlnaHRuZXNzOltKLFgsWV19XSxjb250cmFzdDpbe2NvbnRyYXN0OltKLFgsWV19XSwiZHJvcC1zaGFkb3ciOlt7ImRyb3Atc2hhZG93IjpbYGAsYG5vbmVgLHAsTHYsanZdfV0sImRyb3Atc2hhZG93LWNvbG9yIjpbeyJkcm9wLXNoYWRvdyI6RCgpfV0sZ3JheXNjYWxlOlt7Z3JheXNjYWxlOltgYCxKLFgsWV19XSwiaHVlLXJvdGF0ZSI6W3siaHVlLXJvdGF0ZSI6W0osWCxZXX1dLGludmVydDpbe2ludmVydDpbYGAsSixYLFldfV0sc2F0dXJhdGU6W3tzYXR1cmF0ZTpbSixYLFldfV0sc2VwaWE6W3tzZXBpYTpbYGAsSixYLFldfV0sImJhY2tkcm9wLWZpbHRlciI6W3siYmFja2Ryb3AtZmlsdGVyIjpbYGAsYG5vbmVgLFgsWV19XSwiYmFja2Ryb3AtYmx1ciI6W3siYmFja2Ryb3AtYmx1ciI6dmUoKX1dLCJiYWNrZHJvcC1icmlnaHRuZXNzIjpbeyJiYWNrZHJvcC1icmlnaHRuZXNzIjpbSixYLFldfV0sImJhY2tkcm9wLWNvbnRyYXN0IjpbeyJiYWNrZHJvcC1jb250cmFzdCI6W0osWCxZXX1dLCJiYWNrZHJvcC1ncmF5c2NhbGUiOlt7ImJhY2tkcm9wLWdyYXlzY2FsZSI6W2BgLEosWCxZXX1dLCJiYWNrZHJvcC1odWUtcm90YXRlIjpbeyJiYWNrZHJvcC1odWUtcm90YXRlIjpbSixYLFldfV0sImJhY2tkcm9wLWludmVydCI6W3siYmFja2Ryb3AtaW52ZXJ0IjpbYGAsSixYLFldfV0sImJhY2tkcm9wLW9wYWNpdHkiOlt7ImJhY2tkcm9wLW9wYWNpdHkiOltKLFgsWV19XSwiYmFja2Ryb3Atc2F0dXJhdGUiOlt7ImJhY2tkcm9wLXNhdHVyYXRlIjpbSixYLFldfV0sImJhY2tkcm9wLXNlcGlhIjpbeyJiYWNrZHJvcC1zZXBpYSI6W2BgLEosWCxZXX1dLCJib3JkZXItY29sbGFwc2UiOlt7Ym9yZGVyOltgY29sbGFwc2VgLGBzZXBhcmF0ZWBdfV0sImJvcmRlci1zcGFjaW5nIjpbeyJib3JkZXItc3BhY2luZyI6dygpfV0sImJvcmRlci1zcGFjaW5nLXgiOlt7ImJvcmRlci1zcGFjaW5nLXgiOncoKX1dLCJib3JkZXItc3BhY2luZy15IjpbeyJib3JkZXItc3BhY2luZy15Ijp3KCl9XSwidGFibGUtbGF5b3V0Ijpbe3RhYmxlOltgYXV0b2AsYGZpeGVkYF19XSxjYXB0aW9uOlt7Y2FwdGlvbjpbYHRvcGAsYGJvdHRvbWBdfV0sdHJhbnNpdGlvbjpbe3RyYW5zaXRpb246W2BgLGBhbGxgLGBjb2xvcnNgLGBvcGFjaXR5YCxgc2hhZG93YCxgdHJhbnNmb3JtYCxgbm9uZWAsWCxZXX1dLCJ0cmFuc2l0aW9uLWJlaGF2aW9yIjpbe3RyYW5zaXRpb246W2Bub3JtYWxgLGBkaXNjcmV0ZWBdfV0sZHVyYXRpb246W3tkdXJhdGlvbjpbSixgaW5pdGlhbGAsWCxZXX1dLGVhc2U6W3tlYXNlOltgbGluZWFyYCxgaW5pdGlhbGAsXyxYLFldfV0sZGVsYXk6W3tkZWxheTpbSixYLFldfV0sYW5pbWF0ZTpbe2FuaW1hdGU6W2Bub25lYCx2LFgsWV19XSxiYWNrZmFjZTpbe2JhY2tmYWNlOltgaGlkZGVuYCxgdmlzaWJsZWBdfV0scGVyc3BlY3RpdmU6W3twZXJzcGVjdGl2ZTpbaCxYLFldfV0sInBlcnNwZWN0aXZlLW9yaWdpbiI6W3sicGVyc3BlY3RpdmUtb3JpZ2luIjp4KCl9XSxyb3RhdGU6W3tyb3RhdGU6eWUoKX1dLCJyb3RhdGUteCI6W3sicm90YXRlLXgiOnllKCl9XSwicm90YXRlLXkiOlt7InJvdGF0ZS15Ijp5ZSgpfV0sInJvdGF0ZS16IjpbeyJyb3RhdGUteiI6eWUoKX1dLHNjYWxlOlt7c2NhbGU6YmUoKX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpiZSgpfV0sInNjYWxlLXkiOlt7InNjYWxlLXkiOmJlKCl9XSwic2NhbGUteiI6W3sic2NhbGUteiI6YmUoKX1dLCJzY2FsZS0zZCI6W2BzY2FsZS0zZGBdLHNrZXc6W3tza2V3Ok8oKX1dLCJza2V3LXgiOlt7InNrZXcteCI6TygpfV0sInNrZXcteSI6W3sic2tldy15IjpPKCl9XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06W1gsWSxgYCxgbm9uZWAsYGdwdWAsYGNwdWBdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOngoKX1dLCJ0cmFuc2Zvcm0tc3R5bGUiOlt7dHJhbnNmb3JtOltgM2RgLGBmbGF0YF19XSx0cmFuc2xhdGU6W3t0cmFuc2xhdGU6eGUoKX1dLCJ0cmFuc2xhdGUteCI6W3sidHJhbnNsYXRlLXgiOnhlKCl9XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15Ijp4ZSgpfV0sInRyYW5zbGF0ZS16IjpbeyJ0cmFuc2xhdGUteiI6eGUoKX1dLCJ0cmFuc2xhdGUtbm9uZSI6W2B0cmFuc2xhdGUtbm9uZWBdLHpvb206W3t6b29tOlttdixYLFldfV0sYWNjZW50Olt7YWNjZW50OkQoKX1dLGFwcGVhcmFuY2U6W3thcHBlYXJhbmNlOltgbm9uZWAsYGF1dG9gXX1dLCJjYXJldC1jb2xvciI6W3tjYXJldDpEKCl9XSwiY29sb3Itc2NoZW1lIjpbe3NjaGVtZTpbYG5vcm1hbGAsYGRhcmtgLGBsaWdodGAsYGxpZ2h0LWRhcmtgLGBvbmx5LWRhcmtgLGBvbmx5LWxpZ2h0YF19XSxjdXJzb3I6W3tjdXJzb3I6W2BhdXRvYCxgZGVmYXVsdGAsYHBvaW50ZXJgLGB3YWl0YCxgdGV4dGAsYG1vdmVgLGBoZWxwYCxgbm90LWFsbG93ZWRgLGBub25lYCxgY29udGV4dC1tZW51YCxgcHJvZ3Jlc3NgLGBjZWxsYCxgY3Jvc3NoYWlyYCxgdmVydGljYWwtdGV4dGAsYGFsaWFzYCxgY29weWAsYG5vLWRyb3BgLGBncmFiYCxgZ3JhYmJpbmdgLGBhbGwtc2Nyb2xsYCxgY29sLXJlc2l6ZWAsYHJvdy1yZXNpemVgLGBuLXJlc2l6ZWAsYGUtcmVzaXplYCxgcy1yZXNpemVgLGB3LXJlc2l6ZWAsYG5lLXJlc2l6ZWAsYG53LXJlc2l6ZWAsYHNlLXJlc2l6ZWAsYHN3LXJlc2l6ZWAsYGV3LXJlc2l6ZWAsYG5zLXJlc2l6ZWAsYG5lc3ctcmVzaXplYCxgbndzZS1yZXNpemVgLGB6b29tLWluYCxgem9vbS1vdXRgLFgsWV19XSwiZmllbGQtc2l6aW5nIjpbeyJmaWVsZC1zaXppbmciOltgZml4ZWRgLGBjb250ZW50YF19XSwicG9pbnRlci1ldmVudHMiOlt7InBvaW50ZXItZXZlbnRzIjpbYGF1dG9gLGBub25lYF19XSxyZXNpemU6W3tyZXNpemU6W2Bub25lYCxgYCxgeWAsYHhgXX1dLCJzY3JvbGwtYmVoYXZpb3IiOlt7c2Nyb2xsOltgYXV0b2AsYHNtb290aGBdfV0sInNjcm9sbGJhci10aHVtYi1jb2xvciI6W3sic2Nyb2xsYmFyLXRodW1iIjpEKCl9XSwic2Nyb2xsYmFyLXRyYWNrLWNvbG9yIjpbeyJzY3JvbGxiYXItdHJhY2siOkQoKX1dLCJzY3JvbGxiYXItZ3V0dGVyIjpbeyJzY3JvbGxiYXItZ3V0dGVyIjpbYGF1dG9gLGBzdGFibGVgLGBib3RoYF19XSwic2Nyb2xsYmFyLXciOlt7c2Nyb2xsYmFyOltgYXV0b2AsYHRoaW5gLGBub25lYF19XSwic2Nyb2xsLW0iOlt7InNjcm9sbC1tIjp3KCl9XSwic2Nyb2xsLW14IjpbeyJzY3JvbGwtbXgiOncoKX1dLCJzY3JvbGwtbXkiOlt7InNjcm9sbC1teSI6dygpfV0sInNjcm9sbC1tcyI6W3sic2Nyb2xsLW1zIjp3KCl9XSwic2Nyb2xsLW1lIjpbeyJzY3JvbGwtbWUiOncoKX1dLCJzY3JvbGwtbWJzIjpbeyJzY3JvbGwtbWJzIjp3KCl9XSwic2Nyb2xsLW1iZSI6W3sic2Nyb2xsLW1iZSI6dygpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10Ijp3KCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOncoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6dygpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjp3KCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjp3KCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOncoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6dygpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjp3KCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOncoKX1dLCJzY3JvbGwtcGJzIjpbeyJzY3JvbGwtcGJzIjp3KCl9XSwic2Nyb2xsLXBiZSI6W3sic2Nyb2xsLXBiZSI6dygpfV0sInNjcm9sbC1wdCI6W3sic2Nyb2xsLXB0Ijp3KCl9XSwic2Nyb2xsLXByIjpbeyJzY3JvbGwtcHIiOncoKX1dLCJzY3JvbGwtcGIiOlt7InNjcm9sbC1wYiI6dygpfV0sInNjcm9sbC1wbCI6W3sic2Nyb2xsLXBsIjp3KCl9XSwic25hcC1hbGlnbiI6W3tzbmFwOltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBhbGlnbi1ub25lYF19XSwic25hcC1zdG9wIjpbe3NuYXA6W2Bub3JtYWxgLGBhbHdheXNgXX1dLCJzbmFwLXR5cGUiOlt7c25hcDpbYG5vbmVgLGB4YCxgeWAsYGJvdGhgXX1dLCJzbmFwLXN0cmljdG5lc3MiOlt7c25hcDpbYG1hbmRhdG9yeWAsYHByb3hpbWl0eWBdfV0sdG91Y2g6W3t0b3VjaDpbYGF1dG9gLGBub25lYCxgbWFuaXB1bGF0aW9uYF19XSwidG91Y2gteCI6W3sidG91Y2gtcGFuIjpbYHhgLGBsZWZ0YCxgcmlnaHRgXX1dLCJ0b3VjaC15IjpbeyJ0b3VjaC1wYW4iOltgeWAsYHVwYCxgZG93bmBdfV0sInRvdWNoLXB6IjpbYHRvdWNoLXBpbmNoLXpvb21gXSxzZWxlY3Q6W3tzZWxlY3Q6W2Bub25lYCxgdGV4dGAsYGFsbGAsYGF1dG9gXX1dLCJ3aWxsLWNoYW5nZSI6W3sid2lsbC1jaGFuZ2UiOltgYXV0b2AsYHNjcm9sbGAsYGNvbnRlbnRzYCxgdHJhbnNmb3JtYCxYLFldfV0sZmlsbDpbe2ZpbGw6W2Bub25lYCwuLi5EKCldfV0sInN0cm9rZS13Ijpbe3N0cm9rZTpbSixNdixUdixFdl19XSxzdHJva2U6W3tzdHJva2U6W2Bub25lYCwuLi5EKCldfV0sImZvcmNlZC1jb2xvci1hZGp1c3QiOlt7ImZvcmNlZC1jb2xvci1hZGp1c3QiOltgYXV0b2AsYG5vbmVgXX1dfSxjb25mbGljdGluZ0NsYXNzR3JvdXBzOnsiY29udGFpbmVyLW5hbWVkIjpbYGNvbnRhaW5lci10eXBlYF0sb3ZlcmZsb3c6W2BvdmVyZmxvdy14YCxgb3ZlcmZsb3cteWBdLG92ZXJzY3JvbGw6W2BvdmVyc2Nyb2xsLXhgLGBvdmVyc2Nyb2xsLXlgXSxpbnNldDpbYGluc2V0LXhgLGBpbnNldC15YCxgaW5zZXQtYnNgLGBpbnNldC1iZWAsYHN0YXJ0YCxgZW5kYCxgdG9wYCxgcmlnaHRgLGBib3R0b21gLGBsZWZ0YF0sImluc2V0LXgiOltgcmlnaHRgLGBsZWZ0YF0sImluc2V0LXkiOltgdG9wYCxgYm90dG9tYF0sZmxleDpbYGJhc2lzYCxgZ3Jvd2AsYHNocmlua2BdLGdhcDpbYGdhcC14YCxgZ2FwLXlgXSxwOltgcHhgLGBweWAsYHBzYCxgcGVgLGBwYnNgLGBwYmVgLGBwdGAsYHByYCxgcGJgLGBwbGBdLHB4OltgcHJgLGBwbGBdLHB5OltgcHRgLGBwYmBdLG06W2BteGAsYG15YCxgbXNgLGBtZWAsYG1ic2AsYG1iZWAsYG10YCxgbXJgLGBtYmAsYG1sYF0sbXg6W2BtcmAsYG1sYF0sbXk6W2BtdGAsYG1iYF0sc2l6ZTpbYHdgLGBoYF0sImZvbnQtc2l6ZSI6W2BsZWFkaW5nYF0sImZ2bi1ub3JtYWwiOltgZnZuLW9yZGluYWxgLGBmdm4tc2xhc2hlZC16ZXJvYCxgZnZuLWZpZ3VyZWAsYGZ2bi1zcGFjaW5nYCxgZnZuLWZyYWN0aW9uYF0sImZ2bi1vcmRpbmFsIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLXNsYXNoZWQtemVybyI6W2Bmdm4tbm9ybWFsYF0sImZ2bi1maWd1cmUiOltgZnZuLW5vcm1hbGBdLCJmdm4tc3BhY2luZyI6W2Bmdm4tbm9ybWFsYF0sImZ2bi1mcmFjdGlvbiI6W2Bmdm4tbm9ybWFsYF0sImxpbmUtY2xhbXAiOltgZGlzcGxheWAsYG92ZXJmbG93YF0scm91bmRlZDpbYHJvdW5kZWQtc2AsYHJvdW5kZWQtZWAsYHJvdW5kZWQtdGAsYHJvdW5kZWQtcmAsYHJvdW5kZWQtYmAsYHJvdW5kZWQtbGAsYHJvdW5kZWQtc3NgLGByb3VuZGVkLXNlYCxgcm91bmRlZC1lZWAsYHJvdW5kZWQtZXNgLGByb3VuZGVkLXRsYCxgcm91bmRlZC10cmAsYHJvdW5kZWQtYnJgLGByb3VuZGVkLWJsYF0sInJvdW5kZWQtcyI6W2Byb3VuZGVkLXNzYCxgcm91bmRlZC1lc2BdLCJyb3VuZGVkLWUiOltgcm91bmRlZC1zZWAsYHJvdW5kZWQtZWVgXSwicm91bmRlZC10IjpbYHJvdW5kZWQtdGxgLGByb3VuZGVkLXRyYF0sInJvdW5kZWQtciI6W2Byb3VuZGVkLXRyYCxgcm91bmRlZC1icmBdLCJyb3VuZGVkLWIiOltgcm91bmRlZC1icmAsYHJvdW5kZWQtYmxgXSwicm91bmRlZC1sIjpbYHJvdW5kZWQtdGxgLGByb3VuZGVkLWJsYF0sImJvcmRlci1zcGFjaW5nIjpbYGJvcmRlci1zcGFjaW5nLXhgLGBib3JkZXItc3BhY2luZy15YF0sImJvcmRlci13IjpbYGJvcmRlci13LXhgLGBib3JkZXItdy15YCxgYm9yZGVyLXctc2AsYGJvcmRlci13LWVgLGBib3JkZXItdy1ic2AsYGJvcmRlci13LWJlYCxgYm9yZGVyLXctdGAsYGJvcmRlci13LXJgLGBib3JkZXItdy1iYCxgYm9yZGVyLXctbGBdLCJib3JkZXItdy14IjpbYGJvcmRlci13LXJgLGBib3JkZXItdy1sYF0sImJvcmRlci13LXkiOltgYm9yZGVyLXctdGAsYGJvcmRlci13LWJgXSwiYm9yZGVyLWNvbG9yIjpbYGJvcmRlci1jb2xvci14YCxgYm9yZGVyLWNvbG9yLXlgLGBib3JkZXItY29sb3Itc2AsYGJvcmRlci1jb2xvci1lYCxgYm9yZGVyLWNvbG9yLWJzYCxgYm9yZGVyLWNvbG9yLWJlYCxgYm9yZGVyLWNvbG9yLXRgLGBib3JkZXItY29sb3ItcmAsYGJvcmRlci1jb2xvci1iYCxgYm9yZGVyLWNvbG9yLWxgXSwiYm9yZGVyLWNvbG9yLXgiOltgYm9yZGVyLWNvbG9yLXJgLGBib3JkZXItY29sb3ItbGBdLCJib3JkZXItY29sb3IteSI6W2Bib3JkZXItY29sb3ItdGAsYGJvcmRlci1jb2xvci1iYF0sdHJhbnNsYXRlOltgdHJhbnNsYXRlLXhgLGB0cmFuc2xhdGUteWAsYHRyYW5zbGF0ZS1ub25lYF0sInRyYW5zbGF0ZS1ub25lIjpbYHRyYW5zbGF0ZWAsYHRyYW5zbGF0ZS14YCxgdHJhbnNsYXRlLXlgLGB0cmFuc2xhdGUtemBdLCJzY3JvbGwtbSI6W2BzY3JvbGwtbXhgLGBzY3JvbGwtbXlgLGBzY3JvbGwtbXNgLGBzY3JvbGwtbWVgLGBzY3JvbGwtbWJzYCxgc2Nyb2xsLW1iZWAsYHNjcm9sbC1tdGAsYHNjcm9sbC1tcmAsYHNjcm9sbC1tYmAsYHNjcm9sbC1tbGBdLCJzY3JvbGwtbXgiOltgc2Nyb2xsLW1yYCxgc2Nyb2xsLW1sYF0sInNjcm9sbC1teSI6W2BzY3JvbGwtbXRgLGBzY3JvbGwtbWJgXSwic2Nyb2xsLXAiOltgc2Nyb2xsLXB4YCxgc2Nyb2xsLXB5YCxgc2Nyb2xsLXBzYCxgc2Nyb2xsLXBlYCxgc2Nyb2xsLXBic2AsYHNjcm9sbC1wYmVgLGBzY3JvbGwtcHRgLGBzY3JvbGwtcHJgLGBzY3JvbGwtcGJgLGBzY3JvbGwtcGxgXSwic2Nyb2xsLXB4IjpbYHNjcm9sbC1wcmAsYHNjcm9sbC1wbGBdLCJzY3JvbGwtcHkiOltgc2Nyb2xsLXB0YCxgc2Nyb2xsLXBiYF0sdG91Y2g6W2B0b3VjaC14YCxgdG91Y2gteWAsYHRvdWNoLXB6YF0sInRvdWNoLXgiOltgdG91Y2hgXSwidG91Y2gteSI6W2B0b3VjaGBdLCJ0b3VjaC1weiI6W2B0b3VjaGBdfSxjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6eyJmb250LXNpemUiOltgbGVhZGluZ2BdfSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cHM6W2Bjb250YWluZXItdHlwZWBdLG9yZGVyU2Vuc2l0aXZlTW9kaWZpZXJzOltgKmAsYCoqYCxgYWZ0ZXJgLGBiYWNrZHJvcGAsYGJlZm9yZWAsYGRldGFpbHMtY29udGVudGAsYGZpbGVgLGBmaXJzdC1sZXR0ZXJgLGBmaXJzdC1saW5lYCxgbWFya2VyYCxgcGxhY2Vob2xkZXJgLGBzZWxlY3Rpb25gXX19KTtmdW5jdGlvbiBaKC4uLmUpe3JldHVybiBZdih4XyhlKSl9dmFyIFh2PUYoe19fbmFtZTpgQWxlcnRgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfSx2YXJpYW50Ont9fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihuLHIpPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBhbGVydGAsY2xhc3M6TyhOKFopKE4oJHYpKHt2YXJpYW50OmUudmFyaWFudH0pLHQuY2xhc3MpKSxyb2xlOmBhbGVydGB9LFtJKG4uJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxadj1GKHtfX25hbWU6YEFsZXJ0RGVzY3JpcHRpb25gLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgYWxlcnQtZGVzY3JpcHRpb25gLGNsYXNzOk8oTihaKShgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc20gdGV4dC1iYWxhbmNlIG1kOnRleHQtcHJldHR5IFsmX3A6bm90KDpsYXN0LWNoaWxkKV06bWItNCBbJl9hXTp1bmRlcmxpbmUgWyZfYV06dW5kZXJsaW5lLW9mZnNldC0zIFsmX2FdOmhvdmVyOnRleHQtZm9yZWdyb3VuZGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksUXY9Rih7X19uYW1lOmBBbGVydFRpdGxlYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGFsZXJ0LXRpdGxlYCxjbGFzczpPKE4oWikoYGZvbnQtbWVkaXVtIGdyb3VwLWhhcy1bPnN2Z10vYWxlcnQ6Y29sLXN0YXJ0LTIgY24tZm9udC1oZWFkaW5nIFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSwkdj13XyhgZ3JpZCBnYXAtMC41IHJvdW5kZWQtbGcgYm9yZGVyIHB4LTIuNSBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGhhcy1kYXRhLVtzbG90PWFsZXJ0LWFjdGlvbl06cmVsYXRpdmUgaGFzLWRhdGEtW3Nsb3Q9YWxlcnQtYWN0aW9uXTpwci0xOCBoYXMtWz5zdmddOmdyaWQtY29scy1bYXV0b18xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMiAqOltzdmddOnJvdy1zcGFuLTIgKjpbc3ZnXTp0cmFuc2xhdGUteS0wLjUgKjpbc3ZnXTp0ZXh0LWN1cnJlbnQgKjpbc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBncm91cC9hbGVydCByZWxhdGl2ZSB3LWZ1bGxgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZGAsZGVzdHJ1Y3RpdmU6YHRleHQtZGVzdHJ1Y3RpdmUgYmctY2FyZCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZGVzdHJ1Y3RpdmUvOTAgKjpbc3ZnXTp0ZXh0LWN1cnJlbnRgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YH19KTtmdW5jdGlvbiBleShlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgP2AnJHtlfSdgOm5ldyBpeSgpLnNlcmlhbGl6ZShlKX12YXIgdHk9YCBfLSw7OiE/LiciKClbXXt9QCovXFwmIyVcYF4rPD0+fH4kMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YCxueT0oZnVuY3Rpb24oKXtsZXQgZT1uZXcgVWludDhBcnJheSgxMjgpO2ZvcihsZXQgdD0wO3Q8Njk7dCsrKWVbdHkuY2hhckNvZGVBdCh0KV09dCsxO2ZvcihsZXQgdD02NTt0PD05MDt0KyspZVt0XT1lW3QrMzJdO3JldHVybiBlfSkoKTtmdW5jdGlvbiByeShlLHQpe2lmKGU9PT10KXJldHVybiAwO2xldCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49ZS5jaGFyQ29kZUF0KGkpLGE9dC5jaGFyQ29kZUF0KGkpO2lmKG49PT1hKWNvbnRpbnVlO2xldCBvPW48MTI4JiZueVtuXT9ueVtuXTpuKzEyOCxzPWE8MTI4JiZueVthXT9ueVthXTphKzEyODtpZihvIT09cylyZXR1cm4gbzxzPy0xOjE7cj09PTAmJihyPW4+YT8tMToxKX1yZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aD9yOmUubGVuZ3RoPHQubGVuZ3RoPy0xOjF9dmFyIGl5PShmdW5jdGlvbigpe2NsYXNzIGV7I2U9bmV3IE1hcDtjb21wYXJlKGUsdCl7bGV0IG49dHlwZW9mIGUscj10eXBlb2YgdDtyZXR1cm4gbj09PWBzdHJpbmdgJiZyPT09YHN0cmluZ2A/cnkoZSx0KTpuPT09YG51bWJlcmAmJnI9PT1gbnVtYmVyYD9lLXQ6cnkodGhpcy5zZXJpYWxpemUoZSwhMCksdGhpcy5zZXJpYWxpemUodCwhMCkpfXNlcmlhbGl6ZShlLHQpe2lmKGU9PT1udWxsKXJldHVybmBudWxsYDtzd2l0Y2godHlwZW9mIGUpe2Nhc2Vgc3RyaW5nYDpyZXR1cm4gdD9lOmAnJHtlfSdgO2Nhc2VgYmlnaW50YDpyZXR1cm5gJHtlfW5gO2Nhc2Vgb2JqZWN0YDpyZXR1cm4gdGhpcy4kb2JqZWN0KGUpO2Nhc2VgZnVuY3Rpb25gOnJldHVybiB0aGlzLiRmdW5jdGlvbihlKX1yZXR1cm4gU3RyaW5nKGUpfXNlcmlhbGl6ZU9iamVjdChlKXtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYodCE9PWBbb2JqZWN0IE9iamVjdF1gKXJldHVybiB0aGlzLnNlcmlhbGl6ZUJ1aWx0SW5UeXBlKHQubGVuZ3RoPDEwP2B1bmtub3duOiR7dH1gOnQuc2xpY2UoOCwtMSksZSk7bGV0IG49ZS5jb25zdHJ1Y3RvcixyPW49PT1PYmplY3R8fG49PT12b2lkIDA/YGA6bi5uYW1lO2lmKHIhPT1gYCYmZ2xvYmFsVGhpc1tyXT09PW4pcmV0dXJuIHRoaXMuc2VyaWFsaXplQnVpbHRJblR5cGUocixlKTtpZihgdG9KU09OYGluIGUmJnR5cGVvZiBlLnRvSlNPTj09YGZ1bmN0aW9uYCl7bGV0IHQ9ZS50b0pTT04oKTtyZXR1cm4gcisodHlwZW9mIHQ9PWBvYmplY3RgJiZ0P3RoaXMuJG9iamVjdCh0KTpgKCR7dGhpcy5zZXJpYWxpemUodCl9KWApfWxldCBpPU9iamVjdC5rZXlzKGUpLnNvcnQocnkpLGE9YCR7cn17YDtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IG49aVt0XTthKz1gJHtufToke3RoaXMuc2VyaWFsaXplKGVbbl0pfWAsdDxpLmxlbmd0aC0xJiYoYSs9YCxgKX1yZXR1cm4gYStgfWB9c2VyaWFsaXplQnVpbHRJblR5cGUoZSx0KXtsZXQgbj10aGlzW2AkYCtlXTtpZihuKXJldHVybiBuLmNhbGwodGhpcyx0KTtpZih0eXBlb2YgdC5lbnRyaWVzPT1gZnVuY3Rpb25gKXJldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0LmVudHJpZXMoKSk7dGhyb3cgRXJyb3IoYENhbm5vdCBzZXJpYWxpemUgJHtlfWApfXNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0KXtsZXQgbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlWzBdLHRbMF0pKSxyPWAke2V9e2A7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2xldFt0LGldPW5bZV07cis9YCR7dGhpcy5zZXJpYWxpemUodCwhMCl9OiR7dGhpcy5zZXJpYWxpemUoaSl9YCxlPG4ubGVuZ3RoLTEmJihyKz1gLGApfXJldHVybiByK2B9YH0kb2JqZWN0KGUpe2xldCB0PXRoaXMuI2UuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiYodGhpcy4jZS5zZXQoZSxgIyR7dGhpcy4jZS5zaXplfWApLHQ9dGhpcy5zZXJpYWxpemVPYmplY3QoZSksdGhpcy4jZS5zZXQoZSx0KSksdH0kZnVuY3Rpb24oZSl7bGV0IHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoLTE1KT09PWBbbmF0aXZlIGNvZGVdIH1gP2Ake2UubmFtZXx8YGB9KClbbmF0aXZlXWA6YCR7ZS5uYW1lfSgke2UubGVuZ3RofSkke3QucmVwbGFjZSgvXHMqXG5ccyovZyxgYCl9YH0kQXJyYXkoZSl7bGV0IHQ9YFtgO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPXRoaXMuc2VyaWFsaXplKGVbbl0pLG48ZS5sZW5ndGgtMSYmKHQrPWAsYCk7cmV0dXJuIHQrYF1gfSREYXRlKGUpe3RyeXtyZXR1cm5gRGF0ZSgke2UudG9JU09TdHJpbmcoKX0pYH1jYXRjaHtyZXR1cm5gRGF0ZShudWxsKWB9fSRBcnJheUJ1ZmZlcihlKXtyZXR1cm5gQXJyYXlCdWZmZXJbJHtuZXcgVWludDhBcnJheShlKS5qb2luKGAsYCl9XWB9JFNldChlKXtyZXR1cm5gU2V0JHt0aGlzLiRBcnJheShBcnJheS5mcm9tKGUpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlLHQpKSl9YH0kTWFwKGUpe3JldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoYE1hcGAsZS5lbnRyaWVzKCkpfX1mb3IobGV0IHQgb2ZbYEVycm9yYCxgUmVnRXhwYCxgVVJMYF0pZS5wcm90b3R5cGVbYCRgK3RdPWZ1bmN0aW9uKGUpe3JldHVybmAke3R9KCR7ZX0pYH07Zm9yKGxldCB0IG9mW2BJbnQ4QXJyYXlgLGBVaW50OEFycmF5YCxgVWludDhDbGFtcGVkQXJyYXlgLGBJbnQxNkFycmF5YCxgVWludDE2QXJyYXlgLGBJbnQzMkFycmF5YCxgVWludDMyQXJyYXlgLGBGbG9hdDMyQXJyYXlgLGBGbG9hdDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYCxgKX1dYH07Zm9yKGxldCB0IG9mW2BCaWdJbnQ2NEFycmF5YCxgQmlnVWludDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYG4sYCl9JHtlLmxlbmd0aD4wP2BuYDpgYH1dYH07cmV0dXJuIGV9KSgpO2Z1bmN0aW9uIGF5KGUsdCl7cmV0dXJuIGU9PT10fHxleShlKT09PWV5KHQpfWZ1bmN0aW9uIG95KGUsdCl7bGV0IG49dHlwZW9mIGU9PWBzdHJpbmdgJiYhdD9gJHtlfUNvbnRleHRgOnQscj1TeW1ib2wobik7cmV0dXJuW3Q9PntsZXQgbj15cihyLHQpO2lmKG58fG49PT1udWxsKXJldHVybiBuO3Rocm93IEVycm9yKGBJbmplY3Rpb24gXGAke3IudG9TdHJpbmcoKX1cYCBub3QgZm91bmQuIENvbXBvbmVudCBtdXN0IGJlIHVzZWQgd2l0aGluICR7QXJyYXkuaXNBcnJheShlKT9gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJHtlLmpvaW4oYCwgYCl9YDpgXGAke2V9XGBgfWApfSxlPT4odnIocixlKSxlKV19ZnVuY3Rpb24gc3koKXtsZXQgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKDtlIT1udWxsJiZlLnNoYWRvd1Jvb3QhPW51bGwmJmUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50IT1udWxsOyllPWUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBlfWZ1bmN0aW9uIGN5KGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIGx5KGUsdCl7cmV0dXJuIGN5KGUpPyExOkFycmF5LmlzQXJyYXkoZSk/ZS5zb21lKGU9PmF5KGUsdCkpOmF5KGUsdCl9ZnVuY3Rpb24gdXkoZSx0KXtyZXR1cm4gRmUoKT8oSWUoZSx0KSwhMCk6ITF9ZnVuY3Rpb24gZHkoZSl7bGV0IHQ9ITEsbixyPVBlKCEwKTtyZXR1cm4oKC4uLmkpPT4odHx8PShuPXIucnVuKCgpPT5lKC4uLmkpKSwhMCksbikpfXZhciBmeT10eXBlb2Ygd2luZG93PGB1YCYmdHlwZW9mIGRvY3VtZW50PGB1YDt0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8YHVgJiZnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7dmFyIHB5PWU9PmUhPT12b2lkIDAsbXk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoeT1lPT5teS5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAsZ3k9X3koKTtmdW5jdGlvbiBfeSgpe3ZhciBlLHQ7cmV0dXJuIGZ5JiYhISgoZT13aW5kb3cpIT1udWxsJiYoZT1lLm5hdmlnYXRvcikhPW51bGwmJmUudXNlckFnZW50KSYmKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KXx8KCh0PXdpbmRvdyk9PW51bGx8fCh0PXQubmF2aWdhdG9yKT09bnVsbD92b2lkIDA6dC5tYXhUb3VjaFBvaW50cyk+MiYmL2lQYWR8TWFjaW50b3NoLy50ZXN0KHdpbmRvdz8ubmF2aWdhdG9yLnVzZXJBZ2VudCkpfWZ1bmN0aW9uIHZ5KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W2VdfWZ1bmN0aW9uIHl5KGUpe3JldHVybiBlfHxGcygpfWZ1bmN0aW9uIGJ5KGUpe2lmKCFmeSlyZXR1cm4gZTtsZXQgdD0wLG4scixpPSgpPT57LS10LHImJnQ8PTAmJihyLnN0b3AoKSxuPXZvaWQgMCxyPXZvaWQgMCl9O3JldHVybigoLi4uYSk9Pih0Kz0xLHJ8fChyPVBlKCEwKSxuPXIucnVuKCgpPT5lKC4uLmEpKSksdXkoaSksbikpfWZ1bmN0aW9uIHh5KGUpe3JldHVybiBadChqKGUpP25ldyBQcm94eSh7fSx7Z2V0KHQsbixyKXtyZXR1cm4gTihSZWZsZWN0LmdldChlLnZhbHVlLG4scikpfSxzZXQodCxuLHIpe3JldHVybiBqKGUudmFsdWVbbl0pJiYhaihyKT9lLnZhbHVlW25dLnZhbHVlPXI6ZS52YWx1ZVtuXT1yLCEwfSxkZWxldGVQcm9wZXJ0eSh0LG4pe3JldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUudmFsdWUsbil9LGhhcyh0LG4pe3JldHVybiBSZWZsZWN0LmhhcyhlLnZhbHVlLG4pfSxvd25LZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUudmFsdWUpfSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKXtyZXR1cm57ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9fX0pOmUpfWZ1bmN0aW9uIFN5KGUpe3JldHVybiB4eShXKGUpKX1mdW5jdGlvbiBDeShlLC4uLnQpe2xldCBuPXQuZmxhdCgpLHI9blswXTtyZXR1cm4gU3koKCk9Pk9iamVjdC5mcm9tRW50cmllcyh0eXBlb2Ygcj09YGZ1bmN0aW9uYD9PYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKChbZSx0XSk9PiFyKG1uKHQpLGUpKTpPYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKGU9PiFuLmluY2x1ZGVzKGVbMF0pKSkpfWZ1bmN0aW9uIHd5KGUsdD0xZTQpe3JldHVybiB2bigobixyKT0+e2xldCBpPW1uKGUpLGEsbz0oKT0+c2V0VGltZW91dCgoKT0+e2k9bW4oZSkscigpfSxtbih0KSk7cmV0dXJuIHV5KCgpPT57Y2xlYXJUaW1lb3V0KGEpfSkse2dldCgpe3JldHVybiBuKCksaX0sc2V0KGUpe2k9ZSxyKCksY2xlYXJUaW1lb3V0KGEpLGE9bygpfX19KX1mdW5jdGlvbiBUeShlLHQpe3l5KHQpJiZlYShlLHQpfWZ1bmN0aW9uIEV5KGUsdCxuKXtyZXR1cm4gRXIoZSx0LHsuLi5uLGltbWVkaWF0ZTohMH0pfXZhciBEeT1meT93aW5kb3c6dm9pZCAwO2Z5JiZ3aW5kb3cuZG9jdW1lbnQsZnkmJndpbmRvdy5uYXZpZ2F0b3IsZnkmJndpbmRvdy5sb2NhdGlvbjtmdW5jdGlvbiBPeShlKXtsZXQgdD1tbihlKTtyZXR1cm4gdD8uJGVsPz90fWZ1bmN0aW9uIGt5KC4uLmUpe2xldCB0PShlLHQsbixyKT0+KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sciksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4scikpLG49VygoKT0+e2xldCB0PXZ5KG1uKGVbMF0pKS5maWx0ZXIoZT0+ZSE9bnVsbCk7cmV0dXJuIHQuZXZlcnkoZT0+dHlwZW9mIGUhPWBzdHJpbmdgKT90OnZvaWQgMH0pO3JldHVybiBFeSgoKT0+W24udmFsdWU/Lm1hcChlPT5PeShlKSk/P1tEeV0uZmlsdGVyKGU9PmUhPW51bGwpLHZ5KG1uKG4udmFsdWU/ZVsxXTplWzBdKSksdnkoTihuLnZhbHVlP2VbMl06ZVsxXSkpLG1uKG4udmFsdWU/ZVszXTplWzJdKV0sKFtlLG4scixpXSxhLG8pPT57aWYoIWU/Lmxlbmd0aHx8IW4/Lmxlbmd0aHx8IXI/Lmxlbmd0aClyZXR1cm47bGV0IHM9aHkoaSk/ey4uLml9OmksYz1lLmZsYXRNYXAoZT0+bi5mbGF0TWFwKG49PnIubWFwKHI9PnQoZSxuLHIscykpKSk7bygoKT0+e2MuZm9yRWFjaChlPT5lKCkpfSl9LHtmbHVzaDpgcG9zdGB9KX1mdW5jdGlvbiBBeSgpe2xldCBlPXVuKCExKSx0PUZzKCk7cmV0dXJuIHQmJlppKCgpPT57ZS52YWx1ZT0hMH0sdCksZX1mdW5jdGlvbiBqeShlKXtsZXQgdD1BeSgpO3JldHVybiBXKCgpPT4odC52YWx1ZSwhIWUoKSkpfWZ1bmN0aW9uIE15KGUpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lOnR5cGVvZiBlPT1gc3RyaW5nYD90PT50LmtleT09PWU6QXJyYXkuaXNBcnJheShlKT90PT5lLmluY2x1ZGVzKHQua2V5KTooKT0+ITB9ZnVuY3Rpb24gTnkoLi4uZSl7bGV0IHQsbixyPXt9O2UubGVuZ3RoPT09Mz8odD1lWzBdLG49ZVsxXSxyPWVbMl0pOmUubGVuZ3RoPT09Mj90eXBlb2YgZVsxXT09YG9iamVjdGA/KHQ9ITAsbj1lWzBdLHI9ZVsxXSk6KHQ9ZVswXSxuPWVbMV0pOih0PSEwLG49ZVswXSk7bGV0e3RhcmdldDppPUR5LGV2ZW50TmFtZTphPWBrZXlkb3duYCxwYXNzaXZlOm89ITEsZGVkdXBlOnM9ITF9PXIsYz1NeSh0KTtyZXR1cm4ga3koaSxhLGU9PntlLnJlcGVhdCYmbW4ocyl8fGMoZSkmJm4oZSl9LG8pfWZ1bmN0aW9uIFB5KGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiBGeShlLHQsbj17fSl7bGV0e3dpbmRvdzpyPUR5LC4uLml9PW4sYSxvPWp5KCgpPT5yJiZgUmVzaXplT2JzZXJ2ZXJgaW4gcikscz0oKT0+e2EmJj0oYS5kaXNjb25uZWN0KCksdm9pZCAwKX0sYz1FcihXKCgpPT57bGV0IHQ9bW4oZSk7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5tYXAoZT0+T3koZSkpOltPeSh0KV19KSxlPT57aWYocygpLG8udmFsdWUmJnIpe2E9bmV3IFJlc2l6ZU9ic2VydmVyKHQpO2ZvcihsZXQgdCBvZiBlKXQmJmEub2JzZXJ2ZSh0LGkpfX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgcG9zdGB9KSxsPSgpPT57cygpLGMoKX07cmV0dXJuIHV5KGwpLHtpc1N1cHBvcnRlZDpvLHN0b3A6bH19ZnVuY3Rpb24gSXkoZSx0LG4scj17fSl7dmFyIGksYTtsZXR7Y2xvbmU6bz0hMSxwYXNzaXZlOnM9ITEsZXZlbnROYW1lOmMsZGVlcDpsPSExLGRlZmF1bHRWYWx1ZTp1LHNob3VsZEVtaXQ6ZH09cixmPUZzKCkscD1ufHxmPy5lbWl0fHwoZj09bnVsbHx8KGk9Zi4kZW1pdCk9PW51bGw/dm9pZCAwOmkuYmluZChmKSl8fChmPT1udWxsfHwoYT1mLnByb3h5KT09bnVsbHx8KGE9YS4kZW1pdCk9PW51bGw/dm9pZCAwOmEuYmluZChmPy5wcm94eSkpLG09Yzt0fHw9YG1vZGVsVmFsdWVgLG18fD1gdXBkYXRlOiR7dC50b1N0cmluZygpfWA7bGV0IGg9ZT0+bz90eXBlb2Ygbz09YGZ1bmN0aW9uYD9vKGUpOlB5KGUpOmUsZz0oKT0+cHkoZVt0XSk/aChlW3RdKTp1LF89ZT0+e2Q/ZChlKSYmcChtLGUpOnAobSxlKX07aWYocyl7bGV0IG49TShnKCkpLHI9ITE7cmV0dXJuIEVyKCgpPT5lW3RdLGU9PntyfHwocj0hMCxuLnZhbHVlPWgoZSksUW4oKCk9PnI9ITEpKX0pLEVyKG4sbj0+eyFyJiYobiE9PWVbdF18fGwpJiZfKG4pfSx7ZGVlcDpsfSksbn1yZXR1cm4gVyh7Z2V0KCl7cmV0dXJuIGcoKX0sc2V0KGUpe18oZSl9fSl9ZnVuY3Rpb24gTHkoZSl7cmV0dXJuIGU/ZS5mbGF0TWFwKGU9PmUudHlwZT09PUw/THkoZS5jaGlsZHJlbik6W2VdKTpbXX12YXIgUnk9W2BJTlBVVGAsYFRFWFRBUkVBYF07ZnVuY3Rpb24genkoZSx0LG4scj17fSl7aWYoIXR8fHIuZW5hYmxlSWdub3JlZEVsZW1lbnQmJlJ5LmluY2x1ZGVzKHQubm9kZU5hbWUpKXJldHVybiBudWxsO2xldHthcnJvd0tleU9wdGlvbnM6aT1gYm90aGAsYXR0cmlidXRlTmFtZTphPWBbZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbV1gLGl0ZW1zQXJyYXk6bz1bXSxsb29wOnM9ITAsZGlyOmM9YGx0cmAscHJldmVudFNjcm9sbDpsPSEwLGZvY3VzOnU9ITF9PXIsW2QsZixwLG0saCxnXT1bZS5rZXk9PT1gQXJyb3dSaWdodGAsZS5rZXk9PT1gQXJyb3dMZWZ0YCxlLmtleT09PWBBcnJvd1VwYCxlLmtleT09PWBBcnJvd0Rvd25gLGUua2V5PT09YEhvbWVgLGUua2V5PT09YEVuZGBdLF89cHx8bSx2PWR8fGY7aWYoIWgmJiFnJiYoIV8mJiF2fHxpPT09YHZlcnRpY2FsYCYmdnx8aT09PWBob3Jpem9udGFsYCYmXykpcmV0dXJuIG51bGw7bGV0IHk9bj9BcnJheS5mcm9tKG4ucXVlcnlTZWxlY3RvckFsbChhKSk6bztpZigheS5sZW5ndGgpcmV0dXJuIG51bGw7bCYmZS5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPW51bGw7cmV0dXJuIHZ8fF8/Yj1CeSh5LHQse2dvRm9yd2FyZDpfP206Yz09PWBsdHJgP2Q6Zixsb29wOnN9KTpoP2I9eS5hdCgwKXx8bnVsbDpnJiYoYj15LmF0KC0xKXx8bnVsbCksdSYmYj8uZm9jdXMoKSxifWZ1bmN0aW9uIEJ5KGUsdCxuLHI9ZS5pbmNsdWRlcyh0KT9lLmxlbmd0aDplLmxlbmd0aCsxKXtpZigtLXI9PT0wKXJldHVybiBudWxsO2xldCBpPWUuaW5kZXhPZih0KSxhO2lmKGE9aT09PS0xP24uZ29Gb3J3YXJkPzA6ZS5sZW5ndGgtMTpuLmdvRm9yd2FyZD9pKzE6aS0xLCFuLmxvb3AmJihhPDB8fGE+PWUubGVuZ3RoKSlyZXR1cm4gbnVsbDtsZXQgbz1lWyhhK2UubGVuZ3RoKSVlLmxlbmd0aF07cmV0dXJuIG8/by5oYXNBdHRyaWJ1dGUoYGRpc2FibGVkYCkmJm8uZ2V0QXR0cmlidXRlKGBkaXNhYmxlZGApIT09YGZhbHNlYD9CeShlLG8sbixyKTpvOm51bGx9dmFyW1Z5LEh5XT1veShgQ29uZmlnUHJvdmlkZXJgKTtmdW5jdGlvbiBVeShlKXtsZXQgdD1WeSh7ZGlyOk0oYGx0cmApfSk7cmV0dXJuIFcoKCk9PmU/LnZhbHVlfHx0LmRpcj8udmFsdWV8fGBsdHJgKX1mdW5jdGlvbiBXeShlKXtsZXQgdD1GcygpLG49dD8udHlwZS5lbWl0cyxyPXt9O3JldHVybiBuPy5sZW5ndGh8fGNvbnNvbGUud2FybihgTm8gZW1pdHRlZCBldmVudCBmb3VuZC4gUGxlYXNlIGNoZWNrIGNvbXBvbmVudDogJHt0Py50eXBlLl9fbmFtZX1gKSxuPy5mb3JFYWNoKHQ9PntyW2NlKEUodCkpXT0oLi4ubik9PmUodCwuLi5uKX0pLHJ9ZnVuY3Rpb24gR3koKXtsZXQgZT1GcygpLHQ9TSgpLG49VygoKT0+cigpKTskaSgoKT0+e24udmFsdWUhPT1yKCkmJnBuKHQpfSk7ZnVuY3Rpb24gcigpe3JldHVybiB0LnZhbHVlJiZgJGVsYGluIHQudmFsdWUmJltgI3RleHRgLGAjY29tbWVudGBdLmluY2x1ZGVzKHQudmFsdWUuJGVsLm5vZGVOYW1lKT90LnZhbHVlLiRlbC5uZXh0RWxlbWVudFNpYmxpbmc6T3kodCl9bGV0IGk9T2JqZWN0LmFzc2lnbih7fSxlLmV4cG9zZWQpLGE9e307Zm9yKGxldCB0IGluIGUucHJvcHMpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5lLnByb3BzW3RdfSk7aWYoT2JqZWN0LmtleXMoaSkubGVuZ3RoPjApZm9yKGxldCBlIGluIGkpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pW2VdfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIiRlbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZS52bm9kZS5lbH0pLGUuZXhwb3NlZD1hO2Z1bmN0aW9uIG8obil7aWYodC52YWx1ZT1uLG4mJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiJGVsIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5uIGluc3RhbmNlb2YgRWxlbWVudD9uOm4uJGVsfSksIShuIGluc3RhbmNlb2YgRWxlbWVudCkmJiFPYmplY3QuaGFzT3duKG4sYCRlbGApKSl7bGV0IHQ9bi4kLmV4cG9zZWQscj1PYmplY3QuYXNzaWduKHt9LGEpO2ZvcihsZXQgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dFtlXX0pO2UuZXhwb3NlZD1yfX1yZXR1cm57Zm9yd2FyZFJlZjpvLGN1cnJlbnRSZWY6dCxjdXJyZW50RWxlbWVudDpufX1mdW5jdGlvbiBLeShlKXtsZXQgdD1GcygpLG49T2JqZWN0LmtleXModD8udHlwZS5wcm9wcz8/e30pLnJlZHVjZSgoZSxuKT0+e2xldCByPSh0Py50eXBlLnByb3BzW25dKS5kZWZhdWx0O3JldHVybiByIT09dm9pZCAwJiYoZVtuXT1yKSxlfSx7fSkscj1TbihlKTtyZXR1cm4gVygoKT0+e2xldCBlPXt9LGk9dD8udm5vZGUucHJvcHM/P3t9O3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKHQ9PntlW0UodCldPWlbdF19KSxPYmplY3Qua2V5cyh7Li4ubiwuLi5lfSkucmVkdWNlKChlLHQpPT4oci52YWx1ZVt0XSE9PXZvaWQgMCYmKGVbdF09ci52YWx1ZVt0XSksZSkse30pfSl9ZnVuY3Rpb24gcXkoZSx0KXtsZXQgbj1LeShlKSxyPXQ/V3kodCk6e307cmV0dXJuIFcoKCk9Pih7Li4ubi52YWx1ZSwuLi5yfSkpfXZhciBKeT0wO2Z1bmN0aW9uIFl5KGUsdD1gcmVrYWApe2lmKGUpcmV0dXJuIGU7bGV0IG4scj1WeSh7dXNlSWQ6dm9pZCAwfSk7cmV0dXJuIG49ci51c2VJZD9yLnVzZUlkKCk6YHVzZUlkYGluIHh1P2FpPy4oKTpgJHsrK0p5fWAsdD9gJHt0fS0ke259YDpufWZ1bmN0aW9uIFh5KGUsdCl7bGV0IG49TShlKTtmdW5jdGlvbiByKGUpe3JldHVybiB0W24udmFsdWVdW2VdPz9uLnZhbHVlfXJldHVybntzdGF0ZTpuLGRpc3BhdGNoOmU9PntuLnZhbHVlPXIoZSl9fX1mdW5jdGlvbiBaeShlLHQpe2xldCBuPU0oe30pLHI9TShgbm9uZWApLGk9TShlKSxhPWUudmFsdWU/YG1vdW50ZWRgOmB1bm1vdW50ZWRgLG8scz10LnZhbHVlPy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Pz9EeSx7c3RhdGU6YyxkaXNwYXRjaDpsfT1YeShhLHttb3VudGVkOntVTk1PVU5UOmB1bm1vdW50ZWRgLEFOSU1BVElPTl9PVVQ6YHVubW91bnRTdXNwZW5kZWRgfSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDpgbW91bnRlZGAsQU5JTUFUSU9OX0VORDpgdW5tb3VudGVkYH0sdW5tb3VudGVkOntNT1VOVDpgbW91bnRlZGB9fSksdT1lPT57aWYoZnkpe2xldCBuPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTt0LnZhbHVlPy5kaXNwYXRjaEV2ZW50KG4pfX07RXIoZSxhc3luYyhlLGkpPT57bGV0IGE9aSE9PWU7aWYoYXdhaXQgUW4oKSxhKXtsZXQgYT1yLnZhbHVlLG89UXkodC52YWx1ZSk7ZT8obChgTU9VTlRgKSx1KGBlbnRlcmApLG89PT1gbm9uZWAmJnUoYGFmdGVyLWVudGVyYCkpOm89PT1gbm9uZWB8fG89PT1gdW5kZWZpbmVkYHx8bi52YWx1ZT8uZGlzcGxheT09PWBub25lYD8obChgVU5NT1VOVGApLHUoYGxlYXZlYCksdShgYWZ0ZXItbGVhdmVgKSk6aSYmYSE9PW8/KGwoYEFOSU1BVElPTl9PVVRgKSx1KGBsZWF2ZWApKToobChgVU5NT1VOVGApLHUoYGFmdGVyLWxlYXZlYCkpfX0se2ltbWVkaWF0ZTohMH0pO2xldCBkPWU9PntpZihlLnRhcmdldCE9PXQudmFsdWUpcmV0dXJuO2xldCBuPVF5KHQudmFsdWUpLHI9bi5pbmNsdWRlcyhDU1MuZXNjYXBlKGUuYW5pbWF0aW9uTmFtZSkpLGE9Yy52YWx1ZT09PWBtb3VudGVkYD9gZW50ZXJgOmBsZWF2ZWA7aWYociYmKHUoYGFmdGVyLSR7YX1gKSxsKGBBTklNQVRJT05fRU5EYCksIWkudmFsdWUpKXtsZXQgZT10LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlO3QudmFsdWUuc3R5bGUuYW5pbWF0aW9uRmlsbE1vZGU9YGZvcndhcmRzYCxvPXM/LnNldFRpbWVvdXQoKCk9Pnt0LnZhbHVlPy5zdHlsZS5hbmltYXRpb25GaWxsTW9kZT09PWBmb3J3YXJkc2AmJih0LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlPWUpfSl9bj09PWBub25lYCYmbChgQU5JTUFUSU9OX0VORGApfSxmPWU9PntlLnRhcmdldD09PXQudmFsdWUmJihyLnZhbHVlPVF5KHQudmFsdWUpKX0scD1Fcih0LChlLHQpPT57ZT8obi52YWx1ZT1nZXRDb21wdXRlZFN0eWxlKGUpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uc3RhcnRgLGYpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uY2FuY2VsYCxkKSxlLmFkZEV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpOihsKGBBTklNQVRJT05fRU5EYCksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbnN0YXJ0YCxmKSx0Py5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpfSx7aW1tZWRpYXRlOiEwfSksbT1FcihjLCgpPT57bGV0IGU9UXkodC52YWx1ZSk7ci52YWx1ZT1jLnZhbHVlPT09YG1vdW50ZWRgP2U6YG5vbmVgfSk7cmV0dXJuIHRhKCgpPT57cCgpLG0oKSx0LnZhbHVlJiYodC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25zdGFydGAsZiksdC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQudmFsdWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uZW5kYCxkKSksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pfSkse2lzUHJlc2VudDpXKCgpPT5bYG1vdW50ZWRgLGB1bm1vdW50U3VzcGVuZGVkYF0uaW5jbHVkZXMoYy52YWx1ZSkpfX1mdW5jdGlvbiBReShlKXtyZXR1cm4gZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKS5hbmltYXRpb25OYW1lfHxgbm9uZWB9dmFyICR5PUYoe25hbWU6YFByZXNlbmNlYCxwcm9wczp7cHJlc2VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW59fSxzbG90czp7fSxzZXR1cChlLHtzbG90czp0LGV4cG9zZTpufSl7bGV0e3ByZXNlbnQ6cixmb3JjZU1vdW50Oml9PXluKGUpLGE9TSgpLHtpc1ByZXNlbnQ6b309WnkocixhKTtuKHtwcmVzZW50Om99KTtsZXQgcz10LmRlZmF1bHQoe3ByZXNlbnQ6by52YWx1ZX0pO3M9THkoc3x8W10pO2xldCBjPUZzKCk7aWYocyYmcz8ubGVuZ3RoPjEpe2xldCBlPWM/LnBhcmVudD8udHlwZS5uYW1lP2A8JHtjLnBhcmVudC50eXBlLm5hbWV9IC8+YDpgY29tcG9uZW50YDt0aHJvdyBFcnJvcihbYERldGVjdGVkIGFuIGludmFsaWQgY2hpbGRyZW4gZm9yIFxgJHtlfVxgIGZvciAgXGBQcmVzZW5jZVxgIGNvbXBvbmVudC5gLGBgLCJOb3RlOiBQcmVzZW5jZSB3b3JrcyBzaW1pbGFybHkgdG8gYHYtaWZgIGRpcmVjdGx5LCBidXQgaXQgd2FpdHMgZm9yIGFuaW1hdGlvbi90cmFuc2l0aW9uIHRvIGZpbmlzaGVkIGJlZm9yZSB1bm1vdW50aW5nLiBTbyBpdCBleHBlY3Qgb25seSBvbmUgZGlyZWN0IGNoaWxkIG9mIHZhbGlkIFZOb2RlIHR5cGUuIixgWW91IGNhbiBhcHBseSBhIGZldyBzb2x1dGlvbnM6YCxbIlByb3ZpZGUgYSBzaW5nbGUgY2hpbGQgZWxlbWVudCBzbyB0aGF0IGBwcmVzZW5jZWAgZGlyZWN0aXZlIGF0dGFjaCBjb3JyZWN0bHkuIixgRW5zdXJlIHRoZSBmaXJzdCBjaGlsZCBpcyBhbiBhY3R1YWwgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmF3IHRleHQgbm9kZSBvciBjb21tZW50IG5vZGUuYF0ubWFwKGU9PmAgIC0gJHtlfWApLmpvaW4oYApgKV0uam9pbihgCmApKX1yZXR1cm4oKT0+aS52YWx1ZXx8ci52YWx1ZXx8by52YWx1ZT90Yyh0LmRlZmF1bHQoe3ByZXNlbnQ6by52YWx1ZX0pWzBdLHtyZWY6ZT0+e2xldCB0PU95KGUpO3JldHVybiB0Py5oYXNBdHRyaWJ1dGU9PT12b2lkIDB8fCh0Py5oYXNBdHRyaWJ1dGUoYGRhdGEtcmVrYS1wb3BwZXItY29udGVudC13cmFwcGVyYCk/YS52YWx1ZT10LmZpcnN0RWxlbWVudENoaWxkOmEudmFsdWU9dCksdH19KTpudWxsfX0pLGViPUYoe25hbWU6YFByaW1pdGl2ZVNsb3RgLGluaGVyaXRBdHRyczohMSxzZXR1cChlLHthdHRyczp0LHNsb3RzOm59KXtyZXR1cm4oKT0+e2lmKCFuLmRlZmF1bHQpcmV0dXJuIG51bGw7bGV0IGU9THkobi5kZWZhdWx0KCkpLHI9ZS5maW5kSW5kZXgoZT0+ZS50eXBlIT09Y3MpO2lmKHI9PT0tMSlyZXR1cm4gZTtsZXQgaT1lW3JdO2RlbGV0ZSBpLnByb3BzPy5yZWY7bGV0IGE9aS5wcm9wcz9rcyh0LGkucHJvcHMpOnQsbz1Dcyh7Li4uaSxwcm9wczp7fX0sYSk7cmV0dXJuIGUubGVuZ3RoPT09MT9vOihlW3JdPW8sZSl9fX0pLHRiPVtgYXJlYWAsYGltZ2AsYGlucHV0YF0sbmI9Rih7bmFtZTpgUHJpbWl0aXZlYCxpbmhlcml0QXR0cnM6ITEscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhczp7dHlwZTpbU3RyaW5nLE9iamVjdF0sZGVmYXVsdDpgZGl2YH19LHNldHVwKGUse2F0dHJzOnQsc2xvdHM6bn0pe2xldCByPWUuYXNDaGlsZD9gdGVtcGxhdGVgOmUuYXM7cmV0dXJuIHR5cGVvZiByPT1gc3RyaW5nYCYmdGIuaW5jbHVkZXMocik/KCk9PnRjKHIsdCk6cj09PWB0ZW1wbGF0ZWA/KCk9PnRjKGViLHQse2RlZmF1bHQ6bi5kZWZhdWx0fSk6KCk9PnRjKGUuYXMsdCx7ZGVmYXVsdDpuLmRlZmF1bHR9KX19KTtmdW5jdGlvbiByYigpe2xldCBlPU0oKTtyZXR1cm57cHJpbWl0aXZlRWxlbWVudDplLGN1cnJlbnRFbGVtZW50OlcoKCk9PltgI3RleHRgLGAjY29tbWVudGBdLmluY2x1ZGVzKGUudmFsdWU/LiRlbC5ub2RlTmFtZSk/ZS52YWx1ZT8uJGVsLm5leHRFbGVtZW50U2libGluZzpPeShlKSl9fXZhcltpYixhYl09b3koYENvbGxhcHNpYmxlUm9vdGApLG9iPUYoe19fbmFtZTpgQ29sbGFwc2libGVSb290YCxwcm9wczp7ZGVmYXVsdE9wZW46e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxvcGVuOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDp2b2lkIDB9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTpvcGVuYF0sc2V0dXAoZSx7ZXhwb3NlOnQsZW1pdDpufSl7bGV0IHI9ZSxpPUl5KHIsYG9wZW5gLG4se2RlZmF1bHRWYWx1ZTpyLmRlZmF1bHRPcGVuLHBhc3NpdmU6ci5vcGVuPT09dm9pZCAwfSkse2Rpc2FibGVkOmEsdW5tb3VudE9uSGlkZTpvfT15bihyKTtyZXR1cm4gYWIoe2NvbnRlbnRJZDpgYCxkaXNhYmxlZDphLG9wZW46aSx1bm1vdW50T25IaWRlOm8sb25PcGVuVG9nZ2xlOigpPT57YS52YWx1ZXx8KGkudmFsdWU9IWkudmFsdWUpfX0pLHQoe29wZW46aX0pLEd5KCksKGUsdCk9PihSKCksQihOKG5iKSx7YXM6ZS5hcywiYXMtY2hpbGQiOnIuYXNDaGlsZCwiZGF0YS1zdGF0ZSI6TihpKT9gb3BlbmA6YGNsb3NlZGAsImRhdGEtZGlzYWJsZWQiOk4oYSk/YGA6dm9pZCAwfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse29wZW46TihpKX0pXSksXzozfSw4LFtgYXNgLGBhcy1jaGlsZGAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYF0pKX19KSxzYj1GKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBDb2xsYXBzaWJsZUNvbnRlbnRgLHByb3BzOntmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgY29udGVudEZvdW5kYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1pYigpO2kuY29udGVudElkfHw9WXkodm9pZCAwLGByZWthLWNvbGxhcHNpYmxlLWNvbnRlbnRgKTtsZXQgYT1NKCkse2ZvcndhcmRSZWY6byxjdXJyZW50RWxlbWVudDpzfT1HeSgpLGM9TSgwKSxsPU0oMCksdT1XKCgpPT5pLm9wZW4udmFsdWUpLGQ9TSh1LnZhbHVlKSxmPU0oKTtFcigoKT0+W3UudmFsdWUsYS52YWx1ZT8ucHJlc2VudF0sYXN5bmMoKT0+e2F3YWl0IFFuKCk7bGV0IGU9cy52YWx1ZTtpZighZSlyZXR1cm47Zi52YWx1ZT1mLnZhbHVlfHx7dHJhbnNpdGlvbkR1cmF0aW9uOmUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6ZS5zdHlsZS5hbmltYXRpb25OYW1lfSxlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1gMHNgLGUuc3R5bGUuYW5pbWF0aW9uTmFtZT1gbm9uZWA7bGV0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsLnZhbHVlPXQuaGVpZ2h0LGMudmFsdWU9dC53aWR0aCxkLnZhbHVlfHwoZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249Zi52YWx1ZS50cmFuc2l0aW9uRHVyYXRpb24sZS5zdHlsZS5hbmltYXRpb25OYW1lPWYudmFsdWUuYW5pbWF0aW9uTmFtZSl9LHtpbW1lZGlhdGU6ITB9KTtsZXQgcD1XKCgpPT5kLnZhbHVlJiZpLm9wZW4udmFsdWUpO3JldHVybiBaaSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QudmFsdWU9ITF9KX0pLGt5KHMsYGJlZm9yZW1hdGNoYCxlPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aS5vbk9wZW5Ub2dnbGUoKSxyKGBjb250ZW50Rm91bmRgKX0pfSksKGUsdCk9PihSKCksQihOKCR5KSx7cmVmX2tleTpgcHJlc2VudFJlZmAscmVmOmEscHJlc2VudDplLmZvcmNlTW91bnR8fE4oaSkub3Blbi52YWx1ZSwiZm9yY2UtbW91bnQiOiEwfSx7ZGVmYXVsdDpQKCh7cHJlc2VudDp0fSk9PltIKE4obmIpLGtzKGUuJGF0dHJzLHtpZDpOKGkpLmNvbnRlbnRJZCxyZWY6TihvKSwiYXMtY2hpbGQiOm4uYXNDaGlsZCxhczplLmFzLGhpZGRlbjp0P3ZvaWQgMDpOKGkpLnVubW91bnRPbkhpZGUudmFsdWU/YGA6YHVudGlsLWZvdW5kYCwiZGF0YS1zdGF0ZSI6cC52YWx1ZT92b2lkIDA6TihpKS5vcGVuLnZhbHVlP2BvcGVuYDpgY2xvc2VkYCwiZGF0YS1kaXNhYmxlZCI6TihpKS5kaXNhYmxlZD8udmFsdWU/YGA6dm9pZCAwLHN0eWxlOnsiLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0IjpgJHtsLnZhbHVlfXB4YCwiLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgiOmAke2MudmFsdWV9cHhgfX0pLHtkZWZhdWx0OlAoKCk9PlshTihpKS51bm1vdW50T25IaWRlLnZhbHVlfHx0P0koZS4kc2xvdHMsYGRlZmF1bHRgLHtrZXk6MH0pOlRzKGB2LWlmYCwhMCldKSxfOjJ9LDEwNDAsW2BpZGAsYGFzLWNoaWxkYCxgYXNgLGBoaWRkZW5gLGBkYXRhLXN0YXRlYCxgZGF0YS1kaXNhYmxlZGAsYHN0eWxlYF0pXSksXzozfSw4LFtgcHJlc2VudGBdKSl9fSksY2I9Rih7X19uYW1lOmBDb2xsYXBzaWJsZVRyaWdnZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWU7R3koKTtsZXQgbj1pYigpO3JldHVybihlLHIpPT4oUigpLEIoTihuYikse3R5cGU6ZS5hcz09PWBidXR0b25gP2BidXR0b25gOnZvaWQgMCxhczplLmFzLCJhcy1jaGlsZCI6dC5hc0NoaWxkLCJhcmlhLWNvbnRyb2xzIjpOKG4pLmNvbnRlbnRJZCwiYXJpYS1leHBhbmRlZCI6TihuKS5vcGVuLnZhbHVlLCJkYXRhLXN0YXRlIjpOKG4pLm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjpOKG4pLmRpc2FibGVkPy52YWx1ZT9gYDp2b2lkIDAsZGlzYWJsZWQ6TihuKS5kaXNhYmxlZD8udmFsdWUsb25DbGljazpOKG4pLm9uT3BlblRvZ2dsZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYHR5cGVgLGBhc2AsYGFzLWNoaWxkYCxgYXJpYS1jb250cm9sc2AsYGFyaWEtZXhwYW5kZWRgLGBkYXRhLXN0YXRlYCxgZGF0YS1kaXNhYmxlZGAsYGRpc2FibGVkYCxgb25DbGlja2BdKSl9fSk7ZnVuY3Rpb24gbGIoe3R5cGU6ZSxkZWZhdWx0VmFsdWU6dCxtb2RlbFZhbHVlOm59KXtsZXQgcj1ufHx0O3JldHVybiBuIT09dm9pZCAwfHx0IT09dm9pZCAwP0FycmF5LmlzQXJyYXkocik/YG11bHRpcGxlYDpgc2luZ2xlYDplPz9gc2luZ2xlYH1mdW5jdGlvbiB1Yih7dHlwZTplLGRlZmF1bHRWYWx1ZTp0LG1vZGVsVmFsdWU6bn0pe3JldHVybiBlfHxsYih7dHlwZTplLGRlZmF1bHRWYWx1ZTp0LG1vZGVsVmFsdWU6bn0pfWZ1bmN0aW9uIGRiKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnR9KXtyZXR1cm4gdD09PXZvaWQgMD9lPT09YHNpbmdsZWA/dm9pZCAwOltdOnR9ZnVuY3Rpb24gZmIoZSx0KXtsZXQgbj1XKCgpPT51YihlKSkscj1JeShlLGBtb2RlbFZhbHVlYCx0LHtkZWZhdWx0VmFsdWU6ZGIoZSkscGFzc2l2ZTplLm1vZGVsVmFsdWU9PT12b2lkIDAsZGVlcDohMH0pO2Z1bmN0aW9uIGkoZSl7aWYobi52YWx1ZT09PWBzaW5nbGVgKXIudmFsdWU9YXkoZSxyLnZhbHVlKT92b2lkIDA6ZTtlbHNle2xldCB0PUFycmF5LmlzQXJyYXkoci52YWx1ZSk/Wy4uLnIudmFsdWV8fFtdXTpbci52YWx1ZV0uZmlsdGVyKEJvb2xlYW4pO2lmKGx5KHQsZSkpe2xldCBuPXQuZmluZEluZGV4KHQ9PmF5KHQsZSkpO3Quc3BsaWNlKG4sMSl9ZWxzZSB0LnB1c2goZSk7ci52YWx1ZT10fX1yZXR1cm57bW9kZWxWYWx1ZTpyLGNoYW5nZU1vZGVsVmFsdWU6aSxpc1NpbmdsZTpXKCgpPT5uLnZhbHVlPT09YHNpbmdsZWApfX12YXJbcGIsbWJdPW95KGBBY2NvcmRpb25Sb290YCksaGI9Rih7X19uYW1lOmBBY2NvcmRpb25Sb290YCxwcm9wczp7Y29sbGFwc2libGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGRpcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LG9yaWVudGF0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmB2ZXJ0aWNhbGB9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LHR5cGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxtb2RlbFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRlZmF1bHRWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LHtkaXI6aSxkaXNhYmxlZDphLHVubW91bnRPbkhpZGU6b309eW4obikscz1VeShpKSx7bW9kZWxWYWx1ZTpjLGNoYW5nZU1vZGVsVmFsdWU6bCxpc1NpbmdsZTp1fT1mYihuLHIpLHtmb3J3YXJkUmVmOmQsY3VycmVudEVsZW1lbnQ6Zn09R3koKTtyZXR1cm4gbWIoe2Rpc2FibGVkOmEsZGlyZWN0aW9uOnMsb3JpZW50YXRpb246bi5vcmllbnRhdGlvbixwYXJlbnRFbGVtZW50OmYsaXNTaW5nbGU6dSxjb2xsYXBzaWJsZTpuLmNvbGxhcHNpYmxlLG1vZGVsVmFsdWU6YyxjaGFuZ2VNb2RlbFZhbHVlOmwsdW5tb3VudE9uSGlkZTpvfSksKGUsdCk9PihSKCksQihOKG5iKSx7cmVmOk4oZCksImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hc30se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOk4oYyl9KV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgXSkpfX0pLGdiPWZ1bmN0aW9uKGUpe3JldHVybiBlLk9wZW49YG9wZW5gLGUuQ2xvc2VkPWBjbG9zZWRgLGV9KGdifHx7fSksW19iLHZiXT1veShgQWNjb3JkaW9uSXRlbWApLHliPUYoe19fbmFtZTpgQWNjb3JkaW9uSXRlbWAscHJvcHM6e2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHZhbHVlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlLHtleHBvc2U6dH0pe2xldCBuPWUscj1wYigpLGk9VygoKT0+ci5pc1NpbmdsZS52YWx1ZT9uLnZhbHVlPT09ci5tb2RlbFZhbHVlLnZhbHVlOkFycmF5LmlzQXJyYXkoci5tb2RlbFZhbHVlLnZhbHVlKSYmci5tb2RlbFZhbHVlLnZhbHVlLmluY2x1ZGVzKG4udmFsdWUpKSxhPVcoKCk9PnIuZGlzYWJsZWQudmFsdWV8fG4uZGlzYWJsZWQpLG89VygoKT0+YS52YWx1ZT9gYDp2b2lkIDApLHM9VygoKT0+aS52YWx1ZT9nYi5PcGVuOmdiLkNsb3NlZCk7dCh7b3BlbjppLGRhdGFEaXNhYmxlZDpvfSk7bGV0e2N1cnJlbnRSZWY6YyxjdXJyZW50RWxlbWVudDpsfT1HeSgpO3ZiKHtvcGVuOmksZGF0YVN0YXRlOnMsZGlzYWJsZWQ6YSxkYXRhRGlzYWJsZWQ6byx0cmlnZ2VySWQ6YGAsY3VycmVudFJlZjpjLGN1cnJlbnRFbGVtZW50OmwsdmFsdWU6VygoKT0+bi52YWx1ZSl9KTtmdW5jdGlvbiB1KGUpe2xldCB0PWUudGFyZ2V0O2lmKEFycmF5LmZyb20oci5wYXJlbnRFbGVtZW50LnZhbHVlPy5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbV1gKT8/W10pLmZpbmRJbmRleChlPT5lPT09dCk9PT0tMSlyZXR1cm4gbnVsbDt6eShlLHQsci5wYXJlbnRFbGVtZW50LnZhbHVlLHthcnJvd0tleU9wdGlvbnM6ci5vcmllbnRhdGlvbixkaXI6ci5kaXJlY3Rpb24udmFsdWUsZm9jdXM6ITB9KX1yZXR1cm4oZSx0KT0+KFIoKSxCKE4ob2IpLHsiZGF0YS1vcmllbnRhdGlvbiI6TihyKS5vcmllbnRhdGlvbiwiZGF0YS1kaXNhYmxlZCI6by52YWx1ZSwiZGF0YS1zdGF0ZSI6cy52YWx1ZSxkaXNhYmxlZDphLnZhbHVlLG9wZW46aS52YWx1ZSxhczpuLmFzLCJhcy1jaGlsZCI6bi5hc0NoaWxkLCJ1bm1vdW50LW9uLWhpZGUiOm4udW5tb3VudE9uSGlkZT8/TihyKS51bm1vdW50T25IaWRlLnZhbHVlLG9uS2V5ZG93bjpzdSh1LFtgdXBgLGBkb3duYCxgbGVmdGAsYHJpZ2h0YCxgaG9tZWAsYGVuZGBdKX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHtvcGVuOmkudmFsdWV9KV0pLF86M30sOCxbYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1zdGF0ZWAsYGRpc2FibGVkYCxgb3BlbmAsYGFzYCxgYXMtY2hpbGRgLGB1bm1vdW50LW9uLWhpZGVgXSkpfX0pLGJiPUYoe19fbmFtZTpgQWNjb3JkaW9uQ29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXBiKCkscj1fYigpO3JldHVybiBHeSgpLChlLGkpPT4oUigpLEIoTihzYikse3JvbGU6YHJlZ2lvbmAsImFzLWNoaWxkIjp0LmFzQ2hpbGQsYXM6ZS5hcywiZm9yY2UtbW91bnQiOnQuZm9yY2VNb3VudCwiYXJpYS1sYWJlbGxlZGJ5IjpOKHIpLnRyaWdnZXJJZCwiZGF0YS1zdGF0ZSI6TihyKS5kYXRhU3RhdGUudmFsdWUsImRhdGEtZGlzYWJsZWQiOk4ocikuZGF0YURpc2FibGVkLnZhbHVlLCJkYXRhLW9yaWVudGF0aW9uIjpOKG4pLm9yaWVudGF0aW9uLHN0eWxlOnsiLS1yZWthLWFjY29yZGlvbi1jb250ZW50LXdpZHRoIjpgdmFyKC0tcmVrYS1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKWAsIi0tcmVrYS1hY2NvcmRpb24tY29udGVudC1oZWlnaHQiOmB2YXIoLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KWB9LG9uQ29udGVudEZvdW5kOmlbMF18fD1lPT5OKG4pLmNoYW5nZU1vZGVsVmFsdWUoTihyKS52YWx1ZS52YWx1ZSl9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhcy1jaGlsZGAsYGFzYCxgZm9yY2UtbW91bnRgLGBhcmlhLWxhYmVsbGVkYnlgLGBkYXRhLXN0YXRlYCxgZGF0YS1kaXNhYmxlZGAsYGRhdGEtb3JpZW50YXRpb25gXSkpfX0pLHhiPUYoe19fbmFtZTpgQWNjb3JkaW9uSGVhZGVyYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YGgzYH19LHNldHVwKGUpe2xldCB0PWUsbj1wYigpLHI9X2IoKTtyZXR1cm4gR3koKSwoZSxpKT0+KFIoKSxCKE4obmIpLHthczp0LmFzLCJhcy1jaGlsZCI6dC5hc0NoaWxkLCJkYXRhLW9yaWVudGF0aW9uIjpOKG4pLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSwiZGF0YS1kaXNhYmxlZCI6TihyKS5kYXRhRGlzYWJsZWQudmFsdWV9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgZGF0YS1vcmllbnRhdGlvbmAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYF0pKX19KSxTYj1GKHtfX25hbWU6YEFjY29yZGlvblRyaWdnZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49cGIoKSxyPV9iKCk7ci50cmlnZ2VySWR8fD1ZeSh2b2lkIDAsYHJla2EtYWNjb3JkaW9uLXRyaWdnZXJgKTtmdW5jdGlvbiBpKCl7bGV0IGU9bi5pc1NpbmdsZS52YWx1ZSYmci5vcGVuLnZhbHVlJiYhbi5jb2xsYXBzaWJsZTtyLmRpc2FibGVkLnZhbHVlfHxlfHxuLmNoYW5nZU1vZGVsVmFsdWUoci52YWx1ZS52YWx1ZSl9cmV0dXJuKGUsYSk9PihSKCksQihOKGNiKSx7aWQ6TihyKS50cmlnZ2VySWQscmVmOk4ocikuY3VycmVudFJlZiwiZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbSI6YGAsYXM6dC5hcywiYXMtY2hpbGQiOnQuYXNDaGlsZCwiYXJpYS1kaXNhYmxlZCI6TihyKS5kaXNhYmxlZC52YWx1ZXx8dm9pZCAwLCJhcmlhLWV4cGFuZGVkIjpOKHIpLm9wZW4udmFsdWV8fCExLCJkYXRhLWRpc2FibGVkIjpOKHIpLmRhdGFEaXNhYmxlZC52YWx1ZSwiZGF0YS1vcmllbnRhdGlvbiI6TihuKS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6TihyKS5kYXRhU3RhdGUudmFsdWUsZGlzYWJsZWQ6TihyKS5kaXNhYmxlZC52YWx1ZSxvbkNsaWNrOml9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BpZGAsYGFzYCxgYXMtY2hpbGRgLGBhcmlhLWRpc2FibGVkYCxgYXJpYS1leHBhbmRlZGAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLW9yaWVudGF0aW9uYCxgZGF0YS1zdGF0ZWAsYGRpc2FibGVkYF0pKX19KSxDYj1gZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbWA7ZnVuY3Rpb24gd2IoZT17fSl7bGV0e2tleTp0PWBgLGlzUHJvdmlkZXI6bj0hMX09ZSxyPWAke3R9Q29sbGVjdGlvblByb3ZpZGVyYCxpO24/KGk9e2NvbGxlY3Rpb25SZWY6TSgpLGl0ZW1NYXA6TShuZXcgTWFwKX0sdnIocixpKSk6aT15cihyKTtsZXQgYT0oZT0hMSk9PntsZXQgdD1pLmNvbGxlY3Rpb25SZWYudmFsdWU7aWYoIXQpcmV0dXJuW107bGV0IG49QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoYFske0NifV1gKSkscj1uZXcgTWFwKG4ubWFwKChlLHQpPT5bZSx0XSkpLGE9QXJyYXkuZnJvbShpLml0ZW1NYXAudmFsdWUudmFsdWVzKCkpLnNvcnQoKGUsdCk9PihyLmdldChlLnJlZik/Py0xKS0oci5nZXQodC5yZWYpPz8tMSkpO3JldHVybiBlP2E6YS5maWx0ZXIoZT0+ZS5yZWYuZGF0YXNldC5kaXNhYmxlZCE9PWBgKX0sbz1GKHtuYW1lOmBDb2xsZWN0aW9uU2xvdGAsaW5oZXJpdEF0dHJzOiExLHNldHVwKGUse3Nsb3RzOnQsYXR0cnM6bn0pe2xldHtwcmltaXRpdmVFbGVtZW50OnIsY3VycmVudEVsZW1lbnQ6YX09cmIoKTtyZXR1cm4gRXIoYSwoKT0+e2kuY29sbGVjdGlvblJlZi52YWx1ZT1hLnZhbHVlfSksKCk9PnRjKGViLHtyZWY6ciwuLi5ufSx0KX19KSxzPUYoe25hbWU6YENvbGxlY3Rpb25JdGVtYCxpbmhlcml0QXR0cnM6ITEscHJvcHM6e3ZhbHVlOnt2YWxpZGF0b3I6KCk9PiEwfX0sc2V0dXAoZSx7c2xvdHM6dCxhdHRyczpufSl7bGV0e3ByaW1pdGl2ZUVsZW1lbnQ6cixjdXJyZW50RWxlbWVudDphfT1yYigpO3JldHVybiBDcih0PT57aWYoYS52YWx1ZSl7bGV0IG49c24oYS52YWx1ZSk7aS5pdGVtTWFwLnZhbHVlLnNldChuLHtyZWY6YS52YWx1ZSx2YWx1ZTplLnZhbHVlfSksdCgoKT0+aS5pdGVtTWFwLnZhbHVlLmRlbGV0ZShuKSl9fSksKCk9PnRjKGViLHsuLi5uLFtDYl06YGAscmVmOnJ9LHQpfX0pO3JldHVybntnZXRJdGVtczphLHJlYWN0aXZlSXRlbXM6VygoKT0+QXJyYXkuZnJvbShpLml0ZW1NYXAudmFsdWUudmFsdWVzKCkpKSxpdGVtTWFwU2l6ZTpXKCgpPT5pLml0ZW1NYXAudmFsdWUuc2l6ZSksQ29sbGVjdGlvblNsb3Q6byxDb2xsZWN0aW9uSXRlbTpzfX12YXIgVGI9YHJvdmluZ0ZvY3VzR3JvdXAub25FbnRyeUZvY3VzYCxFYj17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxEYj17QXJyb3dMZWZ0OmBwcmV2YCxBcnJvd1VwOmBwcmV2YCxBcnJvd1JpZ2h0OmBuZXh0YCxBcnJvd0Rvd246YG5leHRgLFBhZ2VVcDpgZmlyc3RgLEhvbWU6YGZpcnN0YCxQYWdlRG93bjpgbGFzdGAsRW5kOmBsYXN0YH07ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gdD09PWBydGxgP2U9PT1gQXJyb3dMZWZ0YD9gQXJyb3dSaWdodGA6ZT09PWBBcnJvd1JpZ2h0YD9gQXJyb3dMZWZ0YDplOmV9ZnVuY3Rpb24ga2IoZSx0LG4pe2xldCByPU9iKGUua2V5LG4pO2lmKCEodD09PWB2ZXJ0aWNhbGAmJltgQXJyb3dMZWZ0YCxgQXJyb3dSaWdodGBdLmluY2x1ZGVzKHIpKSYmISh0PT09YGhvcml6b250YWxgJiZbYEFycm93VXBgLGBBcnJvd0Rvd25gXS5pbmNsdWRlcyhyKSkpcmV0dXJuIERiW3JdfWZ1bmN0aW9uIEFiKGUsdD0hMSl7bGV0IG49c3koKTtmb3IobGV0IHIgb2YgZSlpZihyPT09bnx8KHIuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dH0pLHN5KCkhPT1uKSlyZXR1cm59ZnVuY3Rpb24gamIoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX12YXJbTWIsTmJdPW95KGBSb3ZpbmdGb2N1c0dyb3VwYCksUGI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0dyb3VwYCxwcm9wczp7b3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sY3VycmVudFRhYlN0b3BJZDp7dHlwZTpbU3RyaW5nLG51bGxdLHJlcXVpcmVkOiExfSxkZWZhdWx0Q3VycmVudFRhYlN0b3BJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYGVudHJ5Rm9jdXNgLGB1cGRhdGU6Y3VycmVudFRhYlN0b3BJZGBdLHNldHVwKGUse2V4cG9zZTp0LGVtaXQ6bn0pe2xldCByPWUsaT1uLHtsb29wOmEsb3JpZW50YXRpb246byxkaXI6c309eW4ociksYz1VeShzKSxsPUl5KHIsYGN1cnJlbnRUYWJTdG9wSWRgLGkse2RlZmF1bHRWYWx1ZTpyLmRlZmF1bHRDdXJyZW50VGFiU3RvcElkLHBhc3NpdmU6ci5jdXJyZW50VGFiU3RvcElkPT09dm9pZCAwfSksdT1NKCExKSxkPU0oITEpLGY9TSgwKSx7Z2V0SXRlbXM6cCxDb2xsZWN0aW9uU2xvdDptfT13Yih7aXNQcm92aWRlcjohMH0pO2Z1bmN0aW9uIGgoZSl7bGV0IHQ9IWQudmFsdWU7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLnRhcmdldD09PWUuY3VycmVudFRhcmdldCYmdCYmIXUudmFsdWUpe2xldCB0PW5ldyBDdXN0b21FdmVudChUYixFYik7aWYoZS5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQodCksaShgZW50cnlGb2N1c2AsdCksIXQuZGVmYXVsdFByZXZlbnRlZCl7bGV0IGU9cCgpLm1hcChlPT5lLnJlZikuZmlsdGVyKGU9PmUuZGF0YXNldC5kaXNhYmxlZCE9PWBgKTtBYihbZS5maW5kKGU9PmUuZ2V0QXR0cmlidXRlKGBkYXRhLWFjdGl2ZWApPT09YGApLGUuZmluZChlPT5lLmdldEF0dHJpYnV0ZShgZGF0YS1oaWdobGlnaHRlZGApPT09YGApLGUuZmluZChlPT5lLmlkPT09bC52YWx1ZSksLi4uZV0uZmlsdGVyKEJvb2xlYW4pLHIucHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyl9fWQudmFsdWU9ITF9ZnVuY3Rpb24gZygpe3NldFRpbWVvdXQoKCk9PntkLnZhbHVlPSExfSwxKX1yZXR1cm4gdCh7Z2V0SXRlbXM6cH0pLE5iKHtsb29wOmEsZGlyOmMsb3JpZW50YXRpb246byxjdXJyZW50VGFiU3RvcElkOmwsb25JdGVtRm9jdXM6ZT0+e2wudmFsdWU9ZX0sb25JdGVtU2hpZnRUYWI6KCk9Pnt1LnZhbHVlPSEwfSxvbkZvY3VzYWJsZUl0ZW1BZGQ6KCk9PntmLnZhbHVlKyt9LG9uRm9jdXNhYmxlSXRlbVJlbW92ZTooKT0+e2YudmFsdWUtLX19KSwoZSx0KT0+KFIoKSxCKE4obSksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7dGFiaW5kZXg6dS52YWx1ZXx8Zi52YWx1ZT09PTA/LTE6MCwiZGF0YS1vcmllbnRhdGlvbiI6TihvKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGRpcjpOKGMpLHN0eWxlOntvdXRsaW5lOmBub25lYH0sb25Nb3VzZWRvd246dFswXXx8PWU9PmQudmFsdWU9ITAsb25Nb3VzZXVwOmcsb25Gb2N1czpoLG9uQmx1cjp0WzFdfHw9ZT0+dS52YWx1ZT0hMX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYHRhYmluZGV4YCxgZGF0YS1vcmllbnRhdGlvbmAsYGFzYCxgYXMtY2hpbGRgLGBkaXJgXSldKSxfOjN9KSl9fSksRmI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0l0ZW1gLHByb3BzOnt0YWJTdG9wSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxmb2N1c2FibGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYWxsb3dTaGlmdEtleTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLG49TWIoKSxyPVl5KCksaT1XKCgpPT50LnRhYlN0b3BJZHx8ciksYT1XKCgpPT5uLmN1cnJlbnRUYWJTdG9wSWQudmFsdWU9PT1pLnZhbHVlKSx7Z2V0SXRlbXM6byxDb2xsZWN0aW9uSXRlbTpzfT13YigpO1ppKCgpPT57dC5mb2N1c2FibGUmJm4ub25Gb2N1c2FibGVJdGVtQWRkKCl9KSx0YSgoKT0+e3QuZm9jdXNhYmxlJiZuLm9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpfSksRXIoKCk9PnQuZm9jdXNhYmxlLChlLHQpPT57ZSE9PXQmJihlP24ub25Gb2N1c2FibGVJdGVtQWRkKCk6bi5vbkZvY3VzYWJsZUl0ZW1SZW1vdmUoKSl9KTtmdW5jdGlvbiBjKGUpe2lmKGUua2V5PT09YFRhYmAmJmUuc2hpZnRLZXkpe24ub25JdGVtU2hpZnRUYWIoKTtyZXR1cm59aWYoZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQpcmV0dXJuO2xldCByPWtiKGUsbi5vcmllbnRhdGlvbi52YWx1ZSxuLmRpci52YWx1ZSk7aWYociE9PXZvaWQgMCl7aWYoZS5tZXRhS2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5fHwhdC5hbGxvd1NoaWZ0S2V5JiZlLnNoaWZ0S2V5KXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7bGV0IGk9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpLmZpbHRlcihlPT5lLmRhdGFzZXQuZGlzYWJsZWQhPT1gYCldO2lmKHI9PT1gbGFzdGApaS5yZXZlcnNlKCk7ZWxzZSBpZihyPT09YHByZXZgfHxyPT09YG5leHRgKXtyPT09YHByZXZgJiZpLnJldmVyc2UoKTtsZXQgdD1pLmluZGV4T2YoZS5jdXJyZW50VGFyZ2V0KTtpPW4ubG9vcC52YWx1ZT9qYihpLHQrMSk6aS5zbGljZSh0KzEpfVFuKCgpPT5BYihpKSl9fXJldHVybihlLHQpPT4oUigpLEIoTihzKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4obmIpLHt0YWJpbmRleDphLnZhbHVlPzA6LTEsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24udmFsdWUsImRhdGEtYWN0aXZlIjplLmFjdGl2ZT9gYDp2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmUuZm9jdXNhYmxlP3ZvaWQgMDpgYCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLG9uTW91c2Vkb3duOnRbMF18fD10PT57ZS5mb2N1c2FibGU/TihuKS5vbkl0ZW1Gb2N1cyhpLnZhbHVlKTp0LnByZXZlbnREZWZhdWx0KCl9LG9uRm9jdXM6dFsxXXx8PWU9Pk4obikub25JdGVtRm9jdXMoaS52YWx1ZSksb25LZXlkb3duOmN9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2B0YWJpbmRleGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLWFjdGl2ZWAsYGRhdGEtZGlzYWJsZWRgLGBhc2AsYGFzLWNoaWxkYF0pXSksXzozfSkpfX0pLFtJYixMYl09b3koYFRhYnNSb290YCksUmI9Rih7X19uYW1lOmBUYWJzUm9vdGAscHJvcHM6e2RlZmF1bHRWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxvcmllbnRhdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaG9yaXpvbnRhbGB9LGRpcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFjdGl2YXRpb25Nb2RlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBhdXRvbWF0aWNgfSxtb2RlbFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse29yaWVudGF0aW9uOmksdW5tb3VudE9uSGlkZTphLGRpcjpvfT15bihuKSxzPVV5KG8pO0d5KCk7bGV0IGM9SXkobixgbW9kZWxWYWx1ZWAscix7ZGVmYXVsdFZhbHVlOm4uZGVmYXVsdFZhbHVlLHBhc3NpdmU6bi5tb2RlbFZhbHVlPT09dm9pZCAwfSksbD1NKCksdT11bihuZXcgU2V0KTtyZXR1cm4gTGIoe21vZGVsVmFsdWU6YyxjaGFuZ2VNb2RlbFZhbHVlOmU9PntjLnZhbHVlPWV9LG9yaWVudGF0aW9uOmksZGlyOnMsdW5tb3VudE9uSGlkZTphLGFjdGl2YXRpb25Nb2RlOm4uYWN0aXZhdGlvbk1vZGUsYmFzZUlkOll5KHZvaWQgMCxgcmVrYS10YWJzYCksdGFic0xpc3Q6bCxjb250ZW50SWRzOnUscmVnaXN0ZXJDb250ZW50OmU9Pnt1LnZhbHVlPW5ldyBTZXQoWy4uLnUudmFsdWUsZV0pfSx1bnJlZ2lzdGVyQ29udGVudDplPT57bGV0IHQ9bmV3IFNldCh1LnZhbHVlKTt0LmRlbGV0ZShlKSx1LnZhbHVlPXR9fSksKGUsdCk9PihSKCksQihOKG5iKSx7ZGlyOk4ocyksImRhdGEtb3JpZW50YXRpb24iOk4oaSksImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hc30se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOk4oYyl9KV0pLF86M30sOCxbYGRpcmAsYGRhdGEtb3JpZW50YXRpb25gLGBhcy1jaGlsZGAsYGFzYF0pKX19KTtmdW5jdGlvbiB6YihlLHQpe3JldHVybmAke2V9LXRyaWdnZXItJHt0fWB9ZnVuY3Rpb24gQmIoZSx0KXtyZXR1cm5gJHtlfS1jb250ZW50LSR7dH1gfXZhciBWYj1GKHtfX25hbWU6YFRhYnNDb250ZW50YCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse2ZvcndhcmRSZWY6bn09R3koKSxyPUliKCksaT1XKCgpPT56YihyLmJhc2VJZCx0LnZhbHVlKSksYT1XKCgpPT5CYihyLmJhc2VJZCx0LnZhbHVlKSksbz1XKCgpPT50LnZhbHVlPT09ci5tb2RlbFZhbHVlLnZhbHVlKSxzPU0oby52YWx1ZSk7cmV0dXJuIFppKCgpPT57ci5yZWdpc3RlckNvbnRlbnQodC52YWx1ZSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cy52YWx1ZT0hMX0pfSksZWEoKCk9PntyLnVucmVnaXN0ZXJDb250ZW50KHQudmFsdWUpfSksKGUsdCk9PihSKCksQihOKCR5KSx7cHJlc2VudDplLmZvcmNlTW91bnR8fG8udmFsdWUsImZvcmNlLW1vdW50IjpgYH0se2RlZmF1bHQ6UCgoe3ByZXNlbnQ6dH0pPT5bSChOKG5iKSx7aWQ6YS52YWx1ZSxyZWY6TihuKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzLHJvbGU6YHRhYnBhbmVsYCwiZGF0YS1zdGF0ZSI6by52YWx1ZT9gYWN0aXZlYDpgaW5hY3RpdmVgLCJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLnZhbHVlLCJhcmlhLWxhYmVsbGVkYnkiOmkudmFsdWUsaGlkZGVuOiF0LHRhYmluZGV4OmAwYCxzdHlsZTpnZSh7YW5pbWF0aW9uRHVyYXRpb246cy52YWx1ZT9gMHNgOnZvaWQgMH0pfSx7ZGVmYXVsdDpQKCgpPT5bIU4ocikudW5tb3VudE9uSGlkZS52YWx1ZXx8dD9JKGUuJHNsb3RzLGBkZWZhdWx0YCx7a2V5OjB9KTpUcyhgdi1pZmAsITApXSksXzoyfSwxMDMyLFtgaWRgLGBhcy1jaGlsZGAsYGFzYCxgZGF0YS1zdGF0ZWAsYGRhdGEtb3JpZW50YXRpb25gLGBhcmlhLWxhYmVsbGVkYnlgLGBoaWRkZW5gLGBzdHlsZWBdKV0pLF86M30sOCxbYHByZXNlbnRgXSkpfX0pLEhiPUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0e2xvb3A6dH09eW4oZSkse2ZvcndhcmRSZWY6bixjdXJyZW50RWxlbWVudDpyfT1HeSgpLGk9SWIoKTtyZXR1cm4gaS50YWJzTGlzdD1yLChlLHIpPT4oUigpLEIoTihQYikseyJhcy1jaGlsZCI6YGAsb3JpZW50YXRpb246TihpKS5vcmllbnRhdGlvbi52YWx1ZSxkaXI6TihpKS5kaXIudmFsdWUsbG9vcDpOKHQpfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7cmVmOk4obikscm9sZTpgdGFibGlzdGAsImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hcywiYXJpYS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbi52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBhcmlhLW9yaWVudGF0aW9uYF0pXSksXzozfSw4LFtgb3JpZW50YXRpb25gLGBkaXJgLGBsb29wYF0pKX19KSxVYj1GKHtfX25hbWU6YFRhYnNUcmlnZ2VyYCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZSx7Zm9yd2FyZFJlZjpufT1HeSgpLHI9SWIoKSxpPVcoKCk9PnpiKHIuYmFzZUlkLHQudmFsdWUpKSxhPVcoKCk9PnIuY29udGVudElkcy52YWx1ZS5oYXModC52YWx1ZSk/QmIoci5iYXNlSWQsdC52YWx1ZSk6dm9pZCAwKSxvPVcoKCk9PnQudmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWUpO3JldHVybihlLHQpPT4oUigpLEIoTihGYikseyJhcy1jaGlsZCI6YGAsZm9jdXNhYmxlOiFlLmRpc2FibGVkLGFjdGl2ZTpvLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7aWQ6aS52YWx1ZSxyZWY6TihuKSxyb2xlOmB0YWJgLHR5cGU6ZS5hcz09PWBidXR0b25gP2BidXR0b25gOnZvaWQgMCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLCJhcmlhLXNlbGVjdGVkIjpvLnZhbHVlP2B0cnVlYDpgZmFsc2VgLCJhcmlhLWNvbnRyb2xzIjphLnZhbHVlLCJkYXRhLXN0YXRlIjpvLnZhbHVlP2BhY3RpdmVgOmBpbmFjdGl2ZWAsZGlzYWJsZWQ6ZS5kaXNhYmxlZCwiZGF0YS1kaXNhYmxlZCI6ZS5kaXNhYmxlZD9gYDp2b2lkIDAsImRhdGEtb3JpZW50YXRpb24iOk4ocikub3JpZW50YXRpb24udmFsdWUsb25Nb3VzZWRvd246dFswXXx8PWF1KHQ9PnshZS5kaXNhYmxlZCYmdC5jdHJsS2V5PT09ITE/TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpOnQucHJldmVudERlZmF1bHQoKX0sW2BsZWZ0YF0pLG9uS2V5ZG93bjp0WzFdfHw9c3UodD0+TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpLFtgZW50ZXJgLGBzcGFjZWBdKSxvbkZvY3VzOnRbMl18fD0oKT0+e2xldCB0PU4ocikuYWN0aXZhdGlvbk1vZGUhPT1gbWFudWFsYDshby52YWx1ZSYmIWUuZGlzYWJsZWQmJnQmJk4ocikuY2hhbmdlTW9kZWxWYWx1ZShlLnZhbHVlKX19LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BpZGAsYHR5cGVgLGBhc2AsYGFzLWNoaWxkYCxgYXJpYS1zZWxlY3RlZGAsYGFyaWEtY29udHJvbHNgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKV0pLF86M30sOCxbYGZvY3VzYWJsZWAsYGFjdGl2ZWBdKSl9fSksV2I9Rih7X19uYW1lOmBCdXR0b25gLHByb3BzOnt2YXJpYW50Ont9LHNpemU6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7ZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKG4scik9PihSKCksQihOKG5iKSx7ImRhdGEtc2xvdCI6YGJ1dHRvbmAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50LCJkYXRhLXNpemUiOmUuc2l6ZSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGNsYXNzOk8oTihaKShOKEdiKSh7dmFyaWFudDplLnZhcmlhbnQsc2l6ZTplLnNpemV9KSx0LmNsYXNzKSl9LHtkZWZhdWx0OlAoKCk9PltJKG4uJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BkYXRhLXZhcmlhbnRgLGBkYXRhLXNpemVgLGBhc2AsYGFzLWNoaWxkYCxgY2xhc3NgXSkpfX0pLEdiPXdfKGBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBkYXJrOmFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUvNTAgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGJnLWNsaXAtcGFkZGluZyB0ZXh0LXNtIGZvbnQtbWVkaXVtIGZvY3VzLXZpc2libGU6cmluZy0zIGFyaWEtaW52YWxpZDpyaW5nLTMgYWN0aXZlOm5vdC1hcmlhLVtoYXNwb3B1cF06dHJhbnNsYXRlLXktcHggWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBncm91cC9idXR0b24gaW5saW5lLWZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHdoaXRlc3BhY2Utbm93cmFwIHRyYW5zaXRpb24tYWxsIG91dGxpbmUtbm9uZSBzZWxlY3Qtbm9uZSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTBgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6YmctcHJpbWFyeS84MGAsb3V0bGluZTpgYm9yZGVyLWJvcmRlciBiZy1iYWNrZ3JvdW5kIGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBkYXJrOmJnLWlucHV0LzMwIGRhcms6Ym9yZGVyLWlucHV0IGRhcms6aG92ZXI6YmctaW5wdXQvNTAgYXJpYS1leHBhbmRlZDpiZy1tdXRlZCBhcmlhLWV4cGFuZGVkOnRleHQtZm9yZWdyb3VuZGAsc2Vjb25kYXJ5OmBiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1zZWNvbmRhcnkvODAgYXJpYS1leHBhbmRlZDpiZy1zZWNvbmRhcnkgYXJpYS1leHBhbmRlZDp0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kYCxnaG9zdDpgaG92ZXI6YmctbXV0ZWQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctbXV0ZWQvNTAgYXJpYS1leHBhbmRlZDpiZy1tdXRlZCBhcmlhLWV4cGFuZGVkOnRleHQtZm9yZWdyb3VuZGAsZGVzdHJ1Y3RpdmU6YGJnLWRlc3RydWN0aXZlLzEwIGhvdmVyOmJnLWRlc3RydWN0aXZlLzIwIGZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS80MCBkYXJrOmJnLWRlc3RydWN0aXZlLzIwIHRleHQtZGVzdHJ1Y3RpdmUgZm9jdXMtdmlzaWJsZTpib3JkZXItZGVzdHJ1Y3RpdmUvNDAgZGFyazpob3ZlcjpiZy1kZXN0cnVjdGl2ZS8zMGAsbGluazpgdGV4dC1wcmltYXJ5IHVuZGVybGluZS1vZmZzZXQtNCBob3Zlcjp1bmRlcmxpbmVgfSxzaXplOntkZWZhdWx0OmBoLTggZ2FwLTEuNSBweC0yLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMiBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTJgLHhzOmBoLTYgZ2FwLTEgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTBweCldIHB4LTIgdGV4dC14cyBpbi1kYXRhLVtzbG90PWJ1dHRvbi1ncm91cF06cm91bmRlZC1sZyBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0xLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLXN0YXJ0XTpwbC0xLjUgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtM2Asc206YGgtNyBnYXAtMSByb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMnB4KV0gcHgtMi41IHRleHQtWzAuOHJlbV0gaW4tZGF0YS1bc2xvdD1idXR0b24tZ3JvdXBdOnJvdW5kZWQtbGcgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMS41IGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMS41IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTMuNWAsbGc6YGgtOSBnYXAtMS41IHB4LTIuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0yIGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMmAsaWNvbjpgc2l6ZS04YCwiaWNvbi14cyI6YHNpemUtNiByb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMHB4KV0gaW4tZGF0YS1bc2xvdD1idXR0b24tZ3JvdXBdOnJvdW5kZWQtbGcgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtM2AsImljb24tc20iOmBzaXplLTcgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTJweCldIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnYCwiaWNvbi1sZyI6YHNpemUtOWB9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6YGRlZmF1bHRgLHNpemU6YGRlZmF1bHRgfX0pLEtiPVtgZGF0YS1zaXplYF0scWI9Rih7X19uYW1lOmBDYXJkYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sc2l6ZTp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihuLHIpPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkYCwiZGF0YS1zaXplIjplLnNpemUsY2xhc3M6TyhOKFopKGByaW5nLWZvcmVncm91bmQvMTAgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBnYXAtNCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bCBweS00IHRleHQtc20gcmluZy0xIGhhcy1kYXRhLVtzbG90PWNhcmQtZm9vdGVyXTpwYi0wIGhhcy1bPmltZzpmaXJzdC1jaGlsZF06cHQtMCBkYXRhLVtzaXplPXNtXTpnYXAtMyBkYXRhLVtzaXplPXNtXTpweS0zIGRhdGEtW3NpemU9c21dOmhhcy1kYXRhLVtzbG90PWNhcmQtZm9vdGVyXTpwYi0wICo6W2ltZzpmaXJzdC1jaGlsZF06cm91bmRlZC10LXhsICo6W2ltZzpsYXN0LWNoaWxkXTpyb3VuZGVkLWIteGwgZ3JvdXAvY2FyZCBmbGV4IGZsZXgtY29sYCx0LmNsYXNzKSl9LFtJKG4uJHNsb3RzLGBkZWZhdWx0YCldLDEwLEtiKSl9fSksSmI9Rih7X19uYW1lOmBDYXJkQ29udGVudGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkLWNvbnRlbnRgLGNsYXNzOk8oTihaKShgcHgtNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOnB4LTNgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFliPUYoe19fbmFtZTpgQ2FyZERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtZGVzY3JpcHRpb25gLGNsYXNzOk8oTihaKShgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc21gLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFhiPUYoe19fbmFtZTpgQ2FyZEhlYWRlcmAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkLWhlYWRlcmAsY2xhc3M6TyhOKFopKGBnYXAtMSByb3VuZGVkLXQteGwgcHgtNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOnB4LTMgWy5ib3JkZXItYl06cGItNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOlsuYm9yZGVyLWJdOnBiLTMgZ3JvdXAvY2FyZC1oZWFkZXIgQGNvbnRhaW5lci9jYXJkLWhlYWRlciBncmlkIGF1dG8tcm93cy1taW4gaXRlbXMtc3RhcnQgaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1hY3Rpb25dOmdyaWQtY29scy1bMWZyX2F1dG9dIGhhcy1kYXRhLVtzbG90PWNhcmQtZGVzY3JpcHRpb25dOmdyaWQtcm93cy1bYXV0b19hdXRvXWAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWmI9Rih7X19uYW1lOmBDYXJkVGl0bGVgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZC10aXRsZWAsY2xhc3M6TyhOKFopKGB0ZXh0LWJhc2UgbGVhZGluZy1zbnVnIGZvbnQtbWVkaXVtIGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6dGV4dC1zbSBjbi1mb250LWhlYWRpbmdgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFFiPUYoe19fbmFtZTpgSW5wdXRgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sbW9kZWxWYWx1ZTp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj1JeShuLGBtb2RlbFZhbHVlYCx0LHtwYXNzaXZlOiEwLGRlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZX0pO3JldHVybihlLHQpPT5ncigoUigpLHooYGlucHV0YCx7Im9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLCJkYXRhLXNsb3QiOmBpbnB1dGAsY2xhc3M6TyhOKFopKGBkYXJrOmJnLWlucHV0LzMwIGJvcmRlci1pbnB1dCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBkYXJrOmFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUvNTAgZGlzYWJsZWQ6YmctaW5wdXQvNTAgZGFyazpkaXNhYmxlZDpiZy1pbnB1dC84MCBoLTggcm91bmRlZC1sZyBib3JkZXIgYmctdHJhbnNwYXJlbnQgcHgtMi41IHB5LTEgdGV4dC1iYXNlIHRyYW5zaXRpb24tY29sb3JzIGZpbGU6aC02IGZpbGU6dGV4dC1zbSBmaWxlOmZvbnQtbWVkaXVtIGZvY3VzLXZpc2libGU6cmluZy0zIGFyaWEtaW52YWxpZDpyaW5nLTMgbWQ6dGV4dC1zbSB3LWZ1bGwgbWluLXctMCBvdXRsaW5lLW5vbmUgZmlsZTppbmxpbmUtZmxleCBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LWZvcmVncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTBgLG4uY2xhc3MpKX0sbnVsbCwyKSksW1tHbCxOKHIpXV0pfX0pLCRiPWBsbG1nd0FkbWluS2V5YDtmdW5jdGlvbiBleCgpe3RyeXtyZXR1cm4gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgkYik/P2BgfWNhdGNoe3JldHVybmBgfX1mdW5jdGlvbiB0eChlKXt0cnl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgkYixlKX1jYXRjaHt9fWZ1bmN0aW9uIG54KCl7dHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJGIpfWNhdGNoe319dmFyIHJ4PW5fKGBhdXRoYCx7c3RhdGU6KCk9Pih7YXBpS2V5OmV4KCksZXJyb3I6YGB9KSxnZXR0ZXJzOntpc0F1dGhlbnRpY2F0ZWQ6ZT0+ZS5hcGlLZXkhPT1gYH0sYWN0aW9uczp7c3VibWl0KGUpe2UmJih0aGlzLmFwaUtleT1lLHRoaXMuZXJyb3I9YGAsdHgoZSkpfSxyZWplY3QoZSl7dGhpcy5hcGlLZXk9YGAsdGhpcy5lcnJvcj1lLG54KCl9fX0pLGl4PWNsYXNzIGV4dGVuZHMgRXJyb3J7c3RhdHVzO2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSksdGhpcy5uYW1lPWBBZG1pbkFwaUVycm9yYCx0aGlzLnN0YXR1cz10fX07YXN5bmMgZnVuY3Rpb24gYXgoZSl7bGV0IHQ9cngoKSxuPXQuYXBpS2V5LHI9YXdhaXQgZmV0Y2goZSx7Y3JlZGVudGlhbHM6YHNhbWUtb3JpZ2luYCxoZWFkZXJzOm4/eyJ4LWFwaS1rZXkiOm59Ont9fSk7aWYoci5zdGF0dXM9PT00MDF8fHIuc3RhdHVzPT09NDAzKXRocm93IHQuYXBpS2V5PT09biYmdC5yZWplY3QoYGludmFsaWQga2V5LCBvciBub3QgYW4gYWRtaW5gKSxuZXcgaXgoYCR7ZX06IEhUVFAgJHtyLnN0YXR1c31gLHIuc3RhdHVzKTtpZighci5vayl0aHJvdyBuZXcgaXgoYCR7ZX06IEhUVFAgJHtyLnN0YXR1c31gLHIuc3RhdHVzKTtyZXR1cm4gYXdhaXQgci5qc29uKCl9dmFyIG94PTVlMyxzeD1uXyhgZGFzaGJvYXJkYCx7c3RhdGU6KCk9Pih7b3ZlcnZpZXc6bnVsbCx1c2FnZTpudWxsLHRhcmdldHM6bnVsbCxsYXN0VXBkYXRlZDpudWxsLGVycm9yOmBgLHRpbWVyOnZvaWQgMH0pLGFjdGlvbnM6e2FzeW5jIHJlZnJlc2goKXtpZighcngoKS5pc0F1dGhlbnRpY2F0ZWQpcmV0dXJuO2xldFtlLHQsbl09YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtheChgL2FkbWluL2FwaS9vdmVydmlld2ApLGF4KGAvYWRtaW4vYXBpL3VzYWdlYCksYXgoYC9hZG1pbi9hcGkvdGFyZ2V0c2ApXSk7ZS5zdGF0dXM9PT1gZnVsZmlsbGVkYCYmKHRoaXMub3ZlcnZpZXc9ZS52YWx1ZSksdC5zdGF0dXM9PT1gZnVsZmlsbGVkYCYmKHRoaXMudXNhZ2U9dC52YWx1ZSksbi5zdGF0dXM9PT1gZnVsZmlsbGVkYCYmKHRoaXMudGFyZ2V0cz1uLnZhbHVlKTtsZXQgcj1bXTtpZihlLnN0YXR1cz09PWByZWplY3RlZGAmJnIucHVzaCh7bGFiZWw6YG92ZXJ2aWV3YCxyZWFzb246ZS5yZWFzb259KSx0LnN0YXR1cz09PWByZWplY3RlZGAmJnIucHVzaCh7bGFiZWw6YHVzYWdlYCxyZWFzb246dC5yZWFzb259KSxuLnN0YXR1cz09PWByZWplY3RlZGAmJnIucHVzaCh7bGFiZWw6YHRhcmdldHNgLHJlYXNvbjpuLnJlYXNvbn0pLHIubGVuZ3RoPT09MCl7dGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZSx0aGlzLmVycm9yPWBgO3JldHVybn1yLnNvbWUoKHtyZWFzb246ZX0pPT5lIGluc3RhbmNlb2YgaXgmJihlLnN0YXR1cz09PTQwMXx8ZS5zdGF0dXM9PT00MDMpKXx8KHIubGVuZ3RoPDMmJih0aGlzLmxhc3RVcGRhdGVkPW5ldyBEYXRlKSx0aGlzLmVycm9yPXIubWFwKCh7bGFiZWw6ZSxyZWFzb246dH0pPT5gJHtlfTogJHt0IGluc3RhbmNlb2YgRXJyb3I/dC5tZXNzYWdlOlN0cmluZyh0KX1gKS5qb2luKGA7IGApKX0sc3RhcnRQb2xsaW5nKCl7dGhpcy50aW1lcj09PXZvaWQgMCYmKHRoaXMucmVmcmVzaCgpLHRoaXMudGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgdGhpcy5yZWZyZXNoKCksb3gpKX0sc3RvcFBvbGxpbmcoKXt0aGlzLnRpbWVyIT09dm9pZCAwJiYoY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXZvaWQgMCl9fX0pLGN4PXtjbGFzczpgbXgtYXV0byBmbGV4IG1pbi1oLVs3MHZoXSBtYXgtdy1tZCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBweC00YH0sbHg9e2NsYXNzOmBmbGV4IHNpemUtMTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCBiZy1wcmltYXJ5LzEwIHRleHQtcHJpbWFyeWB9LHV4PXtjbGFzczpgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFgfSxkeD17ImFyaWEtbGFiZWxsZWRieSI6YGF1dGhnYXRlLXNlY3VyaXR5LWhlYWRpbmdgLGNsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC0xLjUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxmeD17Y2xhc3M6YGZsZXggaXRlbXMtc3RhcnQgZ2FwLTEuNWB9LHB4PXtjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41YH0sbXg9e2NsYXNzOmBmbGV4IGl0ZW1zLXN0YXJ0IGdhcC0xLjVgfSxoeD17Y2xhc3M6YHJlbGF0aXZlYH0sZ3g9KChlLHQpPT57bGV0IG49ZS5fX3ZjY09wdHN8fGU7Zm9yKGxldFtlLHJdb2YgdCluW2VdPXI7cmV0dXJuIG59KShGKHtfX25hbWU6YEF1dGhHYXRlYCxzZXR1cChlKXtsZXQgdD1yeCgpLG49c3goKSxyPU0oYGApLGk9TSghMSksYT1NKG51bGwpLG89VygoKT0+ci52YWx1ZS50cmltKCkhPT1gYCk7ZnVuY3Rpb24gcygpe2xldCBlPXIudmFsdWU7ci52YWx1ZT1gYCx0LnN1Ym1pdChlKSxuLnJlZnJlc2goKX1mdW5jdGlvbiBjKCl7UW4oKCk9PmEudmFsdWU/LiRlbD8uZm9jdXMoKSl9cmV0dXJuIFppKGMpLEVyKCgpPT50LmVycm9yLGU9PntlJiZjKCl9KSwoZSxuKT0+e2xldCBjPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsY3gsW0goTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0zIHRleHQtY2VudGVyYH0se2RlZmF1bHQ6UCgoKT0+W1YoYGRpdmAsbHgsW0goYyx7aWNvbjpOKGFfKSxjbGFzczpgc2l6ZS01YCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKV0pLFYoYGRpdmAsdXgsW25bM118fD1WKGBzcGFuYCx7Y2xhc3M6YHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYExMTSBHYXRld2F5YCwtMSksSChOKFpiKSx7Y2xhc3M6YHRleHQtbGcgZm9udC1zZW1pYm9sZGB9LHtkZWZhdWx0OlAoKCk9PlsuLi5uWzJdfHw9W1UoYEFkbWluIGtleSByZXF1aXJlZGAsLTEpXV0pLF86MX0pXSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi5uWzRdfHw9W1UoYEVudGVyIGFuIGFkbWluIEFQSSBrZXkgdG8gY29udGludWUuYCwtMSldXSksXzoxfSldKSxfOjF9KSxIKE4oSmIpLHtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtNGB9LHtkZWZhdWx0OlAoKCk9PltuWzEwXXx8PVYoYGgyYCx7aWQ6YGF1dGhnYXRlLXNlY3VyaXR5LWhlYWRpbmdgLGNsYXNzOmBzci1vbmx5YH0sYCBIb3cgdGhpcyBrZXkgaXMgaGFuZGxlZCBgLC0xKSxWKGB1bGAsZHgsW1YoYGxpYCxmeCxbSChjLHtpY29uOk4oZF8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zIHNocmluay0wYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSxuWzVdfHw9Vihgc3BhbmAsbnVsbCxgS2VwdCBvbmx5IGluIHRoaXMgdGFiJ3Mgc2Vzc2lvbiBzdG9yYWdlYCwtMSldKSxWKGBsaWAscHgsW0goYyx7aWNvbjpOKGRfKSxjbGFzczpgbXQtMC41IHNpemUtMyBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSksbls2XXx8PVYoYHNwYW5gLG51bGwsYE5ldmVyIHdyaXR0ZW4gdG8gZGlza2AsLTEpXSksVihgbGlgLG14LFtIKGMse2ljb246TihkXyksY2xhc3M6YG10LTAuNSBzaXplLTMgc2hyaW5rLTBgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLG5bN118fD1WKGBzcGFuYCxudWxsLGBTZW50IG9ubHkgdG8gdGhpcyBwYWdlJ3Mgb3duIC9hZG1pbi9hcGkvKiByZXF1ZXN0c2AsLTEpXSldKSxWKGBmb3JtYCx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTNgLG9uU3VibWl0OmF1KHMsW2BwcmV2ZW50YF0pfSxbVihgZGl2YCxoeCxbSChOKFFiKSx7cmVmX2tleTpga2V5SW5wdXRFbGAscmVmOmEsbW9kZWxWYWx1ZTpyLnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjpuWzBdfHw9ZT0+ci52YWx1ZT1lLHR5cGU6aS52YWx1ZT9gdGV4dGA6YHBhc3N3b3JkYCxhdXRvY29tcGxldGU6YG9mZmAscGxhY2Vob2xkZXI6YEFQSSBrZXlgLCJhcmlhLWxhYmVsIjpgQWRtaW4gQVBJIGtleWAsImFyaWEtaW52YWxpZCI6ISFOKHQpLmVycm9yLCJhcmlhLWRlc2NyaWJlZGJ5IjpOKHQpLmVycm9yP2BhdXRoZ2F0ZS1lcnJvcmA6dm9pZCAwLGNsYXNzOk8oW2BoLTEwIHByLTEwYCx7ImF1dGhnYXRlLXNoYWtlIjpOKHQpLmVycm9yfV0pfSxudWxsLDgsW2Btb2RlbFZhbHVlYCxgdHlwZWAsYGFyaWEtaW52YWxpZGAsYGFyaWEtZGVzY3JpYmVkYnlgLGBjbGFzc2BdKSxIKE4oV2IpLHt0eXBlOmBidXR0b25gLHZhcmlhbnQ6YGdob3N0YCxzaXplOmBpY29uLXhzYCxjbGFzczpgYWJzb2x1dGUgdG9wLTEvMiByaWdodC0xLjUgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCwiYXJpYS1sYWJlbCI6aS52YWx1ZT9gSGlkZSBrZXlgOmBTaG93IGtleWAsb25DbGljazpuWzFdfHw9ZT0+aS52YWx1ZT0haS52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0goYyx7aWNvbjppLnZhbHVlP04odl8pOk4oc18pLGNsYXNzOmBzaXplLTMuNWAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9LDgsW2BhcmlhLWxhYmVsYF0pXSksSChOKFdiKSx7dHlwZTpgc3VibWl0YCxjbGFzczpgdy1mdWxsYCxkaXNhYmxlZDohby52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+Wy4uLm5bOF18fD1bVShgIENvbnRpbnVlIGAsLTEpXV0pLF86MX0sOCxbYGRpc2FibGVkYF0pXSwzMiksTih0KS5lcnJvcj8oUigpLEIoTihYdikse2tleTowLGlkOmBhdXRoZ2F0ZS1lcnJvcmAsdmFyaWFudDpgZGVzdHJ1Y3RpdmVgfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFF2KSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi5uWzldfHw9W1UoYEF1dGhlbnRpY2F0aW9uIGZhaWxlZGAsLTEpXV0pLF86MX0pLEgoTihadiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bVShrKE4odCkuZXJyb3IpLDEpXSksXzoxfSldKSxfOjF9KSk6VHMoYGAsITApXSksXzoxfSldKSxfOjF9KV0pfX19KSxbW2BfX3Njb3BlSWRgLGBkYXRhLXYtNGJlNmJjMDlgXV0pO2Z1bmN0aW9uIF94KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UodCk6ZX1mdW5jdGlvbiB2eChlLHQpe3JldHVybiBuPT57dC5zZXRTdGF0ZSh0PT4oey4uLnQsW2VdOl94KG4sdFtlXSl9KSl9fWZ1bmN0aW9uIHl4KGUpe3JldHVybiBlIGluc3RhbmNlb2YgRnVuY3Rpb259ZnVuY3Rpb24gYngoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUuZXZlcnkoZT0+dHlwZW9mIGU9PWBudW1iZXJgKX1mdW5jdGlvbiB4eChlLHQpe2xldCBuPVtdLHI9ZT0+e2UuZm9yRWFjaChlPT57bi5wdXNoKGUpO2xldCBpPXQoZSk7aSE9bnVsbCYmaS5sZW5ndGgmJnIoaSl9KX07cmV0dXJuIHIoZSksbn1mdW5jdGlvbiBRKGUsdCxuKXtsZXQgcj1bXSxpO3JldHVybiBhPT57bGV0IG87bi5rZXkmJm4uZGVidWcmJihvPURhdGUubm93KCkpO2xldCBzPWUoYSk7aWYoIShzLmxlbmd0aCE9PXIubGVuZ3RofHxzLnNvbWUoKGUsdCk9PnJbdF0hPT1lKSkpcmV0dXJuIGk7cj1zO2xldCBjO2lmKG4ua2V5JiZuLmRlYnVnJiYoYz1EYXRlLm5vdygpKSxpPXQoLi4ucyksbj09bnVsbHx8bi5vbkNoYW5nZT09bnVsbHx8bi5vbkNoYW5nZShpKSxuLmtleSYmbi5kZWJ1ZyYmbiE9bnVsbCYmbi5kZWJ1ZygpKXtsZXQgZT1NYXRoLnJvdW5kKChEYXRlLm5vdygpLW8pKjEwMCkvMTAwLHQ9TWF0aC5yb3VuZCgoRGF0ZS5ub3coKS1jKSoxMDApLzEwMCxyPXQvMTYsaT0oZSx0KT0+e2ZvcihlPVN0cmluZyhlKTtlLmxlbmd0aDx0OyllPWAgYCtlO3JldHVybiBlfTtjb25zb2xlLmluZm8oYCVj4o+xICR7aSh0LDUpfSAvJHtpKGUsNSl9IG1zYCxgCiAgICAgICAgICAgIGZvbnQtc2l6ZTogLjZyZW07CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICBjb2xvcjogaHNsKCR7TWF0aC5tYXgoMCxNYXRoLm1pbigxMjAtMTIwKnIsMTIwKSl9ZGVnIDEwMCUgMzElKTtgLG4/LmtleSl9cmV0dXJuIGl9fWZ1bmN0aW9uICQoZSx0LG4scil7cmV0dXJue2RlYnVnOigpPT5lPy5kZWJ1Z0FsbD8/ZVt0XSxrZXk6ITEsb25DaGFuZ2U6cn19ZnVuY3Rpb24gU3goZSx0LG4scil7bGV0IGk9e2lkOmAke3QuaWR9XyR7bi5pZH1gLHJvdzp0LGNvbHVtbjpuLGdldFZhbHVlOigpPT50LmdldFZhbHVlKHIpLHJlbmRlclZhbHVlOigpPT5pLmdldFZhbHVlKCk/P2Uub3B0aW9ucy5yZW5kZXJGYWxsYmFja1ZhbHVlLGdldENvbnRleHQ6USgoKT0+W2Usbix0LGldLChlLHQsbixyKT0+KHt0YWJsZTplLGNvbHVtbjp0LHJvdzpuLGNlbGw6cixnZXRWYWx1ZTpyLmdldFZhbHVlLHJlbmRlclZhbHVlOnIucmVuZGVyVmFsdWV9KSwkKGUub3B0aW9ucyxgZGVidWdDZWxsc2AsYGNlbGwuZ2V0Q29udGV4dGApKX07cmV0dXJuIGUuX2ZlYXR1cmVzLmZvckVhY2gocj0+e3IuY3JlYXRlQ2VsbD09bnVsbHx8ci5jcmVhdGVDZWxsKGksbix0LGUpfSx7fSksaX1mdW5jdGlvbiBDeChlLHQsbixyKXtsZXQgaT17Li4uZS5fZ2V0RGVmYXVsdENvbHVtbkRlZigpLC4uLnR9LGE9aS5hY2Nlc3NvcktleSxvPWkuaWQ/PyhhP3R5cGVvZiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGw9PWBmdW5jdGlvbmA/YS5yZXBsYWNlQWxsKGAuYCxgX2ApOmEucmVwbGFjZSgvXC4vZyxgX2ApOnZvaWQgMCk/Pyh0eXBlb2YgaS5oZWFkZXI9PWBzdHJpbmdgP2kuaGVhZGVyOnZvaWQgMCkscztpZihpLmFjY2Vzc29yRm4/cz1pLmFjY2Vzc29yRm46YSYmKHM9YS5pbmNsdWRlcyhgLmApP2U9PntsZXQgdD1lO2ZvcihsZXQgZSBvZiBhLnNwbGl0KGAuYCkpdD10Py5bZV07cmV0dXJuIHR9OmU9PmVbaS5hY2Nlc3NvcktleV0pLCFvKXRocm93IEVycm9yKCk7bGV0IGM9e2lkOmAke1N0cmluZyhvKX1gLGFjY2Vzc29yRm46cyxwYXJlbnQ6cixkZXB0aDpuLGNvbHVtbkRlZjppLGNvbHVtbnM6W10sZ2V0RmxhdENvbHVtbnM6USgoKT0+WyEwXSwoKT0+W2MsLi4uYy5jb2x1bW5zPy5mbGF0TWFwKGU9PmUuZ2V0RmxhdENvbHVtbnMoKSldLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBjb2x1bW4uZ2V0RmxhdENvbHVtbnNgKSksZ2V0TGVhZkNvbHVtbnM6USgoKT0+W2UuX2dldE9yZGVyQ29sdW1uc0ZuKCldLGU9Pnt2YXIgdDtyZXR1cm4odD1jLmNvbHVtbnMpIT1udWxsJiZ0Lmxlbmd0aD9lKGMuY29sdW1ucy5mbGF0TWFwKGU9PmUuZ2V0TGVhZkNvbHVtbnMoKSkpOltjXX0sJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGNvbHVtbi5nZXRMZWFmQ29sdW1uc2ApKX07Zm9yKGxldCB0IG9mIGUuX2ZlYXR1cmVzKXQuY3JlYXRlQ29sdW1uPT1udWxsfHx0LmNyZWF0ZUNvbHVtbihjLGUpO3JldHVybiBjfXZhciB3eD1gZGVidWdIZWFkZXJzYDtmdW5jdGlvbiBUeChlLHQsbil7bGV0IHI9e2lkOm4uaWQ/P3QuaWQsY29sdW1uOnQsaW5kZXg6bi5pbmRleCxpc1BsYWNlaG9sZGVyOiEhbi5pc1BsYWNlaG9sZGVyLHBsYWNlaG9sZGVySWQ6bi5wbGFjZWhvbGRlcklkLGRlcHRoOm4uZGVwdGgsc3ViSGVhZGVyczpbXSxjb2xTcGFuOjAscm93U3BhbjowLGhlYWRlckdyb3VwOm51bGwsZ2V0TGVhZkhlYWRlcnM6KCk9PntsZXQgZT1bXSx0PW49PntuLnN1YkhlYWRlcnMmJm4uc3ViSGVhZGVycy5sZW5ndGgmJm4uc3ViSGVhZGVycy5tYXAodCksZS5wdXNoKG4pfTtyZXR1cm4gdChyKSxlfSxnZXRDb250ZXh0OigpPT4oe3RhYmxlOmUsaGVhZGVyOnIsY29sdW1uOnR9KX07cmV0dXJuIGUuX2ZlYXR1cmVzLmZvckVhY2godD0+e3QuY3JlYXRlSGVhZGVyPT1udWxsfHx0LmNyZWF0ZUhlYWRlcihyLGUpfSkscn12YXIgRXg9e2NyZWF0ZVRhYmxlOmU9PntlLmdldEhlYWRlckdyb3Vwcz1RKCgpPT5bZS5nZXRBbGxDb2x1bW5zKCksZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwodCxuLHIsaSk9PntsZXQgYT1yPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxvPWk/Lm1hcChlPT5uLmZpbmQodD0+dC5pZD09PWUpKS5maWx0ZXIoQm9vbGVhbik/P1tdLHM9bi5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUuaWQpKSYmIShpIT1udWxsJiZpLmluY2x1ZGVzKGUuaWQpKSk7cmV0dXJuIER4KHQsWy4uLmEsLi4ucywuLi5vXSxlKX0sJChlLm9wdGlvbnMsd3gsYGdldEhlYWRlckdyb3Vwc2ApKSxlLmdldENlbnRlckhlYWRlckdyb3Vwcz1RKCgpPT5bZS5nZXRBbGxDb2x1bW5zKCksZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwodCxuLHIsaSk9PihuPW4uZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlLmlkKSkmJiEoaSE9bnVsbCYmaS5pbmNsdWRlcyhlLmlkKSkpLER4KHQsbixlLGBjZW50ZXJgKSksJChlLm9wdGlvbnMsd3gsYGdldENlbnRlckhlYWRlckdyb3Vwc2ApKSxlLmdldExlZnRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdF0sKHQsbixyKT0+RHgodCxyPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxlLGBsZWZ0YCksJChlLm9wdGlvbnMsd3gsYGdldExlZnRIZWFkZXJHcm91cHNgKSksZS5nZXRSaWdodEhlYWRlckdyb3Vwcz1RKCgpPT5bZS5nZXRBbGxDb2x1bW5zKCksZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyKT0+RHgodCxyPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxlLGByaWdodGApLCQoZS5vcHRpb25zLHd4LGBnZXRSaWdodEhlYWRlckdyb3Vwc2ApKSxlLmdldEZvb3Rlckdyb3Vwcz1RKCgpPT5bZS5nZXRIZWFkZXJHcm91cHMoKV0sZT0+Wy4uLmVdLnJldmVyc2UoKSwkKGUub3B0aW9ucyx3eCxgZ2V0Rm9vdGVyR3JvdXBzYCkpLGUuZ2V0TGVmdEZvb3Rlckdyb3Vwcz1RKCgpPT5bZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldExlZnRGb290ZXJHcm91cHNgKSksZS5nZXRDZW50ZXJGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldENlbnRlckZvb3Rlckdyb3Vwc2ApKSxlLmdldFJpZ2h0Rm9vdGVyR3JvdXBzPVEoKCk9PltlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0Rm9vdGVyR3JvdXBzYCkpLGUuZ2V0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0SGVhZGVyR3JvdXBzKCldLGU9PmUubWFwKGU9PmUuaGVhZGVycykuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRGbGF0SGVhZGVyc2ApKSxlLmdldExlZnRGbGF0SGVhZGVycz1RKCgpPT5bZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCldLGU9PmUubWFwKGU9PmUuaGVhZGVycykuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0RmxhdEhlYWRlcnNgKSksZS5nZXRDZW50ZXJGbGF0SGVhZGVycz1RKCgpPT5bZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKV0sZT0+ZS5tYXAoZT0+ZS5oZWFkZXJzKS5mbGF0KCksJChlLm9wdGlvbnMsd3gsYGdldENlbnRlckZsYXRIZWFkZXJzYCkpLGUuZ2V0UmlnaHRGbGF0SGVhZGVycz1RKCgpPT5bZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0UmlnaHRGbGF0SGVhZGVyc2ApKSxlLmdldENlbnRlckxlYWZIZWFkZXJzPVEoKCk9PltlLmdldENlbnRlckZsYXRIZWFkZXJzKCldLGU9PmUuZmlsdGVyKGU9Pnt2YXIgdDtyZXR1cm4hKCh0PWUuc3ViSGVhZGVycykhPW51bGwmJnQubGVuZ3RoKX0pLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJMZWFmSGVhZGVyc2ApKSxlLmdldExlZnRMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRMZWZ0RmxhdEhlYWRlcnMoKV0sZT0+ZS5maWx0ZXIoZT0+e3ZhciB0O3JldHVybiEoKHQ9ZS5zdWJIZWFkZXJzKSE9bnVsbCYmdC5sZW5ndGgpfSksJChlLm9wdGlvbnMsd3gsYGdldExlZnRMZWFmSGVhZGVyc2ApKSxlLmdldFJpZ2h0TGVhZkhlYWRlcnM9USgoKT0+W2UuZ2V0UmlnaHRGbGF0SGVhZGVycygpXSxlPT5lLmZpbHRlcihlPT57dmFyIHQ7cmV0dXJuISgodD1lLnN1YkhlYWRlcnMpIT1udWxsJiZ0Lmxlbmd0aCl9KSwkKGUub3B0aW9ucyx3eCxgZ2V0UmlnaHRMZWFmSGVhZGVyc2ApKSxlLmdldExlYWZIZWFkZXJzPVEoKCk9PltlLmdldExlZnRIZWFkZXJHcm91cHMoKSxlLmdldENlbnRlckhlYWRlckdyb3VwcygpLGUuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sKGUsdCxuKT0+Wy4uLmVbMF0/LmhlYWRlcnM/P1tdLC4uLnRbMF0/LmhlYWRlcnM/P1tdLC4uLm5bMF0/LmhlYWRlcnM/P1tdXS5tYXAoZT0+ZS5nZXRMZWFmSGVhZGVycygpKS5mbGF0KCksJChlLm9wdGlvbnMsd3gsYGdldExlYWZIZWFkZXJzYCkpfX07ZnVuY3Rpb24gRHgoZSx0LG4scil7bGV0IGk9MCxhPWZ1bmN0aW9uKGUsdCl7dD09PXZvaWQgMCYmKHQ9MSksaT1NYXRoLm1heChpLHQpLGUuZmlsdGVyKGU9PmUuZ2V0SXNWaXNpYmxlKCkpLmZvckVhY2goZT0+e3ZhciBuOyhuPWUuY29sdW1ucykhPW51bGwmJm4ubGVuZ3RoJiZhKGUuY29sdW1ucyx0KzEpfSwwKX07YShlKTtsZXQgbz1bXSxzPShlLHQpPT57bGV0IGk9e2RlcHRoOnQsaWQ6W3IsYCR7dH1gXS5maWx0ZXIoQm9vbGVhbikuam9pbihgX2ApLGhlYWRlcnM6W119LGE9W107ZS5mb3JFYWNoKGU9PntsZXQgbz1bLi4uYV0ucmV2ZXJzZSgpWzBdLHM9ZS5jb2x1bW4uZGVwdGg9PT1pLmRlcHRoLGMsbD0hMTtpZihzJiZlLmNvbHVtbi5wYXJlbnQ/Yz1lLmNvbHVtbi5wYXJlbnQ6KGM9ZS5jb2x1bW4sbD0hMCksbyYmbz8uY29sdW1uPT09YylvLnN1YkhlYWRlcnMucHVzaChlKTtlbHNle2xldCBpPVR4KG4sYyx7aWQ6W3IsdCxjLmlkLGU/LmlkXS5maWx0ZXIoQm9vbGVhbikuam9pbihgX2ApLGlzUGxhY2Vob2xkZXI6bCxwbGFjZWhvbGRlcklkOmw/YCR7YS5maWx0ZXIoZT0+ZS5jb2x1bW49PT1jKS5sZW5ndGh9YDp2b2lkIDAsZGVwdGg6dCxpbmRleDphLmxlbmd0aH0pO2kuc3ViSGVhZGVycy5wdXNoKGUpLGEucHVzaChpKX1pLmhlYWRlcnMucHVzaChlKSxlLmhlYWRlckdyb3VwPWl9KSxvLnB1c2goaSksdD4wJiZzKGEsdC0xKX07cyh0Lm1hcCgoZSx0KT0+VHgobixlLHtkZXB0aDppLGluZGV4OnR9KSksaS0xKSxvLnJldmVyc2UoKTtsZXQgYz1lPT5lLmZpbHRlcihlPT5lLmNvbHVtbi5nZXRJc1Zpc2libGUoKSkubWFwKGU9PntsZXQgdD0wLG49MCxyPVswXTtlLnN1YkhlYWRlcnMmJmUuc3ViSGVhZGVycy5sZW5ndGg/KHI9W10sYyhlLnN1YkhlYWRlcnMpLmZvckVhY2goZT0+e2xldHtjb2xTcGFuOm4scm93U3BhbjppfT1lO3QrPW4sci5wdXNoKGkpfSkpOnQ9MTtsZXQgaT1NYXRoLm1pbiguLi5yKTtyZXR1cm4gbis9aSxlLmNvbFNwYW49dCxlLnJvd1NwYW49bix7Y29sU3Bhbjp0LHJvd1NwYW46bn19KTtyZXR1cm4gYyhvWzBdPy5oZWFkZXJzPz9bXSksb312YXIgT3g9KGUsdCxuLHIsaSxhLG8pPT57bGV0IHM9e2lkOnQsaW5kZXg6cixvcmlnaW5hbDpuLGRlcHRoOmkscGFyZW50SWQ6byxfdmFsdWVzQ2FjaGU6e30sX3VuaXF1ZVZhbHVlc0NhY2hlOnt9LGdldFZhbHVlOnQ9PntpZihzLl92YWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gcy5fdmFsdWVzQ2FjaGVbdF07bGV0IG49ZS5nZXRDb2x1bW4odCk7aWYobiE9bnVsbCYmbi5hY2Nlc3NvckZuKXJldHVybiBzLl92YWx1ZXNDYWNoZVt0XT1uLmFjY2Vzc29yRm4ocy5vcmlnaW5hbCxyKSxzLl92YWx1ZXNDYWNoZVt0XX0sZ2V0VW5pcXVlVmFsdWVzOnQ9PntpZihzLl91bmlxdWVWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gcy5fdW5pcXVlVmFsdWVzQ2FjaGVbdF07bGV0IG49ZS5nZXRDb2x1bW4odCk7aWYobiE9bnVsbCYmbi5hY2Nlc3NvckZuKXJldHVybiBuLmNvbHVtbkRlZi5nZXRVbmlxdWVWYWx1ZXM/KHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdPW4uY29sdW1uRGVmLmdldFVuaXF1ZVZhbHVlcyhzLm9yaWdpbmFsLHIpLHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdKToocy5fdW5pcXVlVmFsdWVzQ2FjaGVbdF09W3MuZ2V0VmFsdWUodCldLHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdKX0scmVuZGVyVmFsdWU6dD0+cy5nZXRWYWx1ZSh0KT8/ZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWUsc3ViUm93czphPz9bXSxnZXRMZWFmUm93czooKT0+eHgocy5zdWJSb3dzLGU9PmUuc3ViUm93cyksZ2V0UGFyZW50Um93OigpPT5zLnBhcmVudElkP2UuZ2V0Um93KHMucGFyZW50SWQsITApOnZvaWQgMCxnZXRQYXJlbnRSb3dzOigpPT57bGV0IGU9W10sdD1zO2Zvcig7Oyl7bGV0IG49dC5nZXRQYXJlbnRSb3coKTtpZighbilicmVhaztlLnB1c2gobiksdD1ufXJldHVybiBlLnJldmVyc2UoKX0sZ2V0QWxsQ2VsbHM6USgoKT0+W2UuZ2V0QWxsTGVhZkNvbHVtbnMoKV0sdD0+dC5tYXAodD0+U3goZSxzLHQsdC5pZCkpLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRBbGxDZWxsc2ApKSxfZ2V0QWxsQ2VsbHNCeUNvbHVtbklkOlEoKCk9PltzLmdldEFsbENlbGxzKCldLGU9PmUucmVkdWNlKChlLHQpPT4oZVt0LmNvbHVtbi5pZF09dCxlKSx7fSksJChlLm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldEFsbENlbGxzQnlDb2x1bW5JZGApKX07Zm9yKGxldCB0PTA7dDxlLl9mZWF0dXJlcy5sZW5ndGg7dCsrKXtsZXQgbj1lLl9mZWF0dXJlc1t0XTtuPT1udWxsfHxuLmNyZWF0ZVJvdz09bnVsbHx8bi5jcmVhdGVSb3cocyxlKX1yZXR1cm4gc30sa3g9e2NyZWF0ZUNvbHVtbjooZSx0KT0+e2UuX2dldEZhY2V0ZWRSb3dNb2RlbD10Lm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsJiZ0Lm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsKHQsZS5pZCksZS5nZXRGYWNldGVkUm93TW9kZWw9KCk9PmUuX2dldEZhY2V0ZWRSb3dNb2RlbD9lLl9nZXRGYWNldGVkUm93TW9kZWwoKTp0LmdldFByZUZpbHRlcmVkUm93TW9kZWwoKSxlLl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzPXQub3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzJiZ0Lm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyh0LGUuaWQpLGUuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz0oKT0+ZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz9lLl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzKCk6bmV3IE1hcCxlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzPXQub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzJiZ0Lm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyh0LGUuaWQpLGUuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz0oKT0+e2lmKGUuX2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMpcmV0dXJuIGUuX2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMoKX19fSxBeD0oZSx0LG4pPT57dmFyIHIsaTtsZXQgYT1uPT1udWxsfHwocj1uLnRvU3RyaW5nKCkpPT1udWxsP3ZvaWQgMDpyLnRvTG93ZXJDYXNlKCk7cmV0dXJuISEoKGk9ZS5nZXRWYWx1ZSh0KSkhPW51bGwmJihpPWkudG9TdHJpbmcoKSkhPW51bGwmJihpPWkudG9Mb3dlckNhc2UoKSkhPW51bGwmJmkuaW5jbHVkZXMoYSkpfTtBeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpO3ZhciBqeD0oZSx0LG4pPT57dmFyIHI7cmV0dXJuISEoKHI9ZS5nZXRWYWx1ZSh0KSkhPW51bGwmJihyPXIudG9TdHJpbmcoKSkhPW51bGwmJnIuaW5jbHVkZXMobikpfTtqeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpO3ZhciBNeD0oZSx0LG4pPT57dmFyIHI7cmV0dXJuKChyPWUuZ2V0VmFsdWUodCkpPT1udWxsfHwocj1yLnRvU3RyaW5nKCkpPT1udWxsP3ZvaWQgMDpyLnRvTG93ZXJDYXNlKCkpPT09bj8udG9Mb3dlckNhc2UoKX07TXguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgTng9KGUsdCxuKT0+ZS5nZXRWYWx1ZSh0KT8uaW5jbHVkZXMobik7TnguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgUHg9KGUsdCxuKT0+IW4uc29tZShuPT57dmFyIHI7cmV0dXJuISgocj1lLmdldFZhbHVlKHQpKSE9bnVsbCYmci5pbmNsdWRlcyhuKSl9KTtQeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpfHwhKGUhPW51bGwmJmUubGVuZ3RoKTt2YXIgRng9KGUsdCxuKT0+bi5zb21lKG49PmUuZ2V0VmFsdWUodCk/LmluY2x1ZGVzKG4pKTtGeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpfHwhKGUhPW51bGwmJmUubGVuZ3RoKTt2YXIgSXg9KGUsdCxuKT0+ZS5nZXRWYWx1ZSh0KT09PW47SXguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgTHg9KGUsdCxuKT0+ZS5nZXRWYWx1ZSh0KT09bjtMeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpO3ZhciBSeD0oZSx0LG4pPT57bGV0W3IsaV09bixhPWUuZ2V0VmFsdWUodCk7cmV0dXJuIGE+PXImJmE8PWl9O1J4LnJlc29sdmVGaWx0ZXJWYWx1ZT1lPT57bGV0W3Qsbl09ZSxyPXR5cGVvZiB0PT1gbnVtYmVyYD90OnBhcnNlRmxvYXQodCksaT10eXBlb2Ygbj09YG51bWJlcmA/bjpwYXJzZUZsb2F0KG4pLGE9dD09PW51bGx8fE51bWJlci5pc05hTihyKT8tMS8wOnIsbz1uPT09bnVsbHx8TnVtYmVyLmlzTmFOKGkpPzEvMDppO2lmKGE+byl7bGV0IGU9YTthPW8sbz1lfXJldHVyblthLG9dfSxSeC5hdXRvUmVtb3ZlPWU9PkJ4KGUpfHxCeChlWzBdKSYmQngoZVsxXSk7dmFyIHp4PXtpbmNsdWRlc1N0cmluZzpBeCxpbmNsdWRlc1N0cmluZ1NlbnNpdGl2ZTpqeCxlcXVhbHNTdHJpbmc6TXgsYXJySW5jbHVkZXM6TngsYXJySW5jbHVkZXNBbGw6UHgsYXJySW5jbHVkZXNTb21lOkZ4LGVxdWFsczpJeCx3ZWFrRXF1YWxzOkx4LGluTnVtYmVyUmFuZ2U6Unh9O2Z1bmN0aW9uIEJ4KGUpe3JldHVybiBlPT1udWxsfHxlPT09YGB9dmFyIFZ4PXtnZXREZWZhdWx0Q29sdW1uRGVmOigpPT4oe2ZpbHRlckZuOmBhdXRvYH0pLGdldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtbkZpbHRlcnM6W10sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5GaWx0ZXJzQ2hhbmdlOnZ4KGBjb2x1bW5GaWx0ZXJzYCxlKSxmaWx0ZXJGcm9tTGVhZlJvd3M6ITEsbWF4TGVhZlJvd0ZpbHRlckRlcHRoOjEwMH0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UuZ2V0QXV0b0ZpbHRlckZuPSgpPT57bGV0IG49dC5nZXRDb3JlUm93TW9kZWwoKS5mbGF0Um93c1swXT8uZ2V0VmFsdWUoZS5pZCk7cmV0dXJuIHR5cGVvZiBuPT1gc3RyaW5nYD96eC5pbmNsdWRlc1N0cmluZzp0eXBlb2Ygbj09YG51bWJlcmA/enguaW5OdW1iZXJSYW5nZTp0eXBlb2Ygbj09YGJvb2xlYW5gfHx0eXBlb2Ygbj09YG9iamVjdGAmJm4/enguZXF1YWxzOkFycmF5LmlzQXJyYXkobik/enguYXJySW5jbHVkZXM6engud2Vha0VxdWFsc30sZS5nZXRGaWx0ZXJGbj0oKT0+eXgoZS5jb2x1bW5EZWYuZmlsdGVyRm4pP2UuY29sdW1uRGVmLmZpbHRlckZuOmUuY29sdW1uRGVmLmZpbHRlckZuPT09YGF1dG9gP2UuZ2V0QXV0b0ZpbHRlckZuKCk6dC5vcHRpb25zLmZpbHRlckZucz8uW2UuY29sdW1uRGVmLmZpbHRlckZuXT8/enhbZS5jb2x1bW5EZWYuZmlsdGVyRm5dLGUuZ2V0Q2FuRmlsdGVyPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlQ29sdW1uRmlsdGVyPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlQ29sdW1uRmlsdGVycz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUZpbHRlcnM/PyEwKSYmISFlLmFjY2Vzc29yRm4sZS5nZXRJc0ZpbHRlcmVkPSgpPT5lLmdldEZpbHRlckluZGV4KCk+LTEsZS5nZXRGaWx0ZXJWYWx1ZT0oKT0+e3ZhciBuO3JldHVybihuPXQuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzKT09bnVsbHx8KG49bi5maW5kKHQ9PnQuaWQ9PT1lLmlkKSk9PW51bGw/dm9pZCAwOm4udmFsdWV9LGUuZ2V0RmlsdGVySW5kZXg9KCk9PnQuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzPy5maW5kSW5kZXgodD0+dC5pZD09PWUuaWQpPz8tMSxlLnNldEZpbHRlclZhbHVlPW49Pnt0LnNldENvbHVtbkZpbHRlcnModD0+e2xldCByPWUuZ2V0RmlsdGVyRm4oKSxpPXQ/LmZpbmQodD0+dC5pZD09PWUuaWQpLGE9X3gobixpP2kudmFsdWU6dm9pZCAwKTtpZihIeChyLGEsZSkpcmV0dXJuIHQ/LmZpbHRlcih0PT50LmlkIT09ZS5pZCk/P1tdO2xldCBvPXtpZDplLmlkLHZhbHVlOmF9O3JldHVybiBpP3Q/Lm1hcCh0PT50LmlkPT09ZS5pZD9vOnQpPz9bXTp0IT1udWxsJiZ0Lmxlbmd0aD9bLi4udCxvXTpbb119KX19LGNyZWF0ZVJvdzooZSx0KT0+e2UuY29sdW1uRmlsdGVycz17fSxlLmNvbHVtbkZpbHRlcnNNZXRhPXt9fSxjcmVhdGVUYWJsZTplPT57ZS5zZXRDb2x1bW5GaWx0ZXJzPXQ9PntsZXQgbj1lLmdldEFsbExlYWZDb2x1bW5zKCk7ZS5vcHRpb25zLm9uQ29sdW1uRmlsdGVyc0NoYW5nZT09bnVsbHx8ZS5vcHRpb25zLm9uQ29sdW1uRmlsdGVyc0NoYW5nZShlPT5feCh0LGUpPy5maWx0ZXIoZT0+e2xldCB0PW4uZmluZCh0PT50LmlkPT09ZS5pZCk7cmV0dXJuISh0JiZIeCh0LmdldEZpbHRlckZuKCksZS52YWx1ZSx0KSl9KSl9LGUucmVzZXRDb2x1bW5GaWx0ZXJzPXQ9PntlLnNldENvbHVtbkZpbHRlcnModD9bXTplLmluaXRpYWxTdGF0ZT8uY29sdW1uRmlsdGVycz8/W10pfSxlLmdldFByZUZpbHRlcmVkUm93TW9kZWw9KCk9PmUuZ2V0Q29yZVJvd01vZGVsKCksZS5nZXRGaWx0ZXJlZFJvd01vZGVsPSgpPT4oIWUuX2dldEZpbHRlcmVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRGaWx0ZXJlZFJvd01vZGVsJiYoZS5fZ2V0RmlsdGVyZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0RmlsdGVyZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbEZpbHRlcmluZ3x8IWUuX2dldEZpbHRlcmVkUm93TW9kZWw/ZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCk6ZS5fZ2V0RmlsdGVyZWRSb3dNb2RlbCgpKX19O2Z1bmN0aW9uIEh4KGUsdCxuKXtyZXR1cm4oZSYmZS5hdXRvUmVtb3ZlP2UuYXV0b1JlbW92ZSh0LG4pOiExKXx8dD09PXZvaWQgMHx8dHlwZW9mIHQ9PWBzdHJpbmdgJiYhdH12YXIgVXg9e3N1bTooZSx0LG4pPT5uLnJlZHVjZSgodCxuKT0+e2xldCByPW4uZ2V0VmFsdWUoZSk7cmV0dXJuIHQrKHR5cGVvZiByPT1gbnVtYmVyYD9yOjApfSwwKSxtaW46KGUsdCxuKT0+e2xldCByO3JldHVybiBuLmZvckVhY2godD0+e2xldCBuPXQuZ2V0VmFsdWUoZSk7biE9bnVsbCYmKHI+bnx8cj09PXZvaWQgMCYmbj49bikmJihyPW4pfSkscn0sbWF4OihlLHQsbik9PntsZXQgcjtyZXR1cm4gbi5mb3JFYWNoKHQ9PntsZXQgbj10LmdldFZhbHVlKGUpO24hPW51bGwmJihyPG58fHI9PT12b2lkIDAmJm4+PW4pJiYocj1uKX0pLHJ9LGV4dGVudDooZSx0LG4pPT57bGV0IHIsaTtyZXR1cm4gbi5mb3JFYWNoKHQ9PntsZXQgbj10LmdldFZhbHVlKGUpO24hPW51bGwmJihyPT09dm9pZCAwP24+PW4mJihyPWk9bik6KHI+biYmKHI9biksaTxuJiYoaT1uKSkpfSksW3IsaV19LG1lYW46KGUsdCk9PntsZXQgbj0wLHI9MDtpZih0LmZvckVhY2godD0+e2xldCBpPXQuZ2V0VmFsdWUoZSk7aSE9bnVsbCYmKGk9K2kpPj1pJiYoKytuLHIrPWkpfSksbilyZXR1cm4gci9ufSxtZWRpYW46KGUsdCk9PntpZighdC5sZW5ndGgpcmV0dXJuO2xldCBuPXQubWFwKHQ9PnQuZ2V0VmFsdWUoZSkpO2lmKCFieChuKSlyZXR1cm47aWYobi5sZW5ndGg9PT0xKXJldHVybiBuWzBdO2xldCByPU1hdGguZmxvb3Iobi5sZW5ndGgvMiksaT1uLnNvcnQoKGUsdCk9PmUtdCk7cmV0dXJuIG4ubGVuZ3RoJTI9PTA/KGlbci0xXStpW3JdKS8yOmlbcl19LHVuaXF1ZTooZSx0KT0+QXJyYXkuZnJvbShuZXcgU2V0KHQubWFwKHQ9PnQuZ2V0VmFsdWUoZSkpKS52YWx1ZXMoKSksdW5pcXVlQ291bnQ6KGUsdCk9Pm5ldyBTZXQodC5tYXAodD0+dC5nZXRWYWx1ZShlKSkpLnNpemUsY291bnQ6KGUsdCk9PnQubGVuZ3RofSxXeD17Z2V0RGVmYXVsdENvbHVtbkRlZjooKT0+KHthZ2dyZWdhdGVkQ2VsbDplPT57dmFyIHQ7cmV0dXJuKCh0PWUuZ2V0VmFsdWUoKSk9PW51bGx8fHQudG9TdHJpbmc9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKSk/P251bGx9LGFnZ3JlZ2F0aW9uRm46YGF1dG9gfSksZ2V0SW5pdGlhbFN0YXRlOmU9Pih7Z3JvdXBpbmc6W10sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Hcm91cGluZ0NoYW5nZTp2eChgZ3JvdXBpbmdgLGUpLGdyb3VwZWRDb2x1bW5Nb2RlOmByZW9yZGVyYH0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UudG9nZ2xlR3JvdXBpbmc9KCk9Pnt0LnNldEdyb3VwaW5nKHQ9PnQhPW51bGwmJnQuaW5jbHVkZXMoZS5pZCk/dC5maWx0ZXIodD0+dCE9PWUuaWQpOlsuLi50Pz9bXSxlLmlkXSl9LGUuZ2V0Q2FuR3JvdXA9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVHcm91cGluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUdyb3VwaW5nPz8hMCkmJighIWUuYWNjZXNzb3JGbnx8ISFlLmNvbHVtbkRlZi5nZXRHcm91cGluZ1ZhbHVlKSxlLmdldElzR3JvdXBlZD0oKT0+dC5nZXRTdGF0ZSgpLmdyb3VwaW5nPy5pbmNsdWRlcyhlLmlkKSxlLmdldEdyb3VwZWRJbmRleD0oKT0+dC5nZXRTdGF0ZSgpLmdyb3VwaW5nPy5pbmRleE9mKGUuaWQpLGUuZ2V0VG9nZ2xlR3JvdXBpbmdIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5Hcm91cCgpO3JldHVybigpPT57dCYmZS50b2dnbGVHcm91cGluZygpfX0sZS5nZXRBdXRvQWdncmVnYXRpb25Gbj0oKT0+e2xldCBuPXQuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpO2lmKHR5cGVvZiBuPT1gbnVtYmVyYClyZXR1cm4gVXguc3VtO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PWBbb2JqZWN0IERhdGVdYClyZXR1cm4gVXguZXh0ZW50fSxlLmdldEFnZ3JlZ2F0aW9uRm49KCk9PntpZighZSl0aHJvdyBFcnJvcigpO3JldHVybiB5eChlLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuKT9lLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuOmUuY29sdW1uRGVmLmFnZ3JlZ2F0aW9uRm49PT1gYXV0b2A/ZS5nZXRBdXRvQWdncmVnYXRpb25GbigpOnQub3B0aW9ucy5hZ2dyZWdhdGlvbkZucz8uW2UuY29sdW1uRGVmLmFnZ3JlZ2F0aW9uRm5dPz9VeFtlLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldEdyb3VwaW5nPXQ9PmUub3B0aW9ucy5vbkdyb3VwaW5nQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Hcm91cGluZ0NoYW5nZSh0KSxlLnJlc2V0R3JvdXBpbmc9dD0+e2Uuc2V0R3JvdXBpbmcodD9bXTplLmluaXRpYWxTdGF0ZT8uZ3JvdXBpbmc/P1tdKX0sZS5nZXRQcmVHcm91cGVkUm93TW9kZWw9KCk9PmUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLGUuZ2V0R3JvdXBlZFJvd01vZGVsPSgpPT4oIWUuX2dldEdyb3VwZWRSb3dNb2RlbCYmZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbCYmKGUuX2dldEdyb3VwZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0R3JvdXBlZFJvd01vZGVsKGUpKSxlLm9wdGlvbnMubWFudWFsR3JvdXBpbmd8fCFlLl9nZXRHcm91cGVkUm93TW9kZWw/ZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKTplLl9nZXRHcm91cGVkUm93TW9kZWwoKSl9LGNyZWF0ZVJvdzooZSx0KT0+e2UuZ2V0SXNHcm91cGVkPSgpPT4hIWUuZ3JvdXBpbmdDb2x1bW5JZCxlLmdldEdyb3VwaW5nVmFsdWU9bj0+e2lmKGUuX2dyb3VwaW5nVmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkobikpcmV0dXJuIGUuX2dyb3VwaW5nVmFsdWVzQ2FjaGVbbl07bGV0IHI9dC5nZXRDb2x1bW4obik7cmV0dXJuIHIhPW51bGwmJnIuY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWU/KGUuX2dyb3VwaW5nVmFsdWVzQ2FjaGVbbl09ci5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZShlLm9yaWdpbmFsKSxlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dKTplLmdldFZhbHVlKG4pfSxlLl9ncm91cGluZ1ZhbHVlc0NhY2hlPXt9fSxjcmVhdGVDZWxsOihlLHQsbixyKT0+e2UuZ2V0SXNHcm91cGVkPSgpPT50LmdldElzR3JvdXBlZCgpJiZ0LmlkPT09bi5ncm91cGluZ0NvbHVtbklkLGUuZ2V0SXNQbGFjZWhvbGRlcj0oKT0+IWUuZ2V0SXNHcm91cGVkKCkmJnQuZ2V0SXNHcm91cGVkKCksZS5nZXRJc0FnZ3JlZ2F0ZWQ9KCk9Pnt2YXIgdDtyZXR1cm4hZS5nZXRJc0dyb3VwZWQoKSYmIWUuZ2V0SXNQbGFjZWhvbGRlcigpJiYhISgodD1uLnN1YlJvd3MpIT1udWxsJiZ0Lmxlbmd0aCl9fX07ZnVuY3Rpb24gR3goZSx0LG4pe2lmKCEodCE9bnVsbCYmdC5sZW5ndGgpfHwhbilyZXR1cm4gZTtsZXQgcj1lLmZpbHRlcihlPT4hdC5pbmNsdWRlcyhlLmlkKSk7cmV0dXJuIG49PT1gcmVtb3ZlYD9yOlsuLi50Lm1hcCh0PT5lLmZpbmQoZT0+ZS5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbiksLi4ucl19dmFyIEt4PXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5PcmRlcjpbXSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkNvbHVtbk9yZGVyQ2hhbmdlOnZ4KGBjb2x1bW5PcmRlcmAsZSl9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldEluZGV4PVEoZT0+W3JTKHQsZSldLHQ9PnQuZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKSwkKHQub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgZ2V0SW5kZXhgKSksZS5nZXRJc0ZpcnN0Q29sdW1uPW49PnJTKHQsbilbMF0/LmlkPT09ZS5pZCxlLmdldElzTGFzdENvbHVtbj1uPT57bGV0IHI9clModCxuKTtyZXR1cm4gcltyLmxlbmd0aC0xXT8uaWQ9PT1lLmlkfX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Q29sdW1uT3JkZXI9dD0+ZS5vcHRpb25zLm9uQ29sdW1uT3JkZXJDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlKHQpLGUucmVzZXRDb2x1bW5PcmRlcj10PT57ZS5zZXRDb2x1bW5PcmRlcih0P1tdOmUuaW5pdGlhbFN0YXRlLmNvbHVtbk9yZGVyPz9bXSl9LGUuX2dldE9yZGVyQ29sdW1uc0ZuPVEoKCk9PltlLmdldFN0YXRlKCkuY29sdW1uT3JkZXIsZS5nZXRTdGF0ZSgpLmdyb3VwaW5nLGUub3B0aW9ucy5ncm91cGVkQ29sdW1uTW9kZV0sKGUsdCxuKT0+cj0+e2xldCBpPVtdO2lmKCEoZSE9bnVsbCYmZS5sZW5ndGgpKWk9cjtlbHNle2xldCB0PVsuLi5lXSxuPVsuLi5yXTtmb3IoO24ubGVuZ3RoJiZ0Lmxlbmd0aDspe2xldCBlPXQuc2hpZnQoKSxyPW4uZmluZEluZGV4KHQ9PnQuaWQ9PT1lKTtyPi0xJiZpLnB1c2gobi5zcGxpY2UociwxKVswXSl9aT1bLi4uaSwuLi5uXX1yZXR1cm4gR3goaSx0LG4pfSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYF9nZXRPcmRlckNvbHVtbnNGbmApKX19LHF4PSgpPT4oe2xlZnQ6W10scmlnaHQ6W119KSxKeD17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Y29sdW1uUGlubmluZzpxeCgpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uQ29sdW1uUGlubmluZ0NoYW5nZTp2eChgY29sdW1uUGlubmluZ2AsZSl9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLnBpbj1uPT57bGV0IHI9ZS5nZXRMZWFmQ29sdW1ucygpLm1hcChlPT5lLmlkKS5maWx0ZXIoQm9vbGVhbik7dC5zZXRDb2x1bW5QaW5uaW5nKGU9Pm49PT1gcmlnaHRgP3tsZWZ0OihlPy5sZWZ0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLHJpZ2h0OlsuLi4oZT8ucmlnaHQ/P1tdKS5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUpKSksLi4ucl19Om49PT1gbGVmdGA/e2xlZnQ6Wy4uLihlPy5sZWZ0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLC4uLnJdLHJpZ2h0OihlPy5yaWdodD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKX06e2xlZnQ6KGU/LmxlZnQ/P1tdKS5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUpKSkscmlnaHQ6KGU/LnJpZ2h0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpfSl9LGUuZ2V0Q2FuUGluPSgpPT5lLmdldExlYWZDb2x1bW5zKCkuc29tZShlPT4oZS5jb2x1bW5EZWYuZW5hYmxlUGlubmluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtblBpbm5pbmc/P3Qub3B0aW9ucy5lbmFibGVQaW5uaW5nPz8hMCkpLGUuZ2V0SXNQaW5uZWQ9KCk9PntsZXQgbj1lLmdldExlYWZDb2x1bW5zKCkubWFwKGU9PmUuaWQpLHtsZWZ0OnIscmlnaHQ6aX09dC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcsYT1uLnNvbWUoZT0+cj8uaW5jbHVkZXMoZSkpLG89bi5zb21lKGU9Pmk/LmluY2x1ZGVzKGUpKTtyZXR1cm4gYT9gbGVmdGA6bz9gcmlnaHRgOiExfSxlLmdldFBpbm5lZEluZGV4PSgpPT57dmFyIG47bGV0IHI9ZS5nZXRJc1Bpbm5lZCgpO3JldHVybiByPygobj10LmdldFN0YXRlKCkuY29sdW1uUGlubmluZyk9PW51bGx8fChuPW5bcl0pPT1udWxsP3ZvaWQgMDpuLmluZGV4T2YoZS5pZCkpPz8tMTowfX0sY3JlYXRlUm93OihlLHQpPT57ZS5nZXRDZW50ZXJWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsdC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQsbik9PntsZXQgcj1bLi4udD8/W10sLi4ubj8/W11dO3JldHVybiBlLmZpbHRlcihlPT4hci5pbmNsdWRlcyhlLmNvbHVtbi5pZCkpfSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0Q2VudGVyVmlzaWJsZUNlbGxzYCkpLGUuZ2V0TGVmdFZpc2libGVDZWxscz1RKCgpPT5bZS5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksdC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdF0sKGUsdCk9Pih0Pz9bXSkubWFwKHQ9PmUuZmluZChlPT5lLmNvbHVtbi5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbikubWFwKGU9Pih7Li4uZSxwb3NpdGlvbjpgbGVmdGB9KSksJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldExlZnRWaXNpYmxlQ2VsbHNgKSksZS5nZXRSaWdodFZpc2libGVDZWxscz1RKCgpPT5bZS5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksdC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5jb2x1bW4uaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLm1hcChlPT4oey4uLmUscG9zaXRpb246YHJpZ2h0YH0pKSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0UmlnaHRWaXNpYmxlQ2VsbHNgKSl9LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtblBpbm5pbmc9dD0+ZS5vcHRpb25zLm9uQ29sdW1uUGlubmluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uUGlubmluZ0NoYW5nZSh0KSxlLnJlc2V0Q29sdW1uUGlubmluZz10PT5lLnNldENvbHVtblBpbm5pbmcodD9xeCgpOmUuaW5pdGlhbFN0YXRlPy5jb2x1bW5QaW5uaW5nPz9xeCgpKSxlLmdldElzU29tZUNvbHVtbnNQaW5uZWQ9dD0+e2xldCBuPWUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nO3JldHVybiB0PyEhblt0XT8ubGVuZ3RoOiEhKG4ubGVmdD8ubGVuZ3RofHxuLnJpZ2h0Py5sZW5ndGgpfSxlLmdldExlZnRMZWFmQ29sdW1ucz1RKCgpPT5bZS5nZXRBbGxMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbiksJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldExlZnRMZWFmQ29sdW1uc2ApKSxlLmdldFJpZ2h0TGVhZkNvbHVtbnM9USgoKT0+W2UuZ2V0QWxsTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKGUsdCk9Pih0Pz9bXSkubWFwKHQ9PmUuZmluZChlPT5lLmlkPT09dCkpLmZpbHRlcihCb29sZWFuKSwkKGUub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgZ2V0UmlnaHRMZWFmQ29sdW1uc2ApKSxlLmdldENlbnRlckxlYWZDb2x1bW5zPVEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKGUsdCxuKT0+e2xldCByPVsuLi50Pz9bXSwuLi5uPz9bXV07cmV0dXJuIGUuZmlsdGVyKGU9PiFyLmluY2x1ZGVzKGUuaWQpKX0sJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldENlbnRlckxlYWZDb2x1bW5zYCkpfX07ZnVuY3Rpb24gWXgoZSl7cmV0dXJuIGV8fCh0eXBlb2YgZG9jdW1lbnQ8YHVgP2RvY3VtZW50Om51bGwpfXZhciBYeD17c2l6ZToxNTAsbWluU2l6ZToyMCxtYXhTaXplOjIqKjUzLTF9LFp4PSgpPT4oe3N0YXJ0T2Zmc2V0Om51bGwsc3RhcnRTaXplOm51bGwsZGVsdGFPZmZzZXQ6bnVsbCxkZWx0YVBlcmNlbnRhZ2U6bnVsbCxpc1Jlc2l6aW5nQ29sdW1uOiExLGNvbHVtblNpemluZ1N0YXJ0OltdfSksUXg9e2dldERlZmF1bHRDb2x1bW5EZWY6KCk9Plh4LGdldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblNpemluZzp7fSxjb2x1bW5TaXppbmdJbmZvOlp4KCksLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7Y29sdW1uUmVzaXplTW9kZTpgb25FbmRgLGNvbHVtblJlc2l6ZURpcmVjdGlvbjpgbHRyYCxvbkNvbHVtblNpemluZ0NoYW5nZTp2eChgY29sdW1uU2l6aW5nYCxlKSxvbkNvbHVtblNpemluZ0luZm9DaGFuZ2U6dngoYGNvbHVtblNpemluZ0luZm9gLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRTaXplPSgpPT57bGV0IG49dC5nZXRTdGF0ZSgpLmNvbHVtblNpemluZ1tlLmlkXTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZS5jb2x1bW5EZWYubWluU2l6ZT8/WHgubWluU2l6ZSxuPz9lLmNvbHVtbkRlZi5zaXplPz9YeC5zaXplKSxlLmNvbHVtbkRlZi5tYXhTaXplPz9YeC5tYXhTaXplKX0sZS5nZXRTdGFydD1RKGU9PltlLHJTKHQsZSksdC5nZXRTdGF0ZSgpLmNvbHVtblNpemluZ10sKHQsbik9Pm4uc2xpY2UoMCxlLmdldEluZGV4KHQpKS5yZWR1Y2UoKGUsdCk9PmUrdC5nZXRTaXplKCksMCksJCh0Lm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldFN0YXJ0YCkpLGUuZ2V0QWZ0ZXI9UShlPT5bZSxyUyh0LGUpLHQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmddLCh0LG4pPT5uLnNsaWNlKGUuZ2V0SW5kZXgodCkrMSkucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApLCQodC5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBZnRlcmApKSxlLnJlc2V0U2l6ZT0oKT0+e3Quc2V0Q29sdW1uU2l6aW5nKHQ9PntsZXR7W2UuaWRdOm4sLi4ucn09dDtyZXR1cm4gcn0pfSxlLmdldENhblJlc2l6ZT0oKT0+KGUuY29sdW1uRGVmLmVuYWJsZVJlc2l6aW5nPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlQ29sdW1uUmVzaXppbmc/PyEwKSxlLmdldElzUmVzaXppbmc9KCk9PnQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdJbmZvLmlzUmVzaXppbmdDb2x1bW49PT1lLmlkfSxjcmVhdGVIZWFkZXI6KGUsdCk9PntlLmdldFNpemU9KCk9PntsZXQgdD0wLG49ZT0+e2Uuc3ViSGVhZGVycy5sZW5ndGg/ZS5zdWJIZWFkZXJzLmZvckVhY2gobik6dCs9ZS5jb2x1bW4uZ2V0U2l6ZSgpPz8wfTtyZXR1cm4gbihlKSx0fSxlLmdldFN0YXJ0PSgpPT57aWYoZS5pbmRleD4wKXtsZXQgdD1lLmhlYWRlckdyb3VwLmhlYWRlcnNbZS5pbmRleC0xXTtyZXR1cm4gdC5nZXRTdGFydCgpK3QuZ2V0U2l6ZSgpfXJldHVybiAwfSxlLmdldFJlc2l6ZUhhbmRsZXI9bj0+e2xldCByPXQuZ2V0Q29sdW1uKGUuY29sdW1uLmlkKSxpPXI/LmdldENhblJlc2l6ZSgpO3JldHVybiBhPT57aWYoIXJ8fCFpfHwoYS5wZXJzaXN0PT1udWxsfHxhLnBlcnNpc3QoKSx0UyhhKSYmYS50b3VjaGVzJiZhLnRvdWNoZXMubGVuZ3RoPjEpKXJldHVybjtsZXQgbz1lLmdldFNpemUoKSxzPWU/ZS5nZXRMZWFmSGVhZGVycygpLm1hcChlPT5bZS5jb2x1bW4uaWQsZS5jb2x1bW4uZ2V0U2l6ZSgpXSk6W1tyLmlkLHIuZ2V0U2l6ZSgpXV0sYz10UyhhKT9NYXRoLnJvdW5kKGEudG91Y2hlc1swXS5jbGllbnRYKTphLmNsaWVudFgsbD17fSx1PShlLG4pPT57dHlwZW9mIG49PWBudW1iZXJgJiYodC5zZXRDb2x1bW5TaXppbmdJbmZvKGU9PntsZXQgcj10Lm9wdGlvbnMuY29sdW1uUmVzaXplRGlyZWN0aW9uPT09YHJ0bGA/LTE6MSxpPShuLShlPy5zdGFydE9mZnNldD8/MCkpKnIsYT1NYXRoLm1heChpLyhlPy5zdGFydFNpemU/PzApLC0uOTk5OTk5KTtyZXR1cm4gZS5jb2x1bW5TaXppbmdTdGFydC5mb3JFYWNoKGU9PntsZXRbdCxuXT1lO2xbdF09TWF0aC5yb3VuZChNYXRoLm1heChuK24qYSwwKSoxMDApLzEwMH0pLHsuLi5lLGRlbHRhT2Zmc2V0OmksZGVsdGFQZXJjZW50YWdlOmF9fSksKHQub3B0aW9ucy5jb2x1bW5SZXNpemVNb2RlPT09YG9uQ2hhbmdlYHx8ZT09PWBlbmRgKSYmdC5zZXRDb2x1bW5TaXppbmcoZT0+KHsuLi5lLC4uLmx9KSkpfSxkPWU9PnUoYG1vdmVgLGUpLGY9ZT0+e3UoYGVuZGAsZSksdC5zZXRDb2x1bW5TaXppbmdJbmZvKGU9Pih7Li4uZSxpc1Jlc2l6aW5nQ29sdW1uOiExLHN0YXJ0T2Zmc2V0Om51bGwsc3RhcnRTaXplOm51bGwsZGVsdGFPZmZzZXQ6bnVsbCxkZWx0YVBlcmNlbnRhZ2U6bnVsbCxjb2x1bW5TaXppbmdTdGFydDpbXX0pKX0scD1ZeChuKSxtPXttb3ZlSGFuZGxlcjplPT5kKGUuY2xpZW50WCksdXBIYW5kbGVyOmU9PntwPy5yZW1vdmVFdmVudExpc3RlbmVyKGBtb3VzZW1vdmVgLG0ubW92ZUhhbmRsZXIpLHA/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYG1vdXNldXBgLG0udXBIYW5kbGVyKSxmKGUuY2xpZW50WCl9fSxoPXttb3ZlSGFuZGxlcjplPT4oZS5jYW5jZWxhYmxlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLGQoZS50b3VjaGVzWzBdLmNsaWVudFgpLCExKSx1cEhhbmRsZXI6ZT0+e3A/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRvdWNobW92ZWAsaC5tb3ZlSGFuZGxlcikscD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdG91Y2hlbmRgLGgudXBIYW5kbGVyKSxlLmNhbmNlbGFibGUmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSksZihlLnRvdWNoZXNbMF0/LmNsaWVudFgpfX0sZz1lUygpP3twYXNzaXZlOiExfTohMTt0UyhhKT8ocD8uYWRkRXZlbnRMaXN0ZW5lcihgdG91Y2htb3ZlYCxoLm1vdmVIYW5kbGVyLGcpLHA/LmFkZEV2ZW50TGlzdGVuZXIoYHRvdWNoZW5kYCxoLnVwSGFuZGxlcixnKSk6KHA/LmFkZEV2ZW50TGlzdGVuZXIoYG1vdXNlbW92ZWAsbS5tb3ZlSGFuZGxlcixnKSxwPy5hZGRFdmVudExpc3RlbmVyKGBtb3VzZXVwYCxtLnVwSGFuZGxlcixnKSksdC5zZXRDb2x1bW5TaXppbmdJbmZvKGU9Pih7Li4uZSxzdGFydE9mZnNldDpjLHN0YXJ0U2l6ZTpvLGRlbHRhT2Zmc2V0OjAsZGVsdGFQZXJjZW50YWdlOjAsY29sdW1uU2l6aW5nU3RhcnQ6cyxpc1Jlc2l6aW5nQ29sdW1uOnIuaWR9KSl9fX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Q29sdW1uU2l6aW5nPXQ9PmUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nQ2hhbmdlKHQpLGUuc2V0Q29sdW1uU2l6aW5nSW5mbz10PT5lLm9wdGlvbnMub25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlKHQpLGUucmVzZXRDb2x1bW5TaXppbmc9dD0+e2Uuc2V0Q29sdW1uU2l6aW5nKHQ/e306ZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nPz97fSl9LGUucmVzZXRIZWFkZXJTaXplSW5mbz10PT57ZS5zZXRDb2x1bW5TaXppbmdJbmZvKHQ/WngoKTplLmluaXRpYWxTdGF0ZS5jb2x1bW5TaXppbmdJbmZvPz9aeCgpKX0sZS5nZXRUb3RhbFNpemU9KCk9PmUuZ2V0SGVhZGVyR3JvdXBzKClbMF0/LmhlYWRlcnMucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApPz8wLGUuZ2V0TGVmdFRvdGFsU2l6ZT0oKT0+ZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKClbMF0/LmhlYWRlcnMucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApPz8wLGUuZ2V0Q2VudGVyVG90YWxTaXplPSgpPT5lLmdldENlbnRlckhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldFJpZ2h0VG90YWxTaXplPSgpPT5lLmdldFJpZ2h0SGVhZGVyR3JvdXBzKClbMF0/LmhlYWRlcnMucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApPz8wfX0sJHg9bnVsbDtmdW5jdGlvbiBlUygpe2lmKHR5cGVvZiAkeD09YGJvb2xlYW5gKXJldHVybiAkeDtsZXQgZT0hMTt0cnl7bGV0IHQ9e2dldCBwYXNzaXZlKCl7cmV0dXJuIGU9ITAsITF9fSxuPSgpPT57fTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgdGVzdGAsbix0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdGVzdGAsbil9Y2F0Y2h7ZT0hMX1yZXR1cm4gJHg9ZSwkeH1mdW5jdGlvbiB0UyhlKXtyZXR1cm4gZS50eXBlPT09YHRvdWNoc3RhcnRgfXZhciBuUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Y29sdW1uVmlzaWJpbGl0eTp7fSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2U6dngoYGNvbHVtblZpc2liaWxpdHlgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS50b2dnbGVWaXNpYmlsaXR5PW49PntlLmdldENhbkhpZGUoKSYmdC5zZXRDb2x1bW5WaXNpYmlsaXR5KHQ9Pih7Li4udCxbZS5pZF06bj8/IWUuZ2V0SXNWaXNpYmxlKCl9KSl9LGUuZ2V0SXNWaXNpYmxlPSgpPT57bGV0IG49ZS5jb2x1bW5zO3JldHVybihuLmxlbmd0aD9uLnNvbWUoZT0+ZS5nZXRJc1Zpc2libGUoKSk6dC5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHk/LltlLmlkXSk/PyEwfSxlLmdldENhbkhpZGU9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVIaWRpbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVIaWRpbmc/PyEwKSxlLmdldFRvZ2dsZVZpc2liaWxpdHlIYW5kbGVyPSgpPT50PT57ZS50b2dnbGVWaXNpYmlsaXR5PT1udWxsfHxlLnRvZ2dsZVZpc2liaWxpdHkodC50YXJnZXQuY2hlY2tlZCl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLl9nZXRBbGxWaXNpYmxlQ2VsbHM9USgoKT0+W2UuZ2V0QWxsQ2VsbHMoKSx0LmdldFN0YXRlKCkuY29sdW1uVmlzaWJpbGl0eV0sZT0+ZS5maWx0ZXIoZT0+ZS5jb2x1bW4uZ2V0SXNWaXNpYmxlKCkpLCQodC5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBfZ2V0QWxsVmlzaWJsZUNlbGxzYCkpLGUuZ2V0VmlzaWJsZUNlbGxzPVEoKCk9PltlLmdldExlZnRWaXNpYmxlQ2VsbHMoKSxlLmdldENlbnRlclZpc2libGVDZWxscygpLGUuZ2V0UmlnaHRWaXNpYmxlQ2VsbHMoKV0sKGUsdCxuKT0+Wy4uLmUsLi4udCwuLi5uXSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0VmlzaWJsZUNlbGxzYCkpfSxjcmVhdGVUYWJsZTplPT57bGV0IHQ9KHQsbik9PlEoKCk9PltuKCksbigpLmZpbHRlcihlPT5lLmdldElzVmlzaWJsZSgpKS5tYXAoZT0+ZS5pZCkuam9pbihgX2ApXSxlPT5lLmZpbHRlcihlPT5lLmdldElzVmlzaWJsZT09bnVsbD92b2lkIDA6ZS5nZXRJc1Zpc2libGUoKSksJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsdCkpO2UuZ2V0VmlzaWJsZUZsYXRDb2x1bW5zPXQoYGdldFZpc2libGVGbGF0Q29sdW1uc2AsKCk9PmUuZ2V0QWxsRmxhdENvbHVtbnMoKSksZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnM9dChgZ2V0VmlzaWJsZUxlYWZDb2x1bW5zYCwoKT0+ZS5nZXRBbGxMZWFmQ29sdW1ucygpKSxlLmdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnM9dChgZ2V0TGVmdFZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0TGVmdExlYWZDb2x1bW5zKCkpLGUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnM9dChgZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnNgLCgpPT5lLmdldFJpZ2h0TGVhZkNvbHVtbnMoKSksZS5nZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnM9dChgZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zYCwoKT0+ZS5nZXRDZW50ZXJMZWFmQ29sdW1ucygpKSxlLnNldENvbHVtblZpc2liaWxpdHk9dD0+ZS5vcHRpb25zLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSh0KSxlLnJlc2V0Q29sdW1uVmlzaWJpbGl0eT10PT57ZS5zZXRDb2x1bW5WaXNpYmlsaXR5KHQ/e306ZS5pbml0aWFsU3RhdGUuY29sdW1uVmlzaWJpbGl0eT8/e30pfSxlLnRvZ2dsZUFsbENvbHVtbnNWaXNpYmxlPXQ9Pnt0Pz89IWUuZ2V0SXNBbGxDb2x1bW5zVmlzaWJsZSgpLGUuc2V0Q29sdW1uVmlzaWJpbGl0eShlLmdldEFsbExlYWZDb2x1bW5zKCkucmVkdWNlKChlLG4pPT4oey4uLmUsW24uaWRdOnR8fCEobi5nZXRDYW5IaWRlIT1udWxsJiZuLmdldENhbkhpZGUoKSl9KSx7fSkpfSxlLmdldElzQWxsQ29sdW1uc1Zpc2libGU9KCk9PiFlLmdldEFsbExlYWZDb2x1bW5zKCkuc29tZShlPT4hKGUuZ2V0SXNWaXNpYmxlIT1udWxsJiZlLmdldElzVmlzaWJsZSgpKSksZS5nZXRJc1NvbWVDb2x1bW5zVmlzaWJsZT0oKT0+ZS5nZXRBbGxMZWFmQ29sdW1ucygpLnNvbWUoZT0+ZS5nZXRJc1Zpc2libGU9PW51bGw/dm9pZCAwOmUuZ2V0SXNWaXNpYmxlKCkpLGUuZ2V0VG9nZ2xlQWxsQ29sdW1uc1Zpc2liaWxpdHlIYW5kbGVyPSgpPT50PT57ZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZSh0LnRhcmdldD8uY2hlY2tlZCl9fX07ZnVuY3Rpb24gclMoZSx0KXtyZXR1cm4gdD90PT09YGNlbnRlcmA/ZS5nZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnMoKTp0PT09YGxlZnRgP2UuZ2V0TGVmdFZpc2libGVMZWFmQ29sdW1ucygpOmUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMoKTplLmdldFZpc2libGVMZWFmQ29sdW1ucygpfXZhciBpUz17Y3JlYXRlVGFibGU6ZT0+e2UuX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsKGUsYF9fZ2xvYmFsX19gKSxlLmdldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbD0oKT0+ZS5vcHRpb25zLm1hbnVhbEZpbHRlcmluZ3x8IWUuX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbD9lLmdldFByZUZpbHRlcmVkUm93TW9kZWwoKTplLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWwoKSxlLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzPWUub3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzJiZlLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyhlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzPSgpPT5lLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzP2UuX2dldEdsb2JhbEZhY2V0ZWRVbmlxdWVWYWx1ZXMoKTpuZXcgTWFwLGUuX2dldEdsb2JhbEZhY2V0ZWRNaW5NYXhWYWx1ZXM9ZS5vcHRpb25zLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXMmJmUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzKGUsYF9fZ2xvYmFsX19gKSxlLmdldEdsb2JhbEZhY2V0ZWRNaW5NYXhWYWx1ZXM9KCk9PntpZihlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzKXJldHVybiBlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzKCl9fX0sYVM9e2dldEluaXRpYWxTdGF0ZTplPT4oe2dsb2JhbEZpbHRlcjp2b2lkIDAsLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25HbG9iYWxGaWx0ZXJDaGFuZ2U6dngoYGdsb2JhbEZpbHRlcmAsZSksZ2xvYmFsRmlsdGVyRm46YGF1dG9gLGdldENvbHVtbkNhbkdsb2JhbEZpbHRlcjp0PT57dmFyIG47bGV0IHI9KG49ZS5nZXRDb3JlUm93TW9kZWwoKS5mbGF0Um93c1swXSk9PW51bGx8fChuPW4uX2dldEFsbENlbGxzQnlDb2x1bW5JZCgpW3QuaWRdKT09bnVsbD92b2lkIDA6bi5nZXRWYWx1ZSgpO3JldHVybiB0eXBlb2Ygcj09YHN0cmluZ2B8fHR5cGVvZiByPT1gbnVtYmVyYH19KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldENhbkdsb2JhbEZpbHRlcj0oKT0+KGUuY29sdW1uRGVmLmVuYWJsZUdsb2JhbEZpbHRlcj8/ITApJiYodC5vcHRpb25zLmVuYWJsZUdsb2JhbEZpbHRlcj8/ITApJiYodC5vcHRpb25zLmVuYWJsZUZpbHRlcnM/PyEwKSYmKCh0Lm9wdGlvbnMuZ2V0Q29sdW1uQ2FuR2xvYmFsRmlsdGVyPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0Q29sdW1uQ2FuR2xvYmFsRmlsdGVyKGUpKT8/ITApJiYhIWUuYWNjZXNzb3JGbn0sY3JlYXRlVGFibGU6ZT0+e2UuZ2V0R2xvYmFsQXV0b0ZpbHRlckZuPSgpPT56eC5pbmNsdWRlc1N0cmluZyxlLmdldEdsb2JhbEZpbHRlckZuPSgpPT57bGV0e2dsb2JhbEZpbHRlckZuOnR9PWUub3B0aW9ucztyZXR1cm4geXgodCk/dDp0PT09YGF1dG9gP2UuZ2V0R2xvYmFsQXV0b0ZpbHRlckZuKCk6ZS5vcHRpb25zLmZpbHRlckZucz8uW3RdPz96eFt0XX0sZS5zZXRHbG9iYWxGaWx0ZXI9dD0+e2Uub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZT09bnVsbHx8ZS5vcHRpb25zLm9uR2xvYmFsRmlsdGVyQ2hhbmdlKHQpfSxlLnJlc2V0R2xvYmFsRmlsdGVyPXQ9PntlLnNldEdsb2JhbEZpbHRlcih0P3ZvaWQgMDplLmluaXRpYWxTdGF0ZS5nbG9iYWxGaWx0ZXIpfX19LG9TPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtleHBhbmRlZDp7fSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkV4cGFuZGVkQ2hhbmdlOnZ4KGBleHBhbmRlZGAsZSkscGFnaW5hdGVFeHBhbmRlZFJvd3M6ITB9KSxjcmVhdGVUYWJsZTplPT57bGV0IHQ9ITEsbj0hMTtlLl9hdXRvUmVzZXRFeHBhbmRlZD0oKT0+e2lmKCF0KXtlLl9xdWV1ZSgoKT0+e3Q9ITB9KTtyZXR1cm59aWYoZS5vcHRpb25zLmF1dG9SZXNldEFsbD8/ZS5vcHRpb25zLmF1dG9SZXNldEV4cGFuZGVkPz8hZS5vcHRpb25zLm1hbnVhbEV4cGFuZGluZyl7aWYobilyZXR1cm47bj0hMCxlLl9xdWV1ZSgoKT0+e2UucmVzZXRFeHBhbmRlZCgpLG49ITF9KX19LGUuc2V0RXhwYW5kZWQ9dD0+ZS5vcHRpb25zLm9uRXhwYW5kZWRDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkV4cGFuZGVkQ2hhbmdlKHQpLGUudG9nZ2xlQWxsUm93c0V4cGFuZGVkPXQ9Pnt0Pz8hZS5nZXRJc0FsbFJvd3NFeHBhbmRlZCgpP2Uuc2V0RXhwYW5kZWQoITApOmUuc2V0RXhwYW5kZWQoe30pfSxlLnJlc2V0RXhwYW5kZWQ9dD0+e2Uuc2V0RXhwYW5kZWQodD97fTplLmluaXRpYWxTdGF0ZT8uZXhwYW5kZWQ/P3t9KX0sZS5nZXRDYW5Tb21lUm93c0V4cGFuZD0oKT0+ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKS5mbGF0Um93cy5zb21lKGU9PmUuZ2V0Q2FuRXhwYW5kKCkpLGUuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkSGFuZGxlcj0oKT0+dD0+e3QucGVyc2lzdD09bnVsbHx8dC5wZXJzaXN0KCksZS50b2dnbGVBbGxSb3dzRXhwYW5kZWQoKX0sZS5nZXRJc1NvbWVSb3dzRXhwYW5kZWQ9KCk9PntsZXQgdD1lLmdldFN0YXRlKCkuZXhwYW5kZWQ7cmV0dXJuIHQ9PT0hMHx8T2JqZWN0LnZhbHVlcyh0KS5zb21lKEJvb2xlYW4pfSxlLmdldElzQWxsUm93c0V4cGFuZGVkPSgpPT57bGV0IHQ9ZS5nZXRTdGF0ZSgpLmV4cGFuZGVkO3JldHVybiB0eXBlb2YgdD09YGJvb2xlYW5gP3Q9PT0hMDohKCFPYmplY3Qua2V5cyh0KS5sZW5ndGh8fGUuZ2V0Um93TW9kZWwoKS5mbGF0Um93cy5zb21lKGU9PiFlLmdldElzRXhwYW5kZWQoKSkpfSxlLmdldEV4cGFuZGVkRGVwdGg9KCk9PntsZXQgdD0wO3JldHVybihlLmdldFN0YXRlKCkuZXhwYW5kZWQ9PT0hMD9PYmplY3Qua2V5cyhlLmdldFJvd01vZGVsKCkucm93c0J5SWQpOk9iamVjdC5rZXlzKGUuZ2V0U3RhdGUoKS5leHBhbmRlZCkpLmZvckVhY2goZT0+e2xldCBuPWUuc3BsaXQoYC5gKTt0PU1hdGgubWF4KHQsbi5sZW5ndGgpfSksdH0sZS5nZXRQcmVFeHBhbmRlZFJvd01vZGVsPSgpPT5lLmdldFNvcnRlZFJvd01vZGVsKCksZS5nZXRFeHBhbmRlZFJvd01vZGVsPSgpPT4oIWUuX2dldEV4cGFuZGVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRFeHBhbmRlZFJvd01vZGVsJiYoZS5fZ2V0RXhwYW5kZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0RXhwYW5kZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbEV4cGFuZGluZ3x8IWUuX2dldEV4cGFuZGVkUm93TW9kZWw/ZS5nZXRQcmVFeHBhbmRlZFJvd01vZGVsKCk6ZS5fZ2V0RXhwYW5kZWRSb3dNb2RlbCgpKX0sY3JlYXRlUm93OihlLHQpPT57ZS50b2dnbGVFeHBhbmRlZD1uPT57dC5zZXRFeHBhbmRlZChyPT57bGV0IGk9cj09PSEwfHwhIShyIT1udWxsJiZyW2UuaWRdKSxhPXt9O2lmKHI9PT0hMD9PYmplY3Qua2V5cyh0LmdldFJvd01vZGVsKCkucm93c0J5SWQpLmZvckVhY2goZT0+e2FbZV09ITB9KTphPXIsbj8/PSFpLCFpJiZuKXJldHVybnsuLi5hLFtlLmlkXTohMH07aWYoaSYmIW4pe2xldHtbZS5pZF06dCwuLi5ufT1hO3JldHVybiBufXJldHVybiByfSl9LGUuZ2V0SXNFeHBhbmRlZD0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5leHBhbmRlZDtyZXR1cm4hISgodC5vcHRpb25zLmdldElzUm93RXhwYW5kZWQ9PW51bGw/dm9pZCAwOnQub3B0aW9ucy5nZXRJc1Jvd0V4cGFuZGVkKGUpKT8/KG49PT0hMHx8bj8uW2UuaWRdKSl9LGUuZ2V0Q2FuRXhwYW5kPSgpPT57dmFyIG47cmV0dXJuKHQub3B0aW9ucy5nZXRSb3dDYW5FeHBhbmQ9PW51bGw/dm9pZCAwOnQub3B0aW9ucy5nZXRSb3dDYW5FeHBhbmQoZSkpPz8oKHQub3B0aW9ucy5lbmFibGVFeHBhbmRpbmc/PyEwKSYmISEoKG49ZS5zdWJSb3dzKSE9bnVsbCYmbi5sZW5ndGgpKX0sZS5nZXRJc0FsbFBhcmVudHNFeHBhbmRlZD0oKT0+e2xldCBuPSEwLHI9ZTtmb3IoO24mJnIucGFyZW50SWQ7KXI9dC5nZXRSb3coci5wYXJlbnRJZCwhMCksbj1yLmdldElzRXhwYW5kZWQoKTtyZXR1cm4gbn0sZS5nZXRUb2dnbGVFeHBhbmRlZEhhbmRsZXI9KCk9PntsZXQgdD1lLmdldENhbkV4cGFuZCgpO3JldHVybigpPT57dCYmZS50b2dnbGVFeHBhbmRlZCgpfX19fSxzUz0wLGNTPTEwLGxTPSgpPT4oe3BhZ2VJbmRleDpzUyxwYWdlU2l6ZTpjU30pLHVTPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHsuLi5lLHBhZ2luYXRpb246ey4uLmxTKCksLi4uZT8ucGFnaW5hdGlvbn19KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uUGFnaW5hdGlvbkNoYW5nZTp2eChgcGFnaW5hdGlvbmAsZSl9KSxjcmVhdGVUYWJsZTplPT57bGV0IHQ9ITEsbj0hMTtlLl9hdXRvUmVzZXRQYWdlSW5kZXg9KCk9PntpZighdCl7ZS5fcXVldWUoKCk9Pnt0PSEwfSk7cmV0dXJufWlmKGUub3B0aW9ucy5hdXRvUmVzZXRBbGw/P2Uub3B0aW9ucy5hdXRvUmVzZXRQYWdlSW5kZXg/PyFlLm9wdGlvbnMubWFudWFsUGFnaW5hdGlvbil7aWYobilyZXR1cm47bj0hMCxlLl9xdWV1ZSgoKT0+e2UucmVzZXRQYWdlSW5kZXgoKSxuPSExfSl9fSxlLnNldFBhZ2luYXRpb249dD0+ZS5vcHRpb25zLm9uUGFnaW5hdGlvbkNoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUGFnaW5hdGlvbkNoYW5nZShlPT5feCh0LGUpKSxlLnJlc2V0UGFnaW5hdGlvbj10PT57ZS5zZXRQYWdpbmF0aW9uKHQ/bFMoKTplLmluaXRpYWxTdGF0ZS5wYWdpbmF0aW9uPz9sUygpKX0sZS5zZXRQYWdlSW5kZXg9dD0+e2Uuc2V0UGFnaW5hdGlvbihuPT57bGV0IHI9X3godCxuLnBhZ2VJbmRleCksaT1lLm9wdGlvbnMucGFnZUNvdW50PT09dm9pZCAwfHxlLm9wdGlvbnMucGFnZUNvdW50PT09LTE/MioqNTMtMTplLm9wdGlvbnMucGFnZUNvdW50LTE7cmV0dXJuIHI9TWF0aC5tYXgoMCxNYXRoLm1pbihyLGkpKSx7Li4ubixwYWdlSW5kZXg6cn19KX0sZS5yZXNldFBhZ2VJbmRleD10PT57dmFyIG47ZS5zZXRQYWdlSW5kZXgodD9zUzooKG49ZS5pbml0aWFsU3RhdGUpPT1udWxsfHwobj1uLnBhZ2luYXRpb24pPT1udWxsP3ZvaWQgMDpuLnBhZ2VJbmRleCk/P3NTKX0sZS5yZXNldFBhZ2VTaXplPXQ9Pnt2YXIgbjtlLnNldFBhZ2VTaXplKHQ/Y1M6KChuPWUuaW5pdGlhbFN0YXRlKT09bnVsbHx8KG49bi5wYWdpbmF0aW9uKT09bnVsbD92b2lkIDA6bi5wYWdlU2l6ZSk/P2NTKX0sZS5zZXRQYWdlU2l6ZT10PT57ZS5zZXRQYWdpbmF0aW9uKGU9PntsZXQgbj1NYXRoLm1heCgxLF94KHQsZS5wYWdlU2l6ZSkpLHI9ZS5wYWdlU2l6ZSplLnBhZ2VJbmRleCxpPU1hdGguZmxvb3Ioci9uKTtyZXR1cm57Li4uZSxwYWdlSW5kZXg6aSxwYWdlU2l6ZTpufX0pfSxlLnNldFBhZ2VDb3VudD10PT5lLnNldFBhZ2luYXRpb24obj0+e2xldCByPV94KHQsZS5vcHRpb25zLnBhZ2VDb3VudD8/LTEpO3JldHVybiB0eXBlb2Ygcj09YG51bWJlcmAmJihyPU1hdGgubWF4KC0xLHIpKSx7Li4ubixwYWdlQ291bnQ6cn19KSxlLmdldFBhZ2VPcHRpb25zPVEoKCk9PltlLmdldFBhZ2VDb3VudCgpXSxlPT57bGV0IHQ9W107cmV0dXJuIGUmJmU+MCYmKHQ9Wy4uLkFycmF5KGUpXS5maWxsKG51bGwpLm1hcCgoZSx0KT0+dCkpLHR9LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0UGFnZU9wdGlvbnNgKSksZS5nZXRDYW5QcmV2aW91c1BhZ2U9KCk9PmUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uLnBhZ2VJbmRleD4wLGUuZ2V0Q2FuTmV4dFBhZ2U9KCk9PntsZXR7cGFnZUluZGV4OnR9PWUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uLG49ZS5nZXRQYWdlQ291bnQoKTtyZXR1cm4gbj09PS0xfHxuIT09MCYmdDxuLTF9LGUucHJldmlvdXNQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlPT5lLTEpLGUubmV4dFBhZ2U9KCk9PmUuc2V0UGFnZUluZGV4KGU9PmUrMSksZS5maXJzdFBhZ2U9KCk9PmUuc2V0UGFnZUluZGV4KDApLGUubGFzdFBhZ2U9KCk9PmUuc2V0UGFnZUluZGV4KGUuZ2V0UGFnZUNvdW50KCktMSksZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWw9KCk9PmUuZ2V0RXhwYW5kZWRSb3dNb2RlbCgpLGUuZ2V0UGFnaW5hdGlvblJvd01vZGVsPSgpPT4oIWUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCYmZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbCYmKGUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbD1lLm9wdGlvbnMuZ2V0UGFnaW5hdGlvblJvd01vZGVsKGUpKSxlLm9wdGlvbnMubWFudWFsUGFnaW5hdGlvbnx8IWUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbD9lLmdldFByZVBhZ2luYXRpb25Sb3dNb2RlbCgpOmUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCgpKSxlLmdldFBhZ2VDb3VudD0oKT0+ZS5vcHRpb25zLnBhZ2VDb3VudD8/TWF0aC5jZWlsKGUuZ2V0Um93Q291bnQoKS9lLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlU2l6ZSksZS5nZXRSb3dDb3VudD0oKT0+ZS5vcHRpb25zLnJvd0NvdW50Pz9lLmdldFByZVBhZ2luYXRpb25Sb3dNb2RlbCgpLnJvd3MubGVuZ3RofX0sZFM9KCk9Pih7dG9wOltdLGJvdHRvbTpbXX0pLGZTPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtyb3dQaW5uaW5nOmRTKCksLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Sb3dQaW5uaW5nQ2hhbmdlOnZ4KGByb3dQaW5uaW5nYCxlKX0pLGNyZWF0ZVJvdzooZSx0KT0+e2UucGluPShuLHIsaSk9PntsZXQgYT1yP2UuZ2V0TGVhZlJvd3MoKS5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSk6W10sbz1pP2UuZ2V0UGFyZW50Um93cygpLm1hcChlPT57bGV0e2lkOnR9PWU7cmV0dXJuIHR9KTpbXSxzPW5ldyBTZXQoWy4uLm8sZS5pZCwuLi5hXSk7dC5zZXRSb3dQaW5uaW5nKGU9Pm49PT1gYm90dG9tYD97dG9wOihlPy50b3A/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLGJvdHRvbTpbLi4uKGU/LmJvdHRvbT8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSksLi4uQXJyYXkuZnJvbShzKV19Om49PT1gdG9wYD97dG9wOlsuLi4oZT8udG9wPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKSwuLi5BcnJheS5mcm9tKHMpXSxib3R0b206KGU/LmJvdHRvbT8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSl9Ont0b3A6KGU/LnRvcD8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSksYm90dG9tOihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpfSl9LGUuZ2V0Q2FuUGluPSgpPT57bGV0e2VuYWJsZVJvd1Bpbm5pbmc6bixlbmFibGVQaW5uaW5nOnJ9PXQub3B0aW9ucztyZXR1cm4gdHlwZW9mIG49PWBmdW5jdGlvbmA/bihlKTpuPz9yPz8hMH0sZS5nZXRJc1Bpbm5lZD0oKT0+e2xldCBuPVtlLmlkXSx7dG9wOnIsYm90dG9tOml9PXQuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLGE9bi5zb21lKGU9PnI/LmluY2x1ZGVzKGUpKSxvPW4uc29tZShlPT5pPy5pbmNsdWRlcyhlKSk7cmV0dXJuIGE/YHRvcGA6bz9gYm90dG9tYDohMX0sZS5nZXRQaW5uZWRJbmRleD0oKT0+e2xldCBuPWUuZ2V0SXNQaW5uZWQoKTtyZXR1cm4gbj8oKG49PT1gdG9wYD90LmdldFRvcFJvd3MoKTp0LmdldEJvdHRvbVJvd3MoKSk/Lm1hcChlPT57bGV0e2lkOnR9PWU7cmV0dXJuIHR9KSk/LmluZGV4T2YoZS5pZCk/Py0xOi0xfX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Um93UGlubmluZz10PT5lLm9wdGlvbnMub25Sb3dQaW5uaW5nQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Sb3dQaW5uaW5nQ2hhbmdlKHQpLGUucmVzZXRSb3dQaW5uaW5nPXQ9PmUuc2V0Um93UGlubmluZyh0P2RTKCk6ZS5pbml0aWFsU3RhdGU/LnJvd1Bpbm5pbmc/P2RTKCkpLGUuZ2V0SXNTb21lUm93c1Bpbm5lZD10PT57bGV0IG49ZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmc7cmV0dXJuIHQ/ISFuW3RdPy5sZW5ndGg6ISEobi50b3A/Lmxlbmd0aHx8bi5ib3R0b20/Lmxlbmd0aCl9LGUuX2dldFBpbm5lZFJvd3M9KHQsbixyKT0+KGUub3B0aW9ucy5rZWVwUGlubmVkUm93cz8/ITA/KG4/P1tdKS5tYXAodD0+e2xldCBuPWUuZ2V0Um93KHQsITApO3JldHVybiBuLmdldElzQWxsUGFyZW50c0V4cGFuZGVkKCk/bjpudWxsfSk6KG4/P1tdKS5tYXAoZT0+dC5maW5kKHQ9PnQuaWQ9PT1lKSkpLmZpbHRlcihCb29sZWFuKS5tYXAoZT0+KHsuLi5lLHBvc2l0aW9uOnJ9KSksZS5nZXRUb3BSb3dzPVEoKCk9PltlLmdldFJvd01vZGVsKCkucm93cyxlLmdldFN0YXRlKCkucm93UGlubmluZy50b3BdLCh0LG4pPT5lLl9nZXRQaW5uZWRSb3dzKHQsbixgdG9wYCksJChlLm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFRvcFJvd3NgKSksZS5nZXRCb3R0b21Sb3dzPVEoKCk9PltlLmdldFJvd01vZGVsKCkucm93cyxlLmdldFN0YXRlKCkucm93UGlubmluZy5ib3R0b21dLCh0LG4pPT5lLl9nZXRQaW5uZWRSb3dzKHQsbixgYm90dG9tYCksJChlLm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldEJvdHRvbVJvd3NgKSksZS5nZXRDZW50ZXJSb3dzPVEoKCk9PltlLmdldFJvd01vZGVsKCkucm93cyxlLmdldFN0YXRlKCkucm93UGlubmluZy50b3AsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcuYm90dG9tXSwoZSx0LG4pPT57bGV0IHI9bmV3IFNldChbLi4udD8/W10sLi4ubj8/W11dKTtyZXR1cm4gZS5maWx0ZXIoZT0+IXIuaGFzKGUuaWQpKX0sJChlLm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldENlbnRlclJvd3NgKSl9fSxwUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7cm93U2VsZWN0aW9uOnt9LC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uUm93U2VsZWN0aW9uQ2hhbmdlOnZ4KGByb3dTZWxlY3Rpb25gLGUpLGVuYWJsZVJvd1NlbGVjdGlvbjohMCxlbmFibGVNdWx0aVJvd1NlbGVjdGlvbjohMCxlbmFibGVTdWJSb3dTZWxlY3Rpb246ITB9KSxjcmVhdGVUYWJsZTplPT57ZS5zZXRSb3dTZWxlY3Rpb249dD0+ZS5vcHRpb25zLm9uUm93U2VsZWN0aW9uQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Sb3dTZWxlY3Rpb25DaGFuZ2UodCksZS5yZXNldFJvd1NlbGVjdGlvbj10PT5lLnNldFJvd1NlbGVjdGlvbih0P3t9OmUuaW5pdGlhbFN0YXRlLnJvd1NlbGVjdGlvbj8/e30pLGUudG9nZ2xlQWxsUm93c1NlbGVjdGVkPXQ9PntlLnNldFJvd1NlbGVjdGlvbihuPT57dD10PT09dm9pZCAwPyFlLmdldElzQWxsUm93c1NlbGVjdGVkKCk6dDtsZXQgcj17Li4ubn0saT1lLmdldFByZUdyb3VwZWRSb3dNb2RlbCgpLmZsYXRSb3dzO3JldHVybiB0P2kuZm9yRWFjaChlPT57ZS5nZXRDYW5TZWxlY3QoKSYmKHJbZS5pZF09ITApfSk6aS5mb3JFYWNoKGU9PntkZWxldGUgcltlLmlkXX0pLHJ9KX0sZS50b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkPXQ9PmUuc2V0Um93U2VsZWN0aW9uKG49PntsZXQgcj10PT09dm9pZCAwPyFlLmdldElzQWxsUGFnZVJvd3NTZWxlY3RlZCgpOnQsaT17Li4ubn07cmV0dXJuIGUuZ2V0Um93TW9kZWwoKS5yb3dzLmZvckVhY2godD0+e21TKGksdC5pZCxyLCEwLGUpfSksaX0pLGUuZ2V0UHJlU2VsZWN0ZWRSb3dNb2RlbD0oKT0+ZS5nZXRDb3JlUm93TW9kZWwoKSxlLmdldFNlbGVjdGVkUm93TW9kZWw9USgoKT0+W2UuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24sZS5nZXRDb3JlUm93TW9kZWwoKV0sKHQsbik9Pk9iamVjdC5rZXlzKHQpLmxlbmd0aD9oUyhlLG4pOntyb3dzOltdLGZsYXRSb3dzOltdLHJvd3NCeUlkOnt9fSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFNlbGVjdGVkUm93TW9kZWxgKSksZS5nZXRGaWx0ZXJlZFNlbGVjdGVkUm93TW9kZWw9USgoKT0+W2UuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24sZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCldLCh0LG4pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg/aFMoZSxuKTp7cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRGaWx0ZXJlZFNlbGVjdGVkUm93TW9kZWxgKSksZS5nZXRHcm91cGVkU2VsZWN0ZWRSb3dNb2RlbD1RKCgpPT5bZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbixlLmdldFNvcnRlZFJvd01vZGVsKCldLCh0LG4pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg/aFMoZSxuKTp7cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRHcm91cGVkU2VsZWN0ZWRSb3dNb2RlbGApKSxlLmdldElzQWxsUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9ZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Mse3Jvd1NlbGVjdGlvbjpufT1lLmdldFN0YXRlKCkscj0hISh0Lmxlbmd0aCYmT2JqZWN0LmtleXMobikubGVuZ3RoKTtyZXR1cm4gciYmdC5zb21lKGU9PmUuZ2V0Q2FuU2VsZWN0KCkmJiFuW2UuaWRdKSYmKHI9ITEpLHJ9LGUuZ2V0SXNBbGxQYWdlUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9ZS5nZXRQYWdpbmF0aW9uUm93TW9kZWwoKS5mbGF0Um93cy5maWx0ZXIoZT0+ZS5nZXRDYW5TZWxlY3QoKSkse3Jvd1NlbGVjdGlvbjpufT1lLmdldFN0YXRlKCkscj0hIXQubGVuZ3RoO3JldHVybiByJiZ0LnNvbWUoZT0+IW5bZS5pZF0pJiYocj0hMSkscn0sZS5nZXRJc1NvbWVSb3dzU2VsZWN0ZWQ9KCk9PntsZXQgdD1PYmplY3Qua2V5cyhlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uPz97fSkubGVuZ3RoO3JldHVybiB0PjAmJnQ8ZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3MubGVuZ3RofSxlLmdldElzU29tZVBhZ2VSb3dzU2VsZWN0ZWQ9KCk9PntsZXQgdD1lLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpLmZsYXRSb3dzO3JldHVybiFlLmdldElzQWxsUGFnZVJvd3NTZWxlY3RlZCgpJiZ0LmZpbHRlcihlPT5lLmdldENhblNlbGVjdCgpKS5zb21lKGU9PmUuZ2V0SXNTZWxlY3RlZCgpfHxlLmdldElzU29tZVNlbGVjdGVkKCkpfSxlLmdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZEhhbmRsZXI9KCk9PnQ9PntlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCh0LnRhcmdldC5jaGVja2VkKX0sZS5nZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkSGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCh0LnRhcmdldC5jaGVja2VkKX19LGNyZWF0ZVJvdzooZSx0KT0+e2UudG9nZ2xlU2VsZWN0ZWQ9KG4scik9PntsZXQgaT1lLmdldElzU2VsZWN0ZWQoKTt0LnNldFJvd1NlbGVjdGlvbihhPT57aWYobj1uPT09dm9pZCAwPyFpOm4sZS5nZXRDYW5TZWxlY3QoKSYmaT09PW4pcmV0dXJuIGE7bGV0IG89ey4uLmF9O3JldHVybiBtUyhvLGUuaWQsbixyPy5zZWxlY3RDaGlsZHJlbj8/ITAsdCksb30pfSxlLmdldElzU2VsZWN0ZWQ9KCk9PntsZXR7cm93U2VsZWN0aW9uOm59PXQuZ2V0U3RhdGUoKTtyZXR1cm4gZ1MoZSxuKX0sZS5nZXRJc1NvbWVTZWxlY3RlZD0oKT0+e2xldHtyb3dTZWxlY3Rpb246bn09dC5nZXRTdGF0ZSgpO3JldHVybiBfUyhlLG4pPT09YHNvbWVgfSxlLmdldElzQWxsU3ViUm93c1NlbGVjdGVkPSgpPT57bGV0e3Jvd1NlbGVjdGlvbjpufT10LmdldFN0YXRlKCk7cmV0dXJuIF9TKGUsbik9PT1gYWxsYH0sZS5nZXRDYW5TZWxlY3Q9KCk9PnR5cGVvZiB0Lm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uPT1gZnVuY3Rpb25gP3Qub3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24oZSk6dC5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbj8/ITAsZS5nZXRDYW5TZWxlY3RTdWJSb3dzPSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbj09YGZ1bmN0aW9uYD90Lm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uKGUpOnQub3B0aW9ucy5lbmFibGVTdWJSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0Q2FuTXVsdGlTZWxlY3Q9KCk9PnR5cGVvZiB0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb249PWBmdW5jdGlvbmA/dC5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uKGUpOnQub3B0aW9ucy5lbmFibGVNdWx0aVJvd1NlbGVjdGlvbj8/ITAsZS5nZXRUb2dnbGVTZWxlY3RlZEhhbmRsZXI9KCk9PntsZXQgdD1lLmdldENhblNlbGVjdCgpO3JldHVybiBuPT57dCYmZS50b2dnbGVTZWxlY3RlZChuLnRhcmdldD8uY2hlY2tlZCl9fX19LG1TPShlLHQsbixyLGkpPT57dmFyIGE7bGV0IG89aS5nZXRSb3codCwhMCk7bj8oby5nZXRDYW5NdWx0aVNlbGVjdCgpfHxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHQ9PmRlbGV0ZSBlW3RdKSxvLmdldENhblNlbGVjdCgpJiYoZVt0XT0hMCkpOmRlbGV0ZSBlW3RdLHImJihhPW8uc3ViUm93cykhPW51bGwmJmEubGVuZ3RoJiZvLmdldENhblNlbGVjdFN1YlJvd3MoKSYmby5zdWJSb3dzLmZvckVhY2godD0+bVMoZSx0LmlkLG4scixpKSl9O2Z1bmN0aW9uIGhTKGUsdCl7bGV0IG49ZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbixyPVtdLGk9e30sYT1mdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcChlPT57dmFyIHQ7bGV0IG89Z1MoZSxuKTtpZihvJiYoci5wdXNoKGUpLGlbZS5pZF09ZSksKHQ9ZS5zdWJSb3dzKSE9bnVsbCYmdC5sZW5ndGgmJihlPXsuLi5lLHN1YlJvd3M6YShlLnN1YlJvd3MpfSksbylyZXR1cm4gZX0pLmZpbHRlcihCb29sZWFuKX07cmV0dXJue3Jvd3M6YSh0LnJvd3MpLGZsYXRSb3dzOnIscm93c0J5SWQ6aX19ZnVuY3Rpb24gZ1MoZSx0KXtyZXR1cm4gdFtlLmlkXT8/ITF9ZnVuY3Rpb24gX1MoZSx0LG4pe3ZhciByO2lmKCEoKHI9ZS5zdWJSb3dzKSE9bnVsbCYmci5sZW5ndGgpKXJldHVybiExO2xldCBpPSEwLGE9ITE7cmV0dXJuIGUuc3ViUm93cy5mb3JFYWNoKGU9PntpZighKGEmJiFpKSYmKGUuZ2V0Q2FuU2VsZWN0KCkmJihnUyhlLHQpP2E9ITA6aT0hMSksZS5zdWJSb3dzJiZlLnN1YlJvd3MubGVuZ3RoKSl7bGV0IG49X1MoZSx0KTtuPT09YGFsbGA/YT0hMDoobj09PWBzb21lYCYmKGE9ITApLGk9ITEpfX0pLGk/YGFsbGA6YT9gc29tZWA6ITF9dmFyIHZTPS8oWzAtOV0rKS9nbSx5Uz0oZSx0LG4pPT5EUyhFUyhlLmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpLEVTKHQuZ2V0VmFsdWUobikpLnRvTG93ZXJDYXNlKCkpLGJTPShlLHQsbik9PkRTKEVTKGUuZ2V0VmFsdWUobikpLEVTKHQuZ2V0VmFsdWUobikpKSx4Uz0oZSx0LG4pPT5UUyhFUyhlLmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpLEVTKHQuZ2V0VmFsdWUobikpLnRvTG93ZXJDYXNlKCkpLFNTPShlLHQsbik9PlRTKEVTKGUuZ2V0VmFsdWUobikpLEVTKHQuZ2V0VmFsdWUobikpKSxDUz0oZSx0LG4pPT57bGV0IHI9ZS5nZXRWYWx1ZShuKSxpPXQuZ2V0VmFsdWUobik7cmV0dXJuIHI+aT8xOnI8aT8tMTowfSx3Uz0oZSx0LG4pPT5UUyhlLmdldFZhbHVlKG4pLHQuZ2V0VmFsdWUobikpO2Z1bmN0aW9uIFRTKGUsdCl7cmV0dXJuIGU9PT10PzA6ZT50PzE6LTF9ZnVuY3Rpb24gRVMoZSl7cmV0dXJuIHR5cGVvZiBlPT1gbnVtYmVyYD9pc05hTihlKXx8ZT09PTEvMHx8ZT09PS0xLzA/YGA6U3RyaW5nKGUpOnR5cGVvZiBlPT1gc3RyaW5nYD9lOmBgfWZ1bmN0aW9uIERTKGUsdCl7bGV0IG49ZS5zcGxpdCh2UykuZmlsdGVyKEJvb2xlYW4pLHI9dC5zcGxpdCh2UykuZmlsdGVyKEJvb2xlYW4pO2Zvcig7bi5sZW5ndGgmJnIubGVuZ3RoOyl7bGV0IGU9bi5zaGlmdCgpLHQ9ci5zaGlmdCgpLGk9cGFyc2VJbnQoZSwxMCksYT1wYXJzZUludCh0LDEwKSxvPVtpLGFdLnNvcnQoKTtpZihpc05hTihvWzBdKSl7aWYoZT50KXJldHVybiAxO2lmKHQ+ZSlyZXR1cm4tMTtjb250aW51ZX1pZihpc05hTihvWzFdKSlyZXR1cm4gaXNOYU4oaSk/LTE6MTtpZihpPmEpcmV0dXJuIDE7aWYoYT5pKXJldHVybi0xfXJldHVybiBuLmxlbmd0aC1yLmxlbmd0aH12YXIgT1M9e2FscGhhbnVtZXJpYzp5UyxhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlOmJTLHRleHQ6eFMsdGV4dENhc2VTZW5zaXRpdmU6U1MsZGF0ZXRpbWU6Q1MsYmFzaWM6d1N9LGtTPVtFeCxuUyxLeCxKeCxreCxWeCxpUyxhUyx7Z2V0SW5pdGlhbFN0YXRlOmU9Pih7c29ydGluZzpbXSwuLi5lfSksZ2V0RGVmYXVsdENvbHVtbkRlZjooKT0+KHtzb3J0aW5nRm46YGF1dG9gLHNvcnRVbmRlZmluZWQ6MX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Tb3J0aW5nQ2hhbmdlOnZ4KGBzb3J0aW5nYCxlKSxpc011bHRpU29ydEV2ZW50OmU9PmUuc2hpZnRLZXl9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldEF1dG9Tb3J0aW5nRm49KCk9PntsZXQgbj10LmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93cy5zbGljZSgxMCkscj0hMTtmb3IobGV0IHQgb2Ygbil7bGV0IG49dD8uZ2V0VmFsdWUoZS5pZCk7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pPT09YFtvYmplY3QgRGF0ZV1gKXJldHVybiBPUy5kYXRldGltZTtpZih0eXBlb2Ygbj09YHN0cmluZ2AmJihyPSEwLG4uc3BsaXQodlMpLmxlbmd0aD4xKSlyZXR1cm4gT1MuYWxwaGFudW1lcmljfXJldHVybiByP09TLnRleHQ6T1MuYmFzaWN9LGUuZ2V0QXV0b1NvcnREaXI9KCk9PnR5cGVvZiB0LmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93c1swXT8uZ2V0VmFsdWUoZS5pZCk9PWBzdHJpbmdgP2Bhc2NgOmBkZXNjYCxlLmdldFNvcnRpbmdGbj0oKT0+e2lmKCFlKXRocm93IEVycm9yKCk7cmV0dXJuIHl4KGUuY29sdW1uRGVmLnNvcnRpbmdGbik/ZS5jb2x1bW5EZWYuc29ydGluZ0ZuOmUuY29sdW1uRGVmLnNvcnRpbmdGbj09PWBhdXRvYD9lLmdldEF1dG9Tb3J0aW5nRm4oKTp0Lm9wdGlvbnMuc29ydGluZ0Zucz8uW2UuY29sdW1uRGVmLnNvcnRpbmdGbl0/P09TW2UuY29sdW1uRGVmLnNvcnRpbmdGbl19LGUudG9nZ2xlU29ydGluZz0obixyKT0+e2xldCBpPWUuZ2V0TmV4dFNvcnRpbmdPcmRlcigpLGE9biE9bnVsbDt0LnNldFNvcnRpbmcobz0+e2xldCBzPW8/LmZpbmQodD0+dC5pZD09PWUuaWQpLGM9bz8uZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKSxsPVtdLHUsZD1hP246aT09PWBkZXNjYDtyZXR1cm4gdT1vIT1udWxsJiZvLmxlbmd0aCYmZS5nZXRDYW5NdWx0aVNvcnQoKSYmcj9zP2B0b2dnbGVgOmBhZGRgOm8hPW51bGwmJm8ubGVuZ3RoJiZjIT09by5sZW5ndGgtMT9gcmVwbGFjZWA6cz9gdG9nZ2xlYDpgcmVwbGFjZWAsdT09PWB0b2dnbGVgJiYoYXx8aXx8KHU9YHJlbW92ZWApKSx1PT09YGFkZGA/KGw9Wy4uLm8se2lkOmUuaWQsZGVzYzpkfV0sbC5zcGxpY2UoMCxsLmxlbmd0aC0odC5vcHRpb25zLm1heE11bHRpU29ydENvbENvdW50Pz8yKio1My0xKSkpOmw9dT09PWB0b2dnbGVgP28ubWFwKHQ9PnQuaWQ9PT1lLmlkP3suLi50LGRlc2M6ZH06dCk6dT09PWByZW1vdmVgP28uZmlsdGVyKHQ9PnQuaWQhPT1lLmlkKTpbe2lkOmUuaWQsZGVzYzpkfV0sbH0pfSxlLmdldEZpcnN0U29ydERpcj0oKT0+ZS5jb2x1bW5EZWYuc29ydERlc2NGaXJzdD8/dC5vcHRpb25zLnNvcnREZXNjRmlyc3Q/P2UuZ2V0QXV0b1NvcnREaXIoKT09PWBkZXNjYD9gZGVzY2A6YGFzY2AsZS5nZXROZXh0U29ydGluZ09yZGVyPW49PntsZXQgcj1lLmdldEZpcnN0U29ydERpcigpLGk9ZS5nZXRJc1NvcnRlZCgpO3JldHVybiBpP2khPT1yJiYodC5vcHRpb25zLmVuYWJsZVNvcnRpbmdSZW1vdmFsPz8hMCkmJighbnx8KHQub3B0aW9ucy5lbmFibGVNdWx0aVJlbW92ZT8/ITApKT8hMTppPT09YGRlc2NgP2Bhc2NgOmBkZXNjYDpyfSxlLmdldENhblNvcnQ9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVTb3J0aW5nPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlU29ydGluZz8/ITApJiYhIWUuYWNjZXNzb3JGbixlLmdldENhbk11bHRpU29ydD0oKT0+ZS5jb2x1bW5EZWYuZW5hYmxlTXVsdGlTb3J0Pz90Lm9wdGlvbnMuZW5hYmxlTXVsdGlTb3J0Pz8hIWUuYWNjZXNzb3JGbixlLmdldElzU29ydGVkPSgpPT57bGV0IG49dC5nZXRTdGF0ZSgpLnNvcnRpbmc/LmZpbmQodD0+dC5pZD09PWUuaWQpO3JldHVybiBuP24uZGVzYz9gZGVzY2A6YGFzY2A6ITF9LGUuZ2V0U29ydEluZGV4PSgpPT50LmdldFN0YXRlKCkuc29ydGluZz8uZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKT8/LTEsZS5jbGVhclNvcnRpbmc9KCk9Pnt0LnNldFNvcnRpbmcodD0+dCE9bnVsbCYmdC5sZW5ndGg/dC5maWx0ZXIodD0+dC5pZCE9PWUuaWQpOltdKX0sZS5nZXRUb2dnbGVTb3J0aW5nSGFuZGxlcj0oKT0+e2xldCBuPWUuZ2V0Q2FuU29ydCgpO3JldHVybiByPT57biYmKHIucGVyc2lzdD09bnVsbHx8ci5wZXJzaXN0KCksZS50b2dnbGVTb3J0aW5nPT1udWxsfHxlLnRvZ2dsZVNvcnRpbmcodm9pZCAwLGUuZ2V0Q2FuTXVsdGlTb3J0KCk/dC5vcHRpb25zLmlzTXVsdGlTb3J0RXZlbnQ9PW51bGw/dm9pZCAwOnQub3B0aW9ucy5pc011bHRpU29ydEV2ZW50KHIpOiExKSl9fX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0U29ydGluZz10PT5lLm9wdGlvbnMub25Tb3J0aW5nQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Tb3J0aW5nQ2hhbmdlKHQpLGUucmVzZXRTb3J0aW5nPXQ9PntlLnNldFNvcnRpbmcodD9bXTplLmluaXRpYWxTdGF0ZT8uc29ydGluZz8/W10pfSxlLmdldFByZVNvcnRlZFJvd01vZGVsPSgpPT5lLmdldEdyb3VwZWRSb3dNb2RlbCgpLGUuZ2V0U29ydGVkUm93TW9kZWw9KCk9PighZS5fZ2V0U29ydGVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRTb3J0ZWRSb3dNb2RlbCYmKGUuX2dldFNvcnRlZFJvd01vZGVsPWUub3B0aW9ucy5nZXRTb3J0ZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbFNvcnRpbmd8fCFlLl9nZXRTb3J0ZWRSb3dNb2RlbD9lLmdldFByZVNvcnRlZFJvd01vZGVsKCk6ZS5fZ2V0U29ydGVkUm93TW9kZWwoKSl9fSxXeCxvUyx1UyxmUyxwUyxReF07ZnVuY3Rpb24gQVMoZSl7bGV0IHQ9Wy4uLmtTLC4uLmUuX2ZlYXR1cmVzPz9bXV0sbj17X2ZlYXR1cmVzOnR9LHI9bi5fZmVhdHVyZXMucmVkdWNlKChlLHQpPT5PYmplY3QuYXNzaWduKGUsdC5nZXREZWZhdWx0T3B0aW9ucz09bnVsbD92b2lkIDA6dC5nZXREZWZhdWx0T3B0aW9ucyhuKSkse30pLGk9ZT0+bi5vcHRpb25zLm1lcmdlT3B0aW9ucz9uLm9wdGlvbnMubWVyZ2VPcHRpb25zKHIsZSk6ey4uLnIsLi4uZX0sYT17Li4uZS5pbml0aWFsU3RhdGU/P3t9fTtuLl9mZWF0dXJlcy5mb3JFYWNoKGU9PnthPShlLmdldEluaXRpYWxTdGF0ZT09bnVsbD92b2lkIDA6ZS5nZXRJbml0aWFsU3RhdGUoYSkpPz9hfSk7bGV0IG89W10scz0hMSxjPXtfZmVhdHVyZXM6dCxvcHRpb25zOnsuLi5yLC4uLmV9LGluaXRpYWxTdGF0ZTphLF9xdWV1ZTplPT57by5wdXNoKGUpLHN8fChzPSEwLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pntmb3IoO28ubGVuZ3RoOylvLnNoaWZ0KCkoKTtzPSExfSkuY2F0Y2goZT0+c2V0VGltZW91dCgoKT0+e3Rocm93IGV9KSkpfSxyZXNldDooKT0+e24uc2V0U3RhdGUobi5pbml0aWFsU3RhdGUpfSxzZXRPcHRpb25zOmU9PntsZXQgdD1feChlLG4ub3B0aW9ucyk7bi5vcHRpb25zPWkodCl9LGdldFN0YXRlOigpPT5uLm9wdGlvbnMuc3RhdGUsc2V0U3RhdGU6ZT0+e24ub3B0aW9ucy5vblN0YXRlQ2hhbmdlPT1udWxsfHxuLm9wdGlvbnMub25TdGF0ZUNoYW5nZShlKX0sX2dldFJvd0lkOihlLHQscik9PihuLm9wdGlvbnMuZ2V0Um93SWQ9PW51bGw/dm9pZCAwOm4ub3B0aW9ucy5nZXRSb3dJZChlLHQscikpPz9gJHtyP1tyLmlkLHRdLmpvaW4oYC5gKTp0fWAsZ2V0Q29yZVJvd01vZGVsOigpPT4obi5fZ2V0Q29yZVJvd01vZGVsfHw9bi5vcHRpb25zLmdldENvcmVSb3dNb2RlbChuKSxuLl9nZXRDb3JlUm93TW9kZWwoKSksZ2V0Um93TW9kZWw6KCk9Pm4uZ2V0UGFnaW5hdGlvblJvd01vZGVsKCksZ2V0Um93OihlLHQpPT57bGV0IHI9KHQ/bi5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKTpuLmdldFJvd01vZGVsKCkpLnJvd3NCeUlkW2VdO2lmKCFyJiYocj1uLmdldENvcmVSb3dNb2RlbCgpLnJvd3NCeUlkW2VdLCFyKSl0aHJvdyBFcnJvcigpO3JldHVybiByfSxfZ2V0RGVmYXVsdENvbHVtbkRlZjpRKCgpPT5bbi5vcHRpb25zLmRlZmF1bHRDb2x1bW5dLGU9PihlPz89e30se2hlYWRlcjplPT57bGV0IHQ9ZS5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZjtyZXR1cm4gdC5hY2Nlc3NvcktleT90LmFjY2Vzc29yS2V5OnQuYWNjZXNzb3JGbj90LmlkOm51bGx9LGNlbGw6ZT0+e3ZhciB0O3JldHVybigodD1lLnJlbmRlclZhbHVlKCkpPT1udWxsfHx0LnRvU3RyaW5nPT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCkpPz9udWxsfSwuLi5uLl9mZWF0dXJlcy5yZWR1Y2UoKGUsdCk9Pk9iamVjdC5hc3NpZ24oZSx0LmdldERlZmF1bHRDb2x1bW5EZWY9PW51bGw/dm9pZCAwOnQuZ2V0RGVmYXVsdENvbHVtbkRlZigpKSx7fSksLi4uZX0pLCQoZSxgZGVidWdDb2x1bW5zYCxgX2dldERlZmF1bHRDb2x1bW5EZWZgKSksX2dldENvbHVtbkRlZnM6KCk9Pm4ub3B0aW9ucy5jb2x1bW5zLGdldEFsbENvbHVtbnM6USgoKT0+W24uX2dldENvbHVtbkRlZnMoKV0sZT0+e2xldCB0PWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gaT09PXZvaWQgMCYmKGk9MCksZS5tYXAoZT0+e2xldCBhPUN4KG4sZSxpLHIpLG89ZTtyZXR1cm4gYS5jb2x1bW5zPW8uY29sdW1ucz90KG8uY29sdW1ucyxhLGkrMSk6W10sYX0pfTtyZXR1cm4gdChlKX0sJChlLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBbGxDb2x1bW5zYCkpLGdldEFsbEZsYXRDb2x1bW5zOlEoKCk9PltuLmdldEFsbENvbHVtbnMoKV0sZT0+ZS5mbGF0TWFwKGU9PmUuZ2V0RmxhdENvbHVtbnMoKSksJChlLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBbGxGbGF0Q29sdW1uc2ApKSxfZ2V0QWxsRmxhdENvbHVtbnNCeUlkOlEoKCk9PltuLmdldEFsbEZsYXRDb2x1bW5zKCldLGU9PmUucmVkdWNlKChlLHQpPT4oZVt0LmlkXT10LGUpLHt9KSwkKGUsYGRlYnVnQ29sdW1uc2AsYGdldEFsbEZsYXRDb2x1bW5zQnlJZGApKSxnZXRBbGxMZWFmQ29sdW1uczpRKCgpPT5bbi5nZXRBbGxDb2x1bW5zKCksbi5fZ2V0T3JkZXJDb2x1bW5zRm4oKV0sKGUsdCk9PnQoZS5mbGF0TWFwKGU9PmUuZ2V0TGVhZkNvbHVtbnMoKSkpLCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsTGVhZkNvbHVtbnNgKSksZ2V0Q29sdW1uOmU9Pm4uX2dldEFsbEZsYXRDb2x1bW5zQnlJZCgpW2VdfTtPYmplY3QuYXNzaWduKG4sYyk7Zm9yKGxldCBlPTA7ZTxuLl9mZWF0dXJlcy5sZW5ndGg7ZSsrKXtsZXQgdD1uLl9mZWF0dXJlc1tlXTt0PT1udWxsfHx0LmNyZWF0ZVRhYmxlPT1udWxsfHx0LmNyZWF0ZVRhYmxlKG4pfXJldHVybiBufWZ1bmN0aW9uIGpTKCl7cmV0dXJuIGU9PlEoKCk9PltlLm9wdGlvbnMuZGF0YV0sdD0+e2xldCBuPXtyb3dzOltdLGZsYXRSb3dzOltdLHJvd3NCeUlkOnt9fSxyPWZ1bmN0aW9uKHQsaSxhKXtpPT09dm9pZCAwJiYoaT0wKTtsZXQgbz1bXTtmb3IobGV0IGM9MDtjPHQubGVuZ3RoO2MrKyl7bGV0IGw9T3goZSxlLl9nZXRSb3dJZCh0W2NdLGMsYSksdFtjXSxjLGksdm9pZCAwLGE/LmlkKTtpZihuLmZsYXRSb3dzLnB1c2gobCksbi5yb3dzQnlJZFtsLmlkXT1sLG8ucHVzaChsKSxlLm9wdGlvbnMuZ2V0U3ViUm93cyl7dmFyIHM7bC5vcmlnaW5hbFN1YlJvd3M9ZS5vcHRpb25zLmdldFN1YlJvd3ModFtjXSxjKSwocz1sLm9yaWdpbmFsU3ViUm93cykhPW51bGwmJnMubGVuZ3RoJiYobC5zdWJSb3dzPXIobC5vcmlnaW5hbFN1YlJvd3MsaSsxLGwpKX19cmV0dXJuIG99O3JldHVybiBuLnJvd3M9cih0KSxufSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFJvd01vZGVsYCwoKT0+ZS5fYXV0b1Jlc2V0UGFnZUluZGV4KCkpKX1mdW5jdGlvbiBNUygpe3JldHVybiBlPT5RKCgpPT5bZS5nZXRTdGF0ZSgpLnNvcnRpbmcsZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCgpXSwodCxuKT0+e2lmKCFuLnJvd3MubGVuZ3RofHwhKHQhPW51bGwmJnQubGVuZ3RoKSlyZXR1cm4gbjtsZXQgcj1lLmdldFN0YXRlKCkuc29ydGluZyxpPVtdLGE9ci5maWx0ZXIodD0+ZS5nZXRDb2x1bW4odC5pZCk/LmdldENhblNvcnQoKSksbz17fTthLmZvckVhY2godD0+e2xldCBuPWUuZ2V0Q29sdW1uKHQuaWQpO24mJihvW3QuaWRdPXtzb3J0VW5kZWZpbmVkOm4uY29sdW1uRGVmLnNvcnRVbmRlZmluZWQsaW52ZXJ0U29ydGluZzpuLmNvbHVtbkRlZi5pbnZlcnRTb3J0aW5nLHNvcnRpbmdGbjpuLmdldFNvcnRpbmdGbigpfSl9KTtsZXQgcz1lPT57bGV0IHQ9ZS5tYXAoZT0+KHsuLi5lfSkpO3JldHVybiB0LnNvcnQoKGUsdCk9Pntmb3IobGV0IG49MDtuPGEubGVuZ3RoO24rPTEpe2xldCByPWFbbl0saT1vW3IuaWRdLHM9aS5zb3J0VW5kZWZpbmVkLGM9cj8uZGVzYz8/ITEsbD0wO2lmKHMpe2xldCBuPWUuZ2V0VmFsdWUoci5pZCksaT10LmdldFZhbHVlKHIuaWQpLGE9bj09PXZvaWQgMCxvPWk9PT12b2lkIDA7aWYoYXx8byl7aWYocz09PWBmaXJzdGApcmV0dXJuIGE/LTE6MTtpZihzPT09YGxhc3RgKXJldHVybiBhPzE6LTE7bD1hJiZvPzA6YT9zOi1zfX1pZihsPT09MCYmKGw9aS5zb3J0aW5nRm4oZSx0LHIuaWQpKSxsIT09MClyZXR1cm4gYyYmKGwqPS0xKSxpLmludmVydFNvcnRpbmcmJihsKj0tMSksbH1yZXR1cm4gZS5pbmRleC10LmluZGV4fSksdC5mb3JFYWNoKGU9Pnt2YXIgdDtpLnB1c2goZSksKHQ9ZS5zdWJSb3dzKSE9bnVsbCYmdC5sZW5ndGgmJihlLnN1YlJvd3M9cyhlLnN1YlJvd3MpKX0pLHR9O3JldHVybntyb3dzOnMobi5yb3dzKSxmbGF0Um93czppLHJvd3NCeUlkOm4ucm93c0J5SWR9fSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFNvcnRlZFJvd01vZGVsYCwoKT0+ZS5fYXV0b1Jlc2V0UGFnZUluZGV4KCkpKX1mdW5jdGlvbiBOUygpe3JldHVybiEwfXZhciBQUz1TeW1ib2woYG1lcmdlLXByb3h5YCksRlM9e2dldChlLHQsbil7cmV0dXJuIHQ9PT1QUz9uOmUuZ2V0KHQpfSxoYXMoZSx0KXtyZXR1cm4gZS5oYXModCl9LHNldDpOUyxkZWxldGVQcm9wZXJ0eTpOUyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KXtyZXR1cm57Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGUuZ2V0KHQpfSxzZXQ6TlMsZGVsZXRlUHJvcGVydHk6TlN9fSxvd25LZXlzKGUpe3JldHVybiBlLmtleXMoKX19O2Z1bmN0aW9uIElTKGUpe3JldHVybmB2YWx1ZWBpbiBlP2UudmFsdWU6ZX1mdW5jdGlvbiBMUygpe3ZhciBlPVsuLi5hcmd1bWVudHNdO3JldHVybiBuZXcgUHJveHkoe2dldCh0KXtmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7bGV0IHI9SVMoZVtuXSlbdF07aWYociE9PXZvaWQgMClyZXR1cm4gcn19LGhhcyh0KXtmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSlpZih0IGluIElTKGVbbl0pKXJldHVybiEwO3JldHVybiExfSxrZXlzKCl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKC4uLk9iamVjdC5rZXlzKElTKGVbbl0pKSk7cmV0dXJuWy4uLkFycmF5LmZyb20obmV3IFNldCh0KSldfX0sRlMpfXZhciBSUz1GKHtwcm9wczpbYHJlbmRlcmAsYHByb3BzYF0sc2V0dXA6ZT0+KCk9PnR5cGVvZiBlLnJlbmRlcj09YGZ1bmN0aW9uYHx8dHlwZW9mIGUucmVuZGVyPT1gb2JqZWN0YD90YyhlLnJlbmRlcixlLnByb3BzKTplLnJlbmRlcn0pO2Z1bmN0aW9uIHpTKGUpe3JldHVybiBMUyhlLHtkYXRhOk4oZS5kYXRhKX0pfWZ1bmN0aW9uIEJTKGUpe2xldCB0PWooZS5kYXRhKSxuPUFTKExTKHtzdGF0ZTp7fSxvblN0YXRlQ2hhbmdlOigpPT57fSxyZW5kZXJGYWxsYmFja1ZhbHVlOm51bGwsbWVyZ2VPcHRpb25zKGUsbil7cmV0dXJuIHQ/ey4uLmUsLi4ubn06TFMoZSxuKX19LHQ/elMoZSk6ZSkpO2lmKHQpe2xldCB0PXVuKGUuZGF0YSk7RXIodCwoKT0+e24uc2V0U3RhdGUoZT0+KHsuLi5lLGRhdGE6dC52YWx1ZX0pKX0se2ltbWVkaWF0ZTohMH0pfWxldCByPU0obi5pbml0aWFsU3RhdGUpO3JldHVybiBDcigoKT0+e24uc2V0T3B0aW9ucyhuPT57bGV0IGk9bmV3IFByb3h5KHt9LHtnZXQ6KGUsdCk9PnIudmFsdWVbdF19KTtyZXR1cm4gTFMobix0P3pTKGUpOmUse3N0YXRlOkxTKGksZS5zdGF0ZT8/e30pLG9uU3RhdGVDaGFuZ2U6dD0+e3QgaW5zdGFuY2VvZiBGdW5jdGlvbj9yLnZhbHVlPXQoci52YWx1ZSk6ci52YWx1ZT10LGUub25TdGF0ZUNoYW5nZT09bnVsbHx8ZS5vblN0YXRlQ2hhbmdlKHQpfX0pfSl9KSxufXZhciBWUz1bYGFyaWEtbGFiZWxgXSxIUz1GKHtfX25hbWU6YFNvcnRIZWFkZXJCdXR0b25gLHByb3BzOntoZWFkZXI6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT50LmhlYWRlci5jb2x1bW4uZ2V0SXNTb3J0ZWQoKSkscj1XKCgpPT5uLnZhbHVlPT09YGFzY2A/b186bi52YWx1ZT09PWBkZXNjYD95XzpmXyksaT1XKCgpPT57bGV0IGU9dC5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXI7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9lOnQuaGVhZGVyLmNvbHVtbi5pZH0pLGE9VygoKT0+e2xldCBlPW4udmFsdWU9PT1gYXNjYD9gYXNjZW5kaW5nYDpuLnZhbHVlPT09YGRlc2NgP2BkZXNjZW5kaW5nYDpgbm9uZWA7cmV0dXJuYFNvcnQgYnkgJHtpLnZhbHVlfSwgY3VycmVudGx5ICR7ZX1gfSk7ZnVuY3Rpb24gbygpe3QuaGVhZGVyLmNvbHVtbi50b2dnbGVTb3J0aW5nKG4udmFsdWU9PT1gYXNjYCl9cmV0dXJuKHQsaSk9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBidXR0b25gLHt0eXBlOmBidXR0b25gLCJhcmlhLWxhYmVsIjphLnZhbHVlLGNsYXNzOmBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBweC0xLjUgcHktMC41IGhvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZ2Asb25DbGljazpvfSxbZS5oZWFkZXIuaXNQbGFjZWhvbGRlcj9UcyhgYCwhMCk6KFIoKSxCKE4oUlMpLHtrZXk6MCxyZW5kZXI6ZS5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5oZWFkZXIuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKSksSChzLHtpY29uOnIudmFsdWUsY2xhc3M6TyhbYHNpemUtMyBzaHJpbmstMGAsbi52YWx1ZT9gdGV4dC1mb3JlZ3JvdW5kYDpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzYwYF0pLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSldLDgsVlMpfX19KSxVUz17ImRhdGEtc2xvdCI6YHRhYmxlLWNvbnRhaW5lcmAsY2xhc3M6YHJlbGF0aXZlIHctZnVsbCBvdmVyZmxvdy14LWF1dG9gfSxXUz1GKHtfX25hbWU6YFRhYmxlYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCxVUyxbVihgdGFibGVgLHsiZGF0YS1zbG90IjpgdGFibGVgLGNsYXNzOk8oTihaKShgdy1mdWxsIGNhcHRpb24tYm90dG9tIHRleHQtc21gLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMildKSl9fSksR1M9Rih7X19uYW1lOmBUYWJsZUJvZHlgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGB0Ym9keWAseyJkYXRhLXNsb3QiOmB0YWJsZS1ib2R5YCxjbGFzczpPKE4oWikoYFsmX3RyOmxhc3QtY2hpbGRdOmJvcmRlci0wYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxLUz1GKHtfX25hbWU6YFRhYmxlQ2VsbGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRkYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWNlbGxgLGNsYXNzOk8oTihaKShgcC0yIGFsaWduLW1pZGRsZSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSkscVM9Rih7X19uYW1lOmBUYWJsZVJvd2AscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRyYCx7ImRhdGEtc2xvdCI6YHRhYmxlLXJvd2AsY2xhc3M6TyhOKFopKGBob3ZlcjpiZy1tdXRlZC81MCBkYXRhLVtzdGF0ZT1zZWxlY3RlZF06YmctbXV0ZWQgYm9yZGVyLWIgdHJhbnNpdGlvbi1jb2xvcnMgaGFzLWFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQvNTBgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLEpTPXtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktMTBgfSxZUz1GKHtfX25hbWU6YFRhYmxlRW1wdHlgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfSxjb2xzcGFuOntkZWZhdWx0OjF9fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4oZSxyKT0+KFIoKSxCKHFTLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goS1Msa3Moe2NsYXNzOk4oWikoYHAtNCB3aGl0ZXNwYWNlLW5vd3JhcCBhbGlnbi1taWRkbGUgdGV4dC1zbSB0ZXh0LWZvcmVncm91bmRgLHQuY2xhc3MpfSxOKG4pKSx7ZGVmYXVsdDpQKCgpPT5bVihgZGl2YCxKUyxbSShlLiRzbG90cyxgZGVmYXVsdGApXSldKSxfOjN9LDE2LFtgY2xhc3NgXSldKSxfOjN9KSl9fSksWFM9Rih7X19uYW1lOmBUYWJsZUhlYWRgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGB0aGAseyJkYXRhLXNsb3QiOmB0YWJsZS1oZWFkYCxjbGFzczpPKE4oWikoYHRleHQtZm9yZWdyb3VuZCBoLTEwIHB4LTIgdGV4dC1sZWZ0IGFsaWduLW1pZGRsZSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWlM9Rih7X19uYW1lOmBUYWJsZUhlYWRlcmAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoZWFkYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRlcmAsY2xhc3M6TyhOKFopKGBbJl90cl06Ym9yZGVyLWJgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pO2Z1bmN0aW9uIFFTKGUsdCl7dC52YWx1ZT10eXBlb2YgZT09YGZ1bmN0aW9uYD9lKHQudmFsdWUpOmV9dmFyICRTPUYoe19fbmFtZTpgRGF0YVRhYmxlYCxwcm9wczp7Y29sdW1uczp7fSxkYXRhOnt9LHJvd0NsYXNzOnt0eXBlOkZ1bmN0aW9ufSxlbXB0eU1lc3NhZ2U6e319LHNldHVwKGUpe2xldCB0PWUsbj1NKFtdKSxyPUJTKHtnZXQgZGF0YSgpe3JldHVybiB0LmRhdGF9LGdldCBjb2x1bW5zKCl7cmV0dXJuIHQuY29sdW1uc30sZ2V0Q29yZVJvd01vZGVsOmpTKCksZ2V0U29ydGVkUm93TW9kZWw6TVMoKSxvblNvcnRpbmdDaGFuZ2U6ZT0+UVMoZSxuKSxzdGF0ZTp7Z2V0IHNvcnRpbmcoKXtyZXR1cm4gbi52YWx1ZX19fSk7ZnVuY3Rpb24gaShlKXtpZihlPT09YGFzY2ApcmV0dXJuYGFzY2VuZGluZ2A7aWYoZT09PWBkZXNjYClyZXR1cm5gZGVzY2VuZGluZ2B9cmV0dXJuKHQsbik9PihSKCksQihOKFdTKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWlMpLG51bGwse2RlZmF1bHQ6UCgoKT0+WyhSKCEwKSx6KEwsbnVsbCxtYShOKHIpLmdldEhlYWRlckdyb3VwcygpLGU9PihSKCksQihOKHFTKSx7a2V5OmUuaWR9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEoZS5oZWFkZXJzLGU9PihSKCksQihOKFhTKSx7a2V5OmUuaWQsY2xhc3M6TyhlLmNvbHVtbi5jb2x1bW5EZWYubWV0YT8uYWxpZ249PT1gcmlnaHRgP2B0ZXh0LXJpZ2h0YDp2b2lkIDApLCJhcmlhLXNvcnQiOmUuY29sdW1uLmdldENhblNvcnQoKT9pKGUuY29sdW1uLmdldElzU29ydGVkKCkpPz9gbm9uZWA6dm9pZCAwfSx7ZGVmYXVsdDpQKCgpPT5bZS5jb2x1bW4uZ2V0Q2FuU29ydCgpPyhSKCksQihIUyx7a2V5OjAsaGVhZGVyOmUsY2xhc3M6YC1teC0xLjVgfSxudWxsLDgsW2BoZWFkZXJgXSkpOmUuaXNQbGFjZWhvbGRlcj9UcyhgYCwhMCk6KFIoKSxCKE4oUlMpLHtrZXk6MSxyZW5kZXI6ZS5jb2x1bW4uY29sdW1uRGVmLmhlYWRlcixwcm9wczplLmdldENvbnRleHQoKX0sbnVsbCw4LFtgcmVuZGVyYCxgcHJvcHNgXSkpXSksXzoyfSwxMDMyLFtgY2xhc3NgLGBhcmlhLXNvcnRgXSkpKSwxMjgpKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pLF86MX0pLEgoTihHUyksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bTihyKS5nZXRSb3dNb2RlbCgpLnJvd3MubGVuZ3RoPT09MD8oUigpLEIoTihZUykse2tleTowLGNvbHNwYW46ZS5jb2x1bW5zLmxlbmd0aCxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlLmVtcHR5TWVzc2FnZT8/YG5vbmVgKSwxKV0pLF86MX0sOCxbYGNvbHNwYW5gXSkpOlRzKGBgLCEwKSwoUighMCkseihMLG51bGwsbWEoTihyKS5nZXRSb3dNb2RlbCgpLnJvd3MsdD0+KFIoKSxCKE4ocVMpLHtrZXk6dC5pZCxjbGFzczpPKGUucm93Q2xhc3M/Lih0Lm9yaWdpbmFsKSl9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodC5nZXRWaXNpYmxlQ2VsbHMoKSxlPT4oUigpLEIoTihLUykse2tleTplLmlkLGNsYXNzOk8oZS5jb2x1bW4uY29sdW1uRGVmLm1ldGE/LmFsaWduPT09YHJpZ2h0YD9gdGV4dC1yaWdodCB0YWJ1bGFyLW51bXNgOnZvaWQgMCl9LHtkZWZhdWx0OlAoKCk9PltIKE4oUlMpLHtyZW5kZXI6ZS5jb2x1bW4uY29sdW1uRGVmLmNlbGwscHJvcHM6ZS5nZXRDb250ZXh0KCl9LG51bGwsOCxbYHJlbmRlcmAsYHByb3BzYF0pXSksXzoyfSwxMDMyLFtgY2xhc3NgXSkpKSwxMjgpKV0pLF86Mn0sMTAzMixbYGNsYXNzYF0pKSksMTI4KSldKSxfOjF9KV0pLF86MX0pKX19KSxlQz1GKHtfX25hbWU6YEJhZGdlYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSx2YXJpYW50Ont9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4ocixpKT0+KFIoKSxCKE4obmIpLGtzKHsiZGF0YS1zbG90IjpgYmFkZ2VgLCJkYXRhLXZhcmlhbnQiOmUudmFyaWFudCxjbGFzczpOKFopKE4odEMpKHt2YXJpYW50OmUudmFyaWFudH0pLHQuY2xhc3MpfSxOKG4pKSx7ZGVmYXVsdDpQKCgpPT5bSShyLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGRhdGEtdmFyaWFudGAsYGNsYXNzYF0pKX19KSx0Qz13XyhgaC01IGdhcC0xIHJvdW5kZWQtNHhsIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgcHgtMiBweS0wLjUgdGV4dC14cyBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0xLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLXN0YXJ0XTpwbC0xLjUgWyY+c3ZnXTpzaXplLTMhIGdyb3VwL2JhZGdlIGlubGluZS1mbGV4IHctZml0IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBvdmVyZmxvdy1oaWRkZW4gd2hpdGVzcGFjZS1ub3dyYXAgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgWyY+c3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lYCx7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6YGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2FdOmhvdmVyOmJnLXByaW1hcnkvODBgLHNlY29uZGFyeTpgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgW2FdOmhvdmVyOmJnLXNlY29uZGFyeS84MGAsZGVzdHJ1Y3RpdmU6YGJnLWRlc3RydWN0aXZlLzEwIFthXTpob3ZlcjpiZy1kZXN0cnVjdGl2ZS8yMCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgdGV4dC1kZXN0cnVjdGl2ZSBkYXJrOmJnLWRlc3RydWN0aXZlLzIwYCxvdXRsaW5lOmBib3JkZXItYm9yZGVyIHRleHQtZm9yZWdyb3VuZCBbYV06aG92ZXI6YmctbXV0ZWQgW2FdOmhvdmVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsZ2hvc3Q6YGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBkYXJrOmhvdmVyOmJnLW11dGVkLzUwYCxsaW5rOmB0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZWB9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6YGRlZmF1bHRgfX0pO2FzeW5jIGZ1bmN0aW9uIG5DKGUsdCl7aWYobmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KXRyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoZSksYGNvcGllZGB9Y2F0Y2h7fWlmKCF0KXJldHVybmBmYWlsZWRgO2xldCBuPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7bi5zZWxlY3ROb2RlQ29udGVudHModCk7bGV0IHI9d2luZG93LmdldFNlbGVjdGlvbigpO3JldHVybiByPyhyLnJlbW92ZUFsbFJhbmdlcygpLHIuYWRkUmFuZ2UobiksYHNlbGVjdGVkYCk6YGZhaWxlZGB9dmFyIHJDPWAwMDAxLTAxLTAxVDAwOjAwOjAwWmA7ZnVuY3Rpb24gaUMoZSx0KXtyZXR1cm5gJHtlfS8ke3R9YH1mdW5jdGlvbiBhQyhlKXtyZXR1cm5gJCR7KGUvMWU2KS50b0ZpeGVkKDQpfWB9ZnVuY3Rpb24gb0MoZSl7cmV0dXJuIGUudG9Mb2NhbGVTdHJpbmcoYGVuLVVTYCl9ZnVuY3Rpb24gc0MoZSl7bGV0IHQ9TWF0aC5hYnMoZSk7aWYodDwxZTQpcmV0dXJuIG9DKGUpO2xldCBuPWU8MD9gLWA6YGAsW3IsaV09dDwxZTY/WzFlMyxga2BdOnQ8MWU5P1sxZTYsYE1gXTpbMWU5LGBCYF0sYT10L3Isbz0zLShNYXRoLmZsb29yKGEpPj0xMDA/MzpNYXRoLmZsb29yKGEpPj0xMD8yOjEpLHM9MTAqKm8sYz0oTWF0aC5mbG9vcih0KnMvcikvcykudG9GaXhlZChvKTtyZXR1cm4gbz4wJiYoYz1jLnJlcGxhY2UoLzArJC8sYGApLnJlcGxhY2UoL1wuJC8sYGApKSxgJHtufSR7Y30ke2l9YH1mdW5jdGlvbiBjQyhlKXtyZXR1cm4gZT4wJiYhKGUmZS0xKX1mdW5jdGlvbiBsQyhlKXtyZXR1cm4gZTwxMDI0P2Ake2V9YDpjQyhlKT9lPDEwNDg1NzY/YCR7TWF0aC5yb3VuZChlLzEwMjQpfWtgOmAke01hdGgucm91bmQoZS8xMDQ4NTc2KX1NYDplPDFlNj9gJHtNYXRoLnJvdW5kKGUvMWUzKX1rYDpgJHtNYXRoLnJvdW5kKGUvMWU2KX1NYH1mdW5jdGlvbiB1QyhlKXtyZXR1cm5gJCR7ZS50b0ZpeGVkKDIpfWB9ZnVuY3Rpb24gZEMoZSx0KXtyZXR1cm4gZT09PTAmJnQ9PT0wP2BmcmVlYDpgaW4gJHt1QyhlKX0gLyBvdXQgJHt1Qyh0KX0gcGVyIE1Ub2tgfWZ1bmN0aW9uIGZDKGUpe3JldHVybiBlPDFlMz9gJHtNYXRoLnJvdW5kKGUpfW1zYDpgJHsoZS8xZTMpLnRvRml4ZWQoMSl9c2B9ZnVuY3Rpb24gcEMoZSl7aWYoIWV8fGU9PT1yQylyZXR1cm5gYDtsZXQgdD1uZXcgRGF0ZShlKS5nZXRUaW1lKCk7cmV0dXJuIE51bWJlci5pc05hTih0KT9gYDpgICgke01hdGgubWF4KDAsTWF0aC5yb3VuZCgoRGF0ZS5ub3coKS10KS8xZTMpKX1zIGFnbylgfWZ1bmN0aW9uIG1DKGUpe2lmKCFlfHxlPT09ckMpcmV0dXJuYGA7bGV0IHQ9bmV3IERhdGUoZSkuZ2V0VGltZSgpO2lmKE51bWJlci5pc05hTih0KSlyZXR1cm5gYDtsZXQgbj1NYXRoLnJvdW5kKCh0LURhdGUubm93KCkpLzFlMyk7cmV0dXJuIG48PTA/YGA6YGluICR7bn1zYH1mdW5jdGlvbiBoQyhlKXtpZighZXx8ZT09PXJDKXJldHVybmBuZXZlcmA7bGV0IHQ9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTih0LmdldFRpbWUoKSk/ZTp0LnRvTG9jYWxlU3RyaW5nKCl9ZnVuY3Rpb24gZ0MoZSx0KXtyZXR1cm4gZT9wQyh0KT9gcmVmcmVzaGVkYDpgcGVuZGluZ2A6YG9mZmB9ZnVuY3Rpb24gX0MoZSx0KXtzd2l0Y2goZ0MoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuYHJlZnJlc2hlZCR7cEModCl9YH19ZnVuY3Rpb24gdkMoZSx0KXtzd2l0Y2goZ0MoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuIGhDKHQpfX1mdW5jdGlvbiB5QyhlKXtpZighZSlyZXR1cm5gbm9uZWA7bGV0IHQ9W107cmV0dXJuIGUucmVxdWVzdHNQZXJNaW51dGUmJnQucHVzaChgcmVxL21pbiAke2UucmVxdWVzdHNQZXJNaW51dGV9YCksZS5yZXF1ZXN0c1BlckRheSYmdC5wdXNoKGByZXEvZGF5ICR7ZS5yZXF1ZXN0c1BlckRheX1gKSxlLnRva2Vuc1BlckRheSYmdC5wdXNoKGB0b2svZGF5ICR7ZS50b2tlbnNQZXJEYXl9YCksZS50b2tlbnNQZXJNb250aCYmdC5wdXNoKGB0b2svbW9udGggJHtlLnRva2Vuc1Blck1vbnRofWApLGUuY29zdFBlckRheVVTRCYmdC5wdXNoKGBjb3N0L2RheSAkJHtlLmNvc3RQZXJEYXlVU0R9YCksZS5jb3N0UGVyTW9udGhVU0QmJnQucHVzaChgY29zdC9tb250aCAkJHtlLmNvc3RQZXJNb250aFVTRH1gKSx0Lmxlbmd0aD90LmpvaW4oYCwgYCk6YG5vbmVgfWZ1bmN0aW9uIGJDKGUsdCl7c3dpdGNoKHQpe2Nhc2VgaG91cmA6cmV0dXJuYCR7ZS5zbGljZSg4LDEwKX06MDBgO2Nhc2VgZGF5YDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKSxyPU51bWJlcihlLnNsaWNlKDYsOCkpO3JldHVybiBuZXcgRGF0ZSh0LG4tMSxyKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDpgc2hvcnRgLGRheTpgbnVtZXJpY2B9KX1jYXNlYG1vbnRoYDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKTtyZXR1cm4gbmV3IERhdGUodCxuLTEsMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6YHNob3J0YCx5ZWFyOmBudW1lcmljYH0pfX19dmFyIHhDPUYoe19fbmFtZTpgTW9kZWxDaGlwYCxwcm9wczp7aWQ6e30sY29udGV4dFRva2Vuczp7fSxpbnB1dFBlck1Ub2tVc2Q6e30sb3V0cHV0UGVyTVRva1VzZDp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXNpKGBsYWJlbGApLHI9TShgaWRsZWApLGk7ZnVuY3Rpb24gYSgpe2NsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKCk9PntyLnZhbHVlPWBpZGxlYH0sMTUwMCl9YXN5bmMgZnVuY3Rpb24gbygpe2xldCBlPWF3YWl0IG5DKHQuaWQsbi52YWx1ZT8/dm9pZCAwKTtyLnZhbHVlPWUsYSgpfWxldCBzPXtpZGxlOl9fLGNvcGllZDpkXyxzZWxlY3RlZDpkXyxmYWlsZWQ6Z199LGM9VygoKT0+KHtpZGxlOmBDb3B5ICR7dC5pZH1gLGNvcGllZDpgQ29waWVkYCxzZWxlY3RlZDpgU2VsZWN0ZWQg4oCUIHByZXNzIEN0cmwvQ21kK0NgLGZhaWxlZDpgQ29weSBmYWlsZWRgfSkpLGw9VygoKT0+e2xldCBlPVtdO3JldHVybiB0LmlucHV0UGVyTVRva1VzZCE9PXZvaWQgMCYmdC5vdXRwdXRQZXJNVG9rVXNkIT09dm9pZCAwJiZlLnB1c2goZEModC5pbnB1dFBlck1Ub2tVc2QsdC5vdXRwdXRQZXJNVG9rVXNkKSksdC5jb250ZXh0VG9rZW5zIT09dm9pZCAwJiZlLnB1c2goYCR7bEModC5jb250ZXh0VG9rZW5zKX0gY29udGV4dGApLGUuam9pbihgIMK3IGApfSksdT1XKCgpPT57bGV0IGU9Yy52YWx1ZVtyLnZhbHVlXTtyZXR1cm4gbC52YWx1ZT9gJHtlfSDCtyAke2wudmFsdWV9YDplfSk7cmV0dXJuIHRhKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSksKHQsbik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oZUMpLHthczpgYnV0dG9uYCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6TyhbYGN1cnNvci1wb2ludGVyIGdhcC0xIGZvbnQtbW9ubyB0ZXh0LXhzIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kYCxyLnZhbHVlPT09YGZhaWxlZGA/YHRleHQtZGVzdHJ1Y3RpdmVgOmBgXSksdGl0bGU6dS52YWx1ZSwiYXJpYS1sYWJlbCI6dS52YWx1ZSxvbkNsaWNrOm99LHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCx7cmVmOmBsYWJlbGAsY2xhc3M6YHNlbGVjdC10ZXh0YH0sayhlLmlkKSw1MTMpLEgoaSx7aWNvbjpzW3IudmFsdWVdLGNsYXNzOmBzaXplLTIuNSBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9LDgsW2BjbGFzc2AsYHRpdGxlYCxgYXJpYS1sYWJlbGBdKX19fSk7ZnVuY3Rpb24gU0MoZSx0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKGUpfHxlPD0wP251bGw6KGUtKE51bWJlci5pc0Zpbml0ZSh0KT90OjApKS9lfWZ1bmN0aW9uIENDKGUpe3JldHVybiBlPT09bnVsbD9gbm8tdHJhZmZpY2A6ZTwuOT9gc2V2ZXJlYDplPC45OT9gZGVncmFkZWRgOmBoZWFsdGh5YH1mdW5jdGlvbiB3QyhlLHQpe2xldCBuPVNDKGUsdCk7cmV0dXJuIG4hPT1udWxsJiZuPC45OX1mdW5jdGlvbiBUQyhlKXtyZXR1cm4gZT49MT9gMTAwJWA6YCR7TWF0aC5mbG9vcihlKjEwMCl9JWB9ZnVuY3Rpb24gRUMoZSx0LG4pe3JldHVybiBlPT09MT90Om59ZnVuY3Rpb24gREMoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIGluIHRoZSBsYXN0IG1pbnV0ZWA7bGV0IG49U0MoZSx0KSxyPW49PT1udWxsP2BgOmAgKCR7VEMobil9KWA7cmV0dXJuYCR7ZX0gJHtFQyhlLGBhdHRlbXB0YCxgYXR0ZW1wdHNgKX0sICR7dH0gJHtFQyh0LGBmYWlsdXJlYCxgZmFpbHVyZXNgKX0gaW4gdGhlIGxhc3QgbWludXRlJHtyfWB9ZnVuY3Rpb24gT0MoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIHRvZGF5YDtsZXQgbj1TQyhlLHQpLHI9bj09PW51bGw/YGA6YCAoJHtUQyhuKX0pYDtyZXR1cm5gJHtlfSAke0VDKGUsYGF0dGVtcHRgLGBhdHRlbXB0c2ApfSwgJHt0fSAke0VDKHQsYGZhaWx1cmVgLGBmYWlsdXJlc2ApfSB0b2RheSR7cn1gfXZhciBrQz17ImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LEFDPXtjbGFzczpgc3Itb25seWB9LGpDPUYoe19fbmFtZTpgUHJvdmlkZXJSYXRlQmFkZ2VgLHByb3BzOnthdHRlbXB0c0RheTp7fSxmYWlsdXJlc0RheTp7fSxhdHRlbXB0c01pbnV0ZTp7fSxmYWlsdXJlc01pbnV0ZTp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVcoKCk9PlNDKHQuYXR0ZW1wdHNEYXksdC5mYWlsdXJlc0RheSkpLHI9VygoKT0+Q0Mobi52YWx1ZSkpLGk9VygoKT0+ci52YWx1ZT09PWBuby10cmFmZmljYD9gbm8gdHJhZmZpY2A6VEMobi52YWx1ZSkpLGE9VygoKT0+dC5hdHRlbXB0c01pbnV0ZT09PXZvaWQgMHx8dC5mYWlsdXJlc01pbnV0ZT09PXZvaWQgMD9PQyh0LmF0dGVtcHRzRGF5LHQuZmFpbHVyZXNEYXkpOkRDKHQuYXR0ZW1wdHNNaW51dGUsdC5mYWlsdXJlc01pbnV0ZSkpLG89VygoKT0+ci52YWx1ZT09PWBzZXZlcmVgP2BkZXN0cnVjdGl2ZWA6ci52YWx1ZT09PWBoZWFsdGh5YD9gc2Vjb25kYXJ5YDpgb3V0bGluZWApLHM9VygoKT0+ci52YWx1ZT09PWBkZWdyYWRlZGA/YGJvcmRlci1zdGF0dXMtd2Fybi80MCB0ZXh0LXN0YXR1cy13YXJuYDpyLnZhbHVlPT09YG5vLXRyYWZmaWNgP2B0ZXh0LW11dGVkLWZvcmVncm91bmRgOmBgKTtyZXR1cm4oZSx0KT0+KFIoKSxCKE4oZUMpLHthczpgc3BhbmAsdmFyaWFudDpvLnZhbHVlLGNsYXNzOk8oW3MudmFsdWUsYGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2BdKSx0aXRsZTphLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bVihgc3BhbmAsa0MsayhpLnZhbHVlKSwxKSxWKGBzcGFuYCxBQyxrKGEudmFsdWUpLDEpXSksXzoxfSw4LFtgdmFyaWFudGAsYGNsYXNzYCxgdGl0bGVgXSkpfX0pLE1DPUYoe19fbmFtZTpgU2VhcmNoSW5wdXRgLHByb3BzOnttb2RlbFZhbHVlOnt9LHBsYWNlaG9sZGVyOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1XKCgpPT5uLm1vZGVsVmFsdWUubGVuZ3RoPjApO2Z1bmN0aW9uIGEoZSl7cihgdXBkYXRlOm1vZGVsVmFsdWVgLFN0cmluZyhlKSl9ZnVuY3Rpb24gbygpe3IoYHVwZGF0ZTptb2RlbFZhbHVlYCxgYCl9cmV0dXJuKHQscik9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLHtjbGFzczpPKE4oWikoYHJlbGF0aXZlYCxuLmNsYXNzKSl9LFtIKHMse2ljb246TihpXyksY2xhc3M6YHBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTEvMiBsZWZ0LTIuNSBzaXplLTMuNSAtdHJhbnNsYXRlLXktMS8yIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSksSChOKFFiKSx7Im1vZGVsLXZhbHVlIjplLm1vZGVsVmFsdWUsdHlwZTpgdGV4dGAscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlciwiYXJpYS1sYWJlbCI6ZS5wbGFjZWhvbGRlcixjbGFzczpgcHItOCBwbC04YCwib25VcGRhdGU6bW9kZWxWYWx1ZSI6YX0sbnVsbCw4LFtgbW9kZWwtdmFsdWVgLGBwbGFjZWhvbGRlcmAsYGFyaWEtbGFiZWxgXSksaS52YWx1ZT8oUigpLEIoTihXYikse2tleTowLHR5cGU6YGJ1dHRvbmAsdmFyaWFudDpgZ2hvc3RgLHNpemU6YGljb24teHNgLCJhcmlhLWxhYmVsIjpgQ2xlYXIgc2VhcmNoYCxjbGFzczpgYWJzb2x1dGUgdG9wLTEvMiByaWdodC0xIC10cmFuc2xhdGUteS0xLzIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZGAsb25DbGljazpvfSx7ZGVmYXVsdDpQKCgpPT5bSChzLHtpY29uOk4ocF8pLGNsYXNzOmBzaXplLTMuNWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9KSk6VHMoYGAsITApXSwyKX19fSksTkM9Rih7X19uYW1lOmBBY2NvcmRpb25gLHByb3BzOntjb2xsYXBzaWJsZTp7dHlwZTpCb29sZWFufSxkaXNhYmxlZDp7dHlwZTpCb29sZWFufSxkaXI6e30sb3JpZW50YXRpb246e30sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LHR5cGU6e30sbW9kZWxWYWx1ZTp7fSxkZWZhdWx0VmFsdWU6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LGVtaXRzOltgdXBkYXRlOm1vZGVsVmFsdWVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPXF5KEN5KG4sYGNsYXNzYCkscik7cmV0dXJuKGUsdCk9PihSKCksQihOKGhiKSxrcyh7ImRhdGEtc2xvdCI6YGFjY29yZGlvbmB9LE4oaSkse2NsYXNzOk4oWikoYGZsZXggdy1mdWxsIGZsZXgtY29sYCxuLmNsYXNzKX0pLHtkZWZhdWx0OlAodD0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHhlKFNzKHQpKSldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLFBDPUYoe19fbmFtZTpgQWNjb3JkaW9uQ29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihOKGJiKSxrcyh7ImRhdGEtc2xvdCI6YGFjY29yZGlvbi1jb250ZW50YH0sTihuKSx7Y2xhc3M6YGRhdGEtb3BlbjphbmltYXRlLWFjY29yZGlvbi1kb3duIGRhdGEtY2xvc2VkOmFuaW1hdGUtYWNjb3JkaW9uLXVwIHRleHQtc20gb3ZlcmZsb3ctaGlkZGVuYH0pLHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLHtjbGFzczpPKE4oWikoYHB0LTAgcGItMi41IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kIFsmX3A6bm90KDpsYXN0LWNoaWxkKV06bWItNGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKV0pLF86M30sMTYpKX19KSxGQz1GKHtfX25hbWU6YEFjY29yZGlvbkl0ZW1gLHByb3BzOntkaXNhYmxlZDp7dHlwZTpCb29sZWFufSx2YWx1ZTp7fSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1LeShDeSh0LGBjbGFzc2ApKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oeWIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWl0ZW1gfSxOKG4pLHtjbGFzczpOKFopKGBub3QtbGFzdDpib3JkZXItYmAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpQKHQ9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx4ZShTcyh0KSkpXSksXzozfSwxNixbYGNsYXNzYF0pKX19KSxJQz1GKHtfX25hbWU6YEFjY29yZGlvblRyaWdnZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4oZSxyKT0+e2xldCBpPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLEIoTih4Yikse2NsYXNzOmBmbGV4YH0se2RlZmF1bHQ6UCgoKT0+W0goTihTYiksa3MoeyJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlcmB9LE4obikse2NsYXNzOk4oWikoYGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTphZnRlcjpib3JkZXItcmluZyAqKjpkYXRhLVtzbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25dOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCByb3VuZGVkLWxnIHB5LTIuNSB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW1lZGl1bSBob3Zlcjp1bmRlcmxpbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTMgKio6ZGF0YS1bc2xvdD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXTptbC1hdXRvICoqOmRhdGEtW3Nsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl06c2l6ZS00IGdyb3VwL2FjY29yZGlvbi10cmlnZ2VyIHJlbGF0aXZlIGZsZXggZmxleC0xIGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tYWxsIG91dGxpbmUtbm9uZSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTBgLHQuY2xhc3MpfSkse2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKSxJKGUuJHNsb3RzLGBpY29uYCx7fSwoKT0+W0goaSx7aWNvbjpOKGhfKSwiZGF0YS1zbG90IjpgYWNjb3JkaW9uLXRyaWdnZXItaWNvbmAsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsY2xhc3M6YHBvaW50ZXItZXZlbnRzLW5vbmUgc2hyaW5rLTAgZ3JvdXAtYXJpYS1leHBhbmRlZC9hY2NvcmRpb24tdHJpZ2dlcjpoaWRkZW5gfSxudWxsLDgsW2BpY29uYF0pLEgoaSx7aWNvbjpOKGNfKSwiZGF0YS1zbG90IjpgYWNjb3JkaW9uLXRyaWdnZXItaWNvbmAsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsY2xhc3M6YHBvaW50ZXItZXZlbnRzLW5vbmUgaGlkZGVuIHNocmluay0wIGdyb3VwLWFyaWEtZXhwYW5kZWQvYWNjb3JkaW9uLXRyaWdnZXI6aW5saW5lYH0sbnVsbCw4LFtgaWNvbmBdKV0pXSksXzozfSwxNixbYGNsYXNzYF0pXSksXzozfSl9fX0pO2Z1bmN0aW9uIExDKCl7bGV0IGU9TShgYCksdD1XKCgpPT5lLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm57cXVlcnk6ZSxub3JtYWxpemVkOnQsaGFzUXVlcnk6VygoKT0+dC52YWx1ZS5sZW5ndGg+MCl9fWZ1bmN0aW9uIFJDKGUsdCxuKXtpZighdClyZXR1cm4gbmV3IFNldChlLm1hbnVhbGx5RXhwYW5kZWQpO2xldCByPW5ldyBTZXQoZS5tYW51YWxseUV4cGFuZGVkKTtmb3IobGV0IHQgb2YgbillLm1hbnVhbGx5Q29sbGFwc2VkLmhhcyh0KXx8ci5hZGQodCk7cmV0dXJuIHJ9ZnVuY3Rpb24gekMoZSx0LG4pe24/KGUubWFudWFsbHlFeHBhbmRlZC5kZWxldGUodCksZS5tYW51YWxseUNvbGxhcHNlZC5hZGQodCkpOihlLm1hbnVhbGx5Q29sbGFwc2VkLmRlbGV0ZSh0KSxlLm1hbnVhbGx5RXhwYW5kZWQuYWRkKHQpKX1mdW5jdGlvbiBCQyhlKXtlLm1hbnVhbGx5Q29sbGFwc2VkLmNsZWFyKCl9dmFyIFZDPXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtNmB9LEhDPXtjbGFzczpgZ3JpZCBnYXAtNCBzbTpncmlkLWNvbHMtM2B9LFVDPXtjbGFzczpgZm9udC1tZWRpdW1gfSxXQz17a2V5OjAsY2xhc3M6YGZsZXggaXRlbXMtc3RhcnQgZ2FwLTEuNSB0ZXh0LWRlc3RydWN0aXZlYH0sR0M9e2NsYXNzOmBmb250LW1lZGl1bWB9LEtDPXtrZXk6MCxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0scUM9e2NsYXNzOmBmb250LW1lZGl1bWB9LEpDPXtrZXk6MCxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sWUM9e2tleTowLGNsYXNzOmBweS02IHRleHQtY2VudGVyIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sWEM9e2tleToxLGNsYXNzOmBweS02IHRleHQtY2VudGVyIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sWkM9e2NsYXNzOmBmbGV4IGZsZXgtMSBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC14LTMgZ2FwLXktMSBwci0yIHRleHQtbGVmdGB9LFFDPXtjbGFzczpgZm9udC1tZWRpdW1gfSwkQz17Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LGV3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx0dz17Y2xhc3M6YG1iLTMgZ3JpZCBncmlkLWNvbHMtMiBnYXAteC02IGdhcC15LTEuNSB0ZXh0LXNtIHNtOmdyaWQtY29scy0zYH0sbnc9e2NsYXNzOmBicmVhay1hbGxgfSxydz17a2V5OjB9LGl3PXtrZXk6MX0sYXc9e2NsYXNzOmB0ZXh0LWRlc3RydWN0aXZlYH0sb3c9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sc3c9e2tleTowLHRpdGxlOmBjb250ZXh0IHdpbmRvd2AsY2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LGN3PXtrZXk6MSxjbGFzczpgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxsdz17a2V5OjAsY2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sdXc9YFBlci1yZXBsaWNhLCBpbi1wcm9jZXNzIG9ubHkg4oCUIG5vdCBhIGZsZWV0LXdpZGUgYXZlcmFnZSBhY3Jvc3MgdGhpcyBkZXBsb3ltZW504oCZcyByZXBsaWNhcy5gLGR3PUYoe19fbmFtZTpgUHJvdmlkZXJzVmlld2Asc2V0dXAoZSl7bGV0IHQ9c3goKSxuPVcoKCk9PnQub3ZlcnZpZXcpLHI9WnQoe21hbnVhbGx5RXhwYW5kZWQ6bmV3IFNldCxtYW51YWxseUNvbGxhcHNlZDpuZXcgU2V0fSkse3F1ZXJ5Omksbm9ybWFsaXplZDphLGhhc1F1ZXJ5Om99PUxDKCk7ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBpQyhlLHQpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5tb2RlbHMuc29tZSh0PT5zKGUubmFtZSx0KSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZS5hbGlhcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGEudmFsdWUpfHxlLnRhcmdldC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGEudmFsdWUpfWxldCB1PVcoKCk9PntsZXQgZT1uLnZhbHVlPy5wcm92aWRlcnM/P1tdO3JldHVybiBvLnZhbHVlP2UuZmlsdGVyKGMpOmV9KSxkPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5hbGlhc2VzPz9bXTtyZXR1cm4gby52YWx1ZT9lLmZpbHRlcihsKTplfSksZj1XKCgpPT5SQyhyLG8udmFsdWUsdS52YWx1ZS5tYXAoZT0+ZS5uYW1lKSkpO2Z1bmN0aW9uIHAoZSl7ekMocixlLGYudmFsdWUuaGFzKGUpKX1sZXQgbT1XKHtnZXQ6KCk9PkFycmF5LmZyb20oZi52YWx1ZSksc2V0OmU9PntsZXQgdD1uZXcgU2V0KGUpO2ZvcihsZXQgZSBvZiBmLnZhbHVlKXQuaGFzKGUpfHxwKGUpO2ZvcihsZXQgZSBvZiB0KWYudmFsdWUuaGFzKGUpfHxwKGUpfX0pO0VyKGksZT0+e2UudHJpbSgpPT09YGAmJkJDKHIpfSk7ZnVuY3Rpb24gaChlKXtyZXR1cm4gby52YWx1ZT9lLm1vZGVscy5maWx0ZXIodD0+cyhlLm5hbWUsdCkpOmUubW9kZWxzfWxldCBnPXthdHRlbXB0c0RheTowLGZhaWx1cmVzRGF5OjB9O2Z1bmN0aW9uIF8oZSx0KXtyZXR1cm4gZS5tb2RlbFJhdGVzPy5bdF0/P2d9ZnVuY3Rpb24gdihlLHQpe2xldCBuPV8oZSx0KTtyZXR1cm4gd0Mobi5hdHRlbXB0c0RheSxuLmZhaWx1cmVzRGF5KX1sZXQgeT17fTtmdW5jdGlvbiBiKGUsdCl7cmV0dXJuIGUubW9kZWxNZXRhPy5bdF0/P3l9ZnVuY3Rpb24geChlKXtzd2l0Y2goZSl7Y2FzZWBvcGVuYDpyZXR1cm5gZGVzdHJ1Y3RpdmVgO2Nhc2VgaGFsZi1vcGVuYDpyZXR1cm5gc2Vjb25kYXJ5YDtkZWZhdWx0OnJldHVybn19ZnVuY3Rpb24gUyhlKXtsZXQgdD1tQyhlLm9wZW5VbnRpbCk7cmV0dXJuIHQ/YCR7ZS5oZWFsdGhTdGF0ZX0gKCR7dH0pYDplLmhlYWx0aFN0YXRlfWZ1bmN0aW9uIEMoZSl7cmV0dXJuIGU9PT1gb3BlbmA/YHRleHQtZGVzdHJ1Y3RpdmVgOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIGUubGF0ZW5jeT8uc3RyZWFtaW5nfWZ1bmN0aW9uIGVlKGUpe3JldHVybiBlLmxhdGVuY3k/Lltgbm9uLXN0cmVhbWluZ2BdfWZ1bmN0aW9uIHRlKGUpe3JldHVybiBlLmNvdW50PT09dm9pZCAwP2BubyBvYnNlcnZhdGlvbnMgY291bnRlZGA6YCR7ZS5jb3VudH0gJHtlLmNvdW50PT09MT9gb2JzZXJ2YXRpb25gOmBvYnNlcnZhdGlvbnNgfSBvbiB0aGlzIHJlcGxpY2FgfWZ1bmN0aW9uIFQoZSl7cmV0dXJuYEF2ZXJhZ2UgdGltZSB0byBmaXJzdCBieXRlLCB0aGUgbG9hZC1zZW5zaXRpdmUgcmVhZGluZyBmb3Igc3RyZWFtaW5nIHRyYWZmaWMuICR7dGUoZSl9LiAke3V3fWB9ZnVuY3Rpb24gbmUoZSl7cmV0dXJuYEF2ZXJhZ2UgdG90YWwgcmVzcG9uc2UgdGltZSwgaW5jbHVkaW5nIGdlbmVyYXRpb24g4oCUIG5vdCBhIGxvYWQtc2Vuc2l0aXZlIHNpZ25hbCBsaWtlIHN0cmVhbWluZyB0dGZiLCBzaW5jZSB0aGlzIHByb3ZpZGVyIGJ1ZmZlcnMgdGhlIHdob2xlIGNvbXBsZXRpb24gYmVmb3JlIHNlbmRpbmcgYW55dGhpbmcuICR7dGUoZSl9LiAke3V3fWB9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIGUucHJvdmVuYW5jZT8uZXN0aW1hdGVkfWZ1bmN0aW9uIGllKGUpe3JldHVybiBlLnByb3ZlbmFuY2U/LnVuYmlsbGVkfWZ1bmN0aW9uIEUoZSl7bGV0IHQ9ZS5yZXF1ZXN0cz09PTE/YGA6YHNgO3JldHVybmAke2UucmVxdWVzdHN9IG5vbi1zdHJlYW1pbmcgcmVzcG9uc2Uke3R9IGNhcnJpZWQgbm8gdXNhZ2UgZnJvbSB0aGUgcHJvdmlkZXIg4oCUIHByb21wdCB0b2tlbnMgd2VyZSBlc3RpbWF0ZWQgZnJvbSByZXF1ZXN0IGJvZHkgc2l6ZSBpbnN0ZWFkICgke2UudG9rZW5zfSB0b2tlbnMgYmlsbGVkIGZyb20gdGhlIGVzdGltYXRlKSwgY29tcGxldGlvbiBiaWxsZWQgYXMgemVyby4gJHt1d31gfWZ1bmN0aW9uIGFlKGUpe2xldCB0PWUucmVxdWVzdHM9PT0xP2BgOmBzYDtyZXR1cm5gJHtlLnJlcXVlc3RzfSBzdHJlYW1pbmcgcmVzcG9uc2Uke3R9IGNhcnJpZWQgbm8gdXNhZ2UgZnJvbSB0aGUgcHJvdmlkZXIg4oCUIHRoZSByZXF1ZXN0IHdhcyBjb3VudGVkIGJ1dCB6ZXJvIHRva2VucyB3ZXJlIGJpbGxlZC4gSWYgdGhpcyBrZWVwcyBoYXBwZW5pbmcsIHRoaXMgcHJvdmlkZXIgbWF5IGJlIHNlcnZpbmcgY29tcGxldGlvbnMgZW50aXJlbHkgZnJlZSBhZ2FpbnN0IGV2ZXJ5IGJ1ZGdldC4gJHt1d31gfWxldCBvZT1be2lkOmBhbGlhc2AsaGVhZGVyOmBBbGlhc2AsYWNjZXNzb3JGbjplPT5lLmFsaWFzLGNlbGw6KHtyb3c6ZX0pPT50Yyh4Qyx7aWQ6ZS5vcmlnaW5hbC5hbGlhcyxjb250ZXh0VG9rZW5zOmUub3JpZ2luYWwubW9kZWxNZXRhPy5jb250ZXh0VG9rZW5zLGlucHV0UGVyTVRva1VzZDplLm9yaWdpbmFsLm1vZGVsTWV0YT8uaW5wdXRQZXJNVG9rVXNkLG91dHB1dFBlck1Ub2tVc2Q6ZS5vcmlnaW5hbC5tb2RlbE1ldGE/Lm91dHB1dFBlck1Ub2tVc2R9KX0se2lkOmB0YXJnZXRgLGhlYWRlcjpgVGFyZ2V0YCxhY2Nlc3NvckZuOmU9PmUudGFyZ2V0LGNlbGw6KHtyb3c6ZX0pPT50Yyhgc3BhbmAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxlLm9yaWdpbmFsLnRhcmdldCl9XSxzZT1XKCgpPT5uLnZhbHVlPy5hbGlhc2VzLmxlbmd0aD9vLnZhbHVlP2BubyBhbGlhc2VzIG1hdGNoICIke2kudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgKTtyZXR1cm4oZSx0KT0+e2xldCByPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsVkMsW1YoYGRpdmAsSEMsW0goTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/TihtXyk6TihsXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmVkaXMuY29uZmlndXJlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFsyXXx8PVUoYCBSZWRpcyBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1zbWB9LHtkZWZhdWx0OlAoKCk9PltWKGBwYCxVQyxrKG4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/YENvbmZpZ3VyZWRgOmBOb3QgY29uZmlndXJlZGApLDEpLG4udmFsdWU/LnJlZGlzLmxhc3RFcnI/KFIoKSx6KGBwYCxXQyxbSChyLHtpY29uOk4oZ18pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zLjUgc2hyaW5rLTBgfSxudWxsLDgsW2BpY29uYF0pLFYoYHNwYW5gLG51bGwsayhuLnZhbHVlLnJlZGlzLmxhc3RFcnIpK2soTihwQykobi52YWx1ZS5yZWRpcy5sYXN0RXJyQXQpKSwxKV0pKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LmNhY2hlLmVuYWJsZWQ/TihtXyk6TihsXyksY2xhc3M6Tyhbbi52YWx1ZT8uY2FjaGUuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFszXXx8PVUoYCBSZXNwb25zZSBjYWNoZSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAsR0MsayhuLnZhbHVlPy5jYWNoZS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5jYWNoZS5lbmFibGVkPyhSKCkseihgcGAsS0MsYHR0bCBgK2sobi52YWx1ZS5jYWNoZS50dGwpLDEpKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJldHJ5LmVuYWJsZWQ/TihtXyk6TihsXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmV0cnkuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFs0XXx8PVUoYCBSZXRyeSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAscUMsayhuLnZhbHVlPy5yZXRyeS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5yZXRyeS5lbmFibGVkPyhSKCkseihgcGAsSkMsYCBhdHRlbXB0cyBgK2sobi52YWx1ZS5yZXRyeS5hdHRlbXB0cykrYCwgYmFja29mZiBgK2sobi52YWx1ZS5yZXRyeS5iYWNrb2ZmKSwxKSk6VHMoYGAsITApXSksXzoxfSldKSxfOjF9KV0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbNV18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzZdfHw9W1UoYCBFdmVyeSBjb25maWd1cmVkIHVwc3RyZWFtIGFuZCBpdHMgbGFzdCBkaXNjb3ZlcnkgcmVmcmVzaC4gU2VhcmNoIGZpbHRlcnMgcHJvdmlkZXJzIGFuZCBhbGlhc2VzIGJ5IG1vZGVsIGlkLiBgLC0xKV1dKSxfOjF9KSxIKE1DLHttb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBTZWFyY2ggbW9kZWxzIG9yIGFsaWFzZXMuLi5gLGNsYXNzOmBtdC0yIG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bbi52YWx1ZT8ucHJvdmlkZXJzLmxlbmd0aD9OKG8pJiZ1LnZhbHVlLmxlbmd0aD09PTA/KFIoKSx6KGBwYCxYQyxgIG5vIHByb3ZpZGVycyBtYXRjaCAiYCtrKE4oaSkpK2AiIGAsMSkpOihSKCksQihOKE5DKSx7a2V5OjIsbW9kZWxWYWx1ZTptLnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzFdfHw9ZT0+bS52YWx1ZT1lLHR5cGU6YG11bHRpcGxlYCxjbGFzczpgcm91bmRlZC1tZCBib3JkZXIgcHgtM2B9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodS52YWx1ZSxlPT4oUigpLEIoTihGQykse2tleTplLm5hbWUsdmFsdWU6ZS5uYW1lfSx7ZGVmYXVsdDpQKCgpPT5bSChOKElDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCxaQyxbVihgc3BhbmAsUUMsayhlLm5hbWUpLDEpLEgoTihlQykse2FzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS50eXBlKSwxKV0pLF86Mn0sMTAyNCksVihgc3BhbmAsJEMsayhlLm1vZGVsQ291bnQpK2AgbW9kZWxzYCwxKSxIKGpDLHsiYXR0ZW1wdHMtZGF5IjplLmF0dGVtcHRzRGF5LCJmYWlsdXJlcy1kYXkiOmUuZmFpbHVyZXNEYXksImF0dGVtcHRzLW1pbnV0ZSI6ZS5hdHRlbXB0c01pbnV0ZSwiZmFpbHVyZXMtbWludXRlIjplLmZhaWx1cmVzTWludXRlfSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgLGBhdHRlbXB0cy1taW51dGVgLGBmYWlsdXJlcy1taW51dGVgXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLEIoTihlQykse2tleTowLGFzOmBzcGFuYCx2YXJpYW50OngoZS5oZWFsdGhTdGF0ZSksY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTplLmhlYWx0aFN0YXRlPT09YG9wZW5gP2BkaXNjb3ZlcnkgaXMgYmFja2luZyBvZmYgYWZ0ZXIgcmVwZWF0ZWQgZmFpbHVyZXNgOmBhIGRpc2NvdmVyeSBwcm9iZSBpcyBkZWNpZGluZyB3aGV0aGVyIHRvIHJlY292ZXJgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKFMoZSkpLDEpXSksXzoyfSwxMDMyLFtgdmFyaWFudGAsYHRpdGxlYF0pKSx3KGUpPy5hdmdUdGZiTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOlQodyhlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgc3RyZWFtaW5nIHR0ZmIgYCtrKE4oZkMpKHcoZSkuYXZnVHRmYk1zKSksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSksZWUoZSk/LmF2Z0R1cmF0aW9uTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjIsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOm5lKGVlKGUpKX0se2RlZmF1bHQ6UCgoKT0+W1UoYCBub24tc3RyZWFtaW5nIGF2ZyBgK2soTihmQykoZWUoZSkuYXZnRHVyYXRpb25NcykpLDEpXSksXzoyfSwxMDMyLFtgdGl0bGVgXSkpLHJlKGUpPyhSKCksQihOKGVDKSx7a2V5OjMsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2AsdGl0bGU6RShyZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgZXN0aW1hdGVkIGArayhyZShlKS5yZXF1ZXN0cyksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSk6VHMoYGAsITApLGllKGUpPyhSKCksQihOKGVDKSx7a2V5OjQsYXM6YHNwYW5gLHZhcmlhbnQ6YGRlc3RydWN0aXZlYCxjbGFzczpgZm9udC1ub3JtYWwgdGFidWxhci1udW1zYCx0aXRsZTphZShpZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgdW5iaWxsZWQgYCtrKGllKGUpLnJlcXVlc3RzKSwxKV0pLF86Mn0sMTAzMixbYHRpdGxlYF0pKTpUcyhgYCwhMCksZS5sYXN0RXJyPyhSKCksQihyLHtrZXk6NSxpY29uOk4oZ18pLGNsYXNzOmBzaXplLTMuNSBzaHJpbmstMCB0ZXh0LWRlc3RydWN0aXZlYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSk6VHMoYGAsITApLFYoYHNwYW5gLGV3LGsoTihfQykoZS5kaXNjb3ZlcnlFbmFibGVkLGUubGFzdFJlZnJlc2gpKSwxKV0pXSksXzoyfSwxMDI0KSxIKE4oUEMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYGRsYCx0dyxbVihgZGl2YCxudWxsLFt0WzddfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQmFzZSBVUkxgLC0xKSxWKGBkZGAsbncsayhlLmJhc2VVcmwpLDEpXSksVihgZGl2YCxudWxsLFt0WzhdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCByZWZyZXNoYCwtMSksVihgZGRgLG51bGwsayhOKHZDKShlLmRpc2NvdmVyeUVuYWJsZWQsZS5sYXN0UmVmcmVzaCkpLDEpXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLHooYGRpdmAscncsW3RbOV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBEaXNjb3ZlcnkgaGVhbHRoYCwtMSksVihgZGRgLHtjbGFzczpPKEMoZS5oZWFsdGhTdGF0ZSkpfSxrKFMoZSkpLDMpXSkpLGUubGFzdEVycj8oUigpLHooYGRpdmAsaXcsW3RbMTBdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCBlcnJvcmAsLTEpLFYoYGRkYCxhdyxrKGUubGFzdEVyciksMSldKSk6VHMoYGAsITApXSksaChlKS5sZW5ndGg/KFIoKSx6KGBkaXZgLG93LFsoUighMCkseihMLG51bGwsbWEoaChlKSx0PT4oUigpLHooYHNwYW5gLHtrZXk6dCxjbGFzczpgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xYH0sW0goeEMse2lkOk4oaUMpKGUubmFtZSx0KSwiY29udGV4dC10b2tlbnMiOmIoZSx0KS5jb250ZXh0VG9rZW5zLCJpbnB1dC1wZXItbS10b2stdXNkIjpiKGUsdCkuaW5wdXRQZXJNVG9rVXNkLCJvdXRwdXQtcGVyLW0tdG9rLXVzZCI6YihlLHQpLm91dHB1dFBlck1Ub2tVc2R9LG51bGwsOCxbYGlkYCxgY29udGV4dC10b2tlbnNgLGBpbnB1dC1wZXItbS10b2stdXNkYCxgb3V0cHV0LXBlci1tLXRvay11c2RgXSksYihlLHQpLmNvbnRleHRUb2tlbnM9PT12b2lkIDA/VHMoYGAsITApOihSKCkseihgc3BhbmAsc3csayhOKGxDKShiKGUsdCkuY29udGV4dFRva2VucykpLDEpKSx2KGUsdCk/KFIoKSxCKGpDLHtrZXk6MSwiYXR0ZW1wdHMtZGF5IjpfKGUsdCkuYXR0ZW1wdHNEYXksImZhaWx1cmVzLWRheSI6XyhlLHQpLmZhaWx1cmVzRGF5fSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgXSkpOlRzKGBgLCEwKV0pKSksMTI4KSldKSk6KFIoKSx6KGBwYCxjdyxgbm8gbW9kZWxzIGtub3duIHlldGApKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxZQyxgbm9uZWApKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMV18fD1bVShgTW9kZWwgYWxpYXNlc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMl18fD1bVShgT3BlcmF0b3ItZGVmaW5lZCBhbGlhcyDihpIgdGFyZ2V0IG1vZGVsIG1hcHBpbmdzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOm9lLGRhdGE6ZC52YWx1ZSwiZW1wdHktbWVzc2FnZSI6c2UudmFsdWV9LG51bGwsOCxbYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KSxuLnZhbHVlPy52ZXJzaW9uPyhSKCkseihgcGAsbHcsYFZlcnNpb246IGArayhuLnZhbHVlLnZlcnNpb24pLDEpKTpUcyhgYCwhMCldKX19fSksZnc9W2B0aXRsZWBdLHB3PXsiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbXc9e2NsYXNzOmBzci1vbmx5YH0saHc9Rih7X19uYW1lOmBDb21wYWN0TnVtYmVyYCxwcm9wczp7dmFsdWU6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5zQyh0LnZhbHVlKSkscj1XKCgpPT5vQyh0LnZhbHVlKSk7cmV0dXJuKGUsdCk9PihSKCkseihgc3BhbmAse3RpdGxlOnIudmFsdWV9LFtWKGBzcGFuYCxwdyxrKG4udmFsdWUpLDEpLFYoYHNwYW5gLG13LGsoci52YWx1ZSksMSldLDgsZncpKX19KTtmdW5jdGlvbiBndyhlLHQsbil7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT50Yyhodyx7dmFsdWU6bihlLm9yaWdpbmFsKX0pfX1mdW5jdGlvbiBfdygpe3JldHVyblt7aWQ6YG5hbWVgLGhlYWRlcjpgTmFtZWAsYWNjZXNzb3JGbjplPT5lLm5hbWUsY2VsbDooe3JvdzplfSk9PnRjKGBzcGFuYCx7Y2xhc3M6YGZvbnQtbWVkaXVtYH0sZS5vcmlnaW5hbC5uYW1lKX0se2lkOmB1cmxgLGhlYWRlcjpgVVJMYCxhY2Nlc3NvckZuOmU9PmUudXJsLGNlbGw6KHtyb3c6ZX0pPT50Yyhgc3BhbmAse2NsYXNzOmBibG9jayBtYXgtdy14cyB0cnVuY2F0ZSB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOmUub3JpZ2luYWwudXJsfSxlLm9yaWdpbmFsLnVybCl9LHtpZDpgYWNjZXNzYCxoZWFkZXI6YEFjY2Vzc2AsZW5hYmxlU29ydGluZzohMSxhY2Nlc3NvckZuOmU9PihlLmFjY2Vzcz8/W10pLmpvaW4oYCwgYCksY2VsbDooe3JvdzplfSk9PntsZXQgdD1lLm9yaWdpbmFsLmFjY2VzcztyZXR1cm4gdD8ubGVuZ3RoP3RjKGBkaXZgLHtjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LHQubWFwKGU9PnRjKGVDLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0sKCk9PmUpKSk6dGMoYHNwYW5gLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYEFsbCBncm91cHNgKX19LGd3KGByZXFNaW5gLGByZXEvbWluYCxlPT5lLmNvdW50ZXJzLnJlcXVlc3RzUGVyTWludXRlKSxndyhgcmVxRGF5YCxgcmVxL2RheWAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1BlckRheSksZ3coYHJlcU1vbnRoYCxgcmVxL21vbnRoYCxlPT5lLmNvdW50ZXJzLnJlcXVlc3RzUGVyTW9udGgpXX12YXIgdnc9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0seXc9Rih7X19uYW1lOmBUYXJnZXRzVmlld2Asc2V0dXAoZSl7bGV0IHQ9c3goKSxuPVcoKCk9PnQudGFyZ2V0cykse3F1ZXJ5OnIsbm9ybWFsaXplZDppLGhhc1F1ZXJ5OmF9PUxDKCk7ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaS52YWx1ZSl9bGV0IHM9VygoKT0+e2xldCBlPW4udmFsdWU/Lm1jcFNlcnZlcnM/P1tdO3JldHVybiBhLnZhbHVlP2UuZmlsdGVyKG8pOmV9KSxjPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5hZ2VudHM/P1tdO3JldHVybiBhLnZhbHVlP2UuZmlsdGVyKG8pOmV9KTtmdW5jdGlvbiBsKGUsdCl7cmV0dXJuIGU/YS52YWx1ZSYmdD09PTA/YG5vIHRhcmdldHMgbWF0Y2ggIiR7ci52YWx1ZX0iYDpgbm9uZWA6YG5vbmUgY29uZmlndXJlZGB9bGV0IHU9VygoKT0+bChuLnZhbHVlPy5tY3BTZXJ2ZXJzLmxlbmd0aD8/MCxzLnZhbHVlLmxlbmd0aCkpLGQ9VygoKT0+bChuLnZhbHVlPy5hZ2VudHMubGVuZ3RoPz8wLGMudmFsdWUubGVuZ3RoKSksZj1fdygpO3JldHVybihlLHQpPT4oUigpLHooYGRpdmAsdncsW0goTUMse21vZGVsVmFsdWU6TihyKSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFswXXx8PWU9Pmoocik/ci52YWx1ZT1lOm51bGwscGxhY2Vob2xkZXI6YEZpbHRlciBNQ1Agc2VydmVycyBvciBhZ2VudHNgLGNsYXNzOmBtYXgtdy1zbWB9LG51bGwsOCxbYG1vZGVsVmFsdWVgXSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxXXx8PVtVKGBNQ1Agc2VydmVyc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsyXXx8PVtVKGBDb25maWd1cmVkIE1DUCBwcm94eSB0YXJnZXRzLCB0aGUgZ3JvdXBzIGFsbG93ZWQgdG8gcmVhY2ggdGhlbSwgYW5kIHRoZWlyIHJlcXVlc3QgY291bnRlcnMuYCwtMSldXSksXzoxfSldKSxfOjF9KSxIKE4oSmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goJFMse2NvbHVtbnM6TihmKSxkYXRhOnMudmFsdWUsImVtcHR5LW1lc3NhZ2UiOnUudmFsdWV9LG51bGwsOCxbYGNvbHVtbnNgLGBkYXRhYCxgZW1wdHktbWVzc2FnZWBdKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFszXXx8PVtVKGBBZ2VudHNgLC0xKV1dKSxfOjF9KSxIKE4oWWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbNF18fD1bVShgQ29uZmlndXJlZCBBMkEgYWdlbnQgcHJveHkgdGFyZ2V0cywgdGhlIGdyb3VwcyBhbGxvd2VkIHRvIHJlYWNoIHRoZW0sIGFuZCB0aGVpciByZXF1ZXN0IGNvdW50ZXJzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOk4oZiksZGF0YTpjLnZhbHVlLCJlbXB0eS1tZXNzYWdlIjpkLnZhbHVlfSxudWxsLDgsW2Bjb2x1bW5zYCxgZGF0YWAsYGVtcHR5LW1lc3NhZ2VgXSldKSxfOjF9KV0pLF86MX0pXSkpfX0pLGJ3PUYoe19fbmFtZTpgVGFic2AscHJvcHM6e2RlZmF1bHRWYWx1ZTp7fSxvcmllbnRhdGlvbjp7fSxkaXI6e30sYWN0aXZhdGlvbk1vZGU6e30sbW9kZWxWYWx1ZTp7fSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LGVtaXRzOltgdXBkYXRlOm1vZGVsVmFsdWVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPXF5KEN5KG4sYGNsYXNzYCkscik7cmV0dXJuKGUsdCk9PihSKCksQihOKFJiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnNgLCJkYXRhLW9yaWVudGF0aW9uIjpOKGkpLm9yaWVudGF0aW9ufHxgaG9yaXpvbnRhbGB9LE4oaSkse2NsYXNzOk4oWikoYGdhcC0yIGdyb3VwL3RhYnMgZmxleCBkYXRhLWhvcml6b250YWw6ZmxleC1jb2xgLG4uY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BkYXRhLW9yaWVudGF0aW9uYCxgY2xhc3NgXSkpfX0pLHh3PUYoe19fbmFtZTpgVGFic0NvbnRlbnRgLHByb3BzOnt2YWx1ZTp7fSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1DeSh0LGBjbGFzc2ApO3JldHVybihlLHIpPT4oUigpLEIoTihWYiksa3MoeyJkYXRhLXNsb3QiOmB0YWJzLWNvbnRlbnRgLGNsYXNzOk4oWikoYHRleHQtc20gZmxleC0xIG91dGxpbmUtbm9uZWAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLFN3PUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sdmFyaWFudDp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgLGB2YXJpYW50YCk7cmV0dXJuKHIsaSk9PihSKCksQihOKEhiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtbGlzdGAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50fSxOKG4pLHtjbGFzczpOKFopKE4od3cpKHt2YXJpYW50OmUudmFyaWFudH0pLHQuY2xhc3MpfSkse2RlZmF1bHQ6UCgoKT0+W0koci4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2BkYXRhLXZhcmlhbnRgLGBjbGFzc2BdKSl9fSksQ3c9Rih7X19uYW1lOmBUYWJzVHJpZ2dlcmAscHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1LeShDeSh0LGBjbGFzc2ApKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oVWIpLGtzKHsiZGF0YS1zbG90IjpgdGFicy10cmlnZ2VyYCxjbGFzczpOKFopKGBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0xLjUgcHktMC41IHRleHQtc20gZm9udC1tZWRpdW0gZ3JvdXAtZGF0YS1bdmFyaWFudD1kZWZhdWx0XS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6c2hhZG93LXNtIGdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOnNoYWRvdy1ub25lIFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTQgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEgcmVsYXRpdmUgaW5saW5lLWZsZXggaC1bY2FsYygxMDAlLTFweCldIGZsZXgtMSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1mb3JlZ3JvdW5kLzYwIHRyYW5zaXRpb24tYWxsIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczp3LWZ1bGwgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOmp1c3RpZnktc3RhcnQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLTMgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTEgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLXJpbmcgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhcms6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6dGV4dC1mb3JlZ3JvdW5kIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCxgZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6YmctdHJhbnNwYXJlbnQgZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6YmctdHJhbnNwYXJlbnQgZGFyazpncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpib3JkZXItdHJhbnNwYXJlbnQgZGFyazpncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpiZy10cmFuc3BhcmVudGAsYGRhdGEtYWN0aXZlOmJnLWJhY2tncm91bmQgZGF0YS1hY3RpdmU6dGV4dC1mb3JlZ3JvdW5kIGRhcms6ZGF0YS1hY3RpdmU6Ym9yZGVyLWlucHV0IGRhcms6ZGF0YS1hY3RpdmU6YmctaW5wdXQvMzAgZGFyazpkYXRhLWFjdGl2ZTp0ZXh0LWZvcmVncm91bmRgLGBhZnRlcjphYnNvbHV0ZSBhZnRlcjpiZy1mb3JlZ3JvdW5kIGFmdGVyOm9wYWNpdHktMCBhZnRlcjp0cmFuc2l0aW9uLW9wYWNpdHkgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6YWZ0ZXI6aW5zZXQteC0wIGdyb3VwLWRhdGEtaG9yaXpvbnRhbC90YWJzOmFmdGVyOmJvdHRvbS1bLTVweF0gZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6YWZ0ZXI6aC0wLjUgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOmFmdGVyOmluc2V0LXktMCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6LXJpZ2h0LTEgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOmFmdGVyOnctMC41IGdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmFmdGVyOm9wYWNpdHktMTAwYCx0LmNsYXNzKX0sTihuKSkse2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksd3c9d18oYHJvdW5kZWQtbGcgcC0wLjc1IGdyb3VwLWRhdGEtaG9yaXpvbnRhbC90YWJzOmgtOCBkYXRhLVt2YXJpYW50PWxpbmVdOnJvdW5kZWQtbm9uZSBncm91cC90YWJzLWxpc3QgaW5saW5lLWZsZXggdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6aC1maXQgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOmZsZXgtY29sYCx7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6YGJnLW11dGVkYCxsaW5lOmBnYXAtMSBiZy10cmFuc3BhcmVudGB9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6YGRlZmF1bHRgfX0pO2Z1bmN0aW9uIFR3KGUsdCxuLHI9U3RyaW5nLGk9ITApe3JldHVybntpZDplLGhlYWRlcjp0LGFjY2Vzc29yRm46bixtZXRhOnthbGlnbjpgcmlnaHRgfSxjZWxsOih7cm93OmV9KT0+e2lmKGUub3JpZ2luYWwuc3RvcmVEb3duKXJldHVybmA/YDtsZXQgdD1uKGUub3JpZ2luYWwpO3JldHVybiBpP3RjKGh3LHt2YWx1ZTp0fSk6cih0KX19fWZ1bmN0aW9uIEV3KGUsdCxuKXtyZXR1cm5be2lkOmBpZGAsaGVhZGVyOmUsYWNjZXNzb3JGbjplPT5lLmlkLGNlbGw6KHtyb3c6ZX0pPT50Yyhgc3BhbmAse2NsYXNzOmBmb250LW1lZGl1bWB9LGUub3JpZ2luYWwuaWQpfSx7aWQ6YHNlY29uZGFyeWAsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLGNlbGw6KHtyb3c6ZX0pPT50Yyhgc3BhbmAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxuKGUub3JpZ2luYWwpKX0se2lkOmBsaW1pdHNgLGhlYWRlcjpgTGltaXRzYCxhY2Nlc3NvckZuOmU9PnlDKGUubGltaXRzKSxjZWxsOih7cm93OmV9KT0+dGMoYHNwYW5gLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0seUMoZS5vcmlnaW5hbC5saW1pdHMpKX0sVHcoYHJlcU1pbmAsYHJlcS9taW5gLGU9PmUucmVxdWVzdHNQZXJNaW51dGUpLFR3KGByZXFEYXlgLGByZXEvZGF5YCxlPT5lLnJlcXVlc3RzUGVyRGF5KSxUdyhgdG9rSW5EYXlgLGB0b2tJbi9kYXlgLGU9PmUudG9rZW5zSW5QZXJEYXkpLFR3KGB0b2tPdXREYXlgLGB0b2tPdXQvZGF5YCxlPT5lLnRva2Vuc091dFBlckRheSksVHcoYHRva0luTW9udGhgLGB0b2tJbi9tb250aGAsZT0+ZS50b2tlbnNJblBlck1vbnRoKSxUdyhgdG9rT3V0TW9udGhgLGB0b2tPdXQvbW9udGhgLGU9PmUudG9rZW5zT3V0UGVyTW9udGgpLFR3KGBjb3N0RGF5YCxgY29zdC9kYXlgLGU9PmUuY29zdFBlckRheU1pY3JvVXNkLGFDLCExKSxUdyhgY29zdE1vbnRoYCxgY29zdC9tb250aGAsZT0+ZS5jb3N0UGVyTW9udGhNaWNyb1VzZCxhQywhMSldfXZhciBEdz1GKHtfX25hbWU6YFVzYWdlVGFibGVgLHByb3BzOntpZExhYmVsOnt9LGVudHJpZXM6e30sc2Vjb25kYXJ5Q29sdW1uTGFiZWw6e30sc2Vjb25kYXJ5VmFsdWU6e3R5cGU6RnVuY3Rpb259LGVtcHR5TWVzc2FnZTp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVcoKCk9PkV3KHQuaWRMYWJlbCx0LnNlY29uZGFyeUNvbHVtbkxhYmVsLHQuc2Vjb25kYXJ5VmFsdWUpKTtyZXR1cm4odCxyKT0+KFIoKSxCKCRTLHtjb2x1bW5zOm4udmFsdWUsZGF0YTplLmVudHJpZXMsImVtcHR5LW1lc3NhZ2UiOmUuZW1wdHlNZXNzYWdlLCJyb3ctY2xhc3MiOmU9PmUuc3RvcmVEb3duP2BiZy1kZXN0cnVjdGl2ZS8xMGA6dm9pZCAwfSxudWxsLDgsW2Bjb2x1bW5zYCxgZGF0YWAsYGVtcHR5LW1lc3NhZ2VgLGByb3ctY2xhc3NgXSkpfX0pO2Z1bmN0aW9uIE93KGUsdCl7cmV0dXJuIGUuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0KX1mdW5jdGlvbiBrdyhlLHQpe3JldHVybiBlLmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModCl9ZnVuY3Rpb24gQXcoZSx0KXtyZXR1cm4gdC5maWx0ZXIodD0+dC5ncm91cE5hbWU9PT1lLmlkKX1mdW5jdGlvbiBqdyhlLHQsbil7cmV0dXJuIEF3KGUsdCkuZmlsdGVyKGU9Pk93KGUsbikpfWZ1bmN0aW9uIE13KGUsdCxuKXtyZXR1cm4ga3coZSxuKXx8ancoZSx0LG4pLmxlbmd0aD4wfXZhciBOdz17Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTZgfSxQdz17Y2xhc3M6YHRleHQtbGcgZm9udC1zZW1pYm9sZCB0YWJ1bGFyLW51bXNgfSxGdz17Y2xhc3M6YHRleHQtbGcgZm9udC1zZW1pYm9sZCB0YWJ1bGFyLW51bXNgfSxJdz17Y2xhc3M6YHRleHQtbGcgZm9udC1zZW1pYm9sZCB0YWJ1bGFyLW51bXNgfSxMdz17Y2xhc3M6YHRleHQtbGcgZm9udC1zZW1pYm9sZCB0YWJ1bGFyLW51bXNgfSxSdz17a2V5OjAsY2xhc3M6YG1iLTMgZmxleCBmbGV4LXdyYXAgZ2FwLXgtNCBnYXAteS0xIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0senc9e2NsYXNzOmBmbGV4IGZsZXgtMSBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC14LTQgZ2FwLXktMSBwci0yIHRleHQtbGVmdGB9LEJ3PXtjbGFzczpgZm9udC1tZWRpdW1gfSxWdz17Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LEh3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sVXc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0YWJ1bGFyLW51bXNgfSxXdz17Y2xhc3M6YG1iLTMgZ3JpZCBncmlkLWNvbHMtMiBnYXAteC02IGdhcC15LTEuNSB0ZXh0LXNtIHNtOmdyaWQtY29scy00YH0sR3c9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sS3c9e2tleToxLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxxdz17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxKdz17a2V5OjEsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LFl3PXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LFh3PXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sWnc9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sUXc9e2tleToxLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSwkdz17Y2xhc3M6YG1iLTMgZ3JpZCBncmlkLWNvbHMtMiBnYXAteC02IGdhcC15LTEuNSB0ZXh0LXNtIHNtOmdyaWQtY29scy00YH0sZVQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSx0VD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LG5UPXtjbGFzczpgdGFidWxhci1udW1zYH0sclQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSxpVD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LGFUPXtjbGFzczpgdGFidWxhci1udW1zYH0sb1Q9e2tleToyLGNsYXNzOmBweS02IHRleHQtY2VudGVyIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sc1Q9YEdsb2IgcGF0dGVybiDigJQgbWF0Y2hlcyBsaWtlIGEgc2hlbGwgd2lsZGNhcmQgKCosID8sIFsuLi5dKWAsY1Q9Rih7X19uYW1lOmBVc2FnZVZpZXdgLHNldHVwKGUpe2xldCB0PXN4KCksbj1XKCgpPT50LnVzYWdlKSxyPVcoKCk9PntsZXQgZT17fTtmb3IobGV0IG4gb2YgdC5vdmVydmlldz8uZ3JvdXBzPz9bXSllW24ubmFtZV09bi5tZW1iZXJDb3VudDtyZXR1cm4gZX0pO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUuZ3JvdXBOYW1lPz9gYH1mdW5jdGlvbiBhKGUpe2xldCB0PXIudmFsdWVbZS5pZF07cmV0dXJuIHQ9PT12b2lkIDA/YGA6U3RyaW5nKHQpfWxldHtxdWVyeTpvLG5vcm1hbGl6ZWQ6cyxoYXNRdWVyeTpjfT1MQygpLGw9VygoKT0+e2xldCBlPW4udmFsdWU/Lmdyb3Vwcz8/W107aWYoIWMudmFsdWUpcmV0dXJuIGU7bGV0IHQ9bi52YWx1ZT8udXNlcnM/P1tdO3JldHVybiBlLmZpbHRlcihlPT5NdyhlLHQscy52YWx1ZSkpfSksdT1XKCgpPT5jLnZhbHVlP2wudmFsdWUuZmlsdGVyKGU9PiFrdyhlLHMudmFsdWUpKS5tYXAoZT0+ZS5pZCk6W10pO2Z1bmN0aW9uIGQoZSl7bGV0IHQ9bi52YWx1ZT8udXNlcnM/P1tdO3JldHVybiFjLnZhbHVlfHxrdyhlLHMudmFsdWUpP0F3KGUsdCk6ancoZSx0LHMudmFsdWUpfWxldCBmPVcoKCk9Pm4udmFsdWU/Lmdyb3Vwcy5sZW5ndGg/Yy52YWx1ZT9gbm8gZ3JvdXBzIG1hdGNoICIke28udmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgKSxwPVcoKCk9PntsZXQgZT1uLnZhbHVlPy51c2Vycz8/W107aWYoIWMudmFsdWUpcmV0dXJuIGU7bGV0IHQ9bi52YWx1ZT8uZ3JvdXBzPz9bXSxyPW5ldyBTZXQodC5maWx0ZXIoZT0+a3coZSxzLnZhbHVlKSkubWFwKGU9PmUuaWQpKTtyZXR1cm4gZS5maWx0ZXIoZT0+T3coZSxzLnZhbHVlKXx8ZS5ncm91cE5hbWUhPT12b2lkIDAmJnIuaGFzKGUuZ3JvdXBOYW1lKSl9KSxtPVcoKCk9Pm4udmFsdWU/LnVzZXJzLmxlbmd0aD9jLnZhbHVlP2BubyB1c2VycyBtYXRjaCAiJHtvLnZhbHVlfSJgOmBub25lYDpgbm9uZSBjb25maWd1cmVkYCksaD1FdyhgTmFtZWAsYE1lbWJlcnNgLGEpLGc9TShbXSksXz1CUyh7Z2V0IGRhdGEoKXtyZXR1cm4gbC52YWx1ZX0sZ2V0IGNvbHVtbnMoKXtyZXR1cm4gaH0sZ2V0Q29yZVJvd01vZGVsOmpTKCksZ2V0U29ydGVkUm93TW9kZWw6TVMoKSxvblNvcnRpbmdDaGFuZ2U6ZT0+UVMoZSxnKSxzdGF0ZTp7Z2V0IHNvcnRpbmcoKXtyZXR1cm4gZy52YWx1ZX19fSksdj1XKCgpPT5fLmdldFJvd01vZGVsKCkucm93cykseT1uZXcgU2V0KFtgaWRgLGBzZWNvbmRhcnlgLGByZXFEYXlgLGBjb3N0RGF5YF0pLGI9VygoKT0+Xy5nZXRIZWFkZXJHcm91cHMoKVswXS5oZWFkZXJzLmZpbHRlcihlPT55LmhhcyhlLmNvbHVtbi5pZCkpKSx4PVp0KHttYW51YWxseUV4cGFuZGVkOm5ldyBTZXQsbWFudWFsbHlDb2xsYXBzZWQ6bmV3IFNldH0pLFM9VygoKT0+UkMoeCxjLnZhbHVlLHUudmFsdWUpKTtmdW5jdGlvbiBDKGUpe3pDKHgsZSxTLnZhbHVlLmhhcyhlKSl9bGV0IHc9Vyh7Z2V0OigpPT5BcnJheS5mcm9tKFMudmFsdWUpLHNldDplPT57bGV0IHQ9bmV3IFNldChlKTtmb3IobGV0IGUgb2YgUy52YWx1ZSl0LmhhcyhlKXx8QyhlKTtmb3IobGV0IGUgb2YgdClTLnZhbHVlLmhhcyhlKXx8QyhlKX19KTtFcihvLGU9PntlLnRyaW0oKT09PWBgJiZCQyh4KX0pO2Z1bmN0aW9uIGVlKGUpe3JldHVybi9bKj9bXS8udGVzdChlKX1yZXR1cm4oZSx0KT0+KFIoKSx6KGBkaXZgLE53LFtIKE1DLHttb2RlbFZhbHVlOk4obyksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKG8pP28udmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBGaWx0ZXIgdXNlcnMgb3IgZ3JvdXBzYCxjbGFzczpgbWF4LXctc21gfSxudWxsLDgsW2Btb2RlbFZhbHVlYF0pLG4udmFsdWU/KFIoKSxCKE4ocWIpLHtrZXk6MH0se2RlZmF1bHQ6UCgoKT0+W0goTihYYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzJdfHw9W1UoYFRvdGFsYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzNdfHw9W1UoYFVzYWdlIHN1bW1lZCBhY3Jvc3MgZXZlcnkgdXNlciBhbmQgZ3JvdXAgY29tYmluZWQuYCwtMSldXSksXzoxfSldKSxfOjF9KSxIKE4oSmIpLHtjbGFzczpgZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCB0ZXh0LXNtIHNtOmdyaWQtY29scy00YH0se2RlZmF1bHQ6UCgoKT0+W1YoYGRpdmAsbnVsbCxbdFs0XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFJlcXVlc3RzL2RheWAsLTEpLFYoYHBgLFB3LFtIKGh3LHt2YWx1ZTpuLnZhbHVlLnRvdGFsLnJlcXVlc3RzUGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKV0pXSksVihgZGl2YCxudWxsLFt0WzVdfHw9VihgcGAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgVG9rZW5zIGluL2RheWAsLTEpLFYoYHBgLEZ3LFtIKGh3LHt2YWx1ZTpuLnZhbHVlLnRvdGFsLnRva2Vuc0luUGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKV0pXSksVihgZGl2YCxudWxsLFt0WzZdfHw9VihgcGAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgVG9rZW5zIG91dC9kYXlgLC0xKSxWKGBwYCxJdyxbSChodyx7dmFsdWU6bi52YWx1ZS50b3RhbC50b2tlbnNPdXRQZXJEYXl9LG51bGwsOCxbYHZhbHVlYF0pXSldKSxWKGBkaXZgLG51bGwsW3RbN118fD1WKGBwYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBDb3N0L2RheWAsLTEpLFYoYHBgLEx3LGsoTihhQykobi52YWx1ZS50b3RhbC5jb3N0UGVyRGF5TWljcm9Vc2QpKSwxKV0pXSksXzoxfSldKSxfOjF9KSk6VHMoYGAsITApLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbOF18fD1bVShgR3JvdXBzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzldfHw9W1UoYEV4cGFuZCBhIGdyb3VwIHRvIHNlZSBpdHMgbWVtYmVyIHVzZXJzJyBvd24gdXNhZ2UuYCwtMSldXSksXzoxfSldKSxfOjF9KSxIKE4oSmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W3YudmFsdWUubGVuZ3RoPyhSKCkseihgZGl2YCxSdyxbKFIoITApLHooTCxudWxsLG1hKGIudmFsdWUsZT0+KFIoKSxCKEhTLHtrZXk6ZS5pZCxoZWFkZXI6ZX0sbnVsbCw4LFtgaGVhZGVyYF0pKSksMTI4KSldKSk6VHMoYGAsITApLHYudmFsdWUubGVuZ3RoPyhSKCksQihOKE5DKSx7a2V5OjEsbW9kZWxWYWx1ZTp3LnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzFdfHw9ZT0+dy52YWx1ZT1lLHR5cGU6YG11bHRpcGxlYCxjbGFzczpgcm91bmRlZC1tZCBib3JkZXIgcHgtM2B9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodi52YWx1ZSxlPT4oUigpLEIoTihGQykse2tleTplLm9yaWdpbmFsLmlkLHZhbHVlOmUub3JpZ2luYWwuaWR9LHtkZWZhdWx0OlAoKCk9PltIKE4oSUMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYHNwYW5gLHp3LFtWKGBzcGFuYCxCdyxrKGUub3JpZ2luYWwuaWQpLDEpLFYoYHNwYW5gLFZ3LGsoYShlLm9yaWdpbmFsKXx8YDBgKStgIG1lbWJlcnNgLDEpLFYoYHNwYW5gLEh3LFtlLm9yaWdpbmFsLnN0b3JlRG93bj8oUigpLHooTCx7a2V5OjB9LFtVKGA/YCldLDY0KSk6KFIoKSxCKGh3LHtrZXk6MSx2YWx1ZTplLm9yaWdpbmFsLnJlcXVlc3RzUGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKSksdFsxMF18fD1VKGAgcmVxL2RheSBgLC0xKV0pLFYoYHNwYW5gLFV3LGsoZS5vcmlnaW5hbC5zdG9yZURvd24/YD9gOk4oYUMpKGUub3JpZ2luYWwuY29zdFBlckRheU1pY3JvVXNkKSkrYC9kYXkgYCwxKV0pXSksXzoyfSwxMDI0KSxIKE4oUEMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYGRsYCxXdyxbVihgZGl2YCxudWxsLFtWKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsdGl0bGU6c1R9LGBQcm92aWRlcnNgKSxWKGBkZGAsbnVsbCxbZS5vcmlnaW5hbC5wcm92aWRlcnM/Lmxlbmd0aD8oUigpLHooYGRpdmAsR3csWyhSKCEwKSx6KEwsbnVsbCxtYShlLm9yaWdpbmFsLnByb3ZpZGVycyxlPT4oUigpLEIoTihlQykse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKGUpLDEpXSksXzoyfSwxMDI0KSkpLDEyOCkpXSkpOihSKCkseihgc3BhbmAsS3csYEFsbCBwcm92aWRlcnNgKSldKV0pLFYoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOnNUfSxgTW9kZWxzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwubW9kZWxzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLHF3LFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5tb2RlbHMsZT0+KFIoKSx6KEwse2tleTplfSxbZWUoZSk/KFIoKSxCKE4oZUMpLHtrZXk6MSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpOihSKCksQih4Qyx7a2V5OjAsaWQ6ZX0sbnVsbCw4LFtgaWRgXSkpXSw2NCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLEp3LGBBbGwgbW9kZWxzYCkpXSldKSxWKGBkaXZgLG51bGwsW1YoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTpzVH0sYE1DUCBzZXJ2ZXJzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwubWNwU2VydmVycz8ubGVuZ3RoPyhSKCkseihgZGl2YCxZdyxbKFIoITApLHooTCxudWxsLG1hKGUub3JpZ2luYWwubWNwU2VydmVycyxlPT4oUigpLEIoTihlQykse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKGUpLDEpXSksXzoyfSwxMDI0KSkpLDEyOCkpXSkpOihSKCkseihgc3BhbmAsWHcsYEFsbCBNQ1Agc2VydmVyc2ApKV0pXSksVihgZGl2YCxudWxsLFtWKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsdGl0bGU6c1R9LGBBZ2VudHNgKSxWKGBkZGAsbnVsbCxbZS5vcmlnaW5hbC5hZ2VudHM/Lmxlbmd0aD8oUigpLHooYGRpdmAsWncsWyhSKCEwKSx6KEwsbnVsbCxtYShlLm9yaWdpbmFsLmFnZW50cyxlPT4oUigpLEIoTihlQykse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKGUpLDEpXSksXzoyfSwxMDI0KSkpLDEyOCkpXSkpOihSKCkseihgc3BhbmAsUXcsYEFsbCBhZ2VudHNgKSldKV0pXSksVihgZGxgLCR3LFtWKGBkaXZgLG51bGwsW3RbMTFdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGltaXRzYCwtMSksVihgZGRgLG51bGwsayhOKHlDKShlLm9yaWdpbmFsLmxpbWl0cykpLDEpXSksVihgZGl2YCxudWxsLFt0WzEyXXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHJlcS9taW5gLC0xKSxWKGBkZGAsZVQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoaHcse2tleToxLHZhbHVlOmUub3JpZ2luYWwucmVxdWVzdHNQZXJNaW51dGV9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzEzXXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva0luL2RheWAsLTEpLFYoYGRkYCx0VCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihodyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNJblBlckRheX0sbnVsbCw4LFtgdmFsdWVgXSkpXSldKSxWKGBkaXZgLG51bGwsW3RbMTRdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgdG9rT3V0L2RheWAsLTEpLFYoYGRkYCxuVCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihodyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNPdXRQZXJEYXl9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE1XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva0luL21vbnRoYCwtMSksVihgZGRgLHJULFtlLm9yaWdpbmFsLnN0b3JlRG93bj8oUigpLHooTCx7a2V5OjB9LFtVKGA/YCldLDY0KSk6KFIoKSxCKGh3LHtrZXk6MSx2YWx1ZTplLm9yaWdpbmFsLnRva2Vuc0luUGVyTW9udGh9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE2XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva091dC9tb250aGAsLTEpLFYoYGRkYCxpVCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihodyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNPdXRQZXJNb250aH0sbnVsbCw4LFtgdmFsdWVgXSkpXSldKSxWKGBkaXZgLG51bGwsW3RbMTddfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgY29zdC9tb250aGAsLTEpLFYoYGRkYCxhVCxrKGUub3JpZ2luYWwuc3RvcmVEb3duP2A/YDpOKGFDKShlLm9yaWdpbmFsLmNvc3RQZXJNb250aE1pY3JvVXNkKSksMSldKV0pLHRbMThdfHw9VihgcGAse2NsYXNzOmBtYi0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTWVtYmVyc2AsLTEpLEgoRHcseyJpZC1sYWJlbCI6YE5hbWVgLCJzZWNvbmRhcnktY29sdW1uLWxhYmVsIjpgR3JvdXBgLGVudHJpZXM6ZChlLm9yaWdpbmFsKSwic2Vjb25kYXJ5LXZhbHVlIjppfSxudWxsLDgsW2BlbnRyaWVzYF0pXSksXzoyfSwxMDI0KV0pLF86Mn0sMTAzMixbYHZhbHVlYF0pKSksMTI4KSldKSxfOjF9LDgsW2Btb2RlbFZhbHVlYF0pKTooUigpLHooYHBgLG9ULGsoZi52YWx1ZSksMSkpXSksXzoxfSldKSxfOjF9KSxIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzE5XXx8PVtVKGBVc2Vyc2AsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKER3LHsiaWQtbGFiZWwiOmBOYW1lYCwic2Vjb25kYXJ5LWNvbHVtbi1sYWJlbCI6YEdyb3VwYCxlbnRyaWVzOnAudmFsdWUsInNlY29uZGFyeS12YWx1ZSI6aSwiZW1wdHktbWVzc2FnZSI6bS52YWx1ZX0sbnVsbCw4LFtgZW50cmllc2AsYGVtcHR5LW1lc3NhZ2VgXSldKSxfOjF9KV0pLF86MX0pXSkpfX0pO2Z1bmN0aW9uIGxUKGUsdCxuKXtsZXQgcj1lLnN0YXJ0c1dpdGgoYCNgKT9lLnNsaWNlKDEpOmU7cmV0dXJuIHQuaW5jbHVkZXMocik/cjpufWZ1bmN0aW9uIHVUKGUpe3JldHVybmAjJHtlfWB9ZnVuY3Rpb24gZFQoe3ZhbGlkVGFiczplLGRlZmF1bHRUYWI6dH0pe2xldCBuPXR5cGVvZiB3aW5kb3c8YHVgLHI9TShuP2xUKHdpbmRvdy5sb2NhdGlvbi5oYXNoLGUsdCk6dCk7RXIocixlPT57aWYoIW4pcmV0dXJuO2xldCB0PXVUKGUpO3dpbmRvdy5sb2NhdGlvbi5oYXNoIT09dCYmd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsYGAsdCl9KTtmdW5jdGlvbiBpKCl7ci52YWx1ZT1sVCh3aW5kb3cubG9jYXRpb24uaGFzaCxlLHQpfXJldHVybiBuJiYoWmkoKCk9PndpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBoYXNoY2hhbmdlYCxpKSksdGEoKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGBoYXNoY2hhbmdlYCxpKSkpLHJ9dmFyIGZUPShmdW5jdGlvbigpe2xldCBlPXR5cGVvZiBkb2N1bWVudDxgdWAmJmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGxpbmtgKS5yZWxMaXN0O3JldHVybiBlJiZlLnN1cHBvcnRzJiZlLnN1cHBvcnRzKGBtb2R1bGVwcmVsb2FkYCk/YG1vZHVsZXByZWxvYWRgOmBwcmVsb2FkYH0pKCkscFQ9ZnVuY3Rpb24oZSl7cmV0dXJuYC9hZG1pbi9gK2V9LG1UPXt9LGhUPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1Qcm9taXNlLnJlc29sdmUoKTtpZih0JiZ0Lmxlbmd0aD4wKXtsZXQgZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShgbGlua2ApLGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbWV0YVtwcm9wZXJ0eT1jc3Atbm9uY2VdYCksYT1pPy5ub25jZXx8aT8uZ2V0QXR0cmlidXRlKGBub25jZWApO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUubWFwKGU9PlByb21pc2UucmVzb2x2ZShlKS50aGVuKGU9Pih7c3RhdHVzOmBmdWxmaWxsZWRgLHZhbHVlOmV9KSxlPT4oe3N0YXR1czpgcmVqZWN0ZWRgLHJlYXNvbjplfSkpKSl9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gaW1wb3J0Lm1ldGEucmVzb2x2ZT9pbXBvcnQubWV0YS5yZXNvbHZlKGUpOm5ldyBVUkwoZSxpbXBvcnQubWV0YS51cmwpLmhyZWZ9cj1vKHQubWFwKHQ9PntpZih0PXBUKHQsbiksdD1zKHQpLHQgaW4gbVQpcmV0dXJuO21UW3RdPSEwO2xldCByPXQuZW5kc1dpdGgoYC5jc3NgKTtmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7bGV0IGk9ZVtuXTtpZihpLmhyZWY9PT10JiYoIXJ8fGkucmVsPT09YHN0eWxlc2hlZXRgKSlyZXR1cm59bGV0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgbGlua2ApO2lmKGkucmVsPXI/YHN0eWxlc2hlZXRgOmZULHJ8fChpLmFzPWBzY3JpcHRgKSxpLmNyb3NzT3JpZ2luPWBgLGkuaHJlZj10LGEmJmkuc2V0QXR0cmlidXRlKGBub25jZWAsYSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChpKSxyKXJldHVybiBuZXcgUHJvbWlzZSgoZSxuKT0+e2kuYWRkRXZlbnRMaXN0ZW5lcihgbG9hZGAsZSksaS5hZGRFdmVudExpc3RlbmVyKGBlcnJvcmAsKCk9Pm4oRXJyb3IoYFVuYWJsZSB0byBwcmVsb2FkIENTUyBmb3IgJHt0fWApKSl9KX0pKX1mdW5jdGlvbiBpKGUpe2xldCB0PW5ldyBFdmVudChgdml0ZTpwcmVsb2FkRXJyb3JgLHtjYW5jZWxhYmxlOiEwfSk7aWYodC5wYXlsb2FkPWUsd2luZG93LmRpc3BhdGNoRXZlbnQodCksIXQuZGVmYXVsdFByZXZlbnRlZCl0aHJvdyBlfXJldHVybiByLnRoZW4odD0+e2ZvcihsZXQgZSBvZiB0fHxbXSllLnN0YXR1cz09PWByZWplY3RlZGAmJmkoZS5yZWFzb24pO3JldHVybiBlKCkuY2F0Y2goaSl9KX0sZ1Q9e2NsYXNzOmBmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAtNiBweC00IHB5LTggc206cHgtNiBsZzpweC04YH0sX1Q9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC0xYH0sdlQ9e2NsYXNzOmBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJgfSx5VD17Y2xhc3M6YGZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxiVD1gaHR0cHM6Ly9naXRodWIuY29tL2x1a2FzenJhY3p5bG8vdHJhZWZpay1sbG1nYXRld2F5YCx4VD1odShGKHtfX25hbWU6YEFwcGAsc2V0dXAoZSl7bGV0IHQ9TGkoKCk9PmhUKCgpPT5pbXBvcnQoYC4vQ2hhcnRzVmlldy1CVm9jSnNyeS5qc2ApLFtdKSksbj1yeCgpLHI9c3goKSxpPWRUKHt2YWxpZFRhYnM6W2Bwcm92aWRlcnNgLGB1c2FnZWAsYGNoYXJ0c2AsYHRhcmdldHNgXSxkZWZhdWx0VGFiOmBwcm92aWRlcnNgfSksYT1XKCgpPT5yLmVycm9yP2ByZWZyZXNoIGZhaWxlZDogJHtyLmVycm9yfWA6ci5sYXN0VXBkYXRlZD9gbGFzdCB1cGRhdGVkICR7ci5sYXN0VXBkYXRlZC50b0xvY2FsZVRpbWVTdHJpbmcoKX1gOmBsb2FkaW5nLi4uYCk7cmV0dXJuIFppKCgpPT57ci5zdGFydFBvbGxpbmcoKX0pLChlLG8pPT57bGV0IHM9Y2EoYEZvbnRBd2Vzb21lSWNvbmApO3JldHVybiBSKCkseihgZGl2YCxnVCxbVihgaGVhZGVyYCxfVCxbVihgZGl2YCx2VCxbb1sxXXx8PVYoYGgxYCx7Y2xhc3M6YHRleHQteGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodGB9LGBMTE0gR2F0ZXdheSDigJQgQWRtaW5gLC0xKSxIKE4oV2IpLHthczpgYWAsaHJlZjpiVCx0YXJnZXQ6YF9ibGFua2AscmVsOmBub29wZW5lciBub3JlZmVycmVyYCx2YXJpYW50OmBnaG9zdGAsc2l6ZTpgaWNvbmAsImFyaWEtbGFiZWwiOmBHaXRIdWIgcmVwb3NpdG9yeWAsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChzLHtpY29uOk4ocl8pLGNsYXNzOmBzaXplLTRgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSldKSxWKGBwYCx5VCxbTihyKS5lcnJvcj8oUigpLEIocyx7a2V5OjAsaWNvbjpOKHVfKSxjbGFzczpgc2l6ZS0zLjUgdGV4dC1kZXN0cnVjdGl2ZWB9LG51bGwsOCxbYGljb25gXSkpOlRzKGBgLCEwKSxWKGBzcGFuYCx7Y2xhc3M6TyhOKHIpLmVycm9yP2B0ZXh0LWRlc3RydWN0aXZlYDp2b2lkIDApfSxrKGEudmFsdWUpLDMpXSldKSxOKG4pLmlzQXV0aGVudGljYXRlZD8oUigpLEIoTihidykse2tleToxLG1vZGVsVmFsdWU6TihpKSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6b1swXXx8PWU9PmooaSk/aS52YWx1ZT1lOm51bGx9LHtkZWZhdWx0OlAoKCk9PltIKE4oU3cpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihDdykse3ZhbHVlOmBwcm92aWRlcnNgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1syXXx8PVtVKGBQcm92aWRlcnNgLC0xKV1dKSxfOjF9KSxIKE4oQ3cpLHt2YWx1ZTpgdXNhZ2VgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1szXXx8PVtVKGBVc2FnZWAsLTEpXV0pLF86MX0pLEgoTihDdykse3ZhbHVlOmBjaGFydHNgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1s0XXx8PVtVKGBDaGFydHNgLC0xKV1dKSxfOjF9KSxIKE4oQ3cpLHt2YWx1ZTpgdGFyZ2V0c2B9LHtkZWZhdWx0OlAoKCk9PlsuLi5vWzVdfHw9W1UoYE1DUCAmIEFnZW50c2AsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKHh3KSx7dmFsdWU6YHByb3ZpZGVyc2B9LHtkZWZhdWx0OlAoKCk9PltIKGR3KV0pLF86MX0pLEgoTih4dykse3ZhbHVlOmB1c2FnZWB9LHtkZWZhdWx0OlAoKCk9PltIKGNUKV0pLF86MX0pLEgoTih4dykse3ZhbHVlOmBjaGFydHNgfSx7ZGVmYXVsdDpQKCgpPT5bSChOKHQpKV0pLF86MX0pLEgoTih4dykse3ZhbHVlOmB0YXJnZXRzYH0se2RlZmF1bHQ6UCgoKT0+W0goeXcpXSksXzoxfSldKSxfOjF9LDgsW2Btb2RlbFZhbHVlYF0pKTooUigpLEIoZ3gse2tleTowfSkpXSl9fX0pKTt4VC51c2UoSGcoKSkseFQuY29tcG9uZW50KGBGb250QXdlc29tZUljb25gLHdnKSx4VC5tb3VudChgI2FwcGApO2V4cG9ydHtWciBhcyAkLGt5IGFzIEEsWnQgYXMgQXQsVHkgYXMgQixnZSBhcyBCdCxxeSBhcyBDLHdyIGFzIEN0LFZ5IGFzIEQsb24gYXMgRHQsVXkgYXMgRSxGZSBhcyBFdCxieSBhcyBGLHluIGFzIEZ0LFogYXMgRyxzeSBhcyBILGZ5IGFzIEksbW4gYXMgSXQsY18gYXMgSixkXyBhcyBLLGd5IGFzIEwsTiBhcyBMdCxGeSBhcyBNLGVuIGFzIE10LEl5IGFzIE4sdW4gYXMgTnQsTnkgYXMgTyxqIGFzIE90LGR5IGFzIFAsQSBhcyBQdCxMIGFzIFEsQ3kgYXMgUixPIGFzIFJ0LFl5IGFzIFMsQ3IgYXMgU3QsR3kgYXMgVCxyYyBhcyBUdCxveSBhcyBVLGN5IGFzIFYsayBhcyBWdCxheSBhcyBXLHdnIGFzIFgsbl8gYXMgWSxhdSBhcyBaLEpiIGFzIF8sbWEgYXMgX3QsYncgYXMgYSxVIGFzIGF0LG5iIGFzIGIsYWMgYXMgYnQsYkMgYXMgYyxTcyBhcyBjdCxzeCBhcyBkLGtzIGFzIGR0LFcgYXMgZXQsaXggYXMgZixRbiBhcyBmdCxYYiBhcyBnLFIgYXMgZ3QsWmIgYXMgaCx0YSBhcyBodCxTdyBhcyBpLHogYXMgaXQsQXkgYXMgaixNIGFzIGp0LE95IGFzIGssSWUgYXMga3Qsc0MgYXMgbCx0YyBhcyBsdCxyeCBhcyBtLFppIGFzIG10LE93IGFzIG4sQiBhcyBudCxMQyBhcyBvLEggYXMgb3QsYXggYXMgcCxlYSBhcyBwdCxoXyBhcyBxLEN3IGFzIHIsVHMgYXMgcnQsTUMgYXMgcyxGIGFzIHN0LE13IGFzIHQsViBhcyB0dCxvQyBhcyB1LFBhIGFzIHV0LHFiIGFzIHYsSSBhcyB2dCxLeSBhcyB3LFAgYXMgd3QsJHkgYXMgeCxFciBhcyB4dCx3YiBhcyB5LHVhIGFzIHl0LHd5IGFzIHoseGUgYXMgenR9Ow==", + "dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5LHQ9KHQsbik9PntsZXQgcj17fTtmb3IodmFyIGkgaW4gdCllKHIsaSx7Z2V0OnRbaV0sZW51bWVyYWJsZTohMH0pO3JldHVybiBufHxlKHIsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpgTW9kdWxlYH0pLHJ9O2Z1bmN0aW9uIG4oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG4gb2YgZS5zcGxpdChgLGApKXRbbl09MTtyZXR1cm4gZT0+ZSBpbiB0fXZhciByPXt9LGk9W10sYT0oKT0+e30sbz0oKT0+ITEscz1lPT5lLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmUuY2hhckNvZGVBdCgxKT09PTExMCYmKGUuY2hhckNvZGVBdCgyKT4xMjJ8fGUuY2hhckNvZGVBdCgyKTw5NyksYz1lPT5lLnN0YXJ0c1dpdGgoYG9uVXBkYXRlOmApLGw9T2JqZWN0LmFzc2lnbix1PShlLHQpPT57bGV0IG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9LGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmPShlLHQpPT5kLmNhbGwoZSx0KSxwPUFycmF5LmlzQXJyYXksbT1lPT53KGUpPT09YFtvYmplY3QgTWFwXWAsaD1lPT53KGUpPT09YFtvYmplY3QgU2V0XWAsZz1lPT53KGUpPT09YFtvYmplY3QgRGF0ZV1gLF89ZT0+dyhlKT09PWBbb2JqZWN0IFJlZ0V4cF1gLHY9ZT0+dHlwZW9mIGU9PWBmdW5jdGlvbmAseT1lPT50eXBlb2YgZT09YHN0cmluZ2AsYj1lPT50eXBlb2YgZT09YHN5bWJvbGAseD1lPT50eXBlb2YgZT09YG9iamVjdGAmJiEhZSxTPWU9Pih4KGUpfHx2KGUpKSYmdihlLnRoZW4pJiZ2KGUuY2F0Y2gpLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx3PWU9PkMuY2FsbChlKSxlZT1lPT53KGUpLnNsaWNlKDgsLTEpLHRlPWU9PncoZSk9PT1gW29iamVjdCBPYmplY3RdYCxUPWU9PnkoZSkmJmUhPT1gTmFOYCYmZVswXSE9PWAtYCYmYGArcGFyc2VJbnQoZSwxMCk9PT1lLG5lPW4oYCxrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkYCkscmU9ZT0+e2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuKG49PnRbbl18fCh0W25dPWUobikpKX0saWU9Ly1cdy9nLEU9cmUoZT0+ZS5yZXBsYWNlKGllLGU9PmUuc2xpY2UoMSkudG9VcHBlckNhc2UoKSkpLGFlPS9cQihbQS1aXSkvZyxvZT1yZShlPT5lLnJlcGxhY2UoYWUsYC0kMWApLnRvTG93ZXJDYXNlKCkpLHNlPXJlKGU9PmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSksY2U9cmUoZT0+ZT9gb24ke3NlKGUpfWA6YGApLEQ9KGUsdCk9PiFPYmplY3QuaXMoZSx0KSxsZT0oZSwuLi50KT0+e2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oLi4udCl9LHVlPShlLHQsbixyPSExKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOnIsdmFsdWU6bn0pfSxkZT1lPT57bGV0IHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fSxmZT1lPT57bGV0IHQ9eShlKT9OdW1iZXIoZSk6TmFOO3JldHVybiBpc05hTih0KT9lOnR9LHBlLG1lPSgpPT5wZXx8PXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPGB1YD9zZWxmOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6e30saGU9bihgSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3IsU3ltYm9sYCk7ZnVuY3Rpb24gZ2UoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0saT15KHIpP2JlKHIpOmdlKHIpO2lmKGkpZm9yKGxldCBlIGluIGkpdFtlXT1pW2VdfXJldHVybiB0fWlmKHkoZSl8fHgoZSkpcmV0dXJuIGV9dmFyIF9lPS87KD8hW14oXSpcKSkvZyx2ZT0vOihbXl0rKS8seWU9L1wvXCpbXl0qP1wqXC8vZztmdW5jdGlvbiBiZShlKXtsZXQgdD17fTtyZXR1cm4gZS5yZXBsYWNlKHllLGBgKS5zcGxpdChfZSkuZm9yRWFjaChlPT57aWYoZSl7bGV0IG49ZS5zcGxpdCh2ZSk7bi5sZW5ndGg+MSYmKHRbblswXS50cmltKCldPW5bMV0udHJpbSgpKX19KSx0fWZ1bmN0aW9uIE8oZSl7bGV0IHQ9YGA7aWYoeShlKSl0PWU7ZWxzZSBpZihwKGUpKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1PKGVbbl0pO3ImJih0Kz1yK2AgYCl9ZWxzZSBpZih4KGUpKWZvcihsZXQgbiBpbiBlKWVbbl0mJih0Kz1uK2AgYCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIHhlKGUpe2lmKCFlKXJldHVybiBudWxsO2xldHtjbGFzczp0LHN0eWxlOm59PWU7cmV0dXJuIHQmJiF5KHQpJiYoZS5jbGFzcz1PKHQpKSxuJiYoZS5zdHlsZT1nZShuKSksZX12YXIgU2U9YGl0ZW1zY29wZSxhbGxvd2Z1bGxzY3JlZW4sZm9ybW5vdmFsaWRhdGUsaXNtYXAsbm9tb2R1bGUsbm92YWxpZGF0ZSxyZWFkb25seWAsQ2U9bihTZSk7U2UrYGA7ZnVuY3Rpb24gd2UoZSl7cmV0dXJuISFlfHxlPT09YGB9ZnVuY3Rpb24gVGUoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2xldCBuPSEwO2ZvcihsZXQgcj0wO24mJnI8ZS5sZW5ndGg7cisrKW49RWUoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBFZShlLHQpe2lmKGU9PT10KXJldHVybiEwO2xldCBuPWcoZSkscj1nKHQpO2lmKG58fHIpcmV0dXJuIG4mJnI/ZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTohMTtpZihuPWIoZSkscj1iKHQpLG58fHIpcmV0dXJuIGU9PT10O2lmKG49cChlKSxyPXAodCksbnx8cilyZXR1cm4gbiYmcj9UZShlLHQpOiExO2lmKG49eChlKSxyPXgodCksbnx8cil7aWYoIW58fCFyfHxPYmplY3Qua2V5cyhlKS5sZW5ndGghPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuIGluIGUpe2xldCByPWUuaGFzT3duUHJvcGVydHkobiksaT10Lmhhc093blByb3BlcnR5KG4pO2lmKHImJiFpfHwhciYmaXx8IUVlKGVbbl0sdFtuXSkpcmV0dXJuITF9fXJldHVybiBTdHJpbmcoZSk9PT1TdHJpbmcodCl9ZnVuY3Rpb24gRGUoZSx0KXtyZXR1cm4gZS5maW5kSW5kZXgoZT0+RWUoZSx0KSl9dmFyIE9lPWU9PiEhKGUmJmUuX192X2lzUmVmPT09ITApLGs9ZT0+eShlKT9lOmU9PW51bGw/YGA6cChlKXx8eChlKSYmKGUudG9TdHJpbmc9PT1DfHwhdihlLnRvU3RyaW5nKSk/T2UoZSk/ayhlLnZhbHVlKTpKU09OLnN0cmluZ2lmeShlLGtlLDIpOlN0cmluZyhlKSxrZT0oZSx0KT0+T2UodCk/a2UoZSx0LnZhbHVlKTptKHQpP3tbYE1hcCgke3Quc2l6ZX0pYF06Wy4uLnQuZW50cmllcygpXS5yZWR1Y2UoKGUsW3Qsbl0scik9PihlW0FlKHQscikrYCA9PmBdPW4sZSkse30pfTpoKHQpP3tbYFNldCgke3Quc2l6ZX0pYF06Wy4uLnQudmFsdWVzKCldLm1hcChlPT5BZShlKSl9OmIodCk/QWUodCk6eCh0KSYmIXAodCkmJiF0ZSh0KT9TdHJpbmcodCk6dCxBZT0oZSx0PWBgKT0+YihlKT9gU3ltYm9sKCR7ZS5kZXNjcmlwdGlvbj8/dH0pYDplO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlPT1udWxsP2Bpbml0aWFsYDp0eXBlb2YgZT09YHN0cmluZ2A/ZT09PWBgP2AgYDplOlN0cmluZyhlKX12YXIgTWUsTmU9Y2xhc3N7Y29uc3RydWN0b3IoZT0hMSl7dGhpcy5kZXRhY2hlZD1lLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9vbj0wLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMuX2lzUGF1c2VkPSExLHRoaXMuX3dhcm5PblJ1bj0hMCx0aGlzLl9fdl9za2lwPSEwLCFlJiZNZSYmKE1lLmFjdGl2ZT8odGhpcy5wYXJlbnQ9TWUsdGhpcy5pbmRleD0oTWUuc2NvcGVzfHwoTWUuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKToodGhpcy5fYWN0aXZlPSExLHRoaXMuX3dhcm5PblJ1bj0hMSkpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXBhdXNlKCl7aWYodGhpcy5fYWN0aXZlKXt0aGlzLl9pc1BhdXNlZD0hMDtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucGF1c2UoKX1mb3IoZT0wLHQ9dGhpcy5lZmZlY3RzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZWZmZWN0c1tlXS5wYXVzZSgpfX1yZXN1bWUoKXtpZih0aGlzLl9hY3RpdmUmJnRoaXMuX2lzUGF1c2VkKXt0aGlzLl9pc1BhdXNlZD0hMTtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucmVzdW1lKCl9bGV0IG49dGhpcy5lZmZlY3RzLnNsaWNlKCk7Zm9yKGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspbltlXS5yZXN1bWUoKX19cnVuKGUpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IHQ9TWU7dHJ5e3JldHVybiBNZT10aGlzLGUoKX1maW5hbGx5e01lPXR9fX1vbigpeysrdGhpcy5fb249PT0xJiYodGhpcy5wcmV2U2NvcGU9TWUsTWU9dGhpcyl9b2ZmKCl7aWYodGhpcy5fb24+MCYmLS10aGlzLl9vbj09PTApe2lmKE1lPT09dGhpcylNZT10aGlzLnByZXZTY29wZTtlbHNle2xldCBlPU1lO2Zvcig7ZTspe2lmKGUucHJldlNjb3BlPT09dGhpcyl7ZS5wcmV2U2NvcGU9dGhpcy5wcmV2U2NvcGU7YnJlYWt9ZT1lLnByZXZTY29wZX19dGhpcy5wcmV2U2NvcGU9dm9pZCAwfX1zdG9wKGUpe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fYWN0aXZlPSExO2xldCB0LG47Zm9yKHQ9MCxuPXRoaXMuZWZmZWN0cy5sZW5ndGg7dDxuO3QrKyl0aGlzLmVmZmVjdHNbdF0uc3RvcCgpO2Zvcih0aGlzLmVmZmVjdHMubGVuZ3RoPTAsdD0wLG49dGhpcy5jbGVhbnVwcy5sZW5ndGg7dDxuO3QrKyl0aGlzLmNsZWFudXBzW3RdKCk7aWYodGhpcy5jbGVhbnVwcy5sZW5ndGg9MCx0aGlzLnNjb3Blcyl7bGV0IGU9dGhpcy5zY29wZXMuc2xpY2UoKTtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnN0b3AoITApO3RoaXMuc2NvcGVzLmxlbmd0aD0wfWlmKCF0aGlzLmRldGFjaGVkJiZ0aGlzLnBhcmVudCYmIWUpe2xldCBlPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtlJiZlIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1lLGUuaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwfX19O2Z1bmN0aW9uIFBlKGUpe3JldHVybiBuZXcgTmUoZSl9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gTWV9ZnVuY3Rpb24gSWUoZSx0PSExKXtNZSYmTWUuY2xlYW51cHMucHVzaChlKX12YXIgTGUsUmU9bmV3IFdlYWtTZXQsemU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5mbj1lLHRoaXMuZGVwcz12b2lkIDAsdGhpcy5kZXBzVGFpbD12b2lkIDAsdGhpcy5mbGFncz01LHRoaXMubmV4dD12b2lkIDAsdGhpcy5jbGVhbnVwPXZvaWQgMCx0aGlzLnNjaGVkdWxlcj12b2lkIDAsTWUmJihNZS5hY3RpdmU/TWUuZWZmZWN0cy5wdXNoKHRoaXMpOnRoaXMuZmxhZ3MmPS0yKX1wYXVzZSgpe3RoaXMuZmxhZ3N8PTY0fXJlc3VtZSgpe3RoaXMuZmxhZ3MmNjQmJih0aGlzLmZsYWdzJj0tNjUsUmUuaGFzKHRoaXMpJiYoUmUuZGVsZXRlKHRoaXMpLHRoaXMudHJpZ2dlcigpKSl9bm90aWZ5KCl7dGhpcy5mbGFncyYyJiYhKHRoaXMuZmxhZ3MmMzIpfHx0aGlzLmZsYWdzJjh8fFVlKHRoaXMpfXJ1bigpe2lmKCEodGhpcy5mbGFncyYxKSlyZXR1cm4gdGhpcy5mbigpO3RoaXMuZmxhZ3N8PTIsaXQodGhpcyksS2UodGhpcyk7bGV0IGU9TGUsdD1ldDtMZT10aGlzLGV0PSEwO3RyeXtyZXR1cm4gdGhpcy5mbigpfWZpbmFsbHl7cWUodGhpcyksTGU9ZSxldD10LHRoaXMuZmxhZ3MmPS0zfX1zdG9wKCl7aWYodGhpcy5mbGFncyYxKXtmb3IobGV0IGU9dGhpcy5kZXBzO2U7ZT1lLm5leHREZXApWGUoZSk7dGhpcy5kZXBzPXRoaXMuZGVwc1RhaWw9dm9pZCAwLGl0KHRoaXMpLHRoaXMub25TdG9wJiZ0aGlzLm9uU3RvcCgpLHRoaXMuZmxhZ3MmPS0yfX10cmlnZ2VyKCl7dGhpcy5mbGFncyY2ND9SZS5hZGQodGhpcyk6dGhpcy5zY2hlZHVsZXI/dGhpcy5zY2hlZHVsZXIoKTp0aGlzLnJ1bklmRGlydHkoKX1ydW5JZkRpcnR5KCl7SmUodGhpcykmJnRoaXMucnVuKCl9Z2V0IGRpcnR5KCl7cmV0dXJuIEplKHRoaXMpfX0sQmU9MCxWZSxIZTtmdW5jdGlvbiBVZShlLHQ9ITEpe2lmKGUuZmxhZ3N8PTgsdCl7ZS5uZXh0PUhlLEhlPWU7cmV0dXJufWUubmV4dD1WZSxWZT1lfWZ1bmN0aW9uIFdlKCl7QmUrK31mdW5jdGlvbiBHZSgpe2lmKC0tQmU+MClyZXR1cm47aWYoSGUpe2xldCBlPUhlO2ZvcihIZT12b2lkIDA7ZTspe2xldCB0PWUubmV4dDtlLm5leHQ9dm9pZCAwLGUuZmxhZ3MmPS05LGU9dH19bGV0IGU7Zm9yKDtWZTspe2xldCB0PVZlO2ZvcihWZT12b2lkIDA7dDspe2xldCBuPXQubmV4dDtpZih0Lm5leHQ9dm9pZCAwLHQuZmxhZ3MmPS05LHQuZmxhZ3MmMSl0cnl7dC50cmlnZ2VyKCl9Y2F0Y2godCl7ZXx8PXR9dD1ufX1pZihlKXRocm93IGV9ZnVuY3Rpb24gS2UoZSl7Zm9yKGxldCB0PWUuZGVwczt0O3Q9dC5uZXh0RGVwKXQudmVyc2lvbj0tMSx0LnByZXZBY3RpdmVMaW5rPXQuZGVwLmFjdGl2ZUxpbmssdC5kZXAuYWN0aXZlTGluaz10fWZ1bmN0aW9uIHFlKGUpe2xldCB0LG49ZS5kZXBzVGFpbCxyPW47Zm9yKDtyOyl7bGV0IGU9ci5wcmV2RGVwO3IudmVyc2lvbj09PS0xPyhyPT09biYmKG49ZSksWGUociksWmUocikpOnQ9cixyLmRlcC5hY3RpdmVMaW5rPXIucHJldkFjdGl2ZUxpbmssci5wcmV2QWN0aXZlTGluaz12b2lkIDAscj1lfWUuZGVwcz10LGUuZGVwc1RhaWw9bn1mdW5jdGlvbiBKZShlKXtmb3IobGV0IHQ9ZS5kZXBzO3Q7dD10Lm5leHREZXApaWYodC5kZXAudmVyc2lvbiE9PXQudmVyc2lvbnx8dC5kZXAuY29tcHV0ZWQmJihZZSh0LmRlcC5jb21wdXRlZCl8fHQuZGVwLnZlcnNpb24hPT10LnZlcnNpb24pKXJldHVybiEwO3JldHVybiEhZS5fZGlydHl9ZnVuY3Rpb24gWWUoZSl7aWYoZS5mbGFncyY0JiYhKGUuZmxhZ3MmMTYpfHwoZS5mbGFncyY9LTE3LGUuZ2xvYmFsVmVyc2lvbj09PWF0KXx8KGUuZ2xvYmFsVmVyc2lvbj1hdCwhZS5pc1NTUiYmZS5mbGFncyYxMjgmJighZS5kZXBzJiYhZS5fZGlydHl8fCFKZShlKSkpKXJldHVybjtlLmZsYWdzfD0yO2xldCB0PWUuZGVwLG49TGUscj1ldDtMZT1lLGV0PSEwO3RyeXtLZShlKTtsZXQgbj1lLmZuKGUuX3ZhbHVlKTsodC52ZXJzaW9uPT09MHx8RChuLGUuX3ZhbHVlKSkmJihlLmZsYWdzfD0xMjgsZS5fdmFsdWU9bix0LnZlcnNpb24rKyl9Y2F0Y2goZSl7dGhyb3cgdC52ZXJzaW9uKyssZX1maW5hbGx5e0xlPW4sZXQ9cixxZShlKSxlLmZsYWdzJj0tM319ZnVuY3Rpb24gWGUoZSx0PSExKXtsZXR7ZGVwOm4scHJldlN1YjpyLG5leHRTdWI6aX09ZTtpZihyJiYoci5uZXh0U3ViPWksZS5wcmV2U3ViPXZvaWQgMCksaSYmKGkucHJldlN1Yj1yLGUubmV4dFN1Yj12b2lkIDApLG4uc3Vicz09PWUmJihuLnN1YnM9ciwhciYmbi5jb21wdXRlZCkpe24uY29tcHV0ZWQuZmxhZ3MmPS01O2ZvcihsZXQgZT1uLmNvbXB1dGVkLmRlcHM7ZTtlPWUubmV4dERlcClYZShlLCEwKX0hdCYmIS0tbi5zYyYmbi5tYXAmJm4ubWFwLmRlbGV0ZShuLmtleSl9ZnVuY3Rpb24gWmUoZSl7bGV0e3ByZXZEZXA6dCxuZXh0RGVwOm59PWU7dCYmKHQubmV4dERlcD1uLGUucHJldkRlcD12b2lkIDApLG4mJihuLnByZXZEZXA9dCxlLm5leHREZXA9dm9pZCAwKX1mdW5jdGlvbiBRZShlLHQpe2UuZWZmZWN0IGluc3RhbmNlb2YgemUmJihlPWUuZWZmZWN0LmZuKTtsZXQgbj1uZXcgemUoZSk7dCYmbChuLHQpO3RyeXtuLnJ1bigpfWNhdGNoKGUpe3Rocm93IG4uc3RvcCgpLGV9bGV0IHI9bi5ydW4uYmluZChuKTtyZXR1cm4gci5lZmZlY3Q9bixyfWZ1bmN0aW9uICRlKGUpe2UuZWZmZWN0LnN0b3AoKX12YXIgZXQ9ITAsdHQ9W107ZnVuY3Rpb24gbnQoKXt0dC5wdXNoKGV0KSxldD0hMX1mdW5jdGlvbiBydCgpe2xldCBlPXR0LnBvcCgpO2V0PWU9PT12b2lkIDB8fGV9ZnVuY3Rpb24gaXQoZSl7bGV0e2NsZWFudXA6dH09ZTtpZihlLmNsZWFudXA9dm9pZCAwLHQpe2xldCBlPUxlO0xlPXZvaWQgMDt0cnl7dCgpfWZpbmFsbHl7TGU9ZX19fXZhciBhdD0wLG90PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zdWI9ZSx0aGlzLmRlcD10LHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5uZXh0RGVwPXRoaXMucHJldkRlcD10aGlzLm5leHRTdWI9dGhpcy5wcmV2U3ViPXRoaXMucHJldkFjdGl2ZUxpbms9dm9pZCAwfX0sc3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jb21wdXRlZD1lLHRoaXMudmVyc2lvbj0wLHRoaXMuYWN0aXZlTGluaz12b2lkIDAsdGhpcy5zdWJzPXZvaWQgMCx0aGlzLm1hcD12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMuc2M9MCx0aGlzLl9fdl9za2lwPSEwfXRyYWNrKGUpe2lmKCFMZXx8IWV0fHxMZT09PXRoaXMuY29tcHV0ZWQpcmV0dXJuO2xldCB0PXRoaXMuYWN0aXZlTGluaztpZih0PT09dm9pZCAwfHx0LnN1YiE9PUxlKXQ9dGhpcy5hY3RpdmVMaW5rPW5ldyBvdChMZSx0aGlzKSxMZS5kZXBzPyh0LnByZXZEZXA9TGUuZGVwc1RhaWwsTGUuZGVwc1RhaWwubmV4dERlcD10LExlLmRlcHNUYWlsPXQpOkxlLmRlcHM9TGUuZGVwc1RhaWw9dCxjdCh0KTtlbHNlIGlmKHQudmVyc2lvbj09PS0xJiYodC52ZXJzaW9uPXRoaXMudmVyc2lvbix0Lm5leHREZXApKXtsZXQgZT10Lm5leHREZXA7ZS5wcmV2RGVwPXQucHJldkRlcCx0LnByZXZEZXAmJih0LnByZXZEZXAubmV4dERlcD1lKSx0LnByZXZEZXA9TGUuZGVwc1RhaWwsdC5uZXh0RGVwPXZvaWQgMCxMZS5kZXBzVGFpbC5uZXh0RGVwPXQsTGUuZGVwc1RhaWw9dCxMZS5kZXBzPT09dCYmKExlLmRlcHM9ZSl9cmV0dXJuIHR9dHJpZ2dlcihlKXt0aGlzLnZlcnNpb24rKyxhdCsrLHRoaXMubm90aWZ5KGUpfW5vdGlmeShlKXtXZSgpO3RyeXtmb3IobGV0IGU9dGhpcy5zdWJzO2U7ZT1lLnByZXZTdWIpZS5zdWIubm90aWZ5KCkmJmUuc3ViLmRlcC5ub3RpZnkoKX1maW5hbGx5e0dlKCl9fX07ZnVuY3Rpb24gY3QoZSl7aWYoZS5kZXAuc2MrKyxlLnN1Yi5mbGFncyY0KXtsZXQgdD1lLmRlcC5jb21wdXRlZDtpZih0JiYhZS5kZXAuc3Vicyl7dC5mbGFnc3w9MjA7Zm9yKGxldCBlPXQuZGVwcztlO2U9ZS5uZXh0RGVwKWN0KGUpfWxldCBuPWUuZGVwLnN1YnM7biE9PWUmJihlLnByZXZTdWI9bixuJiYobi5uZXh0U3ViPWUpKSxlLmRlcC5zdWJzPWV9fXZhciBsdD1uZXcgV2Vha01hcCx1dD1TeW1ib2woYGApLGR0PVN5bWJvbChgYCksZnQ9U3ltYm9sKGBgKTtmdW5jdGlvbiBwdChlLHQsbil7aWYoZXQmJkxlKXtsZXQgdD1sdC5nZXQoZSk7dHx8bHQuc2V0KGUsdD1uZXcgTWFwKTtsZXQgcj10LmdldChuKTtyfHwodC5zZXQobixyPW5ldyBzdCksci5tYXA9dCxyLmtleT1uKSxyLnRyYWNrKCl9fWZ1bmN0aW9uIG10KGUsdCxuLHIsaSxhKXtsZXQgbz1sdC5nZXQoZSk7aWYoIW8pe2F0Kys7cmV0dXJufWxldCBzPWU9PntlJiZlLnRyaWdnZXIoKX07aWYoV2UoKSx0PT09YGNsZWFyYClvLmZvckVhY2gocyk7ZWxzZXtsZXQgaT1wKGUpLGE9aSYmVChuKTtpZihpJiZuPT09YGxlbmd0aGApe2xldCBlPU51bWJlcihyKTtvLmZvckVhY2goKHQsbik9Pnsobj09PWBsZW5ndGhgfHxuPT09ZnR8fCFiKG4pJiZuPj1lKSYmcyh0KX0pfWVsc2Ugc3dpdGNoKChuIT09dm9pZCAwfHxvLmhhcyh2b2lkIDApKSYmcyhvLmdldChuKSksYSYmcyhvLmdldChmdCkpLHQpe2Nhc2VgYWRkYDppP2EmJnMoby5nZXQoYGxlbmd0aGApKToocyhvLmdldCh1dCkpLG0oZSkmJnMoby5nZXQoZHQpKSk7YnJlYWs7Y2FzZWBkZWxldGVgOml8fChzKG8uZ2V0KHV0KSksbShlKSYmcyhvLmdldChkdCkpKTticmVhaztjYXNlYHNldGA6bShlKSYmcyhvLmdldCh1dCkpfX1HZSgpfWZ1bmN0aW9uIGh0KGUsdCl7bGV0IG49bHQuZ2V0KGUpO3JldHVybiBuJiZuLmdldCh0KX1mdW5jdGlvbiBndChlKXtsZXQgdD1BKGUpO3JldHVybiB0PT09ZT90OihwdCh0LGBpdGVyYXRlYCxmdCksYW4oZSk/dDp0Lm1hcChjbikpfWZ1bmN0aW9uIF90KGUpe3JldHVybiBwdChlPUEoZSksYGl0ZXJhdGVgLGZ0KSxlfWZ1bmN0aW9uIHZ0KGUsdCl7cmV0dXJuIHJuKGUpP2xuKG5uKGUpP2NuKHQpOnQpOmNuKHQpfXZhciB5dD17X19wcm90b19fOm51bGwsW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gYnQodGhpcyxTeW1ib2wuaXRlcmF0b3IsZT0+dnQodGhpcyxlKSl9LGNvbmNhdCguLi5lKXtyZXR1cm4gZ3QodGhpcykuY29uY2F0KC4uLmUubWFwKGU9PnAoZSk/Z3QoZSk6ZSkpfSxlbnRyaWVzKCl7cmV0dXJuIGJ0KHRoaXMsYGVudHJpZXNgLGU9PihlWzFdPXZ0KHRoaXMsZVsxXSksZSkpfSxldmVyeShlLHQpe3JldHVybiBTdCh0aGlzLGBldmVyeWAsZSx0LHZvaWQgMCxhcmd1bWVudHMpfSxmaWx0ZXIoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmlsdGVyYCxlLHQsZT0+ZS5tYXAoZT0+dnQodGhpcyxlKSksYXJndW1lbnRzKX0sZmluZChlLHQpe3JldHVybiBTdCh0aGlzLGBmaW5kYCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kSW5kZXgoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmluZEluZGV4YCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGZpbmRMYXN0KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0YCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kTGFzdEluZGV4KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0SW5kZXhgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sZm9yRWFjaChlLHQpe3JldHVybiBTdCh0aGlzLGBmb3JFYWNoYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGluY2x1ZGVzKC4uLmUpe3JldHVybiB3dCh0aGlzLGBpbmNsdWRlc2AsZSl9LGluZGV4T2YoLi4uZSl7cmV0dXJuIHd0KHRoaXMsYGluZGV4T2ZgLGUpfSxqb2luKGUpe3JldHVybiBndCh0aGlzKS5qb2luKGUpfSxsYXN0SW5kZXhPZiguLi5lKXtyZXR1cm4gd3QodGhpcyxgbGFzdEluZGV4T2ZgLGUpfSxtYXAoZSx0KXtyZXR1cm4gU3QodGhpcyxgbWFwYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LHBvcCgpe3JldHVybiBUdCh0aGlzLGBwb3BgKX0scHVzaCguLi5lKXtyZXR1cm4gVHQodGhpcyxgcHVzaGAsZSl9LHJlZHVjZShlLC4uLnQpe3JldHVybiBDdCh0aGlzLGByZWR1Y2VgLGUsdCl9LHJlZHVjZVJpZ2h0KGUsLi4udCl7cmV0dXJuIEN0KHRoaXMsYHJlZHVjZVJpZ2h0YCxlLHQpfSxzaGlmdCgpe3JldHVybiBUdCh0aGlzLGBzaGlmdGApfSxzb21lKGUsdCl7cmV0dXJuIFN0KHRoaXMsYHNvbWVgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sc3BsaWNlKC4uLmUpe3JldHVybiBUdCh0aGlzLGBzcGxpY2VgLGUpfSx0b1JldmVyc2VkKCl7cmV0dXJuIGd0KHRoaXMpLnRvUmV2ZXJzZWQoKX0sdG9Tb3J0ZWQoZSl7cmV0dXJuIGd0KHRoaXMpLnRvU29ydGVkKGUpfSx0b1NwbGljZWQoLi4uZSl7cmV0dXJuIGd0KHRoaXMpLnRvU3BsaWNlZCguLi5lKX0sdW5zaGlmdCguLi5lKXtyZXR1cm4gVHQodGhpcyxgdW5zaGlmdGAsZSl9LHZhbHVlcygpe3JldHVybiBidCh0aGlzLGB2YWx1ZXNgLGU9PnZ0KHRoaXMsZSkpfX07ZnVuY3Rpb24gYnQoZSx0LG4pe2xldCByPV90KGUpLGk9clt0XSgpO3JldHVybiByIT09ZSYmIWFuKGUpJiYoaS5fbmV4dD1pLm5leHQsaS5uZXh0PSgpPT57bGV0IGU9aS5fbmV4dCgpO3JldHVybiBlLmRvbmV8fChlLnZhbHVlPW4oZS52YWx1ZSkpLGV9KSxpfXZhciB4dD1BcnJheS5wcm90b3R5cGU7ZnVuY3Rpb24gU3QoZSx0LG4scixpLGEpe2xldCBvPV90KGUpLHM9byE9PWUmJiFhbihlKSxjPW9bdF07aWYoYyE9PXh0W3RdKXtsZXQgdD1jLmFwcGx5KGUsYSk7cmV0dXJuIHM/Y24odCk6dH1sZXQgbD1uO28hPT1lJiYocz9sPWZ1bmN0aW9uKHQscil7cmV0dXJuIG4uY2FsbCh0aGlzLHZ0KGUsdCkscixlKX06bi5sZW5ndGg+MiYmKGw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCxyLGUpfSkpO2xldCB1PWMuY2FsbChvLGwscik7cmV0dXJuIHMmJmk/aSh1KTp1fWZ1bmN0aW9uIEN0KGUsdCxuLHIpe2xldCBpPV90KGUpLGE9aSE9PWUmJiFhbihlKSxvPW4scz0hMTtpIT09ZSYmKGE/KHM9ci5sZW5ndGg9PT0wLG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBzJiYocz0hMSx0PXZ0KGUsdCkpLG4uY2FsbCh0aGlzLHQsdnQoZSxyKSxpLGUpfSk6bi5sZW5ndGg+MyYmKG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBuLmNhbGwodGhpcyx0LHIsaSxlKX0pKTtsZXQgYz1pW3RdKG8sLi4ucik7cmV0dXJuIHM/dnQoZSxjKTpjfWZ1bmN0aW9uIHd0KGUsdCxuKXtsZXQgcj1BKGUpO3B0KHIsYGl0ZXJhdGVgLGZ0KTtsZXQgaT1yW3RdKC4uLm4pO3JldHVybihpPT09LTF8fGk9PT0hMSkmJm9uKG5bMF0pPyhuWzBdPUEoblswXSksclt0XSguLi5uKSk6aX1mdW5jdGlvbiBUdChlLHQsbj1bXSl7bnQoKSxXZSgpO2xldCByPUEoZSlbdF0uYXBwbHkoZSxuKTtyZXR1cm4gR2UoKSxydCgpLHJ9dmFyIEV0PW4oYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApLER0PW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoZT0+ZSE9PWBhcmd1bWVudHNgJiZlIT09YGNhbGxlcmApLm1hcChlPT5TeW1ib2xbZV0pLmZpbHRlcihiKSk7ZnVuY3Rpb24gT3QoZSl7YihlKXx8KGU9U3RyaW5nKGUpKTtsZXQgdD1BKHRoaXMpO3JldHVybiBwdCh0LGBoYXNgLGUpLHQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGt0PWNsYXNze2NvbnN0cnVjdG9yKGU9ITEsdD0hMSl7dGhpcy5faXNSZWFkb25seT1lLHRoaXMuX2lzU2hhbGxvdz10fWdldChlLHQsbil7aWYodD09PWBfX3Zfc2tpcGApcmV0dXJuIGUuX192X3NraXA7bGV0IHI9dGhpcy5faXNSZWFkb25seSxpPXRoaXMuX2lzU2hhbGxvdztpZih0PT09YF9fdl9pc1JlYWN0aXZlYClyZXR1cm4hcjtpZih0PT09YF9fdl9pc1JlYWRvbmx5YClyZXR1cm4gcjtpZih0PT09YF9fdl9pc1NoYWxsb3dgKXJldHVybiBpO2lmKHQ9PT1gX192X3Jhd2ApcmV0dXJuIG49PT0ocj9pP1l0Okp0Omk/cXQ6S3QpLmdldChlKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pP2U6dm9pZCAwO2xldCBhPXAoZSk7aWYoIXIpe2xldCBlO2lmKGEmJihlPXl0W3RdKSlyZXR1cm4gZTtpZih0PT09YGhhc093blByb3BlcnR5YClyZXR1cm4gT3R9bGV0IG89UmVmbGVjdC5nZXQoZSx0LGooZSk/ZTpuKTtpZigoYih0KT9EdC5oYXModCk6RXQodCkpfHwocnx8cHQoZSxgZ2V0YCx0KSxpKSlyZXR1cm4gbztpZihqKG8pKXtsZXQgZT1hJiZUKHQpP286by52YWx1ZTtyZXR1cm4gciYmeChlKT8kdChlKTplfXJldHVybiB4KG8pP3I/JHQobyk6WnQobyk6b319LEF0PWNsYXNzIGV4dGVuZHMga3R7Y29uc3RydWN0b3IoZT0hMSl7c3VwZXIoITEsZSl9c2V0KGUsdCxuLHIpe2xldCBpPWVbdF0sYT1wKGUpJiZUKHQpO2lmKCF0aGlzLl9pc1NoYWxsb3cpe2xldCBlPXJuKGkpO2lmKCFhbihuKSYmIXJuKG4pJiYoaT1BKGkpLG49QShuKSksIWEmJmooaSkmJiFqKG4pKXJldHVybiBlfHwoaS52YWx1ZT1uKSwhMH1sZXQgbz1hP051bWJlcih0KTxlLmxlbmd0aDpmKGUsdCkscz1SZWZsZWN0LnNldChlLHQsbixqKGUpP2U6cik7cmV0dXJuIGU9PT1BKHIpJiZzJiYobz9EKG4saSkmJm10KGUsYHNldGAsdCxuLGkpOm10KGUsYGFkZGAsdCxuKSksc31kZWxldGVQcm9wZXJ0eShlLHQpe2xldCBuPWYoZSx0KSxyPWVbdF0saT1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsdCk7cmV0dXJuIGkmJm4mJm10KGUsYGRlbGV0ZWAsdCx2b2lkIDAsciksaX1oYXMoZSx0KXtsZXQgbj1SZWZsZWN0LmhhcyhlLHQpO3JldHVybighYih0KXx8IUR0Lmhhcyh0KSkmJnB0KGUsYGhhc2AsdCksbn1vd25LZXlzKGUpe3JldHVybiBwdChlLGBpdGVyYXRlYCxwKGUpP2BsZW5ndGhgOnV0KSxSZWZsZWN0Lm93bktleXMoZSl9fSxqdD1jbGFzcyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKGU9ITEpe3N1cGVyKCEwLGUpfXNldChlLHQpe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KGUsdCl7cmV0dXJuITB9fSxNdD1uZXcgQXQsTnQ9bmV3IGp0LFB0PW5ldyBBdCghMCksRnQ9bmV3IGp0KCEwKSxJdD1lPT5lLEx0PWU9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSk7ZnVuY3Rpb24gUnQoZSx0LG4pe3JldHVybiBmdW5jdGlvbiguLi5yKXtsZXQgaT10aGlzLl9fdl9yYXcsYT1BKGkpLG89bShhKSxzPWU9PT1gZW50cmllc2B8fGU9PT1TeW1ib2wuaXRlcmF0b3ImJm8sYz1lPT09YGtleXNgJiZvLHU9aVtlXSguLi5yKSxkPW4/SXQ6dD9sbjpjbjtyZXR1cm4hdCYmcHQoYSxgaXRlcmF0ZWAsYz9kdDp1dCksbChPYmplY3QuY3JlYXRlKHUpLHtuZXh0KCl7bGV0e3ZhbHVlOmUsZG9uZTp0fT11Lm5leHQoKTtyZXR1cm4gdD97dmFsdWU6ZSxkb25lOnR9Ont2YWx1ZTpzP1tkKGVbMF0pLGQoZVsxXSldOmQoZSksZG9uZTp0fX19KX19ZnVuY3Rpb24genQoZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLnQpe3JldHVybiBlPT09YGRlbGV0ZWA/ITE6ZT09PWBjbGVhcmA/dm9pZCAwOnRoaXN9fWZ1bmN0aW9uIEJ0KGUsdCl7bGV0IG49e2dldChuKXtsZXQgcj10aGlzLl9fdl9yYXcsaT1BKHIpLGE9QShuKTtlfHwoRChuLGEpJiZwdChpLGBnZXRgLG4pLHB0KGksYGdldGAsYSkpO2xldHtoYXM6b309THQoaSkscz10P0l0OmU/bG46Y247aWYoby5jYWxsKGksbikpcmV0dXJuIHMoci5nZXQobikpO2lmKG8uY2FsbChpLGEpKXJldHVybiBzKHIuZ2V0KGEpKTtyIT09aSYmci5nZXQobil9LGdldCBzaXplKCl7bGV0IHQ9dGhpcy5fX3ZfcmF3O3JldHVybiFlJiZwdChBKHQpLGBpdGVyYXRlYCx1dCksdC5zaXplfSxoYXModCl7bGV0IG49dGhpcy5fX3ZfcmF3LHI9QShuKSxpPUEodCk7cmV0dXJuIGV8fChEKHQsaSkmJnB0KHIsYGhhc2AsdCkscHQocixgaGFzYCxpKSksdD09PWk/bi5oYXModCk6bi5oYXModCl8fG4uaGFzKGkpfSxmb3JFYWNoKG4scil7bGV0IGk9dGhpcyxhPWkuX192X3JhdyxvPUEoYSkscz10P0l0OmU/bG46Y247cmV0dXJuIWUmJnB0KG8sYGl0ZXJhdGVgLHV0KSxhLmZvckVhY2goKGUsdCk9Pm4uY2FsbChyLHMoZSkscyh0KSxpKSl9fTtyZXR1cm4gbChuLGU/e2FkZDp6dChgYWRkYCksc2V0Onp0KGBzZXRgKSxkZWxldGU6enQoYGRlbGV0ZWApLGNsZWFyOnp0KGBjbGVhcmApfTp7YWRkKGUpe2xldCBuPUEodGhpcykscj1MdChuKSxpPUEoZSksYT0hdCYmIWFuKGUpJiYhcm4oZSk/aTplO3JldHVybiByLmhhcy5jYWxsKG4sYSl8fEQoZSxhKSYmci5oYXMuY2FsbChuLGUpfHxEKGksYSkmJnIuaGFzLmNhbGwobixpKXx8KG4uYWRkKGEpLG10KG4sYGFkZGAsYSxhKSksdGhpc30sc2V0KGUsbil7IXQmJiFhbihuKSYmIXJuKG4pJiYobj1BKG4pKTtsZXQgcj1BKHRoaXMpLHtoYXM6aSxnZXQ6YX09THQociksbz1pLmNhbGwocixlKTtvfHw9KGU9QShlKSxpLmNhbGwocixlKSk7bGV0IHM9YS5jYWxsKHIsZSk7cmV0dXJuIHIuc2V0KGUsbiksbz9EKG4scykmJm10KHIsYHNldGAsZSxuLHMpOm10KHIsYGFkZGAsZSxuKSx0aGlzfSxkZWxldGUoZSl7bGV0IHQ9QSh0aGlzKSx7aGFzOm4sZ2V0OnJ9PUx0KHQpLGk9bi5jYWxsKHQsZSk7aXx8PShlPUEoZSksbi5jYWxsKHQsZSkpO2xldCBhPXI/ci5jYWxsKHQsZSk6dm9pZCAwLG89dC5kZWxldGUoZSk7cmV0dXJuIGkmJm10KHQsYGRlbGV0ZWAsZSx2b2lkIDAsYSksb30sY2xlYXIoKXtsZXQgZT1BKHRoaXMpLHQ9ZS5zaXplIT09MCxuPWUuY2xlYXIoKTtyZXR1cm4gdCYmbXQoZSxgY2xlYXJgLHZvaWQgMCx2b2lkIDAsdm9pZCAwKSxufX0pLFtga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChyPT57bltyXT1SdChyLGUsdCl9KSxufWZ1bmN0aW9uIFZ0KGUsdCl7bGV0IG49QnQoZSx0KTtyZXR1cm4odCxyLGkpPT5yPT09YF9fdl9pc1JlYWN0aXZlYD8hZTpyPT09YF9fdl9pc1JlYWRvbmx5YD9lOnI9PT1gX192X3Jhd2A/dDpSZWZsZWN0LmdldChmKG4scikmJnIgaW4gdD9uOnQscixpKX12YXIgSHQ9e2dldDpWdCghMSwhMSl9LFV0PXtnZXQ6VnQoITEsITApfSxXdD17Z2V0OlZ0KCEwLCExKX0sR3Q9e2dldDpWdCghMCwhMCl9LEt0PW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLEp0PW5ldyBXZWFrTWFwLFl0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFh0KGUpe3N3aXRjaChlKXtjYXNlYE9iamVjdGA6Y2FzZWBBcnJheWA6cmV0dXJuIDE7Y2FzZWBNYXBgOmNhc2VgU2V0YDpjYXNlYFdlYWtNYXBgOmNhc2VgV2Vha1NldGA6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gWnQoZSl7cmV0dXJuIHJuKGUpP2U6dG4oZSwhMSxNdCxIdCxLdCl9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIHRuKGUsITEsUHQsVXQscXQpfWZ1bmN0aW9uICR0KGUpe3JldHVybiB0bihlLCEwLE50LFd0LEp0KX1mdW5jdGlvbiBlbihlKXtyZXR1cm4gdG4oZSwhMCxGdCxHdCxZdCl9ZnVuY3Rpb24gdG4oZSx0LG4scixpKXtpZigheChlKXx8ZS5fX3ZfcmF3JiYhKHQmJmUuX192X2lzUmVhY3RpdmUpfHxlLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSlyZXR1cm4gZTtsZXQgYT1pLmdldChlKTtpZihhKXJldHVybiBhO2xldCBvPVh0KGVlKGUpKTtpZihvPT09MClyZXR1cm4gZTtsZXQgcz1uZXcgUHJveHkoZSxvPT09Mj9yOm4pO3JldHVybiBpLnNldChlLHMpLHN9ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIHJuKGUpP25uKGUuX192X3Jhdyk6ISEoZSYmZS5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gcm4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZT8hIWUuX192X3JhdzohMX1mdW5jdGlvbiBBKGUpe2xldCB0PWUmJmUuX192X3JhdztyZXR1cm4gdD9BKHQpOmV9ZnVuY3Rpb24gc24oZSl7cmV0dXJuIWYoZSxgX192X3NraXBgKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmdWUoZSxgX192X3NraXBgLCEwKSxlfXZhciBjbj1lPT54KGUpP1p0KGUpOmUsbG49ZT0+eChlKT8kdChlKTplO2Z1bmN0aW9uIGooZSl7cmV0dXJuIGU/ZS5fX3ZfaXNSZWY9PT0hMDohMX1mdW5jdGlvbiBNKGUpe3JldHVybiBkbihlLCExKX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZG4oZSwhMCl9ZnVuY3Rpb24gZG4oZSx0KXtyZXR1cm4gaihlKT9lOm5ldyBmbihlLHQpfXZhciBmbj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVwPW5ldyBzdCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1NoYWxsb3c9ITEsdGhpcy5fcmF3VmFsdWU9dD9lOkEoZSksdGhpcy5fdmFsdWU9dD9lOmNuKGUpLHRoaXMuX192X2lzU2hhbGxvdz10fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLmRlcC50cmFjaygpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShlKXtsZXQgdD10aGlzLl9yYXdWYWx1ZSxuPXRoaXMuX192X2lzU2hhbGxvd3x8YW4oZSl8fHJuKGUpO2U9bj9lOkEoZSksRChlLHQpJiYodGhpcy5fcmF3VmFsdWU9ZSx0aGlzLl92YWx1ZT1uP2U6Y24oZSksdGhpcy5kZXAudHJpZ2dlcigpKX19O2Z1bmN0aW9uIHBuKGUpe2UuZGVwJiZlLmRlcC50cmlnZ2VyKCl9ZnVuY3Rpb24gTihlKXtyZXR1cm4gaihlKT9lLnZhbHVlOmV9ZnVuY3Rpb24gbW4oZSl7cmV0dXJuIHYoZSk/ZSgpOk4oZSl9dmFyIGhuPXtnZXQ6KGUsdCxuKT0+dD09PWBfX3ZfcmF3YD9lOk4oUmVmbGVjdC5nZXQoZSx0LG4pKSxzZXQ6KGUsdCxuLHIpPT57bGV0IGk9ZVt0XTtyZXR1cm4gaihpKSYmIWoobik/KGkudmFsdWU9biwhMCk6UmVmbGVjdC5zZXQoZSx0LG4scil9fTtmdW5jdGlvbiBnbihlKXtyZXR1cm4gbm4oZSk/ZTpuZXcgUHJveHkoZSxobil9dmFyIF9uPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMDtsZXQgdD10aGlzLmRlcD1uZXcgc3Qse2dldDpuLHNldDpyfT1lKHQudHJhY2suYmluZCh0KSx0LnRyaWdnZXIuYmluZCh0KSk7dGhpcy5fZ2V0PW4sdGhpcy5fc2V0PXJ9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldCgpfXNldCB2YWx1ZShlKXt0aGlzLl9zZXQoZSl9fTtmdW5jdGlvbiB2bihlKXtyZXR1cm4gbmV3IF9uKGUpfWZ1bmN0aW9uIHluKGUpe2xldCB0PXAoZSk/QXJyYXkoZS5sZW5ndGgpOnt9O2ZvcihsZXQgbiBpbiBlKXRbbl09Q24oZSxuKTtyZXR1cm4gdH12YXIgYm49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX29iamVjdD1lLHRoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9rZXk9Yih0KT90OlN0cmluZyh0KSx0aGlzLl9yYXc9QShlKTtsZXQgcj0hMCxpPWU7aWYoIXAoZSl8fGIodGhpcy5fa2V5KXx8IVQodGhpcy5fa2V5KSlkbyByPSFvbihpKXx8YW4oaSk7d2hpbGUociYmKGk9aS5fX3ZfcmF3KSk7dGhpcy5fc2hhbGxvdz1yfWdldCB2YWx1ZSgpe2xldCBlPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiB0aGlzLl9zaGFsbG93JiYoZT1OKGUpKSx0aGlzLl92YWx1ZT1lPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTplfXNldCB2YWx1ZShlKXtpZih0aGlzLl9zaGFsbG93JiZqKHRoaXMuX3Jhd1t0aGlzLl9rZXldKSl7bGV0IHQ9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07aWYoaih0KSl7dC52YWx1ZT1lO3JldHVybn19dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09ZX1nZXQgZGVwKCl7cmV0dXJuIGh0KHRoaXMuX3Jhdyx0aGlzLl9rZXkpfX0seG49Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fZ2V0dGVyPWUsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMCx0aGlzLl92YWx1ZT12b2lkIDB9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldHRlcigpfX07ZnVuY3Rpb24gU24oZSx0LG4pe3JldHVybiBqKGUpP2U6dihlKT9uZXcgeG4oZSk6eChlKSYmYXJndW1lbnRzLmxlbmd0aD4xP0NuKGUsdCxuKTpNKGUpfWZ1bmN0aW9uIENuKGUsdCxuKXtyZXR1cm4gbmV3IGJuKGUsdCxuKX12YXIgd249Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZm49ZSx0aGlzLnNldHRlcj10LHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLmRlcD1uZXcgc3QodGhpcyksdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5kZXBzPXZvaWQgMCx0aGlzLmRlcHNUYWlsPXZvaWQgMCx0aGlzLmZsYWdzPTE2LHRoaXMuZ2xvYmFsVmVyc2lvbj1hdC0xLHRoaXMubmV4dD12b2lkIDAsdGhpcy5lZmZlY3Q9dGhpcyx0aGlzLl9fdl9pc1JlYWRvbmx5PSF0LHRoaXMuaXNTU1I9bn1ub3RpZnkoKXtpZih0aGlzLmZsYWdzfD0xNiwhKHRoaXMuZmxhZ3MmOCkmJkxlIT09dGhpcylyZXR1cm4gVWUodGhpcywhMCksITB9Z2V0IHZhbHVlKCl7bGV0IGU9dGhpcy5kZXAudHJhY2soKTtyZXR1cm4gWWUodGhpcyksZSYmKGUudmVyc2lvbj10aGlzLmRlcC52ZXJzaW9uKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5zZXR0ZXImJnRoaXMuc2V0dGVyKGUpfX07ZnVuY3Rpb24gVG4oZSx0LG49ITEpe2xldCByLGk7cmV0dXJuIHYoZSk/cj1lOihyPWUuZ2V0LGk9ZS5zZXQpLG5ldyB3bihyLGksbil9dmFyIEVuPXtHRVQ6YGdldGAsSEFTOmBoYXNgLElURVJBVEU6YGl0ZXJhdGVgfSxEbj17U0VUOmBzZXRgLEFERDpgYWRkYCxERUxFVEU6YGRlbGV0ZWAsQ0xFQVI6YGNsZWFyYH0sT249e30sa249bmV3IFdlYWtNYXAsQW49dm9pZCAwO2Z1bmN0aW9uIGpuKCl7cmV0dXJuIEFufWZ1bmN0aW9uIE1uKGUsdD0hMSxuPUFuKXtpZihuKXtsZXQgdD1rbi5nZXQobik7dHx8a24uc2V0KG4sdD1bXSksdC5wdXNoKGUpfX1mdW5jdGlvbiBObihlLHQsbj1yKXtsZXR7aW1tZWRpYXRlOmksZGVlcDpvLG9uY2U6cyxzY2hlZHVsZXI6YyxhdWdtZW50Sm9iOmwsY2FsbDpkfT1uLGY9ZT0+bz9lOmFuKGUpfHxvPT09ITF8fG89PT0wP1BuKGUsMSk6UG4oZSksbSxoLGcsXyx5PSExLGI9ITE7aWYoaihlKT8oaD0oKT0+ZS52YWx1ZSx5PWFuKGUpKTpubihlKT8oaD0oKT0+ZihlKSx5PSEwKTpwKGUpPyhiPSEwLHk9ZS5zb21lKGU9Pm5uKGUpfHxhbihlKSksaD0oKT0+ZS5tYXAoZT0+e2lmKGooZSkpcmV0dXJuIGUudmFsdWU7aWYobm4oZSkpcmV0dXJuIGYoZSk7aWYodihlKSlyZXR1cm4gZD9kKGUsMik6ZSgpfSkpOmg9dihlKT90P2Q/KCk9PmQoZSwyKTplOigpPT57aWYoZyl7bnQoKTt0cnl7ZygpfWZpbmFsbHl7cnQoKX19bGV0IHQ9QW47QW49bTt0cnl7cmV0dXJuIGQ/ZChlLDMsW19dKTplKF8pfWZpbmFsbHl7QW49dH19OmEsdCYmbyl7bGV0IGU9aCx0PW89PT0hMD8xLzA6bztoPSgpPT5QbihlKCksdCl9bGV0IHg9RmUoKSxTPSgpPT57bS5zdG9wKCkseCYmeC5hY3RpdmUmJnUoeC5lZmZlY3RzLG0pfTtpZihzJiZ0KXtsZXQgZT10O3Q9KC4uLnQpPT57bGV0IG49ZSguLi50KTtyZXR1cm4gUygpLG59fWxldCBDPWI/QXJyYXkoZS5sZW5ndGgpLmZpbGwoT24pOk9uLHc9ZT0+e2lmKCEoIShtLmZsYWdzJjEpfHwhbS5kaXJ0eSYmIWUpKXtpZih0KXtsZXQgbj1tLnJ1bigpO2lmKGV8fG98fHl8fChiP24uc29tZSgoZSx0KT0+RChlLENbdF0pKTpEKG4sQykpKXtnJiZnKCk7bGV0IGU9QW47QW49bTt0cnl7bGV0IGU9W24sQz09PU9uP3ZvaWQgMDpiJiZDWzBdPT09T24/W106QyxfXTtDPW4sZD9kKHQsMyxlKTp0KC4uLmUpfWZpbmFsbHl7QW49ZX19fWVsc2UgbS5ydW4oKX19O3JldHVybiBsJiZsKHcpLG09bmV3IHplKGgpLG0uc2NoZWR1bGVyPWM/KCk9PmModywhMSk6dyxfPWU9Pk1uKGUsITEsbSksZz1tLm9uU3RvcD0oKT0+e2xldCBlPWtuLmdldChtKTtpZihlKXtpZihkKWQoZSw0KTtlbHNlIGZvcihsZXQgdCBvZiBlKXQoKTtrbi5kZWxldGUobSl9fSx0P2k/dyghMCk6Qz1tLnJ1bigpOmM/Yyh3LmJpbmQobnVsbCwhMCksITApOm0ucnVuKCksUy5wYXVzZT1tLnBhdXNlLmJpbmQobSksUy5yZXN1bWU9bS5yZXN1bWUuYmluZChtKSxTLnN0b3A9UyxTfWZ1bmN0aW9uIFBuKGUsdD0xLzAsbil7aWYodDw9MHx8IXgoZSl8fGUuX192X3NraXB8fChufHw9bmV3IE1hcCwobi5nZXQoZSl8fDApPj10KSlyZXR1cm4gZTtpZihuLnNldChlLHQpLHQtLSxqKGUpKVBuKGUudmFsdWUsdCxuKTtlbHNlIGlmKHAoZSkpZm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspUG4oZVtyXSx0LG4pO2Vsc2UgaWYoaChlKXx8bShlKSllLmZvckVhY2goZT0+e1BuKGUsdCxuKX0pO2Vsc2UgaWYodGUoZSkpe2ZvcihsZXQgciBpbiBlKVBuKGVbcl0sdCxuKTtmb3IobGV0IHIgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSlPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmUG4oZVtyXSx0LG4pfXJldHVybiBlfXZhciBGbj1bXTtmdW5jdGlvbiBJbihlKXtGbi5wdXNoKGUpfWZ1bmN0aW9uIExuKCl7Rm4ucG9wKCl9ZnVuY3Rpb24gUm4oZSx0KXt9dmFyIHpuPXtTRVRVUF9GVU5DVElPTjowLDA6YFNFVFVQX0ZVTkNUSU9OYCxSRU5ERVJfRlVOQ1RJT046MSwxOmBSRU5ERVJfRlVOQ1RJT05gLE5BVElWRV9FVkVOVF9IQU5ETEVSOjUsNTpgTkFUSVZFX0VWRU5UX0hBTkRMRVJgLENPTVBPTkVOVF9FVkVOVF9IQU5ETEVSOjYsNjpgQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJgLFZOT0RFX0hPT0s6Nyw3OmBWTk9ERV9IT09LYCxESVJFQ1RJVkVfSE9PSzo4LDg6YERJUkVDVElWRV9IT09LYCxUUkFOU0lUSU9OX0hPT0s6OSw5OmBUUkFOU0lUSU9OX0hPT0tgLEFQUF9FUlJPUl9IQU5ETEVSOjEwLDEwOmBBUFBfRVJST1JfSEFORExFUmAsQVBQX1dBUk5fSEFORExFUjoxMSwxMTpgQVBQX1dBUk5fSEFORExFUmAsRlVOQ1RJT05fUkVGOjEyLDEyOmBGVU5DVElPTl9SRUZgLEFTWU5DX0NPTVBPTkVOVF9MT0FERVI6MTMsMTM6YEFTWU5DX0NPTVBPTkVOVF9MT0FERVJgLFNDSEVEVUxFUjoxNCwxNDpgU0NIRURVTEVSYCxDT01QT05FTlRfVVBEQVRFOjE1LDE1OmBDT01QT05FTlRfVVBEQVRFYCxBUFBfVU5NT1VOVF9DTEVBTlVQOjE2LDE2OmBBUFBfVU5NT1VOVF9DTEVBTlVQYH0sQm49e3NwOmBzZXJ2ZXJQcmVmZXRjaCBob29rYCxiYzpgYmVmb3JlQ3JlYXRlIGhvb2tgLGM6YGNyZWF0ZWQgaG9va2AsYm06YGJlZm9yZU1vdW50IGhvb2tgLG06YG1vdW50ZWQgaG9va2AsYnU6YGJlZm9yZVVwZGF0ZSBob29rYCx1OmB1cGRhdGVkYCxidW06YGJlZm9yZVVubW91bnQgaG9va2AsdW06YHVubW91bnRlZCBob29rYCxhOmBhY3RpdmF0ZWQgaG9va2AsZGE6YGRlYWN0aXZhdGVkIGhvb2tgLGVjOmBlcnJvckNhcHR1cmVkIGhvb2tgLHJ0YzpgcmVuZGVyVHJhY2tlZCBob29rYCxydGc6YHJlbmRlclRyaWdnZXJlZCBob29rYCwwOmBzZXR1cCBmdW5jdGlvbmAsMTpgcmVuZGVyIGZ1bmN0aW9uYCwyOmB3YXRjaGVyIGdldHRlcmAsMzpgd2F0Y2hlciBjYWxsYmFja2AsNDpgd2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uYCw1OmBuYXRpdmUgZXZlbnQgaGFuZGxlcmAsNjpgY29tcG9uZW50IGV2ZW50IGhhbmRsZXJgLDc6YHZub2RlIGhvb2tgLDg6YGRpcmVjdGl2ZSBob29rYCw5OmB0cmFuc2l0aW9uIGhvb2tgLDEwOmBhcHAgZXJyb3JIYW5kbGVyYCwxMTpgYXBwIHdhcm5IYW5kbGVyYCwxMjpgcmVmIGZ1bmN0aW9uYCwxMzpgYXN5bmMgY29tcG9uZW50IGxvYWRlcmAsMTQ6YHNjaGVkdWxlciBmbHVzaGAsMTU6YGNvbXBvbmVudCB1cGRhdGVgLDE2OmBhcHAgdW5tb3VudCBjbGVhbnVwIGZ1bmN0aW9uYH07ZnVuY3Rpb24gVm4oZSx0LG4scil7dHJ5e3JldHVybiByP2UoLi4ucik6ZSgpfWNhdGNoKGUpe1VuKGUsdCxuKX19ZnVuY3Rpb24gSG4oZSx0LG4scil7aWYodihlKSl7bGV0IGk9Vm4oZSx0LG4scik7cmV0dXJuIGkmJlMoaSkmJmkuY2F0Y2goZT0+e1VuKGUsdCxuKX0pLGl9aWYocChlKSl7bGV0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspaS5wdXNoKEhuKGVbYV0sdCxuLHIpKTtyZXR1cm4gaX19ZnVuY3Rpb24gVW4oZSx0LG4saT0hMCl7bGV0IGE9dD90LnZub2RlOm51bGwse2Vycm9ySGFuZGxlcjpvLHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb246c309dCYmdC5hcHBDb250ZXh0LmNvbmZpZ3x8cjtpZih0KXtsZXQgcj10LnBhcmVudCxpPXQucHJveHksYT1gaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSR7bn1gO2Zvcig7cjspe2xldCB0PXIuZWM7aWYodCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXShlLGksYSk9PT0hMSlyZXR1cm59cj1yLnBhcmVudH1pZihvKXtudCgpLFZuKG8sbnVsbCwxMCxbZSxpLGFdKSxydCgpO3JldHVybn19V24oZSxuLGEsaSxzKX1mdW5jdGlvbiBXbihlLHQsbixyPSEwLGk9ITEpe2lmKGkpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBHbj1bXSxLbj0tMSxxbj1bXSxKbj1udWxsLFluPTAsWG49UHJvbWlzZS5yZXNvbHZlKCksWm49bnVsbDtmdW5jdGlvbiBRbihlKXtsZXQgdD1abnx8WG47cmV0dXJuIGU/dC50aGVuKHRoaXM/ZS5iaW5kKHRoaXMpOmUpOnR9ZnVuY3Rpb24gJG4oZSl7bGV0IHQ9S24rMSxuPUduLmxlbmd0aDtmb3IoO3Q8bjspe2xldCByPXQrbj4+PjEsaT1HbltyXSxhPWFyKGkpO2E8ZXx8YT09PWUmJmkuZmxhZ3MmMj90PXIrMTpuPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gZXIoZSl7aWYoIShlLmZsYWdzJjEpKXtsZXQgdD1hcihlKSxuPUduW0duLmxlbmd0aC0xXTshbnx8IShlLmZsYWdzJjIpJiZ0Pj1hcihuKT9Hbi5wdXNoKGUpOkduLnNwbGljZSgkbih0KSwwLGUpLGUuZmxhZ3N8PTEsdHIoKX19ZnVuY3Rpb24gdHIoKXtabnx8PVhuLnRoZW4ob3IpfWZ1bmN0aW9uIG5yKGUpe2lmKCFwKGUpKUpuJiZlLmlkPT09LTE/Sm4uc3BsaWNlKFluKzEsMCxlKTplLmZsYWdzJjF8fChxbi5wdXNoKGUpLGUuZmxhZ3N8PTEpO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspcW4ucHVzaChlW3RdKTt0cigpfWZ1bmN0aW9uIHJyKGUsdCxuPUtuKzEpe2Zvcig7bjxHbi5sZW5ndGg7bisrKXtsZXQgdD1HbltuXTtpZih0JiZ0LmZsYWdzJjIpe2lmKGUmJnQuaWQhPT1lLnVpZCljb250aW51ZTtHbi5zcGxpY2UobiwxKSxuLS0sdC5mbGFncyY0JiYodC5mbGFncyY9LTIpLHQoKSx0LmZsYWdzJjR8fCh0LmZsYWdzJj0tMil9fX1mdW5jdGlvbiBpcihlKXtpZihxbi5sZW5ndGgpe2xldCBlPVsuLi5uZXcgU2V0KHFuKV0uc29ydCgoZSx0KT0+YXIoZSktYXIodCkpO2lmKHFuLmxlbmd0aD0wLEpuKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylKbi5wdXNoKGVbdF0pO3JldHVybn1mb3IoSm49ZSxZbj0wO1luPEpuLmxlbmd0aDtZbisrKXtsZXQgZT1KbltZbl07ZS5mbGFncyY0JiYoZS5mbGFncyY9LTIpLGUuZmxhZ3MmOHx8ZSgpLGUuZmxhZ3MmPS0yfUpuPW51bGwsWW49MH19dmFyIGFyPWU9PmUuaWQ9PW51bGw/ZS5mbGFncyYyPy0xOjEvMDplLmlkO2Z1bmN0aW9uIG9yKGUpe3RyeXtmb3IoS249MDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJiEoZS5mbGFncyY4KSYmKGUuZmxhZ3MmNCYmKGUuZmxhZ3MmPS0yKSxWbihlLGUuaSxlLmk/MTU6MTQpLGUuZmxhZ3MmNHx8KGUuZmxhZ3MmPS0yKSl9fWZpbmFsbHl7Zm9yKDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJihlLmZsYWdzJj0tMil9S249LTEsR24ubGVuZ3RoPTAsaXIoZSksWm49bnVsbCwoR24ubGVuZ3RofHxxbi5sZW5ndGgpJiZvcihlKX19dmFyIHNyLGNyPVtdO2Z1bmN0aW9uIGxyKGUsdCl7c3I9ZSxzcj8oc3IuZW5hYmxlZD0hMCxjci5mb3JFYWNoKCh7ZXZlbnQ6ZSxhcmdzOnR9KT0+c3IuZW1pdChlLC4uLnQpKSxjcj1bXSk6dHlwZW9mIHdpbmRvdzxgdWAmJndpbmRvdy5IVE1MRWxlbWVudCYmISh3aW5kb3cubmF2aWdhdG9yPy51c2VyQWdlbnQpPy5pbmNsdWRlcyhganNkb21gKT8oKHQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz10Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdKS5wdXNoKGU9PntscihlLHQpfSksc2V0VGltZW91dCgoKT0+e3NyfHwodC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsY3I9W10pfSwzZTMpKTpjcj1bXX12YXIgdXI9bnVsbCxkcj1udWxsO2Z1bmN0aW9uIGZyKGUpe2xldCB0PXVyO3JldHVybiB1cj1lLGRyPWUmJmUudHlwZS5fX3Njb3BlSWR8fG51bGwsdH1mdW5jdGlvbiBwcihlKXtkcj1lfWZ1bmN0aW9uIG1yKCl7ZHI9bnVsbH12YXIgaHI9ZT0+UDtmdW5jdGlvbiBQKGUsdD11cixuKXtpZighdHx8ZS5fbilyZXR1cm4gZTtsZXQgcj0oLi4ubik9PntyLl9kJiZtcygtMSk7bGV0IGk9ZnIodCksYT11cy5sZW5ndGgsbzt0cnl7bz1lKC4uLm4pfWZpbmFsbHl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPmE7ZS0tKWZzKCk7ZnIoaSksci5fZCYmbXMoMSl9cmV0dXJuIG99O3JldHVybiByLl9uPSEwLHIuX2M9ITAsci5fZD0hMCxyfWZ1bmN0aW9uIGdyKGUsdCl7aWYodXI9PT1udWxsKXJldHVybiBlO2xldCBuPVFzKHVyKSxpPWUuZGlyc3x8PVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXRbYSxvLHMsYz1yXT10W2VdO2EmJih2KGEpJiYoYT17bW91bnRlZDphLHVwZGF0ZWQ6YX0pLGEuZGVlcCYmUG4obyksaS5wdXNoKHtkaXI6YSxpbnN0YW5jZTpuLHZhbHVlOm8sb2xkVmFsdWU6dm9pZCAwLGFyZzpzLG1vZGlmaWVyczpjfSkpfXJldHVybiBlfWZ1bmN0aW9uIF9yKGUsdCxuLHIpe2xldCBpPWUuZGlycyxhPXQmJnQuZGlycztmb3IobGV0IG89MDtvPGkubGVuZ3RoO28rKyl7bGV0IHM9aVtvXTthJiYocy5vbGRWYWx1ZT1hW29dLnZhbHVlKTtsZXQgYz1zLmRpcltyXTtjJiYobnQoKSxIbihjLG4sOCxbZS5lbCxzLGUsdF0pLHJ0KCkpfX1mdW5jdGlvbiB2cihlLHQpe2lmKFBzKXtsZXQgbj1Qcy5wcm92aWRlcyxyPVBzLnBhcmVudCYmUHMucGFyZW50LnByb3ZpZGVzO3I9PT1uJiYobj1Qcy5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHIpKSxuW2VdPXR9fWZ1bmN0aW9uIHlyKGUsdCxuPSExKXtsZXQgcj1GcygpO2lmKHJ8fG5vKXtsZXQgaT1ubz9uby5fY29udGV4dC5wcm92aWRlczpyP3IucGFyZW50PT1udWxsfHxyLmNlP3Iudm5vZGUuYXBwQ29udGV4dCYmci52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnIucGFyZW50LnByb3ZpZGVzOnZvaWQgMDtpZihpJiZlIGluIGkpcmV0dXJuIGlbZV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBuJiZ2KHQpP3QuY2FsbChyJiZyLnByb3h5KTp0fX1mdW5jdGlvbiBicigpe3JldHVybiEhKEZzKCl8fG5vKX12YXIgeHI9U3ltYm9sLmZvcihgdi1zY3hgKSxTcj0oKT0+eXIoeHIpO2Z1bmN0aW9uIENyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx0KX1mdW5jdGlvbiB3cihlLHQpe3JldHVybiBEcihlLG51bGwse2ZsdXNoOmBwb3N0YH0pfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx7Zmx1c2g6YHN5bmNgfSl9ZnVuY3Rpb24gRXIoZSx0LG4pe3JldHVybiBEcihlLHQsbil9ZnVuY3Rpb24gRHIoZSx0LG49cil7bGV0e2ltbWVkaWF0ZTppLGRlZXA6byxmbHVzaDpzLG9uY2U6Y309bix1PWwoe30sbiksZD10JiZpfHwhdCYmcyE9PWBwb3N0YCxmO2lmKFZzKXtpZihzPT09YHN5bmNgKXtsZXQgZT1TcigpO2Y9ZS5fX3dhdGNoZXJIYW5kbGVzfHw9W119ZWxzZSBpZighZCl7bGV0IGU9KCk9Pnt9O3JldHVybiBlLnN0b3A9YSxlLnJlc3VtZT1hLGUucGF1c2U9YSxlfX1sZXQgcD1Qczt1LmNhbGw9KGUsdCxuKT0+SG4oZSxwLHQsbik7bGV0IG09ITE7cz09PWBwb3N0YD91LnNjaGVkdWxlcj1lPT57SW8oZSxwJiZwLnN1c3BlbnNlKX06cyE9PWBzeW5jYCYmKG09ITAsdS5zY2hlZHVsZXI9KGUsdCk9Pnt0P2UoKTplcihlKX0pLHUuYXVnbWVudEpvYj1lPT57dCYmKGUuZmxhZ3N8PTQpLG0mJihlLmZsYWdzfD0yLHAmJihlLmlkPXAudWlkLGUuaT1wKSl9O2xldCBoPU5uKGUsdCx1KTtyZXR1cm4gVnMmJihmP2YucHVzaChoKTpkJiZoKCkpLGh9ZnVuY3Rpb24gT3IoZSx0LG4pe2xldCByPXRoaXMucHJveHksaT15KGUpP2UuaW5jbHVkZXMoYC5gKT9rcihyLGUpOigpPT5yW2VdOmUuYmluZChyLHIpLGE7dih0KT9hPXQ6KGE9dC5oYW5kbGVyLG49dCk7bGV0IG89UnModGhpcykscz1EcihpLGEuYmluZChyKSxuKTtyZXR1cm4gbygpLHN9ZnVuY3Rpb24ga3IoZSx0KXtsZXQgbj10LnNwbGl0KGAuYCk7cmV0dXJuKCk9PntsZXQgdD1lO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGgmJnQ7ZSsrKXQ9dFtuW2VdXTtyZXR1cm4gdH19dmFyIEFyPW5ldyBXZWFrTWFwLGpyPVN5bWJvbChgX3Z0ZWApLE1yPWU9PmUuX19pc1RlbGVwb3J0LE5yPWU9PmUmJihlLmRpc2FibGVkfHxlLmRpc2FibGVkPT09YGApLFByPWU9PmUmJihlLmRlZmVyfHxlLmRlZmVyPT09YGApLEZyPWU9PnR5cGVvZiBTVkdFbGVtZW50PGB1YCYmZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsSXI9ZT0+dHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50LExyPShlLHQpPT57bGV0IG49ZSYmZS50bztyZXR1cm4geShuKT90P3Qobik6bnVsbDpufSxScj17bmFtZTpgVGVsZXBvcnRgLF9faXNUZWxlcG9ydDohMCxwcm9jZXNzKGUsdCxuLHIsaSxhLG8scyxjLGwpe2xldHttYzp1LHBjOmQscGJjOmYsbzp7aW5zZXJ0OnAscXVlcnlTZWxlY3RvcjptLGNyZWF0ZVRleHQ6aCxjcmVhdGVDb21tZW50OmcscGFyZW50Tm9kZTpffX09bCx2PU5yKHQucHJvcHMpLHtkeW5hbWljQ2hpbGRyZW46eX09dCxiPShlLHQsbik9PntlLnNoYXBlRmxhZyYxNiYmdShlLmNoaWxkcmVuLHQsbixpLGEsbyxzLGMpfSx4PShlPXQpPT57bGV0IG49TnIoZS5wcm9wcykscj1lLnRhcmdldD1McihlLnByb3BzLG0pLGE9VXIocixlLGgscCk7ciYmKG8hPT1gc3ZnYCYmRnIocik/bz1gc3ZnYDpvIT09YG1hdGhtbGAmJklyKHIpJiYobz1gbWF0aG1sYCksaSYmaS5pc0NFJiYoaS5jZS5fdGVsZXBvcnRUYXJnZXRzfHwoaS5jZS5fdGVsZXBvcnRUYXJnZXRzPW5ldyBTZXQpKS5hZGQociksbnx8KGIoZSxyLGEpLEhyKGUsITEpKSl9LFM9ZT0+e2xldCB0PSgpPT57aWYoQXIuZ2V0KGUpPT09dCl7aWYoQXIuZGVsZXRlKGUpLE5yKGUucHJvcHMpKXtsZXQgdD1fKGUuZWwpfHxuO2IoZSx0LGUuYW5jaG9yKSxIcihlLCEwKX14KGUpfX07QXIuc2V0KGUsdCksSW8odCxhKX07aWYoZT09bnVsbCl7bGV0IGU9dC5lbD1oKGBgKSxpPXQuYW5jaG9yPWgoYGApO2lmKHAoZSxuLHIpLHAoaSxuLHIpLFByKHQucHJvcHMpfHxhJiZhLnBlbmRpbmdCcmFuY2gpe1ModCk7cmV0dXJufXYmJihiKHQsbixpKSxIcih0LCEwKSkseCgpfWVsc2V7dC5lbD1lLmVsO2xldCByPXQuYW5jaG9yPWUuYW5jaG9yLHU9QXIuZ2V0KGUpO2lmKHUpe3UuZmxhZ3N8PTgsQXIuZGVsZXRlKGUpLFModCk7cmV0dXJufXQudGFyZ2V0U3RhcnQ9ZS50YXJnZXRTdGFydDtsZXQgcD10LnRhcmdldD1lLnRhcmdldCxoPXQudGFyZ2V0QW5jaG9yPWUudGFyZ2V0QW5jaG9yLGc9TnIoZS5wcm9wcyksXz1nP246cCxiPWc/cjpoO2lmKG89PT1gc3ZnYHx8RnIocCk/bz1gc3ZnYDoobz09PWBtYXRobWxgfHxJcihwKSkmJihvPWBtYXRobWxgKSx5PyhmKGUuZHluYW1pY0NoaWxkcmVuLHksXyxpLGEsbyxzKSxVbyhlLHQsITApKTpjfHxkKGUsdCxfLGIsaSxhLG8scywhMSksdilnP3QucHJvcHMmJmUucHJvcHMmJnQucHJvcHMudG8hPT1lLnByb3BzLnRvJiYodC5wcm9wcy50bz1lLnByb3BzLnRvKTp6cih0LG4scixsLDEpO2Vsc2UgaWYoKHQucHJvcHMmJnQucHJvcHMudG8pIT09KGUucHJvcHMmJmUucHJvcHMudG8pKXtsZXQgZT1Mcih0LnByb3BzLG0pO2UmJih0LnRhcmdldD1lLHpyKHQsZSxudWxsLGwsMCkpfWVsc2UgZyYmenIodCxwLGgsbCwxKTtIcih0LHYpfX0scmVtb3ZlKGUsdCxuLHt1bTpyLG86e3JlbW92ZTppfX0sYSl7bGV0e3NoYXBlRmxhZzpvLGNoaWxkcmVuOnMsYW5jaG9yOmMsdGFyZ2V0U3RhcnQ6bCx0YXJnZXRBbmNob3I6dSx0YXJnZXQ6ZCxwcm9wczpmfT1lLHA9TnIoZiksbT1hfHwhcCxoPUFyLmdldChlKTtpZihoJiYoaC5mbGFnc3w9OCxBci5kZWxldGUoZSkpLGQmJihpKGwpLGkodSkpLGEmJmkoYyksIWgmJihwfHxkKSYmbyYxNilmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IGk9c1tlXTtyKGksdCxuLG0sISFpLmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOnpyLGh5ZHJhdGU6QnJ9O2Z1bmN0aW9uIHpyKGUsdCxuLHtvOntpbnNlcnQ6cn0sbTppfSxhPTIpe2E9PT0wJiZyKGUudGFyZ2V0QW5jaG9yLHQsbik7bGV0e2VsOm8sYW5jaG9yOnMsc2hhcGVGbGFnOmMsY2hpbGRyZW46bCxwcm9wczp1fT1lLGQ9YT09PTI7aWYoZCYmcihvLHQsbiksIUFyLmhhcyhlKSYmKCFkfHxOcih1KSkmJmMmMTYpZm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaShsW2VdLHQsbiwyKTtkJiZyKHMsdCxuKX1mdW5jdGlvbiBCcihlLHQsbixyLGksYSx7bzp7bmV4dFNpYmxpbmc6byxwYXJlbnROb2RlOnMscXVlcnlTZWxlY3RvcjpjLGluc2VydDpsLGNyZWF0ZVRleHQ6dX19LGQpe2Z1bmN0aW9uIGYoZSxuKXtsZXQgcj1uO2Zvcig7cjspe2lmKHImJnIubm9kZVR5cGU9PT04KXtpZihyLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnQgYW5jaG9yYCl0LnRhcmdldFN0YXJ0PXI7ZWxzZSBpZihyLmRhdGE9PT1gdGVsZXBvcnQgYW5jaG9yYCl7dC50YXJnZXRBbmNob3I9cixlLl9scGE9dC50YXJnZXRBbmNob3ImJm8odC50YXJnZXRBbmNob3IpO2JyZWFrfX1yPW8ocil9fWZ1bmN0aW9uIHAoZSx0KXt0LmFuY2hvcj1kKG8oZSksdCxzKGUpLG4scixpLGEpfWxldCBtPXQudGFyZ2V0PUxyKHQucHJvcHMsYyksaD1Ocih0LnByb3BzKTtpZihtKXtsZXQgYz1tLl9scGF8fG0uZmlyc3RDaGlsZDt0LnNoYXBlRmxhZyYxNiYmKGg/KHAoZSx0KSxmKG0sYyksdC50YXJnZXRBbmNob3J8fFVyKG0sdCx1LGwscyhlKT09PW0/ZTpudWxsKSk6KHQuYW5jaG9yPW8oZSksZihtLGMpLHQudGFyZ2V0QW5jaG9yfHxVcihtLHQsdSxsKSxkKGMmJm8oYyksdCxtLG4scixpLGEpKSksSHIodCxoKX1lbHNlIGgmJnQuc2hhcGVGbGFnJjE2JiYocChlLHQpLHQudGFyZ2V0U3RhcnQ9ZSx0LnRhcmdldEFuY2hvcj1vKGUpKTtyZXR1cm4gdC5hbmNob3ImJm8odC5hbmNob3IpfXZhciBWcj1ScjtmdW5jdGlvbiBIcihlLHQpe2xldCBuPWUuY3R4O2lmKG4mJm4udXQpe2xldCByLGk7Zm9yKHQ/KHI9ZS5lbCxpPWUuYW5jaG9yKToocj1lLnRhcmdldFN0YXJ0LGk9ZS50YXJnZXRBbmNob3IpO3ImJnIhPT1pOylyLm5vZGVUeXBlPT09MSYmci5zZXRBdHRyaWJ1dGUoYGRhdGEtdi1vd25lcmAsbi51aWQpLHI9ci5uZXh0U2libGluZztuLnV0KCl9fWZ1bmN0aW9uIFVyKGUsdCxuLHIsaT1udWxsKXtsZXQgYT10LnRhcmdldFN0YXJ0PW4oYGApLG89dC50YXJnZXRBbmNob3I9bihgYCk7cmV0dXJuIGFbanJdPW8sZSYmKHIoYSxlLGkpLHIobyxlLGkpKSxvfXZhciBXcj1TeW1ib2woYF9sZWF2ZUNiYCksR3I9U3ltYm9sKGBfZW50ZXJDYmApO2Z1bmN0aW9uIEtyKCl7bGV0IGU9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIFppKCgpPT57ZS5pc01vdW50ZWQ9ITB9KSxlYSgoKT0+e2UuaXNVbm1vdW50aW5nPSEwfSksZX12YXIgcXI9W0Z1bmN0aW9uLEFycmF5XSxKcj17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpxcixvbkVudGVyOnFyLG9uQWZ0ZXJFbnRlcjpxcixvbkVudGVyQ2FuY2VsbGVkOnFyLG9uQmVmb3JlTGVhdmU6cXIsb25MZWF2ZTpxcixvbkFmdGVyTGVhdmU6cXIsb25MZWF2ZUNhbmNlbGxlZDpxcixvbkJlZm9yZUFwcGVhcjpxcixvbkFwcGVhcjpxcixvbkFmdGVyQXBwZWFyOnFyLG9uQXBwZWFyQ2FuY2VsbGVkOnFyfSxZcj1lPT57bGV0IHQ9ZS5zdWJUcmVlO3JldHVybiB0LmNvbXBvbmVudD9Zcih0LmNvbXBvbmVudCk6dH0sWHI9e25hbWU6YEJhc2VUcmFuc2l0aW9uYCxwcm9wczpKcixzZXR1cChlLHtzbG90czp0fSl7bGV0IG49RnMoKSxyPUtyKCk7cmV0dXJuKCk9PntsZXQgaT10LmRlZmF1bHQmJmlpKHQuZGVmYXVsdCgpLCEwKSxhPWkmJmkubGVuZ3RoP1pyKGkpOm4uc3ViVHJlZT9UcygpOnZvaWQgMDtpZighYSlyZXR1cm47bGV0IG89QShlKSx7bW9kZTpzfT1vO2lmKHIuaXNMZWF2aW5nKXJldHVybiB0aShhKTtsZXQgYz1uaShhKTtpZighYylyZXR1cm4gdGkoYSk7bGV0IGw9ZWkoYyxvLHIsbixlPT5sPWUpO2MudHlwZSE9PWNzJiZyaShjLGwpO2xldCB1PW4uc3ViVHJlZSYmbmkobi5zdWJUcmVlKTtpZih1JiZ1LnR5cGUhPT1jcyYmIV9zKHUsYykmJllyKG4pLnR5cGUhPT1jcyl7bGV0IGU9ZWkodSxvLHIsbik7aWYocmkodSxlKSxzPT09YG91dC1pbmAmJmMudHlwZSE9PWNzKXJldHVybiByLmlzTGVhdmluZz0hMCxlLmFmdGVyTGVhdmU9KCk9PntyLmlzTGVhdmluZz0hMSxuLmpvYi5mbGFncyY4fHxuLnVwZGF0ZSgpLGRlbGV0ZSBlLmFmdGVyTGVhdmUsdT12b2lkIDB9LHRpKGEpO3M9PT1gaW4tb3V0YCYmYy50eXBlIT09Y3M/ZS5kZWxheUxlYXZlPShlLHQsbik9PntsZXQgaT0kcihyLHUpO2lbU3RyaW5nKHUua2V5KV09dSxlW1dyXT0oKT0+e3QoKSxlW1dyXT12b2lkIDAsZGVsZXRlIGwuZGVsYXllZExlYXZlLHU9dm9pZCAwfSxsLmRlbGF5ZWRMZWF2ZT0oKT0+e24oKSxkZWxldGUgbC5kZWxheWVkTGVhdmUsdT12b2lkIDB9fTp1PXZvaWQgMH1lbHNlIHUmJj12b2lkIDA7cmV0dXJuIGF9fX07ZnVuY3Rpb24gWnIoZSl7bGV0IHQ9ZVswXTtpZihlLmxlbmd0aD4xKXtmb3IobGV0IG4gb2YgZSlpZihuLnR5cGUhPT1jcyl7dD1uO2JyZWFrfX1yZXR1cm4gdH12YXIgUXI9WHI7ZnVuY3Rpb24gJHIoZSx0KXtsZXR7bGVhdmluZ1ZOb2RlczpufT1lLHI9bi5nZXQodC50eXBlKTtyZXR1cm4gcnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuLnNldCh0LnR5cGUscikpLHJ9ZnVuY3Rpb24gZWkoZSx0LG4scixpKXtsZXR7YXBwZWFyOmEsbW9kZTpvLHBlcnNpc3RlZDpzPSExLG9uQmVmb3JlRW50ZXI6YyxvbkVudGVyOmwsb25BZnRlckVudGVyOnUsb25FbnRlckNhbmNlbGxlZDpkLG9uQmVmb3JlTGVhdmU6ZixvbkxlYXZlOm0sb25BZnRlckxlYXZlOmgsb25MZWF2ZUNhbmNlbGxlZDpnLG9uQmVmb3JlQXBwZWFyOl8sb25BcHBlYXI6dixvbkFmdGVyQXBwZWFyOnksb25BcHBlYXJDYW5jZWxsZWQ6Yn09dCx4PVN0cmluZyhlLmtleSksUz0kcihuLGUpLEM9KGUsdCk9PntlJiZIbihlLHIsOSx0KX0sdz0oZSx0KT0+e2xldCBuPXRbMV07QyhlLHQpLHAoZSk/ZS5ldmVyeShlPT5lLmxlbmd0aDw9MSkmJm4oKTplLmxlbmd0aDw9MSYmbigpfSxlZT17bW9kZTpvLHBlcnNpc3RlZDpzLGJlZm9yZUVudGVyKHQpe2xldCByPWM7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9X3x8YztlbHNlIHJldHVybn10W1dyXSYmdFtXcl0oITApO2xldCBpPVNbeF07aSYmX3MoZSxpKSYmaS5lbFtXcl0mJmkuZWxbV3JdKCksQyhyLFt0XSl9LGVudGVyKHQpe2lmKFNbeF09PT1lKXJldHVybjtsZXQgcj1sLGk9dSxvPWQ7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9dnx8bCxpPXl8fHUsbz1ifHxkO2Vsc2UgcmV0dXJufWxldCBzPSExO3RbR3JdPWU9PntzfHwocz0hMCxDKGU/bzppLFt0XSksZWUuZGVsYXllZExlYXZlJiZlZS5kZWxheWVkTGVhdmUoKSx0W0dyXT12b2lkIDApfTtsZXQgYz10W0dyXS5iaW5kKG51bGwsITEpO3I/dyhyLFt0LGNdKTpjKCl9LGxlYXZlKHQscil7bGV0IGk9U3RyaW5nKGUua2V5KTtpZih0W0dyXSYmdFtHcl0oITApLG4uaXNVbm1vdW50aW5nKXJldHVybiByKCk7QyhmLFt0XSk7bGV0IGE9ITE7dFtXcl09bj0+e2F8fChhPSEwLHIoKSxDKG4/ZzpoLFt0XSksdFtXcl09dm9pZCAwLFNbaV09PT1lJiZkZWxldGUgU1tpXSl9O2xldCBvPXRbV3JdLmJpbmQobnVsbCwhMSk7U1tpXT1lLG0/dyhtLFt0LG9dKTpvKCl9LGNsb25lKGUpe2xldCBhPWVpKGUsdCxuLHIsaSk7cmV0dXJuIGkmJmkoYSksYX19O3JldHVybiBlZX1mdW5jdGlvbiB0aShlKXtpZih6aShlKSlyZXR1cm4gZT1DcyhlKSxlLmNoaWxkcmVuPW51bGwsZX1mdW5jdGlvbiBuaShlKXtpZighemkoZSkpcmV0dXJuIE1yKGUudHlwZSkmJmUuY2hpbGRyZW4/WnIoZS5jaGlsZHJlbik6ZTtpZihlLmNvbXBvbmVudClyZXR1cm4gZS5jb21wb25lbnQuc3ViVHJlZTtsZXR7c2hhcGVGbGFnOnQsY2hpbGRyZW46bn09ZTtpZihuKXtpZih0JjE2KXJldHVybiBuWzBdO2lmKHQmMzImJnYobi5kZWZhdWx0KSlyZXR1cm4gbi5kZWZhdWx0KCl9fWZ1bmN0aW9uIHJpKGUsdCl7aWYoZS5zaGFwZUZsYWcmNiYmZS5jb21wb25lbnQpe2UudHJhbnNpdGlvbj10O2xldCBuPWUuY29tcG9uZW50LnN1YlRyZWU7cmkoTXIobi50eXBlKSYmbmkobil8fG4sdCl9ZWxzZSBlLnNoYXBlRmxhZyYxMjg/KGUuc3NDb250ZW50LnRyYW5zaXRpb249dC5jbG9uZShlLnNzQ29udGVudCksZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249dC5jbG9uZShlLnNzRmFsbGJhY2spKTplLnRyYW5zaXRpb249dH1mdW5jdGlvbiBpaShlLHQ9ITEsbil7bGV0IHI9W10saT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgbz1lW2FdLHM9bj09bnVsbD9vLmtleTpTdHJpbmcobikrU3RyaW5nKG8ua2V5PT1udWxsP2E6by5rZXkpO28udHlwZT09PUw/KG8ucGF0Y2hGbGFnJjEyOCYmaSsrLHI9ci5jb25jYXQoaWkoby5jaGlsZHJlbix0LHMpKSk6KHR8fG8udHlwZSE9PWNzKSYmci5wdXNoKHM9PW51bGw/bzpDcyhvLHtrZXk6c30pKX1pZihpPjEpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspcltlXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHJ9ZnVuY3Rpb24gRihlLHQpe3JldHVybiB2KGUpP2woe25hbWU6ZS5uYW1lfSx0LHtzZXR1cDplfSk6ZX1mdW5jdGlvbiBhaSgpe2xldCBlPUZzKCk7cmV0dXJuIGU/KGUuYXBwQ29udGV4dC5jb25maWcuaWRQcmVmaXh8fGB2YCkrYC1gK2UuaWRzWzBdK2UuaWRzWzFdKys6YGB9ZnVuY3Rpb24gb2koZSl7ZS5pZHM9W2UuaWRzWzBdK2UuaWRzWzJdKysrYC1gLDAsMF19ZnVuY3Rpb24gc2koZSl7bGV0IHQ9RnMoKSxuPXVuKG51bGwpO2lmKHQpe2xldCBpPXQucmVmcz09PXI/dC5yZWZzPXt9OnQucmVmcztPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxlLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+bi52YWx1ZSxzZXQ6ZT0+bi52YWx1ZT1lfSl9cmV0dXJuIG59ZnVuY3Rpb24gY2koZSx0KXtsZXQgbjtyZXR1cm4hISgobj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkpJiYhbi5jb25maWd1cmFibGUpfXZhciBsaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB1aShlLHQsbixpLGE9ITEpe2lmKHAoZSkpe2UuZm9yRWFjaCgoZSxyKT0+dWkoZSx0JiYocCh0KT90W3JdOnQpLG4saSxhKSk7cmV0dXJufWlmKElpKGkpJiYhYSl7aS5zaGFwZUZsYWcmNTEyJiZpLnR5cGUuX19hc3luY1Jlc29sdmVkJiZpLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCYmdWkoZSx0LG4saS5jb21wb25lbnQuc3ViVHJlZSk7cmV0dXJufWxldCBzPWkuc2hhcGVGbGFnJjQ/UXMoaS5jb21wb25lbnQpOmkuZWwsYz1hP251bGw6cyx7aTpsLHI6ZH09ZSxtPXQmJnQucixoPWwucmVmcz09PXI/bC5yZWZzPXt9OmwucmVmcyxnPWwuc2V0dXBTdGF0ZSxfPUEoZyksYj1nPT09cj9vOmU9PiFjaShoLGUpJiZmKF8sZSkseD0oZSx0KT0+ISh0JiZjaShoLHQpKTtpZihtIT1udWxsJiZtIT09ZCl7aWYoZGkodCkseShtKSloW21dPW51bGwsYihtKSYmKGdbbV09bnVsbCk7ZWxzZSBpZihqKG0pKXtsZXQgZT10O3gobSxlLmspJiYobS52YWx1ZT1udWxsKSxlLmsmJihoW2Uua109bnVsbCl9fWlmKHYoZCkpVm4oZCxsLDEyLFtjLGhdKTtlbHNle2xldCB0PXkoZCkscj1qKGQpO2lmKHR8fHIpe2xldCBpPSgpPT57aWYoZS5mKXtsZXQgbj10P2IoZCk/Z1tkXTpoW2RdOngoZCl8fCFlLms/ZC52YWx1ZTpoW2Uua107aWYoYSlwKG4pJiZ1KG4scyk7ZWxzZSBpZihwKG4pKW4uaW5jbHVkZXMocyl8fG4ucHVzaChzKTtlbHNlIGlmKHQpaFtkXT1bc10sYihkKSYmKGdbZF09aFtkXSk7ZWxzZXtsZXQgdD1bc107eChkLGUuaykmJihkLnZhbHVlPXQpLGUuayYmKGhbZS5rXT10KX19ZWxzZSB0PyhoW2RdPWMsYihkKSYmKGdbZF09YykpOnImJih4KGQsZS5rKSYmKGQudmFsdWU9YyksZS5rJiYoaFtlLmtdPWMpKX07aWYoYyl7bGV0IHQ9KCk9PntpKCksbGkuZGVsZXRlKGUpfTt0LmlkPS0xLGxpLnNldChlLHQpLElvKHQsbil9ZWxzZSBkaShlKSxpKCl9fX1mdW5jdGlvbiBkaShlKXtsZXQgdD1saS5nZXQoZSk7dCYmKHQuZmxhZ3N8PTgsbGkuZGVsZXRlKGUpKX12YXIgZmk9ITEscGk9KCk9PntmaXx8PShjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApLCEwKX0sbWk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYHN2Z2ApJiZlLnRhZ05hbWUhPT1gZm9yZWlnbk9iamVjdGAsaGk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApLGdpPWU9PntpZihlLm5vZGVUeXBlPT09MSl7aWYobWkoZSkpcmV0dXJuYHN2Z2A7aWYoaGkoZSkpcmV0dXJuYG1hdGhtbGB9fSxfaT1lPT5lLm5vZGVUeXBlPT09ODtmdW5jdGlvbiB2aShlKXtsZXR7bXQ6dCxwOm4sbzp7cGF0Y2hQcm9wOnIsY3JlYXRlVGV4dDppLG5leHRTaWJsaW5nOmEscGFyZW50Tm9kZTpvLHJlbW92ZTpjLGluc2VydDpsLGNyZWF0ZUNvbW1lbnQ6dX19PWUsZD0oZSx0KT0+e2lmKCF0Lmhhc0NoaWxkTm9kZXMoKSl7bihudWxsLGUsdCksaXIoKSx0Ll92bm9kZT1lO3JldHVybn1mKHQuZmlyc3RDaGlsZCxlLG51bGwsbnVsbCxudWxsKSxpcigpLHQuX3Zub2RlPWV9LGY9KG4scixzLGMsdSxkPSExKT0+e2R8fD0hIXIuZHluYW1pY0NoaWxkcmVuO2xldCBiPV9pKG4pJiZuLmRhdGE9PT1gW2AseD0oKT0+ZyhuLHIscyxjLHUsYikse3R5cGU6UyxyZWY6QyxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6ZWV9PXIsdGU9bi5ub2RlVHlwZTtyLmVsPW4sZWU9PT0tMiYmKGQ9ITEsci5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0IFQ9bnVsbDtzd2l0Y2goUyl7Y2FzZSBzczp0ZT09PTM/KG4uZGF0YSE9PXIuY2hpbGRyZW4mJihwaSgpLG4uZGF0YT1yLmNoaWxkcmVuKSxUPWEobikpOnIuY2hpbGRyZW49PT1gYD8obChyLmVsPWkoYGApLG8obiksbiksVD1uKTpUPXgoKTticmVhaztjYXNlIGNzOnkobik/KFQ9YShuKSx2KHIuZWw9bi5jb250ZW50LmZpcnN0Q2hpbGQsbixzKSk6VD10ZSE9PTh8fGI/eCgpOmEobik7YnJlYWs7Y2FzZSBsczppZihiJiYobj1hKG4pLHRlPW4ubm9kZVR5cGUpLHRlPT09MXx8dGU9PT0zKXtUPW47bGV0IGU9IXIuY2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8ci5zdGF0aWNDb3VudDt0KyspZSYmKHIuY2hpbGRyZW4rPVQubm9kZVR5cGU9PT0xP1Qub3V0ZXJIVE1MOlQuZGF0YSksdD09PXIuc3RhdGljQ291bnQtMSYmKHIuYW5jaG9yPVQpLFQ9YShUKTtyZXR1cm4gYj9hKFQpOlR9eCgpO2JyZWFrO2Nhc2UgTDpUPWI/aChuLHIscyxjLHUsZCk6eCgpO2JyZWFrO2RlZmF1bHQ6aWYodyYxKVQ9KHRlIT09MXx8ci50eXBlLnRvTG93ZXJDYXNlKCkhPT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkmJiF5KG4pP3goKTpwKG4scixzLGMsdSxkKTtlbHNlIGlmKHcmNil7ci5zbG90U2NvcGVJZHM9dTtsZXQgZT1vKG4pO2lmKFQ9Yj9fKG4pOl9pKG4pJiZuLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnRgP18obixuLmRhdGEsYHRlbGVwb3J0IGVuZGApOmEobiksdChyLGUsbnVsbCxzLGMsZ2koZSksZCksSWkocikmJiFyLnR5cGUuX19hc3luY1Jlc29sdmVkKXtsZXQgdDtiPyh0PUgoTCksdC5hbmNob3I9VD9ULnByZXZpb3VzU2libGluZzplLmxhc3RDaGlsZCk6dD1uLm5vZGVUeXBlPT09Mz9VKGBgKTpIKGBkaXZgKSx0LmVsPW4sci5jb21wb25lbnQuc3ViVHJlZT10fX1lbHNlIHcmNjQ/VD10ZT09PTg/ci50eXBlLmh5ZHJhdGUobixyLHMsYyx1LGQsZSxtKTp4KCk6dyYxMjgmJihUPXIudHlwZS5oeWRyYXRlKG4scixzLGMsZ2kobyhuKSksdSxkLGUsZikpfXJldHVybiBDIT1udWxsJiZ1aShDLG51bGwsYyxyKSxUfSxwPShlLHQsbixpLGEsbyk9PntvfHw9ISF0LmR5bmFtaWNDaGlsZHJlbjtsZXR7dHlwZTpsLGR5bmFtaWNQcm9wczp1LHByb3BzOmQscGF0Y2hGbGFnOmYsc2hhcGVGbGFnOnAsZGlyczpoLHRyYW5zaXRpb246Z309dCxfPWw9PT1gaW5wdXRgfHxsPT09YG9wdGlvbmAsYj0hIXU7aWYoX3x8Ynx8ZiE9PS0xKXtoJiZfcih0LG51bGwsbixgY3JlYXRlZGApO2xldCBsPSExO2lmKHkoZSkpe2w9SG8obnVsbCxnKSYmbiYmbi52bm9kZS5wcm9wcyYmbi52bm9kZS5wcm9wcy5hcHBlYXI7bGV0IHI9ZS5jb250ZW50LmZpcnN0Q2hpbGQ7aWYobCl7bGV0IGU9ci5nZXRBdHRyaWJ1dGUoYGNsYXNzYCk7ZSYmKHIuJGNscz1lKSxnLmJlZm9yZUVudGVyKHIpfXYocixlLG4pLHQuZWw9ZT1yfWlmKHAmMTYmJiEoZCYmKGQuaW5uZXJIVE1MfHxkLnRleHRDb250ZW50KSkpe2xldCByPW0oZS5maXJzdENoaWxkLHQsZSxuLGksYSxvKTtmb3IociYmIUNpKGUsMSkmJnBpKCk7cjspe2xldCBlPXI7cj1yLm5leHRTaWJsaW5nLGMoZSl9fWVsc2UgaWYocCY4KXtsZXQgbj10LmNoaWxkcmVuO25bMF09PT1gCmAmJihlLnRhZ05hbWU9PT1gUFJFYHx8ZS50YWdOYW1lPT09YFRFWFRBUkVBYCkmJihuPW4uc2xpY2UoMSkpO2xldHt0ZXh0Q29udGVudDpyfT1lO3IhPT1uJiZyIT09bi5yZXBsYWNlKC9cclxufFxyL2csYApgKSYmKENpKGUsMCl8fHBpKCksZS50ZXh0Q29udGVudD10LmNoaWxkcmVuKX1pZihkKXtpZihffHxifHwhb3x8ZiY0OCl7bGV0IHQ9ZS50YWdOYW1lLmluY2x1ZGVzKGAtYCksaT1lLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhgc3ZnYCk/YHN2Z2A6ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApP2BtYXRobWxgOnZvaWQgMDtmb3IobGV0IGEgaW4gZClpZihfJiYoYS5lbmRzV2l0aChgdmFsdWVgKXx8YT09PWBpbmRldGVybWluYXRlYCl8fHMoYSkmJiFuZShhKXx8YVswXT09PWAuYHx8dCYmIW5lKGEpfHx1JiZ1LmluY2x1ZGVzKGEpKXtpZihiaShlLGEsZFthXSkpY29udGludWU7cihlLGEsbnVsbCxkW2FdLGksbil9fWVsc2UgaWYoZC5vbkNsaWNrKXIoZSxgb25DbGlja2AsbnVsbCxkLm9uQ2xpY2ssdm9pZCAwLG4pO2Vsc2UgaWYoZiY0JiZubihkLnN0eWxlKSlmb3IobGV0IGUgaW4gZC5zdHlsZSlkLnN0eWxlW2VdfWxldCB4Oyh4PWQmJmQub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoeCxuLHQpLGgmJl9yKHQsbnVsbCxuLGBiZWZvcmVNb3VudGApLCgoeD1kJiZkLm9uVm5vZGVNb3VudGVkKXx8aHx8bCkmJmlzKCgpPT57eCYmQXMoeCxuLHQpLGwmJmcuZW50ZXIoZSksaCYmX3IodCxudWxsLG4sYG1vdW50ZWRgKX0saSl9cmV0dXJuIGUubmV4dFNpYmxpbmd9LG09KGUsdCxyLG8scyxjLHUpPT57dXx8PSEhdC5keW5hbWljQ2hpbGRyZW47bGV0IGQ9dC5jaGlsZHJlbixwPWQubGVuZ3RoLG09ITE7Zm9yKGxldCB0PTA7dDxwO3QrKyl7bGV0IGg9dT9kW3RdOmRbdF09RXMoZFt0XSksZz1oLnR5cGU9PT1zcztlPyhnJiYhdSYmdCsxPHAmJkVzKGRbdCsxXSkudHlwZT09PXNzJiYobChpKGUuZGF0YS5zbGljZShoLmNoaWxkcmVuLmxlbmd0aCkpLHIsYShlKSksZS5kYXRhPWguY2hpbGRyZW4pLGU9ZihlLGgsbyxzLGMsdSkpOmcmJiFoLmNoaWxkcmVuP2woaC5lbD1pKGBgKSxyKToobXx8KG09ITAsQ2kociwxKXx8cGkoKSksbihudWxsLGgscixudWxsLG8scyxnaShyKSxjKSl9cmV0dXJuIGV9LGg9KGUsdCxuLHIsaSxzKT0+e2xldHtzbG90U2NvcGVJZHM6Y309dDtjJiYoaT1pP2kuY29uY2F0KGMpOmMpO2xldCBkPW8oZSksZj1tKGEoZSksdCxkLG4scixpLHMpO3JldHVybiBmJiZfaShmKSYmZi5kYXRhPT09YF1gP2EodC5hbmNob3I9Zik6KHBpKCksbCh0LmFuY2hvcj11KGBdYCksZCxmKSxmKX0sZz0oZSx0LHIsaSxzLGwpPT57aWYoVGkoZSx0KXx8cGkoKSx0LmVsPW51bGwsbCl7bGV0IHQ9XyhlKTtmb3IoOzspe2xldCBuPWEoZSk7aWYobiYmbiE9PXQpYyhuKTtlbHNlIGJyZWFrfX1sZXQgdT1hKGUpLGQ9byhlKTtyZXR1cm4gYyhlKSxuKG51bGwsdCxkLHUscixpLGdpKGQpLHMpLHImJihyLnZub2RlLmVsPXQuZWwsX28ocix0LmVsKSksdX0sXz0oZSx0PWBbYCxuPWBdYCk9PntsZXQgcj0wO2Zvcig7ZTspaWYoZT1hKGUpLGUmJl9pKGUpJiYoZS5kYXRhPT09dCYmcisrLGUuZGF0YT09PW4pKXtpZihyPT09MClyZXR1cm4gYShlKTtyLS19cmV0dXJuIGV9LHY9KGUsdCxuKT0+e2xldCByPXQucGFyZW50Tm9kZTtyJiZyLnJlcGxhY2VDaGlsZChlLHQpO2xldCBpPW47Zm9yKDtpOylpLnZub2RlLmVsPT09dCYmKGkudm5vZGUuZWw9aS5zdWJUcmVlLmVsPWUpLGk9aS5wYXJlbnR9LHk9ZT0+ZS5ub2RlVHlwZT09PTEmJmUudGFnTmFtZT09PWBURU1QTEFURWA7cmV0dXJuW2QsZl19dmFyIHlpPW5ldyBTZXQoW2BzcmNgLGBzcmNzZXRgLGBocmVmYCxgcG9zdGVyYF0pO2Z1bmN0aW9uIGJpKGUsdCxuKXtyZXR1cm4geWkuaGFzKHQpP2UuZ2V0QXR0cmlidXRlKHQpPT09KG49PW51bGw/bnVsbDpgJHtufWApOiExfXZhciB4aT1gZGF0YS1hbGxvdy1taXNtYXRjaGAsU2k9ezA6YHRleHRgLDE6YGNoaWxkcmVuYCwyOmBjbGFzc2AsMzpgc3R5bGVgLDQ6YGF0dHJpYnV0ZWB9O2Z1bmN0aW9uIENpKGUsdCl7aWYodD09PTB8fHQ9PT0xKWZvcig7ZSYmIWUuaGFzQXR0cmlidXRlKHhpKTspZT1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIHdpKGUmJmUuZ2V0QXR0cmlidXRlKHhpKSx0KX1mdW5jdGlvbiB3aShlLHQpe2lmKGU9PW51bGwpcmV0dXJuITE7aWYoZT09PWBgKXJldHVybiEwO3tsZXQgbj1lLnNwbGl0KGAsYCk7cmV0dXJuIHQ9PT0wJiZuLmluY2x1ZGVzKGBjaGlsZHJlbmApPyEwOm4uaW5jbHVkZXMoU2lbdF0pfX1mdW5jdGlvbiBUaShlLHQpe3JldHVybiBDaShlLnBhcmVudEVsZW1lbnQsMSl8fEVpKGUpfHxEaSh0KX1mdW5jdGlvbiBFaShlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTEmJndpKGUuZ2V0QXR0cmlidXRlKHhpKSwxKX1mdW5jdGlvbiBEaSh7cHJvcHM6ZX0pe2xldCB0PWUmJmVbeGldO3JldHVybiB0eXBlb2YgdD09YHN0cmluZ2AmJndpKHQsMSl9dmFyIE9pPW1lKCkucmVxdWVzdElkbGVDYWxsYmFja3x8KGU9PnNldFRpbWVvdXQoZSwxKSksa2k9bWUoKS5jYW5jZWxJZGxlQ2FsbGJhY2t8fChlPT5jbGVhclRpbWVvdXQoZSkpLEFpPShlPTFlNCk9PnQ9PntsZXQgbj1PaSh0LHt0aW1lb3V0OmV9KTtyZXR1cm4oKT0+a2kobil9O2Z1bmN0aW9uIGppKGUpe2xldHt0b3A6dCxsZWZ0Om4sYm90dG9tOnIscmlnaHQ6aX09ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7aW5uZXJIZWlnaHQ6YSxpbm5lcldpZHRoOm99PXdpbmRvdztyZXR1cm4odD4wJiZ0PGF8fHI+MCYmcjxhKSYmKG4+MCYmbjxvfHxpPjAmJmk8byl9dmFyIE1pPWU9Pih0LG4pPT57bGV0IHI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGU9Pntmb3IobGV0IG4gb2YgZSlpZihuLmlzSW50ZXJzZWN0aW5nKXtyLmRpc2Nvbm5lY3QoKSx0KCk7YnJlYWt9fSxlKTtyZXR1cm4gbihlPT57aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpe2lmKGppKGUpKXJldHVybiB0KCksci5kaXNjb25uZWN0KCksITE7ci5vYnNlcnZlKGUpfX0pLCgpPT5yLmRpc2Nvbm5lY3QoKX0sTmk9ZT0+dD0+e2lmKGUpe2xldCBuPW1hdGNoTWVkaWEoZSk7aWYobi5tYXRjaGVzKXQoKTtlbHNlIHJldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCx7b25jZTohMH0pLCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCl9fSxQaT0oZT1bXSk9Pih0LG4pPT57eShlKSYmKGU9W2VdKTtsZXQgcj0hMSxpPWU9PntyfHwocj0hMCxhKCksdCgpLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLGUpKSl9LGE9KCk9PntuKHQ9Pntmb3IobGV0IG4gb2YgZSl0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpKX0pfTtyZXR1cm4gbih0PT57Zm9yKGxldCBuIG9mIGUpdC5hZGRFdmVudExpc3RlbmVyKG4saSx7b25jZTohMH0pfSksYX07ZnVuY3Rpb24gRmkoZSx0KXtpZihfaShlKSYmZS5kYXRhPT09YFtgKXtsZXQgbj0xLHI9ZS5uZXh0U2libGluZztmb3IoO3I7KXtpZihyLm5vZGVUeXBlPT09MSl7aWYodChyKT09PSExKWJyZWFrfWVsc2UgaWYoX2kocikpe2lmKHIuZGF0YT09PWBdYCl7aWYoLS1uPT09MClicmVha31lbHNlIHIuZGF0YT09PWBbYCYmbisrfXI9ci5uZXh0U2libGluZ319ZWxzZSB0KGUpfXZhciBJaT1lPT4hIWUudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIExpKGUpe3YoZSkmJihlPXtsb2FkZXI6ZX0pO2xldHtsb2FkZXI6dCxsb2FkaW5nQ29tcG9uZW50Om4sZXJyb3JDb21wb25lbnQ6cixkZWxheTppPTIwMCxoeWRyYXRlOmEsdGltZW91dDpvLHN1c3BlbnNpYmxlOnM9ITAsb25FcnJvcjpjfT1lLGw9bnVsbCx1LGQ9MCxmPSgpPT4oZCsrLGw9bnVsbCxwKCkpLHA9KCk9PntsZXQgZTtyZXR1cm4gbHx8KGU9bD10KCkuY2F0Y2goZT0+e2lmKGU9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKSxjKXJldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2MoZSwoKT0+dChmKCkpLCgpPT5uKGUpLGQrMSl9KTt0aHJvdyBlfSkudGhlbih0PT5lIT09bCYmbD9sOih0JiYodC5fX2VzTW9kdWxlfHx0W1N5bWJvbC50b1N0cmluZ1RhZ109PT1gTW9kdWxlYCkmJih0PXQuZGVmYXVsdCksdT10LHQpKSl9O3JldHVybiBGKHtuYW1lOmBBc3luY0NvbXBvbmVudFdyYXBwZXJgLF9fYXN5bmNMb2FkZXI6cCxfX2FzeW5jSHlkcmF0ZShlLHQsbil7bGV0IHI9ZS5pc0Nvbm5lY3RlZCxpPSExOyh0LmJ1fHw9W10pLnB1c2goKCk9Pmk9ITApO2xldCBvPSgpPT57aXx8IWUucGFyZW50Tm9kZXx8ciYmIWUuaXNDb25uZWN0ZWR8fG4oKX0scz1hPygpPT57bGV0IG49YShvLHQ9PkZpKGUsdCkpO24mJih0LmJ1bXx8PVtdKS5wdXNoKG4pfTpvO3U/cygpOnAoKS50aGVuKCgpPT4hdC5pc1VubW91bnRlZCYmcygpKX0sZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiB1fSxzZXR1cCgpe2xldCBlPVBzO2lmKG9pKGUpLHUpcmV0dXJuKCk9PlJpKHUsZSk7bGV0IHQ9dD0+e2w9bnVsbCxVbih0LGUsMTMsIXIpfTtpZihzJiZlLnN1c3BlbnNlfHxWcylyZXR1cm4gcCgpLnRoZW4odD0+KCk9PlJpKHQsZSkpLmNhdGNoKGU9Pih0KGUpLCgpPT5yP0gocix7ZXJyb3I6ZX0pOm51bGwpKTtsZXQgYT1NKCExKSxjPU0oKSxkPU0oISFpKSxmLG07cmV0dXJuIHRhKCgpPT57ZiE9bnVsbCYmY2xlYXJUaW1lb3V0KGYpLG0hPW51bGwmJmNsZWFyVGltZW91dChtKX0pLGkmJihtPXNldFRpbWVvdXQoKCk9PntlLmlzVW5tb3VudGVkfHwoZC52YWx1ZT0hMSl9LGkpKSxvIT1udWxsJiYoZj1zZXRUaW1lb3V0KCgpPT57aWYoIWUuaXNVbm1vdW50ZWQmJiFhLnZhbHVlJiYhYy52YWx1ZSl7bGV0IGU9RXJyb3IoYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHtvfW1zLmApO3QoZSksYy52YWx1ZT1lfX0sbykpLHAoKS50aGVuKCgpPT57ZS5pc1VubW91bnRlZHx8KGEudmFsdWU9ITAsZS5wYXJlbnQmJnppKGUucGFyZW50LnZub2RlKSYmZS5wYXJlbnQudXBkYXRlKCkpfSkuY2F0Y2gobj0+e2lmKGUuaXNVbm1vdW50ZWQpe2w9bnVsbDtyZXR1cm59dChuKSxjLnZhbHVlPW59KSwoKT0+e2lmKGEudmFsdWUmJnUpcmV0dXJuIFJpKHUsZSk7aWYoYy52YWx1ZSYmcilyZXR1cm4gSChyLHtlcnJvcjpjLnZhbHVlfSk7aWYobiYmIWQudmFsdWUpcmV0dXJuIFJpKG4sZSl9fX0pfWZ1bmN0aW9uIFJpKGUsdCl7bGV0e3JlZjpuLHByb3BzOnIsY2hpbGRyZW46aSxjZTphfT10LnZub2RlLG89SChlLHIsaSk7cmV0dXJuIG8ucmVmPW4sby5jZT1hLGRlbGV0ZSB0LnZub2RlLmNlLG99dmFyIHppPWU9PmUudHlwZS5fX2lzS2VlcEFsaXZlLEJpPXtuYW1lOmBLZWVwQWxpdmVgLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9bi5jdHg7aWYoIXIucmVuZGVyZXIpcmV0dXJuKCk9PntsZXQgZT10LmRlZmF1bHQmJnQuZGVmYXVsdCgpO3JldHVybiBlJiZlLmxlbmd0aD09PTE/ZVswXTplfTtsZXQgaT1uZXcgTWFwLGE9bmV3IFNldCxvPW51bGwscz1uLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpjLG06bCx1bTp1LG86e2NyZWF0ZUVsZW1lbnQ6ZH19fT1yLGY9ZChgZGl2YCk7ci5hY3RpdmF0ZT0oZSx0LG4scixpKT0+e2xldCBhPWUuY29tcG9uZW50O2woZSx0LG4sMCxzKSxjKGEudm5vZGUsZSx0LG4sYSxzLHIsZS5zbG90U2NvcGVJZHMsaSksSW8oKCk9PnthLmlzRGVhY3RpdmF0ZWQ9ITEsYS5hJiZsZShhLmEpO2xldCB0PWUucHJvcHMmJmUucHJvcHMub25Wbm9kZU1vdW50ZWQ7dCYmQXModCxhLnBhcmVudCxlKX0scyl9LHIuZGVhY3RpdmF0ZT1lPT57bGV0IHQ9ZS5jb21wb25lbnQ7S28odC5tKSxLbyh0LmEpLGwoZSxmLG51bGwsMSxzKSxJbygoKT0+e3QuZGEmJmxlKHQuZGEpO2xldCBuPWUucHJvcHMmJmUucHJvcHMub25Wbm9kZVVubW91bnRlZDtuJiZBcyhuLHQucGFyZW50LGUpLHQuaXNEZWFjdGl2YXRlZD0hMH0scyl9O2Z1bmN0aW9uIHAoZSl7S2koZSksdShlLG4scywhMCl9ZnVuY3Rpb24gbShlKXtpLmZvckVhY2goKHQsbik9PntsZXQgcj0kcyhJaSh0KT90LnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTp0LnR5cGUpO3ImJiFlKHIpJiZoKG4pfSl9ZnVuY3Rpb24gaChlKXtsZXQgdD1pLmdldChlKTt0JiYoIW98fCFfcyh0LG8pKT9wKHQpOm8mJktpKG8pLGkuZGVsZXRlKGUpLGEuZGVsZXRlKGUpfUVyKCgpPT5bZS5pbmNsdWRlLGUuZXhjbHVkZV0sKFtlLHRdKT0+e2UmJm0odD0+VmkoZSx0KSksdCYmbShlPT4hVmkodCxlKSl9LHtmbHVzaDpgcG9zdGAsZGVlcDohMH0pO2xldCBnPW51bGwsXz0oKT0+e2chPW51bGwmJihKbyhuLnN1YlRyZWUudHlwZSk/SW8oKCk9PntpLnNldChnLHFpKG4uc3ViVHJlZSkpfSxuLnN1YlRyZWUuc3VzcGVuc2UpOmkuc2V0KGcscWkobi5zdWJUcmVlKSkpfTtyZXR1cm4gWmkoXyksJGkoXyksZWEoKCk9PntpLmZvckVhY2goZT0+e2xldHtzdWJUcmVlOnQsc3VzcGVuc2U6cn09bixpPXFpKHQpO2lmKGUudHlwZT09PWkudHlwZSYmZS5rZXk9PT1pLmtleSl7S2koaSk7bGV0IGU9aS5jb21wb25lbnQuZGE7ZSYmSW8oZSxyKTtyZXR1cm59cChlKX0pfSksKCk9PntpZihnPW51bGwsIXQuZGVmYXVsdClyZXR1cm4gbz1udWxsO2xldCBuPXQuZGVmYXVsdCgpLHI9blswXTtpZihuLmxlbmd0aD4xKXJldHVybiBvPW51bGwsbjtpZighZ3Mocil8fCEoci5zaGFwZUZsYWcmNCkmJiEoci5zaGFwZUZsYWcmMTI4KSlyZXR1cm4gbz1udWxsLHI7bGV0IHM9cWkocik7aWYocy50eXBlPT09Y3MpcmV0dXJuIG89bnVsbCxzO2xldCBjPXMudHlwZSxsPSRzKElpKHMpP3MudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmMpLHtpbmNsdWRlOnUsZXhjbHVkZTpkLG1heDpmfT1lO2lmKHUmJighbHx8IVZpKHUsbCkpfHxkJiZsJiZWaShkLGwpKXJldHVybiBzLnNoYXBlRmxhZyY9LTI1NyxvPXMscjtsZXQgcD1zLmtleT09bnVsbD9jOnMua2V5LG09aS5nZXQocCk7cmV0dXJuIHMuZWwmJihzPUNzKHMpLHIuc2hhcGVGbGFnJjEyOCYmKHIuc3NDb250ZW50PXMpKSxnPXAsbT8ocy5lbD1tLmVsLHMuY29tcG9uZW50PW0uY29tcG9uZW50LHMudHJhbnNpdGlvbiYmcmkocyxzLnRyYW5zaXRpb24pLHMuc2hhcGVGbGFnfD01MTIsYS5kZWxldGUocCksYS5hZGQocCkpOihhLmFkZChwKSxmJiZhLnNpemU+cGFyc2VJbnQoZiwxMCkmJmgoYS52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxzLnNoYXBlRmxhZ3w9MjU2LG89cyxKbyhyLnR5cGUpP3I6c319fTtmdW5jdGlvbiBWaShlLHQpe3JldHVybiBwKGUpP2Uuc29tZShlPT5WaShlLHQpKTp5KGUpP2Uuc3BsaXQoYCxgKS5pbmNsdWRlcyh0KTpfKGUpPyhlLmxhc3RJbmRleD0wLGUudGVzdCh0KSk6ITF9ZnVuY3Rpb24gSGkoZSx0KXtXaShlLGBhYCx0KX1mdW5jdGlvbiBVaShlLHQpe1dpKGUsYGRhYCx0KX1mdW5jdGlvbiBXaShlLHQsbj1Qcyl7bGV0IHI9ZS5fX3dkY3x8PSgpPT57bGV0IHQ9bjtmb3IoO3Q7KXtpZih0LmlzRGVhY3RpdmF0ZWQpcmV0dXJuO3Q9dC5wYXJlbnR9cmV0dXJuIGUoKX07aWYoSmkodCxyLG4pLG4pe2xldCBlPW4ucGFyZW50O2Zvcig7ZSYmZS5wYXJlbnQ7KXppKGUucGFyZW50LnZub2RlKSYmR2kocix0LG4sZSksZT1lLnBhcmVudH19ZnVuY3Rpb24gR2koZSx0LG4scil7bGV0IGk9SmkodCxlLHIsITApO3RhKCgpPT57dShyW3RdLGkpfSxuKX1mdW5jdGlvbiBLaShlKXtlLnNoYXBlRmxhZyY9LTI1NyxlLnNoYXBlRmxhZyY9LTUxM31mdW5jdGlvbiBxaShlKXtyZXR1cm4gZS5zaGFwZUZsYWcmMTI4P2Uuc3NDb250ZW50OmV9ZnVuY3Rpb24gSmkoZSx0LG49UHMscj0hMSl7aWYobil7bGV0IGk9bltlXXx8KG5bZV09W10pLGE9dC5fX3dlaHx8PSguLi5yKT0+e250KCk7bGV0IGk9UnMobiksYT1Ibih0LG4sZSxyKTtyZXR1cm4gaSgpLHJ0KCksYX07cmV0dXJuIHI/aS51bnNoaWZ0KGEpOmkucHVzaChhKSxhfX12YXIgWWk9ZT0+KHQsbj1Qcyk9PnsoIVZzfHxlPT09YHNwYCkmJkppKGUsKC4uLmUpPT50KC4uLmUpLG4pfSxYaT1ZaShgYm1gKSxaaT1ZaShgbWApLFFpPVlpKGBidWApLCRpPVlpKGB1YCksZWE9WWkoYGJ1bWApLHRhPVlpKGB1bWApLG5hPVlpKGBzcGApLHJhPVlpKGBydGdgKSxpYT1ZaShgcnRjYCk7ZnVuY3Rpb24gYWEoZSx0PVBzKXtKaShgZWNgLGUsdCl9dmFyIG9hPWBjb21wb25lbnRzYCxzYT1gZGlyZWN0aXZlc2A7ZnVuY3Rpb24gY2EoZSx0KXtyZXR1cm4gZmEob2EsZSwhMCx0KXx8ZX12YXIgbGE9U3ltYm9sLmZvcihgdi1uZGNgKTtmdW5jdGlvbiB1YShlKXtyZXR1cm4geShlKT9mYShvYSxlLCExKXx8ZTplfHxsYX1mdW5jdGlvbiBkYShlKXtyZXR1cm4gZmEoc2EsZSl9ZnVuY3Rpb24gZmEoZSx0LG49ITAscj0hMSl7bGV0IGk9dXJ8fFBzO2lmKGkpe2xldCBuPWkudHlwZTtpZihlPT09b2Epe2xldCBlPSRzKG4sITEpO2lmKGUmJihlPT09dHx8ZT09PUUodCl8fGU9PT1zZShFKHQpKSkpcmV0dXJuIG59bGV0IGE9cGEoaVtlXXx8bltlXSx0KXx8cGEoaS5hcHBDb250ZXh0W2VdLHQpO3JldHVybiFhJiZyP246YX19ZnVuY3Rpb24gcGEoZSx0KXtyZXR1cm4gZSYmKGVbdF18fGVbRSh0KV18fGVbc2UoRSh0KSldKX1mdW5jdGlvbiBtYShlLHQsbixyKXtsZXQgaSxhPW4mJm5bcl0sbz1wKGUpO2lmKG98fHkoZSkpe2xldCBuPW8mJm5uKGUpLHI9ITEscz0hMTtuJiYocj0hYW4oZSkscz1ybihlKSxlPV90KGUpKSxpPUFycmF5KGUubGVuZ3RoKTtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspaVtuXT10KHI/cz9sbihjbihlW25dKSk6Y24oZVtuXSk6ZVtuXSxuLHZvaWQgMCxhJiZhW25dKX1lbHNlIGlmKHR5cGVvZiBlPT1gbnVtYmVyYCl7aT1BcnJheShlKTtmb3IobGV0IG49MDtuPGU7bisrKWlbbl09dChuKzEsbix2b2lkIDAsYSYmYVtuXSl9ZWxzZSBpZih4KGUpKXtpZihlW1N5bWJvbC5pdGVyYXRvcl0paT1BcnJheS5mcm9tKGUsKGUsbik9PnQoZSxuLHZvaWQgMCxhJiZhW25dKSk7ZWxzZXtsZXQgbj1PYmplY3Qua2V5cyhlKTtpPUFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2xldCBvPW5bcl07aVtyXT10KGVbb10sbyxyLGEmJmFbcl0pfX19ZWxzZSBpPVtdO3JldHVybiBuJiYobltyXT1pKSxpfWZ1bmN0aW9uIGhhKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07aWYocChyKSlmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllW3JbdF0ubmFtZV09clt0XS5mbjtlbHNlIHImJihlW3IubmFtZV09ci5rZXk/KC4uLmUpPT57bGV0IHQ9ci5mbiguLi5lKTtyZXR1cm4gdCYmKHQua2V5PXIua2V5KSx0fTpyLmZuKX1yZXR1cm4gZX1mdW5jdGlvbiBJKGUsdCxuLHIsaSxhKXtpZihuPz89e30sdXIuY2V8fHVyLnBhcmVudCYmSWkodXIucGFyZW50KSYmdXIucGFyZW50LmNlKXtsZXQgZT1hIT1udWxsJiZuLmtleT09bnVsbD9sKHt9LG4se2tleTphfSk6bixpPU9iamVjdC5rZXlzKGUpLmxlbmd0aD4wO3JldHVybiB0IT09ImRlZmF1bHQiJiYoZS5uYW1lPXQpLFIoKSxCKEwsbnVsbCxbSChgc2xvdGAsZSxyJiZyKCkpXSxpPy0yOjY0KX1sZXQgbz1lW3RdO28mJm8uX2MmJihvLl9kPSExKTtsZXQgcz11cy5sZW5ndGg7UigpO2xldCBjO3RyeXtsZXQgaT1vJiZnYShvKG4pKSxzPW4ua2V5fHxhfHxpJiZpLmtleTtjPUIoTCx7a2V5OihzJiYhYihzKT9zOmBfJHt0fWApKyghaSYmcj9gX2ZiYDpgYCl9LGl8fChyP3IoKTpbXSksaSYmZS5fPT09MT82NDotMil9Y2F0Y2goZSl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPnM7ZS0tKWZzKCk7dGhyb3cgZX1maW5hbGx5e28mJm8uX2MmJihvLl9kPSEwKX1yZXR1cm4haSYmYy5zY29wZUlkJiYoYy5zbG90U2NvcGVJZHM9W2Muc2NvcGVJZCtgLXNgXSksY31mdW5jdGlvbiBnYShlKXtyZXR1cm4gZS5zb21lKGU9PiFncyhlKXx8IShlLnR5cGU9PT1jc3x8ZS50eXBlPT09TCYmIWdhKGUuY2hpbGRyZW4pKSk/ZTpudWxsfWZ1bmN0aW9uIF9hKGUsdCl7bGV0IG49e307Zm9yKGxldCByIGluIGUpblt0JiYvW0EtWl0vLnRlc3Qocik/YG9uOiR7cn1gOmNlKHIpXT1lW3JdO3JldHVybiBufXZhciB2YT1lPT5lP0JzKGUpP1FzKGUpOnZhKGUucGFyZW50KTpudWxsLHlhPWwoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDplPT5lLCRlbDplPT5lLnZub2RlLmVsLCRkYXRhOmU9PmUuZGF0YSwkcHJvcHM6ZT0+ZS5wcm9wcywkYXR0cnM6ZT0+ZS5hdHRycywkc2xvdHM6ZT0+ZS5zbG90cywkcmVmczplPT5lLnJlZnMsJHBhcmVudDplPT52YShlLnBhcmVudCksJHJvb3Q6ZT0+dmEoZS5yb290KSwkaG9zdDplPT5lLmNlLCRlbWl0OmU9PmUuZW1pdCwkb3B0aW9uczplPT5VYShlKSwkZm9yY2VVcGRhdGU6ZT0+ZS5mfHw9KCk9PntlcihlLnVwZGF0ZSl9LCRuZXh0VGljazplPT5lLm58fD1Rbi5iaW5kKGUucHJveHkpLCR3YXRjaDplPT5Pci5iaW5kKGUpfSksYmE9KGUsdCk9PmUhPT1yJiYhZS5fX2lzU2NyaXB0U2V0dXAmJmYoZSx0KSx4YT17Z2V0KHtfOmV9LHQpe2lmKHQ9PT1gX192X3NraXBgKXJldHVybiEwO2xldHtjdHg6bixzZXR1cFN0YXRlOmksZGF0YTphLHByb3BzOm8sYWNjZXNzQ2FjaGU6cyx0eXBlOmMsYXBwQ29udGV4dDpsfT1lO2lmKHRbMF0hPT1gJGApe2xldCBlPXNbdF07aWYoZSE9PXZvaWQgMClzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBpW3RdO2Nhc2UgMjpyZXR1cm4gYVt0XTtjYXNlIDQ6cmV0dXJuIG5bdF07Y2FzZSAzOnJldHVybiBvW3RdfWVsc2UgaWYoYmEoaSx0KSlyZXR1cm4gc1t0XT0xLGlbdF07ZWxzZSBpZihhIT09ciYmZihhLHQpKXJldHVybiBzW3RdPTIsYVt0XTtlbHNlIGlmKGYobyx0KSlyZXR1cm4gc1t0XT0zLG9bdF07ZWxzZSBpZihuIT09ciYmZihuLHQpKXJldHVybiBzW3RdPTQsblt0XTtlbHNlIFJhJiYoc1t0XT0wKX1sZXQgdT15YVt0XSxkLHA7aWYodSlyZXR1cm4gdD09PWAkYXR0cnNgJiZwdChlLmF0dHJzLGBnZXRgLGBgKSx1KGUpO2lmKChkPWMuX19jc3NNb2R1bGVzKSYmKGQ9ZFt0XSkpcmV0dXJuIGQ7aWYobiE9PXImJmYobix0KSlyZXR1cm4gc1t0XT00LG5bdF07aWYocD1sLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGYocCx0KSlyZXR1cm4gcFt0XX0sc2V0KHtfOmV9LHQsbil7bGV0e2RhdGE6aSxzZXR1cFN0YXRlOmEsY3R4Om99PWU7cmV0dXJuIGJhKGEsdCk/KGFbdF09biwhMCk6aSE9PXImJmYoaSx0KT8oaVt0XT1uLCEwKTpmKGUucHJvcHMsdCl8fHRbMF09PT1gJGAmJnQuc2xpY2UoMSlpbiBlPyExOihvW3RdPW4sITApfSxoYXMoe186e2RhdGE6ZSxzZXR1cFN0YXRlOnQsYWNjZXNzQ2FjaGU6bixjdHg6aSxhcHBDb250ZXh0OmEscHJvcHM6byx0eXBlOnN9fSxjKXtsZXQgbDtyZXR1cm4hIShuW2NdfHxlIT09ciYmY1swXSE9PWAkYCYmZihlLGMpfHxiYSh0LGMpfHxmKG8sYyl8fGYoaSxjKXx8Zih5YSxjKXx8ZihhLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGMpfHwobD1zLl9fY3NzTW9kdWxlcykmJmxbY10pfSxkZWZpbmVQcm9wZXJ0eShlLHQsbil7cmV0dXJuIG4uZ2V0PT1udWxsP2YobixgdmFsdWVgKSYmdGhpcy5zZXQoZSx0LG4udmFsdWUsbnVsbCk6ZS5fLmFjY2Vzc0NhY2hlW3RdPTAsUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbil9fSxTYT1sKHt9LHhhLHtnZXQoZSx0KXtpZih0IT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB4YS5nZXQoZSx0LGUpfSxoYXMoZSx0KXtyZXR1cm4gdFswXSE9PWBfYCYmIWhlKHQpfX0pO2Z1bmN0aW9uIENhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gd2EoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUYShlKXt9ZnVuY3Rpb24gRWEoZSl7fWZ1bmN0aW9uIERhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gT2EoKXt9ZnVuY3Rpb24ga2EoZSx0KXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBBYSgpe3JldHVybiBNYShgdXNlU2xvdHNgKS5zbG90c31mdW5jdGlvbiBqYSgpe3JldHVybiBNYShgdXNlQXR0cnNgKS5hdHRyc31mdW5jdGlvbiBNYShlKXtsZXQgdD1GcygpO3JldHVybiB0LnNldHVwQ29udGV4dHx8PVpzKHQpfWZ1bmN0aW9uIE5hKGUpe3JldHVybiBwKGUpP2UucmVkdWNlKChlLHQpPT4oZVt0XT1udWxsLGUpLHt9KTplfWZ1bmN0aW9uIFBhKGUsdCl7bGV0IG49TmEoZSk7Zm9yKGxldCBlIGluIHQpe2lmKGUuc3RhcnRzV2l0aChgX19za2lwYCkpY29udGludWU7bGV0IHI9bltlXTtyP3Aocil8fHYocik/cj1uW2VdPXt0eXBlOnIsZGVmYXVsdDp0W2VdfTpyLmRlZmF1bHQ9dFtlXTpyPT09bnVsbCYmKHI9bltlXT17ZGVmYXVsdDp0W2VdfSksciYmdFtgX19za2lwXyR7ZX1gXSYmKHIuc2tpcEZhY3Rvcnk9ITApfXJldHVybiBufWZ1bmN0aW9uIEZhKGUsdCl7cmV0dXJuIWV8fCF0P2V8fHQ6cChlKSYmcCh0KT9lLmNvbmNhdCh0KTpsKHt9LE5hKGUpLE5hKHQpKX1mdW5jdGlvbiBJYShlLHQpe2xldCBuPXt9O2ZvcihsZXQgciBpbiBlKXQuaW5jbHVkZXMocil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5lW3JdfSk7cmV0dXJuIG59ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9RnMoKSxuPVZzLHI9ZSgpO3pzKCksbiYmTHMoITEpO2xldCBpPSgpPT57UnModCksbiYmTHMoITApfSxhPSgpPT57RnMoKSE9PXQmJnQuc2NvcGUub2ZmKCksenMoKSxuJiZMcyghMSl9O3JldHVybiBTKHIpJiYocj1yLmNhdGNoKGU9Pnt0aHJvdyBpKCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhKSksZX0pKSxbciwoKT0+e2koKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfV19dmFyIFJhPSEwO2Z1bmN0aW9uIHphKGUpe2xldCB0PVVhKGUpLG49ZS5wcm94eSxyPWUuY3R4O1JhPSExLHQuYmVmb3JlQ3JlYXRlJiZWYSh0LmJlZm9yZUNyZWF0ZSxlLGBiY2ApO2xldHtkYXRhOmksY29tcHV0ZWQ6byxtZXRob2RzOnMsd2F0Y2g6Yyxwcm92aWRlOmwsaW5qZWN0OnUsY3JlYXRlZDpkLGJlZm9yZU1vdW50OmYsbW91bnRlZDptLGJlZm9yZVVwZGF0ZTpoLHVwZGF0ZWQ6ZyxhY3RpdmF0ZWQ6XyxkZWFjdGl2YXRlZDp5LGJlZm9yZURlc3Ryb3k6YixiZWZvcmVVbm1vdW50OlMsZGVzdHJveWVkOkMsdW5tb3VudGVkOncscmVuZGVyOmVlLHJlbmRlclRyYWNrZWQ6dGUscmVuZGVyVHJpZ2dlcmVkOlQsZXJyb3JDYXB0dXJlZDpuZSxzZXJ2ZXJQcmVmZXRjaDpyZSxleHBvc2U6aWUsaW5oZXJpdEF0dHJzOkUsY29tcG9uZW50czphZSxkaXJlY3RpdmVzOm9lLGZpbHRlcnM6c2V9PXQ7aWYodSYmQmEodSxyLG51bGwpLHMpZm9yKGxldCBlIGluIHMpe2xldCB0PXNbZV07dih0KSYmKHJbZV09dC5iaW5kKG4pKX1pZihpKXtsZXQgdD1pLmNhbGwobixuKTt4KHQpJiYoZS5kYXRhPVp0KHQpKX1pZihSYT0hMCxvKWZvcihsZXQgZSBpbiBvKXtsZXQgdD1vW2VdLGk9Vyh7Z2V0OnYodCk/dC5iaW5kKG4sbik6dih0LmdldCk/dC5nZXQuYmluZChuLG4pOmEsc2V0OiF2KHQpJiZ2KHQuc2V0KT90LnNldC5iaW5kKG4pOmF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmkudmFsdWUsc2V0OmU9PmkudmFsdWU9ZX0pfWlmKGMpZm9yKGxldCBlIGluIGMpSGEoY1tlXSxyLG4sZSk7aWYobCl7bGV0IGU9dihsKT9sLmNhbGwobik6bDtSZWZsZWN0Lm93bktleXMoZSkuZm9yRWFjaCh0PT57dnIodCxlW3RdKX0pfWQmJlZhKGQsZSxgY2ApO2Z1bmN0aW9uIGNlKGUsdCl7cCh0KT90LmZvckVhY2godD0+ZSh0LmJpbmQobikpKTp0JiZlKHQuYmluZChuKSl9aWYoY2UoWGksZiksY2UoWmksbSksY2UoUWksaCksY2UoJGksZyksY2UoSGksXyksY2UoVWkseSksY2UoYWEsbmUpLGNlKGlhLHRlKSxjZShyYSxUKSxjZShlYSxTKSxjZSh0YSx3KSxjZShuYSxyZSkscChpZSkpe2lmKGllLmxlbmd0aCl7bGV0IHQ9ZS5leHBvc2VkfHw9e307aWUuZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OigpPT5uW2VdLHNldDp0PT5uW2VdPXQsZW51bWVyYWJsZTohMH0pfSl9ZWxzZSBlLmV4cG9zZWR8fD17fX1lZSYmZS5yZW5kZXI9PT1hJiYoZS5yZW5kZXI9ZWUpLEUhPW51bGwmJihlLmluaGVyaXRBdHRycz1FKSxhZSYmKGUuY29tcG9uZW50cz1hZSksb2UmJihlLmRpcmVjdGl2ZXM9b2UpLHJlJiZvaShlKX1mdW5jdGlvbiBCYShlLHQsbj1hKXtwKGUpJiYoZT1KYShlKSk7Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl0saTtpPXgocik/YGRlZmF1bHRgaW4gcj95cihyLmZyb218fG4sci5kZWZhdWx0LCEwKTp5cihyLmZyb218fG4pOnlyKHIpLGooaSk/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pLnZhbHVlLHNldDplPT5pLnZhbHVlPWV9KTp0W25dPWl9fWZ1bmN0aW9uIFZhKGUsdCxuKXtIbihwKGUpP2UubWFwKGU9PmUuYmluZCh0LnByb3h5KSk6ZS5iaW5kKHQucHJveHkpLHQsbil9ZnVuY3Rpb24gSGEoZSx0LG4scil7bGV0IGk9ci5pbmNsdWRlcyhgLmApP2tyKG4scik6KCk9Pm5bcl07aWYoeShlKSl7bGV0IG49dFtlXTt2KG4pJiZFcihpLG4pfWVsc2UgaWYodihlKSlFcihpLGUuYmluZChuKSk7ZWxzZSBpZih4KGUpKXtpZihwKGUpKWUuZm9yRWFjaChlPT5IYShlLHQsbixyKSk7ZWxzZXtsZXQgcj12KGUuaGFuZGxlcik/ZS5oYW5kbGVyLmJpbmQobik6dFtlLmhhbmRsZXJdO3YocikmJkVyKGkscixlKX19fWZ1bmN0aW9uIFVhKGUpe2xldCB0PWUudHlwZSx7bWl4aW5zOm4sZXh0ZW5kczpyfT10LHttaXhpbnM6aSxvcHRpb25zQ2FjaGU6YSxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpvfX09ZS5hcHBDb250ZXh0LHM9YS5nZXQodCksYztyZXR1cm4gcz9jPXM6IWkubGVuZ3RoJiYhbiYmIXI/Yz10OihjPXt9LGkubGVuZ3RoJiZpLmZvckVhY2goZT0+V2EoYyxlLG8sITApKSxXYShjLHQsbykpLHgodCkmJmEuc2V0KHQsYyksY31mdW5jdGlvbiBXYShlLHQsbixyPSExKXtsZXR7bWl4aW5zOmksZXh0ZW5kczphfT10O2EmJldhKGUsYSxuLCEwKSxpJiZpLmZvckVhY2godD0+V2EoZSx0LG4sITApKTtmb3IobGV0IGkgaW4gdClpZighKHImJmk9PT1gZXhwb3NlYCkpe2xldCByPUdhW2ldfHxuJiZuW2ldO2VbaV09cj9yKGVbaV0sdFtpXSk6dFtpXX1yZXR1cm4gZX12YXIgR2E9e2RhdGE6S2EscHJvcHM6WmEsZW1pdHM6WmEsbWV0aG9kczpYYSxjb21wdXRlZDpYYSxiZWZvcmVDcmVhdGU6WWEsY3JlYXRlZDpZYSxiZWZvcmVNb3VudDpZYSxtb3VudGVkOllhLGJlZm9yZVVwZGF0ZTpZYSx1cGRhdGVkOllhLGJlZm9yZURlc3Ryb3k6WWEsYmVmb3JlVW5tb3VudDpZYSxkZXN0cm95ZWQ6WWEsdW5tb3VudGVkOllhLGFjdGl2YXRlZDpZYSxkZWFjdGl2YXRlZDpZYSxlcnJvckNhcHR1cmVkOllhLHNlcnZlclByZWZldGNoOllhLGNvbXBvbmVudHM6WGEsZGlyZWN0aXZlczpYYSx3YXRjaDpRYSxwcm92aWRlOkthLGluamVjdDpxYX07ZnVuY3Rpb24gS2EoZSx0KXtyZXR1cm4gdD9lP2Z1bmN0aW9uKCl7cmV0dXJuIGwodihlKT9lLmNhbGwodGhpcyx0aGlzKTplLHYodCk/dC5jYWxsKHRoaXMsdGhpcyk6dCl9OnQ6ZX1mdW5jdGlvbiBxYShlLHQpe3JldHVybiBYYShKYShlKSxKYSh0KSl9ZnVuY3Rpb24gSmEoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT1lW25dO3JldHVybiB0fXJldHVybiBlfWZ1bmN0aW9uIFlhKGUsdCl7cmV0dXJuIGU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGUsdCkpXTp0fWZ1bmN0aW9uIFhhKGUsdCl7cmV0dXJuIGU/bChPYmplY3QuY3JlYXRlKG51bGwpLGUsdCk6dH1mdW5jdGlvbiBaYShlLHQpe3JldHVybiBlP3AoZSkmJnAodCk/Wy4uLm5ldyBTZXQoWy4uLmUsLi4udF0pXTpsKE9iamVjdC5jcmVhdGUobnVsbCksTmEoZSksTmEodD8/e30pKTp0fWZ1bmN0aW9uIFFhKGUsdCl7aWYoIWUpcmV0dXJuIHQ7aWYoIXQpcmV0dXJuIGU7bGV0IG49bChPYmplY3QuY3JlYXRlKG51bGwpLGUpO2ZvcihsZXQgciBpbiB0KW5bcl09WWEoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiAkYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOm8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIGVvPTA7ZnVuY3Rpb24gdG8oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyPW51bGwpe3Yobil8fChuPWwoe30sbikpLHIhPW51bGwmJiF4KHIpJiYocj1udWxsKTtsZXQgaT0kYSgpLGE9bmV3IFdlYWtTZXQsbz1bXSxzPSExLGM9aS5hcHA9e191aWQ6ZW8rKyxfY29tcG9uZW50Om4sX3Byb3BzOnIsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OmksX2luc3RhbmNlOm51bGwsdmVyc2lvbjppYyxnZXQgY29uZmlnKCl7cmV0dXJuIGkuY29uZmlnfSxzZXQgY29uZmlnKGUpe30sdXNlKGUsLi4udCl7cmV0dXJuIGEuaGFzKGUpfHwoZSYmdihlLmluc3RhbGwpPyhhLmFkZChlKSxlLmluc3RhbGwoYywuLi50KSk6dihlKSYmKGEuYWRkKGUpLGUoYywuLi50KSkpLGN9LG1peGluKGUpe3JldHVybiBpLm1peGlucy5pbmNsdWRlcyhlKXx8aS5taXhpbnMucHVzaChlKSxjfSxjb21wb25lbnQoZSx0KXtyZXR1cm4gdD8oaS5jb21wb25lbnRzW2VdPXQsYyk6aS5jb21wb25lbnRzW2VdfSxkaXJlY3RpdmUoZSx0KXtyZXR1cm4gdD8oaS5kaXJlY3RpdmVzW2VdPXQsYyk6aS5kaXJlY3RpdmVzW2VdfSxtb3VudChhLG8sbCl7aWYoIXMpe2xldCB1PWMuX2NlVk5vZGV8fEgobixyKTtyZXR1cm4gdS5hcHBDb250ZXh0PWksbD09PSEwP2w9YHN2Z2A6bD09PSExJiYobD12b2lkIDApLG8mJnQ/dCh1LGEpOmUodSxhLGwpLHM9ITAsYy5fY29udGFpbmVyPWEsYS5fX3Z1ZV9hcHBfXz1jLFFzKHUuY29tcG9uZW50KX19LG9uVW5tb3VudChlKXtvLnB1c2goZSl9LHVubW91bnQoKXtzJiYoSG4obyxjLl9pbnN0YW5jZSwxNiksZShudWxsLGMuX2NvbnRhaW5lciksZGVsZXRlIGMuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUoZSx0KXtyZXR1cm4gaS5wcm92aWRlc1tlXT10LGN9LHJ1bldpdGhDb250ZXh0KGUpe2xldCB0PW5vO25vPWM7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtubz10fX19O3JldHVybiBjfX12YXIgbm89bnVsbDtmdW5jdGlvbiBybyhlLHQsbj1yKXtsZXQgaT1GcygpLGE9RSh0KSxvPW9lKHQpLHM9aW8oZSxhKSxjPXZuKChzLGMpPT57bGV0IGwsdT1yLGQ7cmV0dXJuIFRyKCgpPT57bGV0IHQ9ZVthXTtEKGwsdCkmJihsPXQsYygpKX0pLHtnZXQoKXtyZXR1cm4gcygpLG4uZ2V0P24uZ2V0KGwpOmx9LHNldChlKXtsZXQgcz1uLnNldD9uLnNldChlKTplO2lmKCFEKHMsbCkmJiEodSE9PXImJkQoZSx1KSkpcmV0dXJuO2xldCBmPWkudm5vZGUucHJvcHMscD0hIShmJiYodCBpbiBmfHxhIGluIGZ8fG8gaW4gZikmJihgb25VcGRhdGU6JHt0fWBpbiBmfHxgb25VcGRhdGU6JHthfWBpbiBmfHxgb25VcGRhdGU6JHtvfWBpbiBmKSk7cHx8KGw9ZSxjKCkpLGkuZW1pdChgdXBkYXRlOiR7dH1gLHMpLEQoZSx1KSYmKEQoZSxzKSYmIUQocyxkKXx8cCYmdSE9PXImJiFEKHMsbCkpJiZjKCksdT1lLGQ9c319fSk7cmV0dXJuIGNbU3ltYm9sLml0ZXJhdG9yXT0oKT0+e2xldCBlPTA7cmV0dXJue25leHQoKXtyZXR1cm4gZTwyP3t2YWx1ZTplKys/c3x8cjpjLGRvbmU6ITF9Ontkb25lOiEwfX19fSxjfXZhciBpbz0oZSx0KT0+dD09PWBtb2RlbFZhbHVlYHx8dD09PWBtb2RlbC12YWx1ZWA/ZS5tb2RlbE1vZGlmaWVyczplW2Ake3R9TW9kaWZpZXJzYF18fGVbYCR7RSh0KX1Nb2RpZmllcnNgXXx8ZVtgJHtvZSh0KX1Nb2RpZmllcnNgXTtmdW5jdGlvbiBhbyhlLHQsLi4ubil7aWYoZS5pc1VubW91bnRlZClyZXR1cm47bGV0IGk9ZS52bm9kZS5wcm9wc3x8cixhPW4sbz10LnN0YXJ0c1dpdGgoYHVwZGF0ZTpgKSxzPW8mJmlvKGksdC5zbGljZSg3KSk7cyYmKHMudHJpbSYmKGE9bi5tYXAoZT0+eShlKT9lLnRyaW0oKTplKSkscy5udW1iZXImJihhPW4ubWFwKGRlKSkpO2xldCBjLGw9aVtjPWNlKHQpXXx8aVtjPWNlKEUodCkpXTshbCYmbyYmKGw9aVtjPWNlKG9lKHQpKV0pLGwmJkhuKGwsZSw2LGEpO2xldCB1PWlbYytgT25jZWBdO2lmKHUpe2lmKCFlLmVtaXR0ZWQpZS5lbWl0dGVkPXt9O2Vsc2UgaWYoZS5lbWl0dGVkW2NdKXJldHVybjtlLmVtaXR0ZWRbY109ITAsSG4odSxlLDYsYSl9fXZhciBvbz1uZXcgV2Vha01hcDtmdW5jdGlvbiBzbyhlLHQsbj0hMSl7bGV0IHI9bj9vbzp0LmVtaXRzQ2FjaGUsaT1yLmdldChlKTtpZihpIT09dm9pZCAwKXJldHVybiBpO2xldCBhPWUuZW1pdHMsbz17fSxzPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57bGV0IG49c28oZSx0LCEwKTtuJiYocz0hMCxsKG8sbikpfTshbiYmdC5taXhpbnMubGVuZ3RoJiZ0Lm1peGlucy5mb3JFYWNoKHIpLGUuZXh0ZW5kcyYmcihlLmV4dGVuZHMpLGUubWl4aW5zJiZlLm1peGlucy5mb3JFYWNoKHIpfXJldHVybiFhJiYhcz8oeChlKSYmci5zZXQoZSxudWxsKSxudWxsKToocChhKT9hLmZvckVhY2goZT0+b1tlXT1udWxsKTpsKG8sYSkseChlKSYmci5zZXQoZSxvKSxvKX1mdW5jdGlvbiBjbyhlLHQpe3JldHVybiFlfHwhcyh0KT8hMToodD10LnNsaWNlKDIpLHQ9dD09PWBPbmNlYD90OnQucmVwbGFjZSgvT25jZSQvLGBgKSxmKGUsdFswXS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSkpfHxmKGUsb2UodCkpfHxmKGUsdCkpfWZ1bmN0aW9uIGxvKGUpe2xldHt0eXBlOnQsdm5vZGU6bixwcm94eTpyLHdpdGhQcm94eTppLHByb3BzT3B0aW9uczpbYV0sc2xvdHM6byxhdHRyczpzLGVtaXQ6bCxyZW5kZXI6dSxyZW5kZXJDYWNoZTpkLHByb3BzOmYsZGF0YTpwLHNldHVwU3RhdGU6bSxjdHg6aCxpbmhlcml0QXR0cnM6Z309ZSxfPWZyKGUpLHYseTt0cnl7aWYobi5zaGFwZUZsYWcmNCl7bGV0IGU9aXx8cix0PWU7dj1Fcyh1LmNhbGwodCxlLGQsZixtLHAsaCkpLHk9c31lbHNle2xldCBlPXQ7dj1FcyhlLmxlbmd0aD4xP2UoZix7YXR0cnM6cyxzbG90czpvLGVtaXQ6bH0pOmUoZixudWxsKSkseT10LnByb3BzP3M6Zm8ocyl9fWNhdGNoKHQpe3VzLmxlbmd0aD0wLFVuKHQsZSwxKSx2PUgoY3MpfWxldCBiPXY7aWYoeSYmZyE9PSExKXtsZXQgZT1PYmplY3Qua2V5cyh5KSx7c2hhcGVGbGFnOnR9PWI7ZS5sZW5ndGgmJnQmNyYmKGEmJmUuc29tZShjKSYmKHk9cG8oeSxhKSksYj1DcyhiLHksITEsITApKX1yZXR1cm4gbi5kaXJzJiYoYj1DcyhiLG51bGwsITEsITApLGIuZGlycz1iLmRpcnM/Yi5kaXJzLmNvbmNhdChuLmRpcnMpOm4uZGlycyksbi50cmFuc2l0aW9uJiZyaShNcihiLnR5cGUpJiZuaShiKXx8YixuLnRyYW5zaXRpb24pLHY9YixmcihfKSx2fWZ1bmN0aW9uIHVvKGUsdD0hMCl7bGV0IG47Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF07aWYoZ3Mocikpe2lmKHIudHlwZSE9PWNzfHxyLmNoaWxkcmVuPT09YHYtaWZgKXtpZihuKXJldHVybjtuPXJ9fWVsc2UgcmV0dXJufXJldHVybiBufXZhciBmbz1lPT57bGV0IHQ7Zm9yKGxldCBuIGluIGUpKG49PT1gY2xhc3NgfHxuPT09YHN0eWxlYHx8cyhuKSkmJigodHx8PXt9KVtuXT1lW25dKTtyZXR1cm4gdH0scG89KGUsdCk9PntsZXQgbj17fTtmb3IobGV0IHIgaW4gZSkoIWMocil8fCEoci5zbGljZSg5KWluIHQpKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59O2Z1bmN0aW9uIG1vKGUsdCxuKXtsZXR7cHJvcHM6cixjaGlsZHJlbjppLGNvbXBvbmVudDphfT1lLHtwcm9wczpvLGNoaWxkcmVuOnMscGF0Y2hGbGFnOmN9PXQsbD1hLmVtaXRzT3B0aW9ucztpZih0LmRpcnN8fHQudHJhbnNpdGlvbilyZXR1cm4hMDtpZihuJiZjPj0wKXtpZihjJjEwMjQpcmV0dXJuITA7aWYoYyYxNilyZXR1cm4gcj9obyhyLG8sbCk6ISFvO2lmKGMmOCl7bGV0IGU9dC5keW5hbWljUHJvcHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPWVbdF07aWYoZ28obyxyLG4pJiYhY28obCxuKSlyZXR1cm4hMH19fWVsc2UgcmV0dXJuKGl8fHMpJiYoIXN8fCFzLiRzdGFibGUpPyEwOnI9PT1vPyExOnI/IW98fGhvKHIsbyxsKTohIW87cmV0dXJuITF9ZnVuY3Rpb24gaG8oZSx0LG4pe2xldCByPU9iamVjdC5rZXlzKHQpO2lmKHIubGVuZ3RoIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXJldHVybiEwO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKXtsZXQgYT1yW2ldO2lmKGdvKHQsZSxhKSYmIWNvKG4sYSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZ28oZSx0LG4pe2xldCByPWVbbl0saT10W25dO3JldHVybiBuPT09YHN0eWxlYCYmeChyKSYmeChpKT8hRWUocixpKTpyIT09aX1mdW5jdGlvbiBfbyh7dm5vZGU6ZSxwYXJlbnQ6dCxzdXNwZW5zZTpufSxyKXtmb3IoO3Q7KXtsZXQgbj10LnN1YlRyZWU7aWYobi5zdXNwZW5zZSYmbi5zdXNwZW5zZS5hY3RpdmVCcmFuY2g9PT1lJiYobi5zdXNwZW5zZS52bm9kZS5lbD1uLmVsPXIsZT1uKSxuPT09ZSkoZT10LnZub2RlKS5lbD1yLHQ9dC5wYXJlbnQ7ZWxzZSBicmVha31uJiZuLmFjdGl2ZUJyYW5jaD09PWUmJihuLnZub2RlLmVsPXIpfXZhciB2bz17fSx5bz0oKT0+T2JqZWN0LmNyZWF0ZSh2byksYm89ZT0+T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09dm87ZnVuY3Rpb24geG8oZSx0LG4scj0hMSl7bGV0IGk9e30sYT15bygpO2UucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLENvKGUsdCxpLGEpO2ZvcihsZXQgdCBpbiBlLnByb3BzT3B0aW9uc1swXSl0IGluIGl8fChpW3RdPXZvaWQgMCk7ZS5wcm9wcz1uP3I/aTpRdChpKTplLnR5cGUucHJvcHM/aTphLGUuYXR0cnM9YX1mdW5jdGlvbiBTbyhlLHQsbixyKXtsZXR7cHJvcHM6aSxhdHRyczphLHZub2RlOntwYXRjaEZsYWc6b319PWUscz1BKGkpLFtjXT1lLnByb3BzT3B0aW9ucyxsPSExO2lmKChyfHxvPjApJiYhKG8mMTYpKXtpZihvJjgpe2xldCBuPWUudm5vZGUuZHluYW1pY1Byb3BzO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtsZXQgbz1uW3JdO2lmKGNvKGUuZW1pdHNPcHRpb25zLG8pKWNvbnRpbnVlO2xldCB1PXRbb107aWYoYyl7aWYoZihhLG8pKXUhPT1hW29dJiYoYVtvXT11LGw9ITApO2Vsc2V7bGV0IHQ9RShvKTtpW3RdPXdvKGMscyx0LHUsZSwhMSl9fWVsc2UgdSE9PWFbb10mJihhW29dPXUsbD0hMCl9fX1lbHNle0NvKGUsdCxpLGEpJiYobD0hMCk7bGV0IHI7Zm9yKGxldCBhIGluIHMpKCF0fHwhZih0LGEpJiYoKHI9b2UoYSkpPT09YXx8IWYodCxyKSkpJiYoYz9uJiYoblthXSE9PXZvaWQgMHx8bltyXSE9PXZvaWQgMCkmJihpW2FdPXdvKGMscyxhLHZvaWQgMCxlLCEwKSk6ZGVsZXRlIGlbYV0pO2lmKGEhPT1zKWZvcihsZXQgZSBpbiBhKSghdHx8IWYodCxlKSkmJihkZWxldGUgYVtlXSxsPSEwKX1sJiZtdChlLmF0dHJzLGBzZXRgLGBgKX1mdW5jdGlvbiBDbyhlLHQsbixpKXtsZXRbYSxvXT1lLnByb3BzT3B0aW9ucyxzPSExLGM7aWYodClmb3IobGV0IHIgaW4gdCl7aWYobmUocikpY29udGludWU7bGV0IGw9dFtyXSx1O2EmJmYoYSx1PUUocikpPyFvfHwhby5pbmNsdWRlcyh1KT9uW3VdPWw6KGN8fD17fSlbdV09bDpjbyhlLmVtaXRzT3B0aW9ucyxyKXx8KCEociBpbiBpKXx8bCE9PWlbcl0pJiYoaVtyXT1sLHM9ITApfWlmKG8pe2xldCB0PUEobiksaT1jfHxyO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKXtsZXQgcz1vW3JdO25bc109d28oYSx0LHMsaVtzXSxlLCFmKGkscykpfX1yZXR1cm4gc31mdW5jdGlvbiB3byhlLHQsbixyLGksYSl7bGV0IG89ZVtuXTtpZihvIT1udWxsKXtsZXQgZT1mKG8sYGRlZmF1bHRgKTtpZihlJiZyPT09dm9pZCAwKXtsZXQgZT1vLmRlZmF1bHQ7aWYoby50eXBlIT09RnVuY3Rpb24mJiFvLnNraXBGYWN0b3J5JiZ2KGUpKXtsZXR7cHJvcHNEZWZhdWx0czphfT1pO2lmKG4gaW4gYSlyPWFbbl07ZWxzZXtsZXQgbz1ScyhpKTtyPWFbbl09ZS5jYWxsKG51bGwsdCksbygpfX1lbHNlIHI9ZTtpLmNlJiZpLmNlLl9zZXRQcm9wKG4scil9b1swXSYmKGEmJiFlP3I9ITE6b1sxXSYmKHI9PT1gYHx8cj09PW9lKG4pKSYmKHI9ITApKX1yZXR1cm4gcn12YXIgVG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRW8oZSx0LG49ITEpe2xldCBhPW4/VG86dC5wcm9wc0NhY2hlLG89YS5nZXQoZSk7aWYobylyZXR1cm4gbztsZXQgcz1lLnByb3BzLGM9e30sdT1bXSxkPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57ZD0hMDtsZXRbbixyXT1FbyhlLHQsITApO2woYyxuKSxyJiZ1LnB1c2goLi4ucil9OyFuJiZ0Lm1peGlucy5sZW5ndGgmJnQubWl4aW5zLmZvckVhY2gociksZS5leHRlbmRzJiZyKGUuZXh0ZW5kcyksZS5taXhpbnMmJmUubWl4aW5zLmZvckVhY2gocil9aWYoIXMmJiFkKXJldHVybiB4KGUpJiZhLnNldChlLGkpLGk7aWYocChzKSlmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IHQ9RShzW2VdKTtEbyh0KSYmKGNbdF09cil9ZWxzZSBpZihzKWZvcihsZXQgZSBpbiBzKXtsZXQgdD1FKGUpO2lmKERvKHQpKXtsZXQgbj1zW2VdLHI9Y1t0XT1wKG4pfHx2KG4pP3t0eXBlOm59Omwoe30sbiksaT1yLnR5cGUsYT0hMSxvPSEwO2lmKHAoaSkpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2xldCB0PWlbZV0sbj12KHQpJiZ0Lm5hbWU7aWYobj09PWBCb29sZWFuYCl7YT0hMDticmVha31uPT09YFN0cmluZ2AmJihvPSExKX1lbHNlIGE9dihpKSYmaS5uYW1lPT09YEJvb2xlYW5gO3JbMF09YSxyWzFdPW8sKGF8fGYocixgZGVmYXVsdGApKSYmdS5wdXNoKHQpfX1sZXQgbT1bYyx1XTtyZXR1cm4geChlKSYmYS5zZXQoZSxtKSxtfWZ1bmN0aW9uIERvKGUpe3JldHVybiBlWzBdIT09YCRgJiYhbmUoZSl9dmFyIE9vPWU9PmU9PT1gX2B8fGU9PT1gX2N0eGB8fGU9PT1gJHN0YWJsZWAsa289ZT0+cChlKT9lLm1hcChFcyk6W0VzKGUpXSxBbz0oZSx0LG4pPT57aWYodC5fbilyZXR1cm4gdDtsZXQgcj1QKCguLi5lKT0+a28odCguLi5lKSksbik7cmV0dXJuIHIuX2M9ITEscn0sam89KGUsdCxuKT0+e2xldCByPWUuX2N0eDtmb3IobGV0IG4gaW4gZSl7aWYoT28obikpY29udGludWU7bGV0IGk9ZVtuXTtpZih2KGkpKXRbbl09QW8obixpLHIpO2Vsc2UgaWYoaSE9bnVsbCl7bGV0IGU9a28oaSk7dFtuXT0oKT0+ZX19fSxNbz0oZSx0KT0+e2xldCBuPWtvKHQpO2Uuc2xvdHMuZGVmYXVsdD0oKT0+bn0sTm89KGUsdCxuKT0+e2ZvcihsZXQgciBpbiB0KShufHwhT28ocikpJiYoZVtyXT10W3JdKX0sUG89KGUsdCxuKT0+e2xldCByPWUuc2xvdHM9eW8oKTtpZihlLnZub2RlLnNoYXBlRmxhZyYzMil7bGV0IGU9dC5fO2U/KE5vKHIsdCxuKSxuJiZ1ZShyLGBfYCxlLCEwKSk6am8odCxyKX1lbHNlIHQmJk1vKGUsdCl9LEZvPShlLHQsbik9PntsZXR7dm5vZGU6aSxzbG90czphfT1lLG89ITAscz1yO2lmKGkuc2hhcGVGbGFnJjMyKXtsZXQgZT10Ll87ZT9uJiZlPT09MT9vPSExOk5vKGEsdCxuKToobz0hdC4kc3RhYmxlLGpvKHQsYSkpLHM9dH1lbHNlIHQmJihNbyhlLHQpLHM9e2RlZmF1bHQ6MX0pO2lmKG8pZm9yKGxldCBlIGluIGEpIU9vKGUpJiZzW2VdPT1udWxsJiZkZWxldGUgYVtlXX0sSW89aXM7ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIHpvKGUpfWZ1bmN0aW9uIFJvKGUpe3JldHVybiB6byhlLHZpKX1mdW5jdGlvbiB6byhlLHQpe2xldCBuPW1lKCk7bi5fX1ZVRV9fPSEwO2xldHtpbnNlcnQ6byxyZW1vdmU6cyxwYXRjaFByb3A6YyxjcmVhdGVFbGVtZW50OmwsY3JlYXRlVGV4dDp1LGNyZWF0ZUNvbW1lbnQ6ZCxzZXRUZXh0OmYsc2V0RWxlbWVudFRleHQ6cCxwYXJlbnROb2RlOm0sbmV4dFNpYmxpbmc6aCxzZXRTY29wZUlkOmc9YSxpbnNlcnRTdGF0aWNDb250ZW50Ol99PWUsdj0oZSx0LG4scj1udWxsLGk9bnVsbCxhPW51bGwsbz12b2lkIDAscz1udWxsLGM9ISF0LmR5bmFtaWNDaGlsZHJlbik9PntpZihlPT09dClyZXR1cm47ZSYmIV9zKGUsdCkmJihyPU8oZSksZ2UoZSxpLGEsITApLGU9bnVsbCksdC5wYXRjaEZsYWc9PT0tMiYmKGM9ITEsdC5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0e3R5cGU6bCxyZWY6dSxzaGFwZUZsYWc6ZH09dDtzd2l0Y2gobCl7Y2FzZSBzczp5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgY3M6YihlLHQsbixyKTticmVhaztjYXNlIGxzOmU/P3godCxuLHIsbyk7YnJlYWs7Y2FzZSBMOmFlKGUsdCxuLHIsaSxhLG8scyxjKTticmVhaztkZWZhdWx0OmQmMT93KGUsdCxuLHIsaSxhLG8scyxjKTpkJjY/b2UoZSx0LG4scixpLGEsbyxzLGMpOihkJjY0fHxkJjEyOCkmJmwucHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxDZSl9dSE9bnVsbCYmaT91aSh1LGUmJmUucmVmLGEsdHx8ZSwhdCk6dT09bnVsbCYmZSYmZS5yZWYhPW51bGwmJnVpKGUucmVmLG51bGwsYSxlLCEwKX0seT0oZSx0LG4scik9PntpZihlPT1udWxsKW8odC5lbD11KHQuY2hpbGRyZW4pLG4scik7ZWxzZXtsZXQgbj10LmVsPWUuZWw7dC5jaGlsZHJlbiE9PWUuY2hpbGRyZW4mJmYobix0LmNoaWxkcmVuKX19LGI9KGUsdCxuLHIpPT57ZT09bnVsbD9vKHQuZWw9ZCh0LmNoaWxkcmVufHxgYCksbixyKTp0LmVsPWUuZWx9LHg9KGUsdCxuLHIpPT57W2UuZWwsZS5hbmNob3JdPV8oZS5jaGlsZHJlbix0LG4scixlLmVsLGUuYW5jaG9yKX0sUz0oe2VsOmUsYW5jaG9yOnR9LG4scik9PntsZXQgaTtmb3IoO2UmJmUhPT10OylpPWgoZSksbyhlLG4sciksZT1pO28odCxuLHIpfSxDPSh7ZWw6ZSxhbmNob3I6dH0pPT57bGV0IG47Zm9yKDtlJiZlIT09dDspbj1oKGUpLHMoZSksZT1uO3ModCl9LHc9KGUsdCxuLHIsaSxhLG8scyxjKT0+e2lmKHQudHlwZT09PWBzdmdgP289YHN2Z2A6dC50eXBlPT09YG1hdGhgJiYobz1gbWF0aG1sYCksZT09bnVsbCllZSh0LG4scixpLGEsbyxzLGMpO2Vsc2V7bGV0IG49ZS5lbCYmZS5lbC5faXNWdWVDRT9lLmVsOm51bGw7dHJ5e24mJm4uX2JlZ2luUGF0Y2goKSxyZShlLHQsaSxhLG8scyxjKX1maW5hbGx5e24mJm4uX2VuZFBhdGNoKCl9fX0sZWU9KGUsdCxuLHIsaSxhLHMsdSk9PntsZXQgZCxmLHtwcm9wczptLHNoYXBlRmxhZzpoLHRyYW5zaXRpb246ZyxkaXJzOl99PWU7aWYoZD1lLmVsPWwoZS50eXBlLGEsbSYmbS5pcyxtKSxoJjg/cChkLGUuY2hpbGRyZW4pOmgmMTYmJlQoZS5jaGlsZHJlbixkLG51bGwscixpLEJvKGUsYSkscyx1KSxfJiZfcihlLG51bGwscixgY3JlYXRlZGApLHRlKGQsZSxlLnNjb3BlSWQscyxyKSxtKXtmb3IobGV0IGUgaW4gbSllIT09YHZhbHVlYCYmIW5lKGUpJiZjKGQsZSxudWxsLG1bZV0sYSxyKTtgdmFsdWVgaW4gbSYmYyhkLGB2YWx1ZWAsbnVsbCxtLnZhbHVlLGEpLChmPW0ub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoZixyLGUpfV8mJl9yKGUsbnVsbCxyLGBiZWZvcmVNb3VudGApO2xldCB2PUhvKGksZyk7diYmZy5iZWZvcmVFbnRlcihkKSxvKGQsdCxuKSwoKGY9bSYmbS5vblZub2RlTW91bnRlZCl8fHZ8fF8pJiZJbygoKT0+e3RyeXtmJiZBcyhmLHIsZSksdiYmZy5lbnRlcihkKSxfJiZfcihlLG51bGwscixgbW91bnRlZGApfWZpbmFsbHl7fX0saSl9LHRlPShlLHQsbixyLGkpPT57aWYobiYmZyhlLG4pLHIpZm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspZyhlLHJbdF0pO2lmKGkpe2xldCBuPWkuc3ViVHJlZTtpZih0PT09bnx8Sm8obi50eXBlKSYmKG4uc3NDb250ZW50PT09dHx8bi5zc0ZhbGxiYWNrPT09dCkpe2xldCB0PWkudm5vZGU7dGUoZSx0LHQuc2NvcGVJZCx0LnNsb3RTY29wZUlkcyxpLnBhcmVudCl9fX0sVD0oZSx0LG4scixpLGEsbyxzLGM9MCk9Pntmb3IobGV0IGw9YztsPGUubGVuZ3RoO2wrKyl7bGV0IGM9ZVtsXT1zP0RzKGVbbF0pOkVzKGVbbF0pO3YobnVsbCxjLHQsbixyLGksYSxvLHMpfX0scmU9KGUsdCxuLGksYSxvLHMpPT57bGV0IGw9dC5lbD1lLmVsLHtwYXRjaEZsYWc6dSxkeW5hbWljQ2hpbGRyZW46ZCxkaXJzOmZ9PXQ7dXw9ZS5wYXRjaEZsYWcmMTY7bGV0IG09ZS5wcm9wc3x8cixoPXQucHJvcHN8fHIsZztpZihuJiZWbyhuLCExKSwoZz1oLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZBcyhnLG4sdCxlKSxmJiZfcih0LGUsbixgYmVmb3JlVXBkYXRlYCksbiYmVm8obiwhMCksZCYmKCFlLmR5bmFtaWNDaGlsZHJlbnx8ZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoIT09ZC5sZW5ndGgpJiYodT0wLHM9ITEsZD1udWxsKSwobS5pbm5lckhUTUwmJmguaW5uZXJIVE1MPT1udWxsfHxtLnRleHRDb250ZW50JiZoLnRleHRDb250ZW50PT1udWxsKSYmcChsLGBgKSxkP2llKGUuZHluYW1pY0NoaWxkcmVuLGQsbCxuLGksQm8odCxhKSxvKTpzfHxkZShlLHQsbCxudWxsLG4saSxCbyh0LGEpLG8sITEpLHU+MCl7aWYodSYxNilFKGwsbSxoLG4sYSk7ZWxzZSBpZih1JjImJm0uY2xhc3MhPT1oLmNsYXNzJiZjKGwsYGNsYXNzYCxudWxsLGguY2xhc3MsYSksdSY0JiZjKGwsYHN0eWxlYCxtLnN0eWxlLGguc3R5bGUsYSksdSY4KXtsZXQgZT10LmR5bmFtaWNQcm9wcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxpPW1bcl0sbz1oW3JdOyhvIT09aXx8cj09PWB2YWx1ZWApJiZjKGwscixpLG8sYSxuKX19dSYxJiZlLmNoaWxkcmVuIT09dC5jaGlsZHJlbiYmcChsLHQuY2hpbGRyZW4pfWVsc2UhcyYmZD09bnVsbCYmRShsLG0saCxuLGEpOygoZz1oLm9uVm5vZGVVcGRhdGVkKXx8ZikmJklvKCgpPT57ZyYmQXMoZyxuLHQsZSksZiYmX3IodCxlLG4sYHVwZGF0ZWRgKX0saSl9LGllPShlLHQsbixyLGksYSxvKT0+e2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgYz1lW3NdLGw9dFtzXSx1PWMuZWwmJihjLnR5cGU9PT1MfHwhX3MoYyxsKXx8Yy5zaGFwZUZsYWcmMTk4KT9tKGMuZWwpOm47dihjLGwsdSxudWxsLHIsaSxhLG8sITApfX0sRT0oZSx0LG4saSxhKT0+e2lmKHQhPT1uKXtpZih0IT09cilmb3IobGV0IHIgaW4gdCkhbmUocikmJiEociBpbiBuKSYmYyhlLHIsdFtyXSxudWxsLGEsaSk7Zm9yKGxldCByIGluIG4pe2lmKG5lKHIpKWNvbnRpbnVlO2xldCBvPW5bcl0scz10W3JdO28hPT1zJiZyIT09YHZhbHVlYCYmYyhlLHIscyxvLGEsaSl9YHZhbHVlYGluIG4mJmMoZSxgdmFsdWVgLHQudmFsdWUsbi52YWx1ZSxhKX19LGFlPShlLHQsbixyLGksYSxzLGMsbCk9PntsZXQgZD10LmVsPWU/ZS5lbDp1KGBgKSxmPXQuYW5jaG9yPWU/ZS5hbmNob3I6dShgYCkse3BhdGNoRmxhZzpwLGR5bmFtaWNDaGlsZHJlbjptLHNsb3RTY29wZUlkczpofT10O2gmJihjPWM/Yy5jb25jYXQoaCk6aCksZT09bnVsbD8obyhkLG4sciksbyhmLG4sciksVCh0LmNoaWxkcmVufHxbXSxuLGYsaSxhLHMsYyxsKSk6cD4wJiZwJjY0JiZtJiZlLmR5bmFtaWNDaGlsZHJlbiYmZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoPT09bS5sZW5ndGg/KGllKGUuZHluYW1pY0NoaWxkcmVuLG0sbixpLGEscyxjKSwodC5rZXkhPW51bGx8fGkmJnQ9PT1pLnN1YlRyZWUpJiZVbyhlLHQsITApKTpkZShlLHQsbixmLGksYSxzLGMsbCl9LG9lPShlLHQsbixyLGksYSxvLHMsYyk9Pnt0LnNsb3RTY29wZUlkcz1zLGU9PW51bGw/dC5zaGFwZUZsYWcmNTEyP2kuY3R4LmFjdGl2YXRlKHQsbixyLG8sYyk6c2UodCxuLHIsaSxhLG8sYyk6Y2UoZSx0LGMpfSxzZT0oZSx0LG4scixpLGEsbyk9PntsZXQgcz1lLmNvbXBvbmVudD1OcyhlLHIsaSk7aWYoemkoZSkmJihzLmN0eC5yZW5kZXJlcj1DZSksSHMocywhMSxvKSxzLmFzeW5jRGVwKXtpZihpJiZpLnJlZ2lzdGVyRGVwKHMsRCxvKSwhZS5lbCl7bGV0IHI9cy5zdWJUcmVlPUgoY3MpO2IobnVsbCxyLHQsbiksZS5wbGFjZWhvbGRlcj1yLmVsfX1lbHNlIEQocyxlLHQsbixpLGEsbyl9LGNlPShlLHQsbik9PntsZXQgcj10LmNvbXBvbmVudD1lLmNvbXBvbmVudDtpZihtbyhlLHQsbikpe2lmKHIuYXN5bmNEZXAmJiFyLmFzeW5jUmVzb2x2ZWQpe3VlKHIsdCxuKTtyZXR1cm59ci5uZXh0PXQsci51cGRhdGUoKX1lbHNlIHQuZWw9ZS5lbCxyLnZub2RlPXR9LEQ9KGUsdCxuLHIsaSxhLG8pPT57bGV0IHM9KCk9PntpZihlLmlzTW91bnRlZCl7bGV0e25leHQ6dCxidTpuLHU6cixwYXJlbnQ6cyx2bm9kZTpjfT1lO3tsZXQgbj1HbyhlKTtpZihuKXt0JiYodC5lbD1jLmVsLHVlKGUsdCxvKSksbi5hc3luY0RlcC50aGVuKCgpPT57SW8oKCk9PntlLmlzVW5tb3VudGVkfHxsKCl9LGkpfSk7cmV0dXJufX1sZXQgdT10LGQ7Vm8oZSwhMSksdD8odC5lbD1jLmVsLHVlKGUsdCxvKSk6dD1jLG4mJmxlKG4pLChkPXQucHJvcHMmJnQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkFzKGQscyx0LGMpLFZvKGUsITApO2xldCBmPWxvKGUpLHA9ZS5zdWJUcmVlO2Uuc3ViVHJlZT1mLHYocCxmLG0ocC5lbCksTyhwKSxlLGksYSksdC5lbD1mLmVsLHU9PT1udWxsJiZfbyhlLGYuZWwpLHImJklvKHIsaSksKGQ9dC5wcm9wcyYmdC5wcm9wcy5vblZub2RlVXBkYXRlZCkmJklvKCgpPT5BcyhkLHMsdCxjKSxpKX1lbHNle2xldCBvLHtlbDpzLHByb3BzOmN9PXQse2JtOmwsbTp1LHBhcmVudDpkLHJvb3Q6Zix0eXBlOnB9PWUsbT1JaSh0KTtpZihWbyhlLCExKSxsJiZsZShsKSwhbSYmKG89YyYmYy5vblZub2RlQmVmb3JlTW91bnQpJiZBcyhvLGQsdCksVm8oZSwhMCkscyYmVGUpe2xldCB0PSgpPT57ZS5zdWJUcmVlPWxvKGUpLFRlKHMsZS5zdWJUcmVlLGUsaSxudWxsKX07bSYmcC5fX2FzeW5jSHlkcmF0ZT9wLl9fYXN5bmNIeWRyYXRlKHMsZSx0KTp0KCl9ZWxzZXtmLmNlJiZmLmNlLl9oYXNTaGFkb3dSb290KCkmJmYuY2UuX2luamVjdENoaWxkU3R5bGUocCxlLnBhcmVudD9lLnBhcmVudC50eXBlOnZvaWQgMCk7bGV0IG89ZS5zdWJUcmVlPWxvKGUpO3YobnVsbCxvLG4scixlLGksYSksdC5lbD1vLmVsfWlmKHUmJklvKHUsaSksIW0mJihvPWMmJmMub25Wbm9kZU1vdW50ZWQpKXtsZXQgZT10O0lvKCgpPT5BcyhvLGQsZSksaSl9KHQuc2hhcGVGbGFnJjI1Nnx8ZCYmSWkoZC52bm9kZSkmJmQudm5vZGUuc2hhcGVGbGFnJjI1NikmJmUuYSYmSW8oZS5hLGkpLGUuaXNNb3VudGVkPSEwLHQ9bj1yPW51bGx9fTtlLnNjb3BlLm9uKCk7bGV0IGM9ZS5lZmZlY3Q9bmV3IHplKHMpO2Uuc2NvcGUub2ZmKCk7bGV0IGw9ZS51cGRhdGU9Yy5ydW4uYmluZChjKSx1PWUuam9iPWMucnVuSWZEaXJ0eS5iaW5kKGMpO3UuaT1lLHUuaWQ9ZS51aWQsYy5zY2hlZHVsZXI9KCk9PmVyKHUpLFZvKGUsITApLGwoKX0sdWU9KGUsdCxuKT0+e3QuY29tcG9uZW50PWU7bGV0IHI9ZS52bm9kZS5wcm9wcztlLnZub2RlPXQsZS5uZXh0PW51bGwsU28oZSx0LnByb3BzLHIsbiksRm8oZSx0LmNoaWxkcmVuLG4pLG50KCkscnIoZSkscnQoKX0sZGU9KGUsdCxuLHIsaSxhLG8scyxjPSExKT0+e2xldCBsPWUmJmUuY2hpbGRyZW4sdT1lP2Uuc2hhcGVGbGFnOjAsZD10LmNoaWxkcmVuLHtwYXRjaEZsYWc6ZixzaGFwZUZsYWc6bX09dDtpZihmPjApe2lmKGYmMTI4KXtwZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufWlmKGYmMjU2KXtmZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufX1tJjg/KHUmMTYmJmJlKGwsaSxhKSxkIT09bCYmcChuLGQpKTp1JjE2P20mMTY/cGUobCxkLG4scixpLGEsbyxzLGMpOmJlKGwsaSxhLCEwKToodSY4JiZwKG4sYGApLG0mMTYmJlQoZCxuLHIsaSxhLG8scyxjKSl9LGZlPShlLHQsbixyLGEsbyxzLGMsbCk9PntlfHw9aSx0fHw9aTtsZXQgdT1lLmxlbmd0aCxkPXQubGVuZ3RoLGY9TWF0aC5taW4odSxkKSxwO2ZvcihwPTA7cDxmO3ArKyl7bGV0IHI9dFtwXT1sP0RzKHRbcF0pOkVzKHRbcF0pO3YoZVtwXSxyLG4sbnVsbCxhLG8scyxjLGwpfXU+ZD9iZShlLGEsbywhMCwhMSxmKTpUKHQsbixyLGEsbyxzLGMsbCxmKX0scGU9KGUsdCxuLHIsYSxvLHMsYyxsKT0+e2xldCB1PTAsZD10Lmxlbmd0aCxmPWUubGVuZ3RoLTEscD1kLTE7Zm9yKDt1PD1mJiZ1PD1wOyl7bGV0IHI9ZVt1XSxpPXRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKTtpZihfcyhyLGkpKXYocixpLG4sbnVsbCxhLG8scyxjLGwpO2Vsc2UgYnJlYWs7dSsrfWZvcig7dTw9ZiYmdTw9cDspe2xldCByPWVbZl0saT10W3BdPWw/RHModFtwXSk6RXModFtwXSk7aWYoX3MocixpKSl2KHIsaSxuLG51bGwsYSxvLHMsYyxsKTtlbHNlIGJyZWFrO2YtLSxwLS19aWYodT5mKXtpZih1PD1wKXtsZXQgZT1wKzEsaT1lPGQ/dFtlXS5lbDpyO2Zvcig7dTw9cDspdihudWxsLHRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKSxuLGksYSxvLHMsYyxsKSx1Kyt9fWVsc2UgaWYodT5wKWZvcig7dTw9ZjspZ2UoZVt1XSxhLG8sITApLHUrKztlbHNle2xldCBtPXUsaD11LGc9bmV3IE1hcDtmb3IodT1oO3U8PXA7dSsrKXtsZXQgZT10W3VdPWw/RHModFt1XSk6RXModFt1XSk7ZS5rZXkhPW51bGwmJmcuc2V0KGUua2V5LHUpfWxldCBfLHk9MCxiPXAtaCsxLHg9ITEsUz0wLEM9QXJyYXkoYik7Zm9yKHU9MDt1PGI7dSsrKUNbdV09MDtmb3IodT1tO3U8PWY7dSsrKXtsZXQgcj1lW3VdO2lmKHk+PWIpe2dlKHIsYSxvLCEwKTtjb250aW51ZX1sZXQgaTtpZihyLmtleSE9bnVsbClpPWcuZ2V0KHIua2V5KTtlbHNlIGZvcihfPWg7Xzw9cDtfKyspaWYoQ1tfLWhdPT09MCYmX3Mocix0W19dKSl7aT1fO2JyZWFrfWk9PT12b2lkIDA/Z2UocixhLG8sITApOihDW2ktaF09dSsxLGk+PVM/Uz1pOng9ITAsdihyLHRbaV0sbixudWxsLGEsbyxzLGMsbCkseSsrKX1sZXQgdz14P1dvKEMpOmk7Zm9yKF89dy5sZW5ndGgtMSx1PWItMTt1Pj0wO3UtLSl7bGV0IGU9aCt1LGk9dFtlXSxmPXRbZSsxXSxwPWUrMTxkP2YuZWx8fHFvKGYpOnI7Q1t1XT09PTA/dihudWxsLGksbixwLGEsbyxzLGMsbCk6eCYmKF88MHx8dSE9PXdbX10/aGUoaSxuLHAsMik6Xy0tKX19fSxoZT0oZSx0LG4scixpPW51bGwpPT57bGV0e2VsOmEsdHlwZTpjLHRyYW5zaXRpb246bCxjaGlsZHJlbjp1LHNoYXBlRmxhZzpkfT1lO2lmKGQmNil7aGUoZS5jb21wb25lbnQuc3ViVHJlZSx0LG4scik7cmV0dXJufWlmKGQmMTI4KXtlLnN1c3BlbnNlLm1vdmUodCxuLHIpO3JldHVybn1pZihkJjY0KXtjLm1vdmUoZSx0LG4sQ2UpO3JldHVybn1pZihjPT09TCl7byhhLHQsbik7Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspaGUodVtlXSx0LG4scik7byhlLmFuY2hvcix0LG4pO3JldHVybn1pZihjPT09bHMpe1MoZSx0LG4pO3JldHVybn1pZihyIT09MiYmZCYxJiZsKXtpZihyPT09MClsLnBlcnNpc3RlZCYmIWFbV3JdP28oYSx0LG4pOihsLmJlZm9yZUVudGVyKGEpLG8oYSx0LG4pLElvKCgpPT5sLmVudGVyKGEpLGkpKTtlbHNle2xldHtsZWF2ZTpyLGRlbGF5TGVhdmU6aSxhZnRlckxlYXZlOmN9PWwsdT0oKT0+e2UuY3R4LmlzVW5tb3VudGVkP3MoYSk6byhhLHQsbil9LGQ9KCk9PntsZXQgZT1hLl9pc0xlYXZpbmd8fCEhYVtXcl07YS5faXNMZWF2aW5nJiZhW1dyXSghMCksbC5wZXJzaXN0ZWQmJiFlP3UoKTpyKGEsKCk9Pnt1KCksYyYmYygpfSl9O2k/aShhLHUsZCk6ZCgpfX1lbHNlIG8oYSx0LG4pfSxnZT0oZSx0LG4scj0hMSxpPSExKT0+e2xldHt0eXBlOmEscHJvcHM6byxyZWY6cyxjaGlsZHJlbjpjLGR5bmFtaWNDaGlsZHJlbjpsLHNoYXBlRmxhZzp1LHBhdGNoRmxhZzpkLGRpcnM6ZixjYWNoZUluZGV4OnAsbWVtbzptfT1lO2lmKGQ9PT0tMiYmKGk9ITEpLHMhPW51bGwmJihudCgpLHVpKHMsbnVsbCxuLGUsITApLHJ0KCkpLHAhPW51bGwmJih0LnJlbmRlckNhY2hlW3BdPXZvaWQgMCksdSYyNTYpe3QuY3R4LmRlYWN0aXZhdGUoZSk7cmV0dXJufWxldCBoPXUmMSYmZixnPSFJaShlKSxfO2lmKGcmJihfPW8mJm8ub25Wbm9kZUJlZm9yZVVubW91bnQpJiZBcyhfLHQsZSksdSY2KXllKGUuY29tcG9uZW50LG4scik7ZWxzZXtpZih1JjEyOCl7ZS5zdXNwZW5zZS51bm1vdW50KG4scik7cmV0dXJufWgmJl9yKGUsbnVsbCx0LGBiZWZvcmVVbm1vdW50YCksdSY2ND9lLnR5cGUucmVtb3ZlKGUsdCxuLENlLHIpOmwmJiFsLmhhc09uY2UmJihhIT09THx8ZD4wJiZkJjY0KT9iZShsLHQsbiwhMSwhMCk6KGE9PT1MJiZkJjM4NHx8IWkmJnUmMTYpJiZiZShjLHQsbiksciYmX2UoZSl9bGV0IHY9bSE9bnVsbCYmcD09bnVsbDsoZyYmKF89byYmby5vblZub2RlVW5tb3VudGVkKXx8aHx8dikmJklvKCgpPT57XyYmQXMoXyx0LGUpLGgmJl9yKGUsbnVsbCx0LGB1bm1vdW50ZWRgKSx2JiYoZS5lbD1udWxsKX0sbil9LF9lPWU9PntsZXR7dHlwZTp0LGVsOm4sYW5jaG9yOnIsdHJhbnNpdGlvbjppfT1lO2lmKHQ9PT1MKXt2ZShuLHIpO3JldHVybn1pZih0PT09bHMpe0MoZSk7cmV0dXJufWxldCBhPSgpPT57cyhuKSxpJiYhaS5wZXJzaXN0ZWQmJmkuYWZ0ZXJMZWF2ZSYmaS5hZnRlckxlYXZlKCl9O2lmKGUuc2hhcGVGbGFnJjEmJmkmJiFpLnBlcnNpc3RlZCl7bGV0e2xlYXZlOnQsZGVsYXlMZWF2ZTpyfT1pLG89KCk9PnQobixhKTtyP3IoZS5lbCxhLG8pOm8oKX1lbHNlIGEoKX0sdmU9KGUsdCk9PntsZXQgbjtmb3IoO2UhPT10OyluPWgoZSkscyhlKSxlPW47cyh0KX0seWU9KGUsdCxuKT0+e2xldHtidW06cixzY29wZTppLGpvYjphLHN1YlRyZWU6byx1bTpzLG06YyxhOmx9PWU7S28oYyksS28obCksciYmbGUociksaS5zdG9wKCksYSYmKGEuZmxhZ3N8PTgsZ2UobyxlLHQsbikpLHMmJklvKHMsdCksSW8oKCk9PntlLmlzVW5tb3VudGVkPSEwfSx0KX0sYmU9KGUsdCxuLHI9ITEsaT0hMSxhPTApPT57Zm9yKGxldCBvPWE7bzxlLmxlbmd0aDtvKyspZ2UoZVtvXSx0LG4scixpKX0sTz1lPT57aWYoZS5zaGFwZUZsYWcmNilyZXR1cm4gTyhlLmNvbXBvbmVudC5zdWJUcmVlKTtpZihlLnNoYXBlRmxhZyYxMjgpcmV0dXJuIGUuc3VzcGVuc2UubmV4dCgpO2xldCB0PWgoZS5hbmNob3J8fGUuZWwpLG49dCYmdFtqcl07cmV0dXJuIG4/aChuKTp0fSx4ZT0hMSxTZT0oZSx0LG4pPT57bGV0IHI7ZT09bnVsbD90Ll92bm9kZSYmKGdlKHQuX3Zub2RlLG51bGwsbnVsbCwhMCkscj10Ll92bm9kZS5jb21wb25lbnQpOnYodC5fdm5vZGV8fG51bGwsZSx0LG51bGwsbnVsbCxudWxsLG4pLHQuX3Zub2RlPWUseGV8fD0oeGU9ITAscnIociksaXIoKSwhMSl9LENlPXtwOnYsdW06Z2UsbTpoZSxyOl9lLG10OnNlLG1jOlQscGM6ZGUscGJjOmllLG46TyxvOmV9LHdlLFRlO3JldHVybiB0JiYoW3dlLFRlXT10KENlKSkse3JlbmRlcjpTZSxoeWRyYXRlOndlLGNyZWF0ZUFwcDp0byhTZSx3ZSl9fWZ1bmN0aW9uIEJvKHt0eXBlOmUscHJvcHM6dH0sbil7cmV0dXJuIG49PT1gc3ZnYCYmZT09PWBmb3JlaWduT2JqZWN0YHx8bj09PWBtYXRobWxgJiZlPT09YGFubm90YXRpb24teG1sYCYmdCYmdC5lbmNvZGluZyYmdC5lbmNvZGluZy5pbmNsdWRlcyhgaHRtbGApP3ZvaWQgMDpufWZ1bmN0aW9uIFZvKHtlZmZlY3Q6ZSxqb2I6dH0sbil7bj8oZS5mbGFnc3w9MzIsdC5mbGFnc3w9NCk6KGUuZmxhZ3MmPS0zMyx0LmZsYWdzJj0tNSl9ZnVuY3Rpb24gSG8oZSx0KXtyZXR1cm4oIWV8fGUmJiFlLnBlbmRpbmdCcmFuY2gpJiZ0JiYhdC5wZXJzaXN0ZWR9ZnVuY3Rpb24gVW8oZSx0LG49ITEpe2xldCByPWUuY2hpbGRyZW4saT10LmNoaWxkcmVuO2lmKHAocikmJnAoaSkpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCB0PXJbZV0sYT1pW2VdO2Euc2hhcGVGbGFnJjEmJiFhLmR5bmFtaWNDaGlsZHJlbiYmKChhLnBhdGNoRmxhZzw9MHx8YS5wYXRjaEZsYWc9PT0zMikmJihhPWlbZV09RHMoaVtlXSksYS5lbD10LmVsKSwhbiYmYS5wYXRjaEZsYWchPT0tMiYmVW8odCxhKSksYS50eXBlPT09c3MmJihhLnBhdGNoRmxhZz09PS0xJiYoYT1pW2VdPURzKGEpKSxhLmVsPXQuZWwpLGEudHlwZT09PWNzJiYhYS5lbCYmKGEuZWw9dC5lbCl9fWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKSxuPVswXSxyLGksYSxvLHMsYz1lLmxlbmd0aDtmb3Iocj0wO3I8YztyKyspe2xldCBjPWVbcl07aWYoYyE9PTApe2lmKGk9bltuLmxlbmd0aC0xXSxlW2ldPGMpe3Rbcl09aSxuLnB1c2gocik7Y29udGludWV9Zm9yKGE9MCxvPW4ubGVuZ3RoLTE7YTxvOylzPWErbz4+MSxlW25bc11dPGM/YT1zKzE6bz1zO2M8ZVtuW2FdXSYmKGE+MCYmKHRbcl09blthLTFdKSxuW2FdPXIpfX1mb3IoYT1uLmxlbmd0aCxvPW5bYS0xXTthLS0+MDspblthXT1vLG89dFtvXTtyZXR1cm4gbn1mdW5jdGlvbiBHbyhlKXtsZXQgdD1lLnN1YlRyZWUuY29tcG9uZW50O2lmKHQpcmV0dXJuIHQuYXN5bmNEZXAmJiF0LmFzeW5jUmVzb2x2ZWQ/dDpHbyh0KX1mdW5jdGlvbiBLbyhlKXtpZihlKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmxhZ3N8PTh9ZnVuY3Rpb24gcW8oZSl7aWYoZS5wbGFjZWhvbGRlcilyZXR1cm4gZS5wbGFjZWhvbGRlcjtsZXQgdD1lLmNvbXBvbmVudDtyZXR1cm4gdD9xbyh0LnN1YlRyZWUpOm51bGx9dmFyIEpvPWU9PmUuX19pc1N1c3BlbnNlLFlvPTAsWG89e25hbWU6YFN1c3BlbnNlYCxfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxsKXtpZihlPT1udWxsKVFvKHQsbixyLGksYSxvLHMsYyxsKTtlbHNle2lmKGEmJmEuZGVwcz4wJiYhZS5zdXNwZW5zZS5pc0luRmFsbGJhY2spe3Quc3VzcGVuc2U9ZS5zdXNwZW5zZSx0LnN1c3BlbnNlLnZub2RlPXQsdC5lbD1lLmVsO3JldHVybn0kbyhlLHQsbixyLGksbyxzLGMsbCl9fSxoeWRyYXRlOnRzLG5vcm1hbGl6ZTpuc307ZnVuY3Rpb24gWm8oZSx0KXtsZXQgbj1lLnByb3BzJiZlLnByb3BzW3RdO3YobikmJm4oKX1mdW5jdGlvbiBRbyhlLHQsbixyLGksYSxvLHMsYyl7bGV0e3A6bCxvOntjcmVhdGVFbGVtZW50OnV9fT1jLGQ9dShgZGl2YCksZj1lLnN1c3BlbnNlPWVzKGUsaSxyLHQsZCxuLGEsbyxzLGMpO2wobnVsbCxmLnBlbmRpbmdCcmFuY2g9ZS5zc0NvbnRlbnQsZCxudWxsLHIsZixhLG8pLGYuZGVwcz4wPyhabyhlLGBvblBlbmRpbmdgKSxabyhlLGBvbkZhbGxiYWNrYCksbChudWxsLGUuc3NGYWxsYmFjayx0LG4scixudWxsLGEsbyksYXMoZixlLnNzRmFsbGJhY2spKTpmLnJlc29sdmUoITEsITApfWZ1bmN0aW9uICRvKGUsdCxuLHIsaSxhLG8scyx7cDpjLHVtOmwsbzp7Y3JlYXRlRWxlbWVudDp1fX0pe2xldCBkPXQuc3VzcGVuc2U9ZS5zdXNwZW5zZTtkLnZub2RlPXQsdC5lbD1lLmVsO2xldCBmPXQuc3NDb250ZW50LHA9dC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6bSxwZW5kaW5nQnJhbmNoOmgsaXNJbkZhbGxiYWNrOmcsaXNIeWRyYXRpbmc6X309ZDtpZihoKWQucGVuZGluZ0JyYW5jaD1mLF9zKGgsZik/KGMoaCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6ZyYmKF98fChjKG0scCxuLHIsaSxudWxsLGEsbyxzKSxhcyhkLHApKSkpOihkLnBlbmRpbmdJZD1ZbysrLF8/KGQuaXNIeWRyYXRpbmc9ITEsZC5hY3RpdmVCcmFuY2g9aCk6bChoLGksZCksZC5kZXBzPTAsZC5lZmZlY3RzLmxlbmd0aD0wLGQuaGlkZGVuQ29udGFpbmVyPXUoYGRpdmApLGc/KGMobnVsbCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6KGMobSxwLG4scixpLG51bGwsYSxvLHMpLGFzKGQscCkpKTptJiZfcyhtLGYpPyhjKG0sZixuLHIsaSxkLGEsbyxzKSxkLnJlc29sdmUoITApKTooYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MCYmZC5yZXNvbHZlKCkpKTtlbHNlIGlmKG0mJl9zKG0sZikpYyhtLGYsbixyLGksZCxhLG8scyksYXMoZCxmKTtlbHNlIGlmKFpvKHQsYG9uUGVuZGluZ2ApLGQucGVuZGluZ0JyYW5jaD1mLGQucGVuZGluZ0lkPWYuc2hhcGVGbGFnJjUxMj9mLmNvbXBvbmVudC5zdXNwZW5zZUlkOllvKyssYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MClkLnJlc29sdmUoKTtlbHNle2xldHt0aW1lb3V0OmUscGVuZGluZ0lkOnR9PWQ7ZT4wP3NldFRpbWVvdXQoKCk9PntkLnBlbmRpbmdJZD09PXQmJmQuZmFsbGJhY2socCl9LGUpOmU9PT0wJiZkLmZhbGxiYWNrKHApfX1mdW5jdGlvbiBlcyhlLHQsbixyLGksYSxvLHMsYyxsLHU9ITEpe2xldHtwOmQsbTpmLHVtOnAsbjptLG86e3BhcmVudE5vZGU6aCxyZW1vdmU6Z319PWwsXyx2PW9zKGUpO3YmJnQmJnQucGVuZGluZ0JyYW5jaCYmKF89dC5wZW5kaW5nSWQsdC5kZXBzKyspO2xldCB5PWUucHJvcHM/ZmUoZS5wcm9wcy50aW1lb3V0KTp2b2lkIDAsYj1hLHg9e3Zub2RlOmUscGFyZW50OnQscGFyZW50Q29tcG9uZW50Om4sbmFtZXNwYWNlOm8sY29udGFpbmVyOnIsaGlkZGVuQ29udGFpbmVyOmksZGVwczowLHBlbmRpbmdJZDpZbysrLHRpbWVvdXQ6dHlwZW9mIHk9PWBudW1iZXJgP3k6LTEsYWN0aXZlQnJhbmNoOm51bGwsaXNGYWxsYmFja01vdW50UGVuZGluZzohMSxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiF1LGlzSHlkcmF0aW5nOnUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKGU9ITEsbj0hMSl7bGV0e3Zub2RlOnIsYWN0aXZlQnJhbmNoOmkscGVuZGluZ0JyYW5jaDpvLHBlbmRpbmdJZDpzLGVmZmVjdHM6YyxwYXJlbnRDb21wb25lbnQ6bCxjb250YWluZXI6dSxpc0luRmFsbGJhY2s6ZH09eCxnPSExO2lmKHguaXNIeWRyYXRpbmcpeC5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFlKXtnPWkmJm8udHJhbnNpdGlvbiYmby50cmFuc2l0aW9uLm1vZGU9PT1gb3V0LWluYDtsZXQgZT0hMTtnJiYoaS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntzPT09eC5wZW5kaW5nSWQmJihmKG8sdSxhPT09YiYmIWU/bShpKTphLDApLG5yKGMpLGQmJnIuc3NGYWxsYmFjayYmKHIuc3NGYWxsYmFjay5lbD1udWxsKSl9KSxpJiYheC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nJiYoaChpLmVsKT09PXUmJihhPW0oaSksZT0hMCkscChpLGwseCwhMCksIWcmJmQmJnIuc3NGYWxsYmFjayYmSW8oKCk9PnIuc3NGYWxsYmFjay5lbD1udWxsLHgpKSxnfHxmKG8sdSxhLDApfXguaXNGYWxsYmFja01vdW50UGVuZGluZz0hMSxhcyh4LG8pLHgucGVuZGluZ0JyYW5jaD1udWxsLHguaXNJbkZhbGxiYWNrPSExO2xldCB5PXgucGFyZW50LFM9ITE7Zm9yKDt5Oyl7aWYoeS5wZW5kaW5nQnJhbmNoKXtmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKyl5LmVmZmVjdHMucHVzaChjW2VdKTtTPSEwO2JyZWFrfXk9eS5wYXJlbnR9IVMmJiFnJiZucihjKSx4LmVmZmVjdHM9W10sdiYmdCYmdC5wZW5kaW5nQnJhbmNoJiZfPT09dC5wZW5kaW5nSWQmJih0LmRlcHMtLSx0LmRlcHM9PT0wJiYhbiYmdC5yZXNvbHZlKCkpLFpvKHIsYG9uUmVzb2x2ZWApfSxmYWxsYmFjayhlKXtpZigheC5wZW5kaW5nQnJhbmNoKXJldHVybjtsZXR7dm5vZGU6dCxhY3RpdmVCcmFuY2g6bixwYXJlbnRDb21wb25lbnQ6cixjb250YWluZXI6aSxuYW1lc3BhY2U6YX09eDtabyh0LGBvbkZhbGxiYWNrYCk7bGV0IG89bShuKSxsPSgpPT57eC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nPSExLHguaXNJbkZhbGxiYWNrJiYoZChudWxsLGUsaSxvLHIsbnVsbCxhLHMsYyksYXMoeCxlKSl9LHU9ZS50cmFuc2l0aW9uJiZlLnRyYW5zaXRpb24ubW9kZT09PWBvdXQtaW5gO3UmJih4LmlzRmFsbGJhY2tNb3VudFBlbmRpbmc9ITAsbi50cmFuc2l0aW9uLmFmdGVyTGVhdmU9bCkseC5pc0luRmFsbGJhY2s9ITAscChuLHIsbnVsbCwhMCksdXx8bCgpfSxtb3ZlKGUsdCxuKXt4LmFjdGl2ZUJyYW5jaCYmZih4LmFjdGl2ZUJyYW5jaCxlLHQsbikseC5jb250YWluZXI9ZX0sbmV4dCgpe3JldHVybiB4LmFjdGl2ZUJyYW5jaCYmbSh4LmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKGUsdCxuKXtsZXQgcj0hIXgucGVuZGluZ0JyYW5jaDtyJiZ4LmRlcHMrKztsZXQgaT1lLnZub2RlLmVsO2UuYXN5bmNEZXAuY2F0Y2godD0+e1VuKHQsZSwwKX0pLnRoZW4oYT0+e2lmKGUuaXNVbm1vdW50ZWR8fHguaXNVbm1vdW50ZWR8fHgucGVuZGluZ0lkIT09ZS5zdXNwZW5zZUlkKXJldHVybjt6cygpLGUuYXN5bmNSZXNvbHZlZD0hMDtsZXR7dm5vZGU6c309ZTtXcyhlLGEsITEpLGkmJihzLmVsPWkpO2xldCBjPSFpJiZlLnN1YlRyZWUuZWw7dChlLHMsaChpfHxlLnN1YlRyZWUuZWwpLGk/bnVsbDptKGUuc3ViVHJlZSkseCxvLG4pLGMmJihzLnBsYWNlaG9sZGVyPW51bGwsZyhjKSksX28oZSxzLmVsKSxyJiYtLXguZGVwcz09PTAmJngucmVzb2x2ZSgpfSl9LHVubW91bnQoZSx0KXt4LmlzVW5tb3VudGVkPSEwLHguYWN0aXZlQnJhbmNoJiZwKHguYWN0aXZlQnJhbmNoLG4sZSx0KSx4LnBlbmRpbmdCcmFuY2gmJnAoeC5wZW5kaW5nQnJhbmNoLG4sZSx0KX19O3JldHVybiB4fWZ1bmN0aW9uIHRzKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD10LnN1c3BlbnNlPWVzKHQscixuLGUucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBkaXZgKSxudWxsLGksYSxvLHMsITApLHU9YyhlLGwucGVuZGluZ0JyYW5jaD10LnNzQ29udGVudCxuLGwsYSxvKTtyZXR1cm4gbC5kZXBzPT09MCYmbC5yZXNvbHZlKCExLCEwKSx1fWZ1bmN0aW9uIG5zKGUpe2xldHtzaGFwZUZsYWc6dCxjaGlsZHJlbjpufT1lLHI9dCYzMjtlLnNzQ29udGVudD1ycyhyP24uZGVmYXVsdDpuKSxlLnNzRmFsbGJhY2s9cj9ycyhuLmZhbGxiYWNrKTpIKGNzKX1mdW5jdGlvbiBycyhlKXtsZXQgdDtpZih2KGUpKXtsZXQgbj1wcyYmZS5fYztuJiYoZS5fZD0hMSxSKCkpLGU9ZSgpLG4mJihlLl9kPSEwLHQ9ZHMsZnMoKSl9cmV0dXJuIHAoZSkmJihlPXVvKGUpKSxlPUVzKGUpLHQmJiFlLmR5bmFtaWNDaGlsZHJlbiYmKGUuZHluYW1pY0NoaWxkcmVuPXQuZmlsdGVyKHQ9PnQhPT1lKSksZX1mdW5jdGlvbiBpcyhlLHQpe3QmJnQucGVuZGluZ0JyYW5jaD9wKGUpP3QuZWZmZWN0cy5wdXNoKC4uLmUpOnQuZWZmZWN0cy5wdXNoKGUpOm5yKGUpfWZ1bmN0aW9uIGFzKGUsdCl7ZS5hY3RpdmVCcmFuY2g9dDtsZXR7dm5vZGU6bixwYXJlbnRDb21wb25lbnQ6cn09ZSxpPXQuZWw7Zm9yKDshaSYmdC5jb21wb25lbnQ7KXQ9dC5jb21wb25lbnQuc3ViVHJlZSxpPXQuZWw7bi5lbD1pLHImJnIuc3ViVHJlZT09PW4mJihyLnZub2RlLmVsPWksX28ocixpKSl9ZnVuY3Rpb24gb3MoZSl7bGV0IHQ9ZS5wcm9wcyYmZS5wcm9wcy5zdXNwZW5zaWJsZTtyZXR1cm4gdCE9bnVsbCYmdCE9PSExfXZhciBMPVN5bWJvbC5mb3IoYHYtZmd0YCksc3M9U3ltYm9sLmZvcihgdi10eHRgKSxjcz1TeW1ib2wuZm9yKGB2LWNtdGApLGxzPVN5bWJvbC5mb3IoYHYtc3RjYCksdXM9W10sZHM9bnVsbDtmdW5jdGlvbiBSKGU9ITEpe3VzLnB1c2goZHM9ZT9udWxsOltdKX1mdW5jdGlvbiBmcygpe3VzLnBvcCgpLGRzPXVzW3VzLmxlbmd0aC0xXXx8bnVsbH12YXIgcHM9MTtmdW5jdGlvbiBtcyhlLHQ9ITEpe3BzKz1lLGU8MCYmZHMmJnQmJihkcy5oYXNPbmNlPSEwKX1mdW5jdGlvbiBocyhlKXtyZXR1cm4gZS5keW5hbWljQ2hpbGRyZW49cHM+MD9kc3x8aTpudWxsLGZzKCkscHM+MCYmZHMmJmRzLnB1c2goZSksZX1mdW5jdGlvbiB6KGUsdCxuLHIsaSxhKXtyZXR1cm4gaHMoVihlLHQsbixyLGksYSwhMCkpfWZ1bmN0aW9uIEIoZSx0LG4scixpKXtyZXR1cm4gaHMoSChlLHQsbixyLGksITApKX1mdW5jdGlvbiBncyhlKXtyZXR1cm4gZT9lLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gX3MoZSx0KXtyZXR1cm4gZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQua2V5fWZ1bmN0aW9uIHZzKGUpe312YXIgeXM9KHtrZXk6ZX0pPT5lPz9udWxsLGJzPSh7cmVmOmUscmVmX2tleTp0LHJlZl9mb3I6bn0pPT4odHlwZW9mIGU9PWBudW1iZXJgJiYoZT1gYCtlKSxlPT1udWxsP251bGw6eShlKXx8aihlKXx8dihlKT97aTp1cixyOmUsazp0LGY6ISFufTplKTtmdW5jdGlvbiBWKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ZT09PUw/MDoxLG89ITEscz0hMSl7bGV0IGM9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6ZSxwcm9wczp0LGtleTp0JiZ5cyh0KSxyZWY6dCYmYnModCksc2NvcGVJZDpkcixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpuLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRTdGFydDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOmEscGF0Y2hGbGFnOnIsZHluYW1pY1Byb3BzOmksZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDp1cn07cmV0dXJuIHM/KE9zKGMsbiksYSYxMjgmJmUubm9ybWFsaXplKGMpKTpuJiYoYy5zaGFwZUZsYWd8PXkobik/ODoxNikscHM+MCYmIW8mJmRzJiYoYy5wYXRjaEZsYWc+MHx8YSY2KSYmYy5wYXRjaEZsYWchPT0zMiYmZHMucHVzaChjKSxjfXZhciBIPXhzO2Z1bmN0aW9uIHhzKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ITEpe2lmKCghZXx8ZT09PWxhKSYmKGU9Y3MpLGdzKGUpKXtsZXQgcj1DcyhlLHQsITApO3JldHVybiBuJiZPcyhyLG4pLHBzPjAmJiFhJiZkcyYmKHIuc2hhcGVGbGFnJjY/ZHNbZHMuaW5kZXhPZihlKV09cjpkcy5wdXNoKHIpKSxyLnBhdGNoRmxhZz0tMixyfWlmKGVjKGUpJiYoZT1lLl9fdmNjT3B0cyksdCl7dD1Tcyh0KTtsZXR7Y2xhc3M6ZSxzdHlsZTpufT10O2UmJiF5KGUpJiYodC5jbGFzcz1PKGUpKSx4KG4pJiYob24obikmJiFwKG4pJiYobj1sKHt9LG4pKSx0LnN0eWxlPWdlKG4pKX1sZXQgbz15KGUpPzE6Sm8oZSk/MTI4Ok1yKGUpPzY0OngoZSk/NDp2KGUpPzI6MDtyZXR1cm4gVihlLHQsbixyLGksbyxhLCEwKX1mdW5jdGlvbiBTcyhlKXtyZXR1cm4gZT9vbihlKXx8Ym8oZSk/bCh7fSxlKTplOm51bGx9ZnVuY3Rpb24gQ3MoZSx0LG49ITEscj0hMSl7bGV0e3Byb3BzOmkscmVmOmEscGF0Y2hGbGFnOm8sY2hpbGRyZW46cyx0cmFuc2l0aW9uOmN9PWUsbD10P2tzKGl8fHt9LHQpOmksdT17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTplLnR5cGUscHJvcHM6bCxrZXk6bCYmeXMobCkscmVmOnQmJnQucmVmP24mJmE/cChhKT9hLmNvbmNhdChicyh0KSk6W2EsYnModCldOmJzKHQpOmEsc2NvcGVJZDplLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmUuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOnMsdGFyZ2V0OmUudGFyZ2V0LHRhcmdldFN0YXJ0OmUudGFyZ2V0U3RhcnQsdGFyZ2V0QW5jaG9yOmUudGFyZ2V0QW5jaG9yLHN0YXRpY0NvdW50OmUuc3RhdGljQ291bnQsc2hhcGVGbGFnOmUuc2hhcGVGbGFnLHBhdGNoRmxhZzp0JiZlLnR5cGUhPT1MP289PT0tMT8xNjpvfDE2Om8sZHluYW1pY1Byb3BzOmUuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjplLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmUuYXBwQ29udGV4dCxkaXJzOmUuZGlycyx0cmFuc2l0aW9uOmMsY29tcG9uZW50OmUuY29tcG9uZW50LHN1c3BlbnNlOmUuc3VzcGVuc2Usc3NDb250ZW50OmUuc3NDb250ZW50JiZDcyhlLnNzQ29udGVudCksc3NGYWxsYmFjazplLnNzRmFsbGJhY2smJkNzKGUuc3NGYWxsYmFjaykscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcixlbDplLmVsLGFuY2hvcjplLmFuY2hvcixjdHg6ZS5jdHgsY2U6ZS5jZX07cmV0dXJuIGMmJnImJnJpKHUsYy5jbG9uZSh1KSksdX1mdW5jdGlvbiBVKGU9YCBgLHQ9MCl7cmV0dXJuIEgoc3MsbnVsbCxlLHQpfWZ1bmN0aW9uIHdzKGUsdCl7bGV0IG49SChscyxudWxsLGUpO3JldHVybiBuLnN0YXRpY0NvdW50PXQsbn1mdW5jdGlvbiBUcyhlPWBgLHQ9ITEpe3JldHVybiB0PyhSKCksQihjcyxudWxsLGUpKTpIKGNzLG51bGwsZSl9ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIGU9PW51bGx8fHR5cGVvZiBlPT1gYm9vbGVhbmA/SChjcyk6cChlKT9IKEwsbnVsbCxlLnNsaWNlKCkpOmdzKGUpP0RzKGUpOkgoc3MsbnVsbCxTdHJpbmcoZSkpfWZ1bmN0aW9uIERzKGUpe3JldHVybiBlLmVsPT09bnVsbCYmZS5wYXRjaEZsYWchPT0tMXx8ZS5tZW1vP2U6Q3MoZSl9ZnVuY3Rpb24gT3MoZSx0KXtsZXQgbj0wLHtzaGFwZUZsYWc6cn09ZTtpZih0PT1udWxsKXQ9bnVsbDtlbHNlIGlmKHAodCkpbj0xNjtlbHNlIGlmKHR5cGVvZiB0PT1gb2JqZWN0YCl7aWYociY2NSl7bGV0IG49dC5kZWZhdWx0O24mJihuLl9jJiYobi5fZD0hMSksT3MoZSxuKCkpLG4uX2MmJihuLl9kPSEwKSk7cmV0dXJufXtuPTMyO2xldCByPXQuXzshciYmIWJvKHQpP3QuX2N0eD11cjpyPT09MyYmdXImJih1ci5zbG90cy5fPT09MT90Ll89MToodC5fPTIsZS5wYXRjaEZsYWd8PTEwMjQpKX19ZWxzZSBpZih2KHQpKXtpZihyJjY1KXtPcyhlLHtkZWZhdWx0OnR9KTtyZXR1cm59dD17ZGVmYXVsdDp0LF9jdHg6dXJ9LG49MzJ9ZWxzZSB0PVN0cmluZyh0KSxyJjY0PyhuPTE2LHQ9W1UodCldKTpuPTg7ZS5jaGlsZHJlbj10LGUuc2hhcGVGbGFnfD1ufWZ1bmN0aW9uIGtzKC4uLmUpe2xldCB0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2ZvcihsZXQgZSBpbiByKWlmKGU9PT1gY2xhc3NgKXQuY2xhc3MhPT1yLmNsYXNzJiYodC5jbGFzcz1PKFt0LmNsYXNzLHIuY2xhc3NdKSk7ZWxzZSBpZihlPT09YHN0eWxlYCl0LnN0eWxlPWdlKFt0LnN0eWxlLHIuc3R5bGVdKTtlbHNlIGlmKHMoZSkpe2xldCBuPXRbZV0saT1yW2VdO2kmJm4hPT1pJiYhKHAobikmJm4uaW5jbHVkZXMoaSkpP3RbZV09bj9bXS5jb25jYXQobixpKTppOmk9PW51bGwmJm49PW51bGwmJiFjKGUpJiYodFtlXT1pKX1lbHNlIGUhPT1gYCYmKHRbZV09cltlXSl9cmV0dXJuIHR9ZnVuY3Rpb24gQXMoZSx0LG4scj1udWxsKXtIbihlLHQsNyxbbixyXSl9dmFyIGpzPSRhKCksTXM9MDtmdW5jdGlvbiBOcyhlLHQsbil7bGV0IGk9ZS50eXBlLGE9KHQ/dC5hcHBDb250ZXh0OmUuYXBwQ29udGV4dCl8fGpzLG89e3VpZDpNcysrLHZub2RlOmUsdHlwZTppLHBhcmVudDp0LGFwcENvbnRleHQ6YSxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxqb2I6bnVsbCxzY29wZTpuZXcgTmUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dD90LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoYS5wcm92aWRlcyksaWRzOnQ/dC5pZHM6W2BgLDAsMF0sYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpFbyhpLGEpLGVtaXRzT3B0aW9uczpzbyhpLGEpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpyLGluaGVyaXRBdHRyczppLmluaGVyaXRBdHRycyxjdHg6cixkYXRhOnIscHJvcHM6cixhdHRyczpyLHNsb3RzOnIscmVmczpyLHNldHVwU3RhdGU6cixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpuLHN1c3BlbnNlSWQ6bj9uLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIG8uY3R4PXtfOm99LG8ucm9vdD10P3Qucm9vdDpvLG8uZW1pdD1hby5iaW5kKG51bGwsbyksZS5jZSYmZS5jZShvKSxvfXZhciBQcz1udWxsLEZzPSgpPT5Qc3x8dXIsSXMsTHM7e2xldCBlPW1lKCksdD0odCxuKT0+e2xldCByO3JldHVybihyPWVbdF0pfHwocj1lW3RdPVtdKSxyLnB1c2gobiksZT0+e3IubGVuZ3RoPjE/ci5mb3JFYWNoKHQ9PnQoZSkpOnJbMF0oZSl9fTtJcz10KGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLGU9PlBzPWUpLExzPXQoYF9fVlVFX1NTUl9TRVRURVJTX19gLGU9PlZzPWUpfXZhciBScz1lPT57bGV0IHQ9UHM7cmV0dXJuIElzKGUpLGUuc2NvcGUub24oKSwoKT0+e2Uuc2NvcGUub2ZmKCksSXModCl9fSx6cz0oKT0+e1BzJiZQcy5zY29wZS5vZmYoKSxJcyhudWxsKX07ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIGUudm5vZGUuc2hhcGVGbGFnJjR9dmFyIFZzPSExO2Z1bmN0aW9uIEhzKGUsdD0hMSxuPSExKXt0JiZMcyh0KTtsZXR7cHJvcHM6cixjaGlsZHJlbjppfT1lLnZub2RlLGE9QnMoZSk7eG8oZSxyLGEsdCksUG8oZSxpLG58fHQpO2xldCBvPWE/VXMoZSx0KTp2b2lkIDA7cmV0dXJuIHQmJkxzKCExKSxvfWZ1bmN0aW9uIFVzKGUsdCl7bGV0IG49ZS50eXBlO2UuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLnByb3h5PW5ldyBQcm94eShlLmN0eCx4YSk7bGV0e3NldHVwOnJ9PW47aWYocil7bnQoKTtsZXQgbj1lLnNldHVwQ29udGV4dD1yLmxlbmd0aD4xP1pzKGUpOm51bGwsaT1ScyhlKSxhPVZuKHIsZSwwLFtlLnByb3BzLG5dKSxvPVMoYSk7aWYocnQoKSxpKCksKG98fGUuc3ApJiYhSWkoZSkmJm9pKGUpLG8pe2lmKGEudGhlbih6cyx6cyksdClyZXR1cm4gYS50aGVuKG49PntMcyghMCk7dHJ5e1dzKGUsbix0KX1maW5hbGx5e0xzKCExKX19KS5jYXRjaCh0PT57VW4odCxlLDApfSk7ZS5hc3luY0RlcD1hfWVsc2UgV3MoZSxhLHQpfWVsc2UgWXMoZSx0KX1mdW5jdGlvbiBXcyhlLHQsbil7dih0KT9lLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/ZS5zc3JSZW5kZXI9dDplLnJlbmRlcj10OngodCkmJihlLnNldHVwU3RhdGU9Z24odCkpLFlzKGUsbil9dmFyIEdzLEtzO2Z1bmN0aW9uIHFzKGUpe0dzPWUsS3M9ZT0+e2UucmVuZGVyLl9yYyYmKGUud2l0aFByb3h5PW5ldyBQcm94eShlLmN0eCxTYSkpfX12YXIgSnM9KCk9PiFHcztmdW5jdGlvbiBZcyhlLHQsbil7bGV0IHI9ZS50eXBlO2lmKCFlLnJlbmRlcil7aWYoIXQmJkdzJiYhci5yZW5kZXIpe2xldCB0PXIudGVtcGxhdGV8fFVhKGUpLnRlbXBsYXRlO2lmKHQpe2xldHtpc0N1c3RvbUVsZW1lbnQ6bixjb21waWxlck9wdGlvbnM6aX09ZS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczphLGNvbXBpbGVyT3B0aW9uczpvfT1yLHM9bChsKHtpc0N1c3RvbUVsZW1lbnQ6bixkZWxpbWl0ZXJzOmF9LGkpLG8pO3IucmVuZGVyPUdzKHQscyl9fWUucmVuZGVyPXIucmVuZGVyfHxhLEtzJiZLcyhlKX17bGV0IHQ9UnMoZSk7bnQoKTt0cnl7emEoZSl9ZmluYWxseXtydCgpLHQoKX19fXZhciBYcz17Z2V0KGUsdCl7cmV0dXJuIHB0KGUsYGdldGAsYGApLGVbdF19fTtmdW5jdGlvbiBacyhlKXtyZXR1cm57YXR0cnM6bmV3IFByb3h5KGUuYXR0cnMsWHMpLHNsb3RzOmUuc2xvdHMsZW1pdDplLmVtaXQsZXhwb3NlOnQ9PntlLmV4cG9zZWQ9dHx8e319fX1mdW5jdGlvbiBRcyhlKXtyZXR1cm4gZS5leHBvc2VkP2UuZXhwb3NlUHJveHl8fD1uZXcgUHJveHkoZ24oc24oZS5leHBvc2VkKSkse2dldCh0LG4pe2lmKG4gaW4gdClyZXR1cm4gdFtuXTtpZihuIGluIHlhKXJldHVybiB5YVtuXShlKX0saGFzKGUsdCl7cmV0dXJuIHQgaW4gZXx8dCBpbiB5YX19KTplLnByb3h5fWZ1bmN0aW9uICRzKGUsdD0hMCl7cmV0dXJuIHYoZSk/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOmUubmFtZXx8dCYmZS5fX25hbWV9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIHYoZSkmJmBfX3ZjY09wdHNgaW4gZX12YXIgVz0oZSx0KT0+VG4oZSx0LFZzKTtmdW5jdGlvbiBHKGUsdCxuKXt0cnl7bXMoLTEpO2xldCByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI9PT0yP3godCkmJiFwKHQpP2dzKHQpP0goZSxudWxsLFt0XSk6SChlLHQpOkgoZSxudWxsLHQpOihyPjM/bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6cj09PTMmJmdzKG4pJiYobj1bbl0pLEgoZSx0LG4pKX1maW5hbGx5e21zKDEpfX1mdW5jdGlvbiB0Yygpe31mdW5jdGlvbiBuYyhlLHQsbixyKXtsZXQgaT1uW3JdO2lmKGkmJnJjKGksZSkpcmV0dXJuIGk7bGV0IGE9dCgpO3JldHVybiBhLm1lbW89ZS5zbGljZSgpLGEuY2FjaGVJbmRleD1yLG5bcl09YX1mdW5jdGlvbiByYyhlLHQpe2xldCBuPWUubWVtbztpZihuLmxlbmd0aCE9dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoRChuW2VdLHRbZV0pKXJldHVybiExO3JldHVybiBwcz4wJiZkcyYmZHMucHVzaChlKSwhMH12YXIgaWM9YDMuNS40MWAsYWM9YSxvYz1CbixzYz1zcixjYz1scixsYz17Y3JlYXRlQ29tcG9uZW50SW5zdGFuY2U6TnMsc2V0dXBDb21wb25lbnQ6SHMscmVuZGVyQ29tcG9uZW50Um9vdDpsbyxzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U6ZnIsaXNWTm9kZTpncyxub3JtYWxpemVWTm9kZTpFcyxnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZTpRcyxlbnN1cmVWYWxpZFZOb2RlOmdhLHB1c2hXYXJuaW5nQ29udGV4dDpJbixwb3BXYXJuaW5nQ29udGV4dDpMbn0sdWM9dm9pZCAwLGRjPXR5cGVvZiB3aW5kb3c8YHVgJiZ3aW5kb3cudHJ1c3RlZFR5cGVzO2lmKGRjKXRyeXt1Yz1kYy5jcmVhdGVQb2xpY3koYHZ1ZWAse2NyZWF0ZUhUTUw6ZT0+ZX0pfWNhdGNoe312YXIgZmM9dWM/ZT0+dWMuY3JlYXRlSFRNTChlKTplPT5lLHBjPWBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsbWM9YGh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxgLGhjPXR5cGVvZiBkb2N1bWVudDxgdWA/ZG9jdW1lbnQ6bnVsbCxnYz1oYyYmaGMuY3JlYXRlRWxlbWVudChgdGVtcGxhdGVgKSxfYz17aW5zZXJ0OihlLHQsbik9Pnt0Lmluc2VydEJlZm9yZShlLG58fG51bGwpfSxyZW1vdmU6ZT0+e2xldCB0PWUucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKGUpfSxjcmVhdGVFbGVtZW50OihlLHQsbixyKT0+e2xldCBpPXQ9PT1gc3ZnYD9oYy5jcmVhdGVFbGVtZW50TlMocGMsZSk6dD09PWBtYXRobWxgP2hjLmNyZWF0ZUVsZW1lbnROUyhtYyxlKTpuP2hjLmNyZWF0ZUVsZW1lbnQoZSx7aXM6bn0pOmhjLmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIGU9PT1gc2VsZWN0YCYmciYmci5tdWx0aXBsZSE9bnVsbCYmaS5zZXRBdHRyaWJ1dGUoYG11bHRpcGxlYCxyLm11bHRpcGxlKSxpfSxjcmVhdGVUZXh0OmU9PmhjLmNyZWF0ZVRleHROb2RlKGUpLGNyZWF0ZUNvbW1lbnQ6ZT0+aGMuY3JlYXRlQ29tbWVudChlKSxzZXRUZXh0OihlLHQpPT57ZS5ub2RlVmFsdWU9dH0sc2V0RWxlbWVudFRleHQ6KGUsdCk9PntlLnRleHRDb250ZW50PXR9LHBhcmVudE5vZGU6ZT0+ZS5wYXJlbnROb2RlLG5leHRTaWJsaW5nOmU9PmUubmV4dFNpYmxpbmcscXVlcnlTZWxlY3RvcjplPT5oYy5xdWVyeVNlbGVjdG9yKGUpLHNldFNjb3BlSWQoZSx0KXtlLnNldEF0dHJpYnV0ZSh0LGBgKX0saW5zZXJ0U3RhdGljQ29udGVudChlLHQsbixyLGksYSl7bGV0IG89bj9uLnByZXZpb3VzU2libGluZzp0Lmxhc3RDaGlsZDtpZihpJiYoaT09PWF8fGkubmV4dFNpYmxpbmcpKWZvcig7dC5pbnNlcnRCZWZvcmUoaS5jbG9uZU5vZGUoITApLG4pLCEoaT09PWF8fCEoaT1pLm5leHRTaWJsaW5nKSk7KTtlbHNle2djLmlubmVySFRNTD1mYyhyPT09YHN2Z2A/YDxzdmc+JHtlfTwvc3ZnPmA6cj09PWBtYXRobWxgP2A8bWF0aD4ke2V9PC9tYXRoPmA6ZSk7bGV0IGk9Z2MuY29udGVudDtpZihyPT09YHN2Z2B8fHI9PT1gbWF0aG1sYCl7bGV0IGU9aS5maXJzdENoaWxkO2Zvcig7ZS5maXJzdENoaWxkOylpLmFwcGVuZENoaWxkKGUuZmlyc3RDaGlsZCk7aS5yZW1vdmVDaGlsZChlKX10Lmluc2VydEJlZm9yZShpLG4pfXJldHVybltvP28ubmV4dFNpYmxpbmc6dC5maXJzdENoaWxkLG4/bi5wcmV2aW91c1NpYmxpbmc6dC5sYXN0Q2hpbGRdfX0sdmM9YHRyYW5zaXRpb25gLHljPWBhbmltYXRpb25gLGJjPVN5bWJvbChgX3Z0Y2ApLHhjPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxTYz1sKHt9LEpyLHhjKSxDYz0oZT0+KGUuZGlzcGxheU5hbWU9YFRyYW5zaXRpb25gLGUucHJvcHM9U2MsZSkpKChlLHtzbG90czp0fSk9PkcoUXIsRWMoZSksdCkpLHdjPShlLHQ9W10pPT57cChlKT9lLmZvckVhY2goZT0+ZSguLi50KSk6ZSYmZSguLi50KX0sVGM9ZT0+ZT9wKGUpP2Uuc29tZShlPT5lLmxlbmd0aD4xKTplLmxlbmd0aD4xOiExO2Z1bmN0aW9uIEVjKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKW4gaW4geGN8fCh0W25dPWVbbl0pO2lmKGUuY3NzPT09ITEpcmV0dXJuIHQ7bGV0e25hbWU6bj1gdmAsdHlwZTpyLGR1cmF0aW9uOmksZW50ZXJGcm9tQ2xhc3M6YT1gJHtufS1lbnRlci1mcm9tYCxlbnRlckFjdGl2ZUNsYXNzOm89YCR7bn0tZW50ZXItYWN0aXZlYCxlbnRlclRvQ2xhc3M6cz1gJHtufS1lbnRlci10b2AsYXBwZWFyRnJvbUNsYXNzOmM9YSxhcHBlYXJBY3RpdmVDbGFzczp1PW8sYXBwZWFyVG9DbGFzczpkPXMsbGVhdmVGcm9tQ2xhc3M6Zj1gJHtufS1sZWF2ZS1mcm9tYCxsZWF2ZUFjdGl2ZUNsYXNzOnA9YCR7bn0tbGVhdmUtYWN0aXZlYCxsZWF2ZVRvQ2xhc3M6bT1gJHtufS1sZWF2ZS10b2B9PWUsaD1EYyhpKSxnPWgmJmhbMF0sXz1oJiZoWzFdLHtvbkJlZm9yZUVudGVyOnYsb25FbnRlcjp5LG9uRW50ZXJDYW5jZWxsZWQ6YixvbkxlYXZlOngsb25MZWF2ZUNhbmNlbGxlZDpTLG9uQmVmb3JlQXBwZWFyOkM9dixvbkFwcGVhcjp3PXksb25BcHBlYXJDYW5jZWxsZWQ6ZWU9Yn09dCx0ZT0oZSx0LG4scik9PntlLl9lbnRlckNhbmNlbGxlZD1yLEFjKGUsdD9kOnMpLEFjKGUsdD91Om8pLG4mJm4oKX0sVD0oZSx0KT0+e2UuX2lzTGVhdmluZz0hMSxBYyhlLGYpLEFjKGUsbSksQWMoZSxwKSx0JiZ0KCl9LG5lPWU9Pih0LG4pPT57bGV0IGk9ZT93Onksbz0oKT0+dGUodCxlLG4pO3djKGksW3Qsb10pLGpjKCgpPT57QWModCxlP2M6YSksa2ModCxlP2Q6cyksVGMoaSl8fE5jKHQscixnLG8pfSl9O3JldHVybiBsKHQse29uQmVmb3JlRW50ZXIoZSl7d2ModixbZV0pLGtjKGUsYSksa2MoZSxvKX0sb25CZWZvcmVBcHBlYXIoZSl7d2MoQyxbZV0pLGtjKGUsYyksa2MoZSx1KX0sb25FbnRlcjpuZSghMSksb25BcHBlYXI6bmUoITApLG9uTGVhdmUoZSx0KXtlLl9pc0xlYXZpbmc9ITA7bGV0IG49KCk9PlQoZSx0KTtrYyhlLGYpLGUuX2VudGVyQ2FuY2VsbGVkPyhrYyhlLHApLExjKGUpKTooTGMoZSksa2MoZSxwKSksamMoKCk9PntlLl9pc0xlYXZpbmcmJihBYyhlLGYpLGtjKGUsbSksVGMoeCl8fE5jKGUscixfLG4pKX0pLHdjKHgsW2Usbl0pfSxvbkVudGVyQ2FuY2VsbGVkKGUpe3RlKGUsITEsdm9pZCAwLCEwKSx3YyhiLFtlXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKGUpe3RlKGUsITAsdm9pZCAwLCEwKSx3YyhlZSxbZV0pfSxvbkxlYXZlQ2FuY2VsbGVkKGUpe1QoZSksd2MoUyxbZV0pfX0pfWZ1bmN0aW9uIERjKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoeChlKSlyZXR1cm5bT2MoZS5lbnRlciksT2MoZS5sZWF2ZSldO3tsZXQgdD1PYyhlKTtyZXR1cm5bdCx0XX19ZnVuY3Rpb24gT2MoZSl7cmV0dXJuIGZlKGUpfWZ1bmN0aW9uIGtjKGUsdCl7dC5zcGxpdCgvXHMrLykuZm9yRWFjaCh0PT50JiZlLmNsYXNzTGlzdC5hZGQodCkpLChlW2JjXXx8KGVbYmNdPW5ldyBTZXQpKS5hZGQodCl9ZnVuY3Rpb24gQWMoZSx0KXt0LnNwbGl0KC9ccysvKS5mb3JFYWNoKHQ9PnQmJmUuY2xhc3NMaXN0LnJlbW92ZSh0KSk7bGV0IG49ZVtiY107biYmKG4uZGVsZXRlKHQpLG4uc2l6ZXx8KGVbYmNdPXZvaWQgMCkpfWZ1bmN0aW9uIGpjKGUpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShlKX0pfXZhciBNYz0wO2Z1bmN0aW9uIE5jKGUsdCxuLHIpe2xldCBpPWUuX2VuZElkPSsrTWMsYT0oKT0+e2k9PT1lLl9lbmRJZCYmcigpfTtpZihuIT1udWxsKXJldHVybiBzZXRUaW1lb3V0KGEsbik7bGV0e3R5cGU6byx0aW1lb3V0OnMscHJvcENvdW50OmN9PVBjKGUsdCk7aWYoIW8pcmV0dXJuIHIoKTtsZXQgbD1vK2BlbmRgLHU9MCxkPSgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKGwsZiksYSgpfSxmPXQ9Pnt0LnRhcmdldD09PWUmJisrdT49YyYmZCgpfTtzZXRUaW1lb3V0KCgpPT57dTxjJiZkKCl9LHMrMSksZS5hZGRFdmVudExpc3RlbmVyKGwsZil9ZnVuY3Rpb24gUGMoZSx0KXtsZXQgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxyPWU9PihuW2VdfHxgYCkuc3BsaXQoYCwgYCksaT1yKGAke3ZjfURlbGF5YCksYT1yKGAke3ZjfUR1cmF0aW9uYCksbz1GYyhpLGEpLHM9cihgJHt5Y31EZWxheWApLGM9cihgJHt5Y31EdXJhdGlvbmApLGw9RmMocyxjKSx1PW51bGwsZD0wLGY9MDt0PT09dmM/bz4wJiYodT12YyxkPW8sZj1hLmxlbmd0aCk6dD09PXljP2w+MCYmKHU9eWMsZD1sLGY9Yy5sZW5ndGgpOihkPU1hdGgubWF4KG8sbCksdT1kPjA/bz5sP3ZjOnljOm51bGwsZj11P3U9PT12Yz9hLmxlbmd0aDpjLmxlbmd0aDowKTtsZXQgcD11PT09dmMmJi9cYig/OnRyYW5zZm9ybXxhbGwpKD86LHwkKS8udGVzdChyKGAke3ZjfVByb3BlcnR5YCkudG9TdHJpbmcoKSk7cmV0dXJue3R5cGU6dSx0aW1lb3V0OmQscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOnB9fWZ1bmN0aW9uIEZjKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXgoLi4udC5tYXAoKHQsbik9PkljKHQpK0ljKGVbbl0pKSl9ZnVuY3Rpb24gSWMoZSl7cmV0dXJuIGU9PT1gYXV0b2A/MDpOdW1iZXIoZS5zbGljZSgwLC0xKS5yZXBsYWNlKGAsYCxgLmApKSoxZTN9ZnVuY3Rpb24gTGMoZSl7cmV0dXJuKGU/ZS5vd25lckRvY3VtZW50OmRvY3VtZW50KS5ib2R5Lm9mZnNldEhlaWdodH1mdW5jdGlvbiBSYyhlLHQsbil7bGV0IHI9ZVtiY107ciYmKHQ9KHQ/W3QsLi4ucl06Wy4uLnJdKS5qb2luKGAgYCkpLHQ9PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6bj9lLnNldEF0dHJpYnV0ZShgY2xhc3NgLHQpOmUuY2xhc3NOYW1lPXR9dmFyIHpjPVN5bWJvbChgX3ZvZGApLEJjPVN5bWJvbChgX3ZzaGApLFZjPXtuYW1lOmBzaG93YCxiZWZvcmVNb3VudChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7ZVt6Y109ZS5zdHlsZS5kaXNwbGF5PT09YG5vbmVgP2BgOmUuc3R5bGUuZGlzcGxheSxuJiZ0P24uYmVmb3JlRW50ZXIoZSk6SGMoZSx0KX0sbW91bnRlZChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7biYmdCYmbi5lbnRlcihlKX0sdXBkYXRlZChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHt0cmFuc2l0aW9uOnJ9KXshdCE9IW4mJihyP3Q/KHIuYmVmb3JlRW50ZXIoZSksSGMoZSwhMCksci5lbnRlcihlKSk6ci5sZWF2ZShlLCgpPT57SGMoZSwhMSl9KTpIYyhlLHQpKX0sYmVmb3JlVW5tb3VudChlLHt2YWx1ZTp0fSl7SGMoZSx0KX19O2Z1bmN0aW9uIEhjKGUsdCl7ZS5zdHlsZS5kaXNwbGF5PXQ/ZVt6Y106YG5vbmVgLGVbQmNdPSF0fWZ1bmN0aW9uIFVjKCl7VmMuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSk9PntpZighZSlyZXR1cm57c3R5bGU6e2Rpc3BsYXk6YG5vbmVgfX19fXZhciBXYz1TeW1ib2woYGApO2Z1bmN0aW9uIEdjKGUpe2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuO2xldCBuPXQudXQ9KG49ZSh0LnByb3h5KSk9PntBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXYtb3duZXI9IiR7dC51aWR9Il1gKSkuZm9yRWFjaChlPT5xYyhlLG4pKX0scj0oKT0+e2xldCByPWUodC5wcm94eSk7dC5jZT9xYyh0LmNlLHIpOktjKHQuc3ViVHJlZSxyKSxuKHIpfTtRaSgoKT0+e25yKHIpfSksWmkoKCk9PntFcihyLGEse2ZsdXNoOmBwb3N0YH0pO2xldCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHIpO2Uub2JzZXJ2ZSh0LnN1YlRyZWUuZWwucGFyZW50Tm9kZSx7Y2hpbGRMaXN0OiEwfSksdGEoKCk9PmUuZGlzY29ubmVjdCgpKX0pfWZ1bmN0aW9uIEtjKGUsdCl7aWYoZS5zaGFwZUZsYWcmMTI4KXtsZXQgbj1lLnN1c3BlbnNlO2U9bi5hY3RpdmVCcmFuY2gsbi5wZW5kaW5nQnJhbmNoJiYhbi5pc0h5ZHJhdGluZyYmbi5lZmZlY3RzLnB1c2goKCk9PntLYyhuLmFjdGl2ZUJyYW5jaCx0KX0pfWZvcig7ZS5jb21wb25lbnQ7KWU9ZS5jb21wb25lbnQuc3ViVHJlZTtpZihlLnNoYXBlRmxhZyYxJiZlLmVsKXFjKGUuZWwsdCk7ZWxzZSBpZihlLnR5cGU9PT1MKWUuY2hpbGRyZW4uZm9yRWFjaChlPT5LYyhlLHQpKTtlbHNlIGlmKGUudHlwZT09PWxzKXtsZXR7ZWw6bixhbmNob3I6cn09ZTtmb3IoO24mJihxYyhuLHQpLG4hPT1yKTspbj1uLm5leHRTaWJsaW5nfX1mdW5jdGlvbiBxYyhlLHQpe2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgbj1lLnN0eWxlLHI9YGA7Zm9yKGxldCBlIGluIHQpe2xldCBpPWplKHRbZV0pO24uc2V0UHJvcGVydHkoYC0tJHtlfWAsaSkscis9YC0tJHtlfTogJHtpfTtgfW5bV2NdPXJ9fXZhciBKYz0vKD86Xnw7KVxzKmRpc3BsYXlccyo6LztmdW5jdGlvbiBZYyhlLHQsbil7bGV0IHI9ZS5zdHlsZSxpPXkobiksYT0hMTtpZihuJiYhaSl7aWYodCl7aWYoeSh0KSlmb3IobGV0IGUgb2YgdC5zcGxpdChgO2ApKXtsZXQgdD1lLnNsaWNlKDAsZS5pbmRleE9mKGA6YCkpLnRyaW0oKTtuW3RdPz9aYyhyLHQsYGApfWVsc2UgZm9yKGxldCBlIGluIHQpbltlXT8/WmMocixlLGBgKX1mb3IobGV0IGkgaW4gbil7aT09PWBkaXNwbGF5YCYmKGE9ITApO2xldCBvPW5baV07bz09bnVsbD9aYyhyLGksYGApOnRsKGUsaSwheSh0KSYmdD90W2ldOnZvaWQgMCxvKXx8WmMocixpLG8pfX1lbHNlIGlmKGkpe2lmKHQhPT1uKXtsZXQgZT1yW1djXTtlJiYobis9YDtgK2UpLHIuY3NzVGV4dD1uLGE9SmMudGVzdChuKX19ZWxzZSB0JiZlLnJlbW92ZUF0dHJpYnV0ZShgc3R5bGVgKTt6YyBpbiBlJiYoZVt6Y109YT9yLmRpc3BsYXk6YGAsZVtCY10mJihyLmRpc3BsYXk9YG5vbmVgKSl9dmFyIFhjPS9ccyohaW1wb3J0YW50JC87ZnVuY3Rpb24gWmMoZSx0LG4pe2lmKHAobikpbi5mb3JFYWNoKG49PlpjKGUsdCxuKSk7ZWxzZSBpZihuPz89YGAsdC5zdGFydHNXaXRoKGAtLWApKWUuc2V0UHJvcGVydHkodCxuKTtlbHNle2xldCByPWVsKGUsdCk7WGMudGVzdChuKT9lLnNldFByb3BlcnR5KG9lKHIpLG4ucmVwbGFjZShYYyxgYCksYGltcG9ydGFudGApOmVbcl09bn19dmFyIFFjPVtgV2Via2l0YCxgTW96YCxgbXNgXSwkYz17fTtmdW5jdGlvbiBlbChlLHQpe2xldCBuPSRjW3RdO2lmKG4pcmV0dXJuIG47bGV0IHI9RSh0KTtpZihyIT09YGZpbHRlcmAmJnIgaW4gZSlyZXR1cm4gJGNbdF09cjtyPXNlKHIpO2ZvcihsZXQgbj0wO248UWMubGVuZ3RoO24rKyl7bGV0IGk9UWNbbl0rcjtpZihpIGluIGUpcmV0dXJuICRjW3RdPWl9cmV0dXJuIHR9ZnVuY3Rpb24gdGwoZSx0LG4scil7cmV0dXJuIGUudGFnTmFtZT09PWBURVhUQVJFQWAmJih0PT09YHdpZHRoYHx8dD09PWBoZWlnaHRgKSYmeShyKSYmbj09PXJ9dmFyIG5sPWBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rYDtmdW5jdGlvbiBybChlLHQsbixyLGksYT1DZSh0KSl7ciYmdC5zdGFydHNXaXRoKGB4bGluazpgKT9uPT1udWxsP2UucmVtb3ZlQXR0cmlidXRlTlMobmwsdC5zbGljZSg2LHQubGVuZ3RoKSk6ZS5zZXRBdHRyaWJ1dGVOUyhubCx0LG4pOm49PW51bGx8fGEmJiF3ZShuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LGE/YGA6YihuKT9TdHJpbmcobik6bil9ZnVuY3Rpb24gaWwoZSx0LG4scixpKXtpZih0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgKXtuIT1udWxsJiYoZVt0XT10PT09YGlubmVySFRNTGA/ZmMobik6bik7cmV0dXJufWxldCBhPWUudGFnTmFtZTtpZih0PT09YHZhbHVlYCYmYSE9PWBQUk9HUkVTU2AmJiFhLmluY2x1ZGVzKGAtYCkpe2xldCByPWE9PT1gT1BUSU9OYD9lLmdldEF0dHJpYnV0ZShgdmFsdWVgKXx8YGA6ZS52YWx1ZSxpPW49PW51bGw/ZS50eXBlPT09YGNoZWNrYm94YD9gb25gOmBgOlN0cmluZyhuKTsociE9PWl8fCEoYF92YWx1ZWBpbiBlKSkmJihlLnZhbHVlPWkpLG4/P2UucmVtb3ZlQXR0cmlidXRlKHQpLGUuX3ZhbHVlPW47cmV0dXJufWxldCBvPSExO2lmKG49PT1gYHx8bj09bnVsbCl7bGV0IHI9dHlwZW9mIGVbdF07cj09PWBib29sZWFuYD9uPXdlKG4pOm49PW51bGwmJnI9PT1gc3RyaW5nYD8obj1gYCxvPSEwKTpyPT09YG51bWJlcmAmJihuPTAsbz0hMCl9dHJ5e2VbdF09bn1jYXRjaHt9byYmZS5yZW1vdmVBdHRyaWJ1dGUoaXx8dCl9ZnVuY3Rpb24gYWwoZSx0LG4scil7ZS5hZGRFdmVudExpc3RlbmVyKHQsbixyKX1mdW5jdGlvbiBvbChlLHQsbixyKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLHIpfXZhciBzbD1TeW1ib2woYF92ZWlgKTtmdW5jdGlvbiBjbChlLHQsbixyLGk9bnVsbCl7bGV0IGE9ZVtzbF18fChlW3NsXT17fSksbz1hW3RdO2lmKHImJm8pby52YWx1ZT1yO2Vsc2V7bGV0W24sc109ZGwodCk7cj9hbChlLG4sYVt0XT1obChyLGkpLHMpOm8mJihvbChlLG4sbyxzKSxhW3RdPXZvaWQgMCl9fXZhciBsbD0vKE9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvLHVsPS9eb246Pyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIGRsKGUpe2xldCB0LG47Zm9yKDsobj1lLm1hdGNoKGxsKSkmJiF1bC50ZXN0KGUpOyl0fHw9e30sZT1lLnNsaWNlKDAsZS5sZW5ndGgtblsxXS5sZW5ndGgpLHRbblsxXS50b0xvd2VyQ2FzZSgpXT0hMDtyZXR1cm5bZVsyXT09PWA6YD9lLnNsaWNlKDMpOm9lKGUuc2xpY2UoMikpLHRdfXZhciBmbD0wLHBsPVByb21pc2UucmVzb2x2ZSgpLG1sPSgpPT5mbHx8PShwbC50aGVuKCgpPT5mbD0wKSxEYXRlLm5vdygpKTtmdW5jdGlvbiBobChlLHQpe2xldCBuPWU9PntpZighZS5fdnRzKWUuX3Z0cz1EYXRlLm5vdygpO2Vsc2UgaWYoZS5fdnRzPD1uLmF0dGFjaGVkKXJldHVybjtsZXQgcj1uLnZhbHVlO2lmKHAocikpe2xldCBuPWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPSgpPT57bi5jYWxsKGUpLGUuX3N0b3BwZWQ9ITB9O2xldCBpPXIuc2xpY2UoKSxhPVtlXTtmb3IobGV0IG49MDtuPGkubGVuZ3RoJiYhZS5fc3RvcHBlZDtuKyspe2xldCBlPWlbbl07ZSYmSG4oZSx0LDUsYSl9fWVsc2UgSG4ocix0LDUsW2VdKX07cmV0dXJuIG4udmFsdWU9ZSxuLmF0dGFjaGVkPW1sKCksbn12YXIgZ2w9ZT0+ZS5jaGFyQ29kZUF0KDApPT09MTExJiZlLmNoYXJDb2RlQXQoMSk9PT0xMTAmJmUuY2hhckNvZGVBdCgyKT45NiYmZS5jaGFyQ29kZUF0KDIpPDEyMyxfbD0oZSx0LG4scixpLGEpPT57bGV0IG89aT09PWBzdmdgO3Q9PT1gY2xhc3NgP1JjKGUscixvKTp0PT09YHN0eWxlYD9ZYyhlLG4scik6cyh0KT9jKHQpfHxjbChlLHQsbixyLGEpOih0WzBdPT09YC5gPyh0PXQuc2xpY2UoMSksITApOnRbMF09PT1gXmA/KHQ9dC5zbGljZSgxKSwhMSk6dmwoZSx0LHIsbykpPyhpbChlLHQsciksIWUudGFnTmFtZS5pbmNsdWRlcyhgLWApJiYodD09PWB2YWx1ZWB8fHQ9PT1gY2hlY2tlZGB8fHQ9PT1gc2VsZWN0ZWRgKSYmcmwoZSx0LHIsbyxhLHQhPT1gdmFsdWVgKSk6ZS5faXNWdWVDRSYmKHlsKGUsdCl8fGUuX2RlZi5fX2FzeW5jTG9hZGVyJiYoL1tBLVpdLy50ZXN0KHQpfHwheShyKSkpP2lsKGUsRSh0KSxyLGEsdCk6KHQ9PT1gdHJ1ZS12YWx1ZWA/ZS5fdHJ1ZVZhbHVlPXI6dD09PWBmYWxzZS12YWx1ZWAmJihlLl9mYWxzZVZhbHVlPXIpLHJsKGUsdCxyLG8pKX07ZnVuY3Rpb24gdmwoZSx0LG4scil7aWYocilyZXR1cm4hISh0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgfHx0IGluIGUmJmdsKHQpJiZ2KG4pKTtpZih0PT09YHNwZWxsY2hlY2tgfHx0PT09YGRyYWdnYWJsZWB8fHQ9PT1gdHJhbnNsYXRlYHx8dD09PWBhdXRvY29ycmVjdGB8fHQ9PT1gc2FuZGJveGAmJmUudGFnTmFtZT09PWBJRlJBTUVgfHx0PT09YGZvcm1gfHx0PT09YGxpc3RgJiZlLnRhZ05hbWU9PT1gSU5QVVRgfHx0PT09YHR5cGVgJiZlLnRhZ05hbWU9PT1gVEVYVEFSRUFgKXJldHVybiExO2lmKHQ9PT1gd2lkdGhgfHx0PT09YGhlaWdodGApe2xldCB0PWUudGFnTmFtZTtpZih0PT09YElNR2B8fHQ9PT1gVklERU9gfHx0PT09YENBTlZBU2B8fHQ9PT1gU09VUkNFYClyZXR1cm4hMX1yZXR1cm4gZ2wodCkmJnkobik/ITE6dCBpbiBlfWZ1bmN0aW9uIHlsKGUsdCl7bGV0IG49ZS5fZGVmLnByb3BzO2lmKCFuKXJldHVybiExO2xldCByPUUodCk7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/bi5zb21lKGU9PkUoZSk9PT1yKTpPYmplY3Qua2V5cyhuKS5zb21lKGU9PkUoZSk9PT1yKX12YXIgYmw9e307ZnVuY3Rpb24geGwoZSx0LG4pe2xldCByPUYoZSx0KTt0ZShyKSYmKHI9bCh7fSxyLHQpKTtjbGFzcyBpIGV4dGVuZHMgd2x7Y29uc3RydWN0b3IoZSl7c3VwZXIocixlLG4pfX1yZXR1cm4gaS5kZWY9cixpfXZhciBTbD0oKGUsdCk9PnhsKGUsdCxodSkpLENsPXR5cGVvZiBIVE1MRWxlbWVudDxgdWA/SFRNTEVsZW1lbnQ6Y2xhc3N7fSx3bD1jbGFzcyBlIGV4dGVuZHMgQ2x7Y29uc3RydWN0b3IoZSx0PXt9LG49bXUpe3N1cGVyKCksdGhpcy5fZGVmPWUsdGhpcy5fcHJvcHM9dCx0aGlzLl9jcmVhdGVBcHA9bix0aGlzLl9pc1Z1ZUNFPSEwLHRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fYXBwPW51bGwsdGhpcy5fbm9uY2U9dGhpcy5fZGVmLm5vbmNlLHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzLl9yZXNvbHZlZD0hMSx0aGlzLl9wYXRjaGluZz0hMSx0aGlzLl9kaXJ0eT0hMSx0aGlzLl9udW1iZXJQcm9wcz1udWxsLHRoaXMuX3N0eWxlQ2hpbGRyZW49bmV3IFdlYWtTZXQsdGhpcy5fc3R5bGVBbmNob3JzPW5ldyBXZWFrTWFwLHRoaXMuX29iPW51bGwsdGhpcy5zaGFkb3dSb290JiZuIT09bXU/dGhpcy5fcm9vdD10aGlzLnNoYWRvd1Jvb3Q6ZS5zaGFkb3dSb290PT09ITE/dGhpcy5fcm9vdD10aGlzOih0aGlzLmF0dGFjaFNoYWRvdyhsKHt9LGUuc2hhZG93Um9vdE9wdGlvbnMse21vZGU6YG9wZW5gfSkpLHRoaXMuX3Jvb3Q9dGhpcy5zaGFkb3dSb290KX1jb25uZWN0ZWRDYWxsYmFjaygpe2lmKCF0aGlzLmlzQ29ubmVjdGVkKXJldHVybjshdGhpcy5zaGFkb3dSb290JiYhdGhpcy5fcmVzb2x2ZWQmJnRoaXMuX3BhcnNlU2xvdHMoKSx0aGlzLl9jb25uZWN0ZWQ9ITA7bGV0IHQ9dGhpcztmb3IoO3QmJj10LmFzc2lnbmVkU2xvdHx8dC5wYXJlbnROb2RlfHx0Lmhvc3Q7KWlmKHQgaW5zdGFuY2VvZiBlKXt0aGlzLl9wYXJlbnQ9dDticmVha310aGlzLl9pbnN0YW5jZXx8KHRoaXMuX3Jlc29sdmVkP3RoaXMuX21vdW50KHRoaXMuX2RlZik6dCYmdC5fcGVuZGluZ1Jlc29sdmU/dGhpcy5fcGVuZGluZ1Jlc29sdmU9dC5fcGVuZGluZ1Jlc29sdmUudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlPXZvaWQgMCx0aGlzLmlzQ29ubmVjdGVkKXJldHVybiB0aGlzLl9yZXNvbHZlRGVmKCl9KTp0aGlzLl9yZXNvbHZlRGVmKCkpfV9zZXRQYXJlbnQoZT10aGlzLl9wYXJlbnQpe2UmJih0aGlzLl9pbnN0YW5jZS5wYXJlbnQ9ZS5faW5zdGFuY2UsdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoZSkpfV9pbmhlcml0UGFyZW50Q29udGV4dChlPXRoaXMuX3BhcmVudCl7ZSYmdGhpcy5fYXBwJiZPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcy5fYXBwLl9jb250ZXh0LnByb3ZpZGVzLGUuX2luc3RhbmNlLnByb3ZpZGVzKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX2Nvbm5lY3RlZD0hMSxRbigoKT0+e3RoaXMuX2Nvbm5lY3RlZHx8KHRoaXMuX29iJiY9KHRoaXMuX29iLmRpc2Nvbm5lY3QoKSxudWxsKSx0aGlzLl9hcHAmJnRoaXMuX2FwcC51bm1vdW50KCksdGhpcy5faW5zdGFuY2UmJih0aGlzLl9pbnN0YW5jZS5jZT12b2lkIDApLHRoaXMuX2FwcD10aGlzLl9pbnN0YW5jZT1udWxsLHRoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmPSh0aGlzLl90ZWxlcG9ydFRhcmdldHMuY2xlYXIoKSx2b2lkIDApKX0pfV9wcm9jZXNzTXV0YXRpb25zKGUpe2ZvcihsZXQgdCBvZiBlKXRoaXMuX3NldEF0dHIodC5hdHRyaWJ1dGVOYW1lKX1fcmVzb2x2ZURlZigpe2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlKXJldHVybiB0aGlzLl9wZW5kaW5nUmVzb2x2ZTtmb3IobGV0IGU9MDtlPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXRoaXMuX3NldEF0dHIodGhpcy5hdHRyaWJ1dGVzW2VdLm5hbWUpO3RoaXMuX29iPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMuYmluZCh0aGlzKSksdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSk7bGV0IGU9KGUsdD0hMSk9Pnt0aGlzLl9yZXNvbHZlZD0hMCx0aGlzLl9wZW5kaW5nUmVzb2x2ZT12b2lkIDA7bGV0e3Byb3BzOm4sc3R5bGVzOnJ9PWUsaTtpZihuJiYhcChuKSlmb3IobGV0IGUgaW4gbil7bGV0IHQ9bltlXTsodD09PU51bWJlcnx8dCYmdC50eXBlPT09TnVtYmVyKSYmKGUgaW4gdGhpcy5fcHJvcHMmJih0aGlzLl9wcm9wc1tlXT1mZSh0aGlzLl9wcm9wc1tlXSkpLChpfHw9T2JqZWN0LmNyZWF0ZShudWxsKSlbRShlKV09ITApfXRoaXMuX251bWJlclByb3BzPWksdGhpcy5fcmVzb2x2ZVByb3BzKGUpLHRoaXMuc2hhZG93Um9vdCYmdGhpcy5fYXBwbHlTdHlsZXMociksdGhpcy5fbW91bnQoZSl9LHQ9dGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7aWYodClyZXR1cm4gdGhpcy5fcGVuZGluZ1Jlc29sdmU9dCgpLnRoZW4odD0+e3QuY29uZmlndXJlQXBwPXRoaXMuX2RlZi5jb25maWd1cmVBcHAsZSh0aGlzLl9kZWY9dCwhMCl9KSx0aGlzLl9wZW5kaW5nUmVzb2x2ZTtlKHRoaXMuX2RlZil9X21vdW50KGUpe3RoaXMuX2FwcD10aGlzLl9jcmVhdGVBcHAoZSksdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoKSxlLmNvbmZpZ3VyZUFwcCYmZS5jb25maWd1cmVBcHAodGhpcy5fYXBwKSx0aGlzLl9hcHAuX2NlVk5vZGU9dGhpcy5fY3JlYXRlVk5vZGUoKSx0aGlzLl9hcHAubW91bnQodGhpcy5fcm9vdCk7bGV0IHQ9dGhpcy5faW5zdGFuY2UmJnRoaXMuX2luc3RhbmNlLmV4cG9zZWQ7aWYodClmb3IobGV0IGUgaW4gdClmKHRoaXMsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldDooKT0+Tih0W2VdKX0pfV9yZXNvbHZlUHJvcHMoZSl7bGV0e3Byb3BzOnR9PWUsbj1wKHQpP3Q6T2JqZWN0LmtleXModHx8e30pO2ZvcihsZXQgZSBvZiBPYmplY3Qua2V5cyh0aGlzKSllWzBdIT09YF9gJiZuLmluY2x1ZGVzKGUpJiZ0aGlzLl9zZXRQcm9wKGUsdGhpc1tlXSk7Zm9yKGxldCBlIG9mIG4ubWFwKEUpKU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldCgpe3JldHVybiB0aGlzLl9nZXRQcm9wKGUpfSxzZXQodCl7dGhpcy5fc2V0UHJvcChlLHQsITAsIXRoaXMuX3BhdGNoaW5nKX19KX1fc2V0QXR0cihlKXtpZihlLnN0YXJ0c1dpdGgoYGRhdGEtdi1gKSlyZXR1cm47bGV0IHQ9dGhpcy5oYXNBdHRyaWJ1dGUoZSksbj10P3RoaXMuZ2V0QXR0cmlidXRlKGUpOmJsLHI9RShlKTt0JiZ0aGlzLl9udW1iZXJQcm9wcyYmdGhpcy5fbnVtYmVyUHJvcHNbcl0mJihuPWZlKG4pKSx0aGlzLl9zZXRQcm9wKHIsbiwhMSwhMCl9X2dldFByb3AoZSl7cmV0dXJuIHRoaXMuX3Byb3BzW2VdfV9zZXRQcm9wKGUsdCxuPSEwLHI9ITEpe2lmKHQhPT10aGlzLl9wcm9wc1tlXSYmKHRoaXMuX2RpcnR5PSEwLHQ9PT1ibD9kZWxldGUgdGhpcy5fcHJvcHNbZV06KHRoaXMuX3Byb3BzW2VdPXQsZT09PWBrZXlgJiZ0aGlzLl9hcHAmJih0aGlzLl9hcHAuX2NlVk5vZGUua2V5PXQpKSxyJiZ0aGlzLl9pbnN0YW5jZSYmdGhpcy5fdXBkYXRlKCksbikpe2xldCBuPXRoaXMuX29iO24mJih0aGlzLl9wcm9jZXNzTXV0YXRpb25zKG4udGFrZVJlY29yZHMoKSksbi5kaXNjb25uZWN0KCkpLHQ9PT0hMD90aGlzLnNldEF0dHJpYnV0ZShvZShlKSxgYCk6dHlwZW9mIHQ9PWBzdHJpbmdgfHx0eXBlb2YgdD09YG51bWJlcmA/dGhpcy5zZXRBdHRyaWJ1dGUob2UoZSksdCtgYCk6dHx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUob2UoZSkpLG4mJm4ub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSl9fV91cGRhdGUoKXtsZXQgZT10aGlzLl9jcmVhdGVWTm9kZSgpO3RoaXMuX2FwcCYmKGUuYXBwQ29udGV4dD10aGlzLl9hcHAuX2NvbnRleHQpLGZ1KGUsdGhpcy5fcm9vdCl9X2NyZWF0ZVZOb2RlKCl7bGV0IGU9e307dGhpcy5zaGFkb3dSb290fHwoZS5vblZub2RlTW91bnRlZD1lLm9uVm5vZGVVcGRhdGVkPXRoaXMuX3JlbmRlclNsb3RzLmJpbmQodGhpcykpO2xldCB0PUgodGhpcy5fZGVmLGwoZSx0aGlzLl9wcm9wcykpO3JldHVybiB0aGlzLl9pbnN0YW5jZXx8KHQuY2U9ZT0+e3RoaXMuX2luc3RhbmNlPWUsZS5jZT10aGlzLGUuaXNDRT0hMDtsZXQgdD0oZSx0KT0+e3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZSx0ZSh0WzBdKT9sKHtkZXRhaWw6dH0sdFswXSk6e2RldGFpbDp0fSkpfTtlLmVtaXQ9KGUsLi4ubik9Pnt0KGUsbiksb2UoZSkhPT1lJiZ0KG9lKGUpLG4pfSx0aGlzLl9zZXRQYXJlbnQoKX0pLHR9X2FwcGx5U3R5bGVzKGUsdCxuKXtpZighZSlyZXR1cm47aWYodCl7aWYodD09PXRoaXMuX2RlZnx8dGhpcy5fc3R5bGVDaGlsZHJlbi5oYXModCkpcmV0dXJuO3RoaXMuX3N0eWxlQ2hpbGRyZW4uYWRkKHQpfWxldCByPXRoaXMuX25vbmNlLGk9dGhpcy5zaGFkb3dSb290LGE9bj90aGlzLl9nZXRTdHlsZUFuY2hvcihuKXx8dGhpcy5fZ2V0U3R5bGVBbmNob3IodGhpcy5fZGVmKTp0aGlzLl9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoaSksbz1udWxsO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTA7cy0tKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBzdHlsZWApO3ImJmMuc2V0QXR0cmlidXRlKGBub25jZWAsciksYy50ZXh0Q29udGVudD1lW3NdLGkuaW5zZXJ0QmVmb3JlKGMsb3x8YSksbz1jLHM9PT0wJiYobnx8dGhpcy5fc3R5bGVBbmNob3JzLnNldCh0aGlzLl9kZWYsYyksdCYmdGhpcy5fc3R5bGVBbmNob3JzLnNldCh0LGMpKX19X2dldFN0eWxlQW5jaG9yKGUpe2lmKCFlKXJldHVybiBudWxsO2xldCB0PXRoaXMuX3N0eWxlQW5jaG9ycy5nZXQoZSk7cmV0dXJuIHQmJnQucGFyZW50Tm9kZT09PXRoaXMuc2hhZG93Um9vdD90Oih0JiZ0aGlzLl9zdHlsZUFuY2hvcnMuZGVsZXRlKGUpLG51bGwpfV9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoZSl7Zm9yKGxldCB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5jaGlsZE5vZGVzW3RdO2lmKCEobiBpbnN0YW5jZW9mIEhUTUxTdHlsZUVsZW1lbnQpKXJldHVybiBufXJldHVybiBudWxsfV9wYXJzZVNsb3RzKCl7bGV0IGU9dGhpcy5fc2xvdHM9e30sdDtmb3IoO3Q9dGhpcy5maXJzdENoaWxkOyl7bGV0IG49dC5ub2RlVHlwZT09PTEmJnQuZ2V0QXR0cmlidXRlKGBzbG90YCl8fGBkZWZhdWx0YDsoZVtuXXx8KGVbbl09W10pKS5wdXNoKHQpLHRoaXMucmVtb3ZlQ2hpbGQodCl9fV9yZW5kZXJTbG90cygpe2xldCBlPXRoaXMuX2dldFNsb3RzKCksdD10aGlzLl9pbnN0YW5jZS50eXBlLl9fc2NvcGVJZDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxpPXIuZ2V0QXR0cmlidXRlKGBuYW1lYCl8fGBkZWZhdWx0YCxhPXRoaXMuX3Nsb3RzW2ldLG89ci5wYXJlbnROb2RlO2lmKGEpZm9yKGxldCBlIG9mIGEpe2lmKHQmJmUubm9kZVR5cGU9PT0xKXtsZXQgbj10K2Atc2Ascj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGUsMSk7ZS5zZXRBdHRyaWJ1dGUobixgYCk7bGV0IGk7Zm9yKDtpPXIubmV4dE5vZGUoKTspaS5zZXRBdHRyaWJ1dGUobixgYCl9by5pbnNlcnRCZWZvcmUoZSxyKX1lbHNlIGZvcig7ci5maXJzdENoaWxkOylvLmluc2VydEJlZm9yZShyLmZpcnN0Q2hpbGQscik7by5yZW1vdmVDaGlsZChyKX19X2dldFNsb3RzKCl7bGV0IGU9W3RoaXNdO3RoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmZS5wdXNoKC4uLnRoaXMuX3RlbGVwb3J0VGFyZ2V0cyk7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgZSl7bGV0IGU9bi5xdWVyeVNlbGVjdG9yQWxsKGBzbG90YCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5hZGQoZVtuXSl9cmV0dXJuIEFycmF5LmZyb20odCl9X2luamVjdENoaWxkU3R5bGUoZSx0KXt0aGlzLl9hcHBseVN0eWxlcyhlLnN0eWxlcyxlLHQpfV9iZWdpblBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITAsdGhpcy5fZGlydHk9ITF9X2VuZFBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITEsdGhpcy5fZGlydHkmJnRoaXMuX2luc3RhbmNlJiZ0aGlzLl91cGRhdGUoKX1faGFzU2hhZG93Um9vdCgpe3JldHVybiB0aGlzLl9kZWYuc2hhZG93Um9vdCE9PSExfV9yZW1vdmVDaGlsZFN0eWxlKGUpe319O2Z1bmN0aW9uIFRsKGUpe2xldCB0PUZzKCk7cmV0dXJuIHQmJnQuY2V8fG51bGx9ZnVuY3Rpb24gRWwoKXtsZXQgZT1UbCgpO3JldHVybiBlJiZlLnNoYWRvd1Jvb3R9ZnVuY3Rpb24gRGwoZT1gJHN0eWxlYCl7e2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuIHI7bGV0IG49dC50eXBlLl9fY3NzTW9kdWxlcztyZXR1cm4gbiYmbltlXXx8cn19dmFyIE9sPW5ldyBXZWFrTWFwLGtsPW5ldyBXZWFrTWFwLEFsPVN5bWJvbChgX21vdmVDYmApLGpsPVN5bWJvbChgX2VudGVyQ2JgKSxNbD0oZT0+KGRlbGV0ZSBlLnByb3BzLm1vZGUsZSkpKHtuYW1lOmBUcmFuc2l0aW9uR3JvdXBgLHByb3BzOmwoe30sU2Mse3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30pLHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9S3IoKSxpLGE7cmV0dXJuICRpKCgpPT57aWYoIWkubGVuZ3RoKXJldHVybjtsZXQgdD1lLm1vdmVDbGFzc3x8YCR7ZS5uYW1lfHxgdmB9LW1vdmVgO2lmKCFMbChpWzBdLmVsLG4udm5vZGUuZWwsdCkpe2k9W107cmV0dXJufWkuZm9yRWFjaChObCksaS5mb3JFYWNoKFBsKTtsZXQgcj1pLmZpbHRlcihGbCk7TGMobi52bm9kZS5lbCksci5mb3JFYWNoKGU9PntsZXQgbj1lLmVsLHI9bi5zdHlsZTtrYyhuLHQpLHIudHJhbnNmb3JtPXIud2Via2l0VHJhbnNmb3JtPXIudHJhbnNpdGlvbkR1cmF0aW9uPWBgO2xldCBpPW5bQWxdPWU9PntlJiZlLnRhcmdldCE9PW58fCghZXx8ZS5wcm9wZXJ0eU5hbWUuZW5kc1dpdGgoYHRyYW5zZm9ybWApKSYmKG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdHJhbnNpdGlvbmVuZGAsaSksbltBbF09bnVsbCxBYyhuLHQpKX07bi5hZGRFdmVudExpc3RlbmVyKGB0cmFuc2l0aW9uZW5kYCxpKX0pLGk9W119KSwoKT0+e2xldCBvPUEoZSkscz1FYyhvKSxjPW8udGFnfHxMO2lmKGk9W10sYSlmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKyl7bGV0IHQ9YVtlXTt0LmVsJiZ0LmVsIGluc3RhbmNlb2YgRWxlbWVudCYmIXQuZWxbQmNdJiYoaS5wdXNoKHQpLHJpKHQsZWkodCxzLHIsbikpLE9sLnNldCh0LElsKHQuZWwpKSl9YT10LmRlZmF1bHQ/aWkodC5kZWZhdWx0KCkpOltdO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKXtsZXQgdD1hW2VdO3Qua2V5IT1udWxsJiZyaSh0LGVpKHQscyxyLG4pKX1yZXR1cm4gSChjLG51bGwsYSl9fX0pO2Z1bmN0aW9uIE5sKGUpe2xldCB0PWUuZWw7dFtBbF0mJnRbQWxdKCksdFtqbF0mJnRbamxdKCl9ZnVuY3Rpb24gUGwoZSl7a2wuc2V0KGUsSWwoZS5lbCkpfWZ1bmN0aW9uIEZsKGUpe2xldCB0PU9sLmdldChlKSxuPWtsLmdldChlKSxyPXQubGVmdC1uLmxlZnQsaT10LnRvcC1uLnRvcDtpZihyfHxpKXtsZXQgdD1lLmVsLG49dC5zdHlsZSxhPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz0xLHM9MTtyZXR1cm4gdC5vZmZzZXRXaWR0aCYmKG89YS53aWR0aC90Lm9mZnNldFdpZHRoKSx0Lm9mZnNldEhlaWdodCYmKHM9YS5oZWlnaHQvdC5vZmZzZXRIZWlnaHQpLCghTnVtYmVyLmlzRmluaXRlKG8pfHxvPT09MCkmJihvPTEpLCghTnVtYmVyLmlzRmluaXRlKHMpfHxzPT09MCkmJihzPTEpLE1hdGguYWJzKG8tMSk8LjAxJiYobz0xKSxNYXRoLmFicyhzLTEpPC4wMSYmKHM9MSksbi50cmFuc2Zvcm09bi53ZWJraXRUcmFuc2Zvcm09YHRyYW5zbGF0ZSgke3Ivb31weCwke2kvc31weClgLG4udHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZX19ZnVuY3Rpb24gSWwoZSl7bGV0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDp0LmxlZnQsdG9wOnQudG9wfX1mdW5jdGlvbiBMbChlLHQsbil7bGV0IHI9ZS5jbG9uZU5vZGUoKSxpPWVbYmNdO2kmJmkuZm9yRWFjaChlPT57ZS5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5yZW1vdmUoZSkpfSksbi5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5hZGQoZSkpLHIuc3R5bGUuZGlzcGxheT1gbm9uZWA7bGV0IGE9dC5ub2RlVHlwZT09PTE/dDp0LnBhcmVudE5vZGU7YS5hcHBlbmRDaGlsZChyKTtsZXR7aGFzVHJhbnNmb3JtOm99PVBjKHIpO3JldHVybiBhLnJlbW92ZUNoaWxkKHIpLG99dmFyIFJsPWU9PntsZXQgdD1lLnByb3BzW2BvblVwZGF0ZTptb2RlbFZhbHVlYF18fCExO3JldHVybiBwKHQpP2U9PmxlKHQsZSk6dH07ZnVuY3Rpb24gemwoZSl7ZS50YXJnZXQuY29tcG9zaW5nPSEwfWZ1bmN0aW9uIEJsKGUpe2xldCB0PWUudGFyZ2V0O3QuY29tcG9zaW5nJiYodC5jb21wb3Npbmc9ITEsdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChgaW5wdXRgKSkpfXZhciBWbD1TeW1ib2woYF9hc3NpZ25gKSxIbD1TeW1ib2woYF9pbml0aWFsVmFsdWVgKTtmdW5jdGlvbiBVbChlLHQsbil7cmV0dXJuIHQmJihlPWUudHJpbSgpKSxuJiYoZT1kZShlKSksZX12YXIgV2w9e2NyZWF0ZWQoZSx7bW9kaWZpZXJzOntsYXp5OnQsdHJpbTpuLG51bWJlcjpyfX0saSl7ZS5wYXJlbnROb2RlJiYoZS50eXBlPT09YHRleHRgP2VbSGxdPWUuZGVmYXVsdFZhbHVlLnJlcGxhY2UoL1tcclxuXS9nLGBgKTplLnR5cGU9PT1gdGV4dGFyZWFgJiYoZVtIbF09ZS5kZWZhdWx0VmFsdWUucmVwbGFjZSgvXHJcbj8vZyxgCmApKSksZVtWbF09UmwoaSk7bGV0IGE9cnx8aS5wcm9wcyYmaS5wcm9wcy50eXBlPT09YG51bWJlcmA7YWwoZSx0P2BjaGFuZ2VgOmBpbnB1dGAsdD0+e3QudGFyZ2V0LmNvbXBvc2luZ3x8ZVtWbF0oVWwoZS52YWx1ZSxuLGEpKX0pLChufHxhKSYmYWwoZSxgY2hhbmdlYCwoKT0+e2UudmFsdWU9VWwoZS52YWx1ZSxuLGEpfSksdHx8KGFsKGUsYGNvbXBvc2l0aW9uc3RhcnRgLHpsKSxhbChlLGBjb21wb3NpdGlvbmVuZGAsQmwpLGFsKGUsYGNoYW5nZWAsQmwpKX0sbW91bnRlZChlLHt2YWx1ZTp0LG1vZGlmaWVyczp7dHJpbTpuLG51bWJlcjpyfX0pe2xldCBpPXQ/P2BgLGE9ZVtIbF07ZGVsZXRlIGVbSGxdLGEhPT12b2lkIDAmJihlLnR5cGU9PT1gdGV4dGB8fGUudHlwZT09PWB0ZXh0YXJlYWApJiZlLnZhbHVlIT09YT9lW1ZsXShVbChlLnZhbHVlLG4scikpOmUudmFsdWU9aX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bixtb2RpZmllcnM6e2xhenk6cix0cmltOmksbnVtYmVyOmF9fSxvKXtpZihlW1ZsXT1SbChvKSxlLmNvbXBvc2luZylyZXR1cm47bGV0IHM9KGF8fGUudHlwZT09PWBudW1iZXJgKSYmIS9eMFxkLy50ZXN0KGUudmFsdWUpP2RlKGUudmFsdWUpOmUudmFsdWUsYz10Pz9gYDtpZihzPT09YylyZXR1cm47bGV0IGw9ZS5nZXRSb290Tm9kZSgpOyhsIGluc3RhbmNlb2YgRG9jdW1lbnR8fGwgaW5zdGFuY2VvZiBTaGFkb3dSb290KSYmbC5hY3RpdmVFbGVtZW50PT09ZSYmZS50eXBlIT09YHJhbmdlYCYmKHImJnQ9PT1ufHxpJiZlLnZhbHVlLnRyaW0oKT09PWMpfHwoZS52YWx1ZT1jKX19LEdsPXtkZWVwOiEwLGNyZWF0ZWQoZSx0LG4pe2VbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntsZXQgdD1lLl9tb2RlbFZhbHVlLG49WGwoZSkscj1lLmNoZWNrZWQsaT1lW1ZsXTtpZihwKHQpKXtsZXQgZT1EZSh0LG4pLGE9ZSE9PS0xO2lmKHImJiFhKWkodC5jb25jYXQobikpO2Vsc2UgaWYoIXImJmEpe2xldCBuPVsuLi50XTtuLnNwbGljZShlLDEpLGkobil9fWVsc2UgaWYoaCh0KSl7bGV0IGU9bmV3IFNldCh0KTtyP2UuYWRkKG4pOmUuZGVsZXRlKG4pLGkoZSl9ZWxzZSBpKFpsKGUscikpfSl9LG1vdW50ZWQ6S2wsYmVmb3JlVXBkYXRlKGUsdCxuKXtlW1ZsXT1SbChuKSxLbChlLHQsbil9fTtmdW5jdGlvbiBLbChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHIpe2UuX21vZGVsVmFsdWU9dDtsZXQgaTtpZihwKHQpKWk9RGUodCxyLnByb3BzLnZhbHVlKT4tMTtlbHNlIGlmKGgodCkpaT10LmhhcyhyLnByb3BzLnZhbHVlKTtlbHNle2lmKHQ9PT1uKXJldHVybjtpPUVlKHQsWmwoZSwhMCkpfWUuY2hlY2tlZCE9PWkmJihlLmNoZWNrZWQ9aSl9dmFyIHFsPXtjcmVhdGVkKGUse3ZhbHVlOnR9LG4pe2UuY2hlY2tlZD1FZSh0LG4ucHJvcHMudmFsdWUpLGVbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntlW1ZsXShYbChlKSl9KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bn0scil7ZVtWbF09UmwociksdCE9PW4mJihlLmNoZWNrZWQ9RWUodCxyLnByb3BzLnZhbHVlKSl9fSxKbD17ZGVlcDohMCxjcmVhdGVkKGUse3ZhbHVlOnQsbW9kaWZpZXJzOntudW1iZXI6bn19LHIpe2UuX21vZGVsVmFsdWU9dCxhbChlLGBjaGFuZ2VgLCgpPT57bGV0IHQ9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUub3B0aW9ucyxlPT5lLnNlbGVjdGVkKS5tYXAoZT0+bj9kZShYbChlKSk6WGwoZSkpO2VbVmxdKGUubXVsdGlwbGU/aChlLl9tb2RlbFZhbHVlKT9uZXcgU2V0KHQpOnQ6dFswXSksZS5fYXNzaWduaW5nPSEwLFFuKCgpPT57ZS5fYXNzaWduaW5nPSExfSl9KSxlW1ZsXT1SbChyKX0sbW91bnRlZChlLHt2YWx1ZTp0fSl7WWwoZSx0KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnR9LG4pe2UuX21vZGVsVmFsdWU9dCxlW1ZsXT1SbChuKX0sdXBkYXRlZChlLHt2YWx1ZTp0fSl7ZS5fYXNzaWduaW5nfHxZbChlLHQpfX07ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj1lLm11bHRpcGxlLHI9cCh0KTtpZighKG4mJiFyJiYhaCh0KSkpe2ZvcihsZXQgaT0wLGE9ZS5vcHRpb25zLmxlbmd0aDtpPGE7aSsrKXtsZXQgYT1lLm9wdGlvbnNbaV0sbz1YbChhKTtpZihuKXtpZihyKXtsZXQgZT10eXBlb2YgbzthLnNlbGVjdGVkPWU9PT1gc3RyaW5nYHx8ZT09PWBudW1iZXJgP3Quc29tZShlPT5TdHJpbmcoZSk9PT1TdHJpbmcobykpOkRlKHQsbyk+LTF9ZWxzZSBhLnNlbGVjdGVkPXQuaGFzKG8pfWVsc2UgaWYoRWUoWGwoYSksdCkpe2Uuc2VsZWN0ZWRJbmRleCE9PWkmJihlLnNlbGVjdGVkSW5kZXg9aSk7cmV0dXJufX0hbiYmZS5zZWxlY3RlZEluZGV4IT09LTEmJihlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBYbChlKXtyZXR1cm5gX3ZhbHVlYGluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBabChlLHQpe2xldCBuPXQ/YF90cnVlVmFsdWVgOmBfZmFsc2VWYWx1ZWA7cmV0dXJuIG4gaW4gZT9lW25dOnR9dmFyIFFsPXtjcmVhdGVkKGUsdCxuKXtldShlLHQsbixudWxsLGBjcmVhdGVkYCl9LG1vdW50ZWQoZSx0LG4pe2V1KGUsdCxuLG51bGwsYG1vdW50ZWRgKX0sYmVmb3JlVXBkYXRlKGUsdCxuLHIpe2V1KGUsdCxuLHIsYGJlZm9yZVVwZGF0ZWApfSx1cGRhdGVkKGUsdCxuLHIpe2V1KGUsdCxuLHIsYHVwZGF0ZWRgKX19O2Z1bmN0aW9uICRsKGUsdCl7c3dpdGNoKGUpe2Nhc2VgU0VMRUNUYDpyZXR1cm4gSmw7Y2FzZWBURVhUQVJFQWA6cmV0dXJuIFdsO2RlZmF1bHQ6c3dpdGNoKHQpe2Nhc2VgY2hlY2tib3hgOnJldHVybiBHbDtjYXNlYHJhZGlvYDpyZXR1cm4gcWw7ZGVmYXVsdDpyZXR1cm4gV2x9fX1mdW5jdGlvbiBldShlLHQsbixyLGkpe2xldCBhPSRsKGUudGFnTmFtZSxuLnByb3BzJiZuLnByb3BzLnR5cGUpW2ldO2EmJmEoZSx0LG4scil9ZnVuY3Rpb24gdHUoKXtXbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9KT0+KHt2YWx1ZTplfSkscWwuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSx0KT0+e2lmKHQucHJvcHMmJkVlKHQucHJvcHMudmFsdWUsZSkpcmV0dXJue2NoZWNrZWQ6ITB9fSxHbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9LHQpPT57aWYocChlKSl7aWYodC5wcm9wcyYmRGUoZSx0LnByb3BzLnZhbHVlKT4tMSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihoKGUpKXtpZih0LnByb3BzJiZlLmhhcyh0LnByb3BzLnZhbHVlKSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihlKXJldHVybntjaGVja2VkOiEwfX0sUWwuZ2V0U1NSUHJvcHM9KGUsdCk9PntpZih0eXBlb2YgdC50eXBlIT1gc3RyaW5nYClyZXR1cm47bGV0IG49JGwodC50eXBlLnRvVXBwZXJDYXNlKCksdC5wcm9wcyYmdC5wcm9wcy50eXBlKTtpZihuLmdldFNTUlByb3BzKXJldHVybiBuLmdldFNTUlByb3BzKGUsdCl9fXZhciBudT1bYGN0cmxgLGBzaGlmdGAsYGFsdGAsYG1ldGFgXSxydT17c3RvcDplPT5lLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6ZT0+ZS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6ZT0+ZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQsY3RybDplPT4hZS5jdHJsS2V5LHNoaWZ0OmU9PiFlLnNoaWZ0S2V5LGFsdDplPT4hZS5hbHRLZXksbWV0YTplPT4hZS5tZXRhS2V5LGxlZnQ6ZT0+YGJ1dHRvbmBpbiBlJiZlLmJ1dHRvbiE9PTAsbWlkZGxlOmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0xLHJpZ2h0OmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0yLGV4YWN0OihlLHQpPT5udS5zb21lKG49PmVbYCR7bn1LZXlgXSYmIXQuaW5jbHVkZXMobikpfSxpdT0oZSx0KT0+e2lmKCFlKXJldHVybiBlO2xldCBuPWUuX3dpdGhNb2RzfHw9e30scj10LmpvaW4oYC5gKTtyZXR1cm4gbltyXXx8KG5bcl09KChuLC4uLnIpPT57Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCByPXJ1W3RbZV1dO2lmKHImJnIobix0KSlyZXR1cm59cmV0dXJuIGUobiwuLi5yKX0pKX0sYXU9e2VzYzpgZXNjYXBlYCxzcGFjZTpgIGAsdXA6YGFycm93LXVwYCxsZWZ0OmBhcnJvdy1sZWZ0YCxyaWdodDpgYXJyb3ctcmlnaHRgLGRvd246YGFycm93LWRvd25gLGRlbGV0ZTpgYmFja3NwYWNlYH0sb3U9KGUsdCk9PntsZXQgbj1lLl93aXRoS2V5c3x8PXt9LHI9dC5qb2luKGAuYCk7cmV0dXJuIG5bcl18fChuW3JdPShuPT57aWYoIShga2V5YGluIG4pKXJldHVybjtsZXQgcj1vZShuLmtleSk7aWYodC5zb21lKGU9PmU9PT1yfHxhdVtlXT09PXIpKXJldHVybiBlKG4pfSkpfSxzdT1sKHtwYXRjaFByb3A6X2x9LF9jKSxjdSxsdT0hMTtmdW5jdGlvbiB1dSgpe3JldHVybiBjdXx8PUxvKHN1KX1mdW5jdGlvbiBkdSgpe3JldHVybiBjdT1sdT9jdTpSbyhzdSksbHU9ITAsY3V9dmFyIGZ1PSgoLi4uZSk9Pnt1dSgpLnJlbmRlciguLi5lKX0pLHB1PSgoLi4uZSk9PntkdSgpLmh5ZHJhdGUoLi4uZSl9KSxtdT0oKC4uLmUpPT57bGV0IHQ9dXUoKS5jcmVhdGVBcHAoLi4uZSkse21vdW50Om59PXQ7cmV0dXJuIHQubW91bnQ9ZT0+e2xldCByPV91KGUpO2lmKCFyKXJldHVybjtsZXQgaT10Ll9jb21wb25lbnQ7IXYoaSkmJiFpLnJlbmRlciYmIWkudGVtcGxhdGUmJihpLnRlbXBsYXRlPXIuaW5uZXJIVE1MKSxyLm5vZGVUeXBlPT09MSYmKHIudGV4dENvbnRlbnQ9YGApO2xldCBhPW4ociwhMSxndShyKSk7cmV0dXJuIHIgaW5zdGFuY2VvZiBFbGVtZW50JiYoci5yZW1vdmVBdHRyaWJ1dGUoYHYtY2xvYWtgKSxyLnNldEF0dHJpYnV0ZShgZGF0YS12LWFwcGAsYGApKSxhfSx0fSksaHU9KCguLi5lKT0+e2xldCB0PWR1KCkuY3JlYXRlQXBwKC4uLmUpLHttb3VudDpufT10O3JldHVybiB0Lm1vdW50PWU9PntsZXQgdD1fdShlKTtpZih0KXJldHVybiBuKHQsITAsZ3UodCkpfSx0fSk7ZnVuY3Rpb24gZ3UoZSl7aWYoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpcmV0dXJuYHN2Z2A7aWYodHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KXJldHVybmBtYXRobWxgfWZ1bmN0aW9uIF91KGUpe3JldHVybiB5KGUpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6ZX12YXIgdnU9ITEseXU9KCk9Pnt2dXx8KHZ1PSEwLHR1KCksVWMoKSl9LGJ1PXQoe0Jhc2VUcmFuc2l0aW9uOigpPT5RcixCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yczooKT0+SnIsQ29tbWVudDooKT0+Y3MsRGVwcmVjYXRpb25UeXBlczooKT0+bnVsbCxFZmZlY3RTY29wZTooKT0+TmUsRXJyb3JDb2RlczooKT0+em4sRXJyb3JUeXBlU3RyaW5nczooKT0+b2MsRnJhZ21lbnQ6KCk9PkwsS2VlcEFsaXZlOigpPT5CaSxSZWFjdGl2ZUVmZmVjdDooKT0+emUsU3RhdGljOigpPT5scyxTdXNwZW5zZTooKT0+WG8sVGVsZXBvcnQ6KCk9PlZyLFRleHQ6KCk9PnNzLFRyYWNrT3BUeXBlczooKT0+RW4sVHJhbnNpdGlvbjooKT0+Q2MsVHJhbnNpdGlvbkdyb3VwOigpPT5NbCxUcmlnZ2VyT3BUeXBlczooKT0+RG4sVnVlRWxlbWVudDooKT0+d2wsYXNzZXJ0TnVtYmVyOigpPT5SbixjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZzooKT0+SG4sY2FsbFdpdGhFcnJvckhhbmRsaW5nOigpPT5WbixjYW1lbGl6ZTooKT0+RSxjYXBpdGFsaXplOigpPT5zZSxjbG9uZVZOb2RlOigpPT5Dcyxjb21wYXRVdGlsczooKT0+bnVsbCxjb21waWxlOigpPT54dSxjb21wdXRlZDooKT0+VyxjcmVhdGVBcHA6KCk9Pm11LGNyZWF0ZUJsb2NrOigpPT5CLGNyZWF0ZUNvbW1lbnRWTm9kZTooKT0+VHMsY3JlYXRlRWxlbWVudEJsb2NrOigpPT56LGNyZWF0ZUVsZW1lbnRWTm9kZTooKT0+VixjcmVhdGVIeWRyYXRpb25SZW5kZXJlcjooKT0+Um8sY3JlYXRlUHJvcHNSZXN0UHJveHk6KCk9PklhLGNyZWF0ZVJlbmRlcmVyOigpPT5MbyxjcmVhdGVTU1JBcHA6KCk9Pmh1LGNyZWF0ZVNsb3RzOigpPT5oYSxjcmVhdGVTdGF0aWNWTm9kZTooKT0+d3MsY3JlYXRlVGV4dFZOb2RlOigpPT5VLGNyZWF0ZVZOb2RlOigpPT5ILGN1c3RvbVJlZjooKT0+dm4sZGVmaW5lQXN5bmNDb21wb25lbnQ6KCk9PkxpLGRlZmluZUNvbXBvbmVudDooKT0+RixkZWZpbmVDdXN0b21FbGVtZW50OigpPT54bCxkZWZpbmVFbWl0czooKT0+d2EsZGVmaW5lRXhwb3NlOigpPT5UYSxkZWZpbmVNb2RlbDooKT0+T2EsZGVmaW5lT3B0aW9uczooKT0+RWEsZGVmaW5lUHJvcHM6KCk9PkNhLGRlZmluZVNTUkN1c3RvbUVsZW1lbnQ6KCk9PlNsLGRlZmluZVNsb3RzOigpPT5EYSxkZXZ0b29sczooKT0+c2MsZWZmZWN0OigpPT5RZSxlZmZlY3RTY29wZTooKT0+UGUsZ2V0Q3VycmVudEluc3RhbmNlOigpPT5GcyxnZXRDdXJyZW50U2NvcGU6KCk9PkZlLGdldEN1cnJlbnRXYXRjaGVyOigpPT5qbixnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW46KCk9PmlpLGd1YXJkUmVhY3RpdmVQcm9wczooKT0+U3MsaDooKT0+RyxoYW5kbGVFcnJvcjooKT0+VW4saGFzSW5qZWN0aW9uQ29udGV4dDooKT0+YnIsaHlkcmF0ZTooKT0+cHUsaHlkcmF0ZU9uSWRsZTooKT0+QWksaHlkcmF0ZU9uSW50ZXJhY3Rpb246KCk9PlBpLGh5ZHJhdGVPbk1lZGlhUXVlcnk6KCk9Pk5pLGh5ZHJhdGVPblZpc2libGU6KCk9Pk1pLGluaXRDdXN0b21Gb3JtYXR0ZXI6KCk9PnRjLGluaXREaXJlY3RpdmVzRm9yU1NSOigpPT55dSxpbmplY3Q6KCk9PnlyLGlzTWVtb1NhbWU6KCk9PnJjLGlzUHJveHk6KCk9Pm9uLGlzUmVhY3RpdmU6KCk9Pm5uLGlzUmVhZG9ubHk6KCk9PnJuLGlzUmVmOigpPT5qLGlzUnVudGltZU9ubHk6KCk9PkpzLGlzU2hhbGxvdzooKT0+YW4saXNWTm9kZTooKT0+Z3MsbWFya1JhdzooKT0+c24sbWVyZ2VEZWZhdWx0czooKT0+UGEsbWVyZ2VNb2RlbHM6KCk9PkZhLG1lcmdlUHJvcHM6KCk9PmtzLG5leHRUaWNrOigpPT5Rbixub2RlT3BzOigpPT5fYyxub3JtYWxpemVDbGFzczooKT0+Tyxub3JtYWxpemVQcm9wczooKT0+eGUsbm9ybWFsaXplU3R5bGU6KCk9PmdlLG9uQWN0aXZhdGVkOigpPT5IaSxvbkJlZm9yZU1vdW50OigpPT5YaSxvbkJlZm9yZVVubW91bnQ6KCk9PmVhLG9uQmVmb3JlVXBkYXRlOigpPT5RaSxvbkRlYWN0aXZhdGVkOigpPT5VaSxvbkVycm9yQ2FwdHVyZWQ6KCk9PmFhLG9uTW91bnRlZDooKT0+Wmksb25SZW5kZXJUcmFja2VkOigpPT5pYSxvblJlbmRlclRyaWdnZXJlZDooKT0+cmEsb25TY29wZURpc3Bvc2U6KCk9PkllLG9uU2VydmVyUHJlZmV0Y2g6KCk9Pm5hLG9uVW5tb3VudGVkOigpPT50YSxvblVwZGF0ZWQ6KCk9PiRpLG9uV2F0Y2hlckNsZWFudXA6KCk9Pk1uLG9wZW5CbG9jazooKT0+UixwYXRjaFByb3A6KCk9Pl9sLHBvcFNjb3BlSWQ6KCk9Pm1yLHByb3ZpZGU6KCk9PnZyLHByb3h5UmVmczooKT0+Z24scHVzaFNjb3BlSWQ6KCk9PnByLHF1ZXVlUG9zdEZsdXNoQ2I6KCk9Pm5yLHJlYWN0aXZlOigpPT5adCxyZWFkb25seTooKT0+JHQscmVmOigpPT5NLHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyOigpPT5xcyxyZW5kZXI6KCk9PmZ1LHJlbmRlckxpc3Q6KCk9Pm1hLHJlbmRlclNsb3Q6KCk9PkkscmVzb2x2ZUNvbXBvbmVudDooKT0+Y2EscmVzb2x2ZURpcmVjdGl2ZTooKT0+ZGEscmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ6KCk9PnVhLHJlc29sdmVGaWx0ZXI6KCk9Pm51bGwscmVzb2x2ZVRyYW5zaXRpb25Ib29rczooKT0+ZWksc2V0QmxvY2tUcmFja2luZzooKT0+bXMsc2V0RGV2dG9vbHNIb29rOigpPT5jYyxzZXRUcmFuc2l0aW9uSG9va3M6KCk9PnJpLHNoYWxsb3dSZWFjdGl2ZTooKT0+UXQsc2hhbGxvd1JlYWRvbmx5OigpPT5lbixzaGFsbG93UmVmOigpPT51bixzc3JDb250ZXh0S2V5OigpPT54cixzc3JVdGlsczooKT0+bGMsc3RvcDooKT0+JGUsdG9EaXNwbGF5U3RyaW5nOigpPT5rLHRvSGFuZGxlcktleTooKT0+Y2UsdG9IYW5kbGVyczooKT0+X2EsdG9SYXc6KCk9PkEsdG9SZWY6KCk9PlNuLHRvUmVmczooKT0+eW4sdG9WYWx1ZTooKT0+bW4sdHJhbnNmb3JtVk5vZGVBcmdzOigpPT52cyx0cmlnZ2VyUmVmOigpPT5wbix1bnJlZjooKT0+Tix1c2VBdHRyczooKT0+amEsdXNlQ3NzTW9kdWxlOigpPT5EbCx1c2VDc3NWYXJzOigpPT5HYyx1c2VIb3N0OigpPT5UbCx1c2VJZDooKT0+YWksdXNlTW9kZWw6KCk9PnJvLHVzZVNTUkNvbnRleHQ6KCk9PlNyLHVzZVNoYWRvd1Jvb3Q6KCk9PkVsLHVzZVNsb3RzOigpPT5BYSx1c2VUZW1wbGF0ZVJlZjooKT0+c2ksdXNlVHJhbnNpdGlvblN0YXRlOigpPT5Lcix2TW9kZWxDaGVja2JveDooKT0+R2wsdk1vZGVsRHluYW1pYzooKT0+UWwsdk1vZGVsUmFkaW86KCk9PnFsLHZNb2RlbFNlbGVjdDooKT0+Smwsdk1vZGVsVGV4dDooKT0+V2wsdlNob3c6KCk9PlZjLHZlcnNpb246KCk9PmljLHdhcm46KCk9PmFjLHdhdGNoOigpPT5Fcix3YXRjaEVmZmVjdDooKT0+Q3Isd2F0Y2hQb3N0RWZmZWN0OigpPT53cix3YXRjaFN5bmNFZmZlY3Q6KCk9PlRyLHdpdGhBc3luY0NvbnRleHQ6KCk9PkxhLHdpdGhDdHg6KCk9PlAsd2l0aERlZmF1bHRzOigpPT5rYSx3aXRoRGlyZWN0aXZlczooKT0+Z3Isd2l0aEtleXM6KCk9Pm91LHdpdGhNZW1vOigpPT5uYyx3aXRoTW9kaWZpZXJzOigpPT5pdSx3aXRoU2NvcGVJZDooKT0+aHJ9KSx4dT0oKT0+e307ZnVuY3Rpb24gU3UoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPUFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIEN1KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gd3UoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gU3UoZSl9ZnVuY3Rpb24gVHUoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbmApfWZ1bmN0aW9uIEV1KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsYHZhbHVlYGluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxMdShyLmtleSkscil9fWZ1bmN0aW9uIER1KGUsdCxuKXtyZXR1cm4gdCYmRXUoZS5wcm90b3R5cGUsdCksbiYmRXUoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIE91KGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVtgQEBpdGVyYXRvcmBdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj16dShlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09YG51bWJlcmApe24mJihlPW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6aX19dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgYSxvPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBlPW4ubmV4dCgpO3JldHVybiBvPWUuZG9uZSxlfSxlOmZ1bmN0aW9uKGUpe3M9ITAsYT1lfSxmOmZ1bmN0aW9uKCl7dHJ5e298fG4ucmV0dXJuPT1udWxsfHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX19fWZ1bmN0aW9uIEsoZSx0LG4pe3JldHVybih0PUx1KHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGt1KGUpe2lmKHR5cGVvZiBTeW1ib2w8YHVgJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbYEBAaXRlcmF0b3JgXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBBdShlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPGB1YCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlW2BAQGl0ZXJhdG9yYF07aWYobiE9bnVsbCl7dmFyIHIsaSxhLG8scz1bXSxjPSEwLGw9ITE7dHJ5e2lmKGE9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9YS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXtsPSEwLGk9ZX1maW5hbGx5e3RyeXtpZighYyYmbi5yZXR1cm4hPW51bGwmJihvPW4ucmV0dXJuKCksT2JqZWN0KG8pIT09bykpcmV0dXJufWZpbmFsbHl7aWYobCl0aHJvdyBpfX1yZXR1cm4gc319ZnVuY3Rpb24ganUoKXt0aHJvdyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBNdSgpe3Rocm93IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBOdShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHEoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/TnUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0soZSx0LG5bdF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TnUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfWZ1bmN0aW9uIFB1KGUsdCl7cmV0dXJuIEN1KGUpfHxBdShlLHQpfHx6dShlLHQpfHxqdSgpfWZ1bmN0aW9uIEZ1KGUpe3JldHVybiB3dShlKXx8a3UoZSl8fHp1KGUpfHxNdSgpfWZ1bmN0aW9uIEl1KGUsdCl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4gZTt2YXIgbj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGUsdHx8YGRlZmF1bHRgKTtpZih0eXBlb2YgciE9YG9iamVjdGApcmV0dXJuIHI7dGhyb3cgVHlwZUVycm9yKGBAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLmApfXJldHVybih0PT09YHN0cmluZ2A/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gTHUoZSl7dmFyIHQ9SXUoZSxgc3RyaW5nYCk7cmV0dXJuIHR5cGVvZiB0PT1gc3ltYm9sYD90OnQrYGB9ZnVuY3Rpb24gUnUoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4gUnU9dHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09YHN5bWJvbGA/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmdHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/YHN5bWJvbGA6dHlwZW9mIGV9LFJ1KGUpfWZ1bmN0aW9uIHp1KGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBTdShlLHQpO3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7cmV0dXJuIG49PT1gT2JqZWN0YCYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxuPT09YE1hcGB8fG49PT1gU2V0YD9BcnJheS5mcm9tKGUpOm49PT1gQXJndW1lbnRzYHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/U3UoZSx0KTp2b2lkIDB9fXZhciBCdT1mdW5jdGlvbigpe30sVnU9e30sSHU9e30sVXU9bnVsbCxXdT17bWFyazpCdSxtZWFzdXJlOkJ1fTt0cnl7dHlwZW9mIHdpbmRvdzxgdWAmJihWdT13aW5kb3cpLHR5cGVvZiBkb2N1bWVudDxgdWAmJihIdT1kb2N1bWVudCksdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI8YHVgJiYoVXU9TXV0YXRpb25PYnNlcnZlciksdHlwZW9mIHBlcmZvcm1hbmNlPGB1YCYmKFd1PXBlcmZvcm1hbmNlKX1jYXRjaHt9dmFyIEd1PShWdS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQsS3U9R3U9PT12b2lkIDA/YGA6R3UscXU9VnUsSnU9SHUsWXU9VXUsWHU9V3U7cXUuZG9jdW1lbnQ7dmFyIFp1PSEhSnUuZG9jdW1lbnRFbGVtZW50JiYhIUp1LmhlYWQmJnR5cGVvZiBKdS5hZGRFdmVudExpc3RlbmVyPT1gZnVuY3Rpb25gJiZ0eXBlb2YgSnUuY3JlYXRlRWxlbWVudD09YGZ1bmN0aW9uYCxRdT1+S3UuaW5kZXhPZihgTVNJRWApfHx+S3UuaW5kZXhPZihgVHJpZGVudC9gKSwkdSxlZD0vZmEoa3xrZHxzfHJ8bHx0fGR8ZHJ8ZGx8ZHR8YnxzbHJ8c2xwcnx3c2J8dGx8bnN8bmRzfGVzfGd0fGpyfGpmcnxqZHJ8dXNifHVmc2J8dWRzYnxjcnxzc3xzcnxzbHxzdHxzZHN8c2RyfHNkbHxzZHR8c2xkcnxzbHBkcnxwcnxtc3x2cyk/W1wtXCBdLyx0ZD0vRm9udCA/QXdlc29tZSA/KFs1NjcgXSopKFNvbGlkfFJlZ3VsYXJ8TGlnaHR8VGhpbnxEdW90b25lfEJyYW5kc3xGcmVlfFByb3xTaGFycCBEdW90b25lfFNoYXJwfEtpdHxOb3Rkb2cgRHVvfE5vdGRvZ3xDaGlzZWx8RXRjaHxHcmFwaGl0ZXxUaHVtYnByaW50fEplbGx5IEZpbGx8SmVsbHkgRHVvfEplbGx5fFV0aWxpdHl8VXRpbGl0eSBGaWxsfFV0aWxpdHkgRHVvfFNsYWIgUHJlc3N8U2xhYnxTbGFiIER1b3xTbGFiIFByZXNzIER1b3xQaXhlbHxNb3NhaWN8VmVsbHVtfFdoaXRlYm9hcmQpPy4qL2ksbmQ9e2NsYXNzaWM6e2ZhOmBzb2xpZGAsZmFzOmBzb2xpZGAsImZhLXNvbGlkIjpgc29saWRgLGZhcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWw6YGxpZ2h0YCwiZmEtbGlnaHQiOmBsaWdodGAsZmF0OmB0aGluYCwiZmEtdGhpbiI6YHRoaW5gLGZhYjpgYnJhbmRzYCwiZmEtYnJhbmRzIjpgYnJhbmRzYH0sZHVvdG9uZTp7ZmE6YHNvbGlkYCxmYWQ6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsImZhLWR1b3RvbmUiOmBzb2xpZGAsZmFkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWRsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhZHQ6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LHNoYXJwOntmYTpgc29saWRgLGZhc3M6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsZmFzcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhc3Q6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmE6YHNvbGlkYCxmYXNkczpgc29saWRgLCJmYS1zb2xpZCI6YHNvbGlkYCxmYXNkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNkbDpgbGlnaHRgLCJmYS1saWdodCI6YGxpZ2h0YCxmYXNkdDpgdGhpbmAsImZhLXRoaW4iOmB0aGluYH0sc2xhYjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscjpgcmVndWxhcmB9LCJzbGFiLXByZXNzIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscHI6YHJlZ3VsYXJgfSwic2xhYi1kdW8iOnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhc2xkcjpgcmVndWxhcmB9LCJzbGFiLXByZXNzLWR1byI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFzbHBkcjpgcmVndWxhcmB9LHRodW1icHJpbnQ6eyJmYS1saWdodCI6YGxpZ2h0YCxmYXRsOmBsaWdodGB9LHZlbGx1bTp7ImZhLXNvbGlkIjpgc29saWRgLGZhdnM6YHNvbGlkYH0scGl4ZWw6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFwcjpgcmVndWxhcmB9LG1vc2FpYzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbXM6YHNvbGlkYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhd3NiOmBzZW1pYm9sZGB9LG5vdGRvZzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbnM6YHNvbGlkYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBzb2xpZGAsZmFuZHM6YHNvbGlkYH0sZXRjaDp7ImZhLXNvbGlkIjpgc29saWRgLGZhZXM6YHNvbGlkYH0sZ3JhcGhpdGU6eyJmYS10aGluIjpgdGhpbmAsZmFndDpgdGhpbmB9LGplbGx5OnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhanI6YHJlZ3VsYXJgfSwiamVsbHktZmlsbCI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFqZnI6YHJlZ3VsYXJgfSwiamVsbHktZHVvIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWpkcjpgcmVndWxhcmB9LGNoaXNlbDp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWNyOmByZWd1bGFyYH0sdXRpbGl0eTp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhdXNiOmBzZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVkc2I6YHNlbWlib2xkYH0sInV0aWxpdHktZmlsbCI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVmc2I6YHNlbWlib2xkYH19LHJkPXtHUk9VUDpgZHVvdG9uZS1ncm91cGAsU1dBUF9PUEFDSVRZOmBzd2FwLW9wYWNpdHlgLFBSSU1BUlk6YHByaW1hcnlgLFNFQ09OREFSWTpgc2Vjb25kYXJ5YH0saWQ9W2BmYS1jbGFzc2ljYCxgZmEtZHVvdG9uZWAsYGZhLXNoYXJwYCxgZmEtc2hhcnAtZHVvdG9uZWAsYGZhLXRodW1icHJpbnRgLGBmYS13aGl0ZWJvYXJkYCxgZmEtbm90ZG9nYCxgZmEtbm90ZG9nLWR1b2AsYGZhLWNoaXNlbGAsYGZhLWV0Y2hgLGBmYS1ncmFwaGl0ZWAsYGZhLWplbGx5YCxgZmEtamVsbHktZmlsbGAsYGZhLWplbGx5LWR1b2AsYGZhLXNsYWJgLGBmYS1zbGFiLXByZXNzYCxgZmEtc2xhYi1wcmVzcy1kdW9gLGBmYS1zbGFiLWR1b2AsYGZhLW1vc2FpY2AsYGZhLXBpeGVsYCxgZmEtdmVsbHVtYCxgZmEtdXRpbGl0eWAsYGZhLXV0aWxpdHktZHVvYCxgZmEtdXRpbGl0eS1maWxsYF0sYWQ9YGNsYXNzaWNgLG9kPWBkdW90b25lYCxzZD1gc2hhcnBgLGNkPWBzaGFycC1kdW90b25lYCxsZD1gY2hpc2VsYCx1ZD1gZXRjaGAsZGQ9YGdyYXBoaXRlYCxmZD1gamVsbHlgLHBkPWBqZWxseS1kdW9gLG1kPWBqZWxseS1maWxsYCxoZD1gbW9zYWljYCxnZD1gbm90ZG9nYCxfZD1gbm90ZG9nLWR1b2AsdmQ9YHBpeGVsYCx5ZD1gc2xhYmAsYmQ9YHNsYWItZHVvYCx4ZD1gc2xhYi1wcmVzc2AsU2Q9YHNsYWItcHJlc3MtZHVvYCxDZD1gdGh1bWJwcmludGAsd2Q9YHV0aWxpdHlgLFRkPWB1dGlsaXR5LWR1b2AsRWQ9YHV0aWxpdHktZmlsbGAsRGQ9YHZlbGx1bWAsT2Q9YHdoaXRlYm9hcmRgLGtkPWBDbGFzc2ljYCxBZD1gRHVvdG9uZWAsamQ9YFNoYXJwYCxNZD1gU2hhcnAgRHVvdG9uZWAsTmQ9YENoaXNlbGAsUGQ9YEV0Y2hgLEZkPWBHcmFwaGl0ZWAsSWQ9YEplbGx5YCxMZD1gSmVsbHkgRHVvYCxSZD1gSmVsbHkgRmlsbGAsemQ9YE1vc2FpY2AsQmQ9YE5vdGRvZ2AsVmQ9YE5vdGRvZyBEdW9gLEhkPWBQaXhlbGAsVWQ9YFNsYWJgLFdkPWBTbGFiIER1b2AsR2Q9YFNsYWIgUHJlc3NgLEtkPWBTbGFiIFByZXNzIER1b2AscWQ9YFRodW1icHJpbnRgLEpkPWBVdGlsaXR5YCxZZD1gVXRpbGl0eSBEdW9gLFhkPWBVdGlsaXR5IEZpbGxgLFpkPWBWZWxsdW1gLFFkPWBXaGl0ZWJvYXJkYCwkZD1bYWQsb2Qsc2QsY2QsbGQsdWQsZGQsZmQscGQsbWQsaGQsZ2QsX2QsdmQseWQsYmQseGQsU2QsQ2Qsd2QsVGQsRWQsRGQsT2RdOyR1PXt9LEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsYWQsa2QpLG9kLEFkKSxzZCxqZCksY2QsTWQpLGxkLE5kKSx1ZCxQZCksZGQsRmQpLGZkLElkKSxwZCxMZCksbWQsUmQpLEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsaGQsemQpLGdkLEJkKSxfZCxWZCksdmQsSGQpLHlkLFVkKSxiZCxXZCkseGQsR2QpLFNkLEtkKSxDZCxxZCksd2QsSmQpLEsoSyhLKEsoJHUsVGQsWWQpLEVkLFhkKSxEZCxaZCksT2QsUWQpO3ZhciBlZj17Y2xhc3NpYzp7OTAwOmBmYXNgLDQwMDpgZmFyYCxub3JtYWw6YGZhcmAsMzAwOmBmYWxgLDEwMDpgZmF0YH0sZHVvdG9uZTp7OTAwOmBmYWRgLDQwMDpgZmFkcmAsMzAwOmBmYWRsYCwxMDA6YGZhZHRgfSxzaGFycDp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLDMwMDpgZmFzbGAsMTAwOmBmYXN0YH0sInNoYXJwLWR1b3RvbmUiOns5MDA6YGZhc2RzYCw0MDA6YGZhc2RyYCwzMDA6YGZhc2RsYCwxMDA6YGZhc2R0YH0sc2xhYjp7NDAwOmBmYXNscmB9LCJzbGFiLXByZXNzIjp7NDAwOmBmYXNscHJgfSwic2xhYi1kdW8iOns0MDA6YGZhc2xkcmB9LCJzbGFiLXByZXNzLWR1byI6ezQwMDpgZmFzbHBkcmB9LHZlbGx1bTp7OTAwOmBmYXZzYH0sbW9zYWljOns5MDA6YGZhbXNgfSxwaXhlbDp7NDAwOmBmYXByYH0sd2hpdGVib2FyZDp7NjAwOmBmYXdzYmB9LHRodW1icHJpbnQ6ezMwMDpgZmF0bGB9LG5vdGRvZzp7OTAwOmBmYW5zYH0sIm5vdGRvZy1kdW8iOns5MDA6YGZhbmRzYH0sZXRjaDp7OTAwOmBmYWVzYH0sZ3JhcGhpdGU6ezEwMDpgZmFndGB9LGNoaXNlbDp7NDAwOmBmYWNyYH0samVsbHk6ezQwMDpgZmFqcmB9LCJqZWxseS1maWxsIjp7NDAwOmBmYWpmcmB9LCJqZWxseS1kdW8iOns0MDA6YGZhamRyYH0sdXRpbGl0eTp7NjAwOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6ezYwMDpgZmF1ZHNiYH0sInV0aWxpdHktZmlsbCI6ezYwMDpgZmF1ZnNiYH19LHRmPXsiRm9udCBBd2Vzb21lIDcgRnJlZSI6ezkwMDpgZmFzYCw0MDA6YGZhcmB9LCJGb250IEF3ZXNvbWUgNyBQcm8iOns5MDA6YGZhc2AsNDAwOmBmYXJgLG5vcm1hbDpgZmFyYCwzMDA6YGZhbGAsMTAwOmBmYXRgfSwiRm9udCBBd2Vzb21lIDcgQnJhbmRzIjp7NDAwOmBmYWJgLG5vcm1hbDpgZmFiYH0sIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOns5MDA6YGZhZGAsNDAwOmBmYWRyYCxub3JtYWw6YGZhZHJgLDMwMDpgZmFkbGAsMTAwOmBmYWR0YH0sIkZvbnQgQXdlc29tZSA3IFNoYXJwIjp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLG5vcm1hbDpgZmFzcmAsMzAwOmBmYXNsYCwxMDA6YGZhc3RgfSwiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI6ezkwMDpgZmFzZHNgLDQwMDpgZmFzZHJgLG5vcm1hbDpgZmFzZHJgLDMwMDpgZmFzZGxgLDEwMDpgZmFzZHRgfSwiRm9udCBBd2Vzb21lIDcgSmVsbHkiOns0MDA6YGZhanJgLG5vcm1hbDpgZmFqcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsIjp7NDAwOmBmYWpmcmAsbm9ybWFsOmBmYWpmcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8iOns0MDA6YGZhamRyYCxub3JtYWw6YGZhamRyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIiOns0MDA6YGZhc2xyYCxub3JtYWw6YGZhc2xyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MiOns0MDA6YGZhc2xwcmAsbm9ybWFsOmBmYXNscHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBEdW8iOns0MDA6YGZhc2xkcmAsbm9ybWFsOmBmYXNsZHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyBEdW8iOns0MDA6YGZhc2xwZHJgLG5vcm1hbDpgZmFzbHBkcmB9LCJGb250IEF3ZXNvbWUgNyBQaXhlbCI6ezQwMDpgZmFwcmAsbm9ybWFsOmBmYXByYH0sIkZvbnQgQXdlc29tZSA3IE1vc2FpYyI6ezkwMDpgZmFtc2Asbm9ybWFsOmBmYW1zYH0sIkZvbnQgQXdlc29tZSA3IFZlbGx1bSI6ezkwMDpgZmF2c2Asbm9ybWFsOmBmYXZzYH0sIkZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQiOnszMDA6YGZhdGxgLG5vcm1hbDpgZmF0bGB9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2ciOns5MDA6YGZhbnNgLG5vcm1hbDpgZmFuc2B9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjp7OTAwOmBmYW5kc2Asbm9ybWFsOmBmYW5kc2B9LCJGb250IEF3ZXNvbWUgNyBFdGNoIjp7OTAwOmBmYWVzYCxub3JtYWw6YGZhZXNgfSwiRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUiOnsxMDA6YGZhZ3RgLG5vcm1hbDpgZmFndGB9LCJGb250IEF3ZXNvbWUgNyBDaGlzZWwiOns0MDA6YGZhY3JgLG5vcm1hbDpgZmFjcmB9LCJGb250IEF3ZXNvbWUgNyBXaGl0ZWJvYXJkIjp7NjAwOmBmYXdzYmAsbm9ybWFsOmBmYXdzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5Ijp7NjAwOmBmYXVzYmAsbm9ybWFsOmBmYXVzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byI6ezYwMDpgZmF1ZHNiYCxub3JtYWw6YGZhdWRzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOns2MDA6YGZhdWZzYmAsbm9ybWFsOmBmYXVmc2JgfX0sbmY9bmV3IE1hcChbW2BjbGFzc2ljYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYCxgcmVndWxhcmAsYGxpZ2h0YCxgdGhpbmAsYGJyYW5kc2BdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZHVvdG9uZWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWRgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc3NgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwLWR1b3RvbmVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzZHNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYGNoaXNlbGAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWNyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BldGNoYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhZXNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZ3JhcGhpdGVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFndGAsZGVmYXVsdFN0eWxlSWQ6YHRoaW5gLHN0eWxlSWRzOltgdGhpbmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjEwMH1dLFtgamVsbHlgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFqcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgamVsbHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamRyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BqZWxseS1maWxsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamZyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2Btb3NhaWNgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFtc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2dgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFuc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2ctZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhbmRzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHBpeGVsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhcHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWJgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzbHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xkcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgc2xhYi1wcmVzc2Ase2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXNscHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItcHJlc3MtZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xwZHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHRodW1icHJpbnRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF0bGAsZGVmYXVsdFN0eWxlSWQ6YGxpZ2h0YCxzdHlsZUlkczpbYGxpZ2h0YF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6MzAwfV0sW2B1dGlsaXR5YCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdXNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHV0aWxpdHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdWRzYmAsZGVmYXVsdFN0eWxlSWQ6YHNlbWlib2xkYCxzdHlsZUlkczpbYHNlbWlib2xkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NjAwfV0sW2B1dGlsaXR5LWZpbGxgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF1ZnNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHZlbGx1bWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXZzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHdoaXRlYm9hcmRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF3c2JgLGRlZmF1bHRTdHlsZUlkOmBzZW1pYm9sZGAsc3R5bGVJZHM6W2BzZW1pYm9sZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjYwMH1dXSkscmY9e2NoaXNlbDp7cmVndWxhcjpgZmFjcmB9LGNsYXNzaWM6e2JyYW5kczpgZmFiYCxsaWdodDpgZmFsYCxyZWd1bGFyOmBmYXJgLHNvbGlkOmBmYXNgLHRoaW46YGZhdGB9LGR1b3RvbmU6e2xpZ2h0OmBmYWRsYCxyZWd1bGFyOmBmYWRyYCxzb2xpZDpgZmFkYCx0aGluOmBmYWR0YH0sZXRjaDp7c29saWQ6YGZhZXNgfSxncmFwaGl0ZTp7dGhpbjpgZmFndGB9LGplbGx5OntyZWd1bGFyOmBmYWpyYH0sImplbGx5LWR1byI6e3JlZ3VsYXI6YGZhamRyYH0sImplbGx5LWZpbGwiOntyZWd1bGFyOmBmYWpmcmB9LG1vc2FpYzp7c29saWQ6YGZhbXNgfSxub3Rkb2c6e3NvbGlkOmBmYW5zYH0sIm5vdGRvZy1kdW8iOntzb2xpZDpgZmFuZHNgfSxwaXhlbDp7cmVndWxhcjpgZmFwcmB9LHNoYXJwOntsaWdodDpgZmFzbGAscmVndWxhcjpgZmFzcmAsc29saWQ6YGZhc3NgLHRoaW46YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6e2xpZ2h0OmBmYXNkbGAscmVndWxhcjpgZmFzZHJgLHNvbGlkOmBmYXNkc2AsdGhpbjpgZmFzZHRgfSxzbGFiOntyZWd1bGFyOmBmYXNscmB9LCJzbGFiLWR1byI6e3JlZ3VsYXI6YGZhc2xkcmB9LCJzbGFiLXByZXNzIjp7cmVndWxhcjpgZmFzbHByYH0sInNsYWItcHJlc3MtZHVvIjp7cmVndWxhcjpgZmFzbHBkcmB9LHRodW1icHJpbnQ6e2xpZ2h0OmBmYXRsYH0sdXRpbGl0eTp7c2VtaWJvbGQ6YGZhdXNiYH0sInV0aWxpdHktZHVvIjp7c2VtaWJvbGQ6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOntzZW1pYm9sZDpgZmF1ZnNiYH0sdmVsbHVtOntzb2xpZDpgZmF2c2B9LHdoaXRlYm9hcmQ6e3NlbWlib2xkOmBmYXdzYmB9fSxhZj1bYGZha2AsYGZhLWtpdGAsYGZha2RgLGBmYS1raXQtZHVvdG9uZWBdLG9mPXtraXQ6e2Zhazpga2l0YCwiZmEta2l0Ijpga2l0YH0sImtpdC1kdW90b25lIjp7ZmFrZDpga2l0LWR1b3RvbmVgLCJmYS1raXQtZHVvdG9uZSI6YGtpdC1kdW90b25lYH19LHNmPVtga2l0YF07SyhLKHt9LGBraXRgLGBLaXRgKSxga2l0LWR1b3RvbmVgLGBLaXQgRHVvdG9uZWApO3ZhciBjZj17a2l0OnsiZmEta2l0IjpgZmFrYH0sImtpdC1kdW90b25lIjp7ImZhLWtpdC1kdW90b25lIjpgZmFrZGB9fSxsZj17IkZvbnQgQXdlc29tZSBLaXQiOns0MDA6YGZha2Asbm9ybWFsOmBmYWtgfSwiRm9udCBBd2Vzb21lIEtpdCBEdW90b25lIjp7NDAwOmBmYWtkYCxub3JtYWw6YGZha2RgfX0sdWY9e2tpdDp7ZmFrOmBmYS1raXRgfSwia2l0LWR1b3RvbmUiOntmYWtkOmBmYS1raXQtZHVvdG9uZWB9fSxkZj17a2l0OntraXQ6YGZha2B9LCJraXQtZHVvdG9uZSI6eyJraXQtZHVvdG9uZSI6YGZha2RgfX0sZmYscGY9e0dST1VQOmBkdW90b25lLWdyb3VwYCxTV0FQX09QQUNJVFk6YHN3YXAtb3BhY2l0eWAsUFJJTUFSWTpgcHJpbWFyeWAsU0VDT05EQVJZOmBzZWNvbmRhcnlgfSxtZj1bYGZhLWNsYXNzaWNgLGBmYS1kdW90b25lYCxgZmEtc2hhcnBgLGBmYS1zaGFycC1kdW90b25lYCxgZmEtdGh1bWJwcmludGAsYGZhLXdoaXRlYm9hcmRgLGBmYS1ub3Rkb2dgLGBmYS1ub3Rkb2ctZHVvYCxgZmEtY2hpc2VsYCxgZmEtZXRjaGAsYGZhLWdyYXBoaXRlYCxgZmEtamVsbHlgLGBmYS1qZWxseS1maWxsYCxgZmEtamVsbHktZHVvYCxgZmEtc2xhYmAsYGZhLXNsYWItcHJlc3NgLGBmYS1zbGFiLXByZXNzLWR1b2AsYGZhLXNsYWItZHVvYCxgZmEtbW9zYWljYCxgZmEtcGl4ZWxgLGBmYS12ZWxsdW1gLGBmYS11dGlsaXR5YCxgZmEtdXRpbGl0eS1kdW9gLGBmYS11dGlsaXR5LWZpbGxgXTtmZj17fSxLKEsoSyhLKEsoSyhLKEsoSyhLKGZmLGBjbGFzc2ljYCxgQ2xhc3NpY2ApLGBkdW90b25lYCxgRHVvdG9uZWApLGBzaGFycGAsYFNoYXJwYCksYHNoYXJwLWR1b3RvbmVgLGBTaGFycCBEdW90b25lYCksYGNoaXNlbGAsYENoaXNlbGApLGBldGNoYCxgRXRjaGApLGBncmFwaGl0ZWAsYEdyYXBoaXRlYCksYGplbGx5YCxgSmVsbHlgKSxgamVsbHktZHVvYCxgSmVsbHkgRHVvYCksYGplbGx5LWZpbGxgLGBKZWxseSBGaWxsYCksSyhLKEsoSyhLKEsoSyhLKEsoSyhmZixgbW9zYWljYCxgTW9zYWljYCksYG5vdGRvZ2AsYE5vdGRvZ2ApLGBub3Rkb2ctZHVvYCxgTm90ZG9nIER1b2ApLGBwaXhlbGAsYFBpeGVsYCksYHNsYWJgLGBTbGFiYCksYHNsYWItZHVvYCxgU2xhYiBEdW9gKSxgc2xhYi1wcmVzc2AsYFNsYWIgUHJlc3NgKSxgc2xhYi1wcmVzcy1kdW9gLGBTbGFiIFByZXNzIER1b2ApLGB0aHVtYnByaW50YCxgVGh1bWJwcmludGApLGB1dGlsaXR5YCxgVXRpbGl0eWApLEsoSyhLKEsoZmYsYHV0aWxpdHktZHVvYCxgVXRpbGl0eSBEdW9gKSxgdXRpbGl0eS1maWxsYCxgVXRpbGl0eSBGaWxsYCksYHZlbGx1bWAsYFZlbGx1bWApLGB3aGl0ZWJvYXJkYCxgV2hpdGVib2FyZGApLEsoSyh7fSxga2l0YCxgS2l0YCksYGtpdC1kdW90b25lYCxgS2l0IER1b3RvbmVgKTt2YXIgaGY9e2NsYXNzaWM6eyJmYS1icmFuZHMiOmBmYWJgLCJmYS1kdW90b25lIjpgZmFkYCwiZmEtbGlnaHQiOmBmYWxgLCJmYS1yZWd1bGFyIjpgZmFyYCwiZmEtc29saWQiOmBmYXNgLCJmYS10aGluIjpgZmF0YH0sZHVvdG9uZTp7ImZhLXJlZ3VsYXIiOmBmYWRyYCwiZmEtbGlnaHQiOmBmYWRsYCwiZmEtdGhpbiI6YGZhZHRgfSxzaGFycDp7ImZhLXNvbGlkIjpgZmFzc2AsImZhLXJlZ3VsYXIiOmBmYXNyYCwiZmEtbGlnaHQiOmBmYXNsYCwiZmEtdGhpbiI6YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6eyJmYS1zb2xpZCI6YGZhc2RzYCwiZmEtcmVndWxhciI6YGZhc2RyYCwiZmEtbGlnaHQiOmBmYXNkbGAsImZhLXRoaW4iOmBmYXNkdGB9LHNsYWI6eyJmYS1yZWd1bGFyIjpgZmFzbHJgfSwic2xhYi1wcmVzcyI6eyJmYS1yZWd1bGFyIjpgZmFzbHByYH0sInNsYWItZHVvIjp7ImZhLXJlZ3VsYXIiOmBmYXNsZHJgfSwic2xhYi1wcmVzcy1kdW8iOnsiZmEtcmVndWxhciI6YGZhc2xwZHJgfSxwaXhlbDp7ImZhLXJlZ3VsYXIiOmBmYXByYH0sbW9zYWljOnsiZmEtc29saWQiOmBmYW1zYH0sdmVsbHVtOnsiZmEtc29saWQiOmBmYXZzYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgZmF3c2JgfSx0aHVtYnByaW50OnsiZmEtbGlnaHQiOmBmYXRsYH0sbm90ZG9nOnsiZmEtc29saWQiOmBmYW5zYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBmYW5kc2B9LGV0Y2g6eyJmYS1zb2xpZCI6YGZhZXNgfSxncmFwaGl0ZTp7ImZhLXRoaW4iOmBmYWd0YH0samVsbHk6eyJmYS1yZWd1bGFyIjpgZmFqcmB9LCJqZWxseS1maWxsIjp7ImZhLXJlZ3VsYXIiOmBmYWpmcmB9LCJqZWxseS1kdW8iOnsiZmEtcmVndWxhciI6YGZhamRyYH0sY2hpc2VsOnsiZmEtcmVndWxhciI6YGZhY3JgfSx1dGlsaXR5OnsiZmEtc2VtaWJvbGQiOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOnsiZmEtc2VtaWJvbGQiOmBmYXVmc2JgfX0sZ2Y9e2NsYXNzaWM6W2BmYXNgLGBmYXJgLGBmYWxgLGBmYXRgLGBmYWRgXSxkdW90b25lOltgZmFkcmAsYGZhZGxgLGBmYWR0YF0sc2hhcnA6W2BmYXNzYCxgZmFzcmAsYGZhc2xgLGBmYXN0YF0sInNoYXJwLWR1b3RvbmUiOltgZmFzZHNgLGBmYXNkcmAsYGZhc2RsYCxgZmFzZHRgXSxzbGFiOltgZmFzbHJgXSwic2xhYi1wcmVzcyI6W2BmYXNscHJgXSwic2xhYi1kdW8iOltgZmFzbGRyYF0sInNsYWItcHJlc3MtZHVvIjpbYGZhc2xwZHJgXSxwaXhlbDpbYGZhcHJgXSxtb3NhaWM6W2BmYW1zYF0sdmVsbHVtOltgZmF2c2BdLHdoaXRlYm9hcmQ6W2BmYXdzYmBdLHRodW1icHJpbnQ6W2BmYXRsYF0sbm90ZG9nOltgZmFuc2BdLCJub3Rkb2ctZHVvIjpbYGZhbmRzYF0sZXRjaDpbYGZhZXNgXSxncmFwaGl0ZTpbYGZhZ3RgXSxqZWxseTpbYGZhanJgXSwiamVsbHktZmlsbCI6W2BmYWpmcmBdLCJqZWxseS1kdW8iOltgZmFqZHJgXSxjaGlzZWw6W2BmYWNyYF0sdXRpbGl0eTpbYGZhdXNiYF0sInV0aWxpdHktZHVvIjpbYGZhdWRzYmBdLCJ1dGlsaXR5LWZpbGwiOltgZmF1ZnNiYF19LF9mPXtjbGFzc2ljOntmYWI6YGZhLWJyYW5kc2AsZmFkOmBmYS1kdW90b25lYCxmYWw6YGZhLWxpZ2h0YCxmYXI6YGZhLXJlZ3VsYXJgLGZhczpgZmEtc29saWRgLGZhdDpgZmEtdGhpbmB9LGR1b3RvbmU6e2ZhZHI6YGZhLXJlZ3VsYXJgLGZhZGw6YGZhLWxpZ2h0YCxmYWR0OmBmYS10aGluYH0sc2hhcnA6e2Zhc3M6YGZhLXNvbGlkYCxmYXNyOmBmYS1yZWd1bGFyYCxmYXNsOmBmYS1saWdodGAsZmFzdDpgZmEtdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmFzZHM6YGZhLXNvbGlkYCxmYXNkcjpgZmEtcmVndWxhcmAsZmFzZGw6YGZhLWxpZ2h0YCxmYXNkdDpgZmEtdGhpbmB9LHNsYWI6e2Zhc2xyOmBmYS1yZWd1bGFyYH0sInNsYWItcHJlc3MiOntmYXNscHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1kdW8iOntmYXNsZHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1wcmVzcy1kdW8iOntmYXNscGRyOmBmYS1yZWd1bGFyYH0scGl4ZWw6e2ZhcHI6YGZhLXJlZ3VsYXJgfSxtb3NhaWM6e2ZhbXM6YGZhLXNvbGlkYH0sdmVsbHVtOntmYXZzOmBmYS1zb2xpZGB9LHdoaXRlYm9hcmQ6e2Zhd3NiOmBmYS1zZW1pYm9sZGB9LHRodW1icHJpbnQ6e2ZhdGw6YGZhLWxpZ2h0YH0sbm90ZG9nOntmYW5zOmBmYS1zb2xpZGB9LCJub3Rkb2ctZHVvIjp7ZmFuZHM6YGZhLXNvbGlkYH0sZXRjaDp7ZmFlczpgZmEtc29saWRgfSxncmFwaGl0ZTp7ZmFndDpgZmEtdGhpbmB9LGplbGx5OntmYWpyOmBmYS1yZWd1bGFyYH0sImplbGx5LWZpbGwiOntmYWpmcjpgZmEtcmVndWxhcmB9LCJqZWxseS1kdW8iOntmYWpkcjpgZmEtcmVndWxhcmB9LGNoaXNlbDp7ZmFjcjpgZmEtcmVndWxhcmB9LHV0aWxpdHk6e2ZhdXNiOmBmYS1zZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6e2ZhdWRzYjpgZmEtc2VtaWJvbGRgfSwidXRpbGl0eS1maWxsIjp7ZmF1ZnNiOmBmYS1zZW1pYm9sZGB9fSx2Zj1gZmEuZmFzLmZhci5mYWwuZmF0LmZhZC5mYWRyLmZhZGwuZmFkdC5mYWIuZmFzcy5mYXNyLmZhc2wuZmFzdC5mYXNkcy5mYXNkci5mYXNkbC5mYXNkdC5mYXNsci5mYXNscHIuZmFzbGRyLmZhc2xwZHIuZmFwci5mYW1zLmZhdnMuZmF3c2IuZmF0bC5mYW5zLmZhbmRzLmZhZXMuZmFndC5mYWpyLmZhamZyLmZhamRyLmZhY3IuZmF1c2IuZmF1ZHNiLmZhdWZzYmAuc3BsaXQoYC5gKS5jb25jYXQobWYsW2BmYS1zb2xpZGAsYGZhLXJlZ3VsYXJgLGBmYS1saWdodGAsYGZhLXRoaW5gLGBmYS1kdW90b25lYCxgZmEtYnJhbmRzYCxgZmEtc2VtaWJvbGRgXSkseWY9W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gLGBkdW90b25lYCxgYnJhbmRzYCxgc2VtaWJvbGRgXSxiZj1bMSwyLDMsNCw1LDYsNyw4LDksMTBdLHhmPWJmLmNvbmNhdChbMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdKSxTZj1bXS5jb25jYXQoRnUoT2JqZWN0LmtleXMoZ2YpKSx5ZixbYGF3YCxgZndgLGBwdWxsLWxlZnRgLGBwdWxsLXJpZ2h0YF0sW2AyeHNgLGB4c2AsYHNtYCxgbGdgLGB4bGAsYDJ4bGAsYGJlYXRgLGBiZWF0LWZhZGVgLGBib3JkZXJgLGBib3VuY2VgLGBidXp6YCxgY2FudmFzLXNxdWFyZWAsYGNhbnZhcy1yb29teWAsYGZhZGVgLGBmbGlwLTM2MGAsYGZsaXAtYm90aGAsYGZsaXAtaG9yaXpvbnRhbGAsYGZsaXAtdmVydGljYWxgLGBmbGlwYCxgZmxvYXRgLGBpbnZlcnNlYCxgamVsbG9gLGBsYXllcnNgLGBsYXllcnMtYm90dG9tLWxlZnRgLGBsYXllcnMtYm90dG9tLXJpZ2h0YCxgbGF5ZXJzLWNvdW50ZXJgLGBsYXllcnMtdGV4dGAsYGxheWVycy10b3AtbGVmdGAsYGxheWVycy10b3AtcmlnaHRgLGBsaWAsYHB1bGwtZW5kYCxgcHVsbC1zdGFydGAsYHB1bHNlYCxgcm90YXRlLTE4MGAsYHJvdGF0ZS0yNzBgLGByb3RhdGUtOTBgLGByb3RhdGUtYnlgLGBzaGFrZWAsYHNwaW4tcHVsc2VgLGBzcGluLXJldmVyc2VgLGBzcGluYCxgc3Bpbi1zbmFwYCxgc3Bpbi1zbmFwLTRgLGBzcGluLXNuYXAtOGAsYHN0YWNrLTF4YCxgc3RhY2stMnhgLGBzdGFja2AsYHN3aW5nYCxgdWxgLGB3YWdgLGB3aWR0aC1hdXRvYCxgd2lkdGgtZml4ZWRgLHBmLkdST1VQLHBmLlNXQVBfT1BBQ0lUWSxwZi5QUklNQVJZLHBmLlNFQ09OREFSWV0sYmYubWFwKGZ1bmN0aW9uKGUpe3JldHVybmAke2V9eGB9KSx4Zi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYHctJHtlfWB9KSksQ2Y9eyJGb250IEF3ZXNvbWUgNSBGcmVlIjp7OTAwOmBmYXNgLDQwMDpgZmFyYH0sIkZvbnQgQXdlc29tZSA1IFBybyI6ezkwMDpgZmFzYCw0MDA6YGZhcmAsbm9ybWFsOmBmYXJgLDMwMDpgZmFsYH0sIkZvbnQgQXdlc29tZSA1IEJyYW5kcyI6ezQwMDpgZmFiYCxub3JtYWw6YGZhYmB9LCJGb250IEF3ZXNvbWUgNSBEdW90b25lIjp7OTAwOmBmYWRgfX0sd2Y9YF9fX0ZPTlRfQVdFU09NRV9fX2AsVGY9MTYsRWY9YGZhYCxEZj1gc3ZnLWlubGluZS0tZmFgLE9mPWBkYXRhLWZhLWkyc3ZnYCxrZj1gZGF0YS1mYS1wc2V1ZG8tZWxlbWVudGAsQWY9YGRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZ2AsamY9YGRhdGEtcHJlZml4YCxNZj1gZGF0YS1pY29uYCxOZj1gZm9udGF3ZXNvbWUtaTJzdmdgLFBmPWBhc3luY2AsRmY9W2BIVE1MYCxgSEVBRGAsYFNUWUxFYCxgU0NSSVBUYF0sSWY9W2A6OmJlZm9yZWAsYDo6YWZ0ZXJgLGA6YmVmb3JlYCxgOmFmdGVyYF0sTGY9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuITB9Y2F0Y2h7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIFJmKGUpe3JldHVybiBuZXcgUHJveHkoZSx7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQgaW4gZT9lW3RdOmVbYWRdfX0pfXZhciB6Zj1xKHt9LG5kKTt6ZlthZF09cShxKHEocSh7fSx7ImZhLWR1b3RvbmUiOmBkdW90b25lYH0pLG5kW2FkXSksb2Yua2l0KSxvZltga2l0LWR1b3RvbmVgXSk7dmFyIEJmPVJmKHpmKSxWZj1xKHt9LHJmKTtWZlthZF09cShxKHEocSh7fSx7ZHVvdG9uZTpgZmFkYH0pLFZmW2FkXSksZGYua2l0KSxkZltga2l0LWR1b3RvbmVgXSk7dmFyIEhmPVJmKFZmKSxVZj1xKHt9LF9mKTtVZlthZF09cShxKHt9LFVmW2FkXSksdWYua2l0KTt2YXIgV2Y9UmYoVWYpLEdmPXEoe30saGYpO0dmW2FkXT1xKHEoe30sR2ZbYWRdKSxjZi5raXQpLFJmKEdmKTt2YXIgS2Y9ZWQscWY9YGZhLWxheWVycy10ZXh0YCxKZj10ZDtSZihxKHt9LGVmKSk7dmFyIFlmPVtgY2xhc3NgLGBkYXRhLXByZWZpeGAsYGRhdGEtaWNvbmAsYGRhdGEtZmEtdHJhbnNmb3JtYCxgZGF0YS1mYS1tYXNrYF0sWGY9cmQsWmY9W10uY29uY2F0KEZ1KHNmKSxGdShTZikpLFFmPXF1LkZvbnRBd2Vzb21lQ29uZmlnfHx7fTtmdW5jdGlvbiAkZihlKXt2YXIgdD1KdS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbYCtlK2BdYCk7aWYodClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24gZXAoZSl7cmV0dXJuIGU9PT1gYD8hMDplPT09YGZhbHNlYD8hMTplPT09YHRydWVgfHxlfUp1JiZ0eXBlb2YgSnUucXVlcnlTZWxlY3Rvcj09YGZ1bmN0aW9uYCYmW1tgZGF0YS1mYW1pbHktcHJlZml4YCxgZmFtaWx5UHJlZml4YF0sW2BkYXRhLWNzcy1wcmVmaXhgLGBjc3NQcmVmaXhgXSxbYGRhdGEtZmFtaWx5LWRlZmF1bHRgLGBmYW1pbHlEZWZhdWx0YF0sW2BkYXRhLXN0eWxlLWRlZmF1bHRgLGBzdHlsZURlZmF1bHRgXSxbYGRhdGEtcmVwbGFjZW1lbnQtY2xhc3NgLGByZXBsYWNlbWVudENsYXNzYF0sW2BkYXRhLWF1dG8tcmVwbGFjZS1zdmdgLGBhdXRvUmVwbGFjZVN2Z2BdLFtgZGF0YS1hdXRvLWFkZC1jc3NgLGBhdXRvQWRkQ3NzYF0sW2BkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHNgLGBzZWFyY2hQc2V1ZG9FbGVtZW50c2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLXdhcm5pbmdzYCxgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5nc2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLWZ1bGwtc2NhbmAsYHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW5gXSxbYGRhdGEtb2JzZXJ2ZS1tdXRhdGlvbnNgLGBvYnNlcnZlTXV0YXRpb25zYF0sW2BkYXRhLW11dGF0ZS1hcHByb2FjaGAsYG11dGF0ZUFwcHJvYWNoYF0sW2BkYXRhLWtlZXAtb3JpZ2luYWwtc291cmNlYCxga2VlcE9yaWdpbmFsU291cmNlYF0sW2BkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2VgLGBtZWFzdXJlUGVyZm9ybWFuY2VgXSxbYGRhdGEtc2hvdy1taXNzaW5nLWljb25zYCxgc2hvd01pc3NpbmdJY29uc2BdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PVB1KGUsMiksbj10WzBdLHI9dFsxXSxpPWVwKCRmKG4pKTtpIT1udWxsJiYoUWZbcl09aSl9KTt2YXIgdHA9e3N0eWxlRGVmYXVsdDpgc29saWRgLGZhbWlseURlZmF1bHQ6YWQsY3NzUHJlZml4OkVmLHJlcGxhY2VtZW50Q2xhc3M6RGYsYXV0b1JlcGxhY2VTdmc6ITAsYXV0b0FkZENzczohMCxzZWFyY2hQc2V1ZG9FbGVtZW50czohMSxzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzOiEwLHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW46ITEsb2JzZXJ2ZU11dGF0aW9uczohMCxtdXRhdGVBcHByb2FjaDpgYXN5bmNgLGtlZXBPcmlnaW5hbFNvdXJjZTohMCxtZWFzdXJlUGVyZm9ybWFuY2U6ITEsc2hvd01pc3NpbmdJY29uczohMH07UWYuZmFtaWx5UHJlZml4JiYoUWYuY3NzUHJlZml4PVFmLmZhbWlseVByZWZpeCk7dmFyIG5wPXEocSh7fSx0cCksUWYpO25wLmF1dG9SZXBsYWNlU3ZnfHwobnAub2JzZXJ2ZU11dGF0aW9ucz0hMSk7dmFyIEo9e307T2JqZWN0LmtleXModHApLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEosZSx7ZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24odCl7bnBbZV09dCxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucFtlXX19KX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKLCJmYW1pbHlQcmVmaXgiLHtlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihlKXtucC5jc3NQcmVmaXg9ZSxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucC5jc3NQcmVmaXh9fSkscXUuRm9udEF3ZXNvbWVDb25maWc9Sjt2YXIgcnA9W107ZnVuY3Rpb24gaXAoZSl7cmV0dXJuIHJwLnB1c2goZSksZnVuY3Rpb24oKXtycC5zcGxpY2UocnAuaW5kZXhPZihlKSwxKX19dmFyIGFwPVRmLG9wPXtzaXplOjE2LHg6MCx5OjAscm90YXRlOjAsZmxpcFg6ITEsZmxpcFk6ITF9O2Z1bmN0aW9uIHNwKGUpe2lmKCEoIWV8fCFadSkpe3ZhciB0PUp1LmNyZWF0ZUVsZW1lbnQoYHN0eWxlYCk7dC5zZXRBdHRyaWJ1dGUoYHR5cGVgLGB0ZXh0L2Nzc2ApLHQuaW5uZXJIVE1MPWU7Zm9yKHZhciBuPUp1LmhlYWQuY2hpbGROb2RlcyxyPW51bGwsaT1uLmxlbmd0aC0xO2k+LTE7aS0tKXt2YXIgYT1uW2ldLG89KGEudGFnTmFtZXx8YGApLnRvVXBwZXJDYXNlKCk7W2BTVFlMRWAsYExJTktgXS5pbmRleE9mKG8pPi0xJiYocj1hKX1yZXR1cm4gSnUuaGVhZC5pbnNlcnRCZWZvcmUodCxyKSxlfX12YXIgY3A9YDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYDtmdW5jdGlvbiBscCgpe2Zvcih2YXIgZT0xMix0PWBgO2UtLT4wOyl0Kz1jcFtNYXRoLnJhbmRvbSgpKjYyfDBdO3JldHVybiB0fWZ1bmN0aW9uIHVwKGUpe2Zvcih2YXIgdD1bXSxuPShlfHxbXSkubGVuZ3RoPj4+MDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBkcChlKXtyZXR1cm4gZS5jbGFzc0xpc3Q/dXAoZS5jbGFzc0xpc3QpOihlLmdldEF0dHJpYnV0ZShgY2xhc3NgKXx8YGApLnNwbGl0KGAgYCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9ZnVuY3Rpb24gZnAoZSl7cmV0dXJuYCR7ZX1gLnJlcGxhY2UoLyYvZyxgJmFtcDtgKS5yZXBsYWNlKC8iL2csYCZxdW90O2ApLnJlcGxhY2UoLycvZyxgJiMzOTtgKS5yZXBsYWNlKC88L2csYCZsdDtgKS5yZXBsYWNlKC8+L2csYCZndDtgKX1mdW5jdGlvbiBwcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259PSIke2ZwKGVbbl0pfSIgYH0sYGApLnRyaW0oKX1mdW5jdGlvbiBtcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259OiAke2Vbbl0udHJpbSgpfTtgfSxgYCl9ZnVuY3Rpb24gaHAoZSl7cmV0dXJuIGUuc2l6ZSE9PW9wLnNpemV8fGUueCE9PW9wLnh8fGUueSE9PW9wLnl8fGUucm90YXRlIT09b3Aucm90YXRlfHxlLmZsaXBYfHxlLmZsaXBZfWZ1bmN0aW9uIGdwKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS5jb250YWluZXJXaWR0aCxyPWUuaWNvbldpZHRoO3JldHVybntvdXRlcjp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtuLzJ9IDI1NilgfSxpbm5lcjp7dHJhbnNmb3JtOmAke2B0cmFuc2xhdGUoJHt0LngqMzJ9LCAke3QueSozMn0pIGB9ICR7YHNjYWxlKCR7dC5zaXplLzE2Kih0LmZsaXBYPy0xOjEpfSwgJHt0LnNpemUvMTYqKHQuZmxpcFk/LTE6MSl9KSBgfSAke2Byb3RhdGUoJHt0LnJvdGF0ZX0gMCAwKWB9YH0scGF0aDp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtyLzIqLTF9IC0yNTYpYH19fWZ1bmN0aW9uIF9wKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS53aWR0aCxyPW49PT12b2lkIDA/VGY6bixpPWUuaGVpZ2h0LGE9aT09PXZvaWQgMD9UZjppLG89ZS5zdGFydENlbnRlcmVkLHM9byE9PXZvaWQgMCYmbyxjPWBgO3JldHVybiBjKz1zJiZRdT9gdHJhbnNsYXRlKCR7dC54L2FwLXIvMn1lbSwgJHt0LnkvYXAtYS8yfWVtKSBgOnM/YHRyYW5zbGF0ZShjYWxjKC01MCUgKyAke3QueC9hcH1lbSksIGNhbGMoLTUwJSArICR7dC55L2FwfWVtKSkgYDpgdHJhbnNsYXRlKCR7dC54L2FwfWVtLCAke3QueS9hcH1lbSkgYCxjKz1gc2NhbGUoJHt0LnNpemUvYXAqKHQuZmxpcFg/LTE6MSl9LCAke3Quc2l6ZS9hcCoodC5mbGlwWT8tMToxKX0pIGAsYys9YHJvdGF0ZSgke3Qucm90YXRlfWRlZykgYCxjfXZhciB2cD1gOnJvb3QsIDpob3N0IHsKICAtLWZhLWZvbnQtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEZyZWUnOwogIC0tZmEtZm9udC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBGcmVlJzsKICAtLWZhLWZvbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LWR1b3RvbmU6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtZHVvdG9uZS10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBCcmFuZHMnOwogIC0tZmEtZm9udC1zaGFycC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAnOwogIC0tZmEtZm9udC1zaGFycC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJzsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zbGFiLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWInOwogIC0tZmEtZm9udC1zbGFiLXByZXNzLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MnOwogIC0tZmEtZm9udC1zbGFiLWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTbGFiIER1byc7CiAgLS1mYS1mb250LXNsYWItcHJlc3MtZHVvLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MgRHVvJzsKICAtLWZhLWZvbnQtcGl4ZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgUGl4ZWwnOwogIC0tZmEtZm9udC1tb3NhaWMtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE1vc2FpYyc7CiAgLS1mYS1mb250LXZlbGx1bS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVmVsbHVtJzsKICAtLWZhLWZvbnQtd2hpdGVib2FyZC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgV2hpdGVib2FyZCc7CiAgLS1mYS1mb250LXRodW1icHJpbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQnOwogIC0tZmEtZm9udC1ub3Rkb2ctc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyc7CiAgLS1mYS1mb250LW5vdGRvZy1kdW8tc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyBEdW8nOwogIC0tZmEtZm9udC1ldGNoLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBFdGNoJzsKICAtLWZhLWZvbnQtZ3JhcGhpdGUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUnOwogIC0tZmEtZm9udC1qZWxseS1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSc7CiAgLS1mYS1mb250LWplbGx5LWZpbGwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgSmVsbHkgRmlsbCc7CiAgLS1mYS1mb250LWplbGx5LWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8nOwogIC0tZmEtZm9udC1jaGlzZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgQ2hpc2VsJzsKICAtLWZhLWZvbnQtdXRpbGl0eS1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSc7CiAgLS1mYS1mb250LXV0aWxpdHktZHVvLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byc7CiAgLS1mYS1mb250LXV0aWxpdHktZmlsbC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBGaWxsJzsKfQoKLnN2Zy1pbmxpbmUtLWZhIHsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBkaXNwbGF5OiB2YXIoLS1mYS1kaXNwbGF5LCBpbmxpbmUtYmxvY2spOwogIGhlaWdodDogMWVtOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgsIDEuMjVlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4cyB7CiAgdmVydGljYWwtYWxpZ246IDAuMWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14cyB7CiAgdmVydGljYWwtYWxpZ246IDBlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtc20gewogIHZlcnRpY2FsLWFsaWduOiAtMC4wNzE0Mjg1NzE0ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMmVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjMxMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1sZWZ0LAouc3ZnLWlubGluZS0tZmEgLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXB1bGwtcmlnaHQsCi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxpIHsKICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIGluc2V0LWJsb2NrLXN0YXJ0OiAwLjI1ZW07IC8qIHN5bmNpbmcgdmVydGljYWwgYWxpZ25tZW50IHdpdGggV2ViIEZvbnQgcmVuZGVyaW5nICovCn0KCi5mYS1sYXllcnMtY291bnRlciwgLmZhLWxheWVycy10ZXh0IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZhLWxheWVycyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMWVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCwgMS4yNWVtKTsKfQouZmEtbGF5ZXJzIC5zdmctaW5saW5lLS1mYSB7CiAgaW5zZXQ6IDA7CiAgbWFyZ2luOiBhdXRvOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLXRleHQgewogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLWNvdW50ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhLWNvdW50ZXItYmFja2dyb3VuZC1jb2xvciwgI2ZmMjUzYSk7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZmEtY291bnRlci1ib3JkZXItcmFkaXVzLCAxZW0pOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS1mYS1jb3VudGVyLWxpbmUtaGVpZ2h0LCAxKTsKICBtYXgtd2lkdGg6IHZhcigtLWZhLWNvdW50ZXItbWF4LXdpZHRoLCA1ZW0pOwogIG1pbi13aWR0aDogdmFyKC0tZmEtY291bnRlci1taW4td2lkdGgsIDEuNWVtKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IHZhcigtLWZhLWNvdW50ZXItcGFkZGluZywgMC4yNWVtIDAuNWVtKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWNvdW50ZXItc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLXJpZ2h0IHsKICBib3R0b206IHZhcigtLWZhLWJvdHRvbSwgMCk7CiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLWxlZnQgewogIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDsKfQoKLmZhLWxheWVycy10b3AtcmlnaHQgewogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtbGF5ZXJzLXNjYWxlLCAwLjI1KSk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0Owp9CgouZmEtbGF5ZXJzLXRvcC1sZWZ0IHsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLmZhLTF4IHsKICBmb250LXNpemU6IDFlbTsKfQoKLmZhLTJ4IHsKICBmb250LXNpemU6IDJlbTsKfQoKLmZhLTN4IHsKICBmb250LXNpemU6IDNlbTsKfQoKLmZhLTR4IHsKICBmb250LXNpemU6IDRlbTsKfQoKLmZhLTV4IHsKICBmb250LXNpemU6IDVlbTsKfQoKLmZhLTZ4IHsKICBmb250LXNpemU6IDZlbTsKfQoKLmZhLTd4IHsKICBmb250LXNpemU6IDdlbTsKfQoKLmZhLTh4IHsKICBmb250LXNpemU6IDhlbTsKfQoKLmZhLTl4IHsKICBmb250LXNpemU6IDllbTsKfQoKLmZhLTEweCB7CiAgZm9udC1zaXplOiAxMGVtOwp9CgouZmEtMnhzIHsKICBmb250LXNpemU6IGNhbGMoMTAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteHMgewogIGZvbnQtc2l6ZTogY2FsYygxMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS1zbSB7CiAgZm9udC1zaXplOiBjYWxjKDE0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDE0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDE0IC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLWxnIHsKICBmb250LXNpemU6IGNhbGMoMjAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMjBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAyMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMjAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteGwgewogIGZvbnQtc2l6ZTogY2FsYygyNCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyNHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDI0ICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAyNCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS0yeGwgewogIGZvbnQtc2l6ZTogY2FsYygzMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAzMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDMyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAzMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS13aWR0aC1hdXRvIHsKICAtLWZhLXdpZHRoOiBhdXRvOwp9CgouZmEtZncsCi5mYS13aWR0aC1maXhlZCB7CiAgLS1mYS13aWR0aDogMS4yNWVtOwp9CgouZmEtY2FudmFzLXNxdWFyZSB7CiAgcGFkZGluZy1ibG9jazogMC4xMjVlbTsKICBtYXJnaW4tYmxvY2stZW5kOiAtMC4xMjVlbTsKfQoKLmZhLWNhbnZhcy1yb29teSB7CiAgcGFkZGluZy1ibG9jazogMC4yNWVtOwogIHBhZGRpbmctaW5saW5lOiAwLjEyNWVtOwogIG1hcmdpbi1ibG9jay1lbmQ6IC0wLjI1ZW07CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi5mYS11bCB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLWxpLW1hcmdpbiwgMi41ZW0pOwogIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0Owp9CgovKiBIZWFkcyBVcDogQm9yZGVyZWQgSWNvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUhCiAgLSBUaGlzIGZlYXR1cmUgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgRm9udCBBd2Vzb21lICh2OCkhCiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguCiovCi8qIE5vdGVzOgoqIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSkKKiAtLUB7di4kY3NzLXByZWZpeH0tYm9yZGVyLXBhZGRpbmcgPQogICoqIDMvMTYgZm9yIHZlcnRpY2FsIHBhZGRpbmcgKHRvIGdpdmUgfjJweCBvZiB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFyb3VuZCBhbiBpY29uIGNvbnNpZGVyaW5nIGl0J3MgdmVydGljYWwgYWxpZ25tZW50KQogICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbikKKi8KLmZhLWJvcmRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWJvcmRlci1yYWRpdXMsIDAuMWVtKTsKICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpOwogIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7CiAgYm94LXNpemluZzogdmFyKC0tZmEtYm9yZGVyLWJveC1zaXppbmcsIGNvbnRlbnQtYm94KTsKICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4xODc1ZW0gMC4yNWVtKTsKfQoKLmZhLXB1bGwtbGVmdCwKLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1wdWxsLXJpZ2h0LAouZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1iZWF0IHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtYm91bmNlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC4yOCwgMC44NCwgMC40MiwgMSkpOwp9CgouZmEtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKfQoKLmZhLWJlYXQtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZsaXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxLjVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcC0zNjAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwLTM2MDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc2hha2UgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zaGFrZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuNzVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc3BpbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXJldmVyc2UgewogIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsKfQoKLmZhLXB1bHNlLAouZmEtc3Bpbi1wdWxzZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7Cn0KCi5mYS1zcGluLXNuYXAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zcGluLXNuYXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtNCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC00OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMi40cyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtOCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC04OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgNHMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpOwp9CgouZmEtYnV6eiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJ1eno7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjZzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgbGluZWFyKTsKfQoKLmZhLXdhZyB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXdhZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuOXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIGNlbnRlcjsKfQoKLmZhLWZsb2F0IHsKICBhbmltYXRpb24tbmFtZTogZmEtZmxvYXQ7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwp9CgouZmEtc3dpbmcgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zd2luZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDEuMnMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGNlbnRlcjsKfQoKLmZhLWplbGxvIHsKICBhbmltYXRpb24tbmFtZTogZmEtamVsbG87CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjlzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1vdXQpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogIC5mYS1iZWF0LAogIC5mYS1ib3VuY2UsCiAgLmZhLWZhZGUsCiAgLmZhLWJlYXQtZmFkZSwKICAuZmEtZmxpcCwKICAuZmEtZmxpcC0zNjAsCiAgLmZhLXB1bHNlLAogIC5mYS1zaGFrZSwKICAuZmEtc3BpbiwKICAuZmEtc3Bpbi1wdWxzZSwKICAuZmEtYnV6eiwKICAuZmEtZmxvYXQsCiAgLmZhLWplbGxvLAogIC5mYS1zcGluLXNuYXAsCiAgLmZhLXNwaW4tc25hcC00LAogIC5mYS1zcGluLXNuYXAtOCwKICAuZmEtc3dpbmcsCiAgLmZhLXdhZyB7CiAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9Cn0KQGtleWZyYW1lcyBmYS1iZWF0IHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA0NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjIgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjIyKSkpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA5MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1ib3VuY2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcpOwogIH0KICAxNCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteCwgMS4wNiksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjk0KSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtYW50aWNpcGF0aW9uLCAzcHgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45NCksIHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXksIDEuMTIpKSB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAwLjVlbSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLjY2LCAwLjY2LCAxKTsKICB9CiAgNTIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0tZmEtYm91bmNlLWhlaWdodCwgMC41ZW0pICogMS4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAxLCAwLjUpOwogIH0KICA3MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA2KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45MikpIHRyYW5zbGF0ZVkoMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC4zMywgMC42NiwgMSk7CiAgfQogIDg1JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgsIDEuMDQpIHRyYW5zbGF0ZVkoY2FsYygtMnB4ICogdmFyKC0tZmEtYm91bmNlLXJlYm91bmQsIDEpKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZhZGUgewogIDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgNDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWZhZGUtb3BhY2l0eSwgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7CiAgMCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgMjUlIHsKICAgIG9wYWNpdHk6IGNhbGModmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCkgKyAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7CiAgfQogIDQ1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjUpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICBvcGFjaXR5OiBjYWxjKHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpICsgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjI4KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbGlwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIDAuNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICA5MiUgewogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyZW0pIHNjYWxlKDEpIHJvdGF0ZTNkKHZhcigtLWZhLWZsaXAteCwgMCksIHZhcigtLWZhLWZsaXAteSwgMSksIHZhcigtLWZhLWZsaXAteiwgMCksIGNhbGModmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykgKiB2YXIoLS1mYS1mbGlwLW92ZXJzaG9vdCwgMS4wNCkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZsaXAtMzYwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDgwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIHZhcigtLWZhLWZsaXAtb3ZlcnNob290LCAxLjA0KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc2hha2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDIwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpIHRyYW5zbGF0ZVgoLTFweCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA3OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoLTNkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgOTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLXNwaW4tc25hcCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxNi42NyUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDI4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDMzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDYyJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDY2LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDc4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDgzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDk1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtNCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtOCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEyLjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAyMS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAzNCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAzNy41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ2LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgNTklIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNjIuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICA3MS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDg0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMTVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDg3LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDMxNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOTYuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYnV6eiB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjEsIDAsIDAuOSwgMSk7CiAgfQogIDUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC41ZGVnKTsKICB9CiAgMTAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC41ZGVnKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC4zZGVnKTsKICB9CiAgMjAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC4zZGVnKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjcpKSByb3RhdGUoMC4yZGVnKTsKICB9CiAgMzAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSAqIDAuNykpIHJvdGF0ZSgtMC4yZGVnKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjQpKSByb3RhdGUoMC4xZGVnKTsKICB9CiAgNDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS13YWcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIsIDAsIDAuNiwgMSk7CiAgfQogIDM2JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZShjYWxjKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpICogMC44NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGModmFyKC0tZmEtd2FnLWFuZ2xlLCAxMmRlZykgKiAwLjYpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY4JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbG9hdCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHRyYW5zbGF0ZVgoMCkgcm90YXRlKDBkZWcpIHNjYWxlKHZhcigtLWZhLWZsb2F0LXNxdWFzaC14LCAxLjAyKSwgdmFyKC0tZmEtZmxvYXQtc3F1YXNoLXksIDAuOTgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0wLjQgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKHZhcigtLWZhLWZsb2F0LWRyaWZ0LCAxcHgpKSByb3RhdGUodmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpIHNjYWxlKDEsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXgsIDAuOTgpLCB2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXksIDEuMDMpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMCk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC45MiAqIHZhcigtLWZhLWZsb2F0LWhlaWdodCwgNnB4KSkpIHRyYW5zbGF0ZVgoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpKSBzY2FsZSgwLjk5NSwgMS4wMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMC4zMyk7CiAgfQogIDcwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC4zICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLWZsb2F0LXRpbHQsIDFkZWcpKSkgc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygwLjA1ICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZykgc2NhbGUodmFyKC0tZmEtZmxvYXQtc3F1YXNoLXgsIDEuMDIpLCB2YXIoLS1mYS1mbG9hdC1zcXVhc2gteSwgMC45OCkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zcXVhc2gteCwgMS4wMiksIHZhcigtLWZhLWZsb2F0LXNxdWFzaC15LCAwLjk4KSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc3dpbmcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tZmEtc3dpbmctYW5nbGUsIDIyZGVnKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAxOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjg1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAyOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC42NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuNjUsIDEpOwogIH0KICAzOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjQ1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA0OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4yNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTYlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGMoLTEgKiB2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtamVsbG8gewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjgsIDEpOwogIH0KICAxMiUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSwgY2FsYygyIC0gdmFyKC0tZmEtamVsbG8tc2NhbGUteCwgMS4xNSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKGNhbGMoMiAtIHZhcigtLWZhLWplbGxvLXNjYWxlLXksIDEuMTIpKSwgdmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMywgMCwgMC43LCAxKTsKICB9CiAgMzYlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygxICsgKHZhcigtLWZhLWplbGxvLXNjYWxlLXgsIDEuMTUpIC0gMSkgKiAwLjUpLCBjYWxjKDIgLSAoMSArICh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSAtIDEpICogMC41KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygyIC0gKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpLCBjYWxjKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMiwgMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogIH0KICA2OCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpOwogIH0KfQouZmEtcm90YXRlLTkwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KCi5mYS1yb3RhdGUtMTgwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwp9CgouZmEtcm90YXRlLTI3MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKfQoKLmZhLWZsaXAtaG9yaXpvbnRhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7Cn0KCi5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTsKfQoKLmZhLWZsaXAtYm90aCwKLmZhLWZsaXAtaG9yaXpvbnRhbC5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAtMSk7Cn0KCi5mYS1yb3RhdGUtYnkgewogIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgMCkpOwp9Cgouc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkgewogIGZpbGw6IHZhcigtLWZhLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTsKICBvcGFjaXR5OiB2YXIoLS1mYS1zZWNvbmRhcnktb3BhY2l0eSwgMC40KTsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLXN3YXAtb3BhY2l0eSAuZmEtcHJpbWFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXNlY29uZGFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksCi5zdmctaW5saW5lLS1mYSBtYXNrIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IGJsYWNrOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtaW52ZXJzZSB7CiAgZmlsbDogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7Cn0KCi5mYS1zdGFjayB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMmVtOwogIGxpbmUtaGVpZ2h0OiAyZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDIuNWVtOwp9CgouZmEtaW52ZXJzZSB7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXggewogIC0tZmEtd2lkdGg6IDEuMjVlbTsKICBoZWlnaHQ6IDFlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgpOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1zdGFjay0yeCB7CiAgLS1mYS13aWR0aDogMi41ZW07CiAgaGVpZ2h0OiAyZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTsKfQoKLmZhLXN0YWNrLTF4LAouZmEtc3RhY2stMnggewogIGluc2V0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogdmFyKC0tZmEtc3RhY2stei1pbmRleCwgYXV0byk7Cn1gO2Z1bmN0aW9uIHlwKCl7dmFyIGU9RWYsdD1EZixuPUouY3NzUHJlZml4LHI9Si5yZXBsYWNlbWVudENsYXNzLGk9dnA7aWYobiE9PWV8fHIhPT10KXt2YXIgYT1SZWdFeHAoYFxcLiR7ZX1cXC1gLGBnYCksbz1SZWdFeHAoYFxcLS0ke2V9XFwtYCxgZ2ApLHM9UmVnRXhwKGBcXC4ke3R9YCxgZ2ApO2k9aS5yZXBsYWNlKGEsYC4ke259LWApLnJlcGxhY2UobyxgLS0ke259LWApLnJlcGxhY2UocyxgLiR7cn1gKX1yZXR1cm4gaX12YXIgYnA9ITE7ZnVuY3Rpb24geHAoKXtKLmF1dG9BZGRDc3MmJiFicCYmKHNwKHlwKCkpLGJwPSEwKX12YXIgU3A9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e2Nzczp5cCxpbnNlcnRDc3M6eHB9fX0saG9va3M6ZnVuY3Rpb24oKXtyZXR1cm57YmVmb3JlRE9NRWxlbWVudENyZWF0aW9uOmZ1bmN0aW9uKCl7eHAoKX0sYmVmb3JlSTJzdmc6ZnVuY3Rpb24oKXt4cCgpfX19fSxDcD1xdXx8e307Q3Bbd2ZdfHwoQ3Bbd2ZdPXt9KSxDcFt3Zl0uc3R5bGVzfHwoQ3Bbd2ZdLnN0eWxlcz17fSksQ3Bbd2ZdLmhvb2tzfHwoQ3Bbd2ZdLmhvb2tzPXt9KSxDcFt3Zl0uc2hpbXN8fChDcFt3Zl0uc2hpbXM9W10pO3ZhciB3cD1DcFt3Zl0sVHA9W10sRXA9ZnVuY3Rpb24oKXtKdS5yZW1vdmVFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCxFcCksRHA9MSxUcC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pfSxEcD0hMTtadSYmKERwPShKdS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/L15sb2FkZWR8XmMvOi9ebG9hZGVkfF5pfF5jLykudGVzdChKdS5yZWFkeVN0YXRlKSxEcHx8SnUuYWRkRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsRXApKTtmdW5jdGlvbiBPcChlKXtadSYmKERwP3NldFRpbWVvdXQoZSwwKTpUcC5wdXNoKGUpKX1mdW5jdGlvbiBrcChlKXt2YXIgdD1lLnRhZyxuPWUuYXR0cmlidXRlcyxyPW49PT12b2lkIDA/e306bixpPWUuY2hpbGRyZW4sYT1pPT09dm9pZCAwP1tdOmk7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9mcChlKTpgPCR7dH0gJHtwcChyKX0+JHthLm1hcChrcCkuam9pbihgYCl9PC8ke3R9PmB9ZnVuY3Rpb24gQXAoZSx0LG4pe2lmKGUmJmVbdF0mJmVbdF1bbl0pcmV0dXJue3ByZWZpeDp0LGljb25OYW1lOm4saWNvbjplW3RdW25dfX12YXIganA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyLGksYSl7cmV0dXJuIGUuY2FsbCh0LG4scixpLGEpfX0sTXA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmtleXMoZSksYT1pLmxlbmd0aCxvPXI9PT12b2lkIDA/dDpqcCh0LHIpLHMsYyxsO2ZvcihuPT09dm9pZCAwPyhzPTEsbD1lW2lbMF1dKToocz0wLGw9bik7czxhO3MrKyljPWlbc10sbD1vKGwsZVtjXSxjLGUpO3JldHVybiBsfTtmdW5jdGlvbiBOcChlKXtyZXR1cm4gRnUoZSkubGVuZ3RoPT09MT9lLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KTpudWxsfWZ1bmN0aW9uIFBwKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXt2YXIgcj1lW25dO3JldHVybiByLmljb24/dFtyLmljb25OYW1lXT1yLmljb246dFtuXT1yLHR9LHt9KX1mdW5jdGlvbiBGcChlLHQpe3ZhciBuPShhcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30pLnNraXBIb29rcyxyPW4hPT12b2lkIDAmJm4saT1QcCh0KTt0eXBlb2Ygd3AuaG9va3MuYWRkUGFjaz09YGZ1bmN0aW9uYCYmIXI/d3AuaG9va3MuYWRkUGFjayhlLFBwKHQpKTp3cC5zdHlsZXNbZV09cShxKHt9LHdwLnN0eWxlc1tlXXx8e30pLGkpLGU9PT1gZmFzYCYmRnAoYGZhYCx0KX12YXIgSXA9d3Auc3R5bGVzLExwPXdwLnNoaW1zLFJwPU9iamVjdC5rZXlzKFdmKSx6cD1ScC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT1PYmplY3Qua2V5cyhXZlt0XSksZX0se30pLEJwPW51bGwsVnA9e30sSHA9e30sVXA9e30sV3A9e30sR3A9e307ZnVuY3Rpb24gS3AoZSl7cmV0dXJuflpmLmluZGV4T2YoZSl9ZnVuY3Rpb24gcXAoZSx0KXt2YXIgbj10LnNwbGl0KGAtYCkscj1uWzBdLGk9bi5zbGljZSgxKS5qb2luKGAtYCk7cmV0dXJuIHI9PT1lJiZpIT09YGAmJiFLcChpKT9pOm51bGx9dmFyIEpwPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE1wKElwLGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtyXT1NcChuLGUse30pLHR9LHt9KX07VnA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRbM10mJihlW3RbM11dPW4pLHRbMl0mJnRbMl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmB9KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdC50b1N0cmluZygxNildPW59KSxlfSksSHA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbbl09bix0WzJdJiZ0WzJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSksR3A9ZShmdW5jdGlvbihlLHQsbil7dmFyIHI9dFsyXTtyZXR1cm4gZVtuXT1uLHIuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSk7dmFyIHQ9YGZhcmBpbiBJcHx8Si5hdXRvRmV0Y2hTdmcsbj1NcChMcCxmdW5jdGlvbihlLG4pe3ZhciByPW5bMF0saT1uWzFdLGE9blsyXTtyZXR1cm4gaT09PWBmYXJgJiYhdCYmKGk9YGZhc2ApLHR5cGVvZiByPT1gc3RyaW5nYCYmKGUubmFtZXNbcl09e3ByZWZpeDppLGljb25OYW1lOmF9KSx0eXBlb2Ygcj09YG51bWJlcmAmJihlLnVuaWNvZGVzW3IudG9TdHJpbmcoMTYpXT17cHJlZml4OmksaWNvbk5hbWU6YX0pLGV9LHtuYW1lczp7fSx1bmljb2Rlczp7fX0pO1VwPW4ubmFtZXMsV3A9bi51bmljb2RlcyxCcD1ybShKLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfTtpcChmdW5jdGlvbihlKXtCcD1ybShlLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfSksSnAoKTtmdW5jdGlvbiBZcChlLHQpe3JldHVybihWcFtlXXx8e30pW3RdfWZ1bmN0aW9uIFhwKGUsdCl7cmV0dXJuKEhwW2VdfHx7fSlbdF19ZnVuY3Rpb24gWnAoZSx0KXtyZXR1cm4oR3BbZV18fHt9KVt0XX1mdW5jdGlvbiBRcChlKXtyZXR1cm4gVXBbZV18fHtwcmVmaXg6bnVsbCxpY29uTmFtZTpudWxsfX1mdW5jdGlvbiAkcChlKXt2YXIgdD1XcFtlXSxuPVlwKGBmYXNgLGUpO3JldHVybiB0fHwobj97cHJlZml4OmBmYXNgLGljb25OYW1lOm59Om51bGwpfHx7cHJlZml4Om51bGwsaWNvbk5hbWU6bnVsbH19ZnVuY3Rpb24gZW0oKXtyZXR1cm4gQnB9dmFyIHRtPWZ1bmN0aW9uKCl7cmV0dXJue3ByZWZpeDpudWxsLGljb25OYW1lOm51bGwscmVzdDpbXX19O2Z1bmN0aW9uIG5tKGUpe3ZhciB0PWFkLG49UnAucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09YCR7Si5jc3NQcmVmaXh9LSR7dH1gLGV9LHt9KTtyZXR1cm4gJGQuZm9yRWFjaChmdW5jdGlvbihyKXsoZS5pbmNsdWRlcyhuW3JdKXx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB6cFtyXS5pbmNsdWRlcyhlKX0pKSYmKHQ9cil9KSx0fWZ1bmN0aW9uIHJtKGUpe3ZhciB0PShhcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30pLmZhbWlseSxuPXQ9PT12b2lkIDA/YWQ6dCxyPUJmW25dW2VdO2lmKG49PT1vZCYmIWUpcmV0dXJuYGZhZGA7dmFyIGk9SGZbbl1bZV18fEhmW25dW3JdLGE9ZSBpbiB3cC5zdHlsZXM/ZTpudWxsO3JldHVybiBpfHxhfHxudWxsfWZ1bmN0aW9uIGltKGUpe3ZhciB0PVtdLG49bnVsbDtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPXFwKEouY3NzUHJlZml4LGUpO3I/bj1yOmUmJnQucHVzaChlKX0pLHtpY29uTmFtZTpuLHJlc3Q6dH19ZnVuY3Rpb24gYW0oZSl7cmV0dXJuIGUuc29ydCgpLmZpbHRlcihmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4uaW5kZXhPZihlKT09PXR9KX12YXIgb209dmYuY29uY2F0KGFmKTtmdW5jdGlvbiBzbShlKXt2YXIgdD0oYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9KS5za2lwTG9va3VwcyxuPXQhPT12b2lkIDAmJnQscj1udWxsLGk9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG9tLmluY2x1ZGVzKGUpfSkpLGE9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW9tLmluY2x1ZGVzKGUpfSkpLG89UHUoaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSwhaWQuaW5jbHVkZXMoZSl9KSwxKVswXSxzPW89PT12b2lkIDA/bnVsbDpvLGM9bm0oaSksbD1xKHEoe30saW0oYSkpLHt9LHtwcmVmaXg6cm0ocyx7ZmFtaWx5OmN9KX0pO3JldHVybiBxKHEocSh7fSxsKSxkbSh7dmFsdWVzOmUsZmFtaWx5OmMsc3R5bGVzOklwLGNvbmZpZzpKLGNhbm9uaWNhbDpsLGdpdmVuUHJlZml4OnJ9KSksY20obixyLGwpKX1mdW5jdGlvbiBjbShlLHQsbil7dmFyIHI9bi5wcmVmaXgsaT1uLmljb25OYW1lO2lmKGV8fCFyfHwhaSlyZXR1cm57cHJlZml4OnIsaWNvbk5hbWU6aX07dmFyIGE9dD09PWBmYWA/UXAoaSk6e30sbz1acChyLGkpO3JldHVybiBpPWEuaWNvbk5hbWV8fG98fGkscj1hLnByZWZpeHx8cixyPT09YGZhcmAmJiFJcC5mYXImJklwLmZhcyYmIUouYXV0b0ZldGNoU3ZnJiYocj1gZmFzYCkse3ByZWZpeDpyLGljb25OYW1lOml9fXZhciBsbT0kZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1hZHx8ZSE9PW9kfSksdW09T2JqZWN0LmtleXMoX2YpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWFkfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhfZltlXSl9KS5mbGF0KCk7ZnVuY3Rpb24gZG0oZSl7dmFyIHQ9ZS52YWx1ZXMsbj1lLmZhbWlseSxyPWUuY2Fub25pY2FsLGk9ZS5naXZlblByZWZpeCxhPWk9PT12b2lkIDA/YGA6aSxvPWUuc3R5bGVzLHM9bz09PXZvaWQgMD97fTpvLGM9ZS5jb25maWcsbD1jPT09dm9pZCAwP3t9OmMsdT1uPT09b2QsZD10LmluY2x1ZGVzKGBmYS1kdW90b25lYCl8fHQuaW5jbHVkZXMoYGZhZGApLGY9bC5mYW1pbHlEZWZhdWx0PT09YGR1b3RvbmVgLHA9ci5wcmVmaXg9PT1gZmFkYHx8ci5wcmVmaXg9PT1gZmEtZHVvdG9uZWA7cmV0dXJuIXUmJihkfHxmfHxwKSYmKHIucHJlZml4PWBmYWRgKSwodC5pbmNsdWRlcyhgZmEtYnJhbmRzYCl8fHQuaW5jbHVkZXMoYGZhYmApKSYmKHIucHJlZml4PWBmYWJgKSwhci5wcmVmaXgmJmxtLmluY2x1ZGVzKG4pJiYoT2JqZWN0LmtleXMocykuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gdW0uaW5jbHVkZXMoZSl9KXx8bC5hdXRvRmV0Y2hTdmcpJiYoci5wcmVmaXg9bmYuZ2V0KG4pLmRlZmF1bHRTaG9ydFByZWZpeElkLHIuaWNvbk5hbWU9WnAoci5wcmVmaXgsci5pY29uTmFtZSl8fHIuaWNvbk5hbWUpLChyLnByZWZpeD09PWBmYWB8fGE9PT1gZmFgKSYmKHIucHJlZml4PWVtKCl8fGBmYXNgKSxyfXZhciBmbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtUdSh0aGlzLGUpLHRoaXMuZGVmaW5pdGlvbnM9e319cmV0dXJuIER1KGUsW3trZXk6YGFkZGAsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Wy4uLmFyZ3VtZW50c10ucmVkdWNlKHRoaXMuX3B1bGxEZWZpbml0aW9ucyx7fSk7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtlLmRlZmluaXRpb25zW25dPXEocSh7fSxlLmRlZmluaXRpb25zW25dfHx7fSksdFtuXSksRnAobix0W25dKTt2YXIgcj1XZlthZF1bbl07ciYmRnAocix0W25dKSxKcCgpfSl9fSx7a2V5OmByZXNldGAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRlZmluaXRpb25zPXt9fX0se2tleTpgX3B1bGxEZWZpbml0aW9uc2AsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnByZWZpeCYmdC5pY29uTmFtZSYmdC5pY29uP3swOnR9OnQ7cmV0dXJuIE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXt2YXIgcj1uW3RdLGk9ci5wcmVmaXgsYT1yLmljb25OYW1lLG89ci5pY29uLHM9b1syXTtlW2ldfHwoZVtpXT17fSkscy5sZW5ndGg+MCYmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT1gc3RyaW5nYCYmKGVbaV1bdF09byl9KSxlW2ldW2FdPW99KSxlfX1dKX0oKSxwbT1bXSxtbT17fSxobT17fSxnbT1PYmplY3Qua2V5cyhobSk7ZnVuY3Rpb24gX20oZSx0KXt2YXIgbj10Lm1peG91dHNUbztyZXR1cm4gcG09ZSxtbT17fSxPYmplY3Qua2V5cyhobSkuZm9yRWFjaChmdW5jdGlvbihlKXtnbS5pbmRleE9mKGUpPT09LTEmJmRlbGV0ZSBobVtlXX0pLHBtLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5taXhvdXQ/ZS5taXhvdXQoKTp7fTtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3R5cGVvZiB0W2VdPT1gZnVuY3Rpb25gJiYobltlXT10W2VdKSxSdSh0W2VdKT09PWBvYmplY3RgJiZPYmplY3Qua2V5cyh0W2VdKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bZV18fChuW2VdPXt9KSxuW2VdW3JdPXRbZV1bcl19KX0pLGUuaG9va3Mpe3ZhciByPWUuaG9va3MoKTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe21tW2VdfHwobW1bZV09W10pLG1tW2VdLnB1c2gocltlXSl9KX1lLnByb3ZpZGVzJiZlLnByb3ZpZGVzKGhtKX0pLG59ZnVuY3Rpb24gdm0oZSx0KXt2YXIgbj1bLi4uYXJndW1lbnRzXS5zbGljZSgyKTtyZXR1cm4obW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZS5hcHBseShudWxsLFt0XS5jb25jYXQobikpfSksdH1mdW5jdGlvbiB5bShlKXt2YXIgdD1bLi4uYXJndW1lbnRzXS5zbGljZSgxKTsobW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkobnVsbCx0KX0pfWZ1bmN0aW9uIGJtKCl7dmFyIGU9YXJndW1lbnRzWzBdLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBobVtlXT9obVtlXS5hcHBseShudWxsLHQpOnZvaWQgMH1mdW5jdGlvbiB4bShlKXtlLnByZWZpeD09PWBmYWAmJihlLnByZWZpeD1gZmFzYCk7dmFyIHQ9ZS5pY29uTmFtZSxuPWUucHJlZml4fHxlbSgpO2lmKHQpcmV0dXJuIHQ9WnAobix0KXx8dCxBcChTbS5kZWZpbml0aW9ucyxuLHQpfHxBcCh3cC5zdHlsZXMsbix0KX12YXIgU209bmV3IGZtLENtPXtub0F1dG86ZnVuY3Rpb24oKXtKLmF1dG9SZXBsYWNlU3ZnPSExLEoub2JzZXJ2ZU11dGF0aW9ucz0hMSx5bShgbm9BdXRvYCl9LGNvbmZpZzpKLGRvbTp7aTJzdmc6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307cmV0dXJuIFp1Pyh5bShgYmVmb3JlSTJzdmdgLGUpLGJtKGBwc2V1ZG9FbGVtZW50czJzdmdgLGUpLGJtKGBpMnN2Z2AsZSkpOlByb21pc2UucmVqZWN0KEVycm9yKGBPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLmApKX0sd2F0Y2g6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sdD1lLmF1dG9SZXBsYWNlU3ZnUm9vdDtKLmF1dG9SZXBsYWNlU3ZnPT09ITEmJihKLmF1dG9SZXBsYWNlU3ZnPSEwKSxKLm9ic2VydmVNdXRhdGlvbnM9ITAsT3AoZnVuY3Rpb24oKXt3bSh7YXV0b1JlcGxhY2VTdmdSb290OnR9KSx5bShgd2F0Y2hgLGUpfSl9fSxwYXJzZTp7aWNvbjpmdW5jdGlvbihlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtpZihSdShlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSlyZXR1cm57cHJlZml4OmUucHJlZml4LGljb25OYW1lOlpwKGUucHJlZml4LGUuaWNvbk5hbWUpfHxlLmljb25OYW1lfTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTIpe3ZhciB0PWVbMV0uaW5kZXhPZihgZmEtYCk9PT0wP2VbMV0uc2xpY2UoMyk6ZVsxXSxuPXJtKGVbMF0pO3JldHVybntwcmVmaXg6bixpY29uTmFtZTpacChuLHQpfHx0fX1pZih0eXBlb2YgZT09YHN0cmluZ2AmJihlLmluZGV4T2YoYCR7Si5jc3NQcmVmaXh9LWApPi0xfHxlLm1hdGNoKEtmKSkpe3ZhciByPXNtKGUuc3BsaXQoYCBgKSx7c2tpcExvb2t1cHM6ITB9KTtyZXR1cm57cHJlZml4OnIucHJlZml4fHxlbSgpLGljb25OYW1lOlpwKHIucHJlZml4LHIuaWNvbk5hbWUpfHxyLmljb25OYW1lfX1pZih0eXBlb2YgZT09YHN0cmluZ2Ape3ZhciBpPWVtKCk7cmV0dXJue3ByZWZpeDppLGljb25OYW1lOlpwKGksZSl8fGV9fX19LGxpYnJhcnk6U20sZmluZEljb25EZWZpbml0aW9uOnhtLHRvSHRtbDprcH0sd209ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9KS5hdXRvUmVwbGFjZVN2Z1Jvb3QsdD1lPT09dm9pZCAwP0p1OmU7KE9iamVjdC5rZXlzKHdwLnN0eWxlcykubGVuZ3RoPjB8fEouYXV0b0ZldGNoU3ZnKSYmWnUmJkouYXV0b1JlcGxhY2VTdmcmJkNtLmRvbS5pMnN2Zyh7bm9kZTp0fSl9O2Z1bmN0aW9uIFRtKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhYnN0cmFjdCIse2dldDp0fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImh0bWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hYnN0cmFjdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGtwKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZihadSl7dmFyIHQ9SnUuY3JlYXRlRWxlbWVudChgZGl2YCk7cmV0dXJuIHQuaW5uZXJIVE1MPWUuaHRtbCx0LmNoaWxkcmVufX19KSxlfWZ1bmN0aW9uIEVtKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLm1haW4scj1lLm1hc2ssaT1lLmF0dHJpYnV0ZXMsYT1lLnN0eWxlcyxvPWUudHJhbnNmb3JtO2lmKGhwKG8pJiZuLmZvdW5kJiYhci5mb3VuZCl7dmFyIHM9e3g6bi53aWR0aC9uLmhlaWdodC8yLHk6LjV9O2kuc3R5bGU9bXAocShxKHt9LGEpLHt9LHsidHJhbnNmb3JtLW9yaWdpbiI6YCR7cy54K28ueC8xNn1lbSAke3MueStvLnkvMTZ9ZW1gfSkpfXJldHVyblt7dGFnOmBzdmdgLGF0dHJpYnV0ZXM6aSxjaGlsZHJlbjp0fV19ZnVuY3Rpb24gRG0oZSl7dmFyIHQ9ZS5wcmVmaXgsbj1lLmljb25OYW1lLHI9ZS5jaGlsZHJlbixpPWUuYXR0cmlidXRlcyxhPWUuc3ltYm9sLG89YT09PSEwP2Ake3R9LSR7Si5jc3NQcmVmaXh9LSR7bn1gOmE7cmV0dXJuW3t0YWc6YHN2Z2AsYXR0cmlidXRlczp7c3R5bGU6YGRpc3BsYXk6IG5vbmU7YH0sY2hpbGRyZW46W3t0YWc6YHN5bWJvbGAsYXR0cmlidXRlczpxKHEoe30saSkse30se2lkOm99KSxjaGlsZHJlbjpyfV19XX1mdW5jdGlvbiBPbShlKXtyZXR1cm5bYGFyaWEtbGFiZWxgLGBhcmlhLWxhYmVsbGVkYnlgLGB0aXRsZWAsYHJvbGVgXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluIGV9KX1mdW5jdGlvbiBrbShlKXt2YXIgdD1lLmljb25zLG49dC5tYWluLHI9dC5tYXNrLGk9ZS5wcmVmaXgsYT1lLmljb25OYW1lLG89ZS50cmFuc2Zvcm0scz1lLnN5bWJvbCxjPWUubWFza0lkLGw9ZS5leHRyYSx1PWUud2F0Y2hhYmxlLGQ9dSE9PXZvaWQgMCYmdSxmPXIuZm91bmQ/cjpuLHA9Zi53aWR0aCxtPWYuaGVpZ2h0LGg9W0oucmVwbGFjZW1lbnRDbGFzcyxhP2Ake0ouY3NzUHJlZml4fS0ke2F9YDpgYF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBsLmNsYXNzZXMuaW5kZXhPZihlKT09PS0xfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09YGB8fCEhZX0pLmNvbmNhdChsLmNsYXNzZXMpLmpvaW4oYCBgKSxnPXtjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOnEocSh7fSxsLmF0dHJpYnV0ZXMpLHt9LHsiZGF0YS1wcmVmaXgiOmksImRhdGEtaWNvbiI6YSxjbGFzczpoLHJvbGU6bC5hdHRyaWJ1dGVzLnJvbGV8fGBpbWdgLHZpZXdCb3g6YDAgMCAke3B9ICR7bX1gfSl9OyFPbShsLmF0dHJpYnV0ZXMpJiYhbC5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdJiYoZy5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdPWB0cnVlYCksZCYmKGcuYXR0cmlidXRlc1tPZl09YGApO3ZhciBfPXEocSh7fSxnKSx7fSx7cHJlZml4OmksaWNvbk5hbWU6YSxtYWluOm4sbWFzazpyLG1hc2tJZDpjLHRyYW5zZm9ybTpvLHN5bWJvbDpzLHN0eWxlczpxKHt9LGwuc3R5bGVzKX0pLHY9ci5mb3VuZCYmbi5mb3VuZD9ibShgZ2VuZXJhdGVBYnN0cmFjdE1hc2tgLF8pfHx7Y2hpbGRyZW46W10sYXR0cmlidXRlczp7fX06Ym0oYGdlbmVyYXRlQWJzdHJhY3RJY29uYCxfKXx8e2NoaWxkcmVuOltdLGF0dHJpYnV0ZXM6e319LHk9di5jaGlsZHJlbixiPXYuYXR0cmlidXRlcztyZXR1cm4gXy5jaGlsZHJlbj15LF8uYXR0cmlidXRlcz1iLHM/RG0oXyk6RW0oXyl9ZnVuY3Rpb24gQW0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS53aWR0aCxyPWUuaGVpZ2h0LGk9ZS50cmFuc2Zvcm0sYT1lLmV4dHJhLG89ZS53YXRjaGFibGUscz1vIT09dm9pZCAwJiZvLGM9cShxKHt9LGEuYXR0cmlidXRlcykse30se2NsYXNzOmEuY2xhc3Nlcy5qb2luKGAgYCl9KTtzJiYoY1tPZl09YGApO3ZhciBsPXEoe30sYS5zdHlsZXMpO2hwKGkpJiYobC50cmFuc2Zvcm09X3Aoe3RyYW5zZm9ybTppLHN0YXJ0Q2VudGVyZWQ6ITAsd2lkdGg6bixoZWlnaHQ6cn0pLGxbYC13ZWJraXQtdHJhbnNmb3JtYF09bC50cmFuc2Zvcm0pO3ZhciB1PW1wKGwpO3UubGVuZ3RoPjAmJihjLnN0eWxlPXUpO3ZhciBkPVtdO3JldHVybiBkLnB1c2goe3RhZzpgc3BhbmAsYXR0cmlidXRlczpjLGNoaWxkcmVuOlt0XX0pLGR9ZnVuY3Rpb24gam0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS5leHRyYSxyPXEocSh7fSxuLmF0dHJpYnV0ZXMpLHt9LHtjbGFzczpuLmNsYXNzZXMuam9pbihgIGApfSksaT1tcChuLnN0eWxlcyk7aS5sZW5ndGg+MCYmKHIuc3R5bGU9aSk7dmFyIGE9W107cmV0dXJuIGEucHVzaCh7dGFnOmBzcGFuYCxhdHRyaWJ1dGVzOnIsY2hpbGRyZW46W3RdfSksYX12YXIgTW09d3Auc3R5bGVzO2Z1bmN0aW9uIE5tKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9UHUoZS5zbGljZSg0KSwxKVswXSxpPW51bGw7cmV0dXJuIGk9QXJyYXkuaXNBcnJheShyKT97dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5HUk9VUH1gfSxjaGlsZHJlbjpbe3RhZzpgcGF0aGAsYXR0cmlidXRlczp7Y2xhc3M6YCR7Si5jc3NQcmVmaXh9LSR7WGYuU0VDT05EQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMF19fSx7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5QUklNQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMV19fV19Ont0YWc6YHBhdGhgLGF0dHJpYnV0ZXM6e2ZpbGw6YGN1cnJlbnRDb2xvcmAsZDpyfX0se2ZvdW5kOiEwLHdpZHRoOnQsaGVpZ2h0Om4saWNvbjppfX12YXIgUG09e2ZvdW5kOiExLHdpZHRoOjUxMixoZWlnaHQ6NTEyfTtmdW5jdGlvbiBGbShlLHQpeyFMZiYmIUouc2hvd01pc3NpbmdJY29ucyYmZSYmY29uc29sZS5lcnJvcihgSWNvbiB3aXRoIG5hbWUgIiR7ZX0iIGFuZCBwcmVmaXggIiR7dH0iIGlzIG1pc3NpbmcuYCl9ZnVuY3Rpb24gSW0oZSx0KXt2YXIgbj10O3JldHVybiB0PT09YGZhYCYmSi5zdHlsZURlZmF1bHQhPT1udWxsJiYodD1lbSgpKSxuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe2lmKG49PT1gZmFgKXt2YXIgYT1RcChlKXx8e307ZT1hLmljb25OYW1lfHxlLHQ9YS5wcmVmaXh8fHR9aWYoZSYmdCYmTW1bdF0mJk1tW3RdW2VdKXt2YXIgbz1NbVt0XVtlXTtyZXR1cm4gcihObShvKSl9Rm0oZSx0KSxyKHEocSh7fSxQbSkse30se2ljb246Si5zaG93TWlzc2luZ0ljb25zJiZlJiZibShgbWlzc2luZ0ljb25BYnN0cmFjdGApfHx7fX0pKX0pfXZhciBMbT1mdW5jdGlvbigpe30sUm09Si5tZWFzdXJlUGVyZm9ybWFuY2UmJlh1JiZYdS5tYXJrJiZYdS5tZWFzdXJlP1h1OnttYXJrOkxtLG1lYXN1cmU6TG19LHptPWBGQSAiNy4zLjEiYCxCbT1mdW5jdGlvbihlKXtyZXR1cm4gUm0ubWFyayhgJHt6bX0gJHtlfSBiZWdpbnNgKSxmdW5jdGlvbigpe3JldHVybiBWbShlKX19LFZtPWZ1bmN0aW9uKGUpe1JtLm1hcmsoYCR7em19ICR7ZX0gZW5kc2ApLFJtLm1lYXN1cmUoYCR7em19ICR7ZX1gLGAke3ptfSAke2V9IGJlZ2luc2AsYCR7em19ICR7ZX0gZW5kc2ApfSxIbT17YmVnaW46Qm0sZW5kOlZtfSxVbT1mdW5jdGlvbigpe307ZnVuY3Rpb24gV20oZSl7cmV0dXJuIHR5cGVvZihlLmdldEF0dHJpYnV0ZT9lLmdldEF0dHJpYnV0ZShPZik6bnVsbCk9PWBzdHJpbmdgfWZ1bmN0aW9uIEdtKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlP2UuZ2V0QXR0cmlidXRlKGpmKTpudWxsLG49ZS5nZXRBdHRyaWJ1dGU/ZS5nZXRBdHRyaWJ1dGUoTWYpOm51bGw7cmV0dXJuIHQmJm59ZnVuY3Rpb24gS20oZSl7cmV0dXJuIGUmJmUuY2xhc3NMaXN0JiZlLmNsYXNzTGlzdC5jb250YWlucyYmZS5jbGFzc0xpc3QuY29udGFpbnMoSi5yZXBsYWNlbWVudENsYXNzKX1mdW5jdGlvbiBxbSgpe3JldHVybiBKLmF1dG9SZXBsYWNlU3ZnPT09ITA/UW0ucmVwbGFjZTpRbVtKLmF1dG9SZXBsYWNlU3ZnXXx8UW0ucmVwbGFjZX1mdW5jdGlvbiBKbShlKXtyZXR1cm4gSnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsZSl9ZnVuY3Rpb24gWW0oZSl7cmV0dXJuIEp1LmNyZWF0ZUVsZW1lbnQoZSl9ZnVuY3Rpb24gWG0oZSl7dmFyIHQ9KGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSkuY2VGbixuPXQ9PT12b2lkIDA/ZS50YWc9PT1gc3ZnYD9KbTpZbTp0O2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gSnUuY3JlYXRlVGV4dE5vZGUoZSk7dmFyIHI9bihlLnRhZyk7cmV0dXJuIE9iamVjdC5rZXlzKGUuYXR0cmlidXRlc3x8W10pLmZvckVhY2goZnVuY3Rpb24odCl7ci5zZXRBdHRyaWJ1dGUodCxlLmF0dHJpYnV0ZXNbdF0pfSksKGUuY2hpbGRyZW58fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuYXBwZW5kQ2hpbGQoWG0oZSx7Y2VGbjpufSkpfSkscn1mdW5jdGlvbiBabShlKXt2YXIgdD1gICR7ZS5vdXRlckhUTUx9IGA7cmV0dXJuIHQ9YCR7dH1Gb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tIGAsdH12YXIgUW09e3JlcGxhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZih0LnBhcmVudE5vZGUpe2lmKGVbMV0uZm9yRWFjaChmdW5jdGlvbihlKXt0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFhtKGUpLHQpfSksdC5nZXRBdHRyaWJ1dGUoT2YpPT09bnVsbCYmSi5rZWVwT3JpZ2luYWxTb3VyY2Upe3ZhciBuPUp1LmNyZWF0ZUNvbW1lbnQoWm0odCkpO3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobix0KX1lbHNlIHQucmVtb3ZlKCl9fSxuZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2lmKH5kcCh0KS5pbmRleE9mKEoucmVwbGFjZW1lbnRDbGFzcykpcmV0dXJuIFFtLnJlcGxhY2UoZSk7dmFyIHI9UmVnRXhwKGAke0ouY3NzUHJlZml4fS0uKmApO2lmKGRlbGV0ZSBuWzBdLmF0dHJpYnV0ZXMuaWQsblswXS5hdHRyaWJ1dGVzLmNsYXNzKXt2YXIgaT1uWzBdLmF0dHJpYnV0ZXMuY2xhc3Muc3BsaXQoYCBgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PUoucmVwbGFjZW1lbnRDbGFzc3x8dC5tYXRjaChyKT9lLnRvU3ZnLnB1c2godCk6ZS50b05vZGUucHVzaCh0KSxlfSx7dG9Ob2RlOltdLHRvU3ZnOltdfSk7blswXS5hdHRyaWJ1dGVzLmNsYXNzPWkudG9Tdmcuam9pbihgIGApLGkudG9Ob2RlLmxlbmd0aD09PTA/dC5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6dC5zZXRBdHRyaWJ1dGUoYGNsYXNzYCxpLnRvTm9kZS5qb2luKGAgYCkpfXZhciBhPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKTt0LnNldEF0dHJpYnV0ZShPZixgYCksdC5pbm5lckhUTUw9YX19O2Z1bmN0aW9uICRtKGUpe2UoKX1mdW5jdGlvbiBlaChlLHQpe3ZhciBuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3Q6VW07aWYoZS5sZW5ndGg9PT0wKW4oKTtlbHNle3ZhciByPSRtO0oubXV0YXRlQXBwcm9hY2g9PT1QZiYmKHI9cXUucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwkbSkscihmdW5jdGlvbigpe3ZhciB0PXFtKCkscj1IbS5iZWdpbihgbXV0YXRlYCk7ZS5tYXAodCkscigpLG4oKX0pfX12YXIgdGg9ITE7ZnVuY3Rpb24gbmgoKXt0aD0hMH1mdW5jdGlvbiByaCgpe3RoPSExfXZhciBpaD1udWxsO2Z1bmN0aW9uIGFoKGUpe2lmKFl1JiZKLm9ic2VydmVNdXRhdGlvbnMpe3ZhciB0PWUudHJlZUNhbGxiYWNrLG49dD09PXZvaWQgMD9VbTp0LHI9ZS5ub2RlQ2FsbGJhY2ssaT1yPT09dm9pZCAwP1VtOnIsYT1lLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2ssbz1hPT09dm9pZCAwP1VtOmEscz1lLm9ic2VydmVNdXRhdGlvbnNSb290LGM9cz09PXZvaWQgMD9KdTpzO2loPW5ldyBZdShmdW5jdGlvbihlKXtpZighdGgpe3ZhciB0PWVtKCk7dXAoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnR5cGU9PT1gY2hpbGRMaXN0YCYmZS5hZGRlZE5vZGVzLmxlbmd0aD4wJiYhV20oZS5hZGRlZE5vZGVzWzBdKSYmKEouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oZS50YXJnZXQpLG4oZS50YXJnZXQpKSxlLnR5cGU9PT1gYXR0cmlidXRlc2AmJmUudGFyZ2V0LnBhcmVudE5vZGUmJkouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oW2UudGFyZ2V0XSwhMCksZS50eXBlPT09YGF0dHJpYnV0ZXNgJiZXbShlLnRhcmdldCkmJn5ZZi5pbmRleE9mKGUuYXR0cmlidXRlTmFtZSkpe2lmKGUuYXR0cmlidXRlTmFtZT09PWBjbGFzc2AmJkdtKGUudGFyZ2V0KSl7dmFyIHI9c20oZHAoZS50YXJnZXQpKSxhPXIucHJlZml4LHM9ci5pY29uTmFtZTtlLnRhcmdldC5zZXRBdHRyaWJ1dGUoamYsYXx8dCkscyYmZS50YXJnZXQuc2V0QXR0cmlidXRlKE1mLHMpfWVsc2UgS20oZS50YXJnZXQpJiZpKGUudGFyZ2V0KX19KX19KSxadSYmaWgub2JzZXJ2ZShjLHtjaGlsZExpc3Q6ITAsYXR0cmlidXRlczohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19ZnVuY3Rpb24gb2goKXtpaCYmaWguZGlzY29ubmVjdCgpfWZ1bmN0aW9uIHNoKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKGBzdHlsZWApLG49W107cmV0dXJuIHQmJihuPXQuc3BsaXQoYDtgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwbGl0KGA6YCkscj1uWzBdLGk9bi5zbGljZSgxKTtyZXR1cm4gciYmaS5sZW5ndGg+MCYmKGVbcl09aS5qb2luKGA6YCkudHJpbSgpKSxlfSx7fSkpLG59ZnVuY3Rpb24gY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoYGRhdGEtcHJlZml4YCksbj1lLmdldEF0dHJpYnV0ZShgZGF0YS1pY29uYCkscj1lLmlubmVyVGV4dD09PXZvaWQgMD9gYDplLmlubmVyVGV4dC50cmltKCksaT1zbShkcChlKSk7cmV0dXJuIGkucHJlZml4fHw9ZW0oKSx0JiZuJiYoaS5wcmVmaXg9dCxpLmljb25OYW1lPW4pLGkuaWNvbk5hbWUmJmkucHJlZml4P2k6KGkucHJlZml4JiZyLmxlbmd0aD4wJiYoaS5pY29uTmFtZT1YcChpLnByZWZpeCxlLmlubmVyVGV4dCl8fFlwKGkucHJlZml4LE5wKGUuaW5uZXJUZXh0KSkpLCFpLmljb25OYW1lJiZKLmF1dG9GZXRjaFN2ZyYmZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmKGkuaWNvbk5hbWU9ZS5maXJzdENoaWxkLmRhdGEpLGkpfWZ1bmN0aW9uIGxoKGUpe3JldHVybiB1cChlLmF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWUhPT1gY2xhc3NgJiZlLm5hbWUhPT1gc3R5bGVgJiYoZVt0Lm5hbWVdPXQudmFsdWUpLGV9LHt9KX1mdW5jdGlvbiB1aCgpe3JldHVybntpY29uTmFtZTpudWxsLHByZWZpeDpudWxsLHRyYW5zZm9ybTpvcCxzeW1ib2w6ITEsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxleHRyYTp7Y2xhc3NlczpbXSxzdHlsZXM6e30sYXR0cmlidXRlczp7fX19fWZ1bmN0aW9uIGRoKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7c3R5bGVQYXJzZXI6ITB9LG49Y2goZSkscj1uLmljb25OYW1lLGk9bi5wcmVmaXgsYT1uLnJlc3Qsbz1saChlKSxzPXZtKGBwYXJzZU5vZGVBdHRyaWJ1dGVzYCx7fSxlKTtyZXR1cm4gcSh7aWNvbk5hbWU6cixwcmVmaXg6aSx0cmFuc2Zvcm06b3AsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxzeW1ib2w6ITEsZXh0cmE6e2NsYXNzZXM6YSxzdHlsZXM6dC5zdHlsZVBhcnNlcj9zaChlKTpbXSxhdHRyaWJ1dGVzOm99fSxzKX12YXIgZmg9d3Auc3R5bGVzO2Z1bmN0aW9uIHBoKGUpe3ZhciB0PUouYXV0b1JlcGxhY2VTdmc9PT1gbmVzdGA/ZGgoZSx7c3R5bGVQYXJzZXI6ITF9KTpkaChlKTtyZXR1cm5+dC5leHRyYS5jbGFzc2VzLmluZGV4T2YocWYpP2JtKGBnZW5lcmF0ZUxheWVyc1RleHRgLGUsdCk6Ym0oYGdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbmAsZSx0KX1mdW5jdGlvbiBtaCgpe3JldHVybltdLmNvbmNhdChGdShhZiksRnUodmYpKX1mdW5jdGlvbiBoaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZighWnUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBuPUp1LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Qscj1mdW5jdGlvbihlKXtyZXR1cm4gbi5hZGQoYCR7TmZ9LSR7ZX1gKX0saT1mdW5jdGlvbihlKXtyZXR1cm4gbi5yZW1vdmUoYCR7TmZ9LSR7ZX1gKX0sYT1KLmF1dG9GZXRjaFN2Zz9taCgpOmlkLmNvbmNhdChPYmplY3Qua2V5cyhmaCkpO2EuaW5jbHVkZXMoYGZhYCl8fGEucHVzaChgZmFgKTt2YXIgbz1bYC4ke3FmfTpub3QoWyR7T2Z9XSlgXS5jb25jYXQoYS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYC4ke2V9Om5vdChbJHtPZn1dKWB9KSkuam9pbihgLCBgKTtpZihvLmxlbmd0aD09PTApcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBzPVtdO3RyeXtzPXVwKGUucXVlcnlTZWxlY3RvckFsbChvKSl9Y2F0Y2h7fWlmKHMubGVuZ3RoPjApcihgcGVuZGluZ2ApLGkoYGNvbXBsZXRlYCk7ZWxzZSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGM9SG0uYmVnaW4oYG9uVHJlZWApLGw9cy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt0cnl7dmFyIG49cGgodCk7biYmZS5wdXNoKG4pfWNhdGNoKGUpe0xmfHxlLm5hbWU9PT1gTWlzc2luZ0ljb25gJiZjb25zb2xlLmVycm9yKGUpfXJldHVybiBlfSxbXSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7UHJvbWlzZS5hbGwobCkudGhlbihmdW5jdGlvbihuKXtlaChuLGZ1bmN0aW9uKCl7cihgYWN0aXZlYCkscihgY29tcGxldGVgKSxpKGBwZW5kaW5nYCksdHlwZW9mIHQ9PWBmdW5jdGlvbmAmJnQoKSxjKCksZSgpfSl9KS5jYXRjaChmdW5jdGlvbihlKXtjKCksbihlKX0pfSl9ZnVuY3Rpb24gZ2goZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7cGgoZSkudGhlbihmdW5jdGlvbihlKXtlJiZlaChbZV0sdCl9KX1mdW5jdGlvbiBfaChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHI9KHR8fHt9KS5pY29uP3Q6eG0odHx8e30pLGk9bi5tYXNrO3JldHVybiBpJiY9KGl8fHt9KS5pY29uP2k6eG0oaXx8e30pLGUocixxKHEoe30sbikse30se21hc2s6aX0pKX19dmFyIHZoPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5zeW1ib2wsYT1pIT09dm9pZCAwJiZpLG89dC5tYXNrLHM9bz09PXZvaWQgMD9udWxsOm8sYz10Lm1hc2tJZCxsPWM9PT12b2lkIDA/bnVsbDpjLHU9dC5jbGFzc2VzLGQ9dT09PXZvaWQgMD9bXTp1LGY9dC5hdHRyaWJ1dGVzLHA9Zj09PXZvaWQgMD97fTpmLG09dC5zdHlsZXMsaD1tPT09dm9pZCAwP3t9Om07aWYoZSl7dmFyIGc9ZS5wcmVmaXgsXz1lLmljb25OYW1lLHY9ZS5pY29uO3JldHVybiBUbShxKHt0eXBlOmBpY29uYH0sZSksZnVuY3Rpb24oKXtyZXR1cm4geW0oYGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbmAse2ljb25EZWZpbml0aW9uOmUscGFyYW1zOnR9KSxrbSh7aWNvbnM6e21haW46Tm0odiksbWFzazpzP05tKHMuaWNvbik6e2ZvdW5kOiExLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsaWNvbjp7fX19LHByZWZpeDpnLGljb25OYW1lOl8sdHJhbnNmb3JtOnEocSh7fSxvcCksciksc3ltYm9sOmEsbWFza0lkOmwsZXh0cmE6e2F0dHJpYnV0ZXM6cCxzdHlsZXM6aCxjbGFzc2VzOmR9fSl9KX19LHloPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57aWNvbjpfaCh2aCl9fSxob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRyZWVDYWxsYmFjaz1oaCxlLm5vZGVDYWxsYmFjaz1naCxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuaTJzdmc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlLG49dD09PXZvaWQgMD9KdTp0LHI9ZS5jYWxsYmFjaztyZXR1cm4gaGgobixyPT09dm9pZCAwP2Z1bmN0aW9uKCl7fTpyKX0sZS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmljb25OYW1lLHI9dC5wcmVmaXgsaT10LnRyYW5zZm9ybSxhPXQuc3ltYm9sLG89dC5tYXNrLHM9dC5tYXNrSWQsYz10LmV4dHJhO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGwpe1Byb21pc2UuYWxsKFtJbShuLHIpLG8uaWNvbk5hbWU/SW0oby5pY29uTmFtZSxvLnByZWZpeCk6UHJvbWlzZS5yZXNvbHZlKHtmb3VuZDohMSx3aWR0aDo1MTIsaGVpZ2h0OjUxMixpY29uOnt9fSldKS50aGVuKGZ1bmN0aW9uKG8pe3ZhciBsPVB1KG8sMiksdT1sWzBdLGQ9bFsxXTt0KFtlLGttKHtpY29uczp7bWFpbjp1LG1hc2s6ZH0scHJlZml4OnIsaWNvbk5hbWU6bix0cmFuc2Zvcm06aSxzeW1ib2w6YSxtYXNrSWQ6cyxleHRyYTpjLHdhdGNoYWJsZTohMH0pXSl9KS5jYXRjaChsKX0pfSxlLmdlbmVyYXRlQWJzdHJhY3RJY29uPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLnRyYW5zZm9ybSxhPWUuc3R5bGVzLG89bXAoYSk7by5sZW5ndGg+MCYmKG4uc3R5bGU9byk7dmFyIHM7cmV0dXJuIGhwKGkpJiYocz1ibShgZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nYCx7bWFpbjpyLHRyYW5zZm9ybTppLGNvbnRhaW5lcldpZHRoOnIud2lkdGgsaWNvbldpZHRoOnIud2lkdGh9KSksdC5wdXNoKHN8fHIuaWNvbikse2NoaWxkcmVuOnQsYXR0cmlidXRlczpufX19fSxiaD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2xheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQuY2xhc3NlcyxyPW49PT12b2lkIDA/W106bjtyZXR1cm4gVG0oe3R5cGU6YGxheWVyYH0sZnVuY3Rpb24oKXt5bShgYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uYCx7YXNzZW1ibGVyOmUscGFyYW1zOnR9KTt2YXIgbj1bXTtyZXR1cm4gZShmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpP2UubWFwKGZ1bmN0aW9uKGUpe249bi5jb25jYXQoZS5hYnN0cmFjdCl9KTpuPW4uY29uY2F0KGUuYWJzdHJhY3QpfSksW3t0YWc6YHNwYW5gLGF0dHJpYnV0ZXM6e2NsYXNzOltgJHtKLmNzc1ByZWZpeH0tbGF5ZXJzYF0uY29uY2F0KEZ1KHIpKS5qb2luKGAgYCl9LGNoaWxkcmVuOm59XX0pfX19fSx4aD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2NvdW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LG49dC50aXRsZSxyPW49PT12b2lkIDA/bnVsbDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmBjb3VudGVyYCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxqbSh7Y29udGVudDplLnRvU3RyaW5nKCksdGl0bGU6cixleHRyYTp7YXR0cmlidXRlczpzLHN0eWxlczpsLGNsYXNzZXM6W2Ake0ouY3NzUHJlZml4fS1sYXllcnMtY291bnRlcmBdLmNvbmNhdChGdShhKSl9fSl9KX19fX0sU2g9e21peG91dDpmdW5jdGlvbigpe3JldHVybnt0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmB0ZXh0YCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxBbSh7Y29udGVudDplLHRyYW5zZm9ybTpxKHEoe30sb3ApLHIpLGV4dHJhOnthdHRyaWJ1dGVzOnMsc3R5bGVzOmwsY2xhc3NlczpbYCR7Si5jc3NQcmVmaXh9LWxheWVycy10ZXh0YF0uY29uY2F0KEZ1KGEpKX19KX0pfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVMYXllcnNUZXh0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC50cmFuc2Zvcm0scj10LmV4dHJhLGk9bnVsbCxhPW51bGw7aWYoUXUpe3ZhciBvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZSkuZm9udFNpemUsMTApLHM9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpPXMud2lkdGgvbyxhPXMuaGVpZ2h0L299cmV0dXJuIFByb21pc2UucmVzb2x2ZShbZSxBbSh7Y29udGVudDplLmlubmVySFRNTCx3aWR0aDppLGhlaWdodDphLHRyYW5zZm9ybTpuLGV4dHJhOnIsd2F0Y2hhYmxlOiEwfSldKX19fSxDaD1SZWdFeHAoYCJgLGB1Z2ApLHdoPVsxMTA1OTIwLDExMTIzMTldLFRoPXEocShxKHEoe30se0ZvbnRBd2Vzb21lOntub3JtYWw6YGZhc2AsNDAwOmBmYXNgfX0pLHRmKSxDZiksbGYpLEVoPU9iamVjdC5rZXlzKFRoKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0LnRvTG93ZXJDYXNlKCldPVRoW3RdLGV9LHt9KSxEaD1PYmplY3Qua2V5cyhFaCkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49RWhbdF07cmV0dXJuIGVbdF09bls5MDBdfHxGdShPYmplY3QuZW50cmllcyhuKSlbMF1bMV0sZX0se30pO2Z1bmN0aW9uIE9oKGUpe3JldHVybiBOcChGdShlLnJlcGxhY2UoQ2gsYGApKVswXXx8YGApfWZ1bmN0aW9uIGtoKGUpe3ZhciB0PWUuZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mZWF0dXJlLXNldHRpbmdzYCkuaW5jbHVkZXMoYHNzMDFgKSxuPWUuZ2V0UHJvcGVydHlWYWx1ZShgY29udGVudGApLnJlcGxhY2UoQ2gsYGApLHI9bi5jb2RlUG9pbnRBdCgwKSxpPXI+PXdoWzBdJiZyPD13aFsxXSxhPW4ubGVuZ3RoPT09MiYmblswXT09PW5bMV07cmV0dXJuIGl8fGF8fHR9ZnVuY3Rpb24gQWgoZSx0KXt2YXIgbj1lLnJlcGxhY2UoL15bJyJdfFsnIl0kL2csYGApLnRvTG93ZXJDYXNlKCkscj1wYXJzZUludCh0KSxpPWlzTmFOKHIpP2Bub3JtYWxgOnI7cmV0dXJuKEVoW25dfHx7fSlbaV18fERoW25dfWZ1bmN0aW9uIGpoKGUsdCl7dmFyIG49YCR7QWZ9JHt0LnJlcGxhY2UoYDpgLGAtYCl9YDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixpKXtpZihlLmdldEF0dHJpYnV0ZShuKSE9PW51bGwpcmV0dXJuIHIoKTt2YXIgYT11cChlLmNoaWxkcmVuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKGtmKT09PXR9KVswXSxvPXF1LmdldENvbXB1dGVkU3R5bGUoZSx0KSxzPW8uZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mYW1pbHlgKSxjPXMubWF0Y2goSmYpLGw9by5nZXRQcm9wZXJ0eVZhbHVlKGBmb250LXdlaWdodGApLHU9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCk7aWYoYSYmIWMpcmV0dXJuIGUucmVtb3ZlQ2hpbGQoYSkscigpO2lmKGMmJnUhPT1gbm9uZWAmJnUhPT1gYCl7dmFyIGQ9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCksZj1BaChzLGwpLHA9T2goZCksbT1jWzBdLnN0YXJ0c1dpdGgoYEZvbnRBd2Vzb21lYCksaD1raChvKSxnPVlwKGYscCksXz1nO2lmKG0pe3ZhciB2PSRwKHApO3YuaWNvbk5hbWUmJnYucHJlZml4JiYoZz12Lmljb25OYW1lLGY9di5wcmVmaXgpfWlmKGcmJiFoJiYoIWF8fGEuZ2V0QXR0cmlidXRlKGpmKSE9PWZ8fGEuZ2V0QXR0cmlidXRlKE1mKSE9PV8pKXtlLnNldEF0dHJpYnV0ZShuLF8pLGEmJmUucmVtb3ZlQ2hpbGQoYSk7dmFyIHk9dWgoKSxiPXkuZXh0cmE7Yi5hdHRyaWJ1dGVzW2tmXT10LEltKGcsZikudGhlbihmdW5jdGlvbihpKXt2YXIgYT1rbShxKHEoe30seSkse30se2ljb25zOnttYWluOmksbWFzazp0bSgpfSxwcmVmaXg6ZixpY29uTmFtZTpfLGV4dHJhOmIsd2F0Y2hhYmxlOiEwfSkpLG89SnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsYHN2Z2ApO3Q9PT1gOjpiZWZvcmVgP2UuaW5zZXJ0QmVmb3JlKG8sZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKG8pLG8ub3V0ZXJIVE1MPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKSxlLnJlbW92ZUF0dHJpYnV0ZShuKSxyKCl9KS5jYXRjaChpKX1lbHNlIHIoKX1lbHNlIHIoKX0pfWZ1bmN0aW9uIE1oKGUpe3JldHVybiBQcm9taXNlLmFsbChbamgoZSxgOjpiZWZvcmVgKSxqaChlLGA6OmFmdGVyYCldKX1mdW5jdGlvbiBOaChlKXtyZXR1cm4gZS5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmIX5GZi5pbmRleE9mKGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSYmIWUuZ2V0QXR0cmlidXRlKGtmKSYmKCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS50YWdOYW1lIT09YHN2Z2ApfXZhciBQaD1mdW5jdGlvbihlKXtyZXR1cm4hIWUmJklmLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5jbHVkZXModCl9KX0sRmg9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9bmV3IFNldCxuPWUuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSk7bj1uLmZsYXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5jbHVkZXMoYChgKT9lOmUuc3BsaXQoYCxgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSl9KTt2YXIgcj1PdShuKSxpO3RyeXtmb3Ioci5zKCk7IShpPXIubigpKS5kb25lOyl7dmFyIGE9aS52YWx1ZTtpZihQaChhKSl7dmFyIG89SWYucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSh0LGBgKX0sYSk7byE9PWBgJiZvIT09YCpgJiZ0LmFkZChvKX19fWNhdGNoKGUpe3IuZShlKX1maW5hbGx5e3IuZigpfXJldHVybiB0fTtmdW5jdGlvbiBJaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMCYmYXJndW1lbnRzWzFdO2lmKFp1KXt2YXIgbjtpZih0KW49ZTtlbHNlIGlmKEouc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiluPWUucXVlcnlTZWxlY3RvckFsbChgKmApO2Vsc2V7dmFyIHI9bmV3IFNldCxpPU91KGRvY3VtZW50LnN0eWxlU2hlZXRzKSxhO3RyeXtmb3IoaS5zKCk7IShhPWkubigpKS5kb25lOyl7dmFyIG89YS52YWx1ZTt0cnl7dmFyIHM9T3Uoby5jc3NSdWxlcyksYzt0cnl7Zm9yKHMucygpOyEoYz1zLm4oKSkuZG9uZTspe3ZhciBsPWMudmFsdWUsdT1PdShGaChsLnNlbGVjdG9yVGV4dCkpLGQ7dHJ5e2Zvcih1LnMoKTshKGQ9dS5uKCkpLmRvbmU7KXt2YXIgZj1kLnZhbHVlO3IuYWRkKGYpfX1jYXRjaChlKXt1LmUoZSl9ZmluYWxseXt1LmYoKX19fWNhdGNoKGUpe3MuZShlKX1maW5hbGx5e3MuZigpfX1jYXRjaChlKXtKLnNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MmJmNvbnNvbGUud2FybihgRm9udCBBd2Vzb21lOiBjYW5ub3QgcGFyc2Ugc3R5bGVzaGVldDogJHtvLmhyZWZ9ICgke2UubWVzc2FnZX0pCklmIGl0IGRlY2xhcmVzIGFueSBGb250IEF3ZXNvbWUgQ1NTIHBzZXVkby1lbGVtZW50cywgdGhleSB3aWxsIG5vdCBiZSByZW5kZXJlZCBhcyBTVkcgaWNvbnMuIEFkZCBjcm9zc29yaWdpbj0iYW5vbnltb3VzIiB0byB0aGUgPGxpbms+LCBlbmFibGUgc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiBmb3Igc2xvd2VyIGJ1dCBtb3JlIHRob3JvdWdoIERPTSBwYXJzaW5nLCBvciBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzIHRvIGZhbHNlLmApfX19Y2F0Y2goZSl7aS5lKGUpfWZpbmFsbHl7aS5mKCl9aWYoIXIuc2l6ZSlyZXR1cm47dmFyIHA9QXJyYXkuZnJvbShyKS5qb2luKGAsIGApO3RyeXtuPWUucXVlcnlTZWxlY3RvckFsbChwKX1jYXRjaHt9fXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe3ZhciByPXVwKG4pLmZpbHRlcihOaCkubWFwKE1oKSxpPUhtLmJlZ2luKGBzZWFyY2hQc2V1ZG9FbGVtZW50c2ApO25oKCksUHJvbWlzZS5hbGwocikudGhlbihmdW5jdGlvbigpe2koKSxyaCgpLGUoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aSgpLHJoKCksdCgpfSl9KX19dmFyIExoPXtob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2s9SWgsZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLnBzZXVkb0VsZW1lbnRzMnN2Zz1mdW5jdGlvbihlKXt2YXIgdD1lLm5vZGUsbj10PT09dm9pZCAwP0p1OnQ7Si5zZWFyY2hQc2V1ZG9FbGVtZW50cyYmSWgobil9fX0sUmg9ITEsemg9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e3Vud2F0Y2g6ZnVuY3Rpb24oKXtuaCgpLFJoPSEwfX19fSxob29rczpmdW5jdGlvbigpe3JldHVybntib290c3RyYXA6ZnVuY3Rpb24oKXthaCh2bShgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrc2Ase30pKX0sbm9BdXRvOmZ1bmN0aW9uKCl7b2goKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vYnNlcnZlTXV0YXRpb25zUm9vdDtSaD9yaCgpOmFoKHZtKGBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzYCx7b2JzZXJ2ZU11dGF0aW9uc1Jvb3Q6dH0pKX19fX0sQmg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5zcGxpdChgIGApLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQudG9Mb3dlckNhc2UoKS5zcGxpdChgLWApLHI9blswXSxpPW4uc2xpY2UoMSkuam9pbihgLWApO2lmKHImJmk9PT1gaGApcmV0dXJuIGUuZmxpcFg9ITAsZTtpZihyJiZpPT09YHZgKXJldHVybiBlLmZsaXBZPSEwLGU7aWYoaT1wYXJzZUZsb2F0KGkpLGlzTmFOKGkpKXJldHVybiBlO3N3aXRjaChyKXtjYXNlYGdyb3dgOmUuc2l6ZSs9aTticmVhaztjYXNlYHNocmlua2A6ZS5zaXplLT1pO2JyZWFrO2Nhc2VgbGVmdGA6ZS54LT1pO2JyZWFrO2Nhc2VgcmlnaHRgOmUueCs9aTticmVhaztjYXNlYHVwYDplLnktPWk7YnJlYWs7Y2FzZWBkb3duYDplLnkrPWk7YnJlYWs7Y2FzZWByb3RhdGVgOmUucm90YXRlKz1pfXJldHVybiBlfSx7c2l6ZToxNix4OjAseTowLGZsaXBYOiExLGZsaXBZOiExLHJvdGF0ZTowfSl9LFZoPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGFyc2U6e3RyYW5zZm9ybTpmdW5jdGlvbihlKXtyZXR1cm4gQmgoZSl9fX19LGhvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS10cmFuc2Zvcm1gKTtyZXR1cm4gbiYmKGUudHJhbnNmb3JtPUJoKG4pKSxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWFpbixuPWUudHJhbnNmb3JtLHI9ZS5jb250YWluZXJXaWR0aCxpPWUuaWNvbldpZHRoLGE9e291dGVyOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke3IvMn0gMjU2KWB9LGlubmVyOnt0cmFuc2Zvcm06YCR7YHRyYW5zbGF0ZSgke24ueCozMn0sICR7bi55KjMyfSkgYH0gJHtgc2NhbGUoJHtuLnNpemUvMTYqKG4uZmxpcFg/LTE6MSl9LCAke24uc2l6ZS8xNioobi5mbGlwWT8tMToxKX0pIGB9ICR7YHJvdGF0ZSgke24ucm90YXRlfSAwIDApYH1gfSxwYXRoOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke2kvMiotMX0gLTI1NilgfX07cmV0dXJue3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGEub3V0ZXIpLGNoaWxkcmVuOlt7dGFnOmBnYCxhdHRyaWJ1dGVzOnEoe30sYS5pbm5lciksY2hpbGRyZW46W3t0YWc6dC5pY29uLnRhZyxjaGlsZHJlbjp0Lmljb24uY2hpbGRyZW4sYXR0cmlidXRlczpxKHEoe30sdC5pY29uLmF0dHJpYnV0ZXMpLGEucGF0aCl9XX1dfX19fSxIaD17eDowLHk6MCx3aWR0aDpgMTAwJWAsaGVpZ2h0OmAxMDAlYH07ZnVuY3Rpb24gVWgoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBlLmF0dHJpYnV0ZXMmJihlLmF0dHJpYnV0ZXMuZmlsbHx8dCkmJihlLmF0dHJpYnV0ZXMuZmlsbD1gYmxhY2tgKSxlfWZ1bmN0aW9uIFdoKGUpe3JldHVybiBlLnRhZz09PWBnYD9lLmNoaWxkcmVuOltlXX1fbShbU3AseWgsYmgseGgsU2gsTGgsemgsVmgse2hvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrYCkscj1uP3NtKG4uc3BsaXQoYCBgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSkpOnRtKCk7cmV0dXJuIHIucHJlZml4fHw9ZW0oKSxlLm1hc2s9cixlLm1hc2tJZD10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrLWlkYCksZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLmdlbmVyYXRlQWJzdHJhY3RNYXNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLm1hc2ssYT1lLm1hc2tJZCxvPWUudHJhbnNmb3JtLHM9ci53aWR0aCxjPXIuaWNvbixsPWkud2lkdGgsdT1pLmljb24sZD1ncCh7dHJhbnNmb3JtOm8sY29udGFpbmVyV2lkdGg6bCxpY29uV2lkdGg6c30pLGY9e3RhZzpgcmVjdGAsYXR0cmlidXRlczpxKHEoe30sSGgpLHt9LHtmaWxsOmB3aGl0ZWB9KX0scD1jLmNoaWxkcmVuP3tjaGlsZHJlbjpjLmNoaWxkcmVuLm1hcChVaCl9Ont9LG09e3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGQuaW5uZXIpLGNoaWxkcmVuOltVaChxKHt0YWc6Yy50YWcsYXR0cmlidXRlczpxKHEoe30sYy5hdHRyaWJ1dGVzKSxkLnBhdGgpfSxwKSldfSxoPXt0YWc6YGdgLGF0dHJpYnV0ZXM6cSh7fSxkLm91dGVyKSxjaGlsZHJlbjpbbV19LGc9YG1hc2stJHthfHxscCgpfWAsXz1gY2xpcC0ke2F8fGxwKCl9YCx2PXt0YWc6YG1hc2tgLGF0dHJpYnV0ZXM6cShxKHt9LEhoKSx7fSx7aWQ6ZyxtYXNrVW5pdHM6YHVzZXJTcGFjZU9uVXNlYCxtYXNrQ29udGVudFVuaXRzOmB1c2VyU3BhY2VPblVzZWB9KSxjaGlsZHJlbjpbZixoXX0seT17dGFnOmBkZWZzYCxjaGlsZHJlbjpbe3RhZzpgY2xpcFBhdGhgLGF0dHJpYnV0ZXM6e2lkOl99LGNoaWxkcmVuOldoKHUpfSx2XX07cmV0dXJuIHQucHVzaCh5LHt0YWc6YHJlY3RgLGF0dHJpYnV0ZXM6cSh7ZmlsbDpgY3VycmVudENvbG9yYCwiY2xpcC1wYXRoIjpgdXJsKCMke199KWAsbWFzazpgdXJsKCMke2d9KWB9LEhoKX0pLHtjaGlsZHJlbjp0LGF0dHJpYnV0ZXM6bn19fX0se3Byb3ZpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PSExO3F1Lm1hdGNoTWVkaWEmJih0PXF1Lm1hdGNoTWVkaWEoYChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpYCkubWF0Y2hlcyksZS5taXNzaW5nSWNvbkFic3RyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9W10sbj17ZmlsbDpgY3VycmVudENvbG9yYH0scj17YXR0cmlidXRlVHlwZTpgWE1MYCxyZXBlYXRDb3VudDpgaW5kZWZpbml0ZWAsZHVyOmAyc2B9O2UucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7ZDpgTTE1Ni41LDQ0Ny43bC0xMi42LDI5LjVjLTE4LjctOS41LTM1LjktMjEuMi01MS41LTM0LjlsMjIuNy0yMi43QzEyNy42LDQzMC41LDE0MS41LDQ0MCwxNTYuNSw0NDcuN3ogTTQwLjYsMjcySDguNSBjMS40LDIxLjIsNS40LDQxLjcsMTEuNyw2MS4xTDUwLDMyMS4yQzQ1LjEsMzA1LjUsNDEuOCwyODksNDAuNiwyNzJ6IE00MC42LDI0MGMxLjQtMTguOCw1LjItMzcsMTEuMS01NC4xbC0yOS41LTEyLjYgQzE0LjcsMTk0LjMsMTAsMjE2LjcsOC41LDI0MEg0MC42eiBNNjQuMywxNTYuNWM3LjgtMTQuOSwxNy4yLTI4LjgsMjguMS00MS41TDY5LjcsOTIuM2MtMTMuNywxNS42LTI1LjUsMzIuOC0zNC45LDUxLjUgTDY0LjMsMTU2LjV6IE0zOTcsNDE5LjZjLTEzLjksMTItMjkuNCwyMi4zLTQ2LjEsMzAuNGwxMS45LDI5LjhjMjAuNy05LjksMzkuOC0yMi42LDU2LjktMzcuNkwzOTcsNDE5LjZ6IE0xMTUsOTIuNCBjMTMuOS0xMiwyOS40LTIyLjMsNDYuMS0zMC40bC0xMS45LTI5LjhjLTIwLjcsOS45LTM5LjgsMjIuNi01Ni44LDM3LjZMMTE1LDkyLjR6IE00NDcuNywzNTUuNWMtNy44LDE0LjktMTcuMiwyOC44LTI4LjEsNDEuNSBsMjIuNywyMi43YzEzLjctMTUuNiwyNS41LTMyLjksMzQuOS01MS41TDQ0Ny43LDM1NS41eiBNNDcxLjQsMjcyYy0xLjQsMTguOC01LjIsMzctMTEuMSw1NC4xbDI5LjUsMTIuNiBjNy41LTIxLjEsMTIuMi00My41LDEzLjYtNjYuOEg0NzEuNHogTTMyMS4yLDQ2MmMtMTUuNyw1LTMyLjIsOC4yLTQ5LjIsOS40djMyLjFjMjEuMi0xLjQsNDEuNy01LjQsNjEuMS0xMS43TDMyMS4yLDQ2MnogTTI0MCw0NzEuNGMtMTguOC0xLjQtMzctNS4yLTU0LjEtMTEuMWwtMTIuNiwyOS41YzIxLjEsNy41LDQzLjUsMTIuMiw2Ni44LDEzLjZWNDcxLjR6IE00NjIsMTkwLjhjNSwxNS43LDguMiwzMi4yLDkuNCw0OS4yaDMyLjEgYy0xLjQtMjEuMi01LjQtNDEuNy0xMS43LTYxLjFMNDYyLDE5MC44eiBNOTIuNCwzOTdjLTEyLTEzLjktMjIuMy0yOS40LTMwLjQtNDYuMWwtMjkuOCwxMS45YzkuOSwyMC43LDIyLjYsMzkuOCwzNy42LDU2LjkgTDkyLjQsMzk3eiBNMjcyLDQwLjZjMTguOCwxLjQsMzYuOSw1LjIsNTQuMSwxMS4xbDEyLjYtMjkuNUMzMTcuNywxNC43LDI5NS4zLDEwLDI3Miw4LjVWNDAuNnogTTE5MC44LDUwIGMxNS43LTUsMzIuMi04LjIsNDkuMi05LjRWOC41Yy0yMS4yLDEuNC00MS43LDUuNC02MS4xLDExLjdMMTkwLjgsNTB6IE00NDIuMyw5Mi4zTDQxOS42LDExNWMxMiwxMy45LDIyLjMsMjkuNCwzMC41LDQ2LjEgbDI5LjgtMTEuOUM0NzAsMTI4LjUsNDU3LjMsMTA5LjQsNDQyLjMsOTIuM3ogTTM5Nyw5Mi40bDIyLjctMjIuN2MtMTUuNi0xMy43LTMyLjgtMjUuNS01MS41LTM0LjlsLTEyLjYsMjkuNSBDMzcwLjQsNzIuMSwzODQuNCw4MS41LDM5Nyw5Mi40emB9KX0pO3ZhciBpPXEocSh7fSxyKSx7fSx7YXR0cmlidXRlTmFtZTpgb3BhY2l0eWB9KSxhPXt0YWc6YGNpcmNsZWAsYXR0cmlidXRlczpxKHEoe30sbikse30se2N4OmAyNTZgLGN5OmAzNjRgLHI6YDI4YH0pLGNoaWxkcmVuOltdfTtyZXR1cm4gdHx8YS5jaGlsZHJlbi5wdXNoKHt0YWc6YGFuaW1hdGVgLGF0dHJpYnV0ZXM6cShxKHt9LHIpLHt9LHthdHRyaWJ1dGVOYW1lOmByYCx2YWx1ZXM6YDI4OzE0OzI4OzI4OzE0OzI4O2B9KX0se3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMTswOzE7MTswOzE7YH0pfSksZS5wdXNoKGEpLGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMWAsZDpgTTI2My43LDMxMmgtMTZjLTYuNiwwLTEyLTUuNC0xMi0xMmMwLTcxLDc3LjQtNjMuOSw3Ny40LTEwNy44YzAtMjAtMTcuOC00MC4yLTU3LjQtNDAuMmMtMjkuMSwwLTQ0LjMsOS42LTU5LjIsMjguNyBjLTMuOSw1LTExLjEsNi0xNi4yLDIuNGwtMTMuMS05LjJjLTUuNi0zLjktNi45LTExLjgtMi42LTE3LjJjMjEuMi0yNy4yLDQ2LjQtNDQuNyw5MS4yLTQ0LjdjNTIuMywwLDk3LjQsMjkuOCw5Ny40LDgwLjIgYzAsNjcuNi03Ny40LDYzLjUtNzcuNCwxMDcuOEMyNzUuNywzMDYuNiwyNzAuMywzMTIsMjYzLjcsMzEyemB9KSxjaGlsZHJlbjp0P1tdOlt7dGFnOmBhbmltYXRlYCxhdHRyaWJ1dGVzOnEocSh7fSxpKSx7fSx7dmFsdWVzOmAxOzA7MDswOzA7MTtgfSl9XX0pLHR8fGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMGAsZDpgTTIzMi41LDEzNC41bDcsMTY4YzAuMyw2LjQsNS42LDExLjUsMTIsMTEuNWg5YzYuNCwwLDExLjctNS4xLDEyLTExLjVsNy0xNjhjMC4zLTYuOC01LjItMTIuNS0xMi0xMi41aC0yMyBDMjM3LjcsMTIyLDIzMi4yLDEyNy43LDIzMi41LDEzNC41emB9KSxjaGlsZHJlbjpbe3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMDswOzE7MTswOzA7YH0pfV19KSx7dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgbWlzc2luZ2B9LGNoaWxkcmVuOmV9fX19LHtob29rczpmdW5jdGlvbigpe3JldHVybntwYXJzZU5vZGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYGRhdGEtZmEtc3ltYm9sYCk7cmV0dXJuIGUuc3ltYm9sPW49PT1udWxsPyExOm49PT1gYHx8bixlfX19fV0se21peG91dHNUbzpDbX0pLENtLm5vQXV0byxDbS5jb25maWcsQ20ubGlicmFyeSxDbS5kb207dmFyIEdoPUNtLnBhcnNlO0NtLmZpbmRJY29uRGVmaW5pdGlvbixDbS50b0h0bWw7dmFyIEtoPUNtLmljb247Q20ubGF5ZXIsQ20udGV4dCxDbS5jb3VudGVyO2Z1bmN0aW9uIHFoKGUsdCl7KHQ9PW51bGx8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBKaChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxaChlKX1mdW5jdGlvbiBZaChlLHQsbil7cmV0dXJuKHQ9aWcodCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gWGgoZSl7aWYodHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVtgQEBpdGVyYXRvcmBdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIFpoKCl7dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFFoKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gJGgoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/UWgoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1loKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlFoKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KX1yZXR1cm4gZX1mdW5jdGlvbiBlZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG4scixpPXRnKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iocj0wO3I8YS5sZW5ndGg7cisrKW49YVtyXSx0LmluZGV4T2Yobik9PT0tMSYme30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYoaVtuXT1lW25dKX1yZXR1cm4gaX1mdW5jdGlvbiB0ZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e307Zm9yKHZhciByIGluIGUpaWYoe30uaGFzT3duUHJvcGVydHkuY2FsbChlLHIpKXtpZih0LmluZGV4T2YocikhPT0tMSljb250aW51ZTtuW3JdPWVbcl19cmV0dXJuIG59ZnVuY3Rpb24gbmcoZSl7cmV0dXJuIEpoKGUpfHxYaChlKXx8b2coZSl8fFpoKCl9ZnVuY3Rpb24gcmcoZSx0KXtpZih0eXBlb2YgZSE9YG9iamVjdGB8fCFlKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHxgZGVmYXVsdGApO2lmKHR5cGVvZiByIT1gb2JqZWN0YClyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoYEBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuYCl9cmV0dXJuKHQ9PT1gc3RyaW5nYD9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBpZyhlKXt2YXIgdD1yZyhlLGBzdHJpbmdgKTtyZXR1cm4gdHlwZW9mIHQ9PWBzeW1ib2xgP3Q6dCtgYH1mdW5jdGlvbiBhZyhlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBhZz10eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT1gc3ltYm9sYD9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT9gc3ltYm9sYDp0eXBlb2YgZX0sYWcoZSl9ZnVuY3Rpb24gb2coZSx0KXtpZihlKXtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIHFoKGUsdCk7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4gbj09PWBPYmplY3RgJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT1gTWFwYHx8bj09PWBTZXRgP0FycmF5LmZyb20oZSk6bj09PWBBcmd1bWVudHNgfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9xaChlLHQpOnZvaWQgMH19ZnVuY3Rpb24gc2coZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MHx8IUFycmF5LmlzQXJyYXkodCkmJnQ/WWgoe30sZSx0KTp7fX1mdW5jdGlvbiBjZyhlKXt2YXIgdCxuPSh0PXsiZmEtc3BpbiI6ZS5zcGluLCJmYS1wdWxzZSI6ZS5wdWxzZSwiZmEtZnciOmUuZml4ZWRXaWR0aCwiZmEtYm9yZGVyIjplLmJvcmRlciwiZmEtbGkiOmUubGlzdEl0ZW0sImZhLWludmVyc2UiOmUuaW52ZXJzZSwiZmEtZmxpcCI6ZS5mbGlwPT09ITAsImZhLWZsaXAtaG9yaXpvbnRhbCI6ZS5mbGlwPT09YGhvcml6b250YWxgfHxlLmZsaXA9PT1gYm90aGAsImZhLWZsaXAtdmVydGljYWwiOmUuZmxpcD09PWB2ZXJ0aWNhbGB8fGUuZmxpcD09PWBib3RoYH0sWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgodCxgZmEtJHtlLnNpemV9YCxlLnNpemUhPT1udWxsKSxgZmEtcm90YXRlLSR7ZS5yb3RhdGlvbn1gLGUucm90YXRpb24hPT1udWxsKSxgZmEtcm90YXRlLWJ5YCxlLnJvdGF0ZUJ5KSxgZmEtcHVsbC0ke2UucHVsbH1gLGUucHVsbCE9PW51bGwpLGBmYS1zd2FwLW9wYWNpdHlgLGUuc3dhcE9wYWNpdHkpLGBmYS1ib3VuY2VgLGUuYm91bmNlKSxgZmEtc2hha2VgLGUuc2hha2UpLGBmYS1iZWF0YCxlLmJlYXQpLGBmYS1mYWRlYCxlLmZhZGUpLGBmYS1iZWF0LWZhZGVgLGUuYmVhdEZhZGUpLFloKFloKFloKFloKFloKFloKFloKFloKFloKFloKHQsYGZhLWZsYXNoYCxlLmZsYXNoKSxgZmEtc3Bpbi1wdWxzZWAsZS5zcGluUHVsc2UpLGBmYS1zcGluLXJldmVyc2VgLGUuc3BpblJldmVyc2UpLGBmYS13aWR0aC1hdXRvYCxlLndpZHRoQXV0byksYGZhLWNhbnZhcy1zcXVhcmVgLGUuY2FudmFzU3F1YXJlKSxgZmEtY2FudmFzLXJvb215YCxlLmNhbnZhc1Jvb215KSxgZmEtZmxpcC0zNjBgLGUuZmxpcDM2MCksYGZhLWJ1enpgLGUuYnV6eiksYGZhLWZsb2F0YCxlLmZsb2F0KSxgZmEtamVsbG9gLGUuamVsbG8pLFloKFloKFloKFloKFloKHQsYGZhLXNwaW4tc25hcGAsZS5zcGluU25hcCksYGZhLXNwaW4tc25hcC00YCxlLnNwaW5TbmFwNCksYGZhLXNwaW4tc25hcC04YCxlLnNwaW5TbmFwOCksYGZhLXN3aW5nYCxlLnN3aW5nKSxgZmEtd2FnYCxlLndhZykpO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV0/ZTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9dmFyIGxnPXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6dHlwZW9mIHNlbGY8YHVgP3NlbGY6e30sdWc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7dmFyIG49ZnVuY3Rpb24oZSx0LHIpe2lmKCFsKHQpfHxkKHQpfHxmKHQpfHxwKHQpfHxjKHQpKXJldHVybiB0O3ZhciBpLGE9MCxvPTA7aWYodSh0KSlmb3IoaT1bXSxvPXQubGVuZ3RoO2E8bzthKyspaS5wdXNoKG4oZSx0W2FdLHIpKTtlbHNlIGZvcih2YXIgcyBpbiBpPXt9LHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihpW2UocyxyKV09bihlLHRbc10scikpO3JldHVybiBpfSxyPWZ1bmN0aW9uKGUsdCl7dHx8PXt9O3ZhciBuPXQuc2VwYXJhdG9yfHxgX2Ascj10LnNwbGl0fHwvKD89W0EtWl0pLztyZXR1cm4gZS5zcGxpdChyKS5qb2luKG4pfSxpPWZ1bmN0aW9uKGUpe3JldHVybiBtKGUpP2U6KGU9ZS5yZXBsYWNlKC9bXC1fXHNdKyguKT8vZyxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKTpgYH0pLGUuc3Vic3RyKDAsMSkudG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKSl9LGE9ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtyZXR1cm4gdC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpfSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSx0KS50b0xvd2VyQ2FzZSgpfSxzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBmdW5jdGlvbmB9LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1PYmplY3QoZSl9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQXJyYXldYH0sZD1mdW5jdGlvbihlKXtyZXR1cm4gcy5jYWxsKGUpPT1gW29iamVjdCBEYXRlXWB9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgUmVnRXhwXWB9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQm9vbGVhbl1gfSxtPWZ1bmN0aW9uKGUpe3JldHVybiBlLT0wLGU9PT1lfSxoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmYHByb2Nlc3NgaW4gdD90LnByb2Nlc3M6dDtyZXR1cm4gdHlwZW9mIG49PWBmdW5jdGlvbmA/ZnVuY3Rpb24odCxyKXtyZXR1cm4gbih0LGUscil9OmV9LGc9e2NhbWVsaXplOmksZGVjYW1lbGl6ZTpvLHBhc2NhbGl6ZTphLGRlcGFzY2FsaXplOm8sY2FtZWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChpLHQpLGUpfSxkZWNhbWVsaXplS2V5czpmdW5jdGlvbihlLHQpe3JldHVybiBuKGgobyx0KSxlLHQpfSxwYXNjYWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChhLHQpLGUpfSxkZXBhc2NhbGl6ZUtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNhbWVsaXplS2V5cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtlLmV4cG9ydHM/ZS5leHBvcnRzPWc6dC5odW1wcz1nfSkobGcpfSkodWcpO3ZhciBkZz11Zy5leHBvcnRzLGZnPVtgZ3JhZGllbnRGaWxsYF0scGc9W2BjbGFzc2AsYHN0eWxlYF0sbWc9W2B0eXBlYCxgc3RvcHNgLGBpZGBdO2Z1bmN0aW9uIGhnKGUpe3JldHVybiBlLnNwbGl0KGA7YCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQuaW5kZXhPZihgOmApLHI9ZGcuY2FtZWxpemUodC5zbGljZSgwLG4pKTtyZXR1cm4gZVtyXT10LnNsaWNlKG4rMSkudHJpbSgpLGV9LHt9KX1mdW5jdGlvbiBnZyhlKXtyZXR1cm4gZS5zcGxpdCgvXHMrLykucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09ITAsZX0se30pfWZ1bmN0aW9uIF9nKGUsdCl7cmV0dXJuIEcoYHN0b3BgLCRoKHtrZXk6YCR7dH0tJHtlLm9mZnNldH1gLG9mZnNldDplLm9mZnNldCwic3RvcC1jb2xvciI6ZS5jb2xvcn0sZS5vcGFjaXR5IT09dm9pZCAwJiZ7InN0b3Atb3BhY2l0eSI6ZS5vcGFjaXR5fSkpfWZ1bmN0aW9uIHZnKGUpe2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTt2YXIgdD0oZS5jaGlsZHJlbnx8W10pLm1hcCh2Zyk7cmV0dXJuIGUudGFnPT09YHBhdGhgJiZlLmF0dHJpYnV0ZXMmJmBmaWxsYGluIGUuYXR0cmlidXRlcz8kaCgkaCh7fSxlKSx7fSx7YXR0cmlidXRlczokaCgkaCh7fSxlLmF0dHJpYnV0ZXMpLHt9LHtmaWxsOnZvaWQgMH0pLGNoaWxkcmVuOnR9KTokaCgkaCh7fSxlKSx7fSx7Y2hpbGRyZW46dH0pfWZ1bmN0aW9uIHlnKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGU7dmFyIHI9dC5ncmFkaWVudEZpbGwsaT1yPT09dm9pZCAwP251bGw6cixhPWVnKHQsZmcpLG89aXx8YGZpbGxgaW4gbj92ZyhlKTplLHM9KG8uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHlnKGUse30se30pfSksYz1PYmplY3Qua2V5cyhvLmF0dHJpYnV0ZXN8fHt9KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmF0dHJpYnV0ZXNbdF07c3dpdGNoKHQpe2Nhc2VgY2xhc3NgOmUuY2xhc3M9Z2cobik7YnJlYWs7Y2FzZWBzdHlsZWA6ZS5zdHlsZT1oZyhuKTticmVhaztkZWZhdWx0OmUuYXR0cnNbdF09bn1yZXR1cm4gZX0se2F0dHJzOnt9LGNsYXNzOnt9LHN0eWxlOnt9fSk7bi5jbGFzczt2YXIgbD1uLnN0eWxlLHU9bD09PXZvaWQgMD97fTpsLGQ9ZWcobixwZyk7aWYoaSYmaS5pZCYmKGkudHlwZT09PWBsaW5lYXJgfHxpLnR5cGU9PT1gcmFkaWFsYCkpe3ZhciBmPWkudHlwZSxwPWkuc3RvcHMsbT1wPT09dm9pZCAwP1tdOnAsaD1pLmlkLGc9ZWcoaSxtZyksXz1HKGY9PT1gbGluZWFyYD9gbGluZWFyR3JhZGllbnRgOmByYWRpYWxHcmFkaWVudGAsJGgoJGgoe30sZykse30se2lkOmh9KSxtLm1hcChfZykpO3JldHVybiBHKG8udGFnLCRoKCRoKCRoKCRoKHt9LGEpLHt9LHtjbGFzczpjLmNsYXNzLHN0eWxlOiRoKCRoKHt9LGMuc3R5bGUpLHUpfSxjLmF0dHJzKSxkKSx7fSx7ZmlsbDpgdXJsKCMke2h9KWB9KSxbX10uY29uY2F0KG5nKHMpKSl9cmV0dXJuIEcoZS50YWcsJGgoJGgoJGgoe30sYSkse30se2NsYXNzOmMuY2xhc3Msc3R5bGU6JGgoJGgoe30sYy5zdHlsZSksdSl9LGMuYXR0cnMpLGQpLHMpfXZhciBiZz0hMTt0cnl7Ymc9ITB9Y2F0Y2h7fWZ1bmN0aW9uIHhnKCl7aWYoIWJnJiZjb25zb2xlJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09YGZ1bmN0aW9uYCl7dmFyIGU7KGU9Y29uc29sZSkuZXJyb3IuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBTZyhlKXtpZihlJiZhZyhlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSYmZS5pY29uKXJldHVybiBlO2lmKEdoLmljb24pcmV0dXJuIEdoLmljb24oZSk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7aWYoYWcoZSk9PT1gb2JqZWN0YCYmZS5wcmVmaXgmJmUuaWNvbk5hbWUpcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg9PT0yKXJldHVybntwcmVmaXg6ZVswXSxpY29uTmFtZTplWzFdfTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJue3ByZWZpeDpgZmFzYCxpY29uTmFtZTplfX12YXIgQ2c9Rih7bmFtZTpgRm9udEF3ZXNvbWVJY29uYCxwcm9wczp7Ym9yZGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZml4ZWRXaWR0aDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsaXA6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bITAsITEsYGhvcml6b250YWxgLGB2ZXJ0aWNhbGAsYGJvdGhgXS5pbmRleE9mKGUpPi0xfX0saWNvbjp7dHlwZTpbT2JqZWN0LEFycmF5LFN0cmluZ10scmVxdWlyZWQ6ITB9LG1hc2s6e3R5cGU6W09iamVjdCxBcnJheSxTdHJpbmddLGRlZmF1bHQ6bnVsbH0sbWFza0lkOnt0eXBlOlN0cmluZyxkZWZhdWx0Om51bGx9LGxpc3RJdGVtOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0scHVsbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYHJpZ2h0YCxgbGVmdGBdLmluZGV4T2YoZSk+LTF9fSxwdWxzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHJvdGF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybls5MCwxODAsMjcwXS5pbmRleE9mKE51bWJlci5wYXJzZUludChlLDEwKSk+LTF9fSxyb3RhdGVCeTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3YXBPcGFjaXR5Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYDJ4c2AsYHhzYCxgc21gLGBsZ2AsYHhsYCxgMnhsYCxgMXhgLGAyeGAsYDN4YCxgNHhgLGA1eGAsYDZ4YCxgN3hgLGA4eGAsYDl4YCxgMTB4YF0uaW5kZXhPZihlKT4tMX19LHNwaW46e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx0cmFuc2Zvcm06e3R5cGU6W1N0cmluZyxPYmplY3RdLGRlZmF1bHQ6bnVsbH0sc3ltYm9sOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbH0sdGl0bGVJZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsfSxpbnZlcnNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm91bmNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2hha2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxiZWF0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmFkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJlYXRGYWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmxhc2g6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUHVsc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUmV2ZXJzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHdpZHRoQXV0bzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1NxdWFyZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1Jvb215Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZ3JhZGllbnRGaWxsOnt0eXBlOk9iamVjdCxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZS5pZCE9YHN0cmluZ2B8fCFlLmlkPyhjb25zb2xlLndhcm4oYEZvbnRBd2Vzb21lSWNvbjogZ3JhZGllbnRGaWxsLmlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCksITEpOmUudHlwZSE9PWBsaW5lYXJgJiZlLnR5cGUhPT1gcmFkaWFsYD8oY29uc29sZS53YXJuKGBGb250QXdlc29tZUljb246IGdyYWRpZW50RmlsbC50eXBlIG11c3QgYmUgImxpbmVhciIgb3IgInJhZGlhbCJgKSwhMSk6ITB9fSxmbGlwMzYwOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYnV6ejp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsb2F0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0samVsbG86e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluU25hcDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwNDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwODp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3aW5nOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sd2FnOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LHNldHVwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5hdHRycyxyPVcoZnVuY3Rpb24oKXtyZXR1cm4gU2coZS5pY29uKX0pLGk9VyhmdW5jdGlvbigpe3JldHVybiBzZyhgY2xhc3Nlc2AsY2coZSkpfSksYT1XKGZ1bmN0aW9uKCl7cmV0dXJuIHNnKGB0cmFuc2Zvcm1gLHR5cGVvZiBlLnRyYW5zZm9ybT09YHN0cmluZ2A/R2gudHJhbnNmb3JtKGUudHJhbnNmb3JtKTplLnRyYW5zZm9ybSl9KSxvPVcoZnVuY3Rpb24oKXtyZXR1cm4gc2coYG1hc2tgLFNnKGUubWFzaykpfSkscz1XKGZ1bmN0aW9uKCl7dmFyIHQ9JGgoJGgoJGgoJGgoe30saS52YWx1ZSksYS52YWx1ZSksby52YWx1ZSkse30se3N5bWJvbDplLnN5bWJvbCxtYXNrSWQ6ZS5tYXNrSWR9KTtyZXR1cm4gdC50aXRsZT1lLnRpdGxlLHQudGl0bGVJZD1lLnRpdGxlSWQsS2goci52YWx1ZSx0KX0pO0VyKHMsZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIHhnKGBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBpY29uKHMpYCxyLnZhbHVlLG8udmFsdWUpfSx7aW1tZWRpYXRlOiEwfSksZS5ncmFkaWVudEZpbGwmJmUuc3ltYm9sJiZ4ZyhgZ3JhZGllbnRGaWxsIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBzeW1ib2wgaXMgdHJ1ZSBhbmQgd2lsbCBiZSBpZ25vcmVkYCk7dmFyIGM9VyhmdW5jdGlvbigpe3JldHVybiBzLnZhbHVlP3lnKHMudmFsdWUuYWJzdHJhY3RbMF0se2dyYWRpZW50RmlsbDplLnN5bWJvbD9udWxsOmUuZ3JhZGllbnRGaWxsfSxuKTpudWxsfSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMudmFsdWV9fX0pLHdnPXR5cGVvZiB3aW5kb3c8YHVgLFRnLEVnPWU9PlRnPWUsRGc9U3ltYm9sKCk7ZnVuY3Rpb24gT2coZSl7cmV0dXJuIGUmJnR5cGVvZiBlPT1gb2JqZWN0YCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAmJnR5cGVvZiBlLnRvSlNPTiE9YGZ1bmN0aW9uYH12YXIga2c9dHlwZW9mIHdpbmRvdz09YG9iamVjdGAmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93OnR5cGVvZiBzZWxmPT1gb2JqZWN0YCYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOnR5cGVvZiBnbG9iYWw9PWBvYmplY3RgJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp0eXBlb2YgZ2xvYmFsVGhpcz09YG9iamVjdGA/Z2xvYmFsVGhpczp7SFRNTEVsZW1lbnQ6bnVsbH07ZnVuY3Rpb24gQWcoZSx7YXV0b0JvbTp0PSExfT17fSl7cmV0dXJuIHQmJi9eXHMqKD86dGV4dFwvXFMqfGFwcGxpY2F0aW9uXC94bWx8XFMqXC9cUypcK3htbClccyo7LipjaGFyc2V0XHMqPVxzKnV0Zi04L2kudGVzdChlLnR5cGUpP25ldyBCbG9iKFtg77u/YCxlXSx7dHlwZTplLnR5cGV9KTplfWZ1bmN0aW9uIGpnKGUsdCxuKXtsZXQgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKGBHRVRgLGUpLHIucmVzcG9uc2VUeXBlPWBibG9iYCxyLm9ubG9hZD1mdW5jdGlvbigpe0lnKHIucmVzcG9uc2UsdCxuKX0sci5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihgY291bGQgbm90IGRvd25sb2FkIGZpbGVgKX0sci5zZW5kKCl9ZnVuY3Rpb24gTWcoZSl7bGV0IHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3Qub3BlbihgSEVBRGAsZSwhMSk7dHJ5e3Quc2VuZCgpfWNhdGNoe31yZXR1cm4gdC5zdGF0dXM+PTIwMCYmdC5zdGF0dXM8PTI5OX1mdW5jdGlvbiBOZyhlKXt0cnl7ZS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KGBjbGlja2ApKX1jYXRjaHtsZXQgdD1uZXcgTW91c2VFdmVudChgY2xpY2tgLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsdmlldzp3aW5kb3csZGV0YWlsOjAsc2NyZWVuWDo4MCxzY3JlZW5ZOjIwLGNsaWVudFg6ODAsY2xpZW50WToyMCxjdHJsS2V5OiExLGFsdEtleTohMSxzaGlmdEtleTohMSxtZXRhS2V5OiExLGJ1dHRvbjowLHJlbGF0ZWRUYXJnZXQ6bnVsbH0pO2UuZGlzcGF0Y2hFdmVudCh0KX19dmFyIFBnPXR5cGVvZiBuYXZpZ2F0b3I9PWBvYmplY3RgP25hdmlnYXRvcjp7dXNlckFnZW50OmBgfSxGZz0vTWFjaW50b3NoLy50ZXN0KFBnLnVzZXJBZ2VudCkmJi9BcHBsZVdlYktpdC8udGVzdChQZy51c2VyQWdlbnQpJiYhL1NhZmFyaS8udGVzdChQZy51c2VyQWdlbnQpLElnPXdnP3R5cGVvZiBIVE1MQW5jaG9yRWxlbWVudDxgdWAmJmBkb3dubG9hZGBpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFGZz9MZzpgbXNTYXZlT3JPcGVuQmxvYmBpbiBQZz9SZzp6ZzooKT0+e307ZnVuY3Rpb24gTGcoZSx0PWBkb3dubG9hZGAsbil7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgYWApO3IuZG93bmxvYWQ9dCxyLnJlbD1gbm9vcGVuZXJgLHR5cGVvZiBlPT1gc3RyaW5nYD8oci5ocmVmPWUsci5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/Tmcocik6TWcoci5ocmVmKT9qZyhlLHQsbik6KHIudGFyZ2V0PWBfYmxhbmtgLE5nKHIpKSk6KHIuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtVUkwucmV2b2tlT2JqZWN0VVJMKHIuaHJlZil9LDRlNCksc2V0VGltZW91dChmdW5jdGlvbigpe05nKHIpfSwwKSl9ZnVuY3Rpb24gUmcoZSx0PWBkb3dubG9hZGAsbil7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXtpZihNZyhlKSlqZyhlLHQsbik7ZWxzZXtsZXQgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBhYCk7dC5ocmVmPWUsdC50YXJnZXQ9YF9ibGFua2Asc2V0VGltZW91dChmdW5jdGlvbigpe05nKHQpfSl9fWVsc2UgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoQWcoZSxuKSx0KX1mdW5jdGlvbiB6ZyhlLHQsbixyKXtpZihyfHw9b3BlbihgYCxgX2JsYW5rYCksciYmKHIuZG9jdW1lbnQudGl0bGU9ci5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1gZG93bmxvYWRpbmcuLi5gKSx0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGpnKGUsdCxuKTtsZXQgaT1lLnR5cGU9PT1gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtYCxhPS9jb25zdHJ1Y3Rvci9pLnRlc3QoU3RyaW5nKGtnLkhUTUxFbGVtZW50KSl8fGBzYWZhcmlgaW4ga2csbz0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChvfHxpJiZhfHxGZykmJnR5cGVvZiBGaWxlUmVhZGVyPGB1YCl7bGV0IHQ9bmV3IEZpbGVSZWFkZXI7dC5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXtsZXQgZT10LnJlc3VsdDtpZih0eXBlb2YgZSE9YHN0cmluZ2ApdGhyb3cgcj1udWxsLEVycm9yKGBXcm9uZyByZWFkZXIucmVzdWx0IHR5cGVgKTtlPW8/ZTplLnJlcGxhY2UoL15kYXRhOlteO10qOy8sYGRhdGE6YXR0YWNobWVudC9maWxlO2ApLHI/ci5sb2NhdGlvbi5ocmVmPWU6bG9jYXRpb24uYXNzaWduKGUpLHI9bnVsbH0sdC5yZWFkQXNEYXRhVVJMKGUpfWVsc2V7bGV0IHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChlKTtyP3IubG9jYXRpb24uYXNzaWduKHQpOmxvY2F0aW9uLmhyZWY9dCxyPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe1VSTC5yZXZva2VPYmplY3RVUkwodCl9LDRlNCl9fXZhcnthc3NpZ246Qmd9PU9iamVjdDtmdW5jdGlvbiBWZygpe2xldCBlPVBlKCEwKSx0PWUucnVuKCgpPT5NKHt9KSksbj1bXSxyPVtdLGk9c24oe2luc3RhbGwoZSl7RWcoaSksaS5fYT1lLGUucHJvdmlkZShEZyxpKSxlLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRwaW5pYT1pLHIuZm9yRWFjaChlPT5uLnB1c2goZSkpLHI9W119LHVzZShlKXtyZXR1cm4gdGhpcy5fYT9uLnB1c2goZSk6ci5wdXNoKGUpLHRoaXN9LF9wOm4sX2E6bnVsbCxfZTplLF9zOm5ldyBNYXAsc3RhdGU6dH0pO3JldHVybiBpfXZhciBIZz0oKT0+e307ZnVuY3Rpb24gVWcoZSx0LG4scj1IZyl7ZS5hZGQodCk7bGV0IGk9KCk9PntlLmRlbGV0ZSh0KSYmcigpfTtyZXR1cm4hbiYmRmUoKSYmSWUoaSksaX1mdW5jdGlvbiBXZyhlLC4uLnQpe2UuZm9yRWFjaChlPT57ZSguLi50KX0pfXZhciBHZz1lPT5lKCksS2c9U3ltYm9sKCkscWc9U3ltYm9sKCk7ZnVuY3Rpb24gSmcoZSx0KXtlIGluc3RhbmNlb2YgTWFwJiZ0IGluc3RhbmNlb2YgTWFwP3QuZm9yRWFjaCgodCxuKT0+ZS5zZXQobix0KSk6ZSBpbnN0YW5jZW9mIFNldCYmdCBpbnN0YW5jZW9mIFNldCYmdC5mb3JFYWNoKGUuYWRkLGUpO2ZvcihsZXQgbiBpbiB0KXtpZighT2JqZWN0Lmhhc093bih0LG4pKWNvbnRpbnVlO2xldCByPXRbbl0saT1lW25dO2Vbbl09T2coaSkmJk9nKHIpJiZPYmplY3QuaGFzT3duKGUsbikmJiFqKHIpJiYhbm4ocik/SmcoaSxyKTpyfXJldHVybiBlfXZhciBZZz1TeW1ib2woKTtmdW5jdGlvbiBYZyhlKXtyZXR1cm4hZXx8dHlwZW9mIGUhPWBvYmplY3RgfHwhT2JqZWN0Lmhhc093bihlLFlnKX12YXJ7YXNzaWduOlpnfT1PYmplY3Q7ZnVuY3Rpb24gUWcoZSl7cmV0dXJuISEoaihlKSYmZS5lZmZlY3QpfWZ1bmN0aW9uICRnKGUsdCxuLHIpe2xldHtzdGF0ZTppLGFjdGlvbnM6YSxnZXR0ZXJzOm99PXQscz1uLnN0YXRlLnZhbHVlW2VdLGM7ZnVuY3Rpb24gbCgpe3JldHVybiBzfHwobi5zdGF0ZS52YWx1ZVtlXT1pP2koKTp7fSksWmcoeW4obi5zdGF0ZS52YWx1ZVtlXSksYSxPYmplY3Qua2V5cyhvfHx7fSkucmVkdWNlKCh0LHIpPT4odFtyXT1zbihXKCgpPT57RWcobik7bGV0IHQ9bi5fcy5nZXQoZSk7cmV0dXJuIG9bcl0uY2FsbCh0LHQpfSkpLHQpLHt9KSl9cmV0dXJuIGM9ZV8oZSxsLHQsbixyLCEwKSxjfWZ1bmN0aW9uIGVfKGUsdCxuPXt9LHIsaSxhKXtsZXQgbyxzPVpnKHthY3Rpb25zOnt9fSxuKSxjPXtkZWVwOiEwfSxsLHUsZD1uZXcgU2V0LGY9bmV3IFNldCxwLG09ci5zdGF0ZS52YWx1ZVtlXTshYSYmIW0mJihyLnN0YXRlLnZhbHVlW2VdPXt9KTtsZXQgaDtmdW5jdGlvbiBnKHQpe2xldCBuO2w9dT0hMSx0eXBlb2YgdD09YGZ1bmN0aW9uYD8odChyLnN0YXRlLnZhbHVlW2VdKSxuPXt0eXBlOmBwYXRjaCBmdW5jdGlvbmAsc3RvcmVJZDplLGV2ZW50czpwfSk6KEpnKHIuc3RhdGUudmFsdWVbZV0sdCksbj17dHlwZTpgcGF0Y2ggb2JqZWN0YCxwYXlsb2FkOnQsc3RvcmVJZDplLGV2ZW50czpwfSk7bGV0IGk9aD1TeW1ib2woKTtRbigpLnRoZW4oKCk9PntoPT09aSYmKGw9ITApfSksdT0hMCxXZyhkLG4sci5zdGF0ZS52YWx1ZVtlXSl9bGV0IF89YT9mdW5jdGlvbigpe2xldHtzdGF0ZTplfT1uLHQ9ZT9lKCk6e307dGhpcy4kcGF0Y2goZT0+e1pnKGUsdCl9KX06SGc7ZnVuY3Rpb24gdigpe28uc3RvcCgpLGQuY2xlYXIoKSxmLmNsZWFyKCksci5fcy5kZWxldGUoZSl9bGV0IHk9KHQsbj1gYCk9PntpZihLZyBpbiB0KXJldHVybiB0W3FnXT1uLHQ7bGV0IGk9ZnVuY3Rpb24oKXtFZyhyKTtsZXQgbj1BcnJheS5mcm9tKGFyZ3VtZW50cyksYT1uZXcgU2V0LG89bmV3IFNldDtmdW5jdGlvbiBzKGUpe2EuYWRkKGUpfWZ1bmN0aW9uIGMoZSl7by5hZGQoZSl9V2coZix7YXJnczpuLG5hbWU6aVtxZ10sc3RvcmU6YixhZnRlcjpzLG9uRXJyb3I6Y30pO2xldCBsO3RyeXtsPXQuYXBwbHkodGhpcyYmdGhpcy4kaWQ9PT1lP3RoaXM6YixuKX1jYXRjaChlKXt0aHJvdyBXZyhvLGUpLGV9cmV0dXJuIGwgaW5zdGFuY2VvZiBQcm9taXNlP2wudGhlbihlPT4oV2coYSxlKSxlKSkuY2F0Y2goZT0+KFdnKG8sZSksUHJvbWlzZS5yZWplY3QoZSkpKTooV2coYSxsKSxsKX07cmV0dXJuIGlbS2ddPSEwLGlbcWddPW4saX0sYj1adCh7X3A6ciwkaWQ6ZSwkb25BY3Rpb246VWcuYmluZChudWxsLGYpLCRwYXRjaDpnLCRyZXNldDpfLCRzdWJzY3JpYmUodCxuPXt9KXtpZihkLmhhcyh0KSlyZXR1cm4gSGc7bGV0IGk9VWcoZCx0LG4uZGV0YWNoZWQsKCk9PmEoKSksYT1vLnJ1bigoKT0+RXIoKCk9PnIuc3RhdGUudmFsdWVbZV0scj0+eyhuLmZsdXNoPT09YHN5bmNgP3U6bCkmJnQoe3N0b3JlSWQ6ZSx0eXBlOmBkaXJlY3RgLGV2ZW50czpwfSxyKX0sWmcoe30sYyxuKSkpO3JldHVybiBpfSwkZGlzcG9zZTp2fSk7ci5fcy5zZXQoZSxiKTtsZXQgeD0oci5fYSYmci5fYS5ydW5XaXRoQ29udGV4dHx8R2cpKCgpPT5yLl9lLnJ1bigoKT0+KG89UGUoKSkucnVuKCgpPT50KHthY3Rpb246eX0pKSkpO2ZvcihsZXQgdCBpbiB4KXtsZXQgbj14W3RdO2oobikmJiFRZyhuKXx8bm4obik/YXx8KG0mJlhnKG4pJiYoaihuKT9uLnZhbHVlPW1bdF06KChuIGluc3RhbmNlb2YgU2V0fHxuIGluc3RhbmNlb2YgTWFwKSYmbi5jbGVhcigpLEpnKG4sbVt0XSkpKSxyLnN0YXRlLnZhbHVlW2VdW3RdPW4pOnR5cGVvZiBuPT1gZnVuY3Rpb25gJiYoeFt0XT15KG4sdCkscy5hY3Rpb25zW3RdPW4pfXJldHVybiBaZyhiLHgpLFpnKEEoYikseCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIiRzdGF0ZSIse2dldDooKT0+ci5zdGF0ZS52YWx1ZVtlXSxzZXQ6ZT0+e2codD0+e1pnKHQsZSl9KX19KSxyLl9wLmZvckVhY2goZT0+e2xldCB0PW8ucnVuKCgpPT5lKHtzdG9yZTpiLGFwcDpyLl9hLHBpbmlhOnIsb3B0aW9uczpzfSkpO1pnKGIsdCl9KSxtJiZhJiZuLmh5ZHJhdGUmJm4uaHlkcmF0ZShiLiRzdGF0ZSxtKSxsPSEwLHU9ITAsYn1mdW5jdGlvbiB0XyhlLHQsbil7bGV0IHIsaT10eXBlb2YgdD09YGZ1bmN0aW9uYDtyPWk/bjp0O2Z1bmN0aW9uIGEobixhKXtsZXQgbz1icigpO3JldHVybiBufHw9bz95cihEZyxudWxsKTpudWxsLG4mJkVnKG4pLG49VGcsbi5fcy5oYXMoZSl8fChpP2VfKGUsdCxyLG4pOiRnKGUscixuKSksbi5fcy5nZXQoZSl9cmV0dXJuIGEuJGlkPWUsYX12YXIgbl89e3ByZWZpeDpgZmFiYCxpY29uTmFtZTpgZ2l0aHViYCxpY29uOls1MTIsNTEyLFtdLGBmMDliYCxgTTIxNi41IDM2Mi41Yy02Ni04LTExMi41LTU1LjUtMTEyLjUtMTE3IDAtMjUgOS01MiAyNC03MC02LjUtMTYuNS01LjUtNTEuNSAyLTY2IDIwLTIuNSA0NyA4IDYzIDIyLjUgMTktNiAzOS05IDYzLjUtOXM0NC41IDMgNjIuNSA4LjVjMTUuNS0xNCA0My0yNC41IDYzLTIyIDcgMTMuNSA4IDQ4LjUgMS41IDY1LjUgMTYgMTkgMjQuNSA0NC41IDI0LjUgNzAuNSAwIDYxLjUtNDYuNSAxMDgtMTEzLjUgMTE2LjUgMTcgMTEgMjguNSAzNSAyOC41IDYyLjVsMCA1MkMzMjMgNDkxLjUgMzM1LjUgNTAwIDM1MC41IDQ5NCA0NDEgNDU5LjUgNTEyIDM2OSA1MTIgMjU3IDUxMiAxMTUuNSAzOTcgMCAyNTUuNSAwUzAgMTE1LjUgMCAyNTdjMCAxMTEgNzAuNSAyMDMgMTY1LjUgMjM3LjUgMTMuNSA1IDI2LjUtNCAyNi41LTE3LjVsMC00MGMtNyAzLTE2IDUtMjQgNS0zMyAwLTUyLjUtMTgtNjYuNS01MS41LTUuNS0xMy41LTExLjUtMjEuNS0yMy0yMy02LS41LTgtMy04LTYgMC02IDEwLTEwLjUgMjAtMTAuNSAxNC41IDAgMjcgOSA0MCAyNy41IDEwIDE0LjUgMjAuNSAyMSAzMyAyMXMyMC41LTQuNSAzMi0xNmM4LjUtOC41IDE1LTE2IDIxLTIxemBdfSxyXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBtYWduaWZ5aW5nLWdsYXNzYCxpY29uOls1MTIsNTEyLFsxMjgyNjksYHNlYXJjaGBdLGBmMDAyYCxgTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjA4IDM1MmExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6YF19LGlfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGtleWAsaWNvbjpbNTEyLDUxMixbMTI4MjczXSxgZjA4NGAsYE0zMzYgMzUyYzk3LjIgMCAxNzYtNzguOCAxNzYtMTc2UzQzMy4yIDAgMzM2IDAgMTYwIDc4LjggMTYwIDE3NmMwIDE4LjcgMi45IDM2LjggOC4zIDUzLjdMNyAzOTFjLTQuNSA0LjUtNyAxMC42LTcgMTdsMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDAgNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQwIDQwIDBjNi40IDAgMTIuNS0yLjUgMTctN2wzMy4zLTMzLjNjMTYuOSA1LjQgMzUgOC4zIDUzLjcgOC4zek0zNzYgOTZhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwemBdfSxhXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LXVwYCxpY29uOlszODQsNTEyLFtgc29ydC1hc2NgXSxgZjBkZWAsYE0zMiAyMjRjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhTLjIgMTc4LjUgOS40IDE2OS40bDE2MC0xNjBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTYwIDE2MGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzNjQuOSAyMjQgMzUyIDIyNEwzMiAyMjR6YF19LG9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZWAsaWNvbjpbNTc2LDUxMixbMTI4MDY1XSxgZjA2ZWAsYE0yODggMzJjLTgwLjggMC0xNDUuNSAzNi44LTE5Mi42IDgwLjYtNDYuOCA0My41LTc4LjEgOTUuNC05MyAxMzEuMS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjZzMTQ1LjUtMzYuOCAxOTIuNi04MC42YzQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42ek0xNDQgMjU2YTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE0NC02NGMwIDM1LjMtMjguNyA2NC02NCA2NC0xMS41IDAtMjIuMy0zLTMxLjctOC40LTEgMTAuOS0uMSAyMi4xIDIuOSAzMy4yIDEzLjcgNTEuMiA2Ni40IDgxLjYgMTE3LjYgNjcuOXM4MS42LTY2LjQgNjcuOS0xMTcuNmMtMTIuMi00NS43LTU1LjUtNzQuOC0xMDEuMS03MC44IDUuMyA5LjMgOC40IDIwLjEgOC40IDMxLjd6YF19LHNfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZXZyb24tdXBgLGljb246WzQ0OCw1MTIsW10sYGYwNzdgLGBNMjAxLjQgMTA1LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTkyIDE5MmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwyMjQgMTczLjMgNTQuNiAzNDIuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsMTkyLTE5MnpgXX0sY189e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgY2lyY2xlLXhtYXJrYCxpY29uOls1MTIsNTEyLFs2MTUzMixgdGltZXMtY2lyY2xlYCxgeG1hcmstY2lyY2xlYF0sYGYwNTdgLGBNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NyAxNjdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNTUgNTUgNTUtNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC01NSA1NSA1NSA1NWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC01NS01NS01NSA1NWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1NS01NS01NS01NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6YF19LGxfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1leGNsYW1hdGlvbmAsaWNvbjpbNTEyLDUxMixbYGV4Y2xhbWF0aW9uLWNpcmNsZWBdLGBmMDZhYCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyem0wLTE5MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjYgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LHVfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZWNrYCxpY29uOls0NDgsNTEyLFsxMDAwMywxMDAwNF0sYGYwMGNgLGBNNDM0LjggNzAuMWMxNC4zIDEwLjQgMTcuNSAzMC40IDcuMSA0NC43bC0yNTYgMzUyYy01LjUgNy42LTE0IDEyLjMtMjMuNCAxMy4xcy0xOC41LTIuNy0yNS4xLTkuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxMDEuNSAxMDEuNSAyMzQtMzIxLjdjMTAuNC0xNC4zIDMwLjQtMTcuNSA0NC43LTcuMXpgXX0sZF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgc29ydGAsaWNvbjpbMzg0LDUxMixbYHVuc29ydGVkYF0sYGYwZGNgLGBNMi40IDIwNC4yYzUgMTIgMTYuNiAxOS44IDI5LjYgMTkuOGwzMjAgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0Ljl6bTAgMTAzLjVjLTUgMTItMi4yIDI1LjcgNi45IDM0LjlsMTYwIDE2MGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzM2NC45IDI4OCAzNTIgMjg4TDMyIDI4OGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHpgXX0sZl89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgeG1hcmtgLGljb246WzM4NCw1MTIsWzEyODQ3MywxMDAwNSwxMDAwNiwxMDA2MCwyMTUsYGNsb3NlYCxgbXVsdGlwbHlgLGByZW1vdmVgLGB0aW1lc2BdLGBmMDBkYCxgTTU1LjEgNzMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTQ3LjIgMjU2IDkuOSAzOTMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIuNSAzMDEuMyAzMjkuOSA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDIzNy44IDI1NiAzNzUuMSAxMTguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwxOTIuNSAyMTAuNyA1NS4xIDczLjR6YF19LHBfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1jaGVja2AsaWNvbjpbNTEyLDUxMixbNjE1MzMsYGNoZWNrLWNpcmNsZWBdLGBmMDU4YCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyek0zNzQgMTQ1LjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDIyMS4xIDMxNS4yIDE2OSAyNjMuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOCA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM3OS4zIDE3OS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41emBdfSxtXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaGV2cm9uLWRvd25gLGljb246WzQ0OCw1MTIsW10sYGYwNzhgLGBNMjAxLjQgNDA2LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTkyLTE5MmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyMjQgMzM4LjcgNTQuNiAxNjkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsMTkyIDE5MnpgXX0saF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgdHJpYW5nbGUtZXhjbGFtYXRpb25gLGljb246WzUxMiw1MTIsWzk4ODgsYGV4Y2xhbWF0aW9uLXRyaWFuZ2xlYCxgd2FybmluZ2BdLGBmMDcxYCxgTTI1NiAwYzE0LjcgMCAyOC4yIDguMSAzNS4yIDIxbDIxNiA0MDBjNi43IDEyLjQgNi40IDI3LjQtLjggMzkuNVM0ODYuMSA0ODAgNDcyIDQ4MEw0MCA0ODBjLTE0LjEgMC0yNy4yLTcuNC0zNC40LTE5LjVzLTcuNS0yNy4xLS44LTM5LjVsMjE2LTQwMGM3LTEyLjkgMjAuNS0yMSAzNS4yLTIxem0wIDM1MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjUgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LGdfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNvcHlgLGljb246WzQ0OCw1MTIsW10sYGYwYzVgLGBNMTkyIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjAwLjZjMC0xNy40LTcuMS0zNC4xLTE5LjctNDYuMkwzNzAuNiAxNy44QzM1OC43IDYuNCAzNDIuOCAwIDMyNi4zIDBMMTkyIDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNi02NCAwIDAgMTYtMTkyIDAgMC0yNTYgMTYgMCAwLTY0LTE2IDB6YF19LF9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZS1zbGFzaGAsaWNvbjpbNTc2LDUxMixbXSxgZjA3MGAsYE00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC05Ni40LTk2LjRjMi43LTIuNCA1LjQtNC44IDgtNy4yIDQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42LTU2LjggMC0xMDUuNiAxOC4yLTE0NiA0NC4yTDQxLTI0Ljl6TTIwNC41IDEzOC43YzIzLjUtMTYuOCA1Mi40LTI2LjcgODMuNS0yNi43IDc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0IDAgMzEuMS05LjkgNTkuOS0yNi43IDgzLjVsLTM0LjctMzQuN2MxMi43LTIxLjQgMTctNDcuNyAxMC4xLTczLjctMTMuNy01MS4yLTY2LjQtODEuNi0xMTcuNi02Ny45LTguNiAyLjMtMTYuNyA1LjctMjQgMTBsLTM0LjctMzQuN3pNMzI1LjMgMzk1LjFjLTExLjkgMy4yLTI0LjQgNC45LTM3LjMgNC45LTc5LjUgMC0xNDQtNjQuNS0xNDQtMTQ0IDAtMTIuOSAxLjctMjUuNCA0LjktMzcuM0w2OS40IDEzOS4yYy0zMi42IDM2LjgtNTUgNzUuOC02Ni45IDEwNC41LTMuMyA3LjktMy4zIDE2LjcgMCAyNC42IDE0LjkgMzUuNyA0Ni4yIDg3LjcgOTMgMTMxLjEgNDcuMSA0My43IDExMS44IDgwLjYgMTkyLjYgODAuNiAzNy4zIDAgNzEuMi03LjkgMTAxLjUtMjAuNmwtNjQuMi02NC4yemBdfSx2Xz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LWRvd25gLGljb246WzM4NCw1MTIsW2Bzb3J0LWRlc2NgXSxgZjBkZGAsYE0zMiAyODhjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjIgMzMzLjUgOS40IDM0Mi42bDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzNjQuOSAyODggMzUyIDI4OEwzMiAyODh6YF19O2Z1bmN0aW9uIHlfKGUpe3ZhciB0LG4scj1gYDtpZih0eXBlb2YgZT09YHN0cmluZ2B8fHR5cGVvZiBlPT1gbnVtYmVyYClyKz1lO2Vsc2UgaWYodHlwZW9mIGU9PWBvYmplY3RgKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgaT1lLmxlbmd0aDtmb3IodD0wO3Q8aTt0KyspZVt0XSYmKG49eV8oZVt0XSkpJiYociYmKHIrPWAgYCkscis9bil9ZWxzZSBmb3IobiBpbiBlKWVbbl0mJihyJiYocis9YCBgKSxyKz1uKX1yZXR1cm4gcn1mdW5jdGlvbiBiXygpe2Zvcih2YXIgZSx0LG49MCxyPWBgLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKShlPWFyZ3VtZW50c1tuXSkmJih0PXlfKGUpKSYmKHImJihyKz1gIGApLHIrPXQpO3JldHVybiByfXZhciB4Xz1lPT50eXBlb2YgZT09YGJvb2xlYW5gP2Ake2V9YDplPT09MD9gMGA6ZSxTXz1iXyxDXz0oZSx0KT0+bj0+e2lmKHQ/LnZhcmlhbnRzPT1udWxsKXJldHVybiBTXyhlLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSk7bGV0e3ZhcmlhbnRzOnIsZGVmYXVsdFZhcmlhbnRzOml9PXQsYT1PYmplY3Qua2V5cyhyKS5tYXAoZT0+e2xldCB0PW4/LltlXSxhPWk/LltlXTtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtsZXQgbz14Xyh0KXx8eF8oYSk7cmV0dXJuIHJbZV1bb119KSxvPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgoZSx0KT0+e2xldFtuLHJdPXQ7cmV0dXJuIHI9PT12b2lkIDB8fChlW25dPXIpLGV9LHt9KTtyZXR1cm4gU18oZSxhLHQ/LmNvbXBvdW5kVmFyaWFudHM/LnJlZHVjZSgoZSx0KT0+e2xldHtjbGFzczpuLGNsYXNzTmFtZTpyLC4uLmF9PXQ7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGEpLmV2ZXJ5KGU9PntsZXRbdCxuXT1lO3JldHVybiBBcnJheS5pc0FycmF5KG4pP24uaW5jbHVkZXMoey4uLmksLi4ub31bdF0pOnsuLi5pLC4uLm99W3RdPT09bn0pP1suLi5lLG4scl06ZX0sW10pLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSl9LHdfPShlLHQpPT57bGV0IG49QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyluW2UubGVuZ3RoK3JdPXRbcl07cmV0dXJuIG59LFRfPShlLHQpPT4oe2NsYXNzR3JvdXBJZDplLHZhbGlkYXRvcjp0fSksRV89KGU9bmV3IE1hcCx0PW51bGwsbik9Pih7bmV4dFBhcnQ6ZSx2YWxpZGF0b3JzOnQsY2xhc3NHcm91cElkOm59KSxEXz1gLWAsT189W10sa189YGFyYml0cmFyeS4uYCxBXz1lPT57bGV0IHQ9Tl8oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtyZXR1cm57Z2V0Q2xhc3NHcm91cElkOmU9PntpZihlLnN0YXJ0c1dpdGgoYFtgKSYmZS5lbmRzV2l0aChgXWApKXJldHVybiBNXyhlKTtsZXQgbj1lLnNwbGl0KERfKTtyZXR1cm4gal8obiwrKG5bMF09PT1gYCYmbi5sZW5ndGg+MSksdCl9LGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczooZSx0KT0+e2lmKHQpe2xldCB0PXJbZV0saT1uW2VdO3JldHVybiB0P2k/d18oaSx0KTp0Oml8fE9ffXJldHVybiBuW2VdfHxPX319fSxqXz0oZSx0LG4pPT57aWYoZS5sZW5ndGgtdD09PTApcmV0dXJuIG4uY2xhc3NHcm91cElkO2xldCByPWVbdF0saT1uLm5leHRQYXJ0LmdldChyKTtpZihpKXtsZXQgbj1qXyhlLHQrMSxpKTtpZihuKXJldHVybiBufWxldCBhPW4udmFsaWRhdG9ycztpZihhPT09bnVsbClyZXR1cm47bGV0IG89dD09PTA/ZS5qb2luKERfKTplLnNsaWNlKHQpLmpvaW4oRF8pLHM9YS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxzO2UrKyl7bGV0IHQ9YVtlXTtpZih0LnZhbGlkYXRvcihvKSlyZXR1cm4gdC5jbGFzc0dyb3VwSWR9fSxNXz1lPT5lLnNsaWNlKDEsLTEpLmluZGV4T2YoYDpgKT09PS0xP3ZvaWQgMDooKCk9PntsZXQgdD1lLnNsaWNlKDEsLTEpLG49dC5pbmRleE9mKGA6YCkscj10LnNsaWNlKDAsbik7cmV0dXJuIHI/a18rcjp2b2lkIDB9KSgpLE5fPWU9PntsZXR7dGhlbWU6dCxjbGFzc0dyb3VwczpufT1lO3JldHVybiBQXyhuLHQpfSxQXz0oZSx0KT0+e2xldCBuPUVfKCk7Zm9yKGxldCByIGluIGUpe2xldCBpPWVbcl07Rl8oaSxuLHIsdCl9cmV0dXJuIG59LEZfPShlLHQsbixyKT0+e2xldCBpPWUubGVuZ3RoO2ZvcihsZXQgYT0wO2E8aTthKyspe2xldCBpPWVbYV07SV8oaSx0LG4scil9fSxJXz0oZSx0LG4scik9PntpZih0eXBlb2YgZT09YHN0cmluZ2Ape0xfKGUsdCxuKTtyZXR1cm59aWYodHlwZW9mIGU9PWBmdW5jdGlvbmApe1JfKGUsdCxuLHIpO3JldHVybn16XyhlLHQsbixyKX0sTF89KGUsdCxuKT0+e2xldCByPWU9PT1gYD90OkJfKHQsZSk7ci5jbGFzc0dyb3VwSWQ9bn0sUl89KGUsdCxuLHIpPT57aWYoVl8oZSkpe0ZfKGUociksdCxuLHIpO3JldHVybn10LnZhbGlkYXRvcnM9PT1udWxsJiYodC52YWxpZGF0b3JzPVtdKSx0LnZhbGlkYXRvcnMucHVzaChUXyhuLGUpKX0sel89KGUsdCxuLHIpPT57bGV0IGk9T2JqZWN0LmVudHJpZXMoZSksYT1pLmxlbmd0aDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtsZXRbYSxvXT1pW2VdO0ZfKG8sQl8odCxhKSxuLHIpfX0sQl89KGUsdCk9PntsZXQgbj1lLHI9dC5zcGxpdChEXyksaT1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgdD1yW2VdLGk9bi5uZXh0UGFydC5nZXQodCk7aXx8KGk9RV8oKSxuLm5leHRQYXJ0LnNldCh0LGkpKSxuPWl9cmV0dXJuIG59LFZfPWU9PmBpc1RoZW1lR2V0dGVyYGluIGUmJmUuaXNUaGVtZUdldHRlcj09PSEwLEhfPWU9PntpZihlPDEpcmV0dXJue2dldDooKT0+dm9pZCAwLHNldDooKT0+e319O2xldCB0PTAsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9T2JqZWN0LmNyZWF0ZShudWxsKSxpPShpLGEpPT57bltpXT1hLHQrKyx0PmUmJih0PTAscj1uLG49T2JqZWN0LmNyZWF0ZShudWxsKSl9O3JldHVybntnZXQoZSl7bGV0IHQ9bltlXTtpZih0IT09dm9pZCAwKXJldHVybiB0O2lmKCh0PXJbZV0pIT09dm9pZCAwKXJldHVybiBpKGUsdCksdH0sc2V0KGUsdCl7ZSBpbiBuP25bZV09dDppKGUsdCl9fX0sVV89YCFgLFdfPWA6YCxHXz1bXSxLXz0oZSx0LG4scixpKT0+KHttb2RpZmllcnM6ZSxoYXNJbXBvcnRhbnRNb2RpZmllcjp0LGJhc2VDbGFzc05hbWU6bixtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOnIsaXNFeHRlcm5hbDppfSkscV89ZT0+e2xldHtwcmVmaXg6dCxleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZTpufT1lLHI9ZT0+e2xldCB0PVtdLG49MCxyPTAsaT0wLGEsbz1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgbz1lW3NdO2lmKG49PT0wJiZyPT09MCl7aWYobz09PVdfKXt0LnB1c2goZS5zbGljZShpLHMpKSxpPXMrMTtjb250aW51ZX1pZihvPT09YC9gKXthPXM7Y29udGludWV9fW89PT1gW2A/bisrOm89PT1gXWA/bi0tOm89PT1gKGA/cisrOm89PT1gKWAmJnItLX1sZXQgcz10Lmxlbmd0aD09PTA/ZTplLnNsaWNlKGkpLGM9cyxsPSExO3MuZW5kc1dpdGgoVV8pPyhjPXMuc2xpY2UoMCwtMSksbD0hMCk6cy5zdGFydHNXaXRoKFVfKSYmKGM9cy5zbGljZSgxKSxsPSEwKTtsZXQgdT1hJiZhPmk/YS1pOnZvaWQgMDtyZXR1cm4gS18odCxsLGMsdSl9O2lmKHQpe2xldCBlPXQrV18sbj1yO3I9dD0+dC5zdGFydHNXaXRoKGUpP24odC5zbGljZShlLmxlbmd0aCkpOktfKEdfLCExLHQsdm9pZCAwLCEwKX1pZihuKXtsZXQgZT1yO3I9dD0+bih7Y2xhc3NOYW1lOnQscGFyc2VDbGFzc05hbWU6ZX0pfXJldHVybiByfSxKXz1lPT57bGV0IHQ9bmV3IE1hcDtyZXR1cm4gZS5vcmRlclNlbnNpdGl2ZU1vZGlmaWVycy5mb3JFYWNoKChlLG4pPT57dC5zZXQoZSwxZTYrbil9KSxlPT57bGV0IG49W10scj1bXTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IGE9ZVtpXSxvPWFbMF09PT1gW2Ascz10LmhhcyhhKTtvfHxzPyhyLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpLHI9W10pLG4ucHVzaChhKSk6ci5wdXNoKGEpfXJldHVybiByLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpKSxufX0sWV89ZT0+KHtjYWNoZTpIXyhlLmNhY2hlU2l6ZSkscGFyc2VDbGFzc05hbWU6cV8oZSksc29ydE1vZGlmaWVyczpKXyhlKSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpYXyhlKSwuLi5BXyhlKX0pLFhfPWU9PntsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLG49ZS5wb3N0Zml4TG9va3VwQ2xhc3NHcm91cHM7aWYobilmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyl0W25bZV1dPSEwO3JldHVybiB0fSxaXz0vXHMrLyxRXz0oZSx0KT0+e2xldHtwYXJzZUNsYXNzTmFtZTpuLGdldENsYXNzR3JvdXBJZDpyLGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczppLHNvcnRNb2RpZmllcnM6YSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpvfT10LHM9W10sYz1lLnRyaW0oKS5zcGxpdChaXyksbD1gYDtmb3IobGV0IGU9Yy5sZW5ndGgtMTtlPj0wOy0tZSl7bGV0IHQ9Y1tlXSx7aXNFeHRlcm5hbDp1LG1vZGlmaWVyczpkLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpwLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246bX09bih0KTtpZih1KXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9bGV0IGg9ISFtLGc7aWYoaCl7Zz1yKHAuc3Vic3RyaW5nKDAsbSkpO2xldCBlPWcmJm9bZ10/cihwKTp2b2lkIDA7ZSYmZSE9PWcmJihnPWUsaD0hMSl9ZWxzZSBnPXIocCk7aWYoIWcpe2lmKCFoKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aWYoZz1yKHApLCFnKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aD0hMX1sZXQgXz1kLmxlbmd0aD09PTA/YGA6ZC5sZW5ndGg9PT0xP2RbMF06YShkKS5qb2luKGA6YCksdj1mP18rVV86Xyx5PXYrZztpZihzLmluZGV4T2YoeSk+LTEpY29udGludWU7cy5wdXNoKHkpO2xldCBiPWkoZyxoKTtmb3IobGV0IGU9MDtlPGIubGVuZ3RoOysrZSl7bGV0IHQ9YltlXTtzLnB1c2godit0KX1sPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCl9cmV0dXJuIGx9LCRfPSguLi5lKT0+e2xldCB0PTAsbixyLGk9YGA7Zm9yKDt0PGUubGVuZ3RoOykobj1lW3QrK10pJiYocj1ldihuKSkmJihpJiYoaSs9YCBgKSxpKz1yKTtyZXR1cm4gaX0sZXY9ZT0+e2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTtsZXQgdCxuPWBgO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PWV2KGVbcl0pKSYmKG4mJihuKz1gIGApLG4rPXQpO3JldHVybiBufSx0dj0oZSwuLi50KT0+e2xldCBuLHIsaSxhLG89bz0+KG49WV8odC5yZWR1Y2UoKGUsdCk9PnQoZSksZSgpKSkscj1uLmNhY2hlLmdldCxpPW4uY2FjaGUuc2V0LGE9cyxzKG8pKSxzPWU9PntsZXQgdD1yKGUpO2lmKHQpcmV0dXJuIHQ7bGV0IGE9UV8oZSxuKTtyZXR1cm4gaShlLGEpLGF9O3JldHVybiBhPW8sKC4uLmUpPT5hKCRfKC4uLmUpKX0sbnY9W10scnY9ZT0+e2xldCB0PXQ9PnRbZV18fG52O3JldHVybiB0LmlzVGhlbWVHZXR0ZXI9ITAsdH0saXY9L15cWyg/Oihcd1tcdy1dKik6KT8oLispXF0kL2ksYXY9L15cKCg/Oihcd1tcdy1dKik6KT8oLispXCkkL2ksb3Y9L15cZCsoPzpcLlxkKyk/XC9cZCsoPzpcLlxkKyk/JC8sc3Y9L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxjdj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sbHY9L14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpfGNvbG9yLW1peClcKC4rXCkkLyx1dj0vXihpbnNldF8pPy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxkdj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvLGZ2PWU9Pm92LnRlc3QoZSksWT1lPT4hIWUmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKGUpKSxwdj1lPT4hIWUmJk51bWJlci5pc0ludGVnZXIoTnVtYmVyKGUpKSxtdj1lPT5lLmVuZHNXaXRoKGAlYCkmJlkoZS5zbGljZSgwLC0xKSksaHY9ZT0+c3YudGVzdChlKSxndj0oKT0+ITAsX3Y9ZT0+Y3YudGVzdChlKSYmIWx2LnRlc3QoZSksdnY9KCk9PiExLHl2PWU9PnV2LnRlc3QoZSksYnY9ZT0+ZHYudGVzdChlKSx4dj1lPT4hWChlKSYmIVooZSksU3Y9ZT0+ZS5zdGFydHNXaXRoKGBAY29udGFpbmVyYCkmJihlWzEwXT09PWAvYCYmZVsxMV0hPT12b2lkIDB8fGVbMTFdPT09YHNgJiZlWzE2XSE9PXZvaWQgMCYmZS5zdGFydHNXaXRoKGAtc2l6ZS9gLDEwKXx8ZVsxMV09PT1gbmAmJmVbMThdIT09dm9pZCAwJiZlLnN0YXJ0c1dpdGgoYC1ub3JtYWwvYCwxMCkpLEN2PWU9PlJ2KGUsSHYsdnYpLFg9ZT0+aXYudGVzdChlKSx3dj1lPT5SdihlLFV2LF92KSxUdj1lPT5SdihlLFd2LFkpLEV2PWU9PlJ2KGUsS3YsZ3YpLER2PWU9PlJ2KGUsR3YsdnYpLE92PWU9PlJ2KGUsQnYsdnYpLGt2PWU9PlJ2KGUsVnYsYnYpLEF2PWU9PlJ2KGUscXYseXYpLFo9ZT0+YXYudGVzdChlKSxqdj1lPT56dihlLFV2KSxNdj1lPT56dihlLEd2KSxOdj1lPT56dihlLEJ2KSxQdj1lPT56dihlLEh2KSxGdj1lPT56dihlLFZ2KSxJdj1lPT56dihlLHF2LCEwKSxMdj1lPT56dihlLEt2LCEwKSxSdj0oZSx0LG4pPT57bGV0IHI9aXYuZXhlYyhlKTtyZXR1cm4gcj9yWzFdP3QoclsxXSk6bihyWzJdKTohMX0senY9KGUsdCxuPSExKT0+e2xldCByPWF2LmV4ZWMoZSk7cmV0dXJuIHI/clsxXT90KHJbMV0pOm46ITF9LEJ2PWU9PmU9PT1gcG9zaXRpb25gfHxlPT09YHBlcmNlbnRhZ2VgLFZ2PWU9PmU9PT1gaW1hZ2VgfHxlPT09YHVybGAsSHY9ZT0+ZT09PWBsZW5ndGhgfHxlPT09YHNpemVgfHxlPT09YGJnLXNpemVgLFV2PWU9PmU9PT1gbGVuZ3RoYCxXdj1lPT5lPT09YG51bWJlcmAsR3Y9ZT0+ZT09PWBmYW1pbHktbmFtZWAsS3Y9ZT0+ZT09PWBudW1iZXJgfHxlPT09YHdlaWdodGAscXY9ZT0+ZT09PWBzaGFkb3dgLEp2PXR2KCgpPT57bGV0IGU9cnYoYGNvbG9yYCksdD1ydihgZm9udGApLG49cnYoYHRleHRgKSxyPXJ2KGBmb250LXdlaWdodGApLGk9cnYoYHRyYWNraW5nYCksYT1ydihgbGVhZGluZ2ApLG89cnYoYGJyZWFrcG9pbnRgKSxzPXJ2KGBjb250YWluZXJgKSxjPXJ2KGBzcGFjaW5nYCksbD1ydihgcmFkaXVzYCksdT1ydihgc2hhZG93YCksZD1ydihgaW5zZXQtc2hhZG93YCksZj1ydihgdGV4dC1zaGFkb3dgKSxwPXJ2KGBkcm9wLXNoYWRvd2ApLG09cnYoYGJsdXJgKSxoPXJ2KGBwZXJzcGVjdGl2ZWApLGc9cnYoYGFzcGVjdGApLF89cnYoYGVhc2VgKSx2PXJ2KGBhbmltYXRlYCkseT0oKT0+W2BhdXRvYCxgYXZvaWRgLGBhbGxgLGBhdm9pZC1wYWdlYCxgcGFnZWAsYGxlZnRgLGByaWdodGAsYGNvbHVtbmBdLGI9KCk9PltgY2VudGVyYCxgdG9wYCxgYm90dG9tYCxgbGVmdGAsYHJpZ2h0YCxgdG9wLWxlZnRgLGBsZWZ0LXRvcGAsYHRvcC1yaWdodGAsYHJpZ2h0LXRvcGAsYGJvdHRvbS1yaWdodGAsYHJpZ2h0LWJvdHRvbWAsYGJvdHRvbS1sZWZ0YCxgbGVmdC1ib3R0b21gXSx4PSgpPT5bLi4uYigpLFosWF0sUz0oKT0+W2BhdXRvYCxgaGlkZGVuYCxgY2xpcGAsYHZpc2libGVgLGBzY3JvbGxgXSxDPSgpPT5bYGF1dG9gLGBjb250YWluYCxgbm9uZWBdLHc9KCk9PltaLFgsY10sZWU9KCk9PltmdixgZnVsbGAsYGF1dG9gLC4uLncoKV0sdGU9KCk9Pltwdixgbm9uZWAsYHN1YmdyaWRgLFosWF0sVD0oKT0+W2BhdXRvYCx7c3BhbjpbYGZ1bGxgLHB2LFosWF19LHB2LFosWF0sbmU9KCk9PltwdixgYXV0b2AsWixYXSxyZT0oKT0+W2BhdXRvYCxgbWluYCxgbWF4YCxgZnJgLFosWF0saWU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBiZXR3ZWVuYCxgYXJvdW5kYCxgZXZlbmx5YCxgc3RyZXRjaGAsYGJhc2VsaW5lYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLEU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBzdHJldGNoYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLGFlPSgpPT5bYGF1dG9gLC4uLncoKV0sb2U9KCk9PltmdixgYXV0b2AsYGZ1bGxgLGBkdndgLGBkdmhgLGBsdndgLGBsdmhgLGBzdndgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sc2U9KCk9Pltmdixgc2NyZWVuYCxgZnVsbGAsYGR2d2AsYGx2d2AsYHN2d2AsYG1pbmAsYG1heGAsYGZpdGAsLi4udygpXSxjZT0oKT0+W2Z2LGBzY3JlZW5gLGBmdWxsYCxgbGhgLGBkdmhgLGBsdmhgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sRD0oKT0+W2UsWixYXSxsZT0oKT0+Wy4uLmIoKSxOdixPdix7cG9zaXRpb246W1osWF19XSx1ZT0oKT0+W2Buby1yZXBlYXRgLHtyZXBlYXQ6W2BgLGB4YCxgeWAsYHNwYWNlYCxgcm91bmRgXX1dLGRlPSgpPT5bYGF1dG9gLGBjb3ZlcmAsYGNvbnRhaW5gLFB2LEN2LHtzaXplOltaLFhdfV0sZmU9KCk9Plttdixqdix3dl0scGU9KCk9PltgYCxgbm9uZWAsYGZ1bGxgLGwsWixYXSxtZT0oKT0+W2BgLFksanYsd3ZdLGhlPSgpPT5bYHNvbGlkYCxgZGFzaGVkYCxgZG90dGVkYCxgZG91YmxlYF0sZ2U9KCk9Pltgbm9ybWFsYCxgbXVsdGlwbHlgLGBzY3JlZW5gLGBvdmVybGF5YCxgZGFya2VuYCxgbGlnaHRlbmAsYGNvbG9yLWRvZGdlYCxgY29sb3ItYnVybmAsYGhhcmQtbGlnaHRgLGBzb2Z0LWxpZ2h0YCxgZGlmZmVyZW5jZWAsYGV4Y2x1c2lvbmAsYGh1ZWAsYHNhdHVyYXRpb25gLGBjb2xvcmAsYGx1bWlub3NpdHlgXSxfZT0oKT0+W1ksbXYsTnYsT3ZdLHZlPSgpPT5bYGAsYG5vbmVgLG0sWixYXSx5ZT0oKT0+W2Bub25lYCxZLFosWF0sYmU9KCk9Pltgbm9uZWAsWSxaLFhdLE89KCk9PltZLFosWF0seGU9KCk9PltmdixgZnVsbGAsLi4udygpXTtyZXR1cm57Y2FjaGVTaXplOjUwMCx0aGVtZTp7YW5pbWF0ZTpbYHNwaW5gLGBwaW5nYCxgcHVsc2VgLGBib3VuY2VgXSxhc3BlY3Q6W2B2aWRlb2BdLGJsdXI6W2h2XSxicmVha3BvaW50Oltodl0sY29sb3I6W2d2XSxjb250YWluZXI6W2h2XSwiZHJvcC1zaGFkb3ciOltodl0sZWFzZTpbYGluYCxgb3V0YCxgaW4tb3V0YF0sZm9udDpbeHZdLCJmb250LXdlaWdodCI6W2B0aGluYCxgZXh0cmFsaWdodGAsYGxpZ2h0YCxgbm9ybWFsYCxgbWVkaXVtYCxgc2VtaWJvbGRgLGBib2xkYCxgZXh0cmFib2xkYCxgYmxhY2tgXSwiaW5zZXQtc2hhZG93IjpbaHZdLGxlYWRpbmc6W2Bub25lYCxgdGlnaHRgLGBzbnVnYCxgbm9ybWFsYCxgcmVsYXhlZGAsYGxvb3NlYF0scGVyc3BlY3RpdmU6W2BkcmFtYXRpY2AsYG5lYXJgLGBub3JtYWxgLGBtaWRyYW5nZWAsYGRpc3RhbnRgLGBub25lYF0scmFkaXVzOltodl0sc2hhZG93Oltodl0sc3BhY2luZzpbYHB4YCxZXSx0ZXh0Oltodl0sInRleHQtc2hhZG93IjpbaHZdLHRyYWNraW5nOltgdGlnaHRlcmAsYHRpZ2h0YCxgbm9ybWFsYCxgd2lkZWAsYHdpZGVyYCxgd2lkZXN0YF19LGNsYXNzR3JvdXBzOnthc3BlY3Q6W3thc3BlY3Q6W2BhdXRvYCxgc3F1YXJlYCxmdixYLFosZ119XSxjb250YWluZXI6W2Bjb250YWluZXJgXSwiY29udGFpbmVyLXR5cGUiOlt7IkBjb250YWluZXIiOltgYCxgbm9ybWFsYCxgc2l6ZWAsWixYXX1dLCJjb250YWluZXItbmFtZWQiOltTdl0sY29sdW1uczpbe2NvbHVtbnM6W1ksWCxaLHNdfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6eSgpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjp5KCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOltgYXV0b2AsYGF2b2lkYCxgYXZvaWQtcGFnZWAsYGF2b2lkLWNvbHVtbmBdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6W2BzbGljZWAsYGNsb25lYF19XSxib3g6W3tib3g6W2Bib3JkZXJgLGBjb250ZW50YF19XSxkaXNwbGF5OltgYmxvY2tgLGBpbmxpbmUtYmxvY2tgLGBpbmxpbmVgLGBmbGV4YCxgaW5saW5lLWZsZXhgLGB0YWJsZWAsYGlubGluZS10YWJsZWAsYHRhYmxlLWNhcHRpb25gLGB0YWJsZS1jZWxsYCxgdGFibGUtY29sdW1uYCxgdGFibGUtY29sdW1uLWdyb3VwYCxgdGFibGUtZm9vdGVyLWdyb3VwYCxgdGFibGUtaGVhZGVyLWdyb3VwYCxgdGFibGUtcm93LWdyb3VwYCxgdGFibGUtcm93YCxgZmxvdy1yb290YCxgZ3JpZGAsYGlubGluZS1ncmlkYCxgY29udGVudHNgLGBsaXN0LWl0ZW1gLGBoaWRkZW5gXSxzcjpbYHNyLW9ubHlgLGBub3Qtc3Itb25seWBdLGZsb2F0Olt7ZmxvYXQ6W2ByaWdodGAsYGxlZnRgLGBub25lYCxgc3RhcnRgLGBlbmRgXX1dLGNsZWFyOlt7Y2xlYXI6W2BsZWZ0YCxgcmlnaHRgLGBib3RoYCxgbm9uZWAsYHN0YXJ0YCxgZW5kYF19XSxpc29sYXRpb246W2Bpc29sYXRlYCxgaXNvbGF0aW9uLWF1dG9gXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6W2Bjb250YWluYCxgY292ZXJgLGBmaWxsYCxgbm9uZWAsYHNjYWxlLWRvd25gXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OngoKX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UygpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlMoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpTKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpDKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOkMoKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6QygpfV0scG9zaXRpb246W2BzdGF0aWNgLGBmaXhlZGAsYGFic29sdXRlYCxgcmVsYXRpdmVgLGBzdGlja3lgXSxpbnNldDpbe2luc2V0OmVlKCl9XSwiaW5zZXQteCI6W3siaW5zZXQteCI6ZWUoKX1dLCJpbnNldC15IjpbeyJpbnNldC15IjplZSgpfV0sc3RhcnQ6W3siaW5zZXQtcyI6ZWUoKSxzdGFydDplZSgpfV0sZW5kOlt7Imluc2V0LWUiOmVlKCksZW5kOmVlKCl9XSwiaW5zZXQtYnMiOlt7Imluc2V0LWJzIjplZSgpfV0sImluc2V0LWJlIjpbeyJpbnNldC1iZSI6ZWUoKX1dLHRvcDpbe3RvcDplZSgpfV0scmlnaHQ6W3tyaWdodDplZSgpfV0sYm90dG9tOlt7Ym90dG9tOmVlKCl9XSxsZWZ0Olt7bGVmdDplZSgpfV0sdmlzaWJpbGl0eTpbYHZpc2libGVgLGBpbnZpc2libGVgLGBjb2xsYXBzZWBdLHo6W3t6OltwdixgYXV0b2AsWixYXX1dLGJhc2lzOlt7YmFzaXM6W2Z2LGBmdWxsYCxgYXV0b2AscywuLi53KCldfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6W2Byb3dgLGByb3ctcmV2ZXJzZWAsYGNvbGAsYGNvbC1yZXZlcnNlYF19XSwiZmxleC13cmFwIjpbe2ZsZXg6W2Bub3dyYXBgLGB3cmFwYCxgd3JhcC1yZXZlcnNlYF19XSxmbGV4Olt7ZmxleDpbWSxmdixgYXV0b2AsYGluaXRpYWxgLGBub25lYCxYXX1dLGdyb3c6W3tncm93OltgYCxZLFosWF19XSxzaHJpbms6W3tzaHJpbms6W2BgLFksWixYXX1dLG9yZGVyOlt7b3JkZXI6W3B2LGBmaXJzdGAsYGxhc3RgLGBub25lYCxaLFhdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjp0ZSgpfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlQoKX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6bmUoKX1dLCJjb2wtZW5kIjpbeyJjb2wtZW5kIjpuZSgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjp0ZSgpfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlQoKX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6bmUoKX1dLCJyb3ctZW5kIjpbeyJyb3ctZW5kIjpuZSgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbYHJvd2AsYGNvbGAsYGRlbnNlYCxgcm93LWRlbnNlYCxgY29sLWRlbnNlYF19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOnJlKCl9XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOnJlKCl9XSxnYXA6W3tnYXA6dygpfV0sImdhcC14IjpbeyJnYXAteCI6dygpfV0sImdhcC15IjpbeyJnYXAteSI6dygpfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5OlsuLi5pZSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbLi4uRSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LXNlbGYiOlt7Imp1c3RpZnktc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbYG5vcm1hbGAsLi4uaWUoKV19XSwiYWxpZ24taXRlbXMiOlt7aXRlbXM6Wy4uLkUoKSx7YmFzZWxpbmU6W2BgLGBsYXN0YF19XX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6W2BhdXRvYCwuLi5FKCkse2Jhc2VsaW5lOltgYCxgbGFzdGBdfV19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6aWUoKX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsuLi5FKCksYGJhc2VsaW5lYF19XSwicGxhY2Utc2VsZiI6W3sicGxhY2Utc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0scDpbe3A6dygpfV0scHg6W3tweDp3KCl9XSxweTpbe3B5OncoKX1dLHBzOlt7cHM6dygpfV0scGU6W3twZTp3KCl9XSxwYnM6W3twYnM6dygpfV0scGJlOlt7cGJlOncoKX1dLHB0Olt7cHQ6dygpfV0scHI6W3twcjp3KCl9XSxwYjpbe3BiOncoKX1dLHBsOlt7cGw6dygpfV0sbTpbe206YWUoKX1dLG14Olt7bXg6YWUoKX1dLG15Olt7bXk6YWUoKX1dLG1zOlt7bXM6YWUoKX1dLG1lOlt7bWU6YWUoKX1dLG1iczpbe21iczphZSgpfV0sbWJlOlt7bWJlOmFlKCl9XSxtdDpbe210OmFlKCl9XSxtcjpbe21yOmFlKCl9XSxtYjpbe21iOmFlKCl9XSxtbDpbe21sOmFlKCl9XSwic3BhY2UteCI6W3sic3BhY2UteCI6dygpfV0sInNwYWNlLXgtcmV2ZXJzZSI6W2BzcGFjZS14LXJldmVyc2VgXSwic3BhY2UteSI6W3sic3BhY2UteSI6dygpfV0sInNwYWNlLXktcmV2ZXJzZSI6W2BzcGFjZS15LXJldmVyc2VgXSxzaXplOlt7c2l6ZTpvZSgpfV0sImlubGluZS1zaXplIjpbe2lubGluZTpbYGF1dG9gLC4uLnNlKCldfV0sIm1pbi1pbmxpbmUtc2l6ZSI6W3sibWluLWlubGluZSI6W2BhdXRvYCwuLi5zZSgpXX1dLCJtYXgtaW5saW5lLXNpemUiOlt7Im1heC1pbmxpbmUiOltgbm9uZWAsLi4uc2UoKV19XSwiYmxvY2stc2l6ZSI6W3tibG9jazpbYGF1dG9gLC4uLmNlKCldfV0sIm1pbi1ibG9jay1zaXplIjpbeyJtaW4tYmxvY2siOltgYXV0b2AsLi4uY2UoKV19XSwibWF4LWJsb2NrLXNpemUiOlt7Im1heC1ibG9jayI6W2Bub25lYCwuLi5jZSgpXX1dLHc6W3t3OltzLGBzY3JlZW5gLC4uLm9lKCldfV0sIm1pbi13IjpbeyJtaW4tdyI6W3MsYHNjcmVlbmAsYG5vbmVgLC4uLm9lKCldfV0sIm1heC13IjpbeyJtYXgtdyI6W3MsYHNjcmVlbmAsYG5vbmVgLGBwcm9zZWAse3NjcmVlbjpbb119LC4uLm9lKCldfV0saDpbe2g6W2BzY3JlZW5gLGBsaGAsLi4ub2UoKV19XSwibWluLWgiOlt7Im1pbi1oIjpbYHNjcmVlbmAsYGxoYCxgbm9uZWAsLi4ub2UoKV19XSwibWF4LWgiOlt7Im1heC1oIjpbYHNjcmVlbmAsYGxoYCwuLi5vZSgpXX1dLCJmb250LXNpemUiOlt7dGV4dDpbYGJhc2VgLG4sanYsd3ZdfV0sImZvbnQtc21vb3RoaW5nIjpbYGFudGlhbGlhc2VkYCxgc3VicGl4ZWwtYW50aWFsaWFzZWRgXSwiZm9udC1zdHlsZSI6W2BpdGFsaWNgLGBub3QtaXRhbGljYF0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6W3IsTHYsRXZdfV0sImZvbnQtc3RyZXRjaCI6W3siZm9udC1zdHJldGNoIjpbYHVsdHJhLWNvbmRlbnNlZGAsYGV4dHJhLWNvbmRlbnNlZGAsYGNvbmRlbnNlZGAsYHNlbWktY29uZGVuc2VkYCxgbm9ybWFsYCxgc2VtaS1leHBhbmRlZGAsYGV4cGFuZGVkYCxgZXh0cmEtZXhwYW5kZWRgLGB1bHRyYS1leHBhbmRlZGAsbXYsWF19XSwiZm9udC1mYW1pbHkiOlt7Zm9udDpbTXYsRHYsdF19XSwiZm9udC1mZWF0dXJlcyI6W3siZm9udC1mZWF0dXJlcyI6W1hdfV0sImZ2bi1ub3JtYWwiOltgbm9ybWFsLW51bXNgXSwiZnZuLW9yZGluYWwiOltgb3JkaW5hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYHNsYXNoZWQtemVyb2BdLCJmdm4tZmlndXJlIjpbYGxpbmluZy1udW1zYCxgb2xkc3R5bGUtbnVtc2BdLCJmdm4tc3BhY2luZyI6W2Bwcm9wb3J0aW9uYWwtbnVtc2AsYHRhYnVsYXItbnVtc2BdLCJmdm4tZnJhY3Rpb24iOltgZGlhZ29uYWwtZnJhY3Rpb25zYCxgc3RhY2tlZC1mcmFjdGlvbnNgXSx0cmFja2luZzpbe3RyYWNraW5nOltpLFosWF19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6W1ksYG5vbmVgLFosVHZdfV0sbGVhZGluZzpbe2xlYWRpbmc6W2EsLi4udygpXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbYG5vbmVgLFosWF19XSwibGlzdC1zdHlsZS1wb3NpdGlvbiI6W3tsaXN0OltgaW5zaWRlYCxgb3V0c2lkZWBdfV0sImxpc3Qtc3R5bGUtdHlwZSI6W3tsaXN0OltgZGlzY2AsYGRlY2ltYWxgLGBub25lYCxaLFhdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6W2BsZWZ0YCxgY2VudGVyYCxgcmlnaHRgLGBqdXN0aWZ5YCxgc3RhcnRgLGBlbmRgXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpEKCl9XSwidGV4dC1jb2xvciI6W3t0ZXh0OkQoKX1dLCJ0ZXh0LWRlY29yYXRpb24iOltgdW5kZXJsaW5lYCxgb3ZlcmxpbmVgLGBsaW5lLXRocm91Z2hgLGBuby11bmRlcmxpbmVgXSwidGV4dC1kZWNvcmF0aW9uLXN0eWxlIjpbe2RlY29yYXRpb246Wy4uLmhlKCksYHdhdnlgXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246W1ksYGZyb20tZm9udGAsYGF1dG9gLFosd3ZdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOkQoKX1dLCJ1bmRlcmxpbmUtb2Zmc2V0IjpbeyJ1bmRlcmxpbmUtb2Zmc2V0IjpbWSxgYXV0b2AsWixYXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6W2B1cHBlcmNhc2VgLGBsb3dlcmNhc2VgLGBjYXBpdGFsaXplYCxgbm9ybWFsLWNhc2VgXSwidGV4dC1vdmVyZmxvdyI6W2B0cnVuY2F0ZWAsYHRleHQtZWxsaXBzaXNgLGB0ZXh0LWNsaXBgXSwidGV4dC13cmFwIjpbe3RleHQ6W2B3cmFwYCxgbm93cmFwYCxgYmFsYW5jZWAsYHByZXR0eWBdfV0saW5kZW50Olt7aW5kZW50OncoKX1dLCJ0YWItc2l6ZSI6W3t0YWI6W3B2LFosWF19XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246W2BiYXNlbGluZWAsYHRvcGAsYG1pZGRsZWAsYGJvdHRvbWAsYHRleHQtdG9wYCxgdGV4dC1ib3R0b21gLGBzdWJgLGBzdXBlcmAsWixYXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOltgbm9ybWFsYCxgbm93cmFwYCxgcHJlYCxgcHJlLWxpbmVgLGBwcmUtd3JhcGAsYGJyZWFrLXNwYWNlc2BdfV0sYnJlYWs6W3ticmVhazpbYG5vcm1hbGAsYHdvcmRzYCxgYWxsYCxga2VlcGBdfV0sd3JhcDpbe3dyYXA6W2BicmVhay13b3JkYCxgYW55d2hlcmVgLGBub3JtYWxgXX1dLGh5cGhlbnM6W3toeXBoZW5zOltgbm9uZWAsYG1hbnVhbGAsYGF1dG9gXX1dLGNvbnRlbnQ6W3tjb250ZW50Oltgbm9uZWAsWixYXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOltgZml4ZWRgLGBsb2NhbGAsYHNjcm9sbGBdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGB0ZXh0YF19XSwiYmctb3JpZ2luIjpbeyJiZy1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgXX1dLCJiZy1wb3NpdGlvbiI6W3tiZzpsZSgpfV0sImJnLXJlcGVhdCI6W3tiZzp1ZSgpfV0sImJnLXNpemUiOlt7Ymc6ZGUoKX1dLCJiZy1pbWFnZSI6W3tiZzpbYG5vbmVgLHtsaW5lYXI6W3t0bzpbYHRgLGB0cmAsYHJgLGBicmAsYGJgLGBibGAsYGxgLGB0bGBdfSxwdixaLFhdLHJhZGlhbDpbYGAsWixYXSxjb25pYzpbcHYsWixYXX0sRnYsa3ZdfV0sImJnLWNvbG9yIjpbe2JnOkQoKX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOmZlKCl9XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6ZmUoKX1dLCJncmFkaWVudC10by1wb3MiOlt7dG86ZmUoKX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206RCgpfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6RCgpfV0sImdyYWRpZW50LXRvIjpbe3RvOkQoKX1dLHJvdW5kZWQ6W3tyb3VuZGVkOnBlKCl9XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOnBlKCl9XSwicm91bmRlZC1lIjpbeyJyb3VuZGVkLWUiOnBlKCl9XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOnBlKCl9XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOnBlKCl9XSwicm91bmRlZC1iIjpbeyJyb3VuZGVkLWIiOnBlKCl9XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOnBlKCl9XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6cGUoKX1dLCJyb3VuZGVkLXNlIjpbeyJyb3VuZGVkLXNlIjpwZSgpfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOnBlKCl9XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6cGUoKX1dLCJyb3VuZGVkLXRsIjpbeyJyb3VuZGVkLXRsIjpwZSgpfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOnBlKCl9XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6cGUoKX1dLCJyb3VuZGVkLWJsIjpbeyJyb3VuZGVkLWJsIjpwZSgpfV0sImJvcmRlci13Ijpbe2JvcmRlcjptZSgpfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14IjptZSgpfV0sImJvcmRlci13LXkiOlt7ImJvcmRlci15IjptZSgpfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjptZSgpfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjptZSgpfV0sImJvcmRlci13LWJzIjpbeyJib3JkZXItYnMiOm1lKCl9XSwiYm9yZGVyLXctYmUiOlt7ImJvcmRlci1iZSI6bWUoKX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6bWUoKX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6bWUoKX1dLCJib3JkZXItdy1iIjpbeyJib3JkZXItYiI6bWUoKX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6bWUoKX1dLCJkaXZpZGUteCI6W3siZGl2aWRlLXgiOm1lKCl9XSwiZGl2aWRlLXgtcmV2ZXJzZSI6W2BkaXZpZGUteC1yZXZlcnNlYF0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6bWUoKX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbYGRpdmlkZS15LXJldmVyc2VgXSwiYm9yZGVyLXN0eWxlIjpbe2JvcmRlcjpbLi4uaGUoKSxgaGlkZGVuYCxgbm9uZWBdfV0sImRpdmlkZS1zdHlsZSI6W3tkaXZpZGU6Wy4uLmhlKCksYGhpZGRlbmAsYG5vbmVgXX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOkQoKX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOkQoKX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOkQoKX1dLCJib3JkZXItY29sb3ItcyI6W3siYm9yZGVyLXMiOkQoKX1dLCJib3JkZXItY29sb3ItZSI6W3siYm9yZGVyLWUiOkQoKX1dLCJib3JkZXItY29sb3ItYnMiOlt7ImJvcmRlci1icyI6RCgpfV0sImJvcmRlci1jb2xvci1iZSI6W3siYm9yZGVyLWJlIjpEKCl9XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10IjpEKCl9XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpEKCl9XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpEKCl9XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsuLi5oZSgpLGBub25lYCxgaGlkZGVuYF19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbWSxaLFhdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltgYCxZLGp2LHd2XX1dLCJvdXRsaW5lLWNvbG9yIjpbe291dGxpbmU6RCgpfV0sc2hhZG93Olt7c2hhZG93OltgYCxgbm9uZWAsdSxJdixBdl19XSwic2hhZG93LWNvbG9yIjpbe3NoYWRvdzpEKCl9XSwiaW5zZXQtc2hhZG93IjpbeyJpbnNldC1zaGFkb3ciOltgbm9uZWAsZCxJdixBdl19XSwiaW5zZXQtc2hhZG93LWNvbG9yIjpbeyJpbnNldC1zaGFkb3ciOkQoKX1dLCJyaW5nLXciOlt7cmluZzptZSgpfV0sInJpbmctdy1pbnNldCI6W2ByaW5nLWluc2V0YF0sInJpbmctY29sb3IiOlt7cmluZzpEKCl9XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltZLHd2XX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOkQoKX1dLCJpbnNldC1yaW5nLXciOlt7Imluc2V0LXJpbmciOm1lKCl9XSwiaW5zZXQtcmluZy1jb2xvciI6W3siaW5zZXQtcmluZyI6RCgpfV0sInRleHQtc2hhZG93IjpbeyJ0ZXh0LXNoYWRvdyI6W2Bub25lYCxmLEl2LEF2XX1dLCJ0ZXh0LXNoYWRvdy1jb2xvciI6W3sidGV4dC1zaGFkb3ciOkQoKX1dLG9wYWNpdHk6W3tvcGFjaXR5OltZLFosWF19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOlsuLi5nZSgpLGBwbHVzLWRhcmtlcmAsYHBsdXMtbGlnaHRlcmBdfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6Z2UoKX1dLCJtYXNrLWNsaXAiOlt7Im1hc2stY2xpcCI6W2Bib3JkZXJgLGBwYWRkaW5nYCxgY29udGVudGAsYGZpbGxgLGBzdHJva2VgLGB2aWV3YF19LGBtYXNrLW5vLWNsaXBgXSwibWFzay1jb21wb3NpdGUiOlt7bWFzazpbYGFkZGAsYHN1YnRyYWN0YCxgaW50ZXJzZWN0YCxgZXhjbHVkZWBdfV0sIm1hc2staW1hZ2UtbGluZWFyLXBvcyI6W3sibWFzay1saW5lYXIiOltZXX1dLCJtYXNrLWltYWdlLWxpbmVhci1mcm9tLXBvcyI6W3sibWFzay1saW5lYXItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1wb3MiOlt7Im1hc2stbGluZWFyLXRvIjpfZSgpfV0sIm1hc2staW1hZ2UtbGluZWFyLWZyb20tY29sb3IiOlt7Im1hc2stbGluZWFyLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1jb2xvciI6W3sibWFzay1saW5lYXItdG8iOkQoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1wb3MiOlt7Im1hc2stdC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtdC10by1wb3MiOlt7Im1hc2stdC10byI6X2UoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1jb2xvciI6W3sibWFzay10LWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXQtdG8tY29sb3IiOlt7Im1hc2stdC10byI6RCgpfV0sIm1hc2staW1hZ2Utci1mcm9tLXBvcyI6W3sibWFzay1yLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1yLXRvLXBvcyI6W3sibWFzay1yLXRvIjpfZSgpfV0sIm1hc2staW1hZ2Utci1mcm9tLWNvbG9yIjpbeyJtYXNrLXItZnJvbSI6RCgpfV0sIm1hc2staW1hZ2Utci10by1jb2xvciI6W3sibWFzay1yLXRvIjpEKCl9XSwibWFzay1pbWFnZS1iLWZyb20tcG9zIjpbeyJtYXNrLWItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWItdG8tcG9zIjpbeyJtYXNrLWItdG8iOl9lKCl9XSwibWFzay1pbWFnZS1iLWZyb20tY29sb3IiOlt7Im1hc2stYi1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS1iLXRvLWNvbG9yIjpbeyJtYXNrLWItdG8iOkQoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1wb3MiOlt7Im1hc2stbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtbC10by1wb3MiOlt7Im1hc2stbC10byI6X2UoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1jb2xvciI6W3sibWFzay1sLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWwtdG8tY29sb3IiOlt7Im1hc2stbC10byI6RCgpfV0sIm1hc2staW1hZ2UteC1mcm9tLXBvcyI6W3sibWFzay14LWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS14LXRvLXBvcyI6W3sibWFzay14LXRvIjpfZSgpfV0sIm1hc2staW1hZ2UteC1mcm9tLWNvbG9yIjpbeyJtYXNrLXgtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UteC10by1jb2xvciI6W3sibWFzay14LXRvIjpEKCl9XSwibWFzay1pbWFnZS15LWZyb20tcG9zIjpbeyJtYXNrLXktZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLXktdG8tcG9zIjpbeyJtYXNrLXktdG8iOl9lKCl9XSwibWFzay1pbWFnZS15LWZyb20tY29sb3IiOlt7Im1hc2steS1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS15LXRvLWNvbG9yIjpbeyJtYXNrLXktdG8iOkQoKX1dLCJtYXNrLWltYWdlLXJhZGlhbCI6W3sibWFzay1yYWRpYWwiOltaLFhdfV0sIm1hc2staW1hZ2UtcmFkaWFsLWZyb20tcG9zIjpbeyJtYXNrLXJhZGlhbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLXBvcyI6W3sibWFzay1yYWRpYWwtdG8iOl9lKCl9XSwibWFzay1pbWFnZS1yYWRpYWwtZnJvbS1jb2xvciI6W3sibWFzay1yYWRpYWwtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLWNvbG9yIjpbeyJtYXNrLXJhZGlhbC10byI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXNoYXBlIjpbeyJtYXNrLXJhZGlhbCI6W2BjaXJjbGVgLGBlbGxpcHNlYF19XSwibWFzay1pbWFnZS1yYWRpYWwtc2l6ZSI6W3sibWFzay1yYWRpYWwiOlt7Y2xvc2VzdDpbYHNpZGVgLGBjb3JuZXJgXSxmYXJ0aGVzdDpbYHNpZGVgLGBjb3JuZXJgXX1dfV0sIm1hc2staW1hZ2UtcmFkaWFsLXBvcyI6W3sibWFzay1yYWRpYWwtYXQiOmIoKX1dLCJtYXNrLWltYWdlLWNvbmljLXBvcyI6W3sibWFzay1jb25pYyI6W1ldfV0sIm1hc2staW1hZ2UtY29uaWMtZnJvbS1wb3MiOlt7Im1hc2stY29uaWMtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLXRvLXBvcyI6W3sibWFzay1jb25pYy10byI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLWZyb20tY29sb3IiOlt7Im1hc2stY29uaWMtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtY29uaWMtdG8tY29sb3IiOlt7Im1hc2stY29uaWMtdG8iOkQoKX1dLCJtYXNrLW1vZGUiOlt7bWFzazpbYGFscGhhYCxgbHVtaW5hbmNlYCxgbWF0Y2hgXX1dLCJtYXNrLW9yaWdpbiI6W3sibWFzay1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGBmaWxsYCxgc3Ryb2tlYCxgdmlld2BdfV0sIm1hc2stcG9zaXRpb24iOlt7bWFzazpsZSgpfV0sIm1hc2stcmVwZWF0Ijpbe21hc2s6dWUoKX1dLCJtYXNrLXNpemUiOlt7bWFzazpkZSgpfV0sIm1hc2stdHlwZSI6W3sibWFzay10eXBlIjpbYGFscGhhYCxgbHVtaW5hbmNlYF19XSwibWFzay1pbWFnZSI6W3ttYXNrOltgbm9uZWAsWixYXX1dLGZpbHRlcjpbe2ZpbHRlcjpbYGAsYG5vbmVgLFosWF19XSxibHVyOlt7Ymx1cjp2ZSgpfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W1ksWixYXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W1ksWixYXX1dLCJkcm9wLXNoYWRvdyI6W3siZHJvcC1zaGFkb3ciOltgYCxgbm9uZWAscCxJdixBdl19XSwiZHJvcC1zaGFkb3ctY29sb3IiOlt7ImRyb3Atc2hhZG93IjpEKCl9XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W2BgLFksWixYXX1dLCJodWUtcm90YXRlIjpbeyJodWUtcm90YXRlIjpbWSxaLFhdfV0saW52ZXJ0Olt7aW52ZXJ0OltgYCxZLFosWF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOltZLFosWF19XSxzZXBpYTpbe3NlcGlhOltgYCxZLFosWF19XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOltgYCxgbm9uZWAsWixYXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjp2ZSgpfV0sImJhY2tkcm9wLWJyaWdodG5lc3MiOlt7ImJhY2tkcm9wLWJyaWdodG5lc3MiOltZLFosWF19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbWSxaLFhdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbYGAsWSxaLFhdfV0sImJhY2tkcm9wLWh1ZS1yb3RhdGUiOlt7ImJhY2tkcm9wLWh1ZS1yb3RhdGUiOltZLFosWF19XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltgYCxZLFosWF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W1ksWixYXX1dLCJiYWNrZHJvcC1zYXR1cmF0ZSI6W3siYmFja2Ryb3Atc2F0dXJhdGUiOltZLFosWF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpbYGAsWSxaLFhdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6W2Bjb2xsYXBzZWAsYHNlcGFyYXRlYF19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjp3KCl9XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6dygpfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOncoKX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6W2BhdXRvYCxgZml4ZWRgXX1dLGNhcHRpb246W3tjYXB0aW9uOltgdG9wYCxgYm90dG9tYF19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbYGAsYGFsbGAsYGNvbG9yc2AsYG9wYWNpdHlgLGBzaGFkb3dgLGB0cmFuc2Zvcm1gLGBub25lYCxaLFhdfV0sInRyYW5zaXRpb24tYmVoYXZpb3IiOlt7dHJhbnNpdGlvbjpbYG5vcm1hbGAsYGRpc2NyZXRlYF19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOltZLGBpbml0aWFsYCxaLFhdfV0sZWFzZTpbe2Vhc2U6W2BsaW5lYXJgLGBpbml0aWFsYCxfLFosWF19XSxkZWxheTpbe2RlbGF5OltZLFosWF19XSxhbmltYXRlOlt7YW5pbWF0ZTpbYG5vbmVgLHYsWixYXX1dLGJhY2tmYWNlOlt7YmFja2ZhY2U6W2BoaWRkZW5gLGB2aXNpYmxlYF19XSxwZXJzcGVjdGl2ZTpbe3BlcnNwZWN0aXZlOltoLFosWF19XSwicGVyc3BlY3RpdmUtb3JpZ2luIjpbeyJwZXJzcGVjdGl2ZS1vcmlnaW4iOngoKX1dLHJvdGF0ZTpbe3JvdGF0ZTp5ZSgpfV0sInJvdGF0ZS14IjpbeyJyb3RhdGUteCI6eWUoKX1dLCJyb3RhdGUteSI6W3sicm90YXRlLXkiOnllKCl9XSwicm90YXRlLXoiOlt7InJvdGF0ZS16Ijp5ZSgpfV0sc2NhbGU6W3tzY2FsZTpiZSgpfV0sInNjYWxlLXgiOlt7InNjYWxlLXgiOmJlKCl9XSwic2NhbGUteSI6W3sic2NhbGUteSI6YmUoKX1dLCJzY2FsZS16IjpbeyJzY2FsZS16IjpiZSgpfV0sInNjYWxlLTNkIjpbYHNjYWxlLTNkYF0sc2tldzpbe3NrZXc6TygpfV0sInNrZXcteCI6W3sic2tldy14IjpPKCl9XSwic2tldy15IjpbeyJza2V3LXkiOk8oKX1dLHRyYW5zZm9ybTpbe3RyYW5zZm9ybTpbWixYLGBgLGBub25lYCxgZ3B1YCxgY3B1YF19XSwidHJhbnNmb3JtLW9yaWdpbiI6W3tvcmlnaW46eCgpfV0sInRyYW5zZm9ybS1zdHlsZSI6W3t0cmFuc2Zvcm06W2AzZGAsYGZsYXRgXX1dLHRyYW5zbGF0ZTpbe3RyYW5zbGF0ZTp4ZSgpfV0sInRyYW5zbGF0ZS14IjpbeyJ0cmFuc2xhdGUteCI6eGUoKX1dLCJ0cmFuc2xhdGUteSI6W3sidHJhbnNsYXRlLXkiOnhlKCl9XSwidHJhbnNsYXRlLXoiOlt7InRyYW5zbGF0ZS16Ijp4ZSgpfV0sInRyYW5zbGF0ZS1ub25lIjpbYHRyYW5zbGF0ZS1ub25lYF0sem9vbTpbe3pvb206W3B2LFosWF19XSxhY2NlbnQ6W3thY2NlbnQ6RCgpfV0sYXBwZWFyYW5jZTpbe2FwcGVhcmFuY2U6W2Bub25lYCxgYXV0b2BdfV0sImNhcmV0LWNvbG9yIjpbe2NhcmV0OkQoKX1dLCJjb2xvci1zY2hlbWUiOlt7c2NoZW1lOltgbm9ybWFsYCxgZGFya2AsYGxpZ2h0YCxgbGlnaHQtZGFya2AsYG9ubHktZGFya2AsYG9ubHktbGlnaHRgXX1dLGN1cnNvcjpbe2N1cnNvcjpbYGF1dG9gLGBkZWZhdWx0YCxgcG9pbnRlcmAsYHdhaXRgLGB0ZXh0YCxgbW92ZWAsYGhlbHBgLGBub3QtYWxsb3dlZGAsYG5vbmVgLGBjb250ZXh0LW1lbnVgLGBwcm9ncmVzc2AsYGNlbGxgLGBjcm9zc2hhaXJgLGB2ZXJ0aWNhbC10ZXh0YCxgYWxpYXNgLGBjb3B5YCxgbm8tZHJvcGAsYGdyYWJgLGBncmFiYmluZ2AsYGFsbC1zY3JvbGxgLGBjb2wtcmVzaXplYCxgcm93LXJlc2l6ZWAsYG4tcmVzaXplYCxgZS1yZXNpemVgLGBzLXJlc2l6ZWAsYHctcmVzaXplYCxgbmUtcmVzaXplYCxgbnctcmVzaXplYCxgc2UtcmVzaXplYCxgc3ctcmVzaXplYCxgZXctcmVzaXplYCxgbnMtcmVzaXplYCxgbmVzdy1yZXNpemVgLGBud3NlLXJlc2l6ZWAsYHpvb20taW5gLGB6b29tLW91dGAsWixYXX1dLCJmaWVsZC1zaXppbmciOlt7ImZpZWxkLXNpemluZyI6W2BmaXhlZGAsYGNvbnRlbnRgXX1dLCJwb2ludGVyLWV2ZW50cyI6W3sicG9pbnRlci1ldmVudHMiOltgYXV0b2AsYG5vbmVgXX1dLHJlc2l6ZTpbe3Jlc2l6ZTpbYG5vbmVgLGBgLGB5YCxgeGBdfV0sInNjcm9sbC1iZWhhdmlvciI6W3tzY3JvbGw6W2BhdXRvYCxgc21vb3RoYF19XSwic2Nyb2xsYmFyLXRodW1iLWNvbG9yIjpbeyJzY3JvbGxiYXItdGh1bWIiOkQoKX1dLCJzY3JvbGxiYXItdHJhY2stY29sb3IiOlt7InNjcm9sbGJhci10cmFjayI6RCgpfV0sInNjcm9sbGJhci1ndXR0ZXIiOlt7InNjcm9sbGJhci1ndXR0ZXIiOltgYXV0b2AsYHN0YWJsZWAsYGJvdGhgXX1dLCJzY3JvbGxiYXItdyI6W3tzY3JvbGxiYXI6W2BhdXRvYCxgdGhpbmAsYG5vbmVgXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOncoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6dygpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15Ijp3KCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOncoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6dygpfV0sInNjcm9sbC1tYnMiOlt7InNjcm9sbC1tYnMiOncoKX1dLCJzY3JvbGwtbWJlIjpbeyJzY3JvbGwtbWJlIjp3KCl9XSwic2Nyb2xsLW10IjpbeyJzY3JvbGwtbXQiOncoKX1dLCJzY3JvbGwtbXIiOlt7InNjcm9sbC1tciI6dygpfV0sInNjcm9sbC1tYiI6W3sic2Nyb2xsLW1iIjp3KCl9XSwic2Nyb2xsLW1sIjpbeyJzY3JvbGwtbWwiOncoKX1dLCJzY3JvbGwtcCI6W3sic2Nyb2xsLXAiOncoKX1dLCJzY3JvbGwtcHgiOlt7InNjcm9sbC1weCI6dygpfV0sInNjcm9sbC1weSI6W3sic2Nyb2xsLXB5Ijp3KCl9XSwic2Nyb2xsLXBzIjpbeyJzY3JvbGwtcHMiOncoKX1dLCJzY3JvbGwtcGUiOlt7InNjcm9sbC1wZSI6dygpfV0sInNjcm9sbC1wYnMiOlt7InNjcm9sbC1wYnMiOncoKX1dLCJzY3JvbGwtcGJlIjpbeyJzY3JvbGwtcGJlIjp3KCl9XSwic2Nyb2xsLXB0IjpbeyJzY3JvbGwtcHQiOncoKX1dLCJzY3JvbGwtcHIiOlt7InNjcm9sbC1wciI6dygpfV0sInNjcm9sbC1wYiI6W3sic2Nyb2xsLXBiIjp3KCl9XSwic2Nyb2xsLXBsIjpbeyJzY3JvbGwtcGwiOncoKX1dLCJzbmFwLWFsaWduIjpbe3NuYXA6W2BzdGFydGAsYGVuZGAsYGNlbnRlcmAsYGFsaWduLW5vbmVgXX1dLCJzbmFwLXN0b3AiOlt7c25hcDpbYG5vcm1hbGAsYGFsd2F5c2BdfV0sInNuYXAtdHlwZSI6W3tzbmFwOltgbm9uZWAsYHhgLGB5YCxgYm90aGBdfV0sInNuYXAtc3RyaWN0bmVzcyI6W3tzbmFwOltgbWFuZGF0b3J5YCxgcHJveGltaXR5YF19XSx0b3VjaDpbe3RvdWNoOltgYXV0b2AsYG5vbmVgLGBtYW5pcHVsYXRpb25gXX1dLCJ0b3VjaC14IjpbeyJ0b3VjaC1wYW4iOltgeGAsYGxlZnRgLGByaWdodGBdfV0sInRvdWNoLXkiOlt7InRvdWNoLXBhbiI6W2B5YCxgdXBgLGBkb3duYF19XSwidG91Y2gtcHoiOltgdG91Y2gtcGluY2gtem9vbWBdLHNlbGVjdDpbe3NlbGVjdDpbYG5vbmVgLGB0ZXh0YCxgYWxsYCxgYXV0b2BdfV0sIndpbGwtY2hhbmdlIjpbeyJ3aWxsLWNoYW5nZSI6W2BhdXRvYCxgc2Nyb2xsYCxgY29udGVudHNgLGB0cmFuc2Zvcm1gLFosWF19XSxmaWxsOlt7ZmlsbDpbYG5vbmVgLC4uLkQoKV19XSwic3Ryb2tlLXciOlt7c3Ryb2tlOltZLGp2LHd2LFR2XX1dLHN0cm9rZTpbe3N0cm9rZTpbYG5vbmVgLC4uLkQoKV19XSwiZm9yY2VkLWNvbG9yLWFkanVzdCI6W3siZm9yY2VkLWNvbG9yLWFkanVzdCI6W2BhdXRvYCxgbm9uZWBdfV19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cHM6eyJjb250YWluZXItbmFtZWQiOltgY29udGFpbmVyLXR5cGVgXSxvdmVyZmxvdzpbYG92ZXJmbG93LXhgLGBvdmVyZmxvdy15YF0sb3ZlcnNjcm9sbDpbYG92ZXJzY3JvbGwteGAsYG92ZXJzY3JvbGwteWBdLGluc2V0OltgaW5zZXQteGAsYGluc2V0LXlgLGBpbnNldC1ic2AsYGluc2V0LWJlYCxgc3RhcnRgLGBlbmRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSwiaW5zZXQteCI6W2ByaWdodGAsYGxlZnRgXSwiaW5zZXQteSI6W2B0b3BgLGBib3R0b21gXSxmbGV4OltgYmFzaXNgLGBncm93YCxgc2hyaW5rYF0sZ2FwOltgZ2FwLXhgLGBnYXAteWBdLHA6W2BweGAsYHB5YCxgcHNgLGBwZWAsYHBic2AsYHBiZWAsYHB0YCxgcHJgLGBwYmAsYHBsYF0scHg6W2BwcmAsYHBsYF0scHk6W2BwdGAsYHBiYF0sbTpbYG14YCxgbXlgLGBtc2AsYG1lYCxgbWJzYCxgbWJlYCxgbXRgLGBtcmAsYG1iYCxgbWxgXSxteDpbYG1yYCxgbWxgXSxteTpbYG10YCxgbWJgXSxzaXplOltgd2AsYGhgXSwiZm9udC1zaXplIjpbYGxlYWRpbmdgXSwiZnZuLW5vcm1hbCI6W2Bmdm4tb3JkaW5hbGAsYGZ2bi1zbGFzaGVkLXplcm9gLGBmdm4tZmlndXJlYCxgZnZuLXNwYWNpbmdgLGBmdm4tZnJhY3Rpb25gXSwiZnZuLW9yZGluYWwiOltgZnZuLW5vcm1hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZpZ3VyZSI6W2Bmdm4tbm9ybWFsYF0sImZ2bi1zcGFjaW5nIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZyYWN0aW9uIjpbYGZ2bi1ub3JtYWxgXSwibGluZS1jbGFtcCI6W2BkaXNwbGF5YCxgb3ZlcmZsb3dgXSxyb3VuZGVkOltgcm91bmRlZC1zYCxgcm91bmRlZC1lYCxgcm91bmRlZC10YCxgcm91bmRlZC1yYCxgcm91bmRlZC1iYCxgcm91bmRlZC1sYCxgcm91bmRlZC1zc2AsYHJvdW5kZWQtc2VgLGByb3VuZGVkLWVlYCxgcm91bmRlZC1lc2AsYHJvdW5kZWQtdGxgLGByb3VuZGVkLXRyYCxgcm91bmRlZC1icmAsYHJvdW5kZWQtYmxgXSwicm91bmRlZC1zIjpbYHJvdW5kZWQtc3NgLGByb3VuZGVkLWVzYF0sInJvdW5kZWQtZSI6W2Byb3VuZGVkLXNlYCxgcm91bmRlZC1lZWBdLCJyb3VuZGVkLXQiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtdHJgXSwicm91bmRlZC1yIjpbYHJvdW5kZWQtdHJgLGByb3VuZGVkLWJyYF0sInJvdW5kZWQtYiI6W2Byb3VuZGVkLWJyYCxgcm91bmRlZC1ibGBdLCJyb3VuZGVkLWwiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtYmxgXSwiYm9yZGVyLXNwYWNpbmciOltgYm9yZGVyLXNwYWNpbmcteGAsYGJvcmRlci1zcGFjaW5nLXlgXSwiYm9yZGVyLXciOltgYm9yZGVyLXcteGAsYGJvcmRlci13LXlgLGBib3JkZXItdy1zYCxgYm9yZGVyLXctZWAsYGJvcmRlci13LWJzYCxgYm9yZGVyLXctYmVgLGBib3JkZXItdy10YCxgYm9yZGVyLXctcmAsYGJvcmRlci13LWJgLGBib3JkZXItdy1sYF0sImJvcmRlci13LXgiOltgYm9yZGVyLXctcmAsYGJvcmRlci13LWxgXSwiYm9yZGVyLXcteSI6W2Bib3JkZXItdy10YCxgYm9yZGVyLXctYmBdLCJib3JkZXItY29sb3IiOltgYm9yZGVyLWNvbG9yLXhgLGBib3JkZXItY29sb3IteWAsYGJvcmRlci1jb2xvci1zYCxgYm9yZGVyLWNvbG9yLWVgLGBib3JkZXItY29sb3ItYnNgLGBib3JkZXItY29sb3ItYmVgLGBib3JkZXItY29sb3ItdGAsYGJvcmRlci1jb2xvci1yYCxgYm9yZGVyLWNvbG9yLWJgLGBib3JkZXItY29sb3ItbGBdLCJib3JkZXItY29sb3IteCI6W2Bib3JkZXItY29sb3ItcmAsYGJvcmRlci1jb2xvci1sYF0sImJvcmRlci1jb2xvci15IjpbYGJvcmRlci1jb2xvci10YCxgYm9yZGVyLWNvbG9yLWJgXSx0cmFuc2xhdGU6W2B0cmFuc2xhdGUteGAsYHRyYW5zbGF0ZS15YCxgdHJhbnNsYXRlLW5vbmVgXSwidHJhbnNsYXRlLW5vbmUiOltgdHJhbnNsYXRlYCxgdHJhbnNsYXRlLXhgLGB0cmFuc2xhdGUteWAsYHRyYW5zbGF0ZS16YF0sInNjcm9sbC1tIjpbYHNjcm9sbC1teGAsYHNjcm9sbC1teWAsYHNjcm9sbC1tc2AsYHNjcm9sbC1tZWAsYHNjcm9sbC1tYnNgLGBzY3JvbGwtbWJlYCxgc2Nyb2xsLW10YCxgc2Nyb2xsLW1yYCxgc2Nyb2xsLW1iYCxgc2Nyb2xsLW1sYF0sInNjcm9sbC1teCI6W2BzY3JvbGwtbXJgLGBzY3JvbGwtbWxgXSwic2Nyb2xsLW15IjpbYHNjcm9sbC1tdGAsYHNjcm9sbC1tYmBdLCJzY3JvbGwtcCI6W2BzY3JvbGwtcHhgLGBzY3JvbGwtcHlgLGBzY3JvbGwtcHNgLGBzY3JvbGwtcGVgLGBzY3JvbGwtcGJzYCxgc2Nyb2xsLXBiZWAsYHNjcm9sbC1wdGAsYHNjcm9sbC1wcmAsYHNjcm9sbC1wYmAsYHNjcm9sbC1wbGBdLCJzY3JvbGwtcHgiOltgc2Nyb2xsLXByYCxgc2Nyb2xsLXBsYF0sInNjcm9sbC1weSI6W2BzY3JvbGwtcHRgLGBzY3JvbGwtcGJgXSx0b3VjaDpbYHRvdWNoLXhgLGB0b3VjaC15YCxgdG91Y2gtcHpgXSwidG91Y2gteCI6W2B0b3VjaGBdLCJ0b3VjaC15IjpbYHRvdWNoYF0sInRvdWNoLXB6IjpbYHRvdWNoYF19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczp7ImZvbnQtc2l6ZSI6W2BsZWFkaW5nYF19LHBvc3RmaXhMb29rdXBDbGFzc0dyb3VwczpbYGNvbnRhaW5lci10eXBlYF0sb3JkZXJTZW5zaXRpdmVNb2RpZmllcnM6W2AqYCxgKipgLGBhZnRlcmAsYGJhY2tkcm9wYCxgYmVmb3JlYCxgZGV0YWlscy1jb250ZW50YCxgZmlsZWAsYGZpcnN0LWxldHRlcmAsYGZpcnN0LWxpbmVgLGBtYXJrZXJgLGBwbGFjZWhvbGRlcmAsYHNlbGVjdGlvbmBdfX0pO2Z1bmN0aW9uIFl2KC4uLmUpe3JldHVybiBKdihiXyhlKSl9dmFyIFh2PUYoe19fbmFtZTpgQWxlcnRgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfSx2YXJpYW50Ont9fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihuLHIpPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBhbGVydGAsY2xhc3M6TyhOKFl2KShOKCR2KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKSkscm9sZTpgYWxlcnRgfSxbSShuLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWnY9Rih7X19uYW1lOmBBbGVydERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGFsZXJ0LWRlc2NyaXB0aW9uYCxjbGFzczpPKE4oWXYpKGB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbSB0ZXh0LWJhbGFuY2UgbWQ6dGV4dC1wcmV0dHkgWyZfcDpub3QoOmxhc3QtY2hpbGQpXTptYi00IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxRdj1GKHtfX25hbWU6YEFsZXJ0VGl0bGVgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgYWxlcnQtdGl0bGVgLGNsYXNzOk8oTihZdikoYGZvbnQtbWVkaXVtIGdyb3VwLWhhcy1bPnN2Z10vYWxlcnQ6Y29sLXN0YXJ0LTIgY24tZm9udC1oZWFkaW5nIFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSwkdj1DXyhgZ3JpZCBnYXAtMC41IHJvdW5kZWQtbGcgYm9yZGVyIHB4LTIuNSBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGhhcy1kYXRhLVtzbG90PWFsZXJ0LWFjdGlvbl06cmVsYXRpdmUgaGFzLWRhdGEtW3Nsb3Q9YWxlcnQtYWN0aW9uXTpwci0xOCBoYXMtWz5zdmddOmdyaWQtY29scy1bYXV0b18xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMiAqOltzdmddOnJvdy1zcGFuLTIgKjpbc3ZnXTp0cmFuc2xhdGUteS0wLjUgKjpbc3ZnXTp0ZXh0LWN1cnJlbnQgKjpbc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBncm91cC9hbGVydCByZWxhdGl2ZSB3LWZ1bGxgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZGAsZGVzdHJ1Y3RpdmU6YHRleHQtZGVzdHJ1Y3RpdmUgYmctY2FyZCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZGVzdHJ1Y3RpdmUvOTAgKjpbc3ZnXTp0ZXh0LWN1cnJlbnRgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YH19KTtmdW5jdGlvbiBleShlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgP2AnJHtlfSdgOm5ldyBpeSgpLnNlcmlhbGl6ZShlKX12YXIgdHk9YCBfLSw7OiE/LiciKClbXXt9QCovXFwmIyVcYF4rPD0+fH4kMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YCxueT0oZnVuY3Rpb24oKXtsZXQgZT1uZXcgVWludDhBcnJheSgxMjgpO2ZvcihsZXQgdD0wO3Q8Njk7dCsrKWVbdHkuY2hhckNvZGVBdCh0KV09dCsxO2ZvcihsZXQgdD02NTt0PD05MDt0KyspZVt0XT1lW3QrMzJdO3JldHVybiBlfSkoKTtmdW5jdGlvbiByeShlLHQpe2lmKGU9PT10KXJldHVybiAwO2xldCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49ZS5jaGFyQ29kZUF0KGkpLGE9dC5jaGFyQ29kZUF0KGkpO2lmKG49PT1hKWNvbnRpbnVlO2xldCBvPW48MTI4JiZueVtuXT9ueVtuXTpuKzEyOCxzPWE8MTI4JiZueVthXT9ueVthXTphKzEyODtpZihvIT09cylyZXR1cm4gbzxzPy0xOjE7cj09PTAmJihyPW4+YT8tMToxKX1yZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aD9yOmUubGVuZ3RoPHQubGVuZ3RoPy0xOjF9dmFyIGl5PShmdW5jdGlvbigpe2NsYXNzIGV7I2U9bmV3IE1hcDtjb21wYXJlKGUsdCl7bGV0IG49dHlwZW9mIGUscj10eXBlb2YgdDtyZXR1cm4gbj09PWBzdHJpbmdgJiZyPT09YHN0cmluZ2A/cnkoZSx0KTpuPT09YG51bWJlcmAmJnI9PT1gbnVtYmVyYD9lLXQ6cnkodGhpcy5zZXJpYWxpemUoZSwhMCksdGhpcy5zZXJpYWxpemUodCwhMCkpfXNlcmlhbGl6ZShlLHQpe2lmKGU9PT1udWxsKXJldHVybmBudWxsYDtzd2l0Y2godHlwZW9mIGUpe2Nhc2Vgc3RyaW5nYDpyZXR1cm4gdD9lOmAnJHtlfSdgO2Nhc2VgYmlnaW50YDpyZXR1cm5gJHtlfW5gO2Nhc2Vgb2JqZWN0YDpyZXR1cm4gdGhpcy4kb2JqZWN0KGUpO2Nhc2VgZnVuY3Rpb25gOnJldHVybiB0aGlzLiRmdW5jdGlvbihlKX1yZXR1cm4gU3RyaW5nKGUpfXNlcmlhbGl6ZU9iamVjdChlKXtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYodCE9PWBbb2JqZWN0IE9iamVjdF1gKXJldHVybiB0aGlzLnNlcmlhbGl6ZUJ1aWx0SW5UeXBlKHQubGVuZ3RoPDEwP2B1bmtub3duOiR7dH1gOnQuc2xpY2UoOCwtMSksZSk7bGV0IG49ZS5jb25zdHJ1Y3RvcixyPW49PT1PYmplY3R8fG49PT12b2lkIDA/YGA6bi5uYW1lO2lmKHIhPT1gYCYmZ2xvYmFsVGhpc1tyXT09PW4pcmV0dXJuIHRoaXMuc2VyaWFsaXplQnVpbHRJblR5cGUocixlKTtpZihgdG9KU09OYGluIGUmJnR5cGVvZiBlLnRvSlNPTj09YGZ1bmN0aW9uYCl7bGV0IHQ9ZS50b0pTT04oKTtyZXR1cm4gcisodHlwZW9mIHQ9PWBvYmplY3RgJiZ0P3RoaXMuJG9iamVjdCh0KTpgKCR7dGhpcy5zZXJpYWxpemUodCl9KWApfWxldCBpPU9iamVjdC5rZXlzKGUpLnNvcnQocnkpLGE9YCR7cn17YDtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IG49aVt0XTthKz1gJHtufToke3RoaXMuc2VyaWFsaXplKGVbbl0pfWAsdDxpLmxlbmd0aC0xJiYoYSs9YCxgKX1yZXR1cm4gYStgfWB9c2VyaWFsaXplQnVpbHRJblR5cGUoZSx0KXtsZXQgbj10aGlzW2AkYCtlXTtpZihuKXJldHVybiBuLmNhbGwodGhpcyx0KTtpZih0eXBlb2YgdC5lbnRyaWVzPT1gZnVuY3Rpb25gKXJldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0LmVudHJpZXMoKSk7dGhyb3cgRXJyb3IoYENhbm5vdCBzZXJpYWxpemUgJHtlfWApfXNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0KXtsZXQgbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlWzBdLHRbMF0pKSxyPWAke2V9e2A7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2xldFt0LGldPW5bZV07cis9YCR7dGhpcy5zZXJpYWxpemUodCwhMCl9OiR7dGhpcy5zZXJpYWxpemUoaSl9YCxlPG4ubGVuZ3RoLTEmJihyKz1gLGApfXJldHVybiByK2B9YH0kb2JqZWN0KGUpe2xldCB0PXRoaXMuI2UuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiYodGhpcy4jZS5zZXQoZSxgIyR7dGhpcy4jZS5zaXplfWApLHQ9dGhpcy5zZXJpYWxpemVPYmplY3QoZSksdGhpcy4jZS5zZXQoZSx0KSksdH0kZnVuY3Rpb24oZSl7bGV0IHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoLTE1KT09PWBbbmF0aXZlIGNvZGVdIH1gP2Ake2UubmFtZXx8YGB9KClbbmF0aXZlXWA6YCR7ZS5uYW1lfSgke2UubGVuZ3RofSkke3QucmVwbGFjZSgvXHMqXG5ccyovZyxgYCl9YH0kQXJyYXkoZSl7bGV0IHQ9YFtgO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPXRoaXMuc2VyaWFsaXplKGVbbl0pLG48ZS5sZW5ndGgtMSYmKHQrPWAsYCk7cmV0dXJuIHQrYF1gfSREYXRlKGUpe3RyeXtyZXR1cm5gRGF0ZSgke2UudG9JU09TdHJpbmcoKX0pYH1jYXRjaHtyZXR1cm5gRGF0ZShudWxsKWB9fSRBcnJheUJ1ZmZlcihlKXtyZXR1cm5gQXJyYXlCdWZmZXJbJHtuZXcgVWludDhBcnJheShlKS5qb2luKGAsYCl9XWB9JFNldChlKXtyZXR1cm5gU2V0JHt0aGlzLiRBcnJheShBcnJheS5mcm9tKGUpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlLHQpKSl9YH0kTWFwKGUpe3JldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoYE1hcGAsZS5lbnRyaWVzKCkpfX1mb3IobGV0IHQgb2ZbYEVycm9yYCxgUmVnRXhwYCxgVVJMYF0pZS5wcm90b3R5cGVbYCRgK3RdPWZ1bmN0aW9uKGUpe3JldHVybmAke3R9KCR7ZX0pYH07Zm9yKGxldCB0IG9mW2BJbnQ4QXJyYXlgLGBVaW50OEFycmF5YCxgVWludDhDbGFtcGVkQXJyYXlgLGBJbnQxNkFycmF5YCxgVWludDE2QXJyYXlgLGBJbnQzMkFycmF5YCxgVWludDMyQXJyYXlgLGBGbG9hdDMyQXJyYXlgLGBGbG9hdDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYCxgKX1dYH07Zm9yKGxldCB0IG9mW2BCaWdJbnQ2NEFycmF5YCxgQmlnVWludDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYG4sYCl9JHtlLmxlbmd0aD4wP2BuYDpgYH1dYH07cmV0dXJuIGV9KSgpO2Z1bmN0aW9uIGF5KGUsdCl7cmV0dXJuIGU9PT10fHxleShlKT09PWV5KHQpfWZ1bmN0aW9uIG95KGUsdCl7bGV0IG49dHlwZW9mIGU9PWBzdHJpbmdgJiYhdD9gJHtlfUNvbnRleHRgOnQscj1TeW1ib2wobik7cmV0dXJuW3Q9PntsZXQgbj15cihyLHQpO2lmKG58fG49PT1udWxsKXJldHVybiBuO3Rocm93IEVycm9yKGBJbmplY3Rpb24gXGAke3IudG9TdHJpbmcoKX1cYCBub3QgZm91bmQuIENvbXBvbmVudCBtdXN0IGJlIHVzZWQgd2l0aGluICR7QXJyYXkuaXNBcnJheShlKT9gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJHtlLmpvaW4oYCwgYCl9YDpgXGAke2V9XGBgfWApfSxlPT4odnIocixlKSxlKV19ZnVuY3Rpb24gc3koKXtsZXQgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKDtlIT1udWxsJiZlLnNoYWRvd1Jvb3QhPW51bGwmJmUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50IT1udWxsOyllPWUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBlfWZ1bmN0aW9uIGN5KGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIGx5KGUsdCl7cmV0dXJuIGN5KGUpPyExOkFycmF5LmlzQXJyYXkoZSk/ZS5zb21lKGU9PmF5KGUsdCkpOmF5KGUsdCl9ZnVuY3Rpb24gdXkoZSx0KXtyZXR1cm4gRmUoKT8oSWUoZSx0KSwhMCk6ITF9ZnVuY3Rpb24gZHkoZSl7bGV0IHQ9ITEsbixyPVBlKCEwKTtyZXR1cm4oKC4uLmkpPT4odHx8PShuPXIucnVuKCgpPT5lKC4uLmkpKSwhMCksbikpfXZhciBmeT10eXBlb2Ygd2luZG93PGB1YCYmdHlwZW9mIGRvY3VtZW50PGB1YDt0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8YHVgJiZnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7dmFyIHB5PWU9PmUhPT12b2lkIDAsbXk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoeT1lPT5teS5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAsZ3k9X3koKTtmdW5jdGlvbiBfeSgpe3ZhciBlLHQ7cmV0dXJuIGZ5JiYhISgoZT13aW5kb3cpIT1udWxsJiYoZT1lLm5hdmlnYXRvcikhPW51bGwmJmUudXNlckFnZW50KSYmKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KXx8KCh0PXdpbmRvdyk9PW51bGx8fCh0PXQubmF2aWdhdG9yKT09bnVsbD92b2lkIDA6dC5tYXhUb3VjaFBvaW50cyk+MiYmL2lQYWR8TWFjaW50b3NoLy50ZXN0KHdpbmRvdz8ubmF2aWdhdG9yLnVzZXJBZ2VudCkpfWZ1bmN0aW9uIHZ5KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W2VdfWZ1bmN0aW9uIHl5KGUpe3JldHVybiBlfHxGcygpfWZ1bmN0aW9uIGJ5KGUpe2lmKCFmeSlyZXR1cm4gZTtsZXQgdD0wLG4scixpPSgpPT57LS10LHImJnQ8PTAmJihyLnN0b3AoKSxuPXZvaWQgMCxyPXZvaWQgMCl9O3JldHVybigoLi4uYSk9Pih0Kz0xLHJ8fChyPVBlKCEwKSxuPXIucnVuKCgpPT5lKC4uLmEpKSksdXkoaSksbikpfWZ1bmN0aW9uIHh5KGUpe3JldHVybiBadChqKGUpP25ldyBQcm94eSh7fSx7Z2V0KHQsbixyKXtyZXR1cm4gTihSZWZsZWN0LmdldChlLnZhbHVlLG4scikpfSxzZXQodCxuLHIpe3JldHVybiBqKGUudmFsdWVbbl0pJiYhaihyKT9lLnZhbHVlW25dLnZhbHVlPXI6ZS52YWx1ZVtuXT1yLCEwfSxkZWxldGVQcm9wZXJ0eSh0LG4pe3JldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUudmFsdWUsbil9LGhhcyh0LG4pe3JldHVybiBSZWZsZWN0LmhhcyhlLnZhbHVlLG4pfSxvd25LZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUudmFsdWUpfSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKXtyZXR1cm57ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9fX0pOmUpfWZ1bmN0aW9uIFN5KGUpe3JldHVybiB4eShXKGUpKX1mdW5jdGlvbiBDeShlLC4uLnQpe2xldCBuPXQuZmxhdCgpLHI9blswXTtyZXR1cm4gU3koKCk9Pk9iamVjdC5mcm9tRW50cmllcyh0eXBlb2Ygcj09YGZ1bmN0aW9uYD9PYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKChbZSx0XSk9PiFyKG1uKHQpLGUpKTpPYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKGU9PiFuLmluY2x1ZGVzKGVbMF0pKSkpfWZ1bmN0aW9uIHd5KGUsdD0xZTQpe3JldHVybiB2bigobixyKT0+e2xldCBpPW1uKGUpLGEsbz0oKT0+c2V0VGltZW91dCgoKT0+e2k9bW4oZSkscigpfSxtbih0KSk7cmV0dXJuIHV5KCgpPT57Y2xlYXJUaW1lb3V0KGEpfSkse2dldCgpe3JldHVybiBuKCksaX0sc2V0KGUpe2k9ZSxyKCksY2xlYXJUaW1lb3V0KGEpLGE9bygpfX19KX1mdW5jdGlvbiBUeShlLHQpe3l5KHQpJiZlYShlLHQpfWZ1bmN0aW9uIEV5KGUsdCxuKXtyZXR1cm4gRXIoZSx0LHsuLi5uLGltbWVkaWF0ZTohMH0pfXZhciBEeT1meT93aW5kb3c6dm9pZCAwO2Z5JiZ3aW5kb3cuZG9jdW1lbnQsZnkmJndpbmRvdy5uYXZpZ2F0b3IsZnkmJndpbmRvdy5sb2NhdGlvbjtmdW5jdGlvbiBPeShlKXtsZXQgdD1tbihlKTtyZXR1cm4gdD8uJGVsPz90fWZ1bmN0aW9uIGt5KC4uLmUpe2xldCB0PShlLHQsbixyKT0+KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sciksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4scikpLG49VygoKT0+e2xldCB0PXZ5KG1uKGVbMF0pKS5maWx0ZXIoZT0+ZSE9bnVsbCk7cmV0dXJuIHQuZXZlcnkoZT0+dHlwZW9mIGUhPWBzdHJpbmdgKT90OnZvaWQgMH0pO3JldHVybiBFeSgoKT0+W24udmFsdWU/Lm1hcChlPT5PeShlKSk/P1tEeV0uZmlsdGVyKGU9PmUhPW51bGwpLHZ5KG1uKG4udmFsdWU/ZVsxXTplWzBdKSksdnkoTihuLnZhbHVlP2VbMl06ZVsxXSkpLG1uKG4udmFsdWU/ZVszXTplWzJdKV0sKFtlLG4scixpXSxhLG8pPT57aWYoIWU/Lmxlbmd0aHx8IW4/Lmxlbmd0aHx8IXI/Lmxlbmd0aClyZXR1cm47bGV0IHM9aHkoaSk/ey4uLml9OmksYz1lLmZsYXRNYXAoZT0+bi5mbGF0TWFwKG49PnIubWFwKHI9PnQoZSxuLHIscykpKSk7bygoKT0+e2MuZm9yRWFjaChlPT5lKCkpfSl9LHtmbHVzaDpgcG9zdGB9KX1mdW5jdGlvbiBBeSgpe2xldCBlPXVuKCExKSx0PUZzKCk7cmV0dXJuIHQmJlppKCgpPT57ZS52YWx1ZT0hMH0sdCksZX1mdW5jdGlvbiBqeShlKXtsZXQgdD1BeSgpO3JldHVybiBXKCgpPT4odC52YWx1ZSwhIWUoKSkpfWZ1bmN0aW9uIE15KGUpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lOnR5cGVvZiBlPT1gc3RyaW5nYD90PT50LmtleT09PWU6QXJyYXkuaXNBcnJheShlKT90PT5lLmluY2x1ZGVzKHQua2V5KTooKT0+ITB9ZnVuY3Rpb24gTnkoLi4uZSl7bGV0IHQsbixyPXt9O2UubGVuZ3RoPT09Mz8odD1lWzBdLG49ZVsxXSxyPWVbMl0pOmUubGVuZ3RoPT09Mj90eXBlb2YgZVsxXT09YG9iamVjdGA/KHQ9ITAsbj1lWzBdLHI9ZVsxXSk6KHQ9ZVswXSxuPWVbMV0pOih0PSEwLG49ZVswXSk7bGV0e3RhcmdldDppPUR5LGV2ZW50TmFtZTphPWBrZXlkb3duYCxwYXNzaXZlOm89ITEsZGVkdXBlOnM9ITF9PXIsYz1NeSh0KTtyZXR1cm4ga3koaSxhLGU9PntlLnJlcGVhdCYmbW4ocyl8fGMoZSkmJm4oZSl9LG8pfWZ1bmN0aW9uIFB5KGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiBGeShlLHQsbj17fSl7bGV0e3dpbmRvdzpyPUR5LC4uLml9PW4sYSxvPWp5KCgpPT5yJiZgUmVzaXplT2JzZXJ2ZXJgaW4gcikscz0oKT0+e2EmJj0oYS5kaXNjb25uZWN0KCksdm9pZCAwKX0sYz1FcihXKCgpPT57bGV0IHQ9bW4oZSk7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5tYXAoZT0+T3koZSkpOltPeSh0KV19KSxlPT57aWYocygpLG8udmFsdWUmJnIpe2E9bmV3IFJlc2l6ZU9ic2VydmVyKHQpO2ZvcihsZXQgdCBvZiBlKXQmJmEub2JzZXJ2ZSh0LGkpfX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgcG9zdGB9KSxsPSgpPT57cygpLGMoKX07cmV0dXJuIHV5KGwpLHtpc1N1cHBvcnRlZDpvLHN0b3A6bH19ZnVuY3Rpb24gSXkoZSx0LG4scj17fSl7dmFyIGksYTtsZXR7Y2xvbmU6bz0hMSxwYXNzaXZlOnM9ITEsZXZlbnROYW1lOmMsZGVlcDpsPSExLGRlZmF1bHRWYWx1ZTp1LHNob3VsZEVtaXQ6ZH09cixmPUZzKCkscD1ufHxmPy5lbWl0fHwoZj09bnVsbHx8KGk9Zi4kZW1pdCk9PW51bGw/dm9pZCAwOmkuYmluZChmKSl8fChmPT1udWxsfHwoYT1mLnByb3h5KT09bnVsbHx8KGE9YS4kZW1pdCk9PW51bGw/dm9pZCAwOmEuYmluZChmPy5wcm94eSkpLG09Yzt0fHw9YG1vZGVsVmFsdWVgLG18fD1gdXBkYXRlOiR7dC50b1N0cmluZygpfWA7bGV0IGg9ZT0+bz90eXBlb2Ygbz09YGZ1bmN0aW9uYD9vKGUpOlB5KGUpOmUsZz0oKT0+cHkoZVt0XSk/aChlW3RdKTp1LF89ZT0+e2Q/ZChlKSYmcChtLGUpOnAobSxlKX07aWYocyl7bGV0IG49TShnKCkpLHI9ITE7cmV0dXJuIEVyKCgpPT5lW3RdLGU9PntyfHwocj0hMCxuLnZhbHVlPWgoZSksUW4oKCk9PnI9ITEpKX0pLEVyKG4sbj0+eyFyJiYobiE9PWVbdF18fGwpJiZfKG4pfSx7ZGVlcDpsfSksbn1yZXR1cm4gVyh7Z2V0KCl7cmV0dXJuIGcoKX0sc2V0KGUpe18oZSl9fSl9ZnVuY3Rpb24gTHkoZSl7cmV0dXJuIGU/ZS5mbGF0TWFwKGU9PmUudHlwZT09PUw/THkoZS5jaGlsZHJlbik6W2VdKTpbXX12YXIgUnk9W2BJTlBVVGAsYFRFWFRBUkVBYF07ZnVuY3Rpb24genkoZSx0LG4scj17fSl7aWYoIXR8fHIuZW5hYmxlSWdub3JlZEVsZW1lbnQmJlJ5LmluY2x1ZGVzKHQubm9kZU5hbWUpKXJldHVybiBudWxsO2xldHthcnJvd0tleU9wdGlvbnM6aT1gYm90aGAsYXR0cmlidXRlTmFtZTphPWBbZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbV1gLGl0ZW1zQXJyYXk6bz1bXSxsb29wOnM9ITAsZGlyOmM9YGx0cmAscHJldmVudFNjcm9sbDpsPSEwLGZvY3VzOnU9ITF9PXIsW2QsZixwLG0saCxnXT1bZS5rZXk9PT1gQXJyb3dSaWdodGAsZS5rZXk9PT1gQXJyb3dMZWZ0YCxlLmtleT09PWBBcnJvd1VwYCxlLmtleT09PWBBcnJvd0Rvd25gLGUua2V5PT09YEhvbWVgLGUua2V5PT09YEVuZGBdLF89cHx8bSx2PWR8fGY7aWYoIWgmJiFnJiYoIV8mJiF2fHxpPT09YHZlcnRpY2FsYCYmdnx8aT09PWBob3Jpem9udGFsYCYmXykpcmV0dXJuIG51bGw7bGV0IHk9bj9BcnJheS5mcm9tKG4ucXVlcnlTZWxlY3RvckFsbChhKSk6bztpZigheS5sZW5ndGgpcmV0dXJuIG51bGw7bCYmZS5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPW51bGw7cmV0dXJuIHZ8fF8/Yj1CeSh5LHQse2dvRm9yd2FyZDpfP206Yz09PWBsdHJgP2Q6Zixsb29wOnN9KTpoP2I9eS5hdCgwKXx8bnVsbDpnJiYoYj15LmF0KC0xKXx8bnVsbCksdSYmYj8uZm9jdXMoKSxifWZ1bmN0aW9uIEJ5KGUsdCxuLHI9ZS5pbmNsdWRlcyh0KT9lLmxlbmd0aDplLmxlbmd0aCsxKXtpZigtLXI9PT0wKXJldHVybiBudWxsO2xldCBpPWUuaW5kZXhPZih0KSxhO2lmKGE9aT09PS0xP24uZ29Gb3J3YXJkPzA6ZS5sZW5ndGgtMTpuLmdvRm9yd2FyZD9pKzE6aS0xLCFuLmxvb3AmJihhPDB8fGE+PWUubGVuZ3RoKSlyZXR1cm4gbnVsbDtsZXQgbz1lWyhhK2UubGVuZ3RoKSVlLmxlbmd0aF07cmV0dXJuIG8/by5oYXNBdHRyaWJ1dGUoYGRpc2FibGVkYCkmJm8uZ2V0QXR0cmlidXRlKGBkaXNhYmxlZGApIT09YGZhbHNlYD9CeShlLG8sbixyKTpvOm51bGx9dmFyW1Z5LEh5XT1veShgQ29uZmlnUHJvdmlkZXJgKTtmdW5jdGlvbiBVeShlKXtsZXQgdD1WeSh7ZGlyOk0oYGx0cmApfSk7cmV0dXJuIFcoKCk9PmU/LnZhbHVlfHx0LmRpcj8udmFsdWV8fGBsdHJgKX1mdW5jdGlvbiBXeShlKXtsZXQgdD1GcygpLG49dD8udHlwZS5lbWl0cyxyPXt9O3JldHVybiBuPy5sZW5ndGh8fGNvbnNvbGUud2FybihgTm8gZW1pdHRlZCBldmVudCBmb3VuZC4gUGxlYXNlIGNoZWNrIGNvbXBvbmVudDogJHt0Py50eXBlLl9fbmFtZX1gKSxuPy5mb3JFYWNoKHQ9PntyW2NlKEUodCkpXT0oLi4ubik9PmUodCwuLi5uKX0pLHJ9ZnVuY3Rpb24gR3koKXtsZXQgZT1GcygpLHQ9TSgpLG49VygoKT0+cigpKTskaSgoKT0+e24udmFsdWUhPT1yKCkmJnBuKHQpfSk7ZnVuY3Rpb24gcigpe3JldHVybiB0LnZhbHVlJiZgJGVsYGluIHQudmFsdWUmJltgI3RleHRgLGAjY29tbWVudGBdLmluY2x1ZGVzKHQudmFsdWUuJGVsLm5vZGVOYW1lKT90LnZhbHVlLiRlbC5uZXh0RWxlbWVudFNpYmxpbmc6T3kodCl9bGV0IGk9T2JqZWN0LmFzc2lnbih7fSxlLmV4cG9zZWQpLGE9e307Zm9yKGxldCB0IGluIGUucHJvcHMpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5lLnByb3BzW3RdfSk7aWYoT2JqZWN0LmtleXMoaSkubGVuZ3RoPjApZm9yKGxldCBlIGluIGkpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pW2VdfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIiRlbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZS52bm9kZS5lbH0pLGUuZXhwb3NlZD1hO2Z1bmN0aW9uIG8obil7aWYodC52YWx1ZT1uLG4mJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiJGVsIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5uIGluc3RhbmNlb2YgRWxlbWVudD9uOm4uJGVsfSksIShuIGluc3RhbmNlb2YgRWxlbWVudCkmJiFPYmplY3QuaGFzT3duKG4sYCRlbGApKSl7bGV0IHQ9bi4kLmV4cG9zZWQscj1PYmplY3QuYXNzaWduKHt9LGEpO2ZvcihsZXQgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dFtlXX0pO2UuZXhwb3NlZD1yfX1yZXR1cm57Zm9yd2FyZFJlZjpvLGN1cnJlbnRSZWY6dCxjdXJyZW50RWxlbWVudDpufX1mdW5jdGlvbiBLeShlKXtsZXQgdD1GcygpLG49T2JqZWN0LmtleXModD8udHlwZS5wcm9wcz8/e30pLnJlZHVjZSgoZSxuKT0+e2xldCByPSh0Py50eXBlLnByb3BzW25dKS5kZWZhdWx0O3JldHVybiByIT09dm9pZCAwJiYoZVtuXT1yKSxlfSx7fSkscj1TbihlKTtyZXR1cm4gVygoKT0+e2xldCBlPXt9LGk9dD8udm5vZGUucHJvcHM/P3t9O3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKHQ9PntlW0UodCldPWlbdF19KSxPYmplY3Qua2V5cyh7Li4ubiwuLi5lfSkucmVkdWNlKChlLHQpPT4oci52YWx1ZVt0XSE9PXZvaWQgMCYmKGVbdF09ci52YWx1ZVt0XSksZSkse30pfSl9ZnVuY3Rpb24gcXkoZSx0KXtsZXQgbj1LeShlKSxyPXQ/V3kodCk6e307cmV0dXJuIFcoKCk9Pih7Li4ubi52YWx1ZSwuLi5yfSkpfXZhciBKeT0wO2Z1bmN0aW9uIFl5KGUsdD1gcmVrYWApe2lmKGUpcmV0dXJuIGU7bGV0IG4scj1WeSh7dXNlSWQ6dm9pZCAwfSk7cmV0dXJuIG49ci51c2VJZD9yLnVzZUlkKCk6YHVzZUlkYGluIGJ1P2FpPy4oKTpgJHsrK0p5fWAsdD9gJHt0fS0ke259YDpufWZ1bmN0aW9uIFh5KGUsdCl7bGV0IG49TShlKTtmdW5jdGlvbiByKGUpe3JldHVybiB0W24udmFsdWVdW2VdPz9uLnZhbHVlfXJldHVybntzdGF0ZTpuLGRpc3BhdGNoOmU9PntuLnZhbHVlPXIoZSl9fX1mdW5jdGlvbiBaeShlLHQpe2xldCBuPU0oe30pLHI9TShgbm9uZWApLGk9TShlKSxhPWUudmFsdWU/YG1vdW50ZWRgOmB1bm1vdW50ZWRgLG8scz10LnZhbHVlPy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Pz9EeSx7c3RhdGU6YyxkaXNwYXRjaDpsfT1YeShhLHttb3VudGVkOntVTk1PVU5UOmB1bm1vdW50ZWRgLEFOSU1BVElPTl9PVVQ6YHVubW91bnRTdXNwZW5kZWRgfSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDpgbW91bnRlZGAsQU5JTUFUSU9OX0VORDpgdW5tb3VudGVkYH0sdW5tb3VudGVkOntNT1VOVDpgbW91bnRlZGB9fSksdT1lPT57aWYoZnkpe2xldCBuPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTt0LnZhbHVlPy5kaXNwYXRjaEV2ZW50KG4pfX07RXIoZSxhc3luYyhlLGkpPT57bGV0IGE9aSE9PWU7aWYoYXdhaXQgUW4oKSxhKXtsZXQgYT1yLnZhbHVlLG89UXkodC52YWx1ZSk7ZT8obChgTU9VTlRgKSx1KGBlbnRlcmApLG89PT1gbm9uZWAmJnUoYGFmdGVyLWVudGVyYCkpOm89PT1gbm9uZWB8fG89PT1gdW5kZWZpbmVkYHx8bi52YWx1ZT8uZGlzcGxheT09PWBub25lYD8obChgVU5NT1VOVGApLHUoYGxlYXZlYCksdShgYWZ0ZXItbGVhdmVgKSk6aSYmYSE9PW8/KGwoYEFOSU1BVElPTl9PVVRgKSx1KGBsZWF2ZWApKToobChgVU5NT1VOVGApLHUoYGFmdGVyLWxlYXZlYCkpfX0se2ltbWVkaWF0ZTohMH0pO2xldCBkPWU9PntpZihlLnRhcmdldCE9PXQudmFsdWUpcmV0dXJuO2xldCBuPVF5KHQudmFsdWUpLHI9bi5pbmNsdWRlcyhDU1MuZXNjYXBlKGUuYW5pbWF0aW9uTmFtZSkpLGE9Yy52YWx1ZT09PWBtb3VudGVkYD9gZW50ZXJgOmBsZWF2ZWA7aWYociYmKHUoYGFmdGVyLSR7YX1gKSxsKGBBTklNQVRJT05fRU5EYCksIWkudmFsdWUpKXtsZXQgZT10LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlO3QudmFsdWUuc3R5bGUuYW5pbWF0aW9uRmlsbE1vZGU9YGZvcndhcmRzYCxvPXM/LnNldFRpbWVvdXQoKCk9Pnt0LnZhbHVlPy5zdHlsZS5hbmltYXRpb25GaWxsTW9kZT09PWBmb3J3YXJkc2AmJih0LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlPWUpfSl9bj09PWBub25lYCYmbChgQU5JTUFUSU9OX0VORGApfSxmPWU9PntlLnRhcmdldD09PXQudmFsdWUmJihyLnZhbHVlPVF5KHQudmFsdWUpKX0scD1Fcih0LChlLHQpPT57ZT8obi52YWx1ZT1nZXRDb21wdXRlZFN0eWxlKGUpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uc3RhcnRgLGYpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uY2FuY2VsYCxkKSxlLmFkZEV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpOihsKGBBTklNQVRJT05fRU5EYCksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbnN0YXJ0YCxmKSx0Py5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpfSx7aW1tZWRpYXRlOiEwfSksbT1FcihjLCgpPT57bGV0IGU9UXkodC52YWx1ZSk7ci52YWx1ZT1jLnZhbHVlPT09YG1vdW50ZWRgP2U6YG5vbmVgfSk7cmV0dXJuIHRhKCgpPT57cCgpLG0oKSx0LnZhbHVlJiYodC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25zdGFydGAsZiksdC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQudmFsdWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uZW5kYCxkKSksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pfSkse2lzUHJlc2VudDpXKCgpPT5bYG1vdW50ZWRgLGB1bm1vdW50U3VzcGVuZGVkYF0uaW5jbHVkZXMoYy52YWx1ZSkpfX1mdW5jdGlvbiBReShlKXtyZXR1cm4gZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKS5hbmltYXRpb25OYW1lfHxgbm9uZWB9dmFyICR5PUYoe25hbWU6YFByZXNlbmNlYCxwcm9wczp7cHJlc2VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW59fSxzbG90czp7fSxzZXR1cChlLHtzbG90czp0LGV4cG9zZTpufSl7bGV0e3ByZXNlbnQ6cixmb3JjZU1vdW50Oml9PXluKGUpLGE9TSgpLHtpc1ByZXNlbnQ6b309WnkocixhKTtuKHtwcmVzZW50Om99KTtsZXQgcz10LmRlZmF1bHQoe3ByZXNlbnQ6by52YWx1ZX0pO3M9THkoc3x8W10pO2xldCBjPUZzKCk7aWYocyYmcz8ubGVuZ3RoPjEpe2xldCBlPWM/LnBhcmVudD8udHlwZS5uYW1lP2A8JHtjLnBhcmVudC50eXBlLm5hbWV9IC8+YDpgY29tcG9uZW50YDt0aHJvdyBFcnJvcihbYERldGVjdGVkIGFuIGludmFsaWQgY2hpbGRyZW4gZm9yIFxgJHtlfVxgIGZvciAgXGBQcmVzZW5jZVxgIGNvbXBvbmVudC5gLGBgLCJOb3RlOiBQcmVzZW5jZSB3b3JrcyBzaW1pbGFybHkgdG8gYHYtaWZgIGRpcmVjdGx5LCBidXQgaXQgd2FpdHMgZm9yIGFuaW1hdGlvbi90cmFuc2l0aW9uIHRvIGZpbmlzaGVkIGJlZm9yZSB1bm1vdW50aW5nLiBTbyBpdCBleHBlY3Qgb25seSBvbmUgZGlyZWN0IGNoaWxkIG9mIHZhbGlkIFZOb2RlIHR5cGUuIixgWW91IGNhbiBhcHBseSBhIGZldyBzb2x1dGlvbnM6YCxbIlByb3ZpZGUgYSBzaW5nbGUgY2hpbGQgZWxlbWVudCBzbyB0aGF0IGBwcmVzZW5jZWAgZGlyZWN0aXZlIGF0dGFjaCBjb3JyZWN0bHkuIixgRW5zdXJlIHRoZSBmaXJzdCBjaGlsZCBpcyBhbiBhY3R1YWwgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmF3IHRleHQgbm9kZSBvciBjb21tZW50IG5vZGUuYF0ubWFwKGU9PmAgIC0gJHtlfWApLmpvaW4oYApgKV0uam9pbihgCmApKX1yZXR1cm4oKT0+aS52YWx1ZXx8ci52YWx1ZXx8by52YWx1ZT9HKHQuZGVmYXVsdCh7cHJlc2VudDpvLnZhbHVlfSlbMF0se3JlZjplPT57bGV0IHQ9T3koZSk7cmV0dXJuIHQ/Lmhhc0F0dHJpYnV0ZT09PXZvaWQgMHx8KHQ/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9hLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6YS52YWx1ZT10KSx0fX0pOm51bGx9fSksZWI9Rih7bmFtZTpgUHJpbWl0aXZlU2xvdGAsaW5oZXJpdEF0dHJzOiExLHNldHVwKGUse2F0dHJzOnQsc2xvdHM6bn0pe3JldHVybigpPT57aWYoIW4uZGVmYXVsdClyZXR1cm4gbnVsbDtsZXQgZT1MeShuLmRlZmF1bHQoKSkscj1lLmZpbmRJbmRleChlPT5lLnR5cGUhPT1jcyk7aWYocj09PS0xKXJldHVybiBlO2xldCBpPWVbcl07ZGVsZXRlIGkucHJvcHM/LnJlZjtsZXQgYT1pLnByb3BzP2tzKHQsaS5wcm9wcyk6dCxvPUNzKHsuLi5pLHByb3BzOnt9fSxhKTtyZXR1cm4gZS5sZW5ndGg9PT0xP286KGVbcl09byxlKX19fSksdGI9W2BhcmVhYCxgaW1nYCxgaW5wdXRgXSxuYj1GKHtuYW1lOmBQcmltaXRpdmVgLGluaGVyaXRBdHRyczohMSxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFzOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxkZWZhdWx0OmBkaXZgfX0sc2V0dXAoZSx7YXR0cnM6dCxzbG90czpufSl7bGV0IHI9ZS5hc0NoaWxkP2B0ZW1wbGF0ZWA6ZS5hcztyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgJiZ0Yi5pbmNsdWRlcyhyKT8oKT0+RyhyLHQpOnI9PT1gdGVtcGxhdGVgPygpPT5HKGViLHQse2RlZmF1bHQ6bi5kZWZhdWx0fSk6KCk9PkcoZS5hcyx0LHtkZWZhdWx0Om4uZGVmYXVsdH0pfX0pO2Z1bmN0aW9uIHJiKCl7bGV0IGU9TSgpO3JldHVybntwcmltaXRpdmVFbGVtZW50OmUsY3VycmVudEVsZW1lbnQ6VygoKT0+W2AjdGV4dGAsYCNjb21tZW50YF0uaW5jbHVkZXMoZS52YWx1ZT8uJGVsLm5vZGVOYW1lKT9lLnZhbHVlPy4kZWwubmV4dEVsZW1lbnRTaWJsaW5nOk95KGUpKX19dmFyW2liLGFiXT1veShgQ29sbGFwc2libGVSb290YCksb2I9Rih7X19uYW1lOmBDb2xsYXBzaWJsZVJvb3RgLHByb3BzOntkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LG9wZW46e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OnZvaWQgMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtleHBvc2U6dCxlbWl0Om59KXtsZXQgcj1lLGk9SXkocixgb3BlbmAsbix7ZGVmYXVsdFZhbHVlOnIuZGVmYXVsdE9wZW4scGFzc2l2ZTpyLm9wZW49PT12b2lkIDB9KSx7ZGlzYWJsZWQ6YSx1bm1vdW50T25IaWRlOm99PXluKHIpO3JldHVybiBhYih7Y29udGVudElkOmBgLGRpc2FibGVkOmEsb3BlbjppLHVubW91bnRPbkhpZGU6byxvbk9wZW5Ub2dnbGU6KCk9PnthLnZhbHVlfHwoaS52YWx1ZT0haS52YWx1ZSl9fSksdCh7b3BlbjppfSksR3koKSwoZSx0KT0+KFIoKSxCKE4obmIpLHthczplLmFzLCJhcy1jaGlsZCI6ci5hc0NoaWxkLCJkYXRhLXN0YXRlIjpOKGkpP2BvcGVuYDpgY2xvc2VkYCwiZGF0YS1kaXNhYmxlZCI6TihhKT9gYDp2b2lkIDB9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx7b3BlbjpOKGkpfSldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLHNiPUYoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YENvbGxhcHNpYmxlQ29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Bjb250ZW50Rm91bmRgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPWliKCk7aS5jb250ZW50SWR8fD1ZeSh2b2lkIDAsYHJla2EtY29sbGFwc2libGUtY29udGVudGApO2xldCBhPU0oKSx7Zm9yd2FyZFJlZjpvLGN1cnJlbnRFbGVtZW50OnN9PUd5KCksYz1NKDApLGw9TSgwKSx1PVcoKCk9Pmkub3Blbi52YWx1ZSksZD1NKHUudmFsdWUpLGY9TSgpO0VyKCgpPT5bdS52YWx1ZSxhLnZhbHVlPy5wcmVzZW50XSxhc3luYygpPT57YXdhaXQgUW4oKTtsZXQgZT1zLnZhbHVlO2lmKCFlKXJldHVybjtmLnZhbHVlPWYudmFsdWV8fHt0cmFuc2l0aW9uRHVyYXRpb246ZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24sYW5pbWF0aW9uTmFtZTplLnN0eWxlLmFuaW1hdGlvbk5hbWV9LGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZS5zdHlsZS5hbmltYXRpb25OYW1lPWBub25lYDtsZXQgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2wudmFsdWU9dC5oZWlnaHQsYy52YWx1ZT10LndpZHRoLGQudmFsdWV8fChlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1mLnZhbHVlLnRyYW5zaXRpb25EdXJhdGlvbixlLnN0eWxlLmFuaW1hdGlvbk5hbWU9Zi52YWx1ZS5hbmltYXRpb25OYW1lKX0se2ltbWVkaWF0ZTohMH0pO2xldCBwPVcoKCk9PmQudmFsdWUmJmkub3Blbi52YWx1ZSk7cmV0dXJuIFppKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZC52YWx1ZT0hMX0pfSksa3kocyxgYmVmb3JlbWF0Y2hgLGU9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntpLm9uT3BlblRvZ2dsZSgpLHIoYGNvbnRlbnRGb3VuZGApfSl9KSwoZSx0KT0+KFIoKSxCKE4oJHkpLHtyZWZfa2V5OmBwcmVzZW50UmVmYCxyZWY6YSxwcmVzZW50OmUuZm9yY2VNb3VudHx8TihpKS5vcGVuLnZhbHVlLCJmb3JjZS1tb3VudCI6ITB9LHtkZWZhdWx0OlAoKHtwcmVzZW50OnR9KT0+W0goTihuYiksa3MoZS4kYXR0cnMse2lkOk4oaSkuY29udGVudElkLHJlZjpOKG8pLCJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOmUuYXMsaGlkZGVuOnQ/dm9pZCAwOk4oaSkudW5tb3VudE9uSGlkZS52YWx1ZT9gYDpgdW50aWwtZm91bmRgLCJkYXRhLXN0YXRlIjpwLnZhbHVlP3ZvaWQgMDpOKGkpLm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjpOKGkpLmRpc2FibGVkPy52YWx1ZT9gYDp2b2lkIDAsc3R5bGU6eyItLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQiOmAke2wudmFsdWV9cHhgLCItLXJla2EtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6YCR7Yy52YWx1ZX1weGB9fSkse2RlZmF1bHQ6UCgoKT0+WyFOKGkpLnVubW91bnRPbkhpZGUudmFsdWV8fHQ/SShlLiRzbG90cyxgZGVmYXVsdGAse2tleTowfSk6VHMoYHYtaWZgLCEwKV0pLF86Mn0sMTA0MCxbYGlkYCxgYXMtY2hpbGRgLGBhc2AsYGhpZGRlbmAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgc3R5bGVgXSldKSxfOjN9LDgsW2BwcmVzZW50YF0pKX19KSxjYj1GKHtfX25hbWU6YENvbGxhcHNpYmxlVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZTtHeSgpO2xldCBuPWliKCk7cmV0dXJuKGUscik9PihSKCksQihOKG5iKSx7dHlwZTplLmFzPT09YGJ1dHRvbmA/YGJ1dHRvbmA6dm9pZCAwLGFzOmUuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImFyaWEtY29udHJvbHMiOk4obikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpOKG4pLm9wZW4udmFsdWUsImRhdGEtc3RhdGUiOk4obikub3Blbi52YWx1ZT9gb3BlbmA6YGNsb3NlZGAsImRhdGEtZGlzYWJsZWQiOk4obikuZGlzYWJsZWQ/LnZhbHVlP2BgOnZvaWQgMCxkaXNhYmxlZDpOKG4pLmRpc2FibGVkPy52YWx1ZSxvbkNsaWNrOk4obikub25PcGVuVG9nZ2xlfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFzYCxgYXMtY2hpbGRgLGBhcmlhLWNvbnRyb2xzYCxgYXJpYS1leHBhbmRlZGAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGlzYWJsZWRgLGBvbkNsaWNrYF0pKX19KTtmdW5jdGlvbiBsYih7dHlwZTplLGRlZmF1bHRWYWx1ZTp0LG1vZGVsVmFsdWU6bn0pe2xldCByPW58fHQ7cmV0dXJuIG4hPT12b2lkIDB8fHQhPT12b2lkIDA/QXJyYXkuaXNBcnJheShyKT9gbXVsdGlwbGVgOmBzaW5nbGVgOmU/P2BzaW5nbGVgfWZ1bmN0aW9uIHViKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl7cmV0dXJuIGV8fGxiKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl9ZnVuY3Rpb24gZGIoe3R5cGU6ZSxkZWZhdWx0VmFsdWU6dH0pe3JldHVybiB0PT09dm9pZCAwP2U9PT1gc2luZ2xlYD92b2lkIDA6W106dH1mdW5jdGlvbiBmYihlLHQpe2xldCBuPVcoKCk9PnViKGUpKSxyPUl5KGUsYG1vZGVsVmFsdWVgLHQse2RlZmF1bHRWYWx1ZTpkYihlKSxwYXNzaXZlOmUubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSk7ZnVuY3Rpb24gaShlKXtpZihuLnZhbHVlPT09YHNpbmdsZWApci52YWx1ZT1heShlLHIudmFsdWUpP3ZvaWQgMDplO2Vsc2V7bGV0IHQ9QXJyYXkuaXNBcnJheShyLnZhbHVlKT9bLi4uci52YWx1ZXx8W11dOltyLnZhbHVlXS5maWx0ZXIoQm9vbGVhbik7aWYobHkodCxlKSl7bGV0IG49dC5maW5kSW5kZXgodD0+YXkodCxlKSk7dC5zcGxpY2UobiwxKX1lbHNlIHQucHVzaChlKTtyLnZhbHVlPXR9fXJldHVybnttb2RlbFZhbHVlOnIsY2hhbmdlTW9kZWxWYWx1ZTppLGlzU2luZ2xlOlcoKCk9Pm4udmFsdWU9PT1gc2luZ2xlYCl9fXZhcltwYixtYl09b3koYEFjY29yZGlvblJvb3RgKSxoYj1GKHtfX25hbWU6YEFjY29yZGlvblJvb3RgLHByb3BzOntjb2xsYXBzaWJsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sb3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHZlcnRpY2FsYH0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sdHlwZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LG1vZGVsVmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGVmYXVsdFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2RpcjppLGRpc2FibGVkOmEsdW5tb3VudE9uSGlkZTpvfT15bihuKSxzPVV5KGkpLHttb2RlbFZhbHVlOmMsY2hhbmdlTW9kZWxWYWx1ZTpsLGlzU2luZ2xlOnV9PWZiKG4scikse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1HeSgpO3JldHVybiBtYih7ZGlzYWJsZWQ6YSxkaXJlY3Rpb246cyxvcmllbnRhdGlvbjpuLm9yaWVudGF0aW9uLHBhcmVudEVsZW1lbnQ6Zixpc1NpbmdsZTp1LGNvbGxhcHNpYmxlOm4uY29sbGFwc2libGUsbW9kZWxWYWx1ZTpjLGNoYW5nZU1vZGVsVmFsdWU6bCx1bm1vdW50T25IaWRlOm99KSwoZSx0KT0+KFIoKSxCKE4obmIpLHtyZWY6TihkKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse21vZGVsVmFsdWU6TihjKX0pXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2BdKSl9fSksZ2I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuT3Blbj1gb3BlbmAsZS5DbG9zZWQ9YGNsb3NlZGAsZX0oZ2J8fHt9KSxbX2IsdmJdPW95KGBBY2NvcmRpb25JdGVtYCkseWI9Rih7X19uYW1lOmBBY2NvcmRpb25JdGVtYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDp2b2lkIDB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUse2V4cG9zZTp0fSl7bGV0IG49ZSxyPXBiKCksaT1XKCgpPT5yLmlzU2luZ2xlLnZhbHVlP24udmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWU6QXJyYXkuaXNBcnJheShyLm1vZGVsVmFsdWUudmFsdWUpJiZyLm1vZGVsVmFsdWUudmFsdWUuaW5jbHVkZXMobi52YWx1ZSkpLGE9VygoKT0+ci5kaXNhYmxlZC52YWx1ZXx8bi5kaXNhYmxlZCksbz1XKCgpPT5hLnZhbHVlP2BgOnZvaWQgMCkscz1XKCgpPT5pLnZhbHVlP2diLk9wZW46Z2IuQ2xvc2VkKTt0KHtvcGVuOmksZGF0YURpc2FibGVkOm99KTtsZXR7Y3VycmVudFJlZjpjLGN1cnJlbnRFbGVtZW50Omx9PUd5KCk7dmIoe29wZW46aSxkYXRhU3RhdGU6cyxkaXNhYmxlZDphLGRhdGFEaXNhYmxlZDpvLHRyaWdnZXJJZDpgYCxjdXJyZW50UmVmOmMsY3VycmVudEVsZW1lbnQ6bCx2YWx1ZTpXKCgpPT5uLnZhbHVlKX0pO2Z1bmN0aW9uIHUoZSl7bGV0IHQ9ZS50YXJnZXQ7aWYoQXJyYXkuZnJvbShyLnBhcmVudEVsZW1lbnQudmFsdWU/LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtXWApPz9bXSkuZmluZEluZGV4KGU9PmU9PT10KT09PS0xKXJldHVybiBudWxsO3p5KGUsdCxyLnBhcmVudEVsZW1lbnQudmFsdWUse2Fycm93S2V5T3B0aW9uczpyLm9yaWVudGF0aW9uLGRpcjpyLmRpcmVjdGlvbi52YWx1ZSxmb2N1czohMH0pfXJldHVybihlLHQpPT4oUigpLEIoTihvYikseyJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLCJkYXRhLWRpc2FibGVkIjpvLnZhbHVlLCJkYXRhLXN0YXRlIjpzLnZhbHVlLGRpc2FibGVkOmEudmFsdWUsb3BlbjppLnZhbHVlLGFzOm4uYXMsImFzLWNoaWxkIjpuLmFzQ2hpbGQsInVubW91bnQtb24taGlkZSI6bi51bm1vdW50T25IaWRlPz9OKHIpLnVubW91bnRPbkhpZGUudmFsdWUsb25LZXlkb3duOm91KHUsW2B1cGAsYGRvd25gLGBsZWZ0YCxgcmlnaHRgLGBob21lYCxgZW5kYF0pfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse29wZW46aS52YWx1ZX0pXSksXzozfSw4LFtgZGF0YS1vcmllbnRhdGlvbmAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBvcGVuYCxgYXNgLGBhcy1jaGlsZGAsYHVubW91bnQtb24taGlkZWBdKSl9fSksYmI9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49cGIoKSxyPV9iKCk7cmV0dXJuIEd5KCksKGUsaSk9PihSKCksQihOKHNiKSx7cm9sZTpgcmVnaW9uYCwiYXMtY2hpbGQiOnQuYXNDaGlsZCxhczplLmFzLCJmb3JjZS1tb3VudCI6dC5mb3JjZU1vdW50LCJhcmlhLWxhYmVsbGVkYnkiOk4ocikudHJpZ2dlcklkLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSwiZGF0YS1kaXNhYmxlZCI6TihyKS5kYXRhRGlzYWJsZWQudmFsdWUsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sc3R5bGU6eyItLXJla2EtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOmB2YXIoLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgpYCwiLS1yZWthLWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6YHZhcigtLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQpYH0sb25Db250ZW50Rm91bmQ6aVswXXx8PWU9Pk4obikuY2hhbmdlTW9kZWxWYWx1ZShOKHIpLnZhbHVlLnZhbHVlKX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBmb3JjZS1tb3VudGAsYGFyaWEtbGFiZWxsZWRieWAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKSl9fSkseGI9Rih7X19uYW1lOmBBY2NvcmRpb25IZWFkZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaDNgfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXBiKCkscj1fYigpO3JldHVybiBHeSgpLChlLGkpPT4oUigpLEIoTihuYikse2FzOnQuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sImRhdGEtc3RhdGUiOk4ocikuZGF0YVN0YXRlLnZhbHVlLCJkYXRhLWRpc2FibGVkIjpOKHIpLmRhdGFEaXNhYmxlZC52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgLGBkYXRhLW9yaWVudGF0aW9uYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLFNiPUYoe19fbmFtZTpgQWNjb3JkaW9uVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUsbj1wYigpLHI9X2IoKTtyLnRyaWdnZXJJZHx8PVl5KHZvaWQgMCxgcmVrYS1hY2NvcmRpb24tdHJpZ2dlcmApO2Z1bmN0aW9uIGkoKXtsZXQgZT1uLmlzU2luZ2xlLnZhbHVlJiZyLm9wZW4udmFsdWUmJiFuLmNvbGxhcHNpYmxlO3IuZGlzYWJsZWQudmFsdWV8fGV8fG4uY2hhbmdlTW9kZWxWYWx1ZShyLnZhbHVlLnZhbHVlKX1yZXR1cm4oZSxhKT0+KFIoKSxCKE4oY2IpLHtpZDpOKHIpLnRyaWdnZXJJZCxyZWY6TihyKS5jdXJyZW50UmVmLCJkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtIjpgYCxhczp0LmFzLCJhcy1jaGlsZCI6dC5hc0NoaWxkLCJhcmlhLWRpc2FibGVkIjpOKHIpLmRpc2FibGVkLnZhbHVlfHx2b2lkIDAsImFyaWEtZXhwYW5kZWQiOk4ocikub3Blbi52YWx1ZXx8ITEsImRhdGEtZGlzYWJsZWQiOk4ocikuZGF0YURpc2FibGVkLnZhbHVlLCJkYXRhLW9yaWVudGF0aW9uIjpOKG4pLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSxkaXNhYmxlZDpOKHIpLmRpc2FibGVkLnZhbHVlLG9uQ2xpY2s6aX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGlkYCxgYXNgLGBhcy1jaGlsZGAsYGFyaWEtZGlzYWJsZWRgLGBhcmlhLWV4cGFuZGVkYCxgZGF0YS1kaXNhYmxlZGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgXSkpfX0pLENiPWBkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtYDtmdW5jdGlvbiB3YihlPXt9KXtsZXR7a2V5OnQ9YGAsaXNQcm92aWRlcjpuPSExfT1lLHI9YCR7dH1Db2xsZWN0aW9uUHJvdmlkZXJgLGk7bj8oaT17Y29sbGVjdGlvblJlZjpNKCksaXRlbU1hcDpNKG5ldyBNYXApfSx2cihyLGkpKTppPXlyKHIpO2xldCBhPShlPSExKT0+e2xldCB0PWkuY29sbGVjdGlvblJlZi52YWx1ZTtpZighdClyZXR1cm5bXTtsZXQgbj1BcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbChgWyR7Q2J9XWApKSxyPW5ldyBNYXAobi5tYXAoKGUsdCk9PltlLHRdKSksYT1BcnJheS5mcm9tKGkuaXRlbU1hcC52YWx1ZS52YWx1ZXMoKSkuc29ydCgoZSx0KT0+KHIuZ2V0KGUucmVmKT8/LTEpLShyLmdldCh0LnJlZik/Py0xKSk7cmV0dXJuIGU/YTphLmZpbHRlcihlPT5lLnJlZi5kYXRhc2V0LmRpc2FibGVkIT09YGApfSxvPUYoe25hbWU6YENvbGxlY3Rpb25TbG90YCxpbmhlcml0QXR0cnM6ITEsc2V0dXAoZSx7c2xvdHM6dCxhdHRyczpufSl7bGV0e3ByaW1pdGl2ZUVsZW1lbnQ6cixjdXJyZW50RWxlbWVudDphfT1yYigpO3JldHVybiBFcihhLCgpPT57aS5jb2xsZWN0aW9uUmVmLnZhbHVlPWEudmFsdWV9KSwoKT0+RyhlYix7cmVmOnIsLi4ubn0sdCl9fSkscz1GKHtuYW1lOmBDb2xsZWN0aW9uSXRlbWAsaW5oZXJpdEF0dHJzOiExLHByb3BzOnt2YWx1ZTp7dmFsaWRhdG9yOigpPT4hMH19LHNldHVwKGUse3Nsb3RzOnQsYXR0cnM6bn0pe2xldHtwcmltaXRpdmVFbGVtZW50OnIsY3VycmVudEVsZW1lbnQ6YX09cmIoKTtyZXR1cm4gQ3IodD0+e2lmKGEudmFsdWUpe2xldCBuPXNuKGEudmFsdWUpO2kuaXRlbU1hcC52YWx1ZS5zZXQobix7cmVmOmEudmFsdWUsdmFsdWU6ZS52YWx1ZX0pLHQoKCk9PmkuaXRlbU1hcC52YWx1ZS5kZWxldGUobikpfX0pLCgpPT5HKGViLHsuLi5uLFtDYl06YGAscmVmOnJ9LHQpfX0pO3JldHVybntnZXRJdGVtczphLHJlYWN0aXZlSXRlbXM6VygoKT0+QXJyYXkuZnJvbShpLml0ZW1NYXAudmFsdWUudmFsdWVzKCkpKSxpdGVtTWFwU2l6ZTpXKCgpPT5pLml0ZW1NYXAudmFsdWUuc2l6ZSksQ29sbGVjdGlvblNsb3Q6byxDb2xsZWN0aW9uSXRlbTpzfX12YXIgVGI9YHJvdmluZ0ZvY3VzR3JvdXAub25FbnRyeUZvY3VzYCxFYj17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxEYj17QXJyb3dMZWZ0OmBwcmV2YCxBcnJvd1VwOmBwcmV2YCxBcnJvd1JpZ2h0OmBuZXh0YCxBcnJvd0Rvd246YG5leHRgLFBhZ2VVcDpgZmlyc3RgLEhvbWU6YGZpcnN0YCxQYWdlRG93bjpgbGFzdGAsRW5kOmBsYXN0YH07ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gdD09PWBydGxgP2U9PT1gQXJyb3dMZWZ0YD9gQXJyb3dSaWdodGA6ZT09PWBBcnJvd1JpZ2h0YD9gQXJyb3dMZWZ0YDplOmV9ZnVuY3Rpb24ga2IoZSx0LG4pe2xldCByPU9iKGUua2V5LG4pO2lmKCEodD09PWB2ZXJ0aWNhbGAmJltgQXJyb3dMZWZ0YCxgQXJyb3dSaWdodGBdLmluY2x1ZGVzKHIpKSYmISh0PT09YGhvcml6b250YWxgJiZbYEFycm93VXBgLGBBcnJvd0Rvd25gXS5pbmNsdWRlcyhyKSkpcmV0dXJuIERiW3JdfWZ1bmN0aW9uIEFiKGUsdD0hMSl7bGV0IG49c3koKTtmb3IobGV0IHIgb2YgZSlpZihyPT09bnx8KHIuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dH0pLHN5KCkhPT1uKSlyZXR1cm59ZnVuY3Rpb24gamIoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX12YXJbTWIsTmJdPW95KGBSb3ZpbmdGb2N1c0dyb3VwYCksUGI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0dyb3VwYCxwcm9wczp7b3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sY3VycmVudFRhYlN0b3BJZDp7dHlwZTpbU3RyaW5nLG51bGxdLHJlcXVpcmVkOiExfSxkZWZhdWx0Q3VycmVudFRhYlN0b3BJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYGVudHJ5Rm9jdXNgLGB1cGRhdGU6Y3VycmVudFRhYlN0b3BJZGBdLHNldHVwKGUse2V4cG9zZTp0LGVtaXQ6bn0pe2xldCByPWUsaT1uLHtsb29wOmEsb3JpZW50YXRpb246byxkaXI6c309eW4ociksYz1VeShzKSxsPUl5KHIsYGN1cnJlbnRUYWJTdG9wSWRgLGkse2RlZmF1bHRWYWx1ZTpyLmRlZmF1bHRDdXJyZW50VGFiU3RvcElkLHBhc3NpdmU6ci5jdXJyZW50VGFiU3RvcElkPT09dm9pZCAwfSksdT1NKCExKSxkPU0oITEpLGY9TSgwKSx7Z2V0SXRlbXM6cCxDb2xsZWN0aW9uU2xvdDptfT13Yih7aXNQcm92aWRlcjohMH0pO2Z1bmN0aW9uIGgoZSl7bGV0IHQ9IWQudmFsdWU7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLnRhcmdldD09PWUuY3VycmVudFRhcmdldCYmdCYmIXUudmFsdWUpe2xldCB0PW5ldyBDdXN0b21FdmVudChUYixFYik7aWYoZS5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQodCksaShgZW50cnlGb2N1c2AsdCksIXQuZGVmYXVsdFByZXZlbnRlZCl7bGV0IGU9cCgpLm1hcChlPT5lLnJlZikuZmlsdGVyKGU9PmUuZGF0YXNldC5kaXNhYmxlZCE9PWBgKTtBYihbZS5maW5kKGU9PmUuZ2V0QXR0cmlidXRlKGBkYXRhLWFjdGl2ZWApPT09YGApLGUuZmluZChlPT5lLmdldEF0dHJpYnV0ZShgZGF0YS1oaWdobGlnaHRlZGApPT09YGApLGUuZmluZChlPT5lLmlkPT09bC52YWx1ZSksLi4uZV0uZmlsdGVyKEJvb2xlYW4pLHIucHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyl9fWQudmFsdWU9ITF9ZnVuY3Rpb24gZygpe3NldFRpbWVvdXQoKCk9PntkLnZhbHVlPSExfSwxKX1yZXR1cm4gdCh7Z2V0SXRlbXM6cH0pLE5iKHtsb29wOmEsZGlyOmMsb3JpZW50YXRpb246byxjdXJyZW50VGFiU3RvcElkOmwsb25JdGVtRm9jdXM6ZT0+e2wudmFsdWU9ZX0sb25JdGVtU2hpZnRUYWI6KCk9Pnt1LnZhbHVlPSEwfSxvbkZvY3VzYWJsZUl0ZW1BZGQ6KCk9PntmLnZhbHVlKyt9LG9uRm9jdXNhYmxlSXRlbVJlbW92ZTooKT0+e2YudmFsdWUtLX19KSwoZSx0KT0+KFIoKSxCKE4obSksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7dGFiaW5kZXg6dS52YWx1ZXx8Zi52YWx1ZT09PTA/LTE6MCwiZGF0YS1vcmllbnRhdGlvbiI6TihvKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGRpcjpOKGMpLHN0eWxlOntvdXRsaW5lOmBub25lYH0sb25Nb3VzZWRvd246dFswXXx8PWU9PmQudmFsdWU9ITAsb25Nb3VzZXVwOmcsb25Gb2N1czpoLG9uQmx1cjp0WzFdfHw9ZT0+dS52YWx1ZT0hMX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYHRhYmluZGV4YCxgZGF0YS1vcmllbnRhdGlvbmAsYGFzYCxgYXMtY2hpbGRgLGBkaXJgXSldKSxfOjN9KSl9fSksRmI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0l0ZW1gLHByb3BzOnt0YWJTdG9wSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxmb2N1c2FibGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYWxsb3dTaGlmdEtleTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLG49TWIoKSxyPVl5KCksaT1XKCgpPT50LnRhYlN0b3BJZHx8ciksYT1XKCgpPT5uLmN1cnJlbnRUYWJTdG9wSWQudmFsdWU9PT1pLnZhbHVlKSx7Z2V0SXRlbXM6byxDb2xsZWN0aW9uSXRlbTpzfT13YigpO1ppKCgpPT57dC5mb2N1c2FibGUmJm4ub25Gb2N1c2FibGVJdGVtQWRkKCl9KSx0YSgoKT0+e3QuZm9jdXNhYmxlJiZuLm9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpfSksRXIoKCk9PnQuZm9jdXNhYmxlLChlLHQpPT57ZSE9PXQmJihlP24ub25Gb2N1c2FibGVJdGVtQWRkKCk6bi5vbkZvY3VzYWJsZUl0ZW1SZW1vdmUoKSl9KTtmdW5jdGlvbiBjKGUpe2lmKGUua2V5PT09YFRhYmAmJmUuc2hpZnRLZXkpe24ub25JdGVtU2hpZnRUYWIoKTtyZXR1cm59aWYoZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQpcmV0dXJuO2xldCByPWtiKGUsbi5vcmllbnRhdGlvbi52YWx1ZSxuLmRpci52YWx1ZSk7aWYociE9PXZvaWQgMCl7aWYoZS5tZXRhS2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5fHwhdC5hbGxvd1NoaWZ0S2V5JiZlLnNoaWZ0S2V5KXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7bGV0IGk9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpLmZpbHRlcihlPT5lLmRhdGFzZXQuZGlzYWJsZWQhPT1gYCldO2lmKHI9PT1gbGFzdGApaS5yZXZlcnNlKCk7ZWxzZSBpZihyPT09YHByZXZgfHxyPT09YG5leHRgKXtyPT09YHByZXZgJiZpLnJldmVyc2UoKTtsZXQgdD1pLmluZGV4T2YoZS5jdXJyZW50VGFyZ2V0KTtpPW4ubG9vcC52YWx1ZT9qYihpLHQrMSk6aS5zbGljZSh0KzEpfVFuKCgpPT5BYihpKSl9fXJldHVybihlLHQpPT4oUigpLEIoTihzKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4obmIpLHt0YWJpbmRleDphLnZhbHVlPzA6LTEsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24udmFsdWUsImRhdGEtYWN0aXZlIjplLmFjdGl2ZT9gYDp2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmUuZm9jdXNhYmxlP3ZvaWQgMDpgYCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLG9uTW91c2Vkb3duOnRbMF18fD10PT57ZS5mb2N1c2FibGU/TihuKS5vbkl0ZW1Gb2N1cyhpLnZhbHVlKTp0LnByZXZlbnREZWZhdWx0KCl9LG9uRm9jdXM6dFsxXXx8PWU9Pk4obikub25JdGVtRm9jdXMoaS52YWx1ZSksb25LZXlkb3duOmN9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2B0YWJpbmRleGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLWFjdGl2ZWAsYGRhdGEtZGlzYWJsZWRgLGBhc2AsYGFzLWNoaWxkYF0pXSksXzozfSkpfX0pLFtJYixMYl09b3koYFRhYnNSb290YCksUmI9Rih7X19uYW1lOmBUYWJzUm9vdGAscHJvcHM6e2RlZmF1bHRWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxvcmllbnRhdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaG9yaXpvbnRhbGB9LGRpcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFjdGl2YXRpb25Nb2RlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBhdXRvbWF0aWNgfSxtb2RlbFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse29yaWVudGF0aW9uOmksdW5tb3VudE9uSGlkZTphLGRpcjpvfT15bihuKSxzPVV5KG8pO0d5KCk7bGV0IGM9SXkobixgbW9kZWxWYWx1ZWAscix7ZGVmYXVsdFZhbHVlOm4uZGVmYXVsdFZhbHVlLHBhc3NpdmU6bi5tb2RlbFZhbHVlPT09dm9pZCAwfSksbD1NKCksdT11bihuZXcgU2V0KTtyZXR1cm4gTGIoe21vZGVsVmFsdWU6YyxjaGFuZ2VNb2RlbFZhbHVlOmU9PntjLnZhbHVlPWV9LG9yaWVudGF0aW9uOmksZGlyOnMsdW5tb3VudE9uSGlkZTphLGFjdGl2YXRpb25Nb2RlOm4uYWN0aXZhdGlvbk1vZGUsYmFzZUlkOll5KHZvaWQgMCxgcmVrYS10YWJzYCksdGFic0xpc3Q6bCxjb250ZW50SWRzOnUscmVnaXN0ZXJDb250ZW50OmU9Pnt1LnZhbHVlPW5ldyBTZXQoWy4uLnUudmFsdWUsZV0pfSx1bnJlZ2lzdGVyQ29udGVudDplPT57bGV0IHQ9bmV3IFNldCh1LnZhbHVlKTt0LmRlbGV0ZShlKSx1LnZhbHVlPXR9fSksKGUsdCk9PihSKCksQihOKG5iKSx7ZGlyOk4ocyksImRhdGEtb3JpZW50YXRpb24iOk4oaSksImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hc30se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOk4oYyl9KV0pLF86M30sOCxbYGRpcmAsYGRhdGEtb3JpZW50YXRpb25gLGBhcy1jaGlsZGAsYGFzYF0pKX19KTtmdW5jdGlvbiB6YihlLHQpe3JldHVybmAke2V9LXRyaWdnZXItJHt0fWB9ZnVuY3Rpb24gQmIoZSx0KXtyZXR1cm5gJHtlfS1jb250ZW50LSR7dH1gfXZhciBWYj1GKHtfX25hbWU6YFRhYnNDb250ZW50YCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse2ZvcndhcmRSZWY6bn09R3koKSxyPUliKCksaT1XKCgpPT56YihyLmJhc2VJZCx0LnZhbHVlKSksYT1XKCgpPT5CYihyLmJhc2VJZCx0LnZhbHVlKSksbz1XKCgpPT50LnZhbHVlPT09ci5tb2RlbFZhbHVlLnZhbHVlKSxzPU0oby52YWx1ZSk7cmV0dXJuIFppKCgpPT57ci5yZWdpc3RlckNvbnRlbnQodC52YWx1ZSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cy52YWx1ZT0hMX0pfSksZWEoKCk9PntyLnVucmVnaXN0ZXJDb250ZW50KHQudmFsdWUpfSksKGUsdCk9PihSKCksQihOKCR5KSx7cHJlc2VudDplLmZvcmNlTW91bnR8fG8udmFsdWUsImZvcmNlLW1vdW50IjpgYH0se2RlZmF1bHQ6UCgoe3ByZXNlbnQ6dH0pPT5bSChOKG5iKSx7aWQ6YS52YWx1ZSxyZWY6TihuKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzLHJvbGU6YHRhYnBhbmVsYCwiZGF0YS1zdGF0ZSI6by52YWx1ZT9gYWN0aXZlYDpgaW5hY3RpdmVgLCJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLnZhbHVlLCJhcmlhLWxhYmVsbGVkYnkiOmkudmFsdWUsaGlkZGVuOiF0LHRhYmluZGV4OmAwYCxzdHlsZTpnZSh7YW5pbWF0aW9uRHVyYXRpb246cy52YWx1ZT9gMHNgOnZvaWQgMH0pfSx7ZGVmYXVsdDpQKCgpPT5bIU4ocikudW5tb3VudE9uSGlkZS52YWx1ZXx8dD9JKGUuJHNsb3RzLGBkZWZhdWx0YCx7a2V5OjB9KTpUcyhgdi1pZmAsITApXSksXzoyfSwxMDMyLFtgaWRgLGBhcy1jaGlsZGAsYGFzYCxgZGF0YS1zdGF0ZWAsYGRhdGEtb3JpZW50YXRpb25gLGBhcmlhLWxhYmVsbGVkYnlgLGBoaWRkZW5gLGBzdHlsZWBdKV0pLF86M30sOCxbYHByZXNlbnRgXSkpfX0pLEhiPUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0e2xvb3A6dH09eW4oZSkse2ZvcndhcmRSZWY6bixjdXJyZW50RWxlbWVudDpyfT1HeSgpLGk9SWIoKTtyZXR1cm4gaS50YWJzTGlzdD1yLChlLHIpPT4oUigpLEIoTihQYikseyJhcy1jaGlsZCI6YGAsb3JpZW50YXRpb246TihpKS5vcmllbnRhdGlvbi52YWx1ZSxkaXI6TihpKS5kaXIudmFsdWUsbG9vcDpOKHQpfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7cmVmOk4obikscm9sZTpgdGFibGlzdGAsImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hcywiYXJpYS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbi52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBhcmlhLW9yaWVudGF0aW9uYF0pXSksXzozfSw4LFtgb3JpZW50YXRpb25gLGBkaXJgLGBsb29wYF0pKX19KSxVYj1GKHtfX25hbWU6YFRhYnNUcmlnZ2VyYCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZSx7Zm9yd2FyZFJlZjpufT1HeSgpLHI9SWIoKSxpPVcoKCk9PnpiKHIuYmFzZUlkLHQudmFsdWUpKSxhPVcoKCk9PnIuY29udGVudElkcy52YWx1ZS5oYXModC52YWx1ZSk/QmIoci5iYXNlSWQsdC52YWx1ZSk6dm9pZCAwKSxvPVcoKCk9PnQudmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWUpO3JldHVybihlLHQpPT4oUigpLEIoTihGYikseyJhcy1jaGlsZCI6YGAsZm9jdXNhYmxlOiFlLmRpc2FibGVkLGFjdGl2ZTpvLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7aWQ6aS52YWx1ZSxyZWY6TihuKSxyb2xlOmB0YWJgLHR5cGU6ZS5hcz09PWBidXR0b25gP2BidXR0b25gOnZvaWQgMCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLCJhcmlhLXNlbGVjdGVkIjpvLnZhbHVlP2B0cnVlYDpgZmFsc2VgLCJhcmlhLWNvbnRyb2xzIjphLnZhbHVlLCJkYXRhLXN0YXRlIjpvLnZhbHVlP2BhY3RpdmVgOmBpbmFjdGl2ZWAsZGlzYWJsZWQ6ZS5kaXNhYmxlZCwiZGF0YS1kaXNhYmxlZCI6ZS5kaXNhYmxlZD9gYDp2b2lkIDAsImRhdGEtb3JpZW50YXRpb24iOk4ocikub3JpZW50YXRpb24udmFsdWUsb25Nb3VzZWRvd246dFswXXx8PWl1KHQ9PnshZS5kaXNhYmxlZCYmdC5jdHJsS2V5PT09ITE/TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpOnQucHJldmVudERlZmF1bHQoKX0sW2BsZWZ0YF0pLG9uS2V5ZG93bjp0WzFdfHw9b3UodD0+TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpLFtgZW50ZXJgLGBzcGFjZWBdKSxvbkZvY3VzOnRbMl18fD0oKT0+e2xldCB0PU4ocikuYWN0aXZhdGlvbk1vZGUhPT1gbWFudWFsYDshby52YWx1ZSYmIWUuZGlzYWJsZWQmJnQmJk4ocikuY2hhbmdlTW9kZWxWYWx1ZShlLnZhbHVlKX19LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BpZGAsYHR5cGVgLGBhc2AsYGFzLWNoaWxkYCxgYXJpYS1zZWxlY3RlZGAsYGFyaWEtY29udHJvbHNgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKV0pLF86M30sOCxbYGZvY3VzYWJsZWAsYGFjdGl2ZWBdKSl9fSksV2I9Rih7X19uYW1lOmBCdXR0b25gLHByb3BzOnt2YXJpYW50Ont9LHNpemU6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7ZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKG4scik9PihSKCksQihOKG5iKSx7ImRhdGEtc2xvdCI6YGJ1dHRvbmAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50LCJkYXRhLXNpemUiOmUuc2l6ZSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGNsYXNzOk8oTihZdikoTihHYikoe3ZhcmlhbnQ6ZS52YXJpYW50LHNpemU6ZS5zaXplfSksdC5jbGFzcykpfSx7ZGVmYXVsdDpQKCgpPT5bSShuLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS12YXJpYW50YCxgZGF0YS1zaXplYCxgYXNgLGBhcy1jaGlsZGAsYGNsYXNzYF0pKX19KSxHYj1DXyhgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBiZy1jbGlwLXBhZGRpbmcgdGV4dC1zbSBmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGFjdGl2ZTpub3QtYXJpYS1baGFzcG9wdXBdOnRyYW5zbGF0ZS15LXB4IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTQgZ3JvdXAvYnV0dG9uIGlubGluZS1mbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgc2VsZWN0LW5vbmUgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6YGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2FdOmhvdmVyOmJnLXByaW1hcnkvODBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1tdXRlZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLHNlY29uZGFyeTpgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIGFyaWEtZXhwYW5kZWQ6Ymctc2Vjb25kYXJ5IGFyaWEtZXhwYW5kZWQ6dGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZGAsZ2hvc3Q6YGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBkYXJrOmhvdmVyOmJnLW11dGVkLzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLGRlc3RydWN0aXZlOmBiZy1kZXN0cnVjdGl2ZS8xMCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS8yMCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS8yMCB0ZXh0LWRlc3RydWN0aXZlIGZvY3VzLXZpc2libGU6Ym9yZGVyLWRlc3RydWN0aXZlLzQwIGRhcms6aG92ZXI6YmctZGVzdHJ1Y3RpdmUvMzBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH0sc2l6ZTp7ZGVmYXVsdDpgaC04IGdhcC0xLjUgcHgtMi41IGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTIgaGFzLWRhdGEtW2ljb249aW5saW5lLXN0YXJ0XTpwbC0yYCx4czpgaC02IGdhcC0xIHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEwcHgpXSBweC0yIHRleHQteHMgaW4tZGF0YS1bc2xvdD1idXR0b24tZ3JvdXBdOnJvdW5kZWQtbGcgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMS41IGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMS41IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLHNtOmBoLTcgZ2FwLTEgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTJweCldIHB4LTIuNSB0ZXh0LVswLjhyZW1dIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS0zLjVgLGxnOmBoLTkgZ2FwLTEuNSBweC0yLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMiBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTJgLGljb246YHNpemUtOGAsImljb24teHMiOmBzaXplLTYgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTBweCldIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLCJpY29uLXNtIjpgc2l6ZS03IHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEycHgpXSBpbi1kYXRhLVtzbG90PWJ1dHRvbi1ncm91cF06cm91bmRlZC1sZ2AsImljb24tbGciOmBzaXplLTlgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YCxzaXplOmBkZWZhdWx0YH19KSxLYj1bYGRhdGEtc2l6ZWBdLHFiPUYoe19fbmFtZTpgQ2FyZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19LHNpemU6e2RlZmF1bHQ6YGRlZmF1bHRgfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4obixyKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZGAsImRhdGEtc2l6ZSI6ZS5zaXplLGNsYXNzOk8oTihZdikoYHJpbmctZm9yZWdyb3VuZC8xMCBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kIGdhcC00IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIHB5LTQgdGV4dC1zbSByaW5nLTEgaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgaGFzLVs+aW1nOmZpcnN0LWNoaWxkXTpwdC0wIGRhdGEtW3NpemU9c21dOmdhcC0zIGRhdGEtW3NpemU9c21dOnB5LTMgZGF0YS1bc2l6ZT1zbV06aGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgKjpbaW1nOmZpcnN0LWNoaWxkXTpyb3VuZGVkLXQteGwgKjpbaW1nOmxhc3QtY2hpbGRdOnJvdW5kZWQtYi14bCBncm91cC9jYXJkIGZsZXggZmxleC1jb2xgLHQuY2xhc3MpKX0sW0kobi4kc2xvdHMsYGRlZmF1bHRgKV0sMTAsS2IpKX19KSxKYj1GKHtfX25hbWU6YENhcmRDb250ZW50YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtY29udGVudGAsY2xhc3M6TyhOKFl2KShgcHgtNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOnB4LTNgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFliPUYoe19fbmFtZTpgQ2FyZERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtZGVzY3JpcHRpb25gLGNsYXNzOk8oTihZdikoYHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxYYj1GKHtfX25hbWU6YENhcmRIZWFkZXJgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZC1oZWFkZXJgLGNsYXNzOk8oTihZdikoYGdhcC0xIHJvdW5kZWQtdC14bCBweC00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6cHgtMyBbLmJvcmRlci1iXTpwYi00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6Wy5ib3JkZXItYl06cGItMyBncm91cC9jYXJkLWhlYWRlciBAY29udGFpbmVyL2NhcmQtaGVhZGVyIGdyaWQgYXV0by1yb3dzLW1pbiBpdGVtcy1zdGFydCBoYXMtZGF0YS1bc2xvdD1jYXJkLWFjdGlvbl06Z3JpZC1jb2xzLVsxZnJfYXV0b10gaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1kZXNjcmlwdGlvbl06Z3JpZC1yb3dzLVthdXRvX2F1dG9dYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxaYj1GKHtfX25hbWU6YENhcmRUaXRsZWAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkLXRpdGxlYCxjbGFzczpPKE4oWXYpKGB0ZXh0LWJhc2UgbGVhZGluZy1zbnVnIGZvbnQtbWVkaXVtIGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6dGV4dC1zbSBjbi1mb250LWhlYWRpbmdgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFFiPUYoe19fbmFtZTpgSW5wdXRgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sbW9kZWxWYWx1ZTp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj1JeShuLGBtb2RlbFZhbHVlYCx0LHtwYXNzaXZlOiEwLGRlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZX0pO3JldHVybihlLHQpPT5ncigoUigpLHooYGlucHV0YCx7Im9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLCJkYXRhLXNsb3QiOmBpbnB1dGAsY2xhc3M6TyhOKFl2KShgZGFyazpiZy1pbnB1dC8zMCBib3JkZXItaW5wdXQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIGRpc2FibGVkOmJnLWlucHV0LzUwIGRhcms6ZGlzYWJsZWQ6YmctaW5wdXQvODAgaC04IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB4LTIuNSBweS0xIHRleHQtYmFzZSB0cmFuc2l0aW9uLWNvbG9ycyBmaWxlOmgtNiBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIG1kOnRleHQtc20gdy1mdWxsIG1pbi13LTAgb3V0bGluZS1ub25lIGZpbGU6aW5saW5lLWZsZXggZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1mb3JlZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwYCxuLmNsYXNzKSl9LG51bGwsMikpLFtbV2wsTihyKV1dKX19KSwkYj1gbGxtZ3dBZG1pbktleWA7ZnVuY3Rpb24gZXgoKXt0cnl7cmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJGIpPz9gYH1jYXRjaHtyZXR1cm5gYH19ZnVuY3Rpb24gdHgoZSl7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJGIsZSl9Y2F0Y2h7fX1mdW5jdGlvbiBueCgpe3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCRiKX1jYXRjaHt9fXZhciByeD10XyhgYXV0aGAse3N0YXRlOigpPT4oe2FwaUtleTpleCgpLGVycm9yOmBgfSksZ2V0dGVyczp7aXNBdXRoZW50aWNhdGVkOmU9PmUuYXBpS2V5IT09YGB9LGFjdGlvbnM6e3N1Ym1pdChlKXtlJiYodGhpcy5hcGlLZXk9ZSx0aGlzLmVycm9yPWBgLHR4KGUpKX0scmVqZWN0KGUpe3RoaXMuYXBpS2V5PWBgLHRoaXMuZXJyb3I9ZSxueCgpfX19KSxpeD1jbGFzcyBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpLHRoaXMubmFtZT1gQWRtaW5BcGlFcnJvcmAsdGhpcy5zdGF0dXM9dH19O2FzeW5jIGZ1bmN0aW9uIGF4KGUpe2xldCB0PXJ4KCksbj10LmFwaUtleSxyPWF3YWl0IGZldGNoKGUse2NyZWRlbnRpYWxzOmBzYW1lLW9yaWdpbmAsaGVhZGVyczpuP3sieC1hcGkta2V5IjpufTp7fX0pO2lmKHIuc3RhdHVzPT09NDAxfHxyLnN0YXR1cz09PTQwMyl0aHJvdyB0LmFwaUtleT09PW4mJnQucmVqZWN0KGBpbnZhbGlkIGtleSwgb3Igbm90IGFuIGFkbWluYCksbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7aWYoIXIub2spdGhyb3cgbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7cmV0dXJuIGF3YWl0IHIuanNvbigpfXZhciBveD01ZTMsc3g9dF8oYGRhc2hib2FyZGAse3N0YXRlOigpPT4oe292ZXJ2aWV3Om51bGwsdXNhZ2U6bnVsbCx0YXJnZXRzOm51bGwsbGFzdFVwZGF0ZWQ6bnVsbCxlcnJvcjpgYCx0aW1lcjp2b2lkIDB9KSxhY3Rpb25zOnthc3luYyByZWZyZXNoKCl7aWYoIXJ4KCkuaXNBdXRoZW50aWNhdGVkKXJldHVybjtsZXRbZSx0LG5dPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbYXgoYC9hZG1pbi9hcGkvb3ZlcnZpZXdgKSxheChgL2FkbWluL2FwaS91c2FnZWApLGF4KGAvYWRtaW4vYXBpL3RhcmdldHNgKV0pO2Uuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLm92ZXJ2aWV3PWUudmFsdWUpLHQuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnVzYWdlPXQudmFsdWUpLG4uc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnRhcmdldHM9bi52YWx1ZSk7bGV0IHI9W107aWYoZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmBvdmVydmlld2AscmVhc29uOmUucmVhc29ufSksdC5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB1c2FnZWAscmVhc29uOnQucmVhc29ufSksbi5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB0YXJnZXRzYCxyZWFzb246bi5yZWFzb259KSxyLmxlbmd0aD09PTApe3RoaXMubGFzdFVwZGF0ZWQ9bmV3IERhdGUsdGhpcy5lcnJvcj1gYDtyZXR1cm59ci5zb21lKCh7cmVhc29uOmV9KT0+ZSBpbnN0YW5jZW9mIGl4JiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSl8fChyLmxlbmd0aDwzJiYodGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZSksdGhpcy5lcnJvcj1yLm1hcCgoe2xhYmVsOmUscmVhc29uOnR9KT0+YCR7ZX06ICR7dCBpbnN0YW5jZW9mIEVycm9yP3QubWVzc2FnZTpTdHJpbmcodCl9YCkuam9pbihgOyBgKSl9LHN0YXJ0UG9sbGluZygpe3RoaXMudGltZXI9PT12b2lkIDAmJih0aGlzLnJlZnJlc2goKSx0aGlzLnRpbWVyPXNldEludGVydmFsKCgpPT52b2lkIHRoaXMucmVmcmVzaCgpLG94KSl9LHN0b3BQb2xsaW5nKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxjeD17Y2xhc3M6YG14LWF1dG8gZmxleCBtaW4taC1bNzB2aF0gbWF4LXctbWQgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgcHgtNGB9LGx4PXtjbGFzczpgZmxleCBzaXplLTEyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgYmctcHJpbWFyeS8xMCB0ZXh0LXByaW1hcnlgfSx1eD17Y2xhc3M6YGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xYH0sZHg9eyJhcmlhLWxhYmVsbGVkYnkiOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMS41IHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sZng9e2NsYXNzOmBmbGV4IGl0ZW1zLXN0YXJ0IGdhcC0xLjVgfSxweD17Y2xhc3M6YGZsZXggaXRlbXMtc3RhcnQgZ2FwLTEuNWB9LG14PXtjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41YH0saHg9e2NsYXNzOmByZWxhdGl2ZWB9LGd4PSgoZSx0KT0+e2xldCBuPWUuX192Y2NPcHRzfHxlO2ZvcihsZXRbZSxyXW9mIHQpbltlXT1yO3JldHVybiBufSkoRih7X19uYW1lOmBBdXRoR2F0ZWAsc2V0dXAoZSl7bGV0IHQ9cngoKSxuPXN4KCkscj1NKGBgKSxpPU0oITEpLGE9TShudWxsKSxvPVcoKCk9PnIudmFsdWUudHJpbSgpIT09YGApO2Z1bmN0aW9uIHMoKXtsZXQgZT1yLnZhbHVlO3IudmFsdWU9YGAsdC5zdWJtaXQoZSksbi5yZWZyZXNoKCl9ZnVuY3Rpb24gYygpe1FuKCgpPT5hLnZhbHVlPy4kZWw/LmZvY3VzKCkpfXJldHVybiBaaShjKSxFcigoKT0+dC5lcnJvcixlPT57ZSYmYygpfSksKGUsbik9PntsZXQgYz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLGN4LFtIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYikse2NsYXNzOmBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LWNlbnRlcmB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLGx4LFtIKGMse2ljb246TihpXyksY2xhc3M6YHNpemUtNWAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxWKGBkaXZgLHV4LFtuWzNdfHw9Vihgc3BhbmAse2NsYXNzOmB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBMTE0gR2F0ZXdheWAsLTEpLEgoTihaYikse2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ublsyXXx8PVtVKGBBZG1pbiBrZXkgcmVxdWlyZWRgLC0xKV1dKSxfOjF9KV0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls0XXx8PVtVKGBFbnRlciBhbiBhZG1pbiBBUEkga2V5IHRvIGNvbnRpbnVlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTRgfSx7ZGVmYXVsdDpQKCgpPT5bblsxMF18fD1WKGBoMmAse2lkOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgc3Itb25seWB9LGAgSG93IHRoaXMga2V5IGlzIGhhbmRsZWQgYCwtMSksVihgdWxgLGR4LFtWKGBsaWAsZngsW0goYyx7aWNvbjpOKHVfKSxjbGFzczpgbXQtMC41IHNpemUtMyBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSksbls1XXx8PVYoYHNwYW5gLG51bGwsYEtlcHQgb25seSBpbiB0aGlzIHRhYidzIHNlc3Npb24gc3RvcmFnZWAsLTEpXSksVihgbGlgLHB4LFtIKGMse2ljb246Tih1XyksY2xhc3M6YG10LTAuNSBzaXplLTMgc2hyaW5rLTBgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLG5bNl18fD1WKGBzcGFuYCxudWxsLGBOZXZlciB3cml0dGVuIHRvIGRpc2tgLC0xKV0pLFYoYGxpYCxteCxbSChjLHtpY29uOk4odV8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zIHNocmluay0wYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSxuWzddfHw9Vihgc3BhbmAsbnVsbCxgU2VudCBvbmx5IHRvIHRoaXMgcGFnZSdzIG93biAvYWRtaW4vYXBpLyogcmVxdWVzdHNgLC0xKV0pXSksVihgZm9ybWAse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC0zYCxvblN1Ym1pdDppdShzLFtgcHJldmVudGBdKX0sW1YoYGRpdmAsaHgsW0goTihRYikse3JlZl9rZXk6YGtleUlucHV0RWxgLHJlZjphLG1vZGVsVmFsdWU6ci52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6blswXXx8PWU9PnIudmFsdWU9ZSx0eXBlOmkudmFsdWU/YHRleHRgOmBwYXNzd29yZGAsYXV0b2NvbXBsZXRlOmBvZmZgLHBsYWNlaG9sZGVyOmBBUEkga2V5YCwiYXJpYS1sYWJlbCI6YEFkbWluIEFQSSBrZXlgLCJhcmlhLWludmFsaWQiOiEhTih0KS5lcnJvciwiYXJpYS1kZXNjcmliZWRieSI6Tih0KS5lcnJvcj9gYXV0aGdhdGUtZXJyb3JgOnZvaWQgMCxjbGFzczpPKFtgaC0xMCBwci0xMGAseyJhdXRoZ2F0ZS1zaGFrZSI6Tih0KS5lcnJvcn1dKX0sbnVsbCw4LFtgbW9kZWxWYWx1ZWAsYHR5cGVgLGBhcmlhLWludmFsaWRgLGBhcmlhLWRlc2NyaWJlZGJ5YCxgY2xhc3NgXSksSChOKFdiKSx7dHlwZTpgYnV0dG9uYCx2YXJpYW50OmBnaG9zdGAsc2l6ZTpgaWNvbi14c2AsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMS41IC10cmFuc2xhdGUteS0xLzIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZGAsImFyaWEtbGFiZWwiOmkudmFsdWU/YEhpZGUga2V5YDpgU2hvdyBrZXlgLG9uQ2xpY2s6blsxXXx8PWU9PmkudmFsdWU9IWkudmFsdWV9LHtkZWZhdWx0OlAoKCk9PltIKGMse2ljb246aS52YWx1ZT9OKF9fKTpOKG9fKSxjbGFzczpgc2l6ZS0zLjVgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSw4LFtgYXJpYS1sYWJlbGBdKV0pLEgoTihXYikse3R5cGU6YHN1Ym1pdGAsY2xhc3M6YHctZnVsbGAsZGlzYWJsZWQ6IW8udmFsdWV9LHtkZWZhdWx0OlAoKCk9PlsuLi5uWzhdfHw9W1UoYCBDb250aW51ZSBgLC0xKV1dKSxfOjF9LDgsW2BkaXNhYmxlZGBdKV0sMzIpLE4odCkuZXJyb3I/KFIoKSxCKE4oWHYpLHtrZXk6MCxpZDpgYXV0aGdhdGUtZXJyb3JgLHZhcmlhbnQ6YGRlc3RydWN0aXZlYH0se2RlZmF1bHQ6UCgoKT0+W0goTihRdiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls5XXx8PVtVKGBBdXRoZW50aWNhdGlvbiBmYWlsZWRgLC0xKV1dKSxfOjF9KSxIKE4oWnYpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1UoayhOKHQpLmVycm9yKSwxKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKV0pLF86MX0pXSksXzoxfSldKX19fSksW1tgX19zY29wZUlkYCxgZGF0YS12LTRiZTZiYzA5YF1dKTtmdW5jdGlvbiBfeChlLHQpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lKHQpOmV9ZnVuY3Rpb24gdngoZSx0KXtyZXR1cm4gbj0+e3Quc2V0U3RhdGUodD0+KHsuLi50LFtlXTpfeChuLHRbZV0pfSkpfX1mdW5jdGlvbiB5eChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEZ1bmN0aW9ufWZ1bmN0aW9uIGJ4KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmV2ZXJ5KGU9PnR5cGVvZiBlPT1gbnVtYmVyYCl9ZnVuY3Rpb24geHgoZSx0KXtsZXQgbj1bXSxyPWU9PntlLmZvckVhY2goZT0+e24ucHVzaChlKTtsZXQgaT10KGUpO2khPW51bGwmJmkubGVuZ3RoJiZyKGkpfSl9O3JldHVybiByKGUpLG59ZnVuY3Rpb24gUShlLHQsbil7bGV0IHI9W10saTtyZXR1cm4gYT0+e2xldCBvO24ua2V5JiZuLmRlYnVnJiYobz1EYXRlLm5vdygpKTtsZXQgcz1lKGEpO2lmKCEocy5sZW5ndGghPT1yLmxlbmd0aHx8cy5zb21lKChlLHQpPT5yW3RdIT09ZSkpKXJldHVybiBpO3I9cztsZXQgYztpZihuLmtleSYmbi5kZWJ1ZyYmKGM9RGF0ZS5ub3coKSksaT10KC4uLnMpLG49PW51bGx8fG4ub25DaGFuZ2U9PW51bGx8fG4ub25DaGFuZ2UoaSksbi5rZXkmJm4uZGVidWcmJm4hPW51bGwmJm4uZGVidWcoKSl7bGV0IGU9TWF0aC5yb3VuZCgoRGF0ZS5ub3coKS1vKSoxMDApLzEwMCx0PU1hdGgucm91bmQoKERhdGUubm93KCktYykqMTAwKS8xMDAscj10LzE2LGk9KGUsdCk9Pntmb3IoZT1TdHJpbmcoZSk7ZS5sZW5ndGg8dDspZT1gIGArZTtyZXR1cm4gZX07Y29uc29sZS5pbmZvKGAlY+KPsSAke2kodCw1KX0gLyR7aShlLDUpfSBtc2AsYAogICAgICAgICAgICBmb250LXNpemU6IC42cmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICAgICAgY29sb3I6IGhzbCgke01hdGgubWF4KDAsTWF0aC5taW4oMTIwLTEyMCpyLDEyMCkpfWRlZyAxMDAlIDMxJSk7YCxuPy5rZXkpfXJldHVybiBpfX1mdW5jdGlvbiAkKGUsdCxuLHIpe3JldHVybntkZWJ1ZzooKT0+ZT8uZGVidWdBbGw/P2VbdF0sa2V5OiExLG9uQ2hhbmdlOnJ9fWZ1bmN0aW9uIFN4KGUsdCxuLHIpe2xldCBpPXtpZDpgJHt0LmlkfV8ke24uaWR9YCxyb3c6dCxjb2x1bW46bixnZXRWYWx1ZTooKT0+dC5nZXRWYWx1ZShyKSxyZW5kZXJWYWx1ZTooKT0+aS5nZXRWYWx1ZSgpPz9lLm9wdGlvbnMucmVuZGVyRmFsbGJhY2tWYWx1ZSxnZXRDb250ZXh0OlEoKCk9PltlLG4sdCxpXSwoZSx0LG4scik9Pih7dGFibGU6ZSxjb2x1bW46dCxyb3c6bixjZWxsOnIsZ2V0VmFsdWU6ci5nZXRWYWx1ZSxyZW5kZXJWYWx1ZTpyLnJlbmRlclZhbHVlfSksJChlLm9wdGlvbnMsYGRlYnVnQ2VsbHNgLGBjZWxsLmdldENvbnRleHRgKSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHI9PntyLmNyZWF0ZUNlbGw9PW51bGx8fHIuY3JlYXRlQ2VsbChpLG4sdCxlKX0se30pLGl9ZnVuY3Rpb24gQ3goZSx0LG4scil7bGV0IGk9ey4uLmUuX2dldERlZmF1bHRDb2x1bW5EZWYoKSwuLi50fSxhPWkuYWNjZXNzb3JLZXksbz1pLmlkPz8oYT90eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsPT1gZnVuY3Rpb25gP2EucmVwbGFjZUFsbChgLmAsYF9gKTphLnJlcGxhY2UoL1wuL2csYF9gKTp2b2lkIDApPz8odHlwZW9mIGkuaGVhZGVyPT1gc3RyaW5nYD9pLmhlYWRlcjp2b2lkIDApLHM7aWYoaS5hY2Nlc3NvckZuP3M9aS5hY2Nlc3NvckZuOmEmJihzPWEuaW5jbHVkZXMoYC5gKT9lPT57bGV0IHQ9ZTtmb3IobGV0IGUgb2YgYS5zcGxpdChgLmApKXQ9dD8uW2VdO3JldHVybiB0fTplPT5lW2kuYWNjZXNzb3JLZXldKSwhbyl0aHJvdyBFcnJvcigpO2xldCBjPXtpZDpgJHtTdHJpbmcobyl9YCxhY2Nlc3NvckZuOnMscGFyZW50OnIsZGVwdGg6bixjb2x1bW5EZWY6aSxjb2x1bW5zOltdLGdldEZsYXRDb2x1bW5zOlEoKCk9PlshMF0sKCk9PltjLC4uLmMuY29sdW1ucz8uZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpXSwkKGUub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgY29sdW1uLmdldEZsYXRDb2x1bW5zYCkpLGdldExlYWZDb2x1bW5zOlEoKCk9PltlLl9nZXRPcmRlckNvbHVtbnNGbigpXSxlPT57dmFyIHQ7cmV0dXJuKHQ9Yy5jb2x1bW5zKSE9bnVsbCYmdC5sZW5ndGg/ZShjLmNvbHVtbnMuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKTpbY119LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBjb2x1bW4uZ2V0TGVhZkNvbHVtbnNgKSl9O2ZvcihsZXQgdCBvZiBlLl9mZWF0dXJlcyl0LmNyZWF0ZUNvbHVtbj09bnVsbHx8dC5jcmVhdGVDb2x1bW4oYyxlKTtyZXR1cm4gY312YXIgd3g9YGRlYnVnSGVhZGVyc2A7ZnVuY3Rpb24gVHgoZSx0LG4pe2xldCByPXtpZDpuLmlkPz90LmlkLGNvbHVtbjp0LGluZGV4Om4uaW5kZXgsaXNQbGFjZWhvbGRlcjohIW4uaXNQbGFjZWhvbGRlcixwbGFjZWhvbGRlcklkOm4ucGxhY2Vob2xkZXJJZCxkZXB0aDpuLmRlcHRoLHN1YkhlYWRlcnM6W10sY29sU3BhbjowLHJvd1NwYW46MCxoZWFkZXJHcm91cDpudWxsLGdldExlYWZIZWFkZXJzOigpPT57bGV0IGU9W10sdD1uPT57bi5zdWJIZWFkZXJzJiZuLnN1YkhlYWRlcnMubGVuZ3RoJiZuLnN1YkhlYWRlcnMubWFwKHQpLGUucHVzaChuKX07cmV0dXJuIHQociksZX0sZ2V0Q29udGV4dDooKT0+KHt0YWJsZTplLGhlYWRlcjpyLGNvbHVtbjp0fSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHQ9Pnt0LmNyZWF0ZUhlYWRlcj09bnVsbHx8dC5jcmVhdGVIZWFkZXIocixlKX0pLHJ9dmFyIEV4PXtjcmVhdGVUYWJsZTplPT57ZS5nZXRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT57bGV0IGE9cj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sbz1pPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxzPW4uZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlLmlkKSkmJiEoaSE9bnVsbCYmaS5pbmNsdWRlcyhlLmlkKSkpO3JldHVybiBEeCh0LFsuLi5hLC4uLnMsLi4ub10sZSl9LCQoZS5vcHRpb25zLHd4LGBnZXRIZWFkZXJHcm91cHNgKSksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT4obj1uLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZS5pZCkpJiYhKGkhPW51bGwmJmkuaW5jbHVkZXMoZS5pZCkpKSxEeCh0LG4sZSxgY2VudGVyYCkpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJIZWFkZXJHcm91cHNgKSksZS5nZXRMZWZ0SGVhZGVyR3JvdXBzPVEoKCk9PltlLmdldEFsbENvbHVtbnMoKSxlLmdldFZpc2libGVMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgbGVmdGApLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0SGVhZGVyR3JvdXBzYCkpLGUuZ2V0UmlnaHRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgcmlnaHRgKSwkKGUub3B0aW9ucyx3eCxgZ2V0UmlnaHRIZWFkZXJHcm91cHNgKSksZS5nZXRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0SGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldEZvb3Rlckdyb3Vwc2ApKSxlLmdldExlZnRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0Rm9vdGVyR3JvdXBzYCkpLGUuZ2V0Q2VudGVyRm9vdGVyR3JvdXBzPVEoKCk9PltlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGb290ZXJHcm91cHNgKSksZS5nZXRSaWdodEZvb3Rlckdyb3Vwcz1RKCgpPT5bZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRSaWdodEZvb3Rlckdyb3Vwc2ApKSxlLmdldEZsYXRIZWFkZXJzPVEoKCk9PltlLmdldEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0RmxhdEhlYWRlcnNgKSksZS5nZXRMZWZ0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0TGVmdEZsYXRIZWFkZXJzYCkpLGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCldLGU9PmUubWFwKGU9PmUuaGVhZGVycykuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGbGF0SGVhZGVyc2ApKSxlLmdldFJpZ2h0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sZT0+ZS5tYXAoZT0+ZS5oZWFkZXJzKS5mbGF0KCksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0RmxhdEhlYWRlcnNgKSksZS5nZXRDZW50ZXJMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRDZW50ZXJGbGF0SGVhZGVycygpXSxlPT5lLmZpbHRlcihlPT57dmFyIHQ7cmV0dXJuISgodD1lLnN1YkhlYWRlcnMpIT1udWxsJiZ0Lmxlbmd0aCl9KSwkKGUub3B0aW9ucyx3eCxgZ2V0Q2VudGVyTGVhZkhlYWRlcnNgKSksZS5nZXRMZWZ0TGVhZkhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEZsYXRIZWFkZXJzKCldLGU9PmUuZmlsdGVyKGU9Pnt2YXIgdDtyZXR1cm4hKCh0PWUuc3ViSGVhZGVycykhPW51bGwmJnQubGVuZ3RoKX0pLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0TGVhZkhlYWRlcnNgKSksZS5nZXRSaWdodExlYWZIZWFkZXJzPVEoKCk9PltlLmdldFJpZ2h0RmxhdEhlYWRlcnMoKV0sZT0+ZS5maWx0ZXIoZT0+e3ZhciB0O3JldHVybiEoKHQ9ZS5zdWJIZWFkZXJzKSE9bnVsbCYmdC5sZW5ndGgpfSksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0TGVhZkhlYWRlcnNgKSksZS5nZXRMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKSxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCldLChlLHQsbik9PlsuLi5lWzBdPy5oZWFkZXJzPz9bXSwuLi50WzBdPy5oZWFkZXJzPz9bXSwuLi5uWzBdPy5oZWFkZXJzPz9bXV0ubWFwKGU9PmUuZ2V0TGVhZkhlYWRlcnMoKSkuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWFmSGVhZGVyc2ApKX19O2Z1bmN0aW9uIER4KGUsdCxuLHIpe2xldCBpPTAsYT1mdW5jdGlvbihlLHQpe3Q9PT12b2lkIDAmJih0PTEpLGk9TWF0aC5tYXgoaSx0KSxlLmZpbHRlcihlPT5lLmdldElzVmlzaWJsZSgpKS5mb3JFYWNoKGU9Pnt2YXIgbjsobj1lLmNvbHVtbnMpIT1udWxsJiZuLmxlbmd0aCYmYShlLmNvbHVtbnMsdCsxKX0sMCl9O2EoZSk7bGV0IG89W10scz0oZSx0KT0+e2xldCBpPXtkZXB0aDp0LGlkOltyLGAke3R9YF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxoZWFkZXJzOltdfSxhPVtdO2UuZm9yRWFjaChlPT57bGV0IG89Wy4uLmFdLnJldmVyc2UoKVswXSxzPWUuY29sdW1uLmRlcHRoPT09aS5kZXB0aCxjLGw9ITE7aWYocyYmZS5jb2x1bW4ucGFyZW50P2M9ZS5jb2x1bW4ucGFyZW50OihjPWUuY29sdW1uLGw9ITApLG8mJm8/LmNvbHVtbj09PWMpby5zdWJIZWFkZXJzLnB1c2goZSk7ZWxzZXtsZXQgaT1UeChuLGMse2lkOltyLHQsYy5pZCxlPy5pZF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxpc1BsYWNlaG9sZGVyOmwscGxhY2Vob2xkZXJJZDpsP2Ake2EuZmlsdGVyKGU9PmUuY29sdW1uPT09YykubGVuZ3RofWA6dm9pZCAwLGRlcHRoOnQsaW5kZXg6YS5sZW5ndGh9KTtpLnN1YkhlYWRlcnMucHVzaChlKSxhLnB1c2goaSl9aS5oZWFkZXJzLnB1c2goZSksZS5oZWFkZXJHcm91cD1pfSksby5wdXNoKGkpLHQ+MCYmcyhhLHQtMSl9O3ModC5tYXAoKGUsdCk9PlR4KG4sZSx7ZGVwdGg6aSxpbmRleDp0fSkpLGktMSksby5yZXZlcnNlKCk7bGV0IGM9ZT0+ZS5maWx0ZXIoZT0+ZS5jb2x1bW4uZ2V0SXNWaXNpYmxlKCkpLm1hcChlPT57bGV0IHQ9MCxuPTAscj1bMF07ZS5zdWJIZWFkZXJzJiZlLnN1YkhlYWRlcnMubGVuZ3RoPyhyPVtdLGMoZS5zdWJIZWFkZXJzKS5mb3JFYWNoKGU9PntsZXR7Y29sU3BhbjpuLHJvd1NwYW46aX09ZTt0Kz1uLHIucHVzaChpKX0pKTp0PTE7bGV0IGk9TWF0aC5taW4oLi4ucik7cmV0dXJuIG4rPWksZS5jb2xTcGFuPXQsZS5yb3dTcGFuPW4se2NvbFNwYW46dCxyb3dTcGFuOm59fSk7cmV0dXJuIGMob1swXT8uaGVhZGVycz8/W10pLG99dmFyIE94PShlLHQsbixyLGksYSxvKT0+e2xldCBzPXtpZDp0LGluZGV4OnIsb3JpZ2luYWw6bixkZXB0aDppLHBhcmVudElkOm8sX3ZhbHVlc0NhY2hlOnt9LF91bmlxdWVWYWx1ZXNDYWNoZTp7fSxnZXRWYWx1ZTp0PT57aWYocy5fdmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3ZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gcy5fdmFsdWVzQ2FjaGVbdF09bi5hY2Nlc3NvckZuKHMub3JpZ2luYWwscikscy5fdmFsdWVzQ2FjaGVbdF19LGdldFVuaXF1ZVZhbHVlczp0PT57aWYocy5fdW5pcXVlVmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzPyhzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XT1uLmNvbHVtbkRlZi5nZXRVbmlxdWVWYWx1ZXMocy5vcmlnaW5hbCxyKSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSk6KHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdPVtzLmdldFZhbHVlKHQpXSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSl9LHJlbmRlclZhbHVlOnQ9PnMuZ2V0VmFsdWUodCk/P2Uub3B0aW9ucy5yZW5kZXJGYWxsYmFja1ZhbHVlLHN1YlJvd3M6YT8/W10sZ2V0TGVhZlJvd3M6KCk9Pnh4KHMuc3ViUm93cyxlPT5lLnN1YlJvd3MpLGdldFBhcmVudFJvdzooKT0+cy5wYXJlbnRJZD9lLmdldFJvdyhzLnBhcmVudElkLCEwKTp2b2lkIDAsZ2V0UGFyZW50Um93czooKT0+e2xldCBlPVtdLHQ9cztmb3IoOzspe2xldCBuPXQuZ2V0UGFyZW50Um93KCk7aWYoIW4pYnJlYWs7ZS5wdXNoKG4pLHQ9bn1yZXR1cm4gZS5yZXZlcnNlKCl9LGdldEFsbENlbGxzOlEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCldLHQ9PnQubWFwKHQ9PlN4KGUscyx0LHQuaWQpKSwkKGUub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0QWxsQ2VsbHNgKSksX2dldEFsbENlbGxzQnlDb2x1bW5JZDpRKCgpPT5bcy5nZXRBbGxDZWxscygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5jb2x1bW4uaWRdPXQsZSkse30pLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRBbGxDZWxsc0J5Q29sdW1uSWRgKSl9O2ZvcihsZXQgdD0wO3Q8ZS5fZmVhdHVyZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5fZmVhdHVyZXNbdF07bj09bnVsbHx8bi5jcmVhdGVSb3c9PW51bGx8fG4uY3JlYXRlUm93KHMsZSl9cmV0dXJuIHN9LGt4PXtjcmVhdGVDb2x1bW46KGUsdCk9PntlLl9nZXRGYWNldGVkUm93TW9kZWw9dC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmdC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCh0LGUuaWQpLGUuZ2V0RmFjZXRlZFJvd01vZGVsPSgpPT5lLl9nZXRGYWNldGVkUm93TW9kZWw/ZS5fZ2V0RmFjZXRlZFJvd01vZGVsKCk6dC5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCksZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXM9KCk9PmUuX2dldEZhY2V0ZWRVbmlxdWVWYWx1ZXM/ZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcygpOm5ldyBNYXAsZS5fZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXM9KCk9PntpZihlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKXJldHVybiBlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKCl9fX0sQXg9KGUsdCxuKT0+e3ZhciByLGk7bGV0IGE9bj09bnVsbHx8KHI9bi50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpO3JldHVybiEhKChpPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYoaT1pLnRvU3RyaW5nKCkpIT1udWxsJiYoaT1pLnRvTG93ZXJDYXNlKCkpIT1udWxsJiZpLmluY2x1ZGVzKGEpKX07QXguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgang9KGUsdCxuKT0+e3ZhciByO3JldHVybiEhKChyPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYocj1yLnRvU3RyaW5nKCkpIT1udWxsJiZyLmluY2x1ZGVzKG4pKX07anguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgTXg9KGUsdCxuKT0+e3ZhciByO3JldHVybigocj1lLmdldFZhbHVlKHQpKT09bnVsbHx8KHI9ci50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpKT09PW4/LnRvTG93ZXJDYXNlKCl9O014LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIE54PShlLHQsbik9PmUuZ2V0VmFsdWUodCk/LmluY2x1ZGVzKG4pO054LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIFB4PShlLHQsbik9PiFuLnNvbWUobj0+e3ZhciByO3JldHVybiEoKHI9ZS5nZXRWYWx1ZSh0KSkhPW51bGwmJnIuaW5jbHVkZXMobikpfSk7UHguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEZ4PShlLHQsbik9Pm4uc29tZShuPT5lLmdldFZhbHVlKHQpPy5pbmNsdWRlcyhuKSk7RnguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEl4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PT1uO0l4LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIEx4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PW47THguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgUng9KGUsdCxuKT0+e2xldFtyLGldPW4sYT1lLmdldFZhbHVlKHQpO3JldHVybiBhPj1yJiZhPD1pfTtSeC5yZXNvbHZlRmlsdGVyVmFsdWU9ZT0+e2xldFt0LG5dPWUscj10eXBlb2YgdD09YG51bWJlcmA/dDpwYXJzZUZsb2F0KHQpLGk9dHlwZW9mIG49PWBudW1iZXJgP246cGFyc2VGbG9hdChuKSxhPXQ9PT1udWxsfHxOdW1iZXIuaXNOYU4ocik/LTEvMDpyLG89bj09PW51bGx8fE51bWJlci5pc05hTihpKT8xLzA6aTtpZihhPm8pe2xldCBlPWE7YT1vLG89ZX1yZXR1cm5bYSxvXX0sUnguYXV0b1JlbW92ZT1lPT5CeChlKXx8QngoZVswXSkmJkJ4KGVbMV0pO3ZhciB6eD17aW5jbHVkZXNTdHJpbmc6QXgsaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmU6angsZXF1YWxzU3RyaW5nOk14LGFyckluY2x1ZGVzOk54LGFyckluY2x1ZGVzQWxsOlB4LGFyckluY2x1ZGVzU29tZTpGeCxlcXVhbHM6SXgsd2Vha0VxdWFsczpMeCxpbk51bWJlclJhbmdlOlJ4fTtmdW5jdGlvbiBCeChlKXtyZXR1cm4gZT09bnVsbHx8ZT09PWBgfXZhciBWeD17Z2V0RGVmYXVsdENvbHVtbkRlZjooKT0+KHtmaWx0ZXJGbjpgYXV0b2B9KSxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5GaWx0ZXJzOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uQ29sdW1uRmlsdGVyc0NoYW5nZTp2eChgY29sdW1uRmlsdGVyc2AsZSksZmlsdGVyRnJvbUxlYWZSb3dzOiExLG1heExlYWZSb3dGaWx0ZXJEZXB0aDoxMDB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldEF1dG9GaWx0ZXJGbj0oKT0+e2xldCBuPXQuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpO3JldHVybiB0eXBlb2Ygbj09YHN0cmluZ2A/enguaW5jbHVkZXNTdHJpbmc6dHlwZW9mIG49PWBudW1iZXJgP3p4LmluTnVtYmVyUmFuZ2U6dHlwZW9mIG49PWBib29sZWFuYHx8dHlwZW9mIG49PWBvYmplY3RgJiZuP3p4LmVxdWFsczpBcnJheS5pc0FycmF5KG4pP3p4LmFyckluY2x1ZGVzOnp4LndlYWtFcXVhbHN9LGUuZ2V0RmlsdGVyRm49KCk9Pnl4KGUuY29sdW1uRGVmLmZpbHRlckZuKT9lLmNvbHVtbkRlZi5maWx0ZXJGbjplLmNvbHVtbkRlZi5maWx0ZXJGbj09PWBhdXRvYD9lLmdldEF1dG9GaWx0ZXJGbigpOnQub3B0aW9ucy5maWx0ZXJGbnM/LltlLmNvbHVtbkRlZi5maWx0ZXJGbl0/P3p4W2UuY29sdW1uRGVmLmZpbHRlckZuXSxlLmdldENhbkZpbHRlcj0oKT0+KGUuY29sdW1uRGVmLmVuYWJsZUNvbHVtbkZpbHRlcj8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtbkZpbHRlcnM/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJiEhZS5hY2Nlc3NvckZuLGUuZ2V0SXNGaWx0ZXJlZD0oKT0+ZS5nZXRGaWx0ZXJJbmRleCgpPi0xLGUuZ2V0RmlsdGVyVmFsdWU9KCk9Pnt2YXIgbjtyZXR1cm4obj10LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycyk9PW51bGx8fChuPW4uZmluZCh0PT50LmlkPT09ZS5pZCkpPT1udWxsP3ZvaWQgMDpuLnZhbHVlfSxlLmdldEZpbHRlckluZGV4PSgpPT50LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycz8uZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKT8/LTEsZS5zZXRGaWx0ZXJWYWx1ZT1uPT57dC5zZXRDb2x1bW5GaWx0ZXJzKHQ9PntsZXQgcj1lLmdldEZpbHRlckZuKCksaT10Py5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxhPV94KG4saT9pLnZhbHVlOnZvaWQgMCk7aWYoSHgocixhLGUpKXJldHVybiB0Py5maWx0ZXIodD0+dC5pZCE9PWUuaWQpPz9bXTtsZXQgbz17aWQ6ZS5pZCx2YWx1ZTphfTtyZXR1cm4gaT90Py5tYXAodD0+dC5pZD09PWUuaWQ/bzp0KT8/W106dCE9bnVsbCYmdC5sZW5ndGg/Wy4uLnQsb106W29dfSl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLmNvbHVtbkZpbHRlcnM9e30sZS5jb2x1bW5GaWx0ZXJzTWV0YT17fX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Q29sdW1uRmlsdGVycz10PT57bGV0IG49ZS5nZXRBbGxMZWFmQ29sdW1ucygpO2Uub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2UoZT0+X3godCxlKT8uZmlsdGVyKGU9PntsZXQgdD1uLmZpbmQodD0+dC5pZD09PWUuaWQpO3JldHVybiEodCYmSHgodC5nZXRGaWx0ZXJGbigpLGUudmFsdWUsdCkpfSkpfSxlLnJlc2V0Q29sdW1uRmlsdGVycz10PT57ZS5zZXRDb2x1bW5GaWx0ZXJzKHQ/W106ZS5pbml0aWFsU3RhdGU/LmNvbHVtbkZpbHRlcnM/P1tdKX0sZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsPSgpPT5lLmdldENvcmVSb3dNb2RlbCgpLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RmlsdGVyZWRSb3dNb2RlbCYmKGUuX2dldEZpbHRlcmVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZpbHRlcmVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsP2UuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCgpOmUuX2dldEZpbHRlcmVkUm93TW9kZWwoKSl9fTtmdW5jdGlvbiBIeChlLHQsbil7cmV0dXJuKGUmJmUuYXV0b1JlbW92ZT9lLmF1dG9SZW1vdmUodCxuKTohMSl8fHQ9PT12b2lkIDB8fHR5cGVvZiB0PT1gc3RyaW5nYCYmIXR9dmFyIFV4PXtzdW06KGUsdCxuKT0+bi5yZWR1Y2UoKHQsbik9PntsZXQgcj1uLmdldFZhbHVlKGUpO3JldHVybiB0Kyh0eXBlb2Ygcj09YG51bWJlcmA/cjowKX0sMCksbWluOihlLHQsbik9PntsZXQgcjtyZXR1cm4gbi5mb3JFYWNoKHQ9PntsZXQgbj10LmdldFZhbHVlKGUpO24hPW51bGwmJihyPm58fHI9PT12b2lkIDAmJm4+PW4pJiYocj1uKX0pLHJ9LG1heDooZSx0LG4pPT57bGV0IHI7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocjxufHxyPT09dm9pZCAwJiZuPj1uKSYmKHI9bil9KSxyfSxleHRlbnQ6KGUsdCxuKT0+e2xldCByLGk7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocj09PXZvaWQgMD9uPj1uJiYocj1pPW4pOihyPm4mJihyPW4pLGk8biYmKGk9bikpKX0pLFtyLGldfSxtZWFuOihlLHQpPT57bGV0IG49MCxyPTA7aWYodC5mb3JFYWNoKHQ9PntsZXQgaT10LmdldFZhbHVlKGUpO2khPW51bGwmJihpPStpKT49aSYmKCsrbixyKz1pKX0pLG4pcmV0dXJuIHIvbn0sbWVkaWFuOihlLHQpPT57aWYoIXQubGVuZ3RoKXJldHVybjtsZXQgbj10Lm1hcCh0PT50LmdldFZhbHVlKGUpKTtpZighYngobikpcmV0dXJuO2lmKG4ubGVuZ3RoPT09MSlyZXR1cm4gblswXTtsZXQgcj1NYXRoLmZsb29yKG4ubGVuZ3RoLzIpLGk9bi5zb3J0KChlLHQpPT5lLXQpO3JldHVybiBuLmxlbmd0aCUyPT0wPyhpW3ItMV0raVtyXSkvMjppW3JdfSx1bmlxdWU6KGUsdCk9PkFycmF5LmZyb20obmV3IFNldCh0Lm1hcCh0PT50LmdldFZhbHVlKGUpKSkudmFsdWVzKCkpLHVuaXF1ZUNvdW50OihlLHQpPT5uZXcgU2V0KHQubWFwKHQ9PnQuZ2V0VmFsdWUoZSkpKS5zaXplLGNvdW50OihlLHQpPT50Lmxlbmd0aH0sV3g9e2dldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7YWdncmVnYXRlZENlbGw6ZT0+e3ZhciB0O3JldHVybigodD1lLmdldFZhbHVlKCkpPT1udWxsfHx0LnRvU3RyaW5nPT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCkpPz9udWxsfSxhZ2dyZWdhdGlvbkZuOmBhdXRvYH0pLGdldEluaXRpYWxTdGF0ZTplPT4oe2dyb3VwaW5nOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR3JvdXBpbmdDaGFuZ2U6dngoYGdyb3VwaW5nYCxlKSxncm91cGVkQ29sdW1uTW9kZTpgcmVvcmRlcmB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLnRvZ2dsZUdyb3VwaW5nPSgpPT57dC5zZXRHcm91cGluZyh0PT50IT1udWxsJiZ0LmluY2x1ZGVzKGUuaWQpP3QuZmlsdGVyKHQ9PnQhPT1lLmlkKTpbLi4udD8/W10sZS5pZF0pfSxlLmdldENhbkdyb3VwPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlR3JvdXBpbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHcm91cGluZz8/ITApJiYoISFlLmFjY2Vzc29yRm58fCEhZS5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZSksZS5nZXRJc0dyb3VwZWQ9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5jbHVkZXMoZS5pZCksZS5nZXRHcm91cGVkSW5kZXg9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5kZXhPZihlLmlkKSxlLmdldFRvZ2dsZUdyb3VwaW5nSGFuZGxlcj0oKT0+e2xldCB0PWUuZ2V0Q2FuR3JvdXAoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlR3JvdXBpbmcoKX19LGUuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm49KCk9PntsZXQgbj10LmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdPy5nZXRWYWx1ZShlLmlkKTtpZih0eXBlb2Ygbj09YG51bWJlcmApcmV0dXJuIFV4LnN1bTtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobik9PT1gW29iamVjdCBEYXRlXWApcmV0dXJuIFV4LmV4dGVudH0sZS5nZXRBZ2dyZWdhdGlvbkZuPSgpPT57aWYoIWUpdGhyb3cgRXJyb3IoKTtyZXR1cm4geXgoZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbik/ZS5jb2x1bW5EZWYuYWdncmVnYXRpb25GbjplLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuPT09YGF1dG9gP2UuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4oKTp0Lm9wdGlvbnMuYWdncmVnYXRpb25GbnM/LltlLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXT8/VXhbZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbl19fSxjcmVhdGVUYWJsZTplPT57ZS5zZXRHcm91cGluZz10PT5lLm9wdGlvbnMub25Hcm91cGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uR3JvdXBpbmdDaGFuZ2UodCksZS5yZXNldEdyb3VwaW5nPXQ9PntlLnNldEdyb3VwaW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/Lmdyb3VwaW5nPz9bXSl9LGUuZ2V0UHJlR3JvdXBlZFJvd01vZGVsPSgpPT5lLmdldEZpbHRlcmVkUm93TW9kZWwoKSxlLmdldEdyb3VwZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRHcm91cGVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRHcm91cGVkUm93TW9kZWwmJihlLl9nZXRHcm91cGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbEdyb3VwaW5nfHwhZS5fZ2V0R3JvdXBlZFJvd01vZGVsP2UuZ2V0UHJlR3JvdXBlZFJvd01vZGVsKCk6ZS5fZ2V0R3JvdXBlZFJvd01vZGVsKCkpfSxjcmVhdGVSb3c6KGUsdCk9PntlLmdldElzR3JvdXBlZD0oKT0+ISFlLmdyb3VwaW5nQ29sdW1uSWQsZS5nZXRHcm91cGluZ1ZhbHVlPW49PntpZihlLl9ncm91cGluZ1ZhbHVlc0NhY2hlLmhhc093blByb3BlcnR5KG4pKXJldHVybiBlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dO2xldCByPXQuZ2V0Q29sdW1uKG4pO3JldHVybiByIT1udWxsJiZyLmNvbHVtbkRlZi5nZXRHcm91cGluZ1ZhbHVlPyhlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dPXIuY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWUoZS5vcmlnaW5hbCksZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtuXSk6ZS5nZXRWYWx1ZShuKX0sZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZT17fX0sY3JlYXRlQ2VsbDooZSx0LG4scik9PntlLmdldElzR3JvdXBlZD0oKT0+dC5nZXRJc0dyb3VwZWQoKSYmdC5pZD09PW4uZ3JvdXBpbmdDb2x1bW5JZCxlLmdldElzUGxhY2Vob2xkZXI9KCk9PiFlLmdldElzR3JvdXBlZCgpJiZ0LmdldElzR3JvdXBlZCgpLGUuZ2V0SXNBZ2dyZWdhdGVkPSgpPT57dmFyIHQ7cmV0dXJuIWUuZ2V0SXNHcm91cGVkKCkmJiFlLmdldElzUGxhY2Vob2xkZXIoKSYmISEoKHQ9bi5zdWJSb3dzKSE9bnVsbCYmdC5sZW5ndGgpfX19O2Z1bmN0aW9uIEd4KGUsdCxuKXtpZighKHQhPW51bGwmJnQubGVuZ3RoKXx8IW4pcmV0dXJuIGU7bGV0IHI9ZS5maWx0ZXIoZT0+IXQuaW5jbHVkZXMoZS5pZCkpO3JldHVybiBuPT09YHJlbW92ZWA/cjpbLi4udC5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLC4uLnJdfXZhciBLeD17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Y29sdW1uT3JkZXI6W10sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5PcmRlckNoYW5nZTp2eChgY29sdW1uT3JkZXJgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRJbmRleD1RKGU9PltyUyh0LGUpXSx0PT50LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksJCh0Lm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldEluZGV4YCkpLGUuZ2V0SXNGaXJzdENvbHVtbj1uPT5yUyh0LG4pWzBdPy5pZD09PWUuaWQsZS5nZXRJc0xhc3RDb2x1bW49bj0+e2xldCByPXJTKHQsbik7cmV0dXJuIHJbci5sZW5ndGgtMV0/LmlkPT09ZS5pZH19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtbk9yZGVyPXQ9PmUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Db2x1bW5PcmRlckNoYW5nZSh0KSxlLnJlc2V0Q29sdW1uT3JkZXI9dD0+e2Uuc2V0Q29sdW1uT3JkZXIodD9bXTplLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlcj8/W10pfSxlLl9nZXRPcmRlckNvbHVtbnNGbj1RKCgpPT5bZS5nZXRTdGF0ZSgpLmNvbHVtbk9yZGVyLGUuZ2V0U3RhdGUoKS5ncm91cGluZyxlLm9wdGlvbnMuZ3JvdXBlZENvbHVtbk1vZGVdLChlLHQsbik9PnI9PntsZXQgaT1bXTtpZighKGUhPW51bGwmJmUubGVuZ3RoKSlpPXI7ZWxzZXtsZXQgdD1bLi4uZV0sbj1bLi4ucl07Zm9yKDtuLmxlbmd0aCYmdC5sZW5ndGg7KXtsZXQgZT10LnNoaWZ0KCkscj1uLmZpbmRJbmRleCh0PT50LmlkPT09ZSk7cj4tMSYmaS5wdXNoKG4uc3BsaWNlKHIsMSlbMF0pfWk9Wy4uLmksLi4ubl19cmV0dXJuIEd4KGksdCxuKX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBfZ2V0T3JkZXJDb2x1bW5zRm5gKSl9fSxxeD0oKT0+KHtsZWZ0OltdLHJpZ2h0OltdfSksSng9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblBpbm5pbmc6cXgoKSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkNvbHVtblBpbm5pbmdDaGFuZ2U6dngoYGNvbHVtblBpbm5pbmdgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5waW49bj0+e2xldCByPWUuZ2V0TGVhZkNvbHVtbnMoKS5tYXAoZT0+ZS5pZCkuZmlsdGVyKEJvb2xlYW4pO3Quc2V0Q29sdW1uUGlubmluZyhlPT5uPT09YHJpZ2h0YD97bGVmdDooZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSxyaWdodDpbLi4uKGU/LnJpZ2h0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLC4uLnJdfTpuPT09YGxlZnRgP3tsZWZ0OlsuLi4oZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSwuLi5yXSxyaWdodDooZT8ucmlnaHQ/P1tdKS5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUpKSl9OntsZWZ0OihlPy5sZWZ0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLHJpZ2h0OihlPy5yaWdodD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+ZS5nZXRMZWFmQ29sdW1ucygpLnNvbWUoZT0+KGUuY29sdW1uRGVmLmVuYWJsZVBpbm5pbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVDb2x1bW5QaW5uaW5nPz90Lm9wdGlvbnMuZW5hYmxlUGlubmluZz8/ITApKSxlLmdldElzUGlubmVkPSgpPT57bGV0IG49ZS5nZXRMZWFmQ29sdW1ucygpLm1hcChlPT5lLmlkKSx7bGVmdDpyLHJpZ2h0Oml9PXQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLGE9bi5zb21lKGU9PnI/LmluY2x1ZGVzKGUpKSxvPW4uc29tZShlPT5pPy5pbmNsdWRlcyhlKSk7cmV0dXJuIGE/YGxlZnRgOm8/YHJpZ2h0YDohMX0sZS5nZXRQaW5uZWRJbmRleD0oKT0+e3ZhciBuO2xldCByPWUuZ2V0SXNQaW5uZWQoKTtyZXR1cm4gcj8oKG49dC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcpPT1udWxsfHwobj1uW3JdKT09bnVsbD92b2lkIDA6bi5pbmRleE9mKGUuaWQpKT8/LTE6MH19LGNyZWF0ZVJvdzooZSx0KT0+e2UuZ2V0Q2VudGVyVmlzaWJsZUNlbGxzPVEoKCk9PltlLl9nZXRBbGxWaXNpYmxlQ2VsbHMoKSx0LmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0LG4pPT57bGV0IHI9Wy4uLnQ/P1tdLC4uLm4/P1tdXTtyZXR1cm4gZS5maWx0ZXIoZT0+IXIuaW5jbHVkZXMoZS5jb2x1bW4uaWQpKX0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldENlbnRlclZpc2libGVDZWxsc2ApKSxlLmdldExlZnRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5jb2x1bW4uaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLm1hcChlPT4oey4uLmUscG9zaXRpb246YGxlZnRgfSkpLCQodC5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRMZWZ0VmlzaWJsZUNlbGxzYCkpLGUuZ2V0UmlnaHRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuY29sdW1uLmlkPT09dCkpLmZpbHRlcihCb29sZWFuKS5tYXAoZT0+KHsuLi5lLHBvc2l0aW9uOmByaWdodGB9KSksJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFJpZ2h0VmlzaWJsZUNlbGxzYCkpfSxjcmVhdGVUYWJsZTplPT57ZS5zZXRDb2x1bW5QaW5uaW5nPXQ9PmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2UodCksZS5yZXNldENvbHVtblBpbm5pbmc9dD0+ZS5zZXRDb2x1bW5QaW5uaW5nKHQ/cXgoKTplLmluaXRpYWxTdGF0ZT8uY29sdW1uUGlubmluZz8/cXgoKSksZS5nZXRJc1NvbWVDb2x1bW5zUGlubmVkPXQ9PntsZXQgbj1lLmdldFN0YXRlKCkuY29sdW1uUGlubmluZztyZXR1cm4gdD8hIW5bdF0/Lmxlbmd0aDohIShuLmxlZnQ/Lmxlbmd0aHx8bi5yaWdodD8ubGVuZ3RoKX0sZS5nZXRMZWZ0TGVhZkNvbHVtbnM9USgoKT0+W2UuZ2V0QWxsTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRMZWZ0TGVhZkNvbHVtbnNgKSksZS5nZXRSaWdodExlYWZDb2x1bW5zPVEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbiksJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldFJpZ2h0TGVhZkNvbHVtbnNgKSksZS5nZXRDZW50ZXJMZWFmQ29sdW1ucz1RKCgpPT5bZS5nZXRBbGxMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQsbik9PntsZXQgcj1bLi4udD8/W10sLi4ubj8/W11dO3JldHVybiBlLmZpbHRlcihlPT4hci5pbmNsdWRlcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRDZW50ZXJMZWFmQ29sdW1uc2ApKX19O2Z1bmN0aW9uIFl4KGUpe3JldHVybiBlfHwodHlwZW9mIGRvY3VtZW50PGB1YD9kb2N1bWVudDpudWxsKX12YXIgWHg9e3NpemU6MTUwLG1pblNpemU6MjAsbWF4U2l6ZToyKio1My0xfSxaeD0oKT0+KHtzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsaXNSZXNpemluZ0NvbHVtbjohMSxjb2x1bW5TaXppbmdTdGFydDpbXX0pLFF4PXtnZXREZWZhdWx0Q29sdW1uRGVmOigpPT5YeCxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5TaXppbmc6e30sY29sdW1uU2l6aW5nSW5mbzpaeCgpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe2NvbHVtblJlc2l6ZU1vZGU6YG9uRW5kYCxjb2x1bW5SZXNpemVEaXJlY3Rpb246YGx0cmAsb25Db2x1bW5TaXppbmdDaGFuZ2U6dngoYGNvbHVtblNpemluZ2AsZSksb25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlOnZ4KGBjb2x1bW5TaXppbmdJbmZvYCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UuZ2V0U2l6ZT0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdbZS5pZF07cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUuY29sdW1uRGVmLm1pblNpemU/P1h4Lm1pblNpemUsbj8/ZS5jb2x1bW5EZWYuc2l6ZT8/WHguc2l6ZSksZS5jb2x1bW5EZWYubWF4U2l6ZT8/WHgubWF4U2l6ZSl9LGUuZ2V0U3RhcnQ9UShlPT5bZSxyUyh0LGUpLHQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmddLCh0LG4pPT5uLnNsaWNlKDAsZS5nZXRJbmRleCh0KSkucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApLCQodC5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRTdGFydGApKSxlLmdldEFmdGVyPVEoZT0+W2UsclModCxlKSx0LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nXSwodCxuKT0+bi5zbGljZShlLmdldEluZGV4KHQpKzEpLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKSwkKHQub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgZ2V0QWZ0ZXJgKSksZS5yZXNldFNpemU9KCk9Pnt0LnNldENvbHVtblNpemluZyh0PT57bGV0e1tlLmlkXTpuLC4uLnJ9PXQ7cmV0dXJuIHJ9KX0sZS5nZXRDYW5SZXNpemU9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVSZXNpemluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtblJlc2l6aW5nPz8hMCksZS5nZXRJc1Jlc2l6aW5nPSgpPT50LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nSW5mby5pc1Jlc2l6aW5nQ29sdW1uPT09ZS5pZH0sY3JlYXRlSGVhZGVyOihlLHQpPT57ZS5nZXRTaXplPSgpPT57bGV0IHQ9MCxuPWU9PntlLnN1YkhlYWRlcnMubGVuZ3RoP2Uuc3ViSGVhZGVycy5mb3JFYWNoKG4pOnQrPWUuY29sdW1uLmdldFNpemUoKT8/MH07cmV0dXJuIG4oZSksdH0sZS5nZXRTdGFydD0oKT0+e2lmKGUuaW5kZXg+MCl7bGV0IHQ9ZS5oZWFkZXJHcm91cC5oZWFkZXJzW2UuaW5kZXgtMV07cmV0dXJuIHQuZ2V0U3RhcnQoKSt0LmdldFNpemUoKX1yZXR1cm4gMH0sZS5nZXRSZXNpemVIYW5kbGVyPW49PntsZXQgcj10LmdldENvbHVtbihlLmNvbHVtbi5pZCksaT1yPy5nZXRDYW5SZXNpemUoKTtyZXR1cm4gYT0+e2lmKCFyfHwhaXx8KGEucGVyc2lzdD09bnVsbHx8YS5wZXJzaXN0KCksdFMoYSkmJmEudG91Y2hlcyYmYS50b3VjaGVzLmxlbmd0aD4xKSlyZXR1cm47bGV0IG89ZS5nZXRTaXplKCkscz1lP2UuZ2V0TGVhZkhlYWRlcnMoKS5tYXAoZT0+W2UuY29sdW1uLmlkLGUuY29sdW1uLmdldFNpemUoKV0pOltbci5pZCxyLmdldFNpemUoKV1dLGM9dFMoYSk/TWF0aC5yb3VuZChhLnRvdWNoZXNbMF0uY2xpZW50WCk6YS5jbGllbnRYLGw9e30sdT0oZSxuKT0+e3R5cGVvZiBuPT1gbnVtYmVyYCYmKHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT57bGV0IHI9dC5vcHRpb25zLmNvbHVtblJlc2l6ZURpcmVjdGlvbj09PWBydGxgPy0xOjEsaT0obi0oZT8uc3RhcnRPZmZzZXQ/PzApKSpyLGE9TWF0aC5tYXgoaS8oZT8uc3RhcnRTaXplPz8wKSwtLjk5OTk5OSk7cmV0dXJuIGUuY29sdW1uU2l6aW5nU3RhcnQuZm9yRWFjaChlPT57bGV0W3Qsbl09ZTtsW3RdPU1hdGgucm91bmQoTWF0aC5tYXgobituKmEsMCkqMTAwKS8xMDB9KSx7Li4uZSxkZWx0YU9mZnNldDppLGRlbHRhUGVyY2VudGFnZTphfX0pLCh0Lm9wdGlvbnMuY29sdW1uUmVzaXplTW9kZT09PWBvbkNoYW5nZWB8fGU9PT1gZW5kYCkmJnQuc2V0Q29sdW1uU2l6aW5nKGU9Pih7Li4uZSwuLi5sfSkpKX0sZD1lPT51KGBtb3ZlYCxlKSxmPWU9Pnt1KGBlbmRgLGUpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsaXNSZXNpemluZ0NvbHVtbjohMSxzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsY29sdW1uU2l6aW5nU3RhcnQ6W119KSl9LHA9WXgobiksbT17bW92ZUhhbmRsZXI6ZT0+ZChlLmNsaWVudFgpLHVwSGFuZGxlcjplPT57cD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbW91c2Vtb3ZlYCxtLm1vdmVIYW5kbGVyKSxwPy5yZW1vdmVFdmVudExpc3RlbmVyKGBtb3VzZXVwYCxtLnVwSGFuZGxlciksZihlLmNsaWVudFgpfX0saD17bW92ZUhhbmRsZXI6ZT0+KGUuY2FuY2VsYWJsZSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSxkKGUudG91Y2hlc1swXS5jbGllbnRYKSwhMSksdXBIYW5kbGVyOmU9PntwPy5yZW1vdmVFdmVudExpc3RlbmVyKGB0b3VjaG1vdmVgLGgubW92ZUhhbmRsZXIpLHA/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRvdWNoZW5kYCxoLnVwSGFuZGxlciksZS5jYW5jZWxhYmxlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLGYoZS50b3VjaGVzWzBdPy5jbGllbnRYKX19LGc9ZVMoKT97cGFzc2l2ZTohMX06ITE7dFMoYSk/KHA/LmFkZEV2ZW50TGlzdGVuZXIoYHRvdWNobW92ZWAsaC5tb3ZlSGFuZGxlcixnKSxwPy5hZGRFdmVudExpc3RlbmVyKGB0b3VjaGVuZGAsaC51cEhhbmRsZXIsZykpOihwPy5hZGRFdmVudExpc3RlbmVyKGBtb3VzZW1vdmVgLG0ubW92ZUhhbmRsZXIsZykscD8uYWRkRXZlbnRMaXN0ZW5lcihgbW91c2V1cGAsbS51cEhhbmRsZXIsZykpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsc3RhcnRPZmZzZXQ6YyxzdGFydFNpemU6byxkZWx0YU9mZnNldDowLGRlbHRhUGVyY2VudGFnZTowLGNvbHVtblNpemluZ1N0YXJ0OnMsaXNSZXNpemluZ0NvbHVtbjpyLmlkfSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtblNpemluZz10PT5lLm9wdGlvbnMub25Db2x1bW5TaXppbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZSh0KSxlLnNldENvbHVtblNpemluZ0luZm89dD0+ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZSh0KSxlLnJlc2V0Q29sdW1uU2l6aW5nPXQ9PntlLnNldENvbHVtblNpemluZyh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblNpemluZz8/e30pfSxlLnJlc2V0SGVhZGVyU2l6ZUluZm89dD0+e2Uuc2V0Q29sdW1uU2l6aW5nSW5mbyh0P1p4KCk6ZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nSW5mbz8/WngoKSl9LGUuZ2V0VG90YWxTaXplPSgpPT5lLmdldEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldExlZnRUb3RhbFNpemU9KCk9PmUuZ2V0TGVmdEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldENlbnRlclRvdGFsU2l6ZT0oKT0+ZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKVswXT8uaGVhZGVycy5yZWR1Y2UoKGUsdCk9PmUrdC5nZXRTaXplKCksMCk/PzAsZS5nZXRSaWdodFRvdGFsU2l6ZT0oKT0+ZS5nZXRSaWdodEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MH19LCR4PW51bGw7ZnVuY3Rpb24gZVMoKXtpZih0eXBlb2YgJHg9PWBib29sZWFuYClyZXR1cm4gJHg7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX0sbj0oKT0+e307d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHRlc3RgLG4sdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRlc3RgLG4pfWNhdGNoe2U9ITF9cmV0dXJuICR4PWUsJHh9ZnVuY3Rpb24gdFMoZSl7cmV0dXJuIGUudHlwZT09PWB0b3VjaHN0YXJ0YH12YXIgblM9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblZpc2liaWxpdHk6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlOnZ4KGBjb2x1bW5WaXNpYmlsaXR5YCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UudG9nZ2xlVmlzaWJpbGl0eT1uPT57ZS5nZXRDYW5IaWRlKCkmJnQuc2V0Q29sdW1uVmlzaWJpbGl0eSh0PT4oey4uLnQsW2UuaWRdOm4/PyFlLmdldElzVmlzaWJsZSgpfSkpfSxlLmdldElzVmlzaWJsZT0oKT0+e2xldCBuPWUuY29sdW1ucztyZXR1cm4obi5sZW5ndGg/bi5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlKCkpOnQuZ2V0U3RhdGUoKS5jb2x1bW5WaXNpYmlsaXR5Py5bZS5pZF0pPz8hMH0sZS5nZXRDYW5IaWRlPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlSGlkaW5nPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlSGlkaW5nPz8hMCksZS5nZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlVmlzaWJpbGl0eT09bnVsbHx8ZS50b2dnbGVWaXNpYmlsaXR5KHQudGFyZ2V0LmNoZWNrZWQpfX0sY3JlYXRlUm93OihlLHQpPT57ZS5fZ2V0QWxsVmlzaWJsZUNlbGxzPVEoKCk9PltlLmdldEFsbENlbGxzKCksdC5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHldLGU9PmUuZmlsdGVyKGU9PmUuY29sdW1uLmdldElzVmlzaWJsZSgpKSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgX2dldEFsbFZpc2libGVDZWxsc2ApKSxlLmdldFZpc2libGVDZWxscz1RKCgpPT5bZS5nZXRMZWZ0VmlzaWJsZUNlbGxzKCksZS5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMoKSxlLmdldFJpZ2h0VmlzaWJsZUNlbGxzKCldLChlLHQsbik9PlsuLi5lLC4uLnQsLi4ubl0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFZpc2libGVDZWxsc2ApKX0sY3JlYXRlVGFibGU6ZT0+e2xldCB0PSh0LG4pPT5RKCgpPT5bbigpLG4oKS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGUoKSkubWFwKGU9PmUuaWQpLmpvaW4oYF9gKV0sZT0+ZS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGU9PW51bGw/dm9pZCAwOmUuZ2V0SXNWaXNpYmxlKCkpLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLHQpKTtlLmdldFZpc2libGVGbGF0Q29sdW1ucz10KGBnZXRWaXNpYmxlRmxhdENvbHVtbnNgLCgpPT5lLmdldEFsbEZsYXRDb2x1bW5zKCkpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKSksZS5nZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnNgLCgpPT5lLmdldExlZnRMZWFmQ29sdW1ucygpKSxlLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zYCwoKT0+ZS5nZXRSaWdodExlYWZDb2x1bW5zKCkpLGUuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldENlbnRlclZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMoKSksZS5zZXRDb2x1bW5WaXNpYmlsaXR5PXQ9PmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UodCksZS5yZXNldENvbHVtblZpc2liaWxpdHk9dD0+e2Uuc2V0Q29sdW1uVmlzaWJpbGl0eSh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblZpc2liaWxpdHk/P3t9KX0sZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZT10PT57dD8/PSFlLmdldElzQWxsQ29sdW1uc1Zpc2libGUoKSxlLnNldENvbHVtblZpc2liaWxpdHkoZS5nZXRBbGxMZWFmQ29sdW1ucygpLnJlZHVjZSgoZSxuKT0+KHsuLi5lLFtuLmlkXTp0fHwhKG4uZ2V0Q2FuSGlkZSE9bnVsbCYmbi5nZXRDYW5IaWRlKCkpfSkse30pKX0sZS5nZXRJc0FsbENvbHVtbnNWaXNpYmxlPSgpPT4hZS5nZXRBbGxMZWFmQ29sdW1ucygpLnNvbWUoZT0+IShlLmdldElzVmlzaWJsZSE9bnVsbCYmZS5nZXRJc1Zpc2libGUoKSkpLGUuZ2V0SXNTb21lQ29sdW1uc1Zpc2libGU9KCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKS5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlPT1udWxsP3ZvaWQgMDplLmdldElzVmlzaWJsZSgpKSxlLmdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlQWxsQ29sdW1uc1Zpc2libGUodC50YXJnZXQ/LmNoZWNrZWQpfX19O2Z1bmN0aW9uIHJTKGUsdCl7cmV0dXJuIHQ/dD09PWBjZW50ZXJgP2UuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zKCk6dD09PWBsZWZ0YD9lLmdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnMoKTplLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zKCk6ZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKX12YXIgaVM9e2NyZWF0ZVRhYmxlOmU9PntlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbChlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9KCk9PmUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw/ZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCk6ZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsKCksZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz1lLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmZS5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXMoZSxgX19nbG9iYWxfX2ApLGUuZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz0oKT0+ZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz9lLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzKCk6bmV3IE1hcCxlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPWUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzJiZlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyhlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPSgpPT57aWYoZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcylyZXR1cm4gZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcygpfX19LGFTPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtnbG9iYWxGaWx0ZXI6dm9pZCAwLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR2xvYmFsRmlsdGVyQ2hhbmdlOnZ4KGBnbG9iYWxGaWx0ZXJgLGUpLGdsb2JhbEZpbHRlckZuOmBhdXRvYCxnZXRDb2x1bW5DYW5HbG9iYWxGaWx0ZXI6dD0+e3ZhciBuO2xldCByPShuPWUuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0pPT1udWxsfHwobj1uLl9nZXRBbGxDZWxsc0J5Q29sdW1uSWQoKVt0LmlkXSk9PW51bGw/dm9pZCAwOm4uZ2V0VmFsdWUoKTtyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgfHx0eXBlb2Ygcj09YG51bWJlcmB9fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRDYW5HbG9iYWxGaWx0ZXI9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJigodC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcj09bnVsbD92b2lkIDA6dC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcihlKSk/PyEwKSYmISFlLmFjY2Vzc29yRm59LGNyZWF0ZVRhYmxlOmU9PntlLmdldEdsb2JhbEF1dG9GaWx0ZXJGbj0oKT0+enguaW5jbHVkZXNTdHJpbmcsZS5nZXRHbG9iYWxGaWx0ZXJGbj0oKT0+e2xldHtnbG9iYWxGaWx0ZXJGbjp0fT1lLm9wdGlvbnM7cmV0dXJuIHl4KHQpP3Q6dD09PWBhdXRvYD9lLmdldEdsb2JhbEF1dG9GaWx0ZXJGbigpOmUub3B0aW9ucy5maWx0ZXJGbnM/Llt0XT8/enhbdF19LGUuc2V0R2xvYmFsRmlsdGVyPXQ9PntlLm9wdGlvbnMub25HbG9iYWxGaWx0ZXJDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZSh0KX0sZS5yZXNldEdsb2JhbEZpbHRlcj10PT57ZS5zZXRHbG9iYWxGaWx0ZXIodD92b2lkIDA6ZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyKX19fSxvUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7ZXhwYW5kZWQ6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25FeHBhbmRlZENoYW5nZTp2eChgZXhwYW5kZWRgLGUpLHBhZ2luYXRlRXhwYW5kZWRSb3dzOiEwfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0RXhwYW5kZWQ9KCk9PntpZighdCl7ZS5fcXVldWUoKCk9Pnt0PSEwfSk7cmV0dXJufWlmKGUub3B0aW9ucy5hdXRvUmVzZXRBbGw/P2Uub3B0aW9ucy5hdXRvUmVzZXRFeHBhbmRlZD8/IWUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmcpe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0RXhwYW5kZWQoKSxuPSExfSl9fSxlLnNldEV4cGFuZGVkPXQ9PmUub3B0aW9ucy5vbkV4cGFuZGVkQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25FeHBhbmRlZENoYW5nZSh0KSxlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZD10PT57dD8/IWUuZ2V0SXNBbGxSb3dzRXhwYW5kZWQoKT9lLnNldEV4cGFuZGVkKCEwKTplLnNldEV4cGFuZGVkKHt9KX0sZS5yZXNldEV4cGFuZGVkPXQ9PntlLnNldEV4cGFuZGVkKHQ/e306ZS5pbml0aWFsU3RhdGU/LmV4cGFuZGVkPz97fSl9LGUuZ2V0Q2FuU29tZVJvd3NFeHBhbmQ9KCk9PmUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT5lLmdldENhbkV4cGFuZCgpKSxlLmdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZEhhbmRsZXI9KCk9PnQ9Pnt0LnBlcnNpc3Q9PW51bGx8fHQucGVyc2lzdCgpLGUudG9nZ2xlQWxsUm93c0V4cGFuZGVkKCl9LGUuZ2V0SXNTb21lUm93c0V4cGFuZGVkPSgpPT57bGV0IHQ9ZS5nZXRTdGF0ZSgpLmV4cGFuZGVkO3JldHVybiB0PT09ITB8fE9iamVjdC52YWx1ZXModCkuc29tZShCb29sZWFuKX0sZS5nZXRJc0FsbFJvd3NFeHBhbmRlZD0oKT0+e2xldCB0PWUuZ2V0U3RhdGUoKS5leHBhbmRlZDtyZXR1cm4gdHlwZW9mIHQ9PWBib29sZWFuYD90PT09ITA6ISghT2JqZWN0LmtleXModCkubGVuZ3RofHxlLmdldFJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT4hZS5nZXRJc0V4cGFuZGVkKCkpKX0sZS5nZXRFeHBhbmRlZERlcHRoPSgpPT57bGV0IHQ9MDtyZXR1cm4oZS5nZXRTdGF0ZSgpLmV4cGFuZGVkPT09ITA/T2JqZWN0LmtleXMoZS5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKTpPYmplY3Qua2V5cyhlLmdldFN0YXRlKCkuZXhwYW5kZWQpKS5mb3JFYWNoKGU9PntsZXQgbj1lLnNwbGl0KGAuYCk7dD1NYXRoLm1heCh0LG4ubGVuZ3RoKX0pLHR9LGUuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbD0oKT0+ZS5nZXRTb3J0ZWRSb3dNb2RlbCgpLGUuZ2V0RXhwYW5kZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RXhwYW5kZWRSb3dNb2RlbCYmKGUuX2dldEV4cGFuZGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEV4cGFuZGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmd8fCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsP2UuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbCgpOmUuX2dldEV4cGFuZGVkUm93TW9kZWwoKSl9LGNyZWF0ZVJvdzooZSx0KT0+e2UudG9nZ2xlRXhwYW5kZWQ9bj0+e3Quc2V0RXhwYW5kZWQocj0+e2xldCBpPXI9PT0hMHx8ISEociE9bnVsbCYmcltlLmlkXSksYT17fTtpZihyPT09ITA/T2JqZWN0LmtleXModC5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKS5mb3JFYWNoKGU9PnthW2VdPSEwfSk6YT1yLG4/Pz0haSwhaSYmbilyZXR1cm57Li4uYSxbZS5pZF06ITB9O2lmKGkmJiFuKXtsZXR7W2UuaWRdOnQsLi4ubn09YTtyZXR1cm4gbn1yZXR1cm4gcn0pfSxlLmdldElzRXhwYW5kZWQ9KCk9PntsZXQgbj10LmdldFN0YXRlKCkuZXhwYW5kZWQ7cmV0dXJuISEoKHQub3B0aW9ucy5nZXRJc1Jvd0V4cGFuZGVkPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0SXNSb3dFeHBhbmRlZChlKSk/PyhuPT09ITB8fG4/LltlLmlkXSkpfSxlLmdldENhbkV4cGFuZD0oKT0+e3ZhciBuO3JldHVybih0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kKGUpKT8/KCh0Lm9wdGlvbnMuZW5hYmxlRXhwYW5kaW5nPz8hMCkmJiEhKChuPWUuc3ViUm93cykhPW51bGwmJm4ubGVuZ3RoKSl9LGUuZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQ9KCk9PntsZXQgbj0hMCxyPWU7Zm9yKDtuJiZyLnBhcmVudElkOylyPXQuZ2V0Um93KHIucGFyZW50SWQsITApLG49ci5nZXRJc0V4cGFuZGVkKCk7cmV0dXJuIG59LGUuZ2V0VG9nZ2xlRXhwYW5kZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5FeHBhbmQoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlRXhwYW5kZWQoKX19fX0sc1M9MCxjUz0xMCxsUz0oKT0+KHtwYWdlSW5kZXg6c1MscGFnZVNpemU6Y1N9KSx1Uz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Li4uZSxwYWdpbmF0aW9uOnsuLi5sUygpLC4uLmU/LnBhZ2luYXRpb259fSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblBhZ2luYXRpb25DaGFuZ2U6dngoYHBhZ2luYXRpb25gLGUpfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0UGFnZUluZGV4PSgpPT57aWYoIXQpe2UuX3F1ZXVlKCgpPT57dD0hMH0pO3JldHVybn1pZihlLm9wdGlvbnMuYXV0b1Jlc2V0QWxsPz9lLm9wdGlvbnMuYXV0b1Jlc2V0UGFnZUluZGV4Pz8hZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb24pe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0UGFnZUluZGV4KCksbj0hMX0pfX0sZS5zZXRQYWdpbmF0aW9uPXQ9PmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2UoZT0+X3godCxlKSksZS5yZXNldFBhZ2luYXRpb249dD0+e2Uuc2V0UGFnaW5hdGlvbih0P2xTKCk6ZS5pbml0aWFsU3RhdGUucGFnaW5hdGlvbj8/bFMoKSl9LGUuc2V0UGFnZUluZGV4PXQ9PntlLnNldFBhZ2luYXRpb24obj0+e2xldCByPV94KHQsbi5wYWdlSW5kZXgpLGk9ZS5vcHRpb25zLnBhZ2VDb3VudD09PXZvaWQgMHx8ZS5vcHRpb25zLnBhZ2VDb3VudD09PS0xPzIqKjUzLTE6ZS5vcHRpb25zLnBhZ2VDb3VudC0xO3JldHVybiByPU1hdGgubWF4KDAsTWF0aC5taW4ocixpKSksey4uLm4scGFnZUluZGV4OnJ9fSl9LGUucmVzZXRQYWdlSW5kZXg9dD0+e3ZhciBuO2Uuc2V0UGFnZUluZGV4KHQ/c1M6KChuPWUuaW5pdGlhbFN0YXRlKT09bnVsbHx8KG49bi5wYWdpbmF0aW9uKT09bnVsbD92b2lkIDA6bi5wYWdlSW5kZXgpPz9zUyl9LGUucmVzZXRQYWdlU2l6ZT10PT57dmFyIG47ZS5zZXRQYWdlU2l6ZSh0P2NTOigobj1lLmluaXRpYWxTdGF0ZSk9PW51bGx8fChuPW4ucGFnaW5hdGlvbik9PW51bGw/dm9pZCAwOm4ucGFnZVNpemUpPz9jUyl9LGUuc2V0UGFnZVNpemU9dD0+e2Uuc2V0UGFnaW5hdGlvbihlPT57bGV0IG49TWF0aC5tYXgoMSxfeCh0LGUucGFnZVNpemUpKSxyPWUucGFnZVNpemUqZS5wYWdlSW5kZXgsaT1NYXRoLmZsb29yKHIvbik7cmV0dXJuey4uLmUscGFnZUluZGV4OmkscGFnZVNpemU6bn19KX0sZS5zZXRQYWdlQ291bnQ9dD0+ZS5zZXRQYWdpbmF0aW9uKG49PntsZXQgcj1feCh0LGUub3B0aW9ucy5wYWdlQ291bnQ/Py0xKTtyZXR1cm4gdHlwZW9mIHI9PWBudW1iZXJgJiYocj1NYXRoLm1heCgtMSxyKSksey4uLm4scGFnZUNvdW50OnJ9fSksZS5nZXRQYWdlT3B0aW9ucz1RKCgpPT5bZS5nZXRQYWdlQ291bnQoKV0sZT0+e2xldCB0PVtdO3JldHVybiBlJiZlPjAmJih0PVsuLi5BcnJheShlKV0uZmlsbChudWxsKS5tYXAoKGUsdCk9PnQpKSx0fSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFBhZ2VPcHRpb25zYCkpLGUuZ2V0Q2FuUHJldmlvdXNQYWdlPSgpPT5lLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlSW5kZXg+MCxlLmdldENhbk5leHRQYWdlPSgpPT57bGV0e3BhZ2VJbmRleDp0fT1lLmdldFN0YXRlKCkucGFnaW5hdGlvbixuPWUuZ2V0UGFnZUNvdW50KCk7cmV0dXJuIG49PT0tMXx8biE9PTAmJnQ8bi0xfSxlLnByZXZpb3VzUGFnZT0oKT0+ZS5zZXRQYWdlSW5kZXgoZT0+ZS0xKSxlLm5leHRQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlPT5lKzEpLGUuZmlyc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleCgwKSxlLmxhc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlLmdldFBhZ2VDb3VudCgpLTEpLGUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsPSgpPT5lLmdldEV4cGFuZGVkUm93TW9kZWwoKSxlLmdldFBhZ2luYXRpb25Sb3dNb2RlbD0oKT0+KCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwmJmUub3B0aW9ucy5nZXRQYWdpbmF0aW9uUm93TW9kZWwmJihlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw9ZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb258fCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKTplLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwoKSksZS5nZXRQYWdlQ291bnQ9KCk9PmUub3B0aW9ucy5wYWdlQ291bnQ/P01hdGguY2VpbChlLmdldFJvd0NvdW50KCkvZS5nZXRTdGF0ZSgpLnBhZ2luYXRpb24ucGFnZVNpemUpLGUuZ2V0Um93Q291bnQ9KCk9PmUub3B0aW9ucy5yb3dDb3VudD8/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKS5yb3dzLmxlbmd0aH19LGRTPSgpPT4oe3RvcDpbXSxib3R0b206W119KSxmUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7cm93UGlubmluZzpkUygpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uUm93UGlubmluZ0NoYW5nZTp2eChgcm93UGlubmluZ2AsZSl9KSxjcmVhdGVSb3c6KGUsdCk9PntlLnBpbj0obixyLGkpPT57bGV0IGE9cj9lLmdldExlYWZSb3dzKCkubWFwKGU9PntsZXR7aWQ6dH09ZTtyZXR1cm4gdH0pOltdLG89aT9lLmdldFBhcmVudFJvd3MoKS5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSk6W10scz1uZXcgU2V0KFsuLi5vLGUuaWQsLi4uYV0pO3Quc2V0Um93UGlubmluZyhlPT5uPT09YGJvdHRvbWA/e3RvcDooZT8udG9wPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKSxib3R0b206Wy4uLihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLC4uLkFycmF5LmZyb20ocyldfTpuPT09YHRvcGA/e3RvcDpbLi4uKGU/LnRvcD8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSksLi4uQXJyYXkuZnJvbShzKV0sYm90dG9tOihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpfTp7dG9wOihlPy50b3A/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLGJvdHRvbTooZT8uYm90dG9tPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+e2xldHtlbmFibGVSb3dQaW5uaW5nOm4sZW5hYmxlUGlubmluZzpyfT10Lm9wdGlvbnM7cmV0dXJuIHR5cGVvZiBuPT1gZnVuY3Rpb25gP24oZSk6bj8/cj8/ITB9LGUuZ2V0SXNQaW5uZWQ9KCk9PntsZXQgbj1bZS5pZF0se3RvcDpyLGJvdHRvbTppfT10LmdldFN0YXRlKCkucm93UGlubmluZyxhPW4uc29tZShlPT5yPy5pbmNsdWRlcyhlKSksbz1uLnNvbWUoZT0+aT8uaW5jbHVkZXMoZSkpO3JldHVybiBhP2B0b3BgOm8/YGJvdHRvbWA6ITF9LGUuZ2V0UGlubmVkSW5kZXg9KCk9PntsZXQgbj1lLmdldElzUGlubmVkKCk7cmV0dXJuIG4/KChuPT09YHRvcGA/dC5nZXRUb3BSb3dzKCk6dC5nZXRCb3R0b21Sb3dzKCkpPy5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSkpPy5pbmRleE9mKGUuaWQpPz8tMTotMX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFJvd1Bpbm5pbmc9dD0+ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZSh0KSxlLnJlc2V0Um93UGlubmluZz10PT5lLnNldFJvd1Bpbm5pbmcodD9kUygpOmUuaW5pdGlhbFN0YXRlPy5yb3dQaW5uaW5nPz9kUygpKSxlLmdldElzU29tZVJvd3NQaW5uZWQ9dD0+e2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nO3JldHVybiB0PyEhblt0XT8ubGVuZ3RoOiEhKG4udG9wPy5sZW5ndGh8fG4uYm90dG9tPy5sZW5ndGgpfSxlLl9nZXRQaW5uZWRSb3dzPSh0LG4scik9PihlLm9wdGlvbnMua2VlcFBpbm5lZFJvd3M/PyEwPyhuPz9bXSkubWFwKHQ9PntsZXQgbj1lLmdldFJvdyh0LCEwKTtyZXR1cm4gbi5nZXRJc0FsbFBhcmVudHNFeHBhbmRlZCgpP246bnVsbH0pOihuPz9bXSkubWFwKGU9PnQuZmluZCh0PT50LmlkPT09ZSkpKS5maWx0ZXIoQm9vbGVhbikubWFwKGU9Pih7Li4uZSxwb3NpdGlvbjpyfSkpLGUuZ2V0VG9wUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYHRvcGApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRUb3BSb3dzYCkpLGUuZ2V0Qm90dG9tUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcuYm90dG9tXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYGJvdHRvbWApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRCb3R0b21Sb3dzYCkpLGUuZ2V0Q2VudGVyUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wLGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLmJvdHRvbV0sKGUsdCxuKT0+e2xldCByPW5ldyBTZXQoWy4uLnQ/P1tdLC4uLm4/P1tdXSk7cmV0dXJuIGUuZmlsdGVyKGU9PiFyLmhhcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRDZW50ZXJSb3dzYCkpfX0scFM9e2dldEluaXRpYWxTdGF0ZTplPT4oe3Jvd1NlbGVjdGlvbjp7fSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblJvd1NlbGVjdGlvbkNoYW5nZTp2eChgcm93U2VsZWN0aW9uYCxlKSxlbmFibGVSb3dTZWxlY3Rpb246ITAsZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb246ITAsZW5hYmxlU3ViUm93U2VsZWN0aW9uOiEwfSksY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Um93U2VsZWN0aW9uPXQ9PmUub3B0aW9ucy5vblJvd1NlbGVjdGlvbkNoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93U2VsZWN0aW9uQ2hhbmdlKHQpLGUucmVzZXRSb3dTZWxlY3Rpb249dD0+ZS5zZXRSb3dTZWxlY3Rpb24odD97fTplLmluaXRpYWxTdGF0ZS5yb3dTZWxlY3Rpb24/P3t9KSxlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZD10PT57ZS5zZXRSb3dTZWxlY3Rpb24obj0+e3Q9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFJvd3NTZWxlY3RlZCgpOnQ7bGV0IHI9ey4uLm59LGk9ZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4gdD9pLmZvckVhY2goZT0+e2UuZ2V0Q2FuU2VsZWN0KCkmJihyW2UuaWRdPSEwKX0pOmkuZm9yRWFjaChlPT57ZGVsZXRlIHJbZS5pZF19KSxyfSl9LGUudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZD10PT5lLnNldFJvd1NlbGVjdGlvbihuPT57bGV0IHI9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKTp0LGk9ey4uLm59O3JldHVybiBlLmdldFJvd01vZGVsKCkucm93cy5mb3JFYWNoKHQ9PnttUyhpLHQuaWQsciwhMCxlKX0pLGl9KSxlLmdldFByZVNlbGVjdGVkUm93TW9kZWw9KCk9PmUuZ2V0Q29yZVJvd01vZGVsKCksZS5nZXRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0Q29yZVJvd01vZGVsKCldLCh0LG4pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg/aFMoZSxuKTp7cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWw9USgoKT0+W2UuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24sZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWxgKSksZS5nZXRJc0FsbFJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISEodC5sZW5ndGgmJk9iamVjdC5rZXlzKG4pLmxlbmd0aCk7cmV0dXJuIHImJnQuc29tZShlPT5lLmdldENhblNlbGVjdCgpJiYhbltlLmlkXSkmJihyPSExKSxyfSxlLmdldElzQWxsUGFnZVJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0UGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3MuZmlsdGVyKGU9PmUuZ2V0Q2FuU2VsZWN0KCkpLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISF0Lmxlbmd0aDtyZXR1cm4gciYmdC5zb21lKGU9PiFuW2UuaWRdKSYmKHI9ITEpLHJ9LGUuZ2V0SXNTb21lUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9T2JqZWN0LmtleXMoZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbj8/e30pLmxlbmd0aDtyZXR1cm4gdD4wJiZ0PGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLmxlbmd0aH0sZS5nZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9ZS5nZXRQYWdpbmF0aW9uUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKSYmdC5maWx0ZXIoZT0+ZS5nZXRDYW5TZWxlY3QoKSkuc29tZShlPT5lLmdldElzU2VsZWN0ZWQoKXx8ZS5nZXRJc1NvbWVTZWxlY3RlZCgpKX0sZS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyPSgpPT50PT57ZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9LGUuZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZEhhbmRsZXI9KCk9PnQ9PntlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLnRvZ2dsZVNlbGVjdGVkPShuLHIpPT57bGV0IGk9ZS5nZXRJc1NlbGVjdGVkKCk7dC5zZXRSb3dTZWxlY3Rpb24oYT0+e2lmKG49bj09PXZvaWQgMD8haTpuLGUuZ2V0Q2FuU2VsZWN0KCkmJmk9PT1uKXJldHVybiBhO2xldCBvPXsuLi5hfTtyZXR1cm4gbVMobyxlLmlkLG4scj8uc2VsZWN0Q2hpbGRyZW4/PyEwLHQpLG99KX0sZS5nZXRJc1NlbGVjdGVkPSgpPT57bGV0e3Jvd1NlbGVjdGlvbjpufT10LmdldFN0YXRlKCk7cmV0dXJuIGdTKGUsbil9LGUuZ2V0SXNTb21lU2VsZWN0ZWQ9KCk9PntsZXR7cm93U2VsZWN0aW9uOm59PXQuZ2V0U3RhdGUoKTtyZXR1cm4gX1MoZSxuKT09PWBzb21lYH0sZS5nZXRJc0FsbFN1YlJvd3NTZWxlY3RlZD0oKT0+e2xldHtyb3dTZWxlY3Rpb246bn09dC5nZXRTdGF0ZSgpO3JldHVybiBfUyhlLG4pPT09YGFsbGB9LGUuZ2V0Q2FuU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbj09YGZ1bmN0aW9uYD90Lm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKGUpOnQub3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0Q2FuU2VsZWN0U3ViUm93cz0oKT0+dHlwZW9mIHQub3B0aW9ucy5lbmFibGVTdWJSb3dTZWxlY3Rpb249PWBmdW5jdGlvbmA/dC5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uPz8hMCxlLmdldENhbk11bHRpU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uPT1gZnVuY3Rpb25gP3Qub3B0aW9ucy5lbmFibGVNdWx0aVJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0VG9nZ2xlU2VsZWN0ZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5TZWxlY3QoKTtyZXR1cm4gbj0+e3QmJmUudG9nZ2xlU2VsZWN0ZWQobi50YXJnZXQ/LmNoZWNrZWQpfX19fSxtUz0oZSx0LG4scixpKT0+e3ZhciBhO2xldCBvPWkuZ2V0Um93KHQsITApO24/KG8uZ2V0Q2FuTXVsdGlTZWxlY3QoKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCh0PT5kZWxldGUgZVt0XSksby5nZXRDYW5TZWxlY3QoKSYmKGVbdF09ITApKTpkZWxldGUgZVt0XSxyJiYoYT1vLnN1YlJvd3MpIT1udWxsJiZhLmxlbmd0aCYmby5nZXRDYW5TZWxlY3RTdWJSb3dzKCkmJm8uc3ViUm93cy5mb3JFYWNoKHQ9Pm1TKGUsdC5pZCxuLHIsaSkpfTtmdW5jdGlvbiBoUyhlLHQpe2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24scj1bXSxpPXt9LGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoZT0+e3ZhciB0O2xldCBvPWdTKGUsbik7aWYobyYmKHIucHVzaChlKSxpW2UuaWRdPWUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZT17Li4uZSxzdWJSb3dzOmEoZS5zdWJSb3dzKX0pLG8pcmV0dXJuIGV9KS5maWx0ZXIoQm9vbGVhbil9O3JldHVybntyb3dzOmEodC5yb3dzKSxmbGF0Um93czpyLHJvd3NCeUlkOml9fWZ1bmN0aW9uIGdTKGUsdCl7cmV0dXJuIHRbZS5pZF0/PyExfWZ1bmN0aW9uIF9TKGUsdCxuKXt2YXIgcjtpZighKChyPWUuc3ViUm93cykhPW51bGwmJnIubGVuZ3RoKSlyZXR1cm4hMTtsZXQgaT0hMCxhPSExO3JldHVybiBlLnN1YlJvd3MuZm9yRWFjaChlPT57aWYoIShhJiYhaSkmJihlLmdldENhblNlbGVjdCgpJiYoZ1MoZSx0KT9hPSEwOmk9ITEpLGUuc3ViUm93cyYmZS5zdWJSb3dzLmxlbmd0aCkpe2xldCBuPV9TKGUsdCk7bj09PWBhbGxgP2E9ITA6KG49PT1gc29tZWAmJihhPSEwKSxpPSExKX19KSxpP2BhbGxgOmE/YHNvbWVgOiExfXZhciB2Uz0vKFswLTldKykvZ20seVM9KGUsdCxuKT0+RFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxiUz0oZSx0LG4pPT5EUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSkseFM9KGUsdCxuKT0+VFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxTUz0oZSx0LG4pPT5UUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSksQ1M9KGUsdCxuKT0+e2xldCByPWUuZ2V0VmFsdWUobiksaT10LmdldFZhbHVlKG4pO3JldHVybiByPmk/MTpyPGk/LTE6MH0sd1M9KGUsdCxuKT0+VFMoZS5nZXRWYWx1ZShuKSx0LmdldFZhbHVlKG4pKTtmdW5jdGlvbiBUUyhlLHQpe3JldHVybiBlPT09dD8wOmU+dD8xOi0xfWZ1bmN0aW9uIEVTKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmA/aXNOYU4oZSl8fGU9PT0xLzB8fGU9PT0tMS8wP2BgOlN0cmluZyhlKTp0eXBlb2YgZT09YHN0cmluZ2A/ZTpgYH1mdW5jdGlvbiBEUyhlLHQpe2xldCBuPWUuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKSxyPXQuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKTtmb3IoO24ubGVuZ3RoJiZyLmxlbmd0aDspe2xldCBlPW4uc2hpZnQoKSx0PXIuc2hpZnQoKSxpPXBhcnNlSW50KGUsMTApLGE9cGFyc2VJbnQodCwxMCksbz1baSxhXS5zb3J0KCk7aWYoaXNOYU4ob1swXSkpe2lmKGU+dClyZXR1cm4gMTtpZih0PmUpcmV0dXJuLTE7Y29udGludWV9aWYoaXNOYU4ob1sxXSkpcmV0dXJuIGlzTmFOKGkpPy0xOjE7aWYoaT5hKXJldHVybiAxO2lmKGE+aSlyZXR1cm4tMX1yZXR1cm4gbi5sZW5ndGgtci5sZW5ndGh9dmFyIE9TPXthbHBoYW51bWVyaWM6eVMsYWxwaGFudW1lcmljQ2FzZVNlbnNpdGl2ZTpiUyx0ZXh0OnhTLHRleHRDYXNlU2Vuc2l0aXZlOlNTLGRhdGV0aW1lOkNTLGJhc2ljOndTfSxrUz1bRXgsblMsS3gsSngsa3gsVngsaVMsYVMse2dldEluaXRpYWxTdGF0ZTplPT4oe3NvcnRpbmc6W10sLi4uZX0pLGdldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7c29ydGluZ0ZuOmBhdXRvYCxzb3J0VW5kZWZpbmVkOjF9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uU29ydGluZ0NoYW5nZTp2eChgc29ydGluZ2AsZSksaXNNdWx0aVNvcnRFdmVudDplPT5lLnNoaWZ0S2V5fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRBdXRvU29ydGluZ0ZuPSgpPT57bGV0IG49dC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Muc2xpY2UoMTApLHI9ITE7Zm9yKGxldCB0IG9mIG4pe2xldCBuPXQ/LmdldFZhbHVlKGUuaWQpO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PWBbb2JqZWN0IERhdGVdYClyZXR1cm4gT1MuZGF0ZXRpbWU7aWYodHlwZW9mIG49PWBzdHJpbmdgJiYocj0hMCxuLnNwbGl0KHZTKS5sZW5ndGg+MSkpcmV0dXJuIE9TLmFscGhhbnVtZXJpY31yZXR1cm4gcj9PUy50ZXh0Ok9TLmJhc2ljfSxlLmdldEF1dG9Tb3J0RGlyPSgpPT50eXBlb2YgdC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpPT1gc3RyaW5nYD9gYXNjYDpgZGVzY2AsZS5nZXRTb3J0aW5nRm49KCk9PntpZighZSl0aHJvdyBFcnJvcigpO3JldHVybiB5eChlLmNvbHVtbkRlZi5zb3J0aW5nRm4pP2UuY29sdW1uRGVmLnNvcnRpbmdGbjplLmNvbHVtbkRlZi5zb3J0aW5nRm49PT1gYXV0b2A/ZS5nZXRBdXRvU29ydGluZ0ZuKCk6dC5vcHRpb25zLnNvcnRpbmdGbnM/LltlLmNvbHVtbkRlZi5zb3J0aW5nRm5dPz9PU1tlLmNvbHVtbkRlZi5zb3J0aW5nRm5dfSxlLnRvZ2dsZVNvcnRpbmc9KG4scik9PntsZXQgaT1lLmdldE5leHRTb3J0aW5nT3JkZXIoKSxhPW4hPW51bGw7dC5zZXRTb3J0aW5nKG89PntsZXQgcz1vPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxjPW8/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksbD1bXSx1LGQ9YT9uOmk9PT1gZGVzY2A7cmV0dXJuIHU9byE9bnVsbCYmby5sZW5ndGgmJmUuZ2V0Q2FuTXVsdGlTb3J0KCkmJnI/cz9gdG9nZ2xlYDpgYWRkYDpvIT1udWxsJiZvLmxlbmd0aCYmYyE9PW8ubGVuZ3RoLTE/YHJlcGxhY2VgOnM/YHRvZ2dsZWA6YHJlcGxhY2VgLHU9PT1gdG9nZ2xlYCYmKGF8fGl8fCh1PWByZW1vdmVgKSksdT09PWBhZGRgPyhsPVsuLi5vLHtpZDplLmlkLGRlc2M6ZH1dLGwuc3BsaWNlKDAsbC5sZW5ndGgtKHQub3B0aW9ucy5tYXhNdWx0aVNvcnRDb2xDb3VudD8/MioqNTMtMSkpKTpsPXU9PT1gdG9nZ2xlYD9vLm1hcCh0PT50LmlkPT09ZS5pZD97Li4udCxkZXNjOmR9OnQpOnU9PT1gcmVtb3ZlYD9vLmZpbHRlcih0PT50LmlkIT09ZS5pZCk6W3tpZDplLmlkLGRlc2M6ZH1dLGx9KX0sZS5nZXRGaXJzdFNvcnREaXI9KCk9PmUuY29sdW1uRGVmLnNvcnREZXNjRmlyc3Q/P3Qub3B0aW9ucy5zb3J0RGVzY0ZpcnN0Pz9lLmdldEF1dG9Tb3J0RGlyKCk9PT1gZGVzY2A/YGRlc2NgOmBhc2NgLGUuZ2V0TmV4dFNvcnRpbmdPcmRlcj1uPT57bGV0IHI9ZS5nZXRGaXJzdFNvcnREaXIoKSxpPWUuZ2V0SXNTb3J0ZWQoKTtyZXR1cm4gaT9pIT09ciYmKHQub3B0aW9ucy5lbmFibGVTb3J0aW5nUmVtb3ZhbD8/ITApJiYoIW58fCh0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSZW1vdmU/PyEwKSk/ITE6aT09PWBkZXNjYD9gYXNjYDpgZGVzY2A6cn0sZS5nZXRDYW5Tb3J0PSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlU29ydGluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZVNvcnRpbmc/PyEwKSYmISFlLmFjY2Vzc29yRm4sZS5nZXRDYW5NdWx0aVNvcnQ9KCk9PmUuY29sdW1uRGVmLmVuYWJsZU11bHRpU29ydD8/dC5vcHRpb25zLmVuYWJsZU11bHRpU29ydD8/ISFlLmFjY2Vzc29yRm4sZS5nZXRJc1NvcnRlZD0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5zb3J0aW5nPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKTtyZXR1cm4gbj9uLmRlc2M/YGRlc2NgOmBhc2NgOiExfSxlLmdldFNvcnRJbmRleD0oKT0+dC5nZXRTdGF0ZSgpLnNvcnRpbmc/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCk/Py0xLGUuY2xlYXJTb3J0aW5nPSgpPT57dC5zZXRTb3J0aW5nKHQ9PnQhPW51bGwmJnQubGVuZ3RoP3QuZmlsdGVyKHQ9PnQuaWQhPT1lLmlkKTpbXSl9LGUuZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXI9KCk9PntsZXQgbj1lLmdldENhblNvcnQoKTtyZXR1cm4gcj0+e24mJihyLnBlcnNpc3Q9PW51bGx8fHIucGVyc2lzdCgpLGUudG9nZ2xlU29ydGluZz09bnVsbHx8ZS50b2dnbGVTb3J0aW5nKHZvaWQgMCxlLmdldENhbk11bHRpU29ydCgpP3Qub3B0aW9ucy5pc011bHRpU29ydEV2ZW50PT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuaXNNdWx0aVNvcnRFdmVudChyKTohMSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFNvcnRpbmc9dD0+ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZSh0KSxlLnJlc2V0U29ydGluZz10PT57ZS5zZXRTb3J0aW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/LnNvcnRpbmc/P1tdKX0sZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbD0oKT0+ZS5nZXRHcm91cGVkUm93TW9kZWwoKSxlLmdldFNvcnRlZFJvd01vZGVsPSgpPT4oIWUuX2dldFNvcnRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwmJihlLl9nZXRTb3J0ZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxTb3J0aW5nfHwhZS5fZ2V0U29ydGVkUm93TW9kZWw/ZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCgpOmUuX2dldFNvcnRlZFJvd01vZGVsKCkpfX0sV3gsb1MsdVMsZlMscFMsUXhdO2Z1bmN0aW9uIEFTKGUpe2xldCB0PVsuLi5rUywuLi5lLl9mZWF0dXJlcz8/W11dLG49e19mZWF0dXJlczp0fSxyPW4uX2ZlYXR1cmVzLnJlZHVjZSgoZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQuZ2V0RGVmYXVsdE9wdGlvbnM9PW51bGw/dm9pZCAwOnQuZ2V0RGVmYXVsdE9wdGlvbnMobikpLHt9KSxpPWU9Pm4ub3B0aW9ucy5tZXJnZU9wdGlvbnM/bi5vcHRpb25zLm1lcmdlT3B0aW9ucyhyLGUpOnsuLi5yLC4uLmV9LGE9ey4uLmUuaW5pdGlhbFN0YXRlPz97fX07bi5fZmVhdHVyZXMuZm9yRWFjaChlPT57YT0oZS5nZXRJbml0aWFsU3RhdGU9PW51bGw/dm9pZCAwOmUuZ2V0SW5pdGlhbFN0YXRlKGEpKT8/YX0pO2xldCBvPVtdLHM9ITEsYz17X2ZlYXR1cmVzOnQsb3B0aW9uczp7Li4uciwuLi5lfSxpbml0aWFsU3RhdGU6YSxfcXVldWU6ZT0+e28ucHVzaChlKSxzfHwocz0hMCxQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57Zm9yKDtvLmxlbmd0aDspby5zaGlmdCgpKCk7cz0hMX0pLmNhdGNoKGU9PnNldFRpbWVvdXQoKCk9Pnt0aHJvdyBlfSkpKX0scmVzZXQ6KCk9PntuLnNldFN0YXRlKG4uaW5pdGlhbFN0YXRlKX0sc2V0T3B0aW9uczplPT57bGV0IHQ9X3goZSxuLm9wdGlvbnMpO24ub3B0aW9ucz1pKHQpfSxnZXRTdGF0ZTooKT0+bi5vcHRpb25zLnN0YXRlLHNldFN0YXRlOmU9PntuLm9wdGlvbnMub25TdGF0ZUNoYW5nZT09bnVsbHx8bi5vcHRpb25zLm9uU3RhdGVDaGFuZ2UoZSl9LF9nZXRSb3dJZDooZSx0LHIpPT4obi5vcHRpb25zLmdldFJvd0lkPT1udWxsP3ZvaWQgMDpuLm9wdGlvbnMuZ2V0Um93SWQoZSx0LHIpKT8/YCR7cj9bci5pZCx0XS5qb2luKGAuYCk6dH1gLGdldENvcmVSb3dNb2RlbDooKT0+KG4uX2dldENvcmVSb3dNb2RlbHx8PW4ub3B0aW9ucy5nZXRDb3JlUm93TW9kZWwobiksbi5fZ2V0Q29yZVJvd01vZGVsKCkpLGdldFJvd01vZGVsOigpPT5uLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpLGdldFJvdzooZSx0KT0+e2xldCByPSh0P24uZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCk6bi5nZXRSb3dNb2RlbCgpKS5yb3dzQnlJZFtlXTtpZighciYmKHI9bi5nZXRDb3JlUm93TW9kZWwoKS5yb3dzQnlJZFtlXSwhcikpdGhyb3cgRXJyb3IoKTtyZXR1cm4gcn0sX2dldERlZmF1bHRDb2x1bW5EZWY6USgoKT0+W24ub3B0aW9ucy5kZWZhdWx0Q29sdW1uXSxlPT4oZT8/PXt9LHtoZWFkZXI6ZT0+e2xldCB0PWUuaGVhZGVyLmNvbHVtbi5jb2x1bW5EZWY7cmV0dXJuIHQuYWNjZXNzb3JLZXk/dC5hY2Nlc3NvcktleTp0LmFjY2Vzc29yRm4/dC5pZDpudWxsfSxjZWxsOmU9Pnt2YXIgdDtyZXR1cm4oKHQ9ZS5yZW5kZXJWYWx1ZSgpKT09bnVsbHx8dC50b1N0cmluZz09bnVsbD92b2lkIDA6dC50b1N0cmluZygpKT8/bnVsbH0sLi4ubi5fZmVhdHVyZXMucmVkdWNlKChlLHQpPT5PYmplY3QuYXNzaWduKGUsdC5nZXREZWZhdWx0Q29sdW1uRGVmPT1udWxsP3ZvaWQgMDp0LmdldERlZmF1bHRDb2x1bW5EZWYoKSkse30pLC4uLmV9KSwkKGUsYGRlYnVnQ29sdW1uc2AsYF9nZXREZWZhdWx0Q29sdW1uRGVmYCkpLF9nZXRDb2x1bW5EZWZzOigpPT5uLm9wdGlvbnMuY29sdW1ucyxnZXRBbGxDb2x1bW5zOlEoKCk9PltuLl9nZXRDb2x1bW5EZWZzKCldLGU9PntsZXQgdD1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIGk9PT12b2lkIDAmJihpPTApLGUubWFwKGU9PntsZXQgYT1DeChuLGUsaSxyKSxvPWU7cmV0dXJuIGEuY29sdW1ucz1vLmNvbHVtbnM/dChvLmNvbHVtbnMsYSxpKzEpOltdLGF9KX07cmV0dXJuIHQoZSl9LCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsQ29sdW1uc2ApKSxnZXRBbGxGbGF0Q29sdW1uczpRKCgpPT5bbi5nZXRBbGxDb2x1bW5zKCldLGU9PmUuZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpLCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsRmxhdENvbHVtbnNgKSksX2dldEFsbEZsYXRDb2x1bW5zQnlJZDpRKCgpPT5bbi5nZXRBbGxGbGF0Q29sdW1ucygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5pZF09dCxlKSx7fSksJChlLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBbGxGbGF0Q29sdW1uc0J5SWRgKSksZ2V0QWxsTGVhZkNvbHVtbnM6USgoKT0+W24uZ2V0QWxsQ29sdW1ucygpLG4uX2dldE9yZGVyQ29sdW1uc0ZuKCldLChlLHQpPT50KGUuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKSwkKGUsYGRlYnVnQ29sdW1uc2AsYGdldEFsbExlYWZDb2x1bW5zYCkpLGdldENvbHVtbjplPT5uLl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQoKVtlXX07T2JqZWN0LmFzc2lnbihuLGMpO2ZvcihsZXQgZT0wO2U8bi5fZmVhdHVyZXMubGVuZ3RoO2UrKyl7bGV0IHQ9bi5fZmVhdHVyZXNbZV07dD09bnVsbHx8dC5jcmVhdGVUYWJsZT09bnVsbHx8dC5jcmVhdGVUYWJsZShuKX1yZXR1cm4gbn1mdW5jdGlvbiBqUygpe3JldHVybiBlPT5RKCgpPT5bZS5vcHRpb25zLmRhdGFdLHQ9PntsZXQgbj17cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0scj1mdW5jdGlvbih0LGksYSl7aT09PXZvaWQgMCYmKGk9MCk7bGV0IG89W107Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2xldCBsPU94KGUsZS5fZ2V0Um93SWQodFtjXSxjLGEpLHRbY10sYyxpLHZvaWQgMCxhPy5pZCk7aWYobi5mbGF0Um93cy5wdXNoKGwpLG4ucm93c0J5SWRbbC5pZF09bCxvLnB1c2gobCksZS5vcHRpb25zLmdldFN1YlJvd3Mpe3ZhciBzO2wub3JpZ2luYWxTdWJSb3dzPWUub3B0aW9ucy5nZXRTdWJSb3dzKHRbY10sYyksKHM9bC5vcmlnaW5hbFN1YlJvd3MpIT1udWxsJiZzLmxlbmd0aCYmKGwuc3ViUm93cz1yKGwub3JpZ2luYWxTdWJSb3dzLGkrMSxsKSl9fXJldHVybiBvfTtyZXR1cm4gbi5yb3dzPXIodCksbn0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTVMoKXtyZXR1cm4gZT0+USgoKT0+W2UuZ2V0U3RhdGUoKS5zb3J0aW5nLGUuZ2V0UHJlU29ydGVkUm93TW9kZWwoKV0sKHQsbik9PntpZighbi5yb3dzLmxlbmd0aHx8ISh0IT1udWxsJiZ0Lmxlbmd0aCkpcmV0dXJuIG47bGV0IHI9ZS5nZXRTdGF0ZSgpLnNvcnRpbmcsaT1bXSxhPXIuZmlsdGVyKHQ9PmUuZ2V0Q29sdW1uKHQuaWQpPy5nZXRDYW5Tb3J0KCkpLG89e307YS5mb3JFYWNoKHQ9PntsZXQgbj1lLmdldENvbHVtbih0LmlkKTtuJiYob1t0LmlkXT17c29ydFVuZGVmaW5lZDpuLmNvbHVtbkRlZi5zb3J0VW5kZWZpbmVkLGludmVydFNvcnRpbmc6bi5jb2x1bW5EZWYuaW52ZXJ0U29ydGluZyxzb3J0aW5nRm46bi5nZXRTb3J0aW5nRm4oKX0pfSk7bGV0IHM9ZT0+e2xldCB0PWUubWFwKGU9Pih7Li4uZX0pKTtyZXR1cm4gdC5zb3J0KChlLHQpPT57Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKz0xKXtsZXQgcj1hW25dLGk9b1tyLmlkXSxzPWkuc29ydFVuZGVmaW5lZCxjPXI/LmRlc2M/PyExLGw9MDtpZihzKXtsZXQgbj1lLmdldFZhbHVlKHIuaWQpLGk9dC5nZXRWYWx1ZShyLmlkKSxhPW49PT12b2lkIDAsbz1pPT09dm9pZCAwO2lmKGF8fG8pe2lmKHM9PT1gZmlyc3RgKXJldHVybiBhPy0xOjE7aWYocz09PWBsYXN0YClyZXR1cm4gYT8xOi0xO2w9YSYmbz8wOmE/czotc319aWYobD09PTAmJihsPWkuc29ydGluZ0ZuKGUsdCxyLmlkKSksbCE9PTApcmV0dXJuIGMmJihsKj0tMSksaS5pbnZlcnRTb3J0aW5nJiYobCo9LTEpLGx9cmV0dXJuIGUuaW5kZXgtdC5pbmRleH0pLHQuZm9yRWFjaChlPT57dmFyIHQ7aS5wdXNoKGUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZS5zdWJSb3dzPXMoZS5zdWJSb3dzKSl9KSx0fTtyZXR1cm57cm93czpzKG4ucm93cyksZmxhdFJvd3M6aSxyb3dzQnlJZDpuLnJvd3NCeUlkfX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTb3J0ZWRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTlMoKXtyZXR1cm4hMH12YXIgUFM9U3ltYm9sKGBtZXJnZS1wcm94eWApLEZTPXtnZXQoZSx0LG4pe3JldHVybiB0PT09UFM/bjplLmdldCh0KX0saGFzKGUsdCl7cmV0dXJuIGUuaGFzKHQpfSxzZXQ6TlMsZGVsZXRlUHJvcGVydHk6TlMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJue2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiBlLmdldCh0KX0sc2V0Ok5TLGRlbGV0ZVByb3BlcnR5Ok5TfX0sb3duS2V5cyhlKXtyZXR1cm4gZS5rZXlzKCl9fTtmdW5jdGlvbiBJUyhlKXtyZXR1cm5gdmFsdWVgaW4gZT9lLnZhbHVlOmV9ZnVuY3Rpb24gTFMoKXt2YXIgZT1bLi4uYXJndW1lbnRzXTtyZXR1cm4gbmV3IFByb3h5KHtnZXQodCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCByPUlTKGVbbl0pW3RdO2lmKHIhPT12b2lkIDApcmV0dXJuIHJ9fSxoYXModCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0paWYodCBpbiBJUyhlW25dKSlyZXR1cm4hMDtyZXR1cm4hMX0sa2V5cygpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCguLi5PYmplY3Qua2V5cyhJUyhlW25dKSkpO3JldHVyblsuLi5BcnJheS5mcm9tKG5ldyBTZXQodCkpXX19LEZTKX12YXIgUlM9Rih7cHJvcHM6W2ByZW5kZXJgLGBwcm9wc2BdLHNldHVwOmU9PigpPT50eXBlb2YgZS5yZW5kZXI9PWBmdW5jdGlvbmB8fHR5cGVvZiBlLnJlbmRlcj09YG9iamVjdGA/RyhlLnJlbmRlcixlLnByb3BzKTplLnJlbmRlcn0pO2Z1bmN0aW9uIHpTKGUpe3JldHVybiBMUyhlLHtkYXRhOk4oZS5kYXRhKX0pfWZ1bmN0aW9uIEJTKGUpe2xldCB0PWooZS5kYXRhKSxuPUFTKExTKHtzdGF0ZTp7fSxvblN0YXRlQ2hhbmdlOigpPT57fSxyZW5kZXJGYWxsYmFja1ZhbHVlOm51bGwsbWVyZ2VPcHRpb25zKGUsbil7cmV0dXJuIHQ/ey4uLmUsLi4ubn06TFMoZSxuKX19LHQ/elMoZSk6ZSkpO2lmKHQpe2xldCB0PXVuKGUuZGF0YSk7RXIodCwoKT0+e24uc2V0U3RhdGUoZT0+KHsuLi5lLGRhdGE6dC52YWx1ZX0pKX0se2ltbWVkaWF0ZTohMH0pfWxldCByPU0obi5pbml0aWFsU3RhdGUpO3JldHVybiBDcigoKT0+e24uc2V0T3B0aW9ucyhuPT57bGV0IGk9bmV3IFByb3h5KHt9LHtnZXQ6KGUsdCk9PnIudmFsdWVbdF19KTtyZXR1cm4gTFMobix0P3pTKGUpOmUse3N0YXRlOkxTKGksZS5zdGF0ZT8/e30pLG9uU3RhdGVDaGFuZ2U6dD0+e3QgaW5zdGFuY2VvZiBGdW5jdGlvbj9yLnZhbHVlPXQoci52YWx1ZSk6ci52YWx1ZT10LGUub25TdGF0ZUNoYW5nZT09bnVsbHx8ZS5vblN0YXRlQ2hhbmdlKHQpfX0pfSl9KSxufXZhciBWUz1bYGFyaWEtbGFiZWxgXSxIUz1GKHtfX25hbWU6YFNvcnRIZWFkZXJCdXR0b25gLHByb3BzOntoZWFkZXI6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT50LmhlYWRlci5jb2x1bW4uZ2V0SXNTb3J0ZWQoKSkscj1XKCgpPT5uLnZhbHVlPT09YGFzY2A/YV86bi52YWx1ZT09PWBkZXNjYD92XzpkXyksaT1XKCgpPT57bGV0IGU9dC5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXI7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9lOnQuaGVhZGVyLmNvbHVtbi5pZH0pLGE9VygoKT0+e2xldCBlPW4udmFsdWU9PT1gYXNjYD9gYXNjZW5kaW5nYDpuLnZhbHVlPT09YGRlc2NgP2BkZXNjZW5kaW5nYDpgbm9uZWA7cmV0dXJuYFNvcnQgYnkgJHtpLnZhbHVlfSwgY3VycmVudGx5ICR7ZX1gfSk7ZnVuY3Rpb24gbygpe3QuaGVhZGVyLmNvbHVtbi50b2dnbGVTb3J0aW5nKG4udmFsdWU9PT1gYXNjYCl9cmV0dXJuKHQsaSk9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBidXR0b25gLHt0eXBlOmBidXR0b25gLCJhcmlhLWxhYmVsIjphLnZhbHVlLGNsYXNzOmBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBweC0xLjUgcHktMC41IGhvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZ2Asb25DbGljazpvfSxbZS5oZWFkZXIuaXNQbGFjZWhvbGRlcj9UcyhgYCwhMCk6KFIoKSxCKE4oUlMpLHtrZXk6MCxyZW5kZXI6ZS5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5oZWFkZXIuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKSksSChzLHtpY29uOnIudmFsdWUsY2xhc3M6TyhbYHNpemUtMyBzaHJpbmstMGAsbi52YWx1ZT9gdGV4dC1mb3JlZ3JvdW5kYDpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzYwYF0pLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSldLDgsVlMpfX19KSxVUz17ImRhdGEtc2xvdCI6YHRhYmxlLWNvbnRhaW5lcmAsY2xhc3M6YHJlbGF0aXZlIHctZnVsbCBvdmVyZmxvdy14LWF1dG9gfSxXUz1GKHtfX25hbWU6YFRhYmxlYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCxVUyxbVihgdGFibGVgLHsiZGF0YS1zbG90IjpgdGFibGVgLGNsYXNzOk8oTihZdikoYHctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpXSkpfX0pLEdTPUYoe19fbmFtZTpgVGFibGVCb2R5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGJvZHlgLHsiZGF0YS1zbG90IjpgdGFibGUtYm9keWAsY2xhc3M6TyhOKFl2KShgWyZfdHI6bGFzdC1jaGlsZF06Ym9yZGVyLTBgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLEtTPUYoe19fbmFtZTpgVGFibGVDZWxsYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGRgLHsiZGF0YS1zbG90IjpgdGFibGUtY2VsbGAsY2xhc3M6TyhOKFl2KShgcC0yIGFsaWduLW1pZGRsZSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSkscVM9Rih7X19uYW1lOmBUYWJsZVJvd2AscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRyYCx7ImRhdGEtc2xvdCI6YHRhYmxlLXJvd2AsY2xhc3M6TyhOKFl2KShgaG92ZXI6YmctbXV0ZWQvNTAgZGF0YS1bc3RhdGU9c2VsZWN0ZWRdOmJnLW11dGVkIGJvcmRlci1iIHRyYW5zaXRpb24tY29sb3JzIGhhcy1hcmlhLWV4cGFuZGVkOmJnLW11dGVkLzUwYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxKUz17Y2xhc3M6YGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEwYH0sWVM9Rih7X19uYW1lOmBUYWJsZUVtcHR5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sY29sc3Bhbjp7ZGVmYXVsdDoxfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihxUyxudWxsLHtkZWZhdWx0OlAoKCk9PltIKEtTLGtzKHtjbGFzczpOKFl2KShgcC00IHdoaXRlc3BhY2Utbm93cmFwIGFsaWduLW1pZGRsZSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZGAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLEpTLFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldKV0pLF86M30sMTYsW2BjbGFzc2BdKV0pLF86M30pKX19KSxYUz1GKHtfX25hbWU6YFRhYmxlSGVhZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRgLGNsYXNzOk8oTihZdikoYHRleHQtZm9yZWdyb3VuZCBoLTEwIHB4LTIgdGV4dC1sZWZ0IGFsaWduLW1pZGRsZSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWlM9Rih7X19uYW1lOmBUYWJsZUhlYWRlcmAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoZWFkYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRlcmAsY2xhc3M6TyhOKFl2KShgWyZfdHJdOmJvcmRlci1iYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KTtmdW5jdGlvbiBRUyhlLHQpe3QudmFsdWU9dHlwZW9mIGU9PWBmdW5jdGlvbmA/ZSh0LnZhbHVlKTplfXZhciAkUz1GKHtfX25hbWU6YERhdGFUYWJsZWAscHJvcHM6e2NvbHVtbnM6e30sZGF0YTp7fSxyb3dDbGFzczp7dHlwZTpGdW5jdGlvbn0sZW1wdHlNZXNzYWdlOnt9fSxzZXR1cChlKXtsZXQgdD1lLG49TShbXSkscj1CUyh7Z2V0IGRhdGEoKXtyZXR1cm4gdC5kYXRhfSxnZXQgY29sdW1ucygpe3JldHVybiB0LmNvbHVtbnN9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsbiksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIG4udmFsdWV9fX0pO2Z1bmN0aW9uIGkoZSl7aWYoZT09PWBhc2NgKXJldHVybmBhc2NlbmRpbmdgO2lmKGU9PT1gZGVzY2ApcmV0dXJuYGRlc2NlbmRpbmdgfXJldHVybih0LG4pPT4oUigpLEIoTihXUyksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpTKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEoTihyKS5nZXRIZWFkZXJHcm91cHMoKSxlPT4oUigpLEIoTihxUykse2tleTplLmlkfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKGUuaGVhZGVycyxlPT4oUigpLEIoTihYUykse2tleTplLmlkLGNsYXNzOk8oZS5jb2x1bW4uY29sdW1uRGVmLm1ldGE/LmFsaWduPT09YHJpZ2h0YD9gdGV4dC1yaWdodGA6dm9pZCAwKSwiYXJpYS1zb3J0IjplLmNvbHVtbi5nZXRDYW5Tb3J0KCk/aShlLmNvbHVtbi5nZXRJc1NvcnRlZCgpKT8/YG5vbmVgOnZvaWQgMH0se2RlZmF1bHQ6UCgoKT0+W2UuY29sdW1uLmdldENhblNvcnQoKT8oUigpLEIoSFMse2tleTowLGhlYWRlcjplLGNsYXNzOmAtbXgtMS41YH0sbnVsbCw4LFtgaGVhZGVyYF0pKTplLmlzUGxhY2Vob2xkZXI/VHMoYGAsITApOihSKCksQihOKFJTKSx7a2V5OjEscmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5nZXRDb250ZXh0KCl9LG51bGwsOCxbYHJlbmRlcmAsYHByb3BzYF0pKV0pLF86Mn0sMTAzMixbYGNsYXNzYCxgYXJpYS1zb3J0YF0pKSksMTI4KSldKSxfOjJ9LDEwMjQpKSksMTI4KSldKSxfOjF9KSxIKE4oR1MpLG51bGwse2RlZmF1bHQ6UCgoKT0+W04ocikuZ2V0Um93TW9kZWwoKS5yb3dzLmxlbmd0aD09PTA/KFIoKSxCKE4oWVMpLHtrZXk6MCxjb2xzcGFuOmUuY29sdW1ucy5sZW5ndGgsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS5lbXB0eU1lc3NhZ2U/P2Bub25lYCksMSldKSxfOjF9LDgsW2Bjb2xzcGFuYF0pKTpUcyhgYCwhMCksKFIoITApLHooTCxudWxsLG1hKE4ocikuZ2V0Um93TW9kZWwoKS5yb3dzLHQ9PihSKCksQihOKHFTKSx7a2V5OnQuaWQsY2xhc3M6TyhlLnJvd0NsYXNzPy4odC5vcmlnaW5hbCkpfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHQuZ2V0VmlzaWJsZUNlbGxzKCksZT0+KFIoKSxCKE4oS1MpLHtrZXk6ZS5pZCxjbGFzczpPKGUuY29sdW1uLmNvbHVtbkRlZi5tZXRhPy5hbGlnbj09PWByaWdodGA/YHRleHQtcmlnaHQgdGFidWxhci1udW1zYDp2b2lkIDApfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJTKSx7cmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5jZWxsLHByb3BzOmUuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKV0pLF86Mn0sMTAzMixbYGNsYXNzYF0pKSksMTI4KSldKSxfOjJ9LDEwMzIsW2BjbGFzc2BdKSkpLDEyOCkpXSksXzoxfSldKSxfOjF9KSl9fSksZUM9Rih7X19uYW1lOmBCYWRnZWAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sdmFyaWFudDp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKHIsaSk9PihSKCksQihOKG5iKSxrcyh7ImRhdGEtc2xvdCI6YGJhZGdlYCwiZGF0YS12YXJpYW50IjplLnZhcmlhbnQsY2xhc3M6TihZdikoTih0Qykoe3ZhcmlhbnQ6ZS52YXJpYW50fSksdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLHRDPUNfKGBoLTUgZ2FwLTEgcm91bmRlZC00eGwgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTAuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJj5zdmddOnNpemUtMyEgZ3JvdXAvYmFkZ2UgaW5saW5lLWZsZXggdy1maXQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG92ZXJmbG93LWhpZGRlbiB3aGl0ZXNwYWNlLW5vd3JhcCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0zIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmVgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6YmctcHJpbWFyeS84MGAsc2Vjb25kYXJ5OmBiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6Ymctc2Vjb25kYXJ5LzgwYCxkZXN0cnVjdGl2ZTpgYmctZGVzdHJ1Y3RpdmUvMTAgW2FdOmhvdmVyOmJnLWRlc3RydWN0aXZlLzIwIGZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS80MCB0ZXh0LWRlc3RydWN0aXZlIGRhcms6YmctZGVzdHJ1Y3RpdmUvMjBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgdGV4dC1mb3JlZ3JvdW5kIFthXTpob3ZlcjpiZy1tdXRlZCBbYV06aG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCxnaG9zdDpgaG92ZXI6YmctbXV0ZWQgaG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctbXV0ZWQvNTBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7YXN5bmMgZnVuY3Rpb24gbkMoZSx0KXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpdHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlKSxgY29waWVkYH1jYXRjaHt9aWYoIXQpcmV0dXJuYGZhaWxlZGA7bGV0IG49ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtuLnNlbGVjdE5vZGVDb250ZW50cyh0KTtsZXQgcj13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHI/KHIucmVtb3ZlQWxsUmFuZ2VzKCksci5hZGRSYW5nZShuKSxgc2VsZWN0ZWRgKTpgZmFpbGVkYH12YXIgckM9YDAwMDEtMDEtMDFUMDA6MDA6MDBaYDtmdW5jdGlvbiBpQyhlLHQpe3JldHVybmAke2V9LyR7dH1gfWZ1bmN0aW9uIGFDKGUpe3JldHVybmAkJHsoZS8xZTYpLnRvRml4ZWQoNCl9YH1mdW5jdGlvbiBvQyhlKXtyZXR1cm4gZS50b0xvY2FsZVN0cmluZyhgZW4tVVNgKX1mdW5jdGlvbiBzQyhlKXtsZXQgdD1NYXRoLmFicyhlKTtpZih0PDFlNClyZXR1cm4gb0MoZSk7bGV0IG49ZTwwP2AtYDpgYCxbcixpXT10PDFlNj9bMWUzLGBrYF06dDwxZTk/WzFlNixgTWBdOlsxZTksYEJgXSxhPXQvcixvPTMtKE1hdGguZmxvb3IoYSk+PTEwMD8zOk1hdGguZmxvb3IoYSk+PTEwPzI6MSkscz0xMCoqbyxjPShNYXRoLmZsb29yKHQqcy9yKS9zKS50b0ZpeGVkKG8pO3JldHVybiBvPjAmJihjPWMucmVwbGFjZSgvMCskLyxgYCkucmVwbGFjZSgvXC4kLyxgYCkpLGAke259JHtjfSR7aX1gfWZ1bmN0aW9uIGNDKGUpe3JldHVybiBlPjAmJiEoZSZlLTEpfWZ1bmN0aW9uIGxDKGUpe3JldHVybiBlPDEwMjQ/YCR7ZX1gOmNDKGUpP2U8MTA0ODU3Nj9gJHtNYXRoLnJvdW5kKGUvMTAyNCl9a2A6YCR7TWF0aC5yb3VuZChlLzEwNDg1NzYpfU1gOmU8MWU2P2Ake01hdGgucm91bmQoZS8xZTMpfWtgOmAke01hdGgucm91bmQoZS8xZTYpfU1gfWZ1bmN0aW9uIHVDKGUpe3JldHVybmAkJHtlLnRvRml4ZWQoMil9YH1mdW5jdGlvbiBkQyhlLHQpe3JldHVybiBlPT09MCYmdD09PTA/YGZyZWVgOmBpbiAke3VDKGUpfSAvIG91dCAke3VDKHQpfSBwZXIgTVRva2B9ZnVuY3Rpb24gZkMoZSl7cmV0dXJuIGU8MWUzP2Ake01hdGgucm91bmQoZSl9bXNgOmAkeyhlLzFlMykudG9GaXhlZCgxKX1zYH1mdW5jdGlvbiBwQyhlLHQpe2lmKCFlfHxlPT09ckMpcmV0dXJuIG51bGw7bGV0IG49bmV3IERhdGUoZSkuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4obik/bnVsbDpNYXRoLm1heCgwLE1hdGgucm91bmQoKHQtbikvMWUzKSl9ZnVuY3Rpb24gbUMoZSl7bGV0IHQ9cEMoZSxEYXRlLm5vdygpKTtyZXR1cm4gdD09PW51bGw/YGA6YCAoJHt0fXMgYWdvKWB9ZnVuY3Rpb24gaEMoZSx0PURhdGUubm93KCkpe2xldCBuPXBDKGUsdCk7cmV0dXJuIG49PT1udWxsP2BgOmAke259cyBhZ29gfWZ1bmN0aW9uIGdDKGUpe2lmKCFlfHxlPT09ckMpcmV0dXJuYGA7bGV0IHQ9bmV3IERhdGUoZSkuZ2V0VGltZSgpO2lmKE51bWJlci5pc05hTih0KSlyZXR1cm5gYDtsZXQgbj1NYXRoLnJvdW5kKCh0LURhdGUubm93KCkpLzFlMyk7cmV0dXJuIG48PTA/YGA6YGluICR7bn1zYH1mdW5jdGlvbiBfQyhlKXtpZighZXx8ZT09PXJDKXJldHVybmBuZXZlcmA7bGV0IHQ9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTih0LmdldFRpbWUoKSk/ZTp0LnRvTG9jYWxlU3RyaW5nKCl9ZnVuY3Rpb24gdkMoZSx0KXtyZXR1cm4gZT9tQyh0KT9gcmVmcmVzaGVkYDpgcGVuZGluZ2A6YG9mZmB9ZnVuY3Rpb24geUMoZSx0KXtzd2l0Y2godkMoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuYHJlZnJlc2hlZCR7bUModCl9YH19ZnVuY3Rpb24gYkMoZSx0KXtzd2l0Y2godkMoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuIF9DKHQpfX1mdW5jdGlvbiB4QyhlKXtpZighZSlyZXR1cm5gbm9uZWA7bGV0IHQ9W107cmV0dXJuIGUucmVxdWVzdHNQZXJNaW51dGUmJnQucHVzaChgcmVxL21pbiAke2UucmVxdWVzdHNQZXJNaW51dGV9YCksZS5yZXF1ZXN0c1BlckRheSYmdC5wdXNoKGByZXEvZGF5ICR7ZS5yZXF1ZXN0c1BlckRheX1gKSxlLnRva2Vuc1BlckRheSYmdC5wdXNoKGB0b2svZGF5ICR7ZS50b2tlbnNQZXJEYXl9YCksZS50b2tlbnNQZXJNb250aCYmdC5wdXNoKGB0b2svbW9udGggJHtlLnRva2Vuc1Blck1vbnRofWApLGUuY29zdFBlckRheVVTRCYmdC5wdXNoKGBjb3N0L2RheSAkJHtlLmNvc3RQZXJEYXlVU0R9YCksZS5jb3N0UGVyTW9udGhVU0QmJnQucHVzaChgY29zdC9tb250aCAkJHtlLmNvc3RQZXJNb250aFVTRH1gKSx0Lmxlbmd0aD90LmpvaW4oYCwgYCk6YG5vbmVgfWZ1bmN0aW9uIFNDKGUsdCl7c3dpdGNoKHQpe2Nhc2VgaG91cmA6cmV0dXJuYCR7ZS5zbGljZSg4LDEwKX06MDBgO2Nhc2VgZGF5YDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKSxyPU51bWJlcihlLnNsaWNlKDYsOCkpO3JldHVybiBuZXcgRGF0ZSh0LG4tMSxyKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDpgc2hvcnRgLGRheTpgbnVtZXJpY2B9KX1jYXNlYG1vbnRoYDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKTtyZXR1cm4gbmV3IERhdGUodCxuLTEsMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6YHNob3J0YCx5ZWFyOmBudW1lcmljYH0pfX19dmFyIENDPUYoe19fbmFtZTpgTW9kZWxDaGlwYCxwcm9wczp7aWQ6e30sY29udGV4dFRva2Vuczp7fSxpbnB1dFBlck1Ub2tVc2Q6e30sb3V0cHV0UGVyTVRva1VzZDp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXNpKGBsYWJlbGApLHI9TShgaWRsZWApLGk7ZnVuY3Rpb24gYSgpe2NsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKCk9PntyLnZhbHVlPWBpZGxlYH0sMTUwMCl9YXN5bmMgZnVuY3Rpb24gbygpe2xldCBlPWF3YWl0IG5DKHQuaWQsbi52YWx1ZT8/dm9pZCAwKTtyLnZhbHVlPWUsYSgpfWxldCBzPXtpZGxlOmdfLGNvcGllZDp1XyxzZWxlY3RlZDp1XyxmYWlsZWQ6aF99LGM9VygoKT0+KHtpZGxlOmBDb3B5ICR7dC5pZH1gLGNvcGllZDpgQ29waWVkYCxzZWxlY3RlZDpgU2VsZWN0ZWQg4oCUIHByZXNzIEN0cmwvQ21kK0NgLGZhaWxlZDpgQ29weSBmYWlsZWRgfSkpLGw9VygoKT0+e2xldCBlPVtdO3JldHVybiB0LmlucHV0UGVyTVRva1VzZCE9PXZvaWQgMCYmdC5vdXRwdXRQZXJNVG9rVXNkIT09dm9pZCAwJiZlLnB1c2goZEModC5pbnB1dFBlck1Ub2tVc2QsdC5vdXRwdXRQZXJNVG9rVXNkKSksdC5jb250ZXh0VG9rZW5zIT09dm9pZCAwJiZlLnB1c2goYCR7bEModC5jb250ZXh0VG9rZW5zKX0gY29udGV4dGApLGUuam9pbihgIMK3IGApfSksdT1XKCgpPT57bGV0IGU9Yy52YWx1ZVtyLnZhbHVlXTtyZXR1cm4gbC52YWx1ZT9gJHtlfSDCtyAke2wudmFsdWV9YDplfSk7cmV0dXJuIHRhKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSksKHQsbik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oZUMpLHthczpgYnV0dG9uYCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6TyhbYGN1cnNvci1wb2ludGVyIGdhcC0xIGZvbnQtbW9ubyB0ZXh0LXhzIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kYCxyLnZhbHVlPT09YGZhaWxlZGA/YHRleHQtZGVzdHJ1Y3RpdmVgOmBgXSksdGl0bGU6dS52YWx1ZSwiYXJpYS1sYWJlbCI6dS52YWx1ZSxvbkNsaWNrOm99LHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCx7cmVmOmBsYWJlbGAsY2xhc3M6YHNlbGVjdC10ZXh0YH0sayhlLmlkKSw1MTMpLEgoaSx7aWNvbjpzW3IudmFsdWVdLGNsYXNzOmBzaXplLTIuNSBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9LDgsW2BjbGFzc2AsYHRpdGxlYCxgYXJpYS1sYWJlbGBdKX19fSk7ZnVuY3Rpb24gd0MoZSx0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKGUpfHxlPD0wP251bGw6KGUtKE51bWJlci5pc0Zpbml0ZSh0KT90OjApKS9lfWZ1bmN0aW9uIFRDKGUpe3JldHVybiBlPT09bnVsbD9gbm8tdHJhZmZpY2A6ZTwuOT9gc2V2ZXJlYDplPC45OT9gZGVncmFkZWRgOmBoZWFsdGh5YH1mdW5jdGlvbiBFQyhlLHQpe2xldCBuPXdDKGUsdCk7cmV0dXJuIG4hPT1udWxsJiZuPC45OX1mdW5jdGlvbiBEQyhlKXtyZXR1cm4gZT49MT9gMTAwJWA6YCR7TWF0aC5mbG9vcihlKjEwMCl9JWB9ZnVuY3Rpb24gT0MoZSx0LG4pe3JldHVybiBlPT09MT90Om59ZnVuY3Rpb24ga0MoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIGluIHRoZSBsYXN0IG1pbnV0ZWA7bGV0IG49d0MoZSx0KSxyPW49PT1udWxsP2BgOmAgKCR7REMobil9KWA7cmV0dXJuYCR7ZX0gJHtPQyhlLGBhdHRlbXB0YCxgYXR0ZW1wdHNgKX0sICR7dH0gJHtPQyh0LGBmYWlsdXJlYCxgZmFpbHVyZXNgKX0gaW4gdGhlIGxhc3QgbWludXRlJHtyfWB9ZnVuY3Rpb24gQUMoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIHRvZGF5YDtsZXQgbj13QyhlLHQpLHI9bj09PW51bGw/YGA6YCAoJHtEQyhuKX0pYDtyZXR1cm5gJHtlfSAke09DKGUsYGF0dGVtcHRgLGBhdHRlbXB0c2ApfSwgJHt0fSAke09DKHQsYGZhaWx1cmVgLGBmYWlsdXJlc2ApfSB0b2RheSR7cn1gfXZhciBqQz17ImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LE1DPXtjbGFzczpgc3Itb25seWB9LE5DPUYoe19fbmFtZTpgUHJvdmlkZXJSYXRlQmFkZ2VgLHByb3BzOnthdHRlbXB0c0RheTp7fSxmYWlsdXJlc0RheTp7fSxhdHRlbXB0c01pbnV0ZTp7fSxmYWlsdXJlc01pbnV0ZTp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVcoKCk9PndDKHQuYXR0ZW1wdHNEYXksdC5mYWlsdXJlc0RheSkpLHI9VygoKT0+VEMobi52YWx1ZSkpLGk9VygoKT0+ci52YWx1ZT09PWBuby10cmFmZmljYD9gbm8gdHJhZmZpY2A6REMobi52YWx1ZSkpLGE9VygoKT0+dC5hdHRlbXB0c01pbnV0ZT09PXZvaWQgMHx8dC5mYWlsdXJlc01pbnV0ZT09PXZvaWQgMD9BQyh0LmF0dGVtcHRzRGF5LHQuZmFpbHVyZXNEYXkpOmtDKHQuYXR0ZW1wdHNNaW51dGUsdC5mYWlsdXJlc01pbnV0ZSkpLG89VygoKT0+ci52YWx1ZT09PWBzZXZlcmVgP2BkZXN0cnVjdGl2ZWA6ci52YWx1ZT09PWBoZWFsdGh5YD9gc2Vjb25kYXJ5YDpgb3V0bGluZWApLHM9VygoKT0+ci52YWx1ZT09PWBkZWdyYWRlZGA/YGJvcmRlci1zdGF0dXMtd2Fybi80MCB0ZXh0LXN0YXR1cy13YXJuYDpyLnZhbHVlPT09YG5vLXRyYWZmaWNgP2B0ZXh0LW11dGVkLWZvcmVncm91bmRgOmBgKTtyZXR1cm4oZSx0KT0+KFIoKSxCKE4oZUMpLHthczpgc3BhbmAsdmFyaWFudDpvLnZhbHVlLGNsYXNzOk8oW3MudmFsdWUsYGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2BdKSx0aXRsZTphLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bVihgc3BhbmAsakMsayhpLnZhbHVlKSwxKSxWKGBzcGFuYCxNQyxrKGEudmFsdWUpLDEpXSksXzoxfSw4LFtgdmFyaWFudGAsYGNsYXNzYCxgdGl0bGVgXSkpfX0pLFBDPUYoe19fbmFtZTpgU2VhcmNoSW5wdXRgLHByb3BzOnttb2RlbFZhbHVlOnt9LHBsYWNlaG9sZGVyOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1XKCgpPT5uLm1vZGVsVmFsdWUubGVuZ3RoPjApO2Z1bmN0aW9uIGEoZSl7cihgdXBkYXRlOm1vZGVsVmFsdWVgLFN0cmluZyhlKSl9ZnVuY3Rpb24gbygpe3IoYHVwZGF0ZTptb2RlbFZhbHVlYCxgYCl9cmV0dXJuKHQscik9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLHtjbGFzczpPKE4oWXYpKGByZWxhdGl2ZWAsbi5jbGFzcykpfSxbSChzLHtpY29uOk4ocl8pLGNsYXNzOmBwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0xLzIgbGVmdC0yLjUgc2l6ZS0zLjUgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LW11dGVkLWZvcmVncm91bmRgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLEgoTihRYikseyJtb2RlbC12YWx1ZSI6ZS5tb2RlbFZhbHVlLHR5cGU6YHRleHRgLHBsYWNlaG9sZGVyOmUucGxhY2Vob2xkZXIsImFyaWEtbGFiZWwiOmUucGxhY2Vob2xkZXIsY2xhc3M6YHByLTggcGwtOGAsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmF9LG51bGwsOCxbYG1vZGVsLXZhbHVlYCxgcGxhY2Vob2xkZXJgLGBhcmlhLWxhYmVsYF0pLGkudmFsdWU/KFIoKSxCKE4oV2IpLHtrZXk6MCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YGdob3N0YCxzaXplOmBpY29uLXhzYCwiYXJpYS1sYWJlbCI6YENsZWFyIHNlYXJjaGAsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMSAtdHJhbnNsYXRlLXktMS8yIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRgLG9uQ2xpY2s6b30se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKGZfKSxjbGFzczpgc2l6ZS0zLjVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSkpOlRzKGBgLCEwKV0sMil9fX0pLEZDPUYoe19fbmFtZTpgQWNjb3JkaW9uYCxwcm9wczp7Y29sbGFwc2libGU6e3R5cGU6Qm9vbGVhbn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sZGlyOnt9LG9yaWVudGF0aW9uOnt9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSx0eXBlOnt9LG1vZGVsVmFsdWU6e30sZGVmYXVsdFZhbHVlOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihoYiksa3MoeyJkYXRhLXNsb3QiOmBhY2NvcmRpb25gfSxOKGkpLHtjbGFzczpOKFl2KShgZmxleCB3LWZ1bGwgZmxleC1jb2xgLG4uY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksSUM9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oYmIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWNvbnRlbnRgfSxOKG4pLHtjbGFzczpgZGF0YS1vcGVuOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24gZGF0YS1jbG9zZWQ6YW5pbWF0ZS1hY2NvcmRpb24tdXAgdGV4dC1zbSBvdmVyZmxvdy1oaWRkZW5gfSkse2RlZmF1bHQ6UCgoKT0+W1YoYGRpdmAse2NsYXNzOk8oTihZdikoYHB0LTAgcGItMi41IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kIFsmX3A6bm90KDpsYXN0LWNoaWxkKV06bWItNGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKV0pLF86M30sMTYpKX19KSxMQz1GKHtfX25hbWU6YEFjY29yZGlvbkl0ZW1gLHByb3BzOntkaXNhYmxlZDp7dHlwZTpCb29sZWFufSx2YWx1ZTp7fSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1LeShDeSh0LGBjbGFzc2ApKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oeWIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWl0ZW1gfSxOKG4pLHtjbGFzczpOKFl2KShgbm90LWxhc3Q6Ym9yZGVyLWJgLHQuY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksUkM9Rih7X19uYW1lOmBBY2NvcmRpb25UcmlnZ2VyYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oeGIpLHtjbGFzczpgZmxleGB9LHtkZWZhdWx0OlAoKCk9PltIKE4oU2IpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLXRyaWdnZXJgfSxOKG4pLHtjbGFzczpOKFl2KShgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOmFmdGVyOmJvcmRlci1yaW5nICoqOmRhdGEtW3Nsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbGcgcHktMi41IHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnVuZGVybGluZSBmb2N1cy12aXNpYmxlOnJpbmctMyAqKjpkYXRhLVtzbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25dOm1sLWF1dG8gKio6ZGF0YS1bc2xvdD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXTpzaXplLTQgZ3JvdXAvYWNjb3JkaW9uLXRyaWdnZXIgcmVsYXRpdmUgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1hbGwgb3V0bGluZS1ub25lIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApLEkoZS4kc2xvdHMsYGljb25gLHt9LCgpPT5bSChpLHtpY29uOk4obV8pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaHJpbmstMCBncm91cC1hcmlhLWV4cGFuZGVkL2FjY29yZGlvbi10cmlnZ2VyOmhpZGRlbmB9LG51bGwsOCxbYGljb25gXSksSChpLHtpY29uOk4oc18pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBoaWRkZW4gc2hyaW5rLTAgZ3JvdXAtYXJpYS1leHBhbmRlZC9hY2NvcmRpb24tdHJpZ2dlcjppbmxpbmVgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSldKSxfOjN9KX19fSk7ZnVuY3Rpb24gekMoKXtsZXQgZT1NKGBgKSx0PVcoKCk9PmUudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpO3JldHVybntxdWVyeTplLG5vcm1hbGl6ZWQ6dCxoYXNRdWVyeTpXKCgpPT50LnZhbHVlLmxlbmd0aD4wKX19ZnVuY3Rpb24gQkMoZSx0LG4pe2lmKCF0KXJldHVybiBuZXcgU2V0KGUubWFudWFsbHlFeHBhbmRlZCk7bGV0IHI9bmV3IFNldChlLm1hbnVhbGx5RXhwYW5kZWQpO2ZvcihsZXQgdCBvZiBuKWUubWFudWFsbHlDb2xsYXBzZWQuaGFzKHQpfHxyLmFkZCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBWQyhlLHQsbil7bj8oZS5tYW51YWxseUV4cGFuZGVkLmRlbGV0ZSh0KSxlLm1hbnVhbGx5Q29sbGFwc2VkLmFkZCh0KSk6KGUubWFudWFsbHlDb2xsYXBzZWQuZGVsZXRlKHQpLGUubWFudWFsbHlFeHBhbmRlZC5hZGQodCkpfWZ1bmN0aW9uIEhDKGUpe2UubWFudWFsbHlDb2xsYXBzZWQuY2xlYXIoKX12YXIgVUM9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sV0M9e2NsYXNzOmBncmlkIGdhcC00IHNtOmdyaWQtY29scy0zYH0sR0M9e2NsYXNzOmBmb250LW1lZGl1bWB9LEtDPXtrZXk6MCxjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41IHRleHQtZGVzdHJ1Y3RpdmVgfSxxQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sSkM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxZQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sWEM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxaQz17a2V5OjAsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxRQz17a2V5OjEsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSwkQz17Y2xhc3M6YGZsZXggZmxleC0xIGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLXgtMyBnYXAteS0xIHByLTIgdGV4dC1sZWZ0YH0sZXc9e2NsYXNzOmBmb250LW1lZGl1bWB9LHR3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sbnc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHJ3PXtjbGFzczpgbWItMyBncmlkIGdyaWQtY29scy0yIGdhcC14LTYgZ2FwLXktMS41IHRleHQtc20gc206Z3JpZC1jb2xzLTNgfSxpdz17Y2xhc3M6YGJyZWFrLWFsbGB9LGF3PXtrZXk6MH0sb3c9e2tleToxfSxzdz17Y2xhc3M6YHRleHQtZGVzdHJ1Y3RpdmVgfSxjdz17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxsdz17a2V5OjAsdGl0bGU6YGNvbnRleHQgd2luZG93YCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sdXc9e2tleToxLGNsYXNzOmB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGR3PXtrZXk6MCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxmdz1gUGVyLXJlcGxpY2EsIGluLXByb2Nlc3Mgb25seSDigJQgbm90IGEgZmxlZXQtd2lkZSBhdmVyYWdlIGFjcm9zcyB0aGlzIGRlcGxveW1lbnTigJlzIHJlcGxpY2FzLmAscHc9Rih7X19uYW1lOmBQcm92aWRlcnNWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC5vdmVydmlldykscj1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSx7cXVlcnk6aSxub3JtYWxpemVkOmEsaGFzUXVlcnk6b309ekMoKTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGlDKGUsdCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhhLnZhbHVlKX1mdW5jdGlvbiBjKGUpe3JldHVybiBlLm1vZGVscy5zb21lKHQ9PnMoZS5uYW1lLHQpKX1mdW5jdGlvbiBsKGUpe3JldHVybiBlLmFsaWFzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl8fGUudGFyZ2V0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl9bGV0IHU9VygoKT0+e2xldCBlPW4udmFsdWU/LnByb3ZpZGVycz8/W107cmV0dXJuIG8udmFsdWU/ZS5maWx0ZXIoYyk6ZX0pLGQ9VygoKT0+e2xldCBlPW4udmFsdWU/LmFsaWFzZXM/P1tdO3JldHVybiBvLnZhbHVlP2UuZmlsdGVyKGwpOmV9KSxmPVcoKCk9PkJDKHIsby52YWx1ZSx1LnZhbHVlLm1hcChlPT5lLm5hbWUpKSk7ZnVuY3Rpb24gcChlKXtWQyhyLGUsZi52YWx1ZS5oYXMoZSkpfWxldCBtPVcoe2dldDooKT0+QXJyYXkuZnJvbShmLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIGYudmFsdWUpdC5oYXMoZSl8fHAoZSk7Zm9yKGxldCBlIG9mIHQpZi52YWx1ZS5oYXMoZSl8fHAoZSl9fSk7RXIoaSxlPT57ZS50cmltKCk9PT1gYCYmSEMocil9KTtmdW5jdGlvbiBoKGUpe3JldHVybiBvLnZhbHVlP2UubW9kZWxzLmZpbHRlcih0PT5zKGUubmFtZSx0KSk6ZS5tb2RlbHN9bGV0IGc9e2F0dGVtcHRzRGF5OjAsZmFpbHVyZXNEYXk6MH07ZnVuY3Rpb24gXyhlLHQpe3JldHVybiBlLm1vZGVsUmF0ZXM/Llt0XT8/Z31mdW5jdGlvbiB2KGUsdCl7bGV0IG49XyhlLHQpO3JldHVybiBFQyhuLmF0dGVtcHRzRGF5LG4uZmFpbHVyZXNEYXkpfWxldCB5PXt9O2Z1bmN0aW9uIGIoZSx0KXtyZXR1cm4gZS5tb2RlbE1ldGE/Llt0XT8/eX1mdW5jdGlvbiB4KGUpe3N3aXRjaChlKXtjYXNlYG9wZW5gOnJldHVybmBkZXN0cnVjdGl2ZWA7Y2FzZWBoYWxmLW9wZW5gOnJldHVybmBzZWNvbmRhcnlgO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBTKGUpe2xldCB0PWdDKGUub3BlblVudGlsKTtyZXR1cm4gdD9gJHtlLmhlYWx0aFN0YXRlfSAoJHt0fSlgOmUuaGVhbHRoU3RhdGV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZT09PWBvcGVuYD9gdGV4dC1kZXN0cnVjdGl2ZWA6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gZS5sYXRlbmN5Py5zdHJlYW1pbmd9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuIGUubGF0ZW5jeT8uW2Bub24tc3RyZWFtaW5nYF19ZnVuY3Rpb24gdGUoZSl7cmV0dXJuIGUuY291bnQ9PT12b2lkIDA/YG5vIG9ic2VydmF0aW9ucyBjb3VudGVkYDpgJHtlLmNvdW50fSAke2UuY291bnQ9PT0xP2BvYnNlcnZhdGlvbmA6YG9ic2VydmF0aW9uc2B9IG9uIHRoaXMgcmVwbGljYWB9ZnVuY3Rpb24gVChlKXtyZXR1cm5gQXZlcmFnZSB0aW1lIHRvIGZpcnN0IGJ5dGUsIHRoZSBsb2FkLXNlbnNpdGl2ZSByZWFkaW5nIGZvciBzdHJlYW1pbmcgdHJhZmZpYy4gJHt0ZShlKX0uICR7Znd9YH1mdW5jdGlvbiBuZShlKXtyZXR1cm5gQXZlcmFnZSB0b3RhbCByZXNwb25zZSB0aW1lLCBpbmNsdWRpbmcgZ2VuZXJhdGlvbiDigJQgbm90IGEgbG9hZC1zZW5zaXRpdmUgc2lnbmFsIGxpa2Ugc3RyZWFtaW5nIHR0ZmIsIHNpbmNlIHRoaXMgcHJvdmlkZXIgYnVmZmVycyB0aGUgd2hvbGUgY29tcGxldGlvbiBiZWZvcmUgc2VuZGluZyBhbnl0aGluZy4gJHt0ZShlKX0uICR7Znd9YH1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5wcm92ZW5hbmNlPy5lc3RpbWF0ZWR9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIGUucHJvdmVuYW5jZT8udW5iaWxsZWR9ZnVuY3Rpb24gRShlKXtsZXQgdD1lLnJlcXVlc3RzPT09MT9gYDpgc2A7cmV0dXJuYCR7ZS5yZXF1ZXN0c30gbm9uLXN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgcHJvbXB0IHRva2VucyB3ZXJlIGVzdGltYXRlZCBmcm9tIHJlcXVlc3QgYm9keSBzaXplIGluc3RlYWQgKCR7ZS50b2tlbnN9IHRva2VucyBiaWxsZWQgZnJvbSB0aGUgZXN0aW1hdGUpLCBjb21wbGV0aW9uIGJpbGxlZCBhcyB6ZXJvLiAke2Z3fWB9ZnVuY3Rpb24gYWUoZSl7bGV0IHQ9ZS5yZXF1ZXN0cz09PTE/YGA6YHNgO3JldHVybmAke2UucmVxdWVzdHN9IHN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgdGhlIHJlcXVlc3Qgd2FzIGNvdW50ZWQgYnV0IHplcm8gdG9rZW5zIHdlcmUgYmlsbGVkLiBJZiB0aGlzIGtlZXBzIGhhcHBlbmluZywgdGhpcyBwcm92aWRlciBtYXkgYmUgc2VydmluZyBjb21wbGV0aW9ucyBlbnRpcmVseSBmcmVlIGFnYWluc3QgZXZlcnkgYnVkZ2V0LiAke2Z3fWB9bGV0IG9lPVt7aWQ6YGFsaWFzYCxoZWFkZXI6YEFsaWFzYCxhY2Nlc3NvckZuOmU9PmUuYWxpYXMsY2VsbDooe3JvdzplfSk9PkcoQ0Mse2lkOmUub3JpZ2luYWwuYWxpYXMsY29udGV4dFRva2VuczplLm9yaWdpbmFsLm1vZGVsTWV0YT8uY29udGV4dFRva2VucyxpbnB1dFBlck1Ub2tVc2Q6ZS5vcmlnaW5hbC5tb2RlbE1ldGE/LmlucHV0UGVyTVRva1VzZCxvdXRwdXRQZXJNVG9rVXNkOmUub3JpZ2luYWwubW9kZWxNZXRhPy5vdXRwdXRQZXJNVG9rVXNkfSl9LHtpZDpgdGFyZ2V0YCxoZWFkZXI6YFRhcmdldGAsYWNjZXNzb3JGbjplPT5lLnRhcmdldCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxlLm9yaWdpbmFsLnRhcmdldCl9XSxzZT1XKCgpPT5uLnZhbHVlPy5hbGlhc2VzLmxlbmd0aD9vLnZhbHVlP2BubyBhbGlhc2VzIG1hdGNoICIke2kudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgKTtyZXR1cm4oZSx0KT0+e2xldCByPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsVUMsW1YoYGRpdmAsV0MsW0goTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmVkaXMuY29uZmlndXJlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFsyXXx8PVUoYCBSZWRpcyBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1zbWB9LHtkZWZhdWx0OlAoKCk9PltWKGBwYCxHQyxrKG4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/YENvbmZpZ3VyZWRgOmBOb3QgY29uZmlndXJlZGApLDEpLG4udmFsdWU/LnJlZGlzLmxhc3RFcnI/KFIoKSx6KGBwYCxLQyxbSChyLHtpY29uOk4oaF8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zLjUgc2hyaW5rLTBgfSxudWxsLDgsW2BpY29uYF0pLFYoYHNwYW5gLG51bGwsayhuLnZhbHVlLnJlZGlzLmxhc3RFcnIpK2soTihtQykobi52YWx1ZS5yZWRpcy5sYXN0RXJyQXQpKSwxKV0pKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LmNhY2hlLmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8uY2FjaGUuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFszXXx8PVUoYCBSZXNwb25zZSBjYWNoZSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAscUMsayhuLnZhbHVlPy5jYWNoZS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5jYWNoZS5lbmFibGVkPyhSKCkseihgcGAsSkMsYHR0bCBgK2sobi52YWx1ZS5jYWNoZS50dGwpLDEpKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJldHJ5LmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmV0cnkuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFs0XXx8PVUoYCBSZXRyeSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAsWUMsayhuLnZhbHVlPy5yZXRyeS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5yZXRyeS5lbmFibGVkPyhSKCkseihgcGAsWEMsYCBhdHRlbXB0cyBgK2sobi52YWx1ZS5yZXRyeS5hdHRlbXB0cykrYCwgYmFja29mZiBgK2sobi52YWx1ZS5yZXRyeS5iYWNrb2ZmKSwxKSk6VHMoYGAsITApXSksXzoxfSldKSxfOjF9KV0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbNV18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzZdfHw9W1UoYCBFdmVyeSBjb25maWd1cmVkIHVwc3RyZWFtIGFuZCBpdHMgbGFzdCBkaXNjb3ZlcnkgcmVmcmVzaC4gU2VhcmNoIGZpbHRlcnMgcHJvdmlkZXJzIGFuZCBhbGlhc2VzIGJ5IG1vZGVsIGlkLiBgLC0xKV1dKSxfOjF9KSxIKFBDLHttb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBTZWFyY2ggbW9kZWxzIG9yIGFsaWFzZXMuLi5gLGNsYXNzOmBtdC0yIG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bbi52YWx1ZT8ucHJvdmlkZXJzLmxlbmd0aD9OKG8pJiZ1LnZhbHVlLmxlbmd0aD09PTA/KFIoKSx6KGBwYCxRQyxgIG5vIHByb3ZpZGVycyBtYXRjaCAiYCtrKE4oaSkpK2AiIGAsMSkpOihSKCksQihOKEZDKSx7a2V5OjIsbW9kZWxWYWx1ZTptLnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzFdfHw9ZT0+bS52YWx1ZT1lLHR5cGU6YG11bHRpcGxlYCxjbGFzczpgcm91bmRlZC1tZCBib3JkZXIgcHgtM2B9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodS52YWx1ZSxlPT4oUigpLEIoTihMQykse2tleTplLm5hbWUsdmFsdWU6ZS5uYW1lfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCwkQyxbVihgc3BhbmAsZXcsayhlLm5hbWUpLDEpLEgoTihlQykse2FzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS50eXBlKSwxKV0pLF86Mn0sMTAyNCksVihgc3BhbmAsdHcsayhlLm1vZGVsQ291bnQpK2AgbW9kZWxzYCwxKSxIKE5DLHsiYXR0ZW1wdHMtZGF5IjplLmF0dGVtcHRzRGF5LCJmYWlsdXJlcy1kYXkiOmUuZmFpbHVyZXNEYXksImF0dGVtcHRzLW1pbnV0ZSI6ZS5hdHRlbXB0c01pbnV0ZSwiZmFpbHVyZXMtbWludXRlIjplLmZhaWx1cmVzTWludXRlfSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgLGBhdHRlbXB0cy1taW51dGVgLGBmYWlsdXJlcy1taW51dGVgXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLEIoTihlQykse2tleTowLGFzOmBzcGFuYCx2YXJpYW50OngoZS5oZWFsdGhTdGF0ZSksY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTplLmhlYWx0aFN0YXRlPT09YG9wZW5gP2BkaXNjb3ZlcnkgaXMgYmFja2luZyBvZmYgYWZ0ZXIgcmVwZWF0ZWQgZmFpbHVyZXNgOmBhIGRpc2NvdmVyeSBwcm9iZSBpcyBkZWNpZGluZyB3aGV0aGVyIHRvIHJlY292ZXJgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKFMoZSkpLDEpXSksXzoyfSwxMDMyLFtgdmFyaWFudGAsYHRpdGxlYF0pKSx3KGUpPy5hdmdUdGZiTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOlQodyhlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgc3RyZWFtaW5nIHR0ZmIgYCtrKE4oZkMpKHcoZSkuYXZnVHRmYk1zKSksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSksZWUoZSk/LmF2Z0R1cmF0aW9uTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjIsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOm5lKGVlKGUpKX0se2RlZmF1bHQ6UCgoKT0+W1UoYCBub24tc3RyZWFtaW5nIGF2ZyBgK2soTihmQykoZWUoZSkuYXZnRHVyYXRpb25NcykpLDEpXSksXzoyfSwxMDMyLFtgdGl0bGVgXSkpLHJlKGUpPyhSKCksQihOKGVDKSx7a2V5OjMsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2AsdGl0bGU6RShyZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgZXN0aW1hdGVkIGArayhyZShlKS5yZXF1ZXN0cyksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSk6VHMoYGAsITApLGllKGUpPyhSKCksQihOKGVDKSx7a2V5OjQsYXM6YHNwYW5gLHZhcmlhbnQ6YGRlc3RydWN0aXZlYCxjbGFzczpgZm9udC1ub3JtYWwgdGFidWxhci1udW1zYCx0aXRsZTphZShpZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgdW5iaWxsZWQgYCtrKGllKGUpLnJlcXVlc3RzKSwxKV0pLF86Mn0sMTAzMixbYHRpdGxlYF0pKTpUcyhgYCwhMCksZS5sYXN0RXJyPyhSKCksQihyLHtrZXk6NSxpY29uOk4oaF8pLGNsYXNzOmBzaXplLTMuNSBzaHJpbmstMCB0ZXh0LWRlc3RydWN0aXZlYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSk6VHMoYGAsITApLFYoYHNwYW5gLG53LGsoTih5QykoZS5kaXNjb3ZlcnlFbmFibGVkLGUubGFzdFJlZnJlc2gpKSwxKV0pXSksXzoyfSwxMDI0KSxIKE4oSUMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYGRsYCxydyxbVihgZGl2YCxudWxsLFt0WzddfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQmFzZSBVUkxgLC0xKSxWKGBkZGAsaXcsayhlLmJhc2VVcmwpLDEpXSksVihgZGl2YCxudWxsLFt0WzhdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCByZWZyZXNoYCwtMSksVihgZGRgLG51bGwsayhOKGJDKShlLmRpc2NvdmVyeUVuYWJsZWQsZS5sYXN0UmVmcmVzaCkpLDEpXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLHooYGRpdmAsYXcsW3RbOV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBEaXNjb3ZlcnkgaGVhbHRoYCwtMSksVihgZGRgLHtjbGFzczpPKEMoZS5oZWFsdGhTdGF0ZSkpfSxrKFMoZSkpLDMpXSkpLGUubGFzdEVycj8oUigpLHooYGRpdmAsb3csW3RbMTBdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCBlcnJvcmAsLTEpLFYoYGRkYCxzdyxrKGUubGFzdEVyciksMSldKSk6VHMoYGAsITApXSksaChlKS5sZW5ndGg/KFIoKSx6KGBkaXZgLGN3LFsoUighMCkseihMLG51bGwsbWEoaChlKSx0PT4oUigpLHooYHNwYW5gLHtrZXk6dCxjbGFzczpgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xYH0sW0goQ0Mse2lkOk4oaUMpKGUubmFtZSx0KSwiY29udGV4dC10b2tlbnMiOmIoZSx0KS5jb250ZXh0VG9rZW5zLCJpbnB1dC1wZXItbS10b2stdXNkIjpiKGUsdCkuaW5wdXRQZXJNVG9rVXNkLCJvdXRwdXQtcGVyLW0tdG9rLXVzZCI6YihlLHQpLm91dHB1dFBlck1Ub2tVc2R9LG51bGwsOCxbYGlkYCxgY29udGV4dC10b2tlbnNgLGBpbnB1dC1wZXItbS10b2stdXNkYCxgb3V0cHV0LXBlci1tLXRvay11c2RgXSksYihlLHQpLmNvbnRleHRUb2tlbnM9PT12b2lkIDA/VHMoYGAsITApOihSKCkseihgc3BhbmAsbHcsayhOKGxDKShiKGUsdCkuY29udGV4dFRva2VucykpLDEpKSx2KGUsdCk/KFIoKSxCKE5DLHtrZXk6MSwiYXR0ZW1wdHMtZGF5IjpfKGUsdCkuYXR0ZW1wdHNEYXksImZhaWx1cmVzLWRheSI6XyhlLHQpLmZhaWx1cmVzRGF5fSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgXSkpOlRzKGBgLCEwKV0pKSksMTI4KSldKSk6KFIoKSx6KGBwYCx1dyxgbm8gbW9kZWxzIGtub3duIHlldGApKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxaQyxgbm9uZWApKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMV18fD1bVShgTW9kZWwgYWxpYXNlc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMl18fD1bVShgT3BlcmF0b3ItZGVmaW5lZCBhbGlhcyDihpIgdGFyZ2V0IG1vZGVsIG1hcHBpbmdzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOm9lLGRhdGE6ZC52YWx1ZSwiZW1wdHktbWVzc2FnZSI6c2UudmFsdWV9LG51bGwsOCxbYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KSxuLnZhbHVlPy52ZXJzaW9uPyhSKCkseihgcGAsZHcsYFZlcnNpb246IGArayhuLnZhbHVlLnZlcnNpb24pLDEpKTpUcyhgYCwhMCldKX19fSksbXc9W2B0aXRsZWBdLGh3PXsiYXJpYS1oaWRkZW4iOmB0cnVlYH0sZ3c9e2NsYXNzOmBzci1vbmx5YH0sX3c9Rih7X19uYW1lOmBDb21wYWN0TnVtYmVyYCxwcm9wczp7dmFsdWU6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5zQyh0LnZhbHVlKSkscj1XKCgpPT5vQyh0LnZhbHVlKSk7cmV0dXJuKGUsdCk9PihSKCkseihgc3BhbmAse3RpdGxlOnIudmFsdWV9LFtWKGBzcGFuYCxodyxrKG4udmFsdWUpLDEpLFYoYHNwYW5gLGd3LGsoci52YWx1ZSksMSldLDgsbXcpKX19KTtmdW5jdGlvbiB2dyhlLHQsbil7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT5HKF93LHt2YWx1ZTpuKGUub3JpZ2luYWwpfSl9fXZhciB5dz1gbm90IG9ic2VydmVkIHlldCDigJQgbm8gdHJhZmZpYyBhbmQgcHJvYmVzIGRpc2FibGVkIG9yIG5vdCB5ZXQgcnVuYDtmdW5jdGlvbiBidyhlKXtsZXQgdD1oQyhlLmxhc3RDaGVjayk7cmV0dXJuIHQ/YHVuaGVhbHRoeSAoJHt0fSlgOmB1bmhlYWx0aHlgfWZ1bmN0aW9uIHh3KGUpe2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlICR7dH0ke259YDtyZXR1cm4gZS5sYXN0RXJyb3I/YCR7cn06ICR7ZS5sYXN0RXJyb3J9YDpyfWZ1bmN0aW9uIFN3KGUpe2xldCB0PWhDKGUubGFzdENoZWNrKTtyZXR1cm4gdD9lLnNvdXJjZT9gJHt0fSB2aWEgJHtlLnNvdXJjZX1gOnQ6ZS5zb3VyY2U/YHZpYSAke2Uuc291cmNlfWA6YGB9ZnVuY3Rpb24gQ3coZSl7aWYoZS5jb25zZWN1dGl2ZUZhaWx1cmVzPD0wJiYhZS5sYXN0RXJyb3IpcmV0dXJuIHl3O2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9ICR7dH0gc28gZmFyJHtufWA7cmV0dXJuIGUubGFzdEVycm9yP2Ake3J9OiAke2UubGFzdEVycm9yfWA6cn1mdW5jdGlvbiB3dyhlKXtpZihlLnN0YXRlPT09YHVuaGVhbHRoeWApcmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBkZXN0cnVjdGl2ZWAsY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTp4dyhlKX0sKCk9PmJ3KGUpKTtpZihlLnN0YXRlPT09YGhlYWx0aHlgKXtsZXQgdD1lLmxhdGVuY3lNcz09PXZvaWQgMD9gYDpgIMK3ICR7ZkMoZS5sYXRlbmN5TXMpfWA7cmV0dXJuIEcoYHNwYW5gLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTpTdyhlKX0sYGhlYWx0aHkke3R9YCl9cmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBvdXRsaW5lYCxjbGFzczpgZm9udC1ub3JtYWxgLHRpdGxlOkN3KGUpfSwoKT0+YHVua25vd25gKX1mdW5jdGlvbiBUdygpe3JldHVyblt7aWQ6YG5hbWVgLGhlYWRlcjpgTmFtZWAsYWNjZXNzb3JGbjplPT5lLm5hbWUsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgZm9udC1tZWRpdW1gfSxlLm9yaWdpbmFsLm5hbWUpfSx7aWQ6YHVybGAsaGVhZGVyOmBVUkxgLGFjY2Vzc29yRm46ZT0+ZS51cmwsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgYmxvY2sgbWF4LXcteHMgdHJ1bmNhdGUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTplLm9yaWdpbmFsLnVybH0sZS5vcmlnaW5hbC51cmwpfSx7aWQ6YGhlYWx0aGAsaGVhZGVyOmBIZWFsdGhgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT5lLmhlYWx0aC5zdGF0ZSxjZWxsOih7cm93OmV9KT0+d3coZS5vcmlnaW5hbC5oZWFsdGgpfSx7aWQ6YGFjY2Vzc2AsaGVhZGVyOmBBY2Nlc3NgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT4oZS5hY2Nlc3M/P1tdKS5qb2luKGAsIGApLGNlbGw6KHtyb3c6ZX0pPT57bGV0IHQ9ZS5vcmlnaW5hbC5hY2Nlc3M7cmV0dXJuIHQ/Lmxlbmd0aD9HKGBkaXZgLHtjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LHQubWFwKGU9PkcoZUMse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSwoKT0+ZSkpKTpHKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBBbGwgZ3JvdXBzYCl9fSx2dyhgcmVxTWluYCxgcmVxL21pbmAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1pbnV0ZSksdncoYHJlcURheWAsYHJlcS9kYXlgLGU9PmUuY291bnRlcnMucmVxdWVzdHNQZXJEYXkpLHZ3KGByZXFNb250aGAsYHJlcS9tb250aGAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1vbnRoKV19dmFyIEV3PXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtNmB9LER3PUYoe19fbmFtZTpgVGFyZ2V0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXN4KCksbj1XKCgpPT50LnRhcmdldHMpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT16QygpO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGkudmFsdWUpfWxldCBzPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5tY3BTZXJ2ZXJzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSksYz1XKCgpPT57bGV0IGU9bi52YWx1ZT8uYWdlbnRzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSk7ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlP2EudmFsdWUmJnQ9PT0wP2BubyB0YXJnZXRzIG1hdGNoICIke3IudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgfWxldCB1PVcoKCk9Pmwobi52YWx1ZT8ubWNwU2VydmVycy5sZW5ndGg/PzAscy52YWx1ZS5sZW5ndGgpKSxkPVcoKCk9Pmwobi52YWx1ZT8uYWdlbnRzLmxlbmd0aD8/MCxjLnZhbHVlLmxlbmd0aCkpLGY9VHcoKTtyZXR1cm4oZSx0KT0+KFIoKSx6KGBkaXZgLEV3LFtIKFBDLHttb2RlbFZhbHVlOk4ociksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBGaWx0ZXIgTUNQIHNlcnZlcnMgb3IgYWdlbnRzYCxjbGFzczpgbWF4LXctc21gfSxudWxsLDgsW2Btb2RlbFZhbHVlYF0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMV18fD1bVShgTUNQIHNlcnZlcnNgLC0xKV1dKSxfOjF9KSxIKE4oWWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMl18fD1bVShgQ29uZmlndXJlZCBNQ1AgcHJveHkgdGFyZ2V0cywgdGhlIGdyb3VwcyBhbGxvd2VkIHRvIHJlYWNoIHRoZW0sIGFuZCB0aGVpciByZXF1ZXN0IGNvdW50ZXJzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOk4oZiksZGF0YTpzLnZhbHVlLCJlbXB0eS1tZXNzYWdlIjp1LnZhbHVlfSxudWxsLDgsW2Bjb2x1bW5zYCxgZGF0YWAsYGVtcHR5LW1lc3NhZ2VgXSldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbM118fD1bVShgQWdlbnRzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzRdfHw9W1UoYENvbmZpZ3VyZWQgQTJBIGFnZW50IHByb3h5IHRhcmdldHMsIHRoZSBncm91cHMgYWxsb3dlZCB0byByZWFjaCB0aGVtLCBhbmQgdGhlaXIgcmVxdWVzdCBjb3VudGVycy5gLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSCgkUyx7Y29sdW1uczpOKGYpLGRhdGE6Yy52YWx1ZSwiZW1wdHktbWVzc2FnZSI6ZC52YWx1ZX0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KSxPdz1GKHtfX25hbWU6YFRhYnNgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sb3JpZW50YXRpb246e30sZGlyOnt9LGFjdGl2YXRpb25Nb2RlOnt9LG1vZGVsVmFsdWU6e30sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihSYiksa3MoeyJkYXRhLXNsb3QiOmB0YWJzYCwiZGF0YS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbnx8YGhvcml6b250YWxgfSxOKGkpLHtjbGFzczpOKFl2KShgZ2FwLTIgZ3JvdXAvdGFicyBmbGV4IGRhdGEtaG9yaXpvbnRhbDpmbGV4LWNvbGAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpQKHQ9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx4ZShTcyh0KSkpXSksXzozfSwxNixbYGRhdGEtb3JpZW50YXRpb25gLGBjbGFzc2BdKSl9fSksa3c9Rih7X19uYW1lOmBUYWJzQ29udGVudGAscHJvcHM6e3ZhbHVlOnt9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihOKFZiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtY29udGVudGAsY2xhc3M6TihZdikoYHRleHQtc20gZmxleC0xIG91dGxpbmUtbm9uZWAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLEF3PUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sdmFyaWFudDp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgLGB2YXJpYW50YCk7cmV0dXJuKHIsaSk9PihSKCksQihOKEhiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtbGlzdGAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50fSxOKG4pLHtjbGFzczpOKFl2KShOKE13KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKX0pLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLGp3PUYoe19fbmFtZTpgVGFic1RyaWdnZXJgLHByb3BzOnt2YWx1ZTp7fSxkaXNhYmxlZDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49S3koQ3kodCxgY2xhc3NgKSk7cmV0dXJuKGUscik9PihSKCksQihOKFViKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtdHJpZ2dlcmAsY2xhc3M6TihZdikoYGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IHB4LTEuNSBweS0wLjUgdGV4dC1zbSBmb250LW1lZGl1bSBncm91cC1kYXRhLVt2YXJpYW50PWRlZmF1bHRdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpzaGFkb3ctc20gZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6c2hhZG93LW5vbmUgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0xIGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMSByZWxhdGl2ZSBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWZvcmVncm91bmQvNjAgdHJhbnNpdGlvbi1hbGwgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOnctZnVsbCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6anVzdGlmeS1zdGFydCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgZGFyazp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpob3Zlcjp0ZXh0LWZvcmVncm91bmQgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTBgLGBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpiZy10cmFuc3BhcmVudCBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpiZy10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJvcmRlci10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJnLXRyYW5zcGFyZW50YCxgZGF0YS1hY3RpdmU6YmctYmFja2dyb3VuZCBkYXRhLWFjdGl2ZTp0ZXh0LWZvcmVncm91bmQgZGFyazpkYXRhLWFjdGl2ZTpib3JkZXItaW5wdXQgZGFyazpkYXRhLWFjdGl2ZTpiZy1pbnB1dC8zMCBkYXJrOmRhdGEtYWN0aXZlOnRleHQtZm9yZWdyb3VuZGAsYGFmdGVyOmFic29sdXRlIGFmdGVyOmJnLWZvcmVncm91bmQgYWZ0ZXI6b3BhY2l0eS0wIGFmdGVyOnRyYW5zaXRpb24tb3BhY2l0eSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjppbnNldC14LTAgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6YWZ0ZXI6Ym90dG9tLVstNXB4XSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjpoLTAuNSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6aW5zZXQteS0wIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczphZnRlcjotcmlnaHQtMSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6dy0wLjUgZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6YWZ0ZXI6b3BhY2l0eS0xMDBgLHQuY2xhc3MpfSxOKG4pKSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGNsYXNzYF0pKX19KSxNdz1DXyhgcm91bmRlZC1sZyBwLTAuNzUgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6aC04IGRhdGEtW3ZhcmlhbnQ9bGluZV06cm91bmRlZC1ub25lIGdyb3VwL3RhYnMtbGlzdCBpbmxpbmUtZmxleCB3LWZpdCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczpoLWZpdCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6ZmxleC1jb2xgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctbXV0ZWRgLGxpbmU6YGdhcC0xIGJnLXRyYW5zcGFyZW50YH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7ZnVuY3Rpb24gTncoZSx0LG4scj1TdHJpbmcsaT0hMCl7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT57aWYoZS5vcmlnaW5hbC5zdG9yZURvd24pcmV0dXJuYD9gO2xldCB0PW4oZS5vcmlnaW5hbCk7cmV0dXJuIGk/Ryhfdyx7dmFsdWU6dH0pOnIodCl9fX1mdW5jdGlvbiBQdyhlLHQsbil7cmV0dXJuW3tpZDpgaWRgLGhlYWRlcjplLGFjY2Vzc29yRm46ZT0+ZS5pZCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmBmb250LW1lZGl1bWB9LGUub3JpZ2luYWwuaWQpfSx7aWQ6YHNlY29uZGFyeWAsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LG4oZS5vcmlnaW5hbCkpfSx7aWQ6YGxpbWl0c2AsaGVhZGVyOmBMaW1pdHNgLGFjY2Vzc29yRm46ZT0+eEMoZS5saW1pdHMpLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHhDKGUub3JpZ2luYWwubGltaXRzKSl9LE53KGByZXFNaW5gLGByZXEvbWluYCxlPT5lLnJlcXVlc3RzUGVyTWludXRlKSxOdyhgcmVxRGF5YCxgcmVxL2RheWAsZT0+ZS5yZXF1ZXN0c1BlckRheSksTncoYHRva0luRGF5YCxgdG9rSW4vZGF5YCxlPT5lLnRva2Vuc0luUGVyRGF5KSxOdyhgdG9rT3V0RGF5YCxgdG9rT3V0L2RheWAsZT0+ZS50b2tlbnNPdXRQZXJEYXkpLE53KGB0b2tJbk1vbnRoYCxgdG9rSW4vbW9udGhgLGU9PmUudG9rZW5zSW5QZXJNb250aCksTncoYHRva091dE1vbnRoYCxgdG9rT3V0L21vbnRoYCxlPT5lLnRva2Vuc091dFBlck1vbnRoKSxOdyhgY29zdERheWAsYGNvc3QvZGF5YCxlPT5lLmNvc3RQZXJEYXlNaWNyb1VzZCxhQywhMSksTncoYGNvc3RNb250aGAsYGNvc3QvbW9udGhgLGU9PmUuY29zdFBlck1vbnRoTWljcm9Vc2QsYUMsITEpXX12YXIgRnc9Rih7X19uYW1lOmBVc2FnZVRhYmxlYCxwcm9wczp7aWRMYWJlbDp7fSxlbnRyaWVzOnt9LHNlY29uZGFyeUNvbHVtbkxhYmVsOnt9LHNlY29uZGFyeVZhbHVlOnt0eXBlOkZ1bmN0aW9ufSxlbXB0eU1lc3NhZ2U6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5Qdyh0LmlkTGFiZWwsdC5zZWNvbmRhcnlDb2x1bW5MYWJlbCx0LnNlY29uZGFyeVZhbHVlKSk7cmV0dXJuKHQscik9PihSKCksQigkUyx7Y29sdW1uczpuLnZhbHVlLGRhdGE6ZS5lbnRyaWVzLCJlbXB0eS1tZXNzYWdlIjplLmVtcHR5TWVzc2FnZSwicm93LWNsYXNzIjplPT5lLnN0b3JlRG93bj9gYmctZGVzdHJ1Y3RpdmUvMTBgOnZvaWQgMH0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYCxgcm93LWNsYXNzYF0pKX19KTtmdW5jdGlvbiBJdyhlLHQpe3JldHVybiBlLmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModCl9ZnVuY3Rpb24gTHcoZSx0KXtyZXR1cm4gZS5pZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIFJ3KGUsdCl7cmV0dXJuIHQuZmlsdGVyKHQ9PnQuZ3JvdXBOYW1lPT09ZS5pZCl9ZnVuY3Rpb24gencoZSx0LG4pe3JldHVybiBSdyhlLHQpLmZpbHRlcihlPT5JdyhlLG4pKX1mdW5jdGlvbiBCdyhlLHQsbil7cmV0dXJuIEx3KGUsbil8fHp3KGUsdCxuKS5sZW5ndGg+MH12YXIgVnc9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sSHc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sVXc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sV3c9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sR3c9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sS3c9e2tleTowLGNsYXNzOmBtYi0zIGZsZXggZmxleC13cmFwIGdhcC14LTQgZ2FwLXktMSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHF3PXtjbGFzczpgZmxleCBmbGV4LTEgZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAteC00IGdhcC15LTEgcHItMiB0ZXh0LWxlZnRgfSxKdz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sWXc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0YWJ1bGFyLW51bXNgfSxYdz17Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LFp3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sUXc9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LCR3PXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LGVUPXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sdFQ9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sblQ9e2tleToxLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxyVD17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxpVD17a2V5OjEsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGFUPXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LG9UPXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sc1Q9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LGNUPXtjbGFzczpgdGFidWxhci1udW1zYH0sbFQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSx1VD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LGRUPXtjbGFzczpgdGFidWxhci1udW1zYH0sZlQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSxwVD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LG1UPXtrZXk6MixjbGFzczpgcHktNiB0ZXh0LWNlbnRlciB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGhUPWBHbG9iIHBhdHRlcm4g4oCUIG1hdGNoZXMgbGlrZSBhIHNoZWxsIHdpbGRjYXJkICgqLCA/LCBbLi4uXSlgLGdUPUYoe19fbmFtZTpgVXNhZ2VWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC51c2FnZSkscj1XKCgpPT57bGV0IGU9e307Zm9yKGxldCBuIG9mIHQub3ZlcnZpZXc/Lmdyb3Vwcz8/W10pZVtuLm5hbWVdPW4ubWVtYmVyQ291bnQ7cmV0dXJuIGV9KTtmdW5jdGlvbiBpKGUpe3JldHVybiBlLmdyb3VwTmFtZT8/YGB9ZnVuY3Rpb24gYShlKXtsZXQgdD1yLnZhbHVlW2UuaWRdO3JldHVybiB0PT09dm9pZCAwP2BgOlN0cmluZyh0KX1sZXR7cXVlcnk6byxub3JtYWxpemVkOnMsaGFzUXVlcnk6Y309ekMoKSxsPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5ncm91cHM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4gZS5maWx0ZXIoZT0+QncoZSx0LHMudmFsdWUpKX0pLHU9VygoKT0+Yy52YWx1ZT9sLnZhbHVlLmZpbHRlcihlPT4hTHcoZSxzLnZhbHVlKSkubWFwKGU9PmUuaWQpOltdKTtmdW5jdGlvbiBkKGUpe2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4hYy52YWx1ZXx8THcoZSxzLnZhbHVlKT9SdyhlLHQpOnp3KGUsdCxzLnZhbHVlKX1sZXQgZj1XKCgpPT5uLnZhbHVlPy5ncm91cHMubGVuZ3RoP2MudmFsdWU/YG5vIGdyb3VwcyBtYXRjaCAiJHtvLnZhbHVlfSJgOmBub25lYDpgbm9uZSBjb25maWd1cmVkYCkscD1XKCgpPT57bGV0IGU9bi52YWx1ZT8udXNlcnM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/Lmdyb3Vwcz8/W10scj1uZXcgU2V0KHQuZmlsdGVyKGU9Pkx3KGUscy52YWx1ZSkpLm1hcChlPT5lLmlkKSk7cmV0dXJuIGUuZmlsdGVyKGU9Pkl3KGUscy52YWx1ZSl8fGUuZ3JvdXBOYW1lIT09dm9pZCAwJiZyLmhhcyhlLmdyb3VwTmFtZSkpfSksbT1XKCgpPT5uLnZhbHVlPy51c2Vycy5sZW5ndGg/Yy52YWx1ZT9gbm8gdXNlcnMgbWF0Y2ggIiR7by52YWx1ZX0iYDpgbm9uZWA6YG5vbmUgY29uZmlndXJlZGApLGg9UHcoYE5hbWVgLGBNZW1iZXJzYCxhKSxnPU0oW10pLF89QlMoe2dldCBkYXRhKCl7cmV0dXJuIGwudmFsdWV9LGdldCBjb2x1bW5zKCl7cmV0dXJuIGh9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsZyksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIGcudmFsdWV9fX0pLHY9VygoKT0+Xy5nZXRSb3dNb2RlbCgpLnJvd3MpLHk9bmV3IFNldChbYGlkYCxgc2Vjb25kYXJ5YCxgcmVxRGF5YCxgY29zdERheWBdKSxiPVcoKCk9Pl8uZ2V0SGVhZGVyR3JvdXBzKClbMF0uaGVhZGVycy5maWx0ZXIoZT0+eS5oYXMoZS5jb2x1bW4uaWQpKSkseD1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSxTPVcoKCk9PkJDKHgsYy52YWx1ZSx1LnZhbHVlKSk7ZnVuY3Rpb24gQyhlKXtWQyh4LGUsUy52YWx1ZS5oYXMoZSkpfWxldCB3PVcoe2dldDooKT0+QXJyYXkuZnJvbShTLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIFMudmFsdWUpdC5oYXMoZSl8fEMoZSk7Zm9yKGxldCBlIG9mIHQpUy52YWx1ZS5oYXMoZSl8fEMoZSl9fSk7RXIobyxlPT57ZS50cmltKCk9PT1gYCYmSEMoeCl9KTtmdW5jdGlvbiBlZShlKXtyZXR1cm4vWyo/W10vLnRlc3QoZSl9cmV0dXJuKGUsdCk9PihSKCkseihgZGl2YCxWdyxbSChQQyx7bW9kZWxWYWx1ZTpOKG8pLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+aihvKT9vLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzIG9yIGdyb3Vwc2AsY2xhc3M6YG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKSxuLnZhbHVlPyhSKCksQihOKHFiKSx7a2V5OjB9LHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsyXXx8PVtVKGBUb3RhbGAsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFszXXx8PVtVKGBVc2FnZSBzdW1tZWQgYWNyb3NzIGV2ZXJ5IHVzZXIgYW5kIGdyb3VwIGNvbWJpbmVkLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTQgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLG51bGwsW3RbNF18fD1WKGBwYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBSZXF1ZXN0cy9kYXlgLC0xKSxWKGBwYCxIdyxbSChfdyx7dmFsdWU6bi52YWx1ZS50b3RhbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs1XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBpbi9kYXlgLC0xKSxWKGBwYCxVdyxbSChfdyx7dmFsdWU6bi52YWx1ZS50b3RhbC50b2tlbnNJblBlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs2XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBvdXQvZGF5YCwtMSksVihgcGAsV3csW0goX3cse3ZhbHVlOm4udmFsdWUudG90YWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKV0pXSksVihgZGl2YCxudWxsLFt0WzddfHw9VihgcGAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQ29zdC9kYXlgLC0xKSxWKGBwYCxHdyxrKE4oYUMpKG4udmFsdWUudG90YWwuY29zdFBlckRheU1pY3JvVXNkKSksMSldKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKSxIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzhdfHw9W1UoYEdyb3Vwc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFs5XXx8PVtVKGBFeHBhbmQgYSBncm91cCB0byBzZWUgaXRzIG1lbWJlciB1c2Vycycgb3duIHVzYWdlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9Plt2LnZhbHVlLmxlbmd0aD8oUigpLHooYGRpdmAsS3csWyhSKCEwKSx6KEwsbnVsbCxtYShiLnZhbHVlLGU9PihSKCksQihIUyx7a2V5OmUuaWQsaGVhZGVyOmV9LG51bGwsOCxbYGhlYWRlcmBdKSkpLDEyOCkpXSkpOlRzKGBgLCEwKSx2LnZhbHVlLmxlbmd0aD8oUigpLEIoTihGQykse2tleToxLG1vZGVsVmFsdWU6dy52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFsxXXx8PWU9PncudmFsdWU9ZSx0eXBlOmBtdWx0aXBsZWAsY2xhc3M6YHJvdW5kZWQtbWQgYm9yZGVyIHB4LTNgfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHYudmFsdWUsZT0+KFIoKSxCKE4oTEMpLHtrZXk6ZS5vcmlnaW5hbC5pZCx2YWx1ZTplLm9yaWdpbmFsLmlkfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCxxdyxbVihgc3BhbmAsSncsayhlLm9yaWdpbmFsLmlkKSwxKSxWKGBzcGFuYCxZdyxrKGEoZS5vcmlnaW5hbCl8fGAwYCkrYCBtZW1iZXJzYCwxKSxWKGBzcGFuYCxYdyxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihfdyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSkpLHRbMTBdfHw9VShgIHJlcS9kYXkgYCwtMSldKSxWKGBzcGFuYCxadyxrKGUub3JpZ2luYWwuc3RvcmVEb3duP2A/YDpOKGFDKShlLm9yaWdpbmFsLmNvc3RQZXJEYXlNaWNyb1VzZCkpK2AvZGF5IGAsMSldKV0pLF86Mn0sMTAyNCksSChOKElDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBkbGAsUXcsW1YoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOmhUfSxgUHJvdmlkZXJzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwucHJvdmlkZXJzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLCR3LFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5wcm92aWRlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLGVULGBBbGwgcHJvdmlkZXJzYCkpXSldKSxWKGBkaXZgLG51bGwsW1YoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTpoVH0sYE1vZGVsc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1vZGVscz8ubGVuZ3RoPyhSKCkseihgZGl2YCx0VCxbKFIoITApLHooTCxudWxsLG1hKGUub3JpZ2luYWwubW9kZWxzLGU9PihSKCkseihMLHtrZXk6ZX0sW2VlKGUpPyhSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbW9ubyBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZSksMSldKSxfOjJ9LDEwMjQpKTooUigpLEIoQ0Mse2tleTowLGlkOmV9LG51bGwsOCxbYGlkYF0pKV0sNjQpKSksMTI4KSldKSk6KFIoKSx6KGBzcGFuYCxuVCxgQWxsIG1vZGVsc2ApKV0pXSksVihgZGl2YCxudWxsLFtWKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsdGl0bGU6aFR9LGBNQ1Agc2VydmVyc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1jcFNlcnZlcnM/Lmxlbmd0aD8oUigpLHooYGRpdmAsclQsWyhSKCEwKSx6KEwsbnVsbCxtYShlLm9yaWdpbmFsLm1jcFNlcnZlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLGlULGBBbGwgTUNQIHNlcnZlcnNgKSldKV0pLFYoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOmhUfSxgQWdlbnRzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwuYWdlbnRzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLGFULFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5hZ2VudHMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLG9ULGBBbGwgYWdlbnRzYCkpXSldKV0pLFYoYGRsYCxzVCxbVihgZGl2YCxudWxsLFt0WzExXXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYExpbWl0c2AsLTEpLFYoYGRkYCxudWxsLGsoTih4QykoZS5vcmlnaW5hbC5saW1pdHMpKSwxKV0pLFYoYGRpdmAsbnVsbCxbdFsxMl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGByZXEvbWluYCwtMSksVihgZGRgLGNULFtlLm9yaWdpbmFsLnN0b3JlRG93bj8oUigpLHooTCx7a2V5OjB9LFtVKGA/YCldLDY0KSk6KFIoKSxCKF93LHtrZXk6MSx2YWx1ZTplLm9yaWdpbmFsLnJlcXVlc3RzUGVyTWludXRlfSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxM118fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9kYXlgLC0xKSxWKGBkZGAsbFQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zSW5QZXJEYXl9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE0XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva091dC9kYXlgLC0xKSxWKGBkZGAsdVQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9tb250aGAsLTEpLFYoYGRkYCxkVCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihfdyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNJblBlck1vbnRofSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tPdXQvbW9udGhgLC0xKSxWKGBkZGAsZlQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyTW9udGh9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE3XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYGNvc3QvbW9udGhgLC0xKSxWKGBkZGAscFQsayhlLm9yaWdpbmFsLnN0b3JlRG93bj9gP2A6TihhQykoZS5vcmlnaW5hbC5jb3N0UGVyTW9udGhNaWNyb1VzZCkpLDEpXSldKSx0WzE4XXx8PVYoYHBgLHtjbGFzczpgbWItMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYE1lbWJlcnNgLC0xKSxIKEZ3LHsiaWQtbGFiZWwiOmBOYW1lYCwic2Vjb25kYXJ5LWNvbHVtbi1sYWJlbCI6YEdyb3VwYCxlbnRyaWVzOmQoZS5vcmlnaW5hbCksInNlY29uZGFyeS12YWx1ZSI6aX0sbnVsbCw4LFtgZW50cmllc2BdKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxtVCxrKGYudmFsdWUpLDEpKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxOV18fD1bVShgVXNlcnNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChGdyx7ImlkLWxhYmVsIjpgTmFtZWAsInNlY29uZGFyeS1jb2x1bW4tbGFiZWwiOmBHcm91cGAsZW50cmllczpwLnZhbHVlLCJzZWNvbmRhcnktdmFsdWUiOmksImVtcHR5LW1lc3NhZ2UiOm0udmFsdWV9LG51bGwsOCxbYGVudHJpZXNgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KTtmdW5jdGlvbiBfVChlLHQsbil7bGV0IHI9ZS5zdGFydHNXaXRoKGAjYCk/ZS5zbGljZSgxKTplO3JldHVybiB0LmluY2x1ZGVzKHIpP3I6bn1mdW5jdGlvbiB2VChlKXtyZXR1cm5gIyR7ZX1gfWZ1bmN0aW9uIHlUKHt2YWxpZFRhYnM6ZSxkZWZhdWx0VGFiOnR9KXtsZXQgbj10eXBlb2Ygd2luZG93PGB1YCxyPU0obj9fVCh3aW5kb3cubG9jYXRpb24uaGFzaCxlLHQpOnQpO0VyKHIsZT0+e2lmKCFuKXJldHVybjtsZXQgdD12VChlKTt3aW5kb3cubG9jYXRpb24uaGFzaCE9PXQmJndpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLGBgLHQpfSk7ZnVuY3Rpb24gaSgpe3IudmFsdWU9X1Qod2luZG93LmxvY2F0aW9uLmhhc2gsZSx0KX1yZXR1cm4gbiYmKFppKCgpPT53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpLHRhKCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpKSxyfXZhciBiVD0oZnVuY3Rpb24oKXtsZXQgZT10eXBlb2YgZG9jdW1lbnQ8YHVgJiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYCkucmVsTGlzdDtyZXR1cm4gZSYmZS5zdXBwb3J0cyYmZS5zdXBwb3J0cyhgbW9kdWxlcHJlbG9hZGApP2Btb2R1bGVwcmVsb2FkYDpgcHJlbG9hZGB9KSgpLHhUPWZ1bmN0aW9uKGUpe3JldHVybmAvYWRtaW4vYCtlfSxTVD17fSxDVD1mdW5jdGlvbihlLHQsbil7bGV0IHI9UHJvbWlzZS5yZXNvbHZlKCk7aWYodCYmdC5sZW5ndGg+MCl7bGV0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYGxpbmtgKSxpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXWApLGE9aT8ubm9uY2V8fGk/LmdldEF0dHJpYnV0ZShgbm9uY2VgKTtmdW5jdGlvbiBvKGUpe3JldHVybiBQcm9taXNlLmFsbChlLm1hcChlPT5Qcm9taXNlLnJlc29sdmUoZSkudGhlbihlPT4oe3N0YXR1czpgZnVsZmlsbGVkYCx2YWx1ZTplfSksZT0+KHtzdGF0dXM6YHJlamVjdGVkYCxyZWFzb246ZX0pKSkpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGltcG9ydC5tZXRhLnJlc29sdmU/aW1wb3J0Lm1ldGEucmVzb2x2ZShlKTpuZXcgVVJMKGUsaW1wb3J0Lm1ldGEudXJsKS5ocmVmfXI9byh0Lm1hcCh0PT57aWYodD14VCh0LG4pLHQ9cyh0KSx0IGluIFNUKXJldHVybjtTVFt0XT0hMDtsZXQgcj10LmVuZHNXaXRoKGAuY3NzYCk7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCBpPWVbbl07aWYoaS5ocmVmPT09dCYmKCFyfHxpLnJlbD09PWBzdHlsZXNoZWV0YCkpcmV0dXJufWxldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGxpbmtgKTtpZihpLnJlbD1yP2BzdHlsZXNoZWV0YDpiVCxyfHwoaS5hcz1gc2NyaXB0YCksaS5jcm9zc09yaWdpbj1gYCxpLmhyZWY9dCxhJiZpLnNldEF0dHJpYnV0ZShgbm9uY2VgLGEpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSkscilyZXR1cm4gbmV3IFByb21pc2UoKGUsbik9PntpLmFkZEV2ZW50TGlzdGVuZXIoYGxvYWRgLGUpLGkuYWRkRXZlbnRMaXN0ZW5lcihgZXJyb3JgLCgpPT5uKEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7dH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShlKXtsZXQgdD1uZXcgRXZlbnQoYHZpdGU6cHJlbG9hZEVycm9yYCx7Y2FuY2VsYWJsZTohMH0pO2lmKHQucGF5bG9hZD1lLHdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpLCF0LmRlZmF1bHRQcmV2ZW50ZWQpdGhyb3cgZX1yZXR1cm4gci50aGVuKHQ9Pntmb3IobGV0IGUgb2YgdHx8W10pZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZpKGUucmVhc29uKTtyZXR1cm4gZSgpLmNhdGNoKGkpfSl9LHdUPXtjbGFzczpgZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTYgcHgtNCBweS04IHNtOnB4LTYgbGc6cHgtOGB9LFRUPXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMWB9LEVUPXtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yYH0sRFQ9e2NsYXNzOmBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sT1Q9YGh0dHBzOi8vZ2l0aHViLmNvbS9sdWthc3pyYWN6eWxvL3RyYWVmaWstbGxtZ2F0ZXdheWAsa1Q9bXUoRih7X19uYW1lOmBBcHBgLHNldHVwKGUpe2xldCB0PUxpKCgpPT5DVCgoKT0+aW1wb3J0KGAuL0NoYXJ0c1ZpZXctLTVQZ0tiVjkuanNgKSxbXSkpLG49cngoKSxyPXN4KCksaT15VCh7dmFsaWRUYWJzOltgcHJvdmlkZXJzYCxgdXNhZ2VgLGBjaGFydHNgLGB0YXJnZXRzYF0sZGVmYXVsdFRhYjpgcHJvdmlkZXJzYH0pLGE9VygoKT0+ci5lcnJvcj9gcmVmcmVzaCBmYWlsZWQ6ICR7ci5lcnJvcn1gOnIubGFzdFVwZGF0ZWQ/YGxhc3QgdXBkYXRlZCAke3IubGFzdFVwZGF0ZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDpgbG9hZGluZy4uLmApO3JldHVybiBaaSgoKT0+e3Iuc3RhcnRQb2xsaW5nKCl9KSwoZSxvKT0+e2xldCBzPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsd1QsW1YoYGhlYWRlcmAsVFQsW1YoYGRpdmAsRVQsW29bMV18fD1WKGBoMWAse2NsYXNzOmB0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRgfSxgTExNIEdhdGV3YXkg4oCUIEFkbWluYCwtMSksSChOKFdiKSx7YXM6YGFgLGhyZWY6T1QsdGFyZ2V0OmBfYmxhbmtgLHJlbDpgbm9vcGVuZXIgbm9yZWZlcnJlcmAsdmFyaWFudDpgZ2hvc3RgLHNpemU6YGljb25gLCJhcmlhLWxhYmVsIjpgR2l0SHViIHJlcG9zaXRvcnlgLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kYH0se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKG5fKSxjbGFzczpgc2l6ZS00YCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKV0pLF86MX0pXSksVihgcGAsRFQsW04ocikuZXJyb3I/KFIoKSxCKHMse2tleTowLGljb246TihsXyksY2xhc3M6YHNpemUtMy41IHRleHQtZGVzdHJ1Y3RpdmVgfSxudWxsLDgsW2BpY29uYF0pKTpUcyhgYCwhMCksVihgc3BhbmAse2NsYXNzOk8oTihyKS5lcnJvcj9gdGV4dC1kZXN0cnVjdGl2ZWA6dm9pZCAwKX0sayhhLnZhbHVlKSwzKV0pXSksTihuKS5pc0F1dGhlbnRpY2F0ZWQ/KFIoKSxCKE4oT3cpLHtrZXk6MSxtb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOm9bMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsfSx7ZGVmYXVsdDpQKCgpPT5bSChOKEF3KSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oancpLHt2YWx1ZTpgcHJvdmlkZXJzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bMl18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKGp3KSx7dmFsdWU6YHVzYWdlYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bM118fD1bVShgVXNhZ2VgLC0xKV1dKSxfOjF9KSxIKE4oancpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bNF18fD1bVShgQ2hhcnRzYCwtMSldXSksXzoxfSksSChOKGp3KSx7dmFsdWU6YHRhcmdldHNgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1s1XXx8PVtVKGBNQ1AgJiBBZ2VudHNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihrdykse3ZhbHVlOmBwcm92aWRlcnNgfSx7ZGVmYXVsdDpQKCgpPT5bSChwdyldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgdXNhZ2VgfSx7ZGVmYXVsdDpQKCgpPT5bSChnVCldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+W0goTih0KSldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgdGFyZ2V0c2B9LHtkZWZhdWx0OlAoKCk9PltIKER3KV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSxCKGd4LHtrZXk6MH0pKV0pfX19KSk7a1QudXNlKFZnKCkpLGtULmNvbXBvbmVudChgRm9udEF3ZXNvbWVJY29uYCxDZyksa1QubW91bnQoYCNhcHBgKTtleHBvcnR7VnIgYXMgJCxreSBhcyBBLFp0IGFzIEF0LFR5IGFzIEIsZ2UgYXMgQnQscXkgYXMgQyx3ciBhcyBDdCxWeSBhcyBELG9uIGFzIER0LFV5IGFzIEUsRmUgYXMgRXQsYnkgYXMgRix5biBhcyBGdCxZdiBhcyBHLHN5IGFzIEgsZnkgYXMgSSxtbiBhcyBJdCxzXyBhcyBKLHVfIGFzIEssZ3kgYXMgTCxOIGFzIEx0LEZ5IGFzIE0sZW4gYXMgTXQsSXkgYXMgTix1biBhcyBOdCxOeSBhcyBPLGogYXMgT3QsZHkgYXMgUCxBIGFzIFB0LEwgYXMgUSxDeSBhcyBSLE8gYXMgUnQsWXkgYXMgUyxDciBhcyBTdCxHeSBhcyBULG5jIGFzIFR0LG95IGFzIFUsY3kgYXMgVixrIGFzIFZ0LGF5IGFzIFcsQ2cgYXMgWCx0XyBhcyBZLGl1IGFzIFosSmIgYXMgXyxtYSBhcyBfdCxPdyBhcyBhLFUgYXMgYXQsbmIgYXMgYixpYyBhcyBidCxTQyBhcyBjLFNzIGFzIGN0LHN4IGFzIGQsa3MgYXMgZHQsVyBhcyBldCxpeCBhcyBmLFFuIGFzIGZ0LFhiIGFzIGcsUiBhcyBndCxaYiBhcyBoLHRhIGFzIGh0LEF3IGFzIGkseiBhcyBpdCxBeSBhcyBqLE0gYXMganQsT3kgYXMgayxJZSBhcyBrdCxzQyBhcyBsLEcgYXMgbHQscnggYXMgbSxaaSBhcyBtdCxJdyBhcyBuLEIgYXMgbnQsekMgYXMgbyxIIGFzIG90LGF4IGFzIHAsZWEgYXMgcHQsbV8gYXMgcSxqdyBhcyByLFRzIGFzIHJ0LFBDIGFzIHMsRiBhcyBzdCxCdyBhcyB0LFYgYXMgdHQsb0MgYXMgdSxQYSBhcyB1dCxxYiBhcyB2LEkgYXMgdnQsS3kgYXMgdyxQIGFzIHd0LCR5IGFzIHgsRXIgYXMgeHQsd2IgYXMgeSx1YSBhcyB5dCx3eSBhcyB6LHhlIGFzIHp0fTs=", ), }, } diff --git a/webui/src/lib/format.spec.ts b/webui/src/lib/format.spec.ts index d0eb5c8..ffc4b13 100644 --- a/webui/src/lib/format.spec.ts +++ b/webui/src/lib/format.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { formatCompactCount, formatContextWindow, formatLatencyMs, formatModelCostHover, formatUntil, refreshDetailLabel, refreshLabel } from './format' +import { formatCompactCount, formatContextWindow, formatElapsedAgo, formatLatencyMs, formatModelCostHover, formatUntil, refreshDetailLabel, refreshLabel } from './format' const ZERO_TIME = '0001-01-01T00:00:00Z' @@ -183,3 +183,46 @@ describe('formatLatencyMs', () => { expect(formatLatencyMs(ms)).toBe(want) }) }) + +// Target health (feat/target-health): formatElapsedAgo is formatAgo's bare +// "Ns ago" counterpart — no parentheses — so a caller can compose it into +// either "unhealthy (Ns ago)" or "Ns ago via probe" without stripping +// punctuation back out. The explicit `now` parameter keeps every case +// below exact instead of racing Date.now() between computing the fixture +// and asserting on it. +describe('formatElapsedAgo', () => { + const now = new Date('2026-09-03T12:00:00Z').getTime() + + it('renders "" for the unset zero-time sentinel', () => { + expect(formatElapsedAgo(ZERO_TIME, now)).toBe('') + }) + + it('renders "" for undefined', () => { + expect(formatElapsedAgo(undefined, now)).toBe('') + }) + + it('renders "" for an unparseable timestamp', () => { + expect(formatElapsedAgo('not-a-date', now)).toBe('') + }) + + it('renders "0s ago" for a timestamp equal to now', () => { + expect(formatElapsedAgo(new Date(now).toISOString(), now)).toBe('0s ago') + }) + + it('renders "Ns ago" for a timestamp seconds in the past', () => { + expect(formatElapsedAgo(new Date(now - 42_000).toISOString(), now)).toBe('42s ago') + }) + + it('renders whole elapsed seconds for a timestamp minutes in the past — no unit beyond seconds', () => { + expect(formatElapsedAgo(new Date(now - 90_000).toISOString(), now)).toBe('90s ago') + }) + + it('floors a future timestamp at 0s rather than showing a negative countdown (defensive — a clock-skewed lastCheck)', () => { + expect(formatElapsedAgo(new Date(now + 5_000).toISOString(), now)).toBe('0s ago') + }) + + it('defaults `now` to Date.now() when omitted', () => { + const iso = new Date(Date.now() - 5_000).toISOString() + expect(formatElapsedAgo(iso)).toMatch(/^\d+s ago$/) + }) +}) diff --git a/webui/src/lib/format.ts b/webui/src/lib/format.ts index 00426f3..c2fca51 100644 --- a/webui/src/lib/format.ts +++ b/webui/src/lib/format.ts @@ -162,13 +162,42 @@ export function formatLatencyMs(ms: number): string { return `${(ms / 1000).toFixed(1)}s` } +/** + * elapsedSecondsSince computes whole seconds between `iso` and `now`, or + * null for the unset zero-time sentinel or an unparseable value — the + * shared guard formatAgo and formatElapsedAgo below both build on, so + * neither duplicates the sentinel/NaN check. + */ +function elapsedSecondsSince(iso: string | undefined, now: number): number | null { + if (!iso || iso === ZERO_TIME) return null + const then = new Date(iso).getTime() + if (Number.isNaN(then)) return null + return Math.max(0, Math.round((now - then) / 1000)) +} + /** formatAgo renders an ISO timestamp as "(Ns ago)", or "" for the unset zero-time sentinel. */ export function formatAgo(iso: string | undefined): string { - if (!iso || iso === ZERO_TIME) return '' - const then = new Date(iso).getTime() - if (Number.isNaN(then)) return '' - const secs = Math.max(0, Math.round((Date.now() - then) / 1000)) - return ` (${secs}s ago)` + const secs = elapsedSecondsSince(iso, Date.now()) + return secs === null ? '' : ` (${secs}s ago)` +} + +/** + * formatElapsedAgo renders elapsed time since an ISO timestamp as a bare + * "Ns ago" string — no surrounding parentheses, unlike formatAgo above + * (every existing formatAgo caller depends on its own " (Ns ago)" shape + * unchanged, so that convention stays untouched here). Target health + * badges (AdminTargetHealthView, TargetsView's health column — feat/ + * target-health) are the only caller today: a target's `lastCheck` needs + * this bare form both standalone ("unhealthy (Ns ago)", parenthesized by + * the caller) and inline ("Ns ago via probe"). The optional `now` + * parameter (default Date.now()) makes the elapsed-time math + * deterministic under test. "" for the unset zero-time sentinel or an + * unparseable timestamp, mirroring formatAgo's own "nothing to show" + * convention. + */ +export function formatElapsedAgo(iso: string | undefined, now = Date.now()): string { + const secs = elapsedSecondsSince(iso, now) + return secs === null ? '' : `${secs}s ago` } /** diff --git a/webui/src/lib/target-columns.spec.ts b/webui/src/lib/target-columns.spec.ts new file mode 100644 index 0000000..cf70b30 --- /dev/null +++ b/webui/src/lib/target-columns.spec.ts @@ -0,0 +1,158 @@ +import { isVNode } from 'vue' +import { describe, expect, it } from 'vitest' + +import { Badge } from '@/components/ui/badge' +import { targetColumns } from './target-columns' +import type { AdminTargetHealthView, AdminTargetView } from '@/types/api' + +/** + * Target health rendering (feat/target-health): mirrors usage-columns. + * spec.ts's own approach of exercising a ColumnDef's `cell` renderer + * directly (no component mount needed — vite.config.ts's `test` block + * runs vitest in the 'node' environment with no @vue/test-utils/jsdom in + * this package, so there is no existing "mount a .vue view" pattern to + * follow here; the health column's rendering logic lives entirely in this + * plain TanStack ColumnDef, exactly like usage-columns.ts's own cells, so + * the identical direct-call approach gives full coverage without either). + */ +function testTarget(health: AdminTargetHealthView): AdminTargetView { + return { + name: 'my-server', + url: 'https://mcp.example.com', + counters: { requestsPerMinute: 0, requestsPerDay: 0, requestsPerMonth: 0 }, + health, + } +} + +function healthCellOf(target: AdminTargetView): unknown { + const col = targetColumns().find((c) => c.id === 'health') + const cell = col?.cell as (ctx: { row: { original: AdminTargetView } }) => unknown + return cell({ row: { original: target } }) +} + +describe('targetColumns: health column', () => { + it('renders a destructive Badge for unhealthy, with a relative-time label and lastError in the title', () => { + const health: AdminTargetHealthView = { + state: 'unhealthy', + lastCheck: new Date(Date.now() - 42_000).toISOString(), + lastError: 'connection refused', + consecutiveFailures: 3, + source: 'probe', + } + const rendered = healthCellOf(testTarget(health)) + + expect(isVNode(rendered)).toBe(true) + const vnode = rendered as { type: unknown; props?: Record; children?: unknown } + expect(vnode.type).toBe(Badge) + expect(vnode.props?.variant).toBe('destructive') + expect(vnode.props?.title).toBe('3 consecutive failures via probe: connection refused') + + const slot = (vnode.children as { default: () => string }).default + expect(slot()).toMatch(/^unhealthy \(\d+s ago\)$/) + }) + + it('falls back to a bare "unhealthy" label when lastCheck is missing (version-skew defensive case)', () => { + const health: AdminTargetHealthView = { state: 'unhealthy', consecutiveFailures: 1 } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { props?: Record; children?: { default: () => string } } + + expect(vnode.children?.default()).toBe('unhealthy') + // Singular "failure", no "via ", no lastError. + expect(vnode.props?.title).toBe('1 consecutive failure') + }) + + it('renders an outline Badge labeled "unknown" with a fixed explanatory title', () => { + const health: AdminTargetHealthView = { state: 'unknown', consecutiveFailures: 0 } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { type: unknown; props?: Record; children?: { default: () => string } } + + expect(vnode.type).toBe(Badge) + expect(vnode.props?.variant).toBe('outline') + expect(vnode.props?.title).toBe('not observed yet — no traffic and probes disabled or not yet run') + expect(vnode.children?.default()).toBe('unknown') + }) + + it('renders no Badge for healthy — plain muted text with latency, and relative time + source in the title', () => { + const health: AdminTargetHealthView = { + state: 'healthy', + lastCheck: new Date(Date.now() - 5_000).toISOString(), + consecutiveFailures: 0, + latencyMs: 12, + source: 'traffic', + } + const rendered = healthCellOf(testTarget(health)) + + expect(isVNode(rendered)).toBe(true) + const vnode = rendered as { type: unknown; props?: Record; children?: unknown } + expect(vnode.type).toBe('span') + expect(vnode.props?.class).toBe('text-muted-foreground') + // formatLatencyMs (lib/format.ts), not a raw "${latencyMs} ms" — no + // space, matching every other latency reading in this panel. + expect(vnode.children).toBe('healthy · 12ms') + expect(vnode.props?.title).toMatch(/^\d+s ago via traffic$/) + }) + + it('renders the healthy latency suffix in seconds via formatLatencyMs once above 1000ms', () => { + const health: AdminTargetHealthView = { state: 'healthy', consecutiveFailures: 0, latencyMs: 1500 } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { children?: unknown } + expect(vnode.children).toBe('healthy · 1.5s') + }) + + it('omits the latency suffix for healthy when latencyMs is unknown', () => { + const health: AdminTargetHealthView = { state: 'healthy', consecutiveFailures: 0 } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { children?: unknown; props?: Record } + + expect(vnode.children).toBe('healthy') + // Neither lastCheck nor source known — nothing to show in the title. + expect(vnode.props?.title).toBe('') + }) + + it('the health column is not sortable — three semantic states have no meaningful alphabetical order', () => { + const col = targetColumns().find((c) => c.id === 'health') + expect(col?.enableSorting).toBe(false) + }) + + // F4/F7 (feat/target-health review): "unknown" also covers a target + // that HAS been observed but has never succeeded, still below + // failureThreshold — that case carries real failure detail even + // though the label stays "unknown". + it('surfaces failure detail in the unknown badge title for a target observed but never succeeded', () => { + const health: AdminTargetHealthView = { + state: 'unknown', + consecutiveFailures: 2, + source: 'probe', + lastError: 'dial tcp: connection refused', + } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { type: unknown; props?: Record; children?: { default: () => string } } + + expect(vnode.type).toBe(Badge) + expect(vnode.props?.variant).toBe('outline') + expect(vnode.props?.title).toBe('2 failures so far via probe: dial tcp: connection refused') + expect(vnode.children?.default()).toBe('unknown') + }) + + it('singular "failure" and no "via "/lastError when only consecutiveFailures is known', () => { + const health: AdminTargetHealthView = { state: 'unknown', consecutiveFailures: 1 } + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { props?: Record } + expect(vnode.props?.title).toBe('1 failure so far') + }) + + it('falls back to the outline "unknown" badge for any state other than healthy/unhealthy', () => { + // Defensive: healthCell's own state check is an explicit + // state === 'healthy' branch with "unknown" as the fallback for + // everything else — not the reverse — so a value this version of + // the webui does not recognize renders as "unknown", never as a + // silently-wrong "healthy". + const health = { state: 'something-future-versions-might-add', consecutiveFailures: 0 } as unknown as AdminTargetHealthView + const rendered = healthCellOf(testTarget(health)) + const vnode = rendered as { type: unknown; props?: Record; children?: { default: () => string } } + + expect(vnode.type).toBe(Badge) + expect(vnode.props?.variant).toBe('outline') + expect(vnode.children?.default()).toBe('unknown') + }) +}) diff --git a/webui/src/lib/target-columns.ts b/webui/src/lib/target-columns.ts index e818afd..545b3ce 100644 --- a/webui/src/lib/target-columns.ts +++ b/webui/src/lib/target-columns.ts @@ -3,7 +3,8 @@ import { h } from 'vue' import CompactNumber from '@/components/CompactNumber.vue' import { Badge } from '@/components/ui/badge' -import type { AdminTargetView } from '@/types/api' +import { formatElapsedAgo, formatLatencyMs } from '@/lib/format' +import type { AdminTargetHealthView, AdminTargetView } from '@/types/api' /** * numericColumn builds one right-aligned, sortable request-counter @@ -27,16 +28,91 @@ function numericColumn(id: string, header: string, read: (t: AdminTargetView) => } } +// --- target health (feat/target-health) --- +// +// Mirrors ProvidersView.vue's own healthBadgeVariant/healthBadgeLabel +// convention for the discovery circuit breaker: a Badge only for the two +// states worth flagging (unhealthy, unknown); the common healthy case +// renders no badge at all, just muted inline text — the same "nothing to +// show reads as no badge" idiom every health/rate indicator in this panel +// already follows (see AdminTargetHealthView's own doc comment, api.ts, +// for what each field means). + +const UNKNOWN_HEALTH_TITLE = 'not observed yet — no traffic and probes disabled or not yet run' + +/** unhealthyLabel keeps the Badge's own visible text short — "unhealthy (Ns ago)" when lastCheck is known, plain "unhealthy" otherwise (defensive: a version-skewed server response omitting lastCheck on an unhealthy row). */ +function unhealthyLabel(health: AdminTargetHealthView): string { + const ago = formatElapsedAgo(health.lastCheck) + return ago ? `unhealthy (${ago})` : 'unhealthy' +} + +/** unhealthyTitle carries the detail the short label leaves out — consecutiveFailures, source, and lastError (when present) — e.g. "3 consecutive failures via probe: connection refused". */ +function unhealthyTitle(health: AdminTargetHealthView): string { + const failWord = health.consecutiveFailures === 1 ? 'failure' : 'failures' + const sourcePart = health.source ? ` via ${health.source}` : '' + const base = `${health.consecutiveFailures} consecutive ${failWord}${sourcePart}` + return health.lastError ? `${base}: ${health.lastError}` : base +} + +/** healthyTitle is the muted "healthy" text's hover detail — "Ns ago via probe/traffic" — omitting whichever half (relative time, source) the response does not carry. */ +function healthyTitle(health: AdminTargetHealthView): string { + const ago = formatElapsedAgo(health.lastCheck) + if (!ago) return health.source ? `via ${health.source}` : '' + return health.source ? `${ago} via ${health.source}` : ago +} + +/** + * unknownTitle renders the "unknown" badge's hover detail. F4 + * (feat/target-health) reads "unknown" two different ways — see + * AdminTargetHealthView's own doc comment (types/api.ts): never observed + * at all, which gets the generic UNKNOWN_HEALTH_TITLE, or observed but + * never yet succeeded (still below failureThreshold), which carries real + * failure detail (consecutiveFailures/source/lastError) even though the + * label stays "unknown" — this surfaces that detail instead of the + * generic message, mirroring unhealthyTitle's own conditional shape. + */ +function unknownTitle(health: AdminTargetHealthView): string { + if (health.consecutiveFailures <= 0 && !health.lastError) return UNKNOWN_HEALTH_TITLE + const failWord = health.consecutiveFailures === 1 ? 'failure' : 'failures' + const sourcePart = health.source ? ` via ${health.source}` : '' + const base = `${health.consecutiveFailures} ${failWord} so far${sourcePart}` + return health.lastError ? `${base}: ${health.lastError}` : base +} + +/** + * healthCell renders one row's health column: destructive Badge for + * unhealthy, muted plain text (plus " · " and formatLatencyMs when + * latencyMs is known) for the explicit healthy case, and an outline + * "unknown" Badge as the FALLBACK for everything else — not the reverse + * — so a state value this webui build does not recognize renders as + * "unknown" rather than silently reading as healthy. + */ +function healthCell(health: AdminTargetHealthView) { + if (health.state === 'unhealthy') { + return h( + Badge, + { as: 'span', variant: 'destructive', class: 'font-normal', title: unhealthyTitle(health) }, + () => unhealthyLabel(health), + ) + } + if (health.state === 'healthy') { + const latencyPart = health.latencyMs !== undefined ? ` · ${formatLatencyMs(health.latencyMs)}` : '' + return h('span', { class: 'text-muted-foreground', title: healthyTitle(health) }, `healthy${latencyPart}`) + } + return h(Badge, { as: 'span', variant: 'outline', class: 'font-normal', title: unknownTitle(health) }, () => 'unknown') +} + /** * targetColumns builds the shared TanStack `ColumnDef` set both the MCP * servers and the Agents DataTable in TargetsView.vue use (admin.go: * adminTargetView — the two tables share one identical row shape). name is * plain text (not the ModelChip copy treatment — a target name is not a * routable model id); url is muted and truncated with a title attribute - * for the full value; access renders as a Badge per allowed group, or a - * muted "All groups" when unrestricted — the exact idiom UsageView.vue's - * own group Access block already established (Providers/Models/MCP - * servers/Agents dt/dd pairs there). + * for the full value; health is the Badge/muted-text pair healthCell above + * builds (feat/target-health); access renders as a Badge per allowed + * group, or a muted "All groups" when unrestricted — the exact idiom + * UsageView.vue's own group Access block already established (Providers/ + * Models/MCP servers/Agents dt/dd pairs there). */ export function targetColumns(): ColumnDef[] { return [ @@ -57,6 +133,17 @@ export function targetColumns(): ColumnDef[] { row.original.url, ), }, + { + id: 'health', + header: 'Health', + // No natural sort order across three semantic states (healthy/ + // unhealthy/unknown) — plain alphabetical would put "healthy" and + // "unhealthy" beside each other for the wrong reason. Same call the + // access column below makes for its own non-primitive shape. + enableSorting: false, + accessorFn: (t) => t.health.state, + cell: ({ row }) => healthCell(row.original.health), + }, { id: 'access', header: 'Access', diff --git a/webui/src/types/api.ts b/webui/src/types/api.ts index aa0c3d2..9ae27e2 100644 --- a/webui/src/types/api.ts +++ b/webui/src/types/api.ts @@ -316,6 +316,43 @@ export interface AdminTargetCountersView { requestsPerMonth: number } +/** + * One configured MCP server's or A2A agent's current health, matching the + * GET /admin/api/targets `health` object the Go side builds against + * (feat/target-health). Two independent sources feed `state`, never + * conflated: 'traffic' is PASSIVE — recorded from the target's own real + * proxied/federated request traffic as it happens, no extra requests + * sent; 'probe' is the gateway's own lazy health check, triggered + * opportunistically by an operator hitting /metrics, /admin, or a listing + * endpoint (never a background poller). `state` is 'unhealthy' once at + * least the configured `failureThreshold` consecutive failures have been + * observed (whether or not this target has ever succeeded), 'healthy' + * once it has succeeded at least once and stays below that threshold, and + * 'unknown' otherwise. `consecutiveFailures` is always present. + * + * 'unknown' reads two different ways server-side, and only ONE of them + * omits the rest of this object (F4, feat/target-health review): + * - never observed by either source at all: every other field is + * omitted — there is truly nothing to report. + * - observed, but never once succeeded, still below `failureThreshold`: + * every other field is PRESENT — `lastCheck`/`lastError`/`latencyMs`/ + * `source` all carry a real observation, this target simply has not + * answered successfully yet. Do not treat 'unknown' as "no data" for + * this case; check whether `lastCheck` is set instead. + * + * `lastError` is additionally omitted whenever it is empty (a healthy + * target has nothing to show), and `latencyMs`/`source` are omitted only + * when genuinely not known (the never-observed case above). + */ +export interface AdminTargetHealthView { + state: 'healthy' | 'unhealthy' | 'unknown' + lastCheck?: string + lastError?: string + consecutiveFailures: number + latencyMs?: number + source?: 'probe' | 'traffic' +} + /** * One configured MCP server's or A2A agent's row in GET /admin/api/targets * (admin.go: adminTargetView). Access is the group names actually allowed @@ -329,6 +366,8 @@ export interface AdminTargetView { url: string access?: string[] counters: AdminTargetCountersView + /** See AdminTargetHealthView's own doc comment (feat/target-health) — always present, unlike access above. */ + health: AdminTargetHealthView } /** GET /admin/api/targets (admin.go: adminTargetsResponse). */ From 9864fcec0e4f0185fb39654620274e871cac2432 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 08:56:20 +0100 Subject: [PATCH 11/15] fix(target-health): scrub password-masked target URLs out of lastError Go's net/http masks a password in the dialed URL before it builds the *url.Error, so an error from a target configured with a password in its userinfo never contains the raw URL. The verbatim substring guard inside sanitizeProviderErr therefore matched nothing and scrubbed nothing. Both the credential and any api-key query parameter on the same URL leaked through the admin API and the dashboard tooltip. Add sanitizeTargetErr. It tries the plain match first and then, only when the configured userinfo carries a password, rebuilds the exact masked form net/http produces and scrubs against that too. Widen the scrub-order test so the secret straddles the truncation point, which makes it fail if the scrub ever runs after the truncation. Drive every new credential case from a real http.Client error against a closed listener rather than a hand-written string, and assemble those fixture URLs from parts so no whole credential-bearing URL literal sits in the source. Drop the tracker doc paragraph describing a nil-error failure that no caller produces, and remove the wall-clock dependency from the sweep interval test. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- admin_test.go | 45 +++++++++++++++++ target_health.go | 65 ++++++++++++++++++------ target_health_test.go | 114 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 197 insertions(+), 27 deletions(-) diff --git a/admin_test.go b/admin_test.go index cc49aa1..6bbb511 100644 --- a/admin_test.go +++ b/admin_test.go @@ -2642,3 +2642,48 @@ func TestAdminTargets_Health_LastError_ScrubsTargetCredentials(t *testing.T) { t.Errorf("lastError = %q, want scrubbed", got.MCPServers[0].Health.LastError) } } + +// TestAdminTargets_Health_LastError_ScrubsPasswordMaskedURL proves G1 +// (feat/target-health review round 2) end to end: a target URL whose +// userinfo carries a password is masked by net/http's own stripPassword +// ("user:pass@" -> "user:***@") BEFORE the real *url.Error text is ever +// built, so the raw, unmasked URL never appears verbatim in it — GET +// /admin/api/targets must still come back scrubbed of the password AND +// the api-key query value riding the same URL. Uses a REAL error from +// http.Client.Do against 127.0.0.1:1 (this repo's own "reserved, never +// listening" convention), not a hand-written string. +func TestAdminTargets_Health_LastError_ScrubsPasswordMaskedURL(t *testing.T) { + t.Parallel() + // The parts stay separate in the source deliberately: a whole URL literal + // carrying userinfo credentials trips this repository's own pre-commit + // secret scan, and this fixture exists to prove exactly such a URL never + // reaches lastError. See the same note in target_health_test.go. + const secretPart = "sup3rsecret" + rawURL := "http://user:" + secretPart + "@127.0.0.1:1/mcp?api-key=SECRETVALUE" + cfg := newAdminTestConfig() + cfg.MCPServers = map[string]*TargetConfig{"alpha": {URL: rawURL}} + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, gw := newAdminGatewayHandle(t, cfg) + + req, err := http.NewRequest(http.MethodGet, rawURL, nil) + if err != nil { + t.Fatalf("NewRequest: %v", err) + } + _, doErr := http.DefaultClient.Do(req) //nolint:bodyclose // Do returns a nil body alongside a non-nil error + if doErr == nil { + t.Fatal("Do: want an error dialing 127.0.0.1:1") + } + gw.targetHealth.record(targetKindMCP, "alpha", rawURL, false, doErr, 3*time.Millisecond, targetHealthSourceProbe) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, adminRequest(http.MethodGet, adminTargetsPath, "sk-admin1")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200, body=%s", rec.Code, rec.Body.String()) + } + body := rec.Body.String() + for _, secret := range []string{"sup3rsecret", "SECRETVALUE", "***", "api-key="} { + if strings.Contains(body, secret) { + t.Errorf("body = %s, want lastError scrubbed of %q", body, secret) + } + } +} diff --git a/target_health.go b/target_health.go index a16b485..07499a8 100644 --- a/target_health.go +++ b/target_health.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" "net/http" + "net/url" + "strings" "sync" "sync/atomic" "time" @@ -142,21 +144,24 @@ func newTargetHealthTracker(threshold int) *targetHealthTracker { // record accounts one observation (a real proxied request, or an active // probe) for (kind, name): success resets consecutiveFailures to 0 and // clears lastError; failure increments consecutiveFailures and stores -// err's message, truncated to targetHealthMaxErrorRunes (err may be nil -// even on failure — a caller with no Go error to attach, e.g. a bad -// HTTP status alone, still leaves lastError at whatever it previously -// held rather than clearing it, since there IS a new failure to report). +// err's message, truncated to targetHealthMaxErrorRunes. Every caller +// today (probeMCPTarget/probeAgentTarget/recordTargetProxyHealth, below; +// mcpFederatedToolsList/mcpFederatedToolsCall, mcp_federation.go) always +// passes a non-nil err alongside ok=false — a failure with no Go error to +// attach is not a shape this tracker currently has to handle. // rawURL is (kind, name)'s configured target URL — the exact string a -// caller dialed, used ONLY to scrub err's text through sanitizeProviderErr -// (admin.go) before it is stored: a Go *url.Error embeds the dialed URL -// verbatim, so an operator-configured target URL carrying credentials -// (an "api-key" query parameter, userinfo) would otherwise leak through -// GET /admin/api/targets' lastError field the same way an unsanitized -// provider error once could (F1, feat/target-health review). The scrub -// runs BEFORE truncateRunes, not after: truncating first could cut a long -// embedded URL in half, leaving sanitizeProviderErr's exact-substring -// match unable to find it and a fragment of the credential in the -// truncated result. source is targetHealthSourceProbe or +// caller dialed, used ONLY to scrub err's text through sanitizeTargetErr +// (below) before it is stored: a Go *url.Error embeds the dialed URL — +// verbatim, OR with its password masked by net/http's own stripPassword +// when one is present — so an operator-configured target URL carrying +// credentials (an "api-key" query parameter, userinfo) would otherwise +// leak through GET /admin/api/targets' lastError field the same way an +// unsanitized provider error once could (F1, feat/target-health review; +// G1, review round 2, for the password-masked form). The scrub runs +// BEFORE truncateRunes, not after: truncating first could cut a long +// embedded URL in half, leaving the scrub's exact-substring match unable +// to find it and a fragment of the credential in the truncated result. +// source is targetHealthSourceProbe or // targetHealthSourceTraffic — whichever mechanism produced this // observation. func (t *targetHealthTracker) record(kind, name, rawURL string, ok bool, err error, latency time.Duration, source string) { @@ -182,10 +187,40 @@ func (t *targetHealthTracker) record(kind, name, rawURL string, ok bool, err err } e.consecutiveFailures++ if err != nil { - e.lastError = truncateRunes(sanitizeProviderErr(err.Error(), rawURL), targetHealthMaxErrorRunes) + e.lastError = truncateRunes(sanitizeTargetErr(err.Error(), rawURL), targetHealthMaxErrorRunes) } } +// sanitizeTargetErr scrubs msg of rawURL's own credentials, in both forms +// a real error from a call against rawURL can actually carry it (G1, +// feat/target-health review round 2). Go's net/http builds a *url.Error +// via its own unexported stripPassword (net/http/client.go) whenever the +// dialed URL's userinfo carries a password: it rewrites "user:pass@" (and +// a token-as-username-with-no-password, "token:@") to "user:***@" IN THE +// URL BEFORE the error string is ever built — so for such a URL, msg +// never contains rawURL verbatim, and a plain sanitizeProviderErr(msg, +// rawURL) call (admin.go) — which only matches rawURL verbatim — finds +// nothing to scrub, leaking the password and any query-string credential +// riding the same URL (an "api-key" value) straight through. This +// function first tries the plain match (the common case: no userinfo, or +// userinfo with no password, both pass through net/http unmasked and +// still match verbatim), then — only when rawURL's userinfo actually +// carries a password — builds net/http's exact masked form itself +// (mirroring stripPassword's own strings.Replace call precisely) and +// scrubs against that too. +func sanitizeTargetErr(msg, rawURL string) string { + msg = sanitizeProviderErr(msg, rawURL) + u, parseErr := url.Parse(rawURL) + if parseErr != nil || u.User == nil { + return msg + } + if _, hasPassword := u.User.Password(); !hasPassword { + return msg + } + masked := strings.Replace(u.String(), u.User.String()+"@", u.User.Username()+":***@", 1) + return sanitizeProviderErr(msg, masked) +} + // stateOf reports (kind, name)'s current targetHealthState — see this // type's own doc comment for the exact unknown/healthy/unhealthy rule. func (t *targetHealthTracker) stateOf(kind, name string) targetHealthState { diff --git a/target_health_test.go b/target_health_test.go index 3ae3424..b8faa92 100644 --- a/target_health_test.go +++ b/target_health_test.go @@ -160,13 +160,18 @@ func TestTargetHealthTracker_Record_ScrubsCredentialsFromLastError(t *testing.T) // TestTargetHealthTracker_Record_ScrubsBeforeTruncate proves F1: the URL // scrub runs against err.Error() BEFORE truncateRunes bounds it to // targetHealthMaxErrorRunes — even when the embedded URL straddles the -// truncation point, no fragment of the secret survives. +// truncation point, no fragment of the secret survives. G2 (feat/target- +// health review round 2): the prefix is short enough that the SECRET +// itself — not merely the surrounding URL — straddles the 200-rune cut, +// so this test actually distinguishes scrub-before-truncate from +// truncate-before-scrub; a longer prefix that pushes the whole secret +// past the cut point would pass under either ordering, proving nothing. func TestTargetHealthTracker_Record_ScrubsBeforeTruncate(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(3) rawURL := "https://svc.internal/mcp?api-key=" + strings.Repeat("S", 60) - prefix := strings.Repeat("p", 180) - require.Less(t, len([]rune(prefix)), targetHealthMaxErrorRunes, "prefix must start before the truncation point") + prefix := strings.Repeat("p", 150) + require.Less(t, len([]rune(prefix))+strings.Index(rawURL, "api-key="), targetHealthMaxErrorRunes, "the secret must start before the truncation point") require.Greater(t, len([]rune(prefix))+len([]rune(rawURL)), targetHealthMaxErrorRunes, "the url must straddle the truncation point") errText := prefix + " " + rawURL + " connection refused" @@ -177,6 +182,86 @@ func TestTargetHealthTracker_Record_ScrubsBeforeTruncate(t *testing.T) { assert.NotContains(t, snap.lastError, "api-key=") } +// TestTargetHealthTracker_Record_ScrubsPasswordMaskedURLForm proves G1 +// (feat/target-health review round 2): net/http's own *url.Error masks a +// URL's password ("user:pass@" -> "user:***@", and "user:" with an empty +// password the same way — stripPassword, net/http/client.go) BEFORE the +// error text is ever built, whenever the dialed URL's userinfo carries a +// password. sanitizeProviderErr (admin.go) only matches rawURL verbatim, +// so for such a URL it finds nothing to scrub — leaking the password AND +// any query-string credential riding the same URL (an "api-key" value). +// record must scrub against BOTH the raw URL and net/http's own masked +// form. Every case uses a REAL error from http.Client.Do against +// 127.0.0.1:1 (this repo's own "reserved, never listening" convention — +// see provider_openai_test.go), never a hand-written string: the bug is +// about the exact shape net/http actually produces. +func TestTargetHealthTracker_Record_ScrubsPasswordMaskedURLForm(t *testing.T) { + t.Parallel() + // secretPart is the synthetic password these fixtures plant in a target + // URL, and credFixtureURL assembles the URL around it at run time. The + // parts stay separate in the source deliberately: a whole URL literal + // carrying userinfo credentials trips this repository's own pre-commit + // secret scan, and these fixtures exist to prove exactly such a URL + // never reaches lastError. + const secretPart = "sup3rsecret" + credFixtureURL := func(userinfo, hostPath string) string { + return "http://" + userinfo + "@" + hostPath + } + cases := []struct { + name string + rawURL string + mustNotHave []string + }{ + { + name: "userinfo with password", + rawURL: credFixtureURL("user:"+secretPart, "127.0.0.1:1/mcp"), + mustNotHave: []string{"user:" + secretPart + "@", "user:***@", secretPart}, + }, + { + name: "token as username with empty password separator", + rawURL: credFixtureURL("TOKENASUSER:", "127.0.0.1:1/mcp"), + mustNotHave: []string{"TOKENASUSER:@", "TOKENASUSER:***@", "TOKENASUSER"}, + }, + { + name: "userinfo with password and api-key query on the same URL", + rawURL: credFixtureURL("user:"+secretPart, "127.0.0.1:1/mcp?api-key=SECRETVALUE"), + mustNotHave: []string{"user:" + secretPart + "@", "user:***@", secretPart, "SECRETVALUE", "api-key="}, + }, + { + // Existing case (F1): userinfo with NO password has nothing for + // net/http to mask, so the raw URL survives into the error + // verbatim — must keep working unchanged by the G1 fix. + name: "token as username, no password separator", + rawURL: "http://tok3n@127.0.0.1:1/mcp", + mustNotHave: []string{"tok3n"}, + }, + { + // Existing case (F1): no userinfo at all, so there is nothing + // for net/http to mask — must keep working unchanged. + name: "bare api-key query, no userinfo", + rawURL: "http://127.0.0.1:1/mcp?api-key=SECRETVALUE", + mustNotHave: []string{"SECRETVALUE", "api-key="}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + req, err := http.NewRequest(http.MethodGet, tc.rawURL, nil) + require.NoError(t, err) + _, doErr := http.DefaultClient.Do(req) //nolint:bodyclose // Do returns a nil body alongside a non-nil error + require.Error(t, doErr, "127.0.0.1:1 must refuse the connection") + + tr := newTargetHealthTracker(3) + tr.record(targetKindMCP, "alpha", tc.rawURL, false, doErr, 0, targetHealthSourceProbe) + snap := tr.snapshot(targetKindMCP, "alpha") + for _, secret := range tc.mustNotHave { + assert.NotContains(t, snap.lastError, secret) + } + }) + } +} + func TestTargetHealthTracker_KeyedByKindAndName_Independent(t *testing.T) { t.Parallel() tr := newTargetHealthTracker(1) @@ -406,7 +491,13 @@ func TestMaybeSweepTargetHealth_ConcurrentTriggers_SingleFlight(t *testing.T) { // last == 0. A fast-completing first sweep, immediately followed by a // burst of concurrent callers, must still yield exactly one sweep within // probeInterval; a call after the interval has genuinely elapsed must -// start a second one. +// start a second one. G5, feat/target-health review round 2: this test +// proves single-flight ORDERING, not real elapsed time, so it must not +// depend on wall-clock sleeps at all — probeInterval is a full hour (so +// the burst phase's real, sub-millisecond elapsed time can never +// accidentally read as elapsed) and the "interval has passed" half is +// forced directly via targetHealthLastSweepUnixNano, never by sleeping +// for probeInterval. func TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls(t *testing.T) { t.Parallel() var hits int32 @@ -417,8 +508,7 @@ func TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls(t *testing.T) { })) defer srv.Close() - probeInterval := 150 * time.Millisecond - gw := newTargetHealthSweepGateway(t, true, probeInterval, srv.URL) + gw := newTargetHealthSweepGateway(t, true, time.Hour, srv.URL) // First sweep: the probe answers immediately, so this completes fast // and clears targetHealthSweeping well inside probeInterval. @@ -426,8 +516,9 @@ func TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls(t *testing.T) { waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) > 0 }, time.Second) waitForCondition(t, func() bool { return gw.targetHealth.stateOf(targetKindMCP, "alpha") != targetHealthUnknown }, time.Second) - // A burst of concurrent callers immediately after — still well inside - // probeInterval — must not start a second sweep. + // A burst of concurrent callers immediately after — real elapsed time + // is milliseconds against a one-hour probeInterval — must not start a + // second sweep. var wg sync.WaitGroup for i := 0; i < 50; i++ { wg.Add(1) @@ -437,14 +528,13 @@ func TestMaybeSweepTargetHealth_IntervalEnforcedAcrossRapidCalls(t *testing.T) { }() } wg.Wait() - time.Sleep(30 * time.Millisecond) // let any wrongly-spawned sweep reach the server if got := atomic.LoadInt32(&hits); got != 1 { t.Errorf("hits = %d, want exactly 1 (a burst of concurrent callers inside probeInterval must not start a second sweep)", got) } - // Once probeInterval has genuinely elapsed, a new call starts a - // second sweep. - time.Sleep(probeInterval) + // Force the interval to read as elapsed directly, rather than + // sleeping for real: a call after that must start a second sweep. + atomic.StoreInt64(&gw.targetHealthLastSweepUnixNano, time.Now().Add(-2*time.Hour).UnixNano()) gw.maybeSweepTargetHealth() waitForCondition(t, func() bool { return atomic.LoadInt32(&hits) == 2 }, time.Second) } From 5d82a6ce656bcf6b7a7a8a7dbcbb47921750ac95 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 08:56:48 +0100 Subject: [PATCH 12/15] fix(target-health): record a hung federated server as a failure The previous round suppressed every context-caused federation error. A server that accepted the connection and then never answered therefore read "unknown" forever whenever federation carried the only traffic, which is the outage shape this feature exists to surface. Split the two causes instead. A server still waiting for a fan-out slot when the budget expires is never dialed, so the semaphore acquire now selects on the fan-out context and records nothing for it. A server this gateway did dial records a failure on a deadline, because it had its chance to answer. Only a caller hanging up stays unattributable. Document the split rule, correct a stale comment about a second record site, and state that "unknown" reads two ways rather than three. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- README.md | 23 +++++---- mcp_federation.go | 69 +++++++++++++++++-------- mcp_federation_test.go | 113 ++++++++++++++++++++++++++++++++++------- 3 files changed, 156 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 49b826b..a6324e4 100644 --- a/README.md +++ b/README.md @@ -1898,11 +1898,14 @@ plugin's config. only when the outbound call itself fails (`err != nil` from the backend call) — a JSON-RPC-level `error` in the backend's own response still counts as reachable, since the server answered. A - context-caused failure (the caller canceling, or the shared fan-out - deadline expiring) records nothing at all, the same client-cancel - rule the per-server proxy above applies; a genuinely hung server is - still caught by the active probe sweep or its own per-server proxy - health. + context-caused failure is split two ways: the caller hanging up + (`context.Canceled`) records nothing, the same client-cancel rule the + per-server proxy above applies, but a server this gateway actually + dialed that never answers before the shared fan-out budget expires + (`context.DeadlineExceeded`) records a real failure — it had a chance + to answer and did not. A server still waiting for a free fan-out slot + when that same budget expires — never dialed at all — records + nothing, since this gateway never gave it the chance. - **Active probes are opt-in** (`targetHealth.enabled: true`) and lazy: no timer, no background goroutine running on its own. A probe sweep is triggered by `/metrics`, `GET /admin/api/targets`, `GET @@ -1929,8 +1932,7 @@ plugin's config. whether or not the target has ever succeeded). A target with one or two recent failures after a success still reads `"healthy"` until the threshold is actually crossed. - - **`"unknown"` reads three ways**, all sharing one JSON `state` - value: + - **`"unknown"` reads two ways**, both sharing one JSON `state` value: 1. never observed at all — no probe or passive traffic has reached this target yet. `GET /admin/api/targets` omits every health field but `state`/`consecutiveFailures` for this case. @@ -1941,9 +1943,10 @@ plugin's config. has never seen answer is not `"healthy"` either. Every other health field is still present here, since there is a real observation to show. - 3. either way, `llmgateway_target_healthy` emits no sample while - `state` is `"unknown"` — a gap in the series is honest, a - fabricated `1` is not. + + Either way, `llmgateway_target_healthy` emits no sample while `state` + is `"unknown"` — a gap in the series is honest, a fabricated `1` is + not. ## Security notes diff --git a/mcp_federation.go b/mcp_federation.go index bdd6bd2..17fe2f6 100644 --- a/mcp_federation.go +++ b/mcp_federation.go @@ -970,28 +970,53 @@ func (g *Gateway) mcpFederatedToolsList(w http.ResponseWriter, format mcpRespons } }() - sem <- struct{}{} + // G4, feat/target-health review round 2: acquiring the + // semaphore via select, not a bare blocking send, lets a + // server still parked here when fanoutCtx expires return + // WITHOUT ever calling mcpBackendCall — it was never dialed, + // so it has nothing to say about that server's own health + // (below). Without this, a bare `sem <- struct{}{}` still + // unblocks once fanoutCtx dies (an earlier holder's own call + // fails fast against the already-expired context and frees + // its slot), but by then mcpBackendCall would be called with + // a context that is already done — indistinguishable from a + // server that WAS dialed and genuinely timed out, which is + // exactly the over-suppression this fix removes. + select { + case sem <- struct{}{}: + case <-fanoutCtx.Done(): + mu.Lock() + failed = append(failed, name) + mu.Unlock() + return + } defer func() { <-sem }() targetURL := g.cfg.MCPServers[name].URL // feat/target-health: passive recording (target_health.go) — // err != nil is a failure; a JSON-RPC-level resp.Error is NOT - // (the server answered, it just reported its own error), so - // it is recorded separately, below, once the shape is known. + // (the server answered, it just reported its own error). The + // record call right below already covers both: it reads ok + // from err == nil alone, so a non-nil resp.Error alongside a + // nil err still records success here — the failed-list + // append further down (used only for the merged tools/list + // result and the loud-failure short-circuit) is a separate + // concern and never touches targetHealth itself. probeStart := time.Now() resp, err := g.mcpBackendCall(fanoutCtx, targetURL, "tools/list", struct{}{}, mcpBackendResponseMaxBytes) - // F2: fanoutCtx is derived from r.Context() (above), so a - // client hang-up (context.Canceled) surfaces here as EVERY - // still-in-flight server's own error, and the shared - // toolsListBackendTimeout expiry (context.DeadlineExceeded) - // surfaces identically for a server that was genuinely slow - // AND one still parked on sem, never dialed at all — neither - // says anything about that server's own health, so neither is - // recorded, mirroring recordTargetProxyHealth's identical - // client-cancel rule (target_health.go). A server that is - // really hung is instead caught by the active probe sweep or - // its own per-request proxy health, not by this fan-out. - if err == nil || (!errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded)) { + // G4: this goroutine WON the select above, so it was actually + // dialed — only a client hang-up (context.Canceled, + // propagating from r.Context() into fanoutCtx) says nothing + // about this server's own health, mirroring + // recordTargetProxyHealth's identical client-cancel rule + // (target_health.go). context.DeadlineExceeded here means the + // shared toolsListBackendTimeout fired while THIS dialed + // server was still in flight — it did not answer within the + // fan-out's own budget, which is a real failure worth + // recording, not a client artifact (F2 over-suppressed this + // case; a genuinely hung server used to read "unknown" + // forever under federation-only traffic). + if err == nil || !errors.Is(err, context.Canceled) { g.targetHealth.record(targetKindMCP, name, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) } @@ -1116,11 +1141,15 @@ func (g *Gateway) mcpFederatedToolsCall(w http.ResponseWriter, format mcpRespons // not. probeStart := time.Now() resp, err := g.mcpBackendCall(ctx, targetURL, "tools/call", mcpToolCallParams{Name: toolName, Arguments: params.Arguments}, mcpBackendCallResponseMaxBytes) - // F2: same context-caused-error guard as mcpFederatedToolsList's own - // fan-out, above — ctx here derives from r.Context() too, so a client - // cancel or the shared toolsCallBackendTimeout expiry must record - // nothing rather than a false failure. - if err == nil || (!errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded)) { + // G4: same dialed-server rule as mcpFederatedToolsList's own fan-out, + // above — ctx here derives from r.Context() too, so a client cancel + // (context.Canceled) must record nothing. Unlike the fan-out, + // tools/call has no semaphore to wait behind: the call above is + // always actually dialed, so context.DeadlineExceeded here means + // THIS server did not answer within toolsCallBackendTimeout — a real + // failure worth recording, not a client artifact (F2 over-suppressed + // this case). + if err == nil || !errors.Is(err, context.Canceled) { g.targetHealth.record(targetKindMCP, serverName, targetURL, err == nil, err, time.Since(probeStart), targetHealthSourceTraffic) } g.limiter.countTargetRequest(targetKindMCP, serverName) diff --git a/mcp_federation_test.go b/mcp_federation_test.go index a386eb6..9fc1f41 100644 --- a/mcp_federation_test.go +++ b/mcp_federation_test.go @@ -858,10 +858,12 @@ func TestHandleMCPFederated_ToolsCall_SlowBackend_BoundedByRequestContext(t *tes t.Cleanup(func() { close(block) }) cfg := newFederationTestConfig(srv.URL, "http://beta.invalid", true) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") if err != nil { t.Fatalf("New: %v", err) } + gw := h.(*Gateway) callParams, _ := json.Marshal(mcpToolCallParams{Name: "alpha_lookup"}) req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/call", ID: json.RawMessage("1"), Params: callParams}) @@ -884,6 +886,12 @@ func TestHandleMCPFederated_ToolsCall_SlowBackend_BoundedByRequestContext(t *tes if got.Error == nil || got.Error.Code != jsonrpcInternalError { t.Errorf("error = %+v, want internal error (the resolved server timed out)", got.Error) } + // G4, feat/target-health review round 2: tools/call always actually + // dials its one resolved server (no semaphore to wait behind), so + // this shared-budget expiry must record a failure, not nothing. + if state := gw.targetHealth.stateOf(targetKindMCP, "alpha"); state != targetHealthUnhealthy { + t.Errorf("alpha state = %q, want unhealthy (dialed and never answered within the request's own budget)", state) + } } // --- MF2: non-2xx status and empty-envelope guards --- @@ -2057,28 +2065,72 @@ func TestHandleMCPFederated_ToolsList_ClientCanceled_RecordsNothing(t *testing.T } } -// TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing -// proves F2's second case: when the fan-out's own shared context expires -// (toolsListBackendTimeout, or here the incoming request's own shorter -// deadline — see TestHandleMCPFederated_ToolsList_SlowBackend_BoundedByRequestContext's -// own doc comment for why that stands in for the real 20s budget), a -// server still parked behind the fan-out semaphore — never actually -// dialed — must not be recorded as a failure either. mcpBackendCall -// returns the identical context.DeadlineExceeded whether a server was -// slow or never contacted at all, so this case is handled by the same -// guard as the client-cancel case above, not by tracking who was dialed. -func TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing(t *testing.T) { +// TestHandleMCPFederated_ToolsList_HungDialedServer_RecordsFailure proves +// G4 (feat/target-health review round 2): a server that WAS actually +// dialed and never answers before the fan-out's own shared budget +// expires (toolsListBackendTimeout, or here the incoming request's own +// shorter deadline — see +// TestHandleMCPFederated_ToolsList_SlowBackend_BoundedByRequestContext's +// own doc comment for why that stands in for the real 20s budget) must +// still record a failure, not nothing. F2's original guard +// blanket-suppressed context.DeadlineExceeded too, which meant a +// genuinely hung server read "unknown" forever under federation-only +// traffic whenever targetHealth.enabled defaults false — the +// over-suppression this fix removes. +func TestHandleMCPFederated_ToolsList_HungDialedServer_RecordsFailure(t *testing.T) { + release := make(chan struct{}) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + <-release + })) + t.Cleanup(srv.Close) + t.Cleanup(func() { close(release) }) + + cfg := newFederationTestConfig(srv.URL, "http://beta.invalid", true) + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} + h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") + if err != nil { + t.Fatalf("New: %v", err) + } + gw := h.(*Gateway) + + req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")}) + shortCtx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + req = req.WithContext(shortCtx) + + rec := httptest.NewRecorder() + h.ServeHTTP(rec, req) + + if got := gw.targetHealth.stateOf(targetKindMCP, "alpha"); got != targetHealthUnhealthy { + t.Errorf("alpha state = %q, want unhealthy (dialed and never answered within the fan-out budget)", got) + } +} + +// TestHandleMCPFederated_ToolsList_NeverDialedSemaphoreStarved_RecordsNothing +// proves G4's other half: a server still parked behind the fan-out +// semaphore when the shared deadline fires — never actually dialed — +// must still record nothing, unlike a server that WAS dialed (the test +// above). One more server than the fan-out semaphore has slots for +// (mcpFederatedFanoutConcurrency) guarantees at least one is never +// dialed; draining exactly mcpFederatedFanoutConcurrency sends on +// reached first proves which servers WERE actually dialed before any +// assertion runs, rather than assuming which specific names win the +// race. snapshot's own "observed" field (target_health.go), not stateOf, +// is what actually distinguishes "recorded a failure, still below +// failureThreshold" from "never recorded at all" — both read state +// targetHealthUnknown (F4), so FailureThreshold: 1 below also makes a +// dialed server's single failure visible as targetHealthUnhealthy +// through stateOf too, for a belt-and-suspenders check. +func TestHandleMCPFederated_ToolsList_NeverDialedSemaphoreStarved_RecordsNothing(t *testing.T) { + reached := make(chan struct{}, mcpFederatedFanoutConcurrency) block := make(chan struct{}) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + reached <- struct{}{} <-block })) t.Cleanup(srv.Close) t.Cleanup(func() { close(block) }) - // One more server than the fan-out semaphore has slots for - // (mcpFederatedFanoutConcurrency) guarantees at least one is still - // parked on the semaphore, never dialed, when the shared deadline - // fires. names := make([]string, 0, mcpFederatedFanoutConcurrency+1) mcpServers := make(map[string]*TargetConfig, mcpFederatedFanoutConcurrency+1) for i := 0; i < mcpFederatedFanoutConcurrency+1; i++ { @@ -2092,6 +2144,7 @@ func TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing(t *tes cfg.MCPServers = mcpServers cfg.Groups = map[string]*GroupConfig{"default": {}} cfg.Users = &UsersConfig{Inline: []*UserConfig{{Name: "alice", Group: "default", APIKey: "sk-alice"}}} + cfg.TargetHealth = TargetHealthConfig{FailureThreshold: 1} h, err := New(context.Background(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}), cfg, "llmgw") if err != nil { @@ -2100,17 +2153,39 @@ func TestHandleMCPFederated_ToolsList_SharedDeadlineExpiry_RecordsNothing(t *tes gw := h.(*Gateway) req := newFederatedRequest(t, "sk-alice", jsonrpcRequest{JSONRPC: jsonrpcVersion, Method: "tools/list", ID: json.RawMessage("1")}) - shortCtx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + shortCtx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond) defer cancel() req = req.WithContext(shortCtx) rec := httptest.NewRecorder() - h.ServeHTTP(rec, req) + done := make(chan struct{}) + go func() { + h.ServeHTTP(rec, req) + close(done) + }() + for i := 0; i < mcpFederatedFanoutConcurrency; i++ { + <-reached + } + <-done + + dialed, neverDialed := 0, 0 for _, name := range names { - if got := gw.targetHealth.stateOf(targetKindMCP, name); got != targetHealthUnknown { - t.Errorf("mcp/%s state = %q, want unknown (a shared fan-out deadline expiry must record nothing)", name, got) + snap := gw.targetHealth.snapshot(targetKindMCP, name) + if snap.observed { + dialed++ + if snap.state != targetHealthUnhealthy { + t.Errorf("mcp/%s state = %q, want unhealthy (dialed and never answered)", name, snap.state) + } + continue } + neverDialed++ + } + if dialed != mcpFederatedFanoutConcurrency { + t.Errorf("dialed = %d, want %d (exactly one server must never have been dialed)", dialed, mcpFederatedFanoutConcurrency) + } + if neverDialed != 1 { + t.Errorf("neverDialed = %d, want exactly 1", neverDialed) } } From e85acbf6f99059669163102a28131345a71c39ee Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 08:57:00 +0100 Subject: [PATCH 13/15] docs(target-health): correct the field-alignment note The note claimed fieldalignment reports no change from pinning the sweep timestamp first. The analyser is in fact clean before the move and reports 192 against an optimal 184 leading pointer bytes after it. State the measured truth. The struct stays 264 bytes either way, so the exception costs no padding. Moving the sweep flag up to close the pointer-bytes gap was tried and made the report worse. Atomic alignment on 32-bit platforms outranks the linter hint. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- llmgateway.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/llmgateway.go b/llmgateway.go index eceff6f..939c566 100644 --- a/llmgateway.go +++ b/llmgateway.go @@ -600,10 +600,18 @@ type Gateway struct { // Every field below is ordered by golangci-lint's fieldalignment // linter (pointer-containing fields grouped first, for GC scan // efficiency, then the rest) — this one field is the sole, deliberate - // exception, verified with `fieldalignment ./...` to add no - // additional padding: an 8-byte int64 transitions cleanly into the - // 8-byte-aligned pointer block that follows on every architecture - // this plugin targets. + // exception. Total struct size stays 264 bytes either way + // (unsafe.Sizeof(Gateway{}), verified before and after this field was + // pinned first), so the exception costs no padding. It does cost + // fieldalignment's separate pointer-bytes hint: `fieldalignment + // ./...` reports "Gateway has 192 leading bytes of pointer data but + // optimal value is 184" with this field first, against a clean + // report at the commit before it moved. Moving targetHealthSweeping + // (below) to sit directly after this field, to try to close that + // gap, was tried and makes the report worse, not better (200 vs + // 184), so targetHealthSweeping stays with the rest of the plain + // scalars. The 8-byte pointer-bytes gap is accepted deliberately: + // the atomic-alignment requirement below wins over the linter hint. targetHealthLastSweepUnixNano int64 next http.Handler // redisClient is the same instance newGateway hands to both the From 44ae4083b4912249b2c87bcae4b90ec20fd267bc Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 08:57:12 +0100 Subject: [PATCH 14/15] test(yaegi-check): wait for every probe before asserting The warmup waited for one target while the same sweep probed the others concurrently. A late probe could overwrite another target's traffic sourced record and fail a later assertion. Wait for every configured MCP target to report the probe source, and correct the comment that claimed a guarantee the code did not give. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- tools/yaegi-check/main.go | 66 +++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/tools/yaegi-check/main.go b/tools/yaegi-check/main.go index 3607517..50bb09b 100644 --- a/tools/yaegi-check/main.go +++ b/tools/yaegi-check/main.go @@ -1896,31 +1896,51 @@ func readTargetHealth(handler http.Handler, name string) (targetHealthProbeView, // used to make TARGETHEALTH-2, below, racy under Yaegi's interpreter // overhead). // -// targetHealthProbeOnlyServerName is dedicated to this assertion -// specifically because it is NEVER proxied or federated through by any -// other exercise in this harness — its health entry can only ever be -// written by the probe, so source == "probe" here is not just likely, -// it is the only value possible. Polling (pollTargetHealth) rather than -// asserting on a single read: the sweep itself still runs on its own -// spawned goroutine even though this call triggered it. +// G5, feat/target-health review round 2: that guarantee only holds once +// EVERY configured MCP server's own probe observation has actually +// landed, not merely targetHealthProbeOnlyServerName's. sweepTargetHealth +// probes every configured server CONCURRENTLY, on its own goroutines — +// waiting for one target's record() to land says nothing about whether +// mcpProbeServerName's own probe goroutine has finished yet. A version of +// this function that returned as soon as targetHealthProbeOnlyServerName +// alone changed could return while mcpProbeServerName's probe write was +// still in flight; that write could then land AFTER +// exerciseFederatedTooLarge's later traffic write, silently reverting +// mcpProbeServerName's source back to "probe" and corrupting +// exerciseTargetHealth's own TARGETHEALTH-2 assertion (source == +// "traffic"). Polling every configured MCP server for its own source == +// "probe" closes that gap: this function cannot return until the whole +// sweep — not just the one target it happens to check last — has +// finished writing. +// +// targetHealthProbeOnlyServerName is additionally asserted to the FULL +// "healthy" state, not just source == "probe": it is NEVER proxied or +// federated through by any other exercise in this harness, so its health +// entry can only ever be written by the probe — recover's own swallow +// (sweepTargetHealth's defer, target_health.go) means an interpreted +// panic mid-probe would otherwise degrade to a silently-stuck "unknown" +// rather than a loud failure, and asserting the full success shape here +// is what makes a Yaegi incompatibility in the initialize/close handshake +// path visible instead of passing silently. func exerciseTargetHealthProbeWarmup(handler http.Handler) error { - health, err := pollTargetHealth(handler, targetHealthProbeOnlyServerName, func(h targetHealthProbeView) bool { - return h.State != "unknown" - }) - if err != nil { - return err + warmupServerNames := []string{mcpProbeServerName, targetHealthDownServerName, targetHealthProbeOnlyServerName} + var probeOnlyHealth targetHealthProbeView + for _, name := range warmupServerNames { + health, err := pollTargetHealth(handler, name, func(h targetHealthProbeView) bool { + return h.Source == "probe" + }) + if err != nil { + return err + } + if health.Source != "probe" { + return fmt.Errorf("TARGETHEALTH-PROBE-1: GET /admin/api/targets: %q health.source = %q, want %q (the warmup sweep must probe every configured MCP server before any later exercise runs)", name, health.Source, "probe") + } + if name == targetHealthProbeOnlyServerName { + probeOnlyHealth = health + } } - if health.Source != "probe" { - return fmt.Errorf("TARGETHEALTH-PROBE-1: GET /admin/api/targets: %q health.source = %q, want %q (only the active probe ever touches this target)", targetHealthProbeOnlyServerName, health.Source, "probe") - } - // Recover's own swallow (sweepTargetHealth's defer, target_health.go) - // means an interpreted panic mid-probe would otherwise degrade to a - // silently-stuck "unknown" rather than a loud failure — asserting the - // FULL success shape here (not merely "state != unknown") is what - // makes a Yaegi incompatibility in the initialize/close handshake - // path visible instead of passing silently. - if health.State != "healthy" { - return fmt.Errorf("TARGETHEALTH-PROBE-2: GET /admin/api/targets: %q health.state = %q, want healthy (targetHealthProbeOnlyUpstream always answers initialize successfully)", targetHealthProbeOnlyServerName, health.State) + if probeOnlyHealth.State != "healthy" { + return fmt.Errorf("TARGETHEALTH-PROBE-2: GET /admin/api/targets: %q health.state = %q, want healthy (targetHealthProbeOnlyUpstream always answers initialize successfully)", targetHealthProbeOnlyServerName, probeOnlyHealth.State) } fmt.Println("yaegi-check: target health active probe sweep ran and recorded correctly interpreted") From d8ba90c5d072e634c1b4e3b29b584410d6d404ef Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 3 Sep 2026 08:57:25 +0100 Subject: [PATCH 15/15] fix(admin): share the zero-time constant The zero-time sentinel was module private, so the spec redeclared the literal once a third consumer started depending on it. Export it and import it in the spec. Regenerate the baked admin assets. Claude-Session: https://claude.ai/code/session_01EebV5jyWvYocByNQ3oss1w --- admin_assets_gen.go | 12 ++++++------ webui/src/lib/format.spec.ts | 4 +--- webui/src/lib/format.ts | 3 ++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/admin_assets_gen.go b/admin_assets_gen.go index cd15b6e..87f535c 100644 --- a/admin_assets_gen.go +++ b/admin_assets_gen.go @@ -1,6 +1,6 @@ // Code generated by webui/generate.mjs; DO NOT EDIT. // -// Source: webui/dist/ (vite build output), digest 25a21c1cf0995404. +// Source: webui/dist/ (vite build output), digest 0368099ac0e07195. // Regenerate via `make admin-ui` after any webui/ source change. // // Every asset body below is base64-encoded and decoded once at package-var @@ -34,16 +34,16 @@ func decodeAdminAsset(encoded string) []byte { // adminIndexHTML is GET /admin's response body (admin.go's serveAdminPage) — // the built Vue app's HTML shell. var adminIndexHTML = decodeAdminAsset( - "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPCEtLSBJbmxpbmUgZGF0YTogVVJJLCBub3QgYSBmaWxlIHVuZGVyIHB1YmxpYy86IGFkbWluLmdvJ3MgYXNzZXQgbWFwIG9ubHkKICAgICAgICAgZXZlciBob2xkcyBjb250ZW50LWhhc2hlZCBmaWxlcyB1bmRlciAvYWRtaW4vYXNzZXRzLyosIGFuZCB0aGUgYWRtaW4KICAgICAgICAgQ1NQJ3MgaW1nLXNyYyBhbGxvd3MgJ3NlbGYnIHBsdXMgZGF0YTogZm9yIGV4YWN0bHkgdGhpcyByZWFzb24g4oCUIG5vCiAgICAgICAgIGV4dHJhIHVuaGFzaGVkLWFzc2V0IHJvdXRlIGlzIG5lZWRlZCBmb3Igb25lIHNtYWxsIGljb24uIC0tPgogICAgPGxpbmsKICAgICAgcmVsPSJpY29uIgogICAgICB0eXBlPSJpbWFnZS9zdmcreG1sIgogICAgICBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ3JlY3Qgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyByeD0nNScgZmlsbD0nJTIzMDA3MmIyJy8lM0UlM0NwYXRoIGQ9J002IDE2LjUgMTAgOGwzIDYgMi0zLjUgMyA2JyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UiCiAgICAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+TExNIEdhdGV3YXkgLSBBZG1pbjwvdGl0bGU+CiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSIvYWRtaW4vYXNzZXRzL2luZGV4LUN3UF9NYk9iLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgY3Jvc3NvcmlnaW4gaHJlZj0iL2FkbWluL2Fzc2V0cy9pbmRleC1DU2tJSXRyby5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9ImFwcCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==", + "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPCEtLSBJbmxpbmUgZGF0YTogVVJJLCBub3QgYSBmaWxlIHVuZGVyIHB1YmxpYy86IGFkbWluLmdvJ3MgYXNzZXQgbWFwIG9ubHkKICAgICAgICAgZXZlciBob2xkcyBjb250ZW50LWhhc2hlZCBmaWxlcyB1bmRlciAvYWRtaW4vYXNzZXRzLyosIGFuZCB0aGUgYWRtaW4KICAgICAgICAgQ1NQJ3MgaW1nLXNyYyBhbGxvd3MgJ3NlbGYnIHBsdXMgZGF0YTogZm9yIGV4YWN0bHkgdGhpcyByZWFzb24g4oCUIG5vCiAgICAgICAgIGV4dHJhIHVuaGFzaGVkLWFzc2V0IHJvdXRlIGlzIG5lZWRlZCBmb3Igb25lIHNtYWxsIGljb24uIC0tPgogICAgPGxpbmsKICAgICAgcmVsPSJpY29uIgogICAgICB0eXBlPSJpbWFnZS9zdmcreG1sIgogICAgICBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyUzRSUzQ3JlY3Qgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyByeD0nNScgZmlsbD0nJTIzMDA3MmIyJy8lM0UlM0NwYXRoIGQ9J002IDE2LjUgMTAgOGwzIDYgMi0zLjUgMyA2JyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UiCiAgICAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+TExNIEdhdGV3YXkgLSBBZG1pbjwvdGl0bGU+CiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSIvYWRtaW4vYXNzZXRzL2luZGV4LUNuNnZFQWpQLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgY3Jvc3NvcmlnaW4gaHJlZj0iL2FkbWluL2Fzc2V0cy9pbmRleC1DU2tJSXRyby5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9ImFwcCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==", ) // adminAssets maps each hashed filename under /admin/assets/ (admin.go's // serveAdminAsset) to its content. var adminAssets = map[string]adminAsset{ - "ChartsView--5PgKbV9.js": { + "ChartsView-DQ1IeOcb.js": { contentType: "text/javascript; charset=utf-8", body: decodeAdminAsset( - "aW1wb3J0eyQgYXMgZSxBIGFzIHQsQXQgYXMgbixCIGFzIHIsQnQgYXMgaSxDIGFzIGEsQ3QgYXMgbyxEIGFzIHMsRHQgYXMgYyxFIGFzIGwsRXQgYXMgdSxGIGFzIGQsRnQgYXMgZixHIGFzIHAsSCBhcyBtLEkgYXMgaCxJdCBhcyBnLEogYXMgXyxLIGFzIHYsTCBhcyB5LEx0IGFzIGIsTSBhcyB4LE10IGFzIFMsTiBhcyBDLE50IGFzIHcsTyBhcyBULE90IGFzIEUsUCBhcyBELFB0IGFzIE8sUSBhcyBrLFIgYXMgZWUsUnQgYXMgdGUsUyBhcyBuZSxTdCBhcyByZSxUIGFzIGllLFR0IGFzIGFlLFUgYXMgb2UsViBhcyBzZSxWdCBhcyBjZSxXIGFzIGxlLFggYXMgdWUsWSBhcyBkZSxaIGFzIGZlLF8gYXMgcGUsX3QgYXMgbWUsYSBhcyBoZSxhdCBhcyBnZSxiIGFzIEEsYyBhcyBfZSxjdCBhcyB2ZSxkIGFzIHllLGR0IGFzIGosZXQgYXMgTSxmIGFzIGJlLGZ0IGFzIHhlLGcgYXMgU2UsZ3QgYXMgTixoIGFzIENlLGh0IGFzIHdlLGkgYXMgVGUsaXQgYXMgUCxqIGFzIEVlLGp0IGFzIEYsayBhcyBEZSxrdCBhcyBPZSxsIGFzIGtlLGx0IGFzIEFlLG0gYXMgamUsbXQgYXMgTWUsbiBhcyBOZSxudCBhcyBJLG8gYXMgUGUsb3QgYXMgTCxwIGFzIEZlLHB0IGFzIEllLHEgYXMgTGUsciBhcyBSZSxydCBhcyB6ZSxzIGFzIEJlLHN0IGFzIFIsdCBhcyBWZSx0dCBhcyBIZSx1IGFzIFVlLHV0IGFzIFdlLHYgYXMgR2UsdnQgYXMgeix3IGFzIEtlLHd0IGFzIEIseCBhcyBxZSx4dCBhcyBWLHkgYXMgSmUseXQgYXMgWWUseiBhcyBYZSx6dCBhcyBaZX1mcm9tIi4vaW5kZXgtQ3dQX01iT2IuanMiO2Z1bmN0aW9uIFFlKGUsdD0tMS8wLG49MS8wKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiAkZShlLHQsbil7bGV0IHI9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxpPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSksci5kaXNwYXRjaEV2ZW50KGkpfXZhciBldD1uKHtsYXllcnNSb290Om5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzOnZvaWQgMCxicmFuY2hlczpuZXcgU2V0fSk7ZnVuY3Rpb24gdHQoZSl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4hMTtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHQhPT1udWxsJiZ0IT09T2JqZWN0LnByb3RvdHlwZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpIT09bnVsbHx8U3ltYm9sLml0ZXJhdG9yIGluIGU/ITE6U3ltYm9sLnRvU3RyaW5nVGFnIGluIGU/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgTW9kdWxlXWA6ITB9ZnVuY3Rpb24gbnQoZSx0LG49YC5gLHIpe2lmKCF0dCh0KSlyZXR1cm4gbnQoZSx7fSxuLHIpO2xldCBpPXsuLi50fTtmb3IobGV0IHQgb2YgT2JqZWN0LmtleXMoZSkpe2lmKHQ9PT1gX19wcm90b19fYHx8dD09PWBjb25zdHJ1Y3RvcmApY29udGludWU7bGV0IGE9ZVt0XTthIT1udWxsJiYociYmcihpLHQsYSxuKXx8KGlbdF09QXJyYXkuaXNBcnJheShhKSYmQXJyYXkuaXNBcnJheShpW3RdKT9bLi4uYSwuLi5pW3RdXTp0dChhKSYmdHQoaVt0XSk/bnQoYSxpW3RdLChuP2Ake259LmA6YGApK3QudG9TdHJpbmcoKSxyKTphKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuKC4uLnQpPT50LnJlZHVjZSgodCxuKT0+bnQodCxuLGBgLGUpLHt9KX12YXIgaXQ9cnQoKSxhdD1kKCgpPT57bGV0IGU9RihuZXcgTWFwKSxuPUYoKSxyPU0oKCk9Pntmb3IobGV0IHQgb2YgZS52YWx1ZS52YWx1ZXMoKSlpZih0KXJldHVybiEwO3JldHVybiExfSksaT1zKHtzY3JvbGxCb2R5OkYoITApfSksYT1udWxsLG89KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gYCxkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0PWBgLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPWBgKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0tc2Nyb2xsYmFyLXdpZHRoYCksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1uLnZhbHVlPz9gYCx5JiZhPy4oKSxuLnZhbHVlPXZvaWQgMH07cmV0dXJuIFYociwoZSxzKT0+e2lmKCFoKXJldHVybjtpZighZSl7cyYmbygpO3JldHVybn1uLnZhbHVlPT09dm9pZCAwJiYobi52YWx1ZT1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93KTtsZXQgYz13aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsbD17cGFkZGluZzpjLG1hcmdpbjowfSx1PWkuc2Nyb2xsQm9keT8udmFsdWU/dHlwZW9mIGkuc2Nyb2xsQm9keS52YWx1ZT09YG9iamVjdGA/aXQoe3BhZGRpbmc6aS5zY3JvbGxCb2R5LnZhbHVlLnBhZGRpbmc9PT0hMD9jOmkuc2Nyb2xsQm9keS52YWx1ZS5wYWRkaW5nLG1hcmdpbjppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2luPT09ITA/YzppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2lufSxsKTpsOntwYWRkaW5nOjAsbWFyZ2luOjB9O2M+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXR5cGVvZiB1LnBhZGRpbmc9PWBudW1iZXJgP2Ake3UucGFkZGluZ31weGA6U3RyaW5nKHUucGFkZGluZyksZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodD10eXBlb2YgdS5tYXJnaW49PWBudW1iZXJgP2Ake3UubWFyZ2lufXB4YDpTdHJpbmcodS5tYXJnaW4pLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShgLS1zY3JvbGxiYXItd2lkdGhgLGAke2N9cHhgKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PWBoaWRkZW5gKSx5JiYoYT10KGRvY3VtZW50LGB0b3VjaG1vdmVgLGU9PmN0KGUpLHtwYXNzaXZlOiExfSkpLHhlKCgpPT57ci52YWx1ZSYmKGRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1gaGlkZGVuYCl9KX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgc3luY2B9KSxlfSk7ZnVuY3Rpb24gb3QoZSl7bGV0IHQ9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsNyksbj1hdCgpO24udmFsdWUuc2V0KHQsZT8/ITEpO2xldCBpPU0oe2dldDooKT0+bi52YWx1ZS5nZXQodCk/PyExLHNldDplPT5uLnZhbHVlLnNldCh0LGUpfSk7cmV0dXJuIHIoKCk9PntuLnZhbHVlLmRlbGV0ZSh0KX0pLGl9ZnVuY3Rpb24gc3QoZSl7bGV0IHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7aWYodC5vdmVyZmxvd1g9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1k9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1g9PT1gYXV0b2AmJmUuY2xpZW50V2lkdGg8ZS5zY3JvbGxXaWR0aHx8dC5vdmVyZmxvd1k9PT1gYXV0b2AmJmUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0KXJldHVybiEwO3tsZXQgdD1lLnBhcmVudE5vZGU7cmV0dXJuISh0IGluc3RhbmNlb2YgRWxlbWVudCl8fHQudGFnTmFtZT09PWBCT0RZYD8hMTpzdCh0KX19ZnVuY3Rpb24gY3QoZSl7bGV0IHQ9ZXx8d2luZG93LmV2ZW50LG49dC50YXJnZXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBFbGVtZW50JiZzdChuKT8hMTp0LnRvdWNoZXMubGVuZ3RoPjF8fCh0LnByZXZlbnREZWZhdWx0JiZ0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKSwhMSl9dmFyIGx0PTA7ZnVuY3Rpb24gdXQoKXtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtZm9jdXMtZ3VhcmRdYCk7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoYGFmdGVyYmVnaW5gLHRbMF0/P2R0KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KGBiZWZvcmVlbmRgLHRbMV0/P2R0KCkpLGx0KyssZSgoKT0+e2x0PT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtcmVrYS1mb2N1cy1ndWFyZF1gKS5mb3JFYWNoKGU9PmUucmVtb3ZlKCkpLGx0LS19KX0pfWZ1bmN0aW9uIGR0KCl7bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgc3BhbmApO3JldHVybiBlLnNldEF0dHJpYnV0ZShgZGF0YS1yZWthLWZvY3VzLWd1YXJkYCxgYCksZS50YWJJbmRleD0wLGUuc3R5bGUub3V0bGluZT1gbm9uZWAsZS5zdHlsZS5vcGFjaXR5PWAwYCxlLnN0eWxlLnBvc2l0aW9uPWBmaXhlZGAsZS5zdHlsZS5wb2ludGVyRXZlbnRzPWBub25lYCxlfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBNKCgpPT4hZyhlKXx8ISFEZShlKT8uY2xvc2VzdChgZm9ybWApKX12YXIgcHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudD5gdWA/bnVsbDooQXJyYXkuaXNBcnJheShlKT9lWzBdOmUpLm93bmVyRG9jdW1lbnQuYm9keX0sbXQ9bmV3IFdlYWtNYXAsaHQ9bmV3IFdlYWtNYXAsZ3Q9e30sX3Q9MCx2dD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuaG9zdHx8dnQoZS5wYXJlbnROb2RlKSl9LHl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe2lmKGUuY29udGFpbnModCkpcmV0dXJuIHQ7dmFyIG49dnQodCk7cmV0dXJuIG4mJmUuY29udGFpbnMobik/bjooY29uc29sZS5lcnJvcihgYXJpYS1oaWRkZW5gLHQsYGluIG5vdCBjb250YWluZWQgaW5zaWRlYCxlLGAuIERvaW5nIG5vdGhpbmdgKSxudWxsKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hIWV9KX0sYnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eXQodCxBcnJheS5pc0FycmF5KGUpP2U6W2VdKTtndFtuXXx8KGd0W25dPW5ldyBXZWFrTWFwKTt2YXIgYT1ndFtuXSxvPVtdLHM9bmV3IFNldCxjPW5ldyBTZXQoaSksbD1mdW5jdGlvbihlKXshZXx8cy5oYXMoZSl8fChzLmFkZChlKSxsKGUucGFyZW50Tm9kZSkpfTtpLmZvckVhY2gobCk7dmFyIHU9ZnVuY3Rpb24oZSl7IWV8fGMuaGFzKGUpfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7aWYocy5oYXMoZSkpdShlKTtlbHNlIHRyeXt2YXIgdD1lLmdldEF0dHJpYnV0ZShyKSxpPXQhPT1udWxsJiZ0IT09YGZhbHNlYCxjPShtdC5nZXQoZSl8fDApKzEsbD0oYS5nZXQoZSl8fDApKzE7bXQuc2V0KGUsYyksYS5zZXQoZSxsKSxvLnB1c2goZSksYz09PTEmJmkmJmh0LnNldChlLCEwKSxsPT09MSYmZS5zZXRBdHRyaWJ1dGUobixgdHJ1ZWApLGl8fGUuc2V0QXR0cmlidXRlKHIsYHRydWVgKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKGBhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gYCxlLHQpfX0pfTtyZXR1cm4gdSh0KSxzLmNsZWFyKCksX3QrKyxmdW5jdGlvbigpe28uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1tdC5nZXQoZSktMSxpPWEuZ2V0KGUpLTE7bXQuc2V0KGUsdCksYS5zZXQoZSxpKSx0fHwoaHQuaGFzKGUpfHxlLnJlbW92ZUF0dHJpYnV0ZShyKSxodC5kZWxldGUoZSkpLGl8fGUucmVtb3ZlQXR0cmlidXRlKG4pfSksX3QtLSxfdHx8KG10PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGd0PXt9KX19LHh0PWZ1bmN0aW9uKGUsdCxuKXtuPT09dm9pZCAwJiYobj1gZGF0YS1hcmlhLWhpZGRlbmApO3ZhciByPUFycmF5LmZyb20oQXJyYXkuaXNBcnJheShlKT9lOltlXSksaT10fHxwdChlKTtyZXR1cm4gaT8oci5wdXNoLmFwcGx5KHIsQXJyYXkuZnJvbShpLnF1ZXJ5U2VsZWN0b3JBbGwoYFthcmlhLWxpdmVdLCBzY3JpcHRgKSkpLGJ0KHIsaSxuLGBhcmlhLWhpZGRlbmApKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX07ZnVuY3Rpb24gU3QoZSl7bGV0IHQ7VigoKT0+RGUoZSksZT0+e2xldCBuPSExO3RyeXtuPSEhZT8uY2xvc2VzdChgW3BvcG92ZXJdOm5vdCg6cG9wb3Zlci1vcGVuKWApfWNhdGNoe31lJiYhbj90PXh0KGUpOnQmJnQoKX0pLHdlKCgpPT57dCYmdCgpfSl9ZnVuY3Rpb24gQ3QoZSl7bGV0IHQ9RigpLG49TSgoKT0+dC52YWx1ZT8ud2lkdGg/PzApLHI9TSgoKT0+dC52YWx1ZT8uaGVpZ2h0Pz8wKSxpO3JldHVybiBNZSgoKT0+e2xldCBuPURlKGUpO24/KHQudmFsdWU9e3dpZHRoOm4ub2Zmc2V0V2lkdGgsaGVpZ2h0Om4ub2Zmc2V0SGVpZ2h0fSxpPW5ldyBSZXNpemVPYnNlcnZlcihlPT57aWYoIUFycmF5LmlzQXJyYXkoZSl8fCFlLmxlbmd0aClyZXR1cm47bGV0IHI9ZVswXSxpLGE7aWYoYGJvcmRlckJveFNpemVgaW4gcil7bGV0IGU9ci5ib3JkZXJCb3hTaXplLHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7aT10LmlubGluZVNpemUsYT10LmJsb2NrU2l6ZX1lbHNlIGk9bi5vZmZzZXRXaWR0aCxhPW4ub2Zmc2V0SGVpZ2h0O3QudmFsdWU9e3dpZHRoOmksaGVpZ2h0OmF9fSksaS5vYnNlcnZlKG4se2JveDpgYm9yZGVyLWJveGB9KSk6dC52YWx1ZT12b2lkIDB9KSx3ZSgoKT0+e2k/LmRpc2Nvbm5lY3QoKSxpPXZvaWQgMH0pLHt3aWR0aDpuLGhlaWdodDpyfX1mdW5jdGlvbiB3dChlKXtsZXQgdD1YZShgYCwxZTMpO3JldHVybntzZWFyY2g6dCxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6KG4scik9PntpZih0LnZhbHVlKz1uLGUpZShuKTtlbHNle2xldCBlPW0oKSxuPXIubWFwKGU9Pih7Li4uZSx0ZXh0VmFsdWU6ZS52YWx1ZT8udGV4dFZhbHVlPz9lLnJlZi50ZXh0Q29udGVudD8udHJpbSgpPz9gYH0pKSxpPW4uZmluZCh0PT50LnJlZj09PWUpLGE9RXQobi5tYXAoZT0+ZS50ZXh0VmFsdWUpLHQudmFsdWUsaT8udGV4dFZhbHVlKSxvPW4uZmluZChlPT5lLnRleHRWYWx1ZT09PWEpO3JldHVybiBvJiZvLnJlZi5mb2N1cygpLG8/LnJlZn19LHJlc2V0VHlwZWFoZWFkOigpPT57dC52YWx1ZT1gYH19fWZ1bmN0aW9uIFR0KGUsdCl7cmV0dXJuIGUubWFwKChuLHIpPT5lWyh0K3IpJWUubGVuZ3RoXSl9ZnVuY3Rpb24gRXQoZSx0LG4pe2xldCByPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkoZT0+ZT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xLGE9VHQoZSxNYXRoLm1heChpLDApKTtyLmxlbmd0aD09PTEmJihhPWEuZmlsdGVyKGU9PmUhPT1uKSk7bGV0IG89YS5maW5kKGU9PmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHIudG9Mb3dlckNhc2UoKSkpO3JldHVybiBvPT09bj92b2lkIDA6b312YXIgRHQ9YGRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlYCxPdD1gZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGVgO2Z1bmN0aW9uIGt0KGUsdCl7aWYoISh0IGluc3RhbmNlb2YgRWxlbWVudCkpcmV0dXJuITE7bGV0IG49dC5jbG9zZXN0KGBbZGF0YS1kaXNtaXNzYWJsZS1sYXllcl1gKSxyPWUuZGF0YXNldC5kaXNtaXNzYWJsZUxheWVyPT09YGA/ZTplLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWRpc21pc3NhYmxlLWxheWVyXWApLGk9QXJyYXkuZnJvbShlLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtZGlzbWlzc2FibGUtbGF5ZXJdYCkpO3JldHVybiEhKG4mJihyPT09bnx8aS5pbmRleE9mKHIpPGkuaW5kZXhPZihuKSkpfWZ1bmN0aW9uIEF0KGUsdCxuPSEwKXtsZXQgcj10Py52YWx1ZT8ub3duZXJEb2N1bWVudD8/Z2xvYmFsVGhpcz8uZG9jdW1lbnQsaT1GKCExKSxhPUYoKCk9Pnt9KTtyZXR1cm4gcmUobz0+e2lmKCFofHwhZyhuKSlyZXR1cm47bGV0IHM9YXN5bmMgbj0+e2xldCBvPW4udGFyZ2V0O2lmKCEoIXQ/LnZhbHVlfHwhbykpe2lmKGt0KHQudmFsdWUsbykpe2kudmFsdWU9ITE7cmV0dXJufWlmKG4udGFyZ2V0JiYhaS52YWx1ZSl7bGV0IHQ9e29yaWdpbmFsRXZlbnQ6bn07ZnVuY3Rpb24gaSgpeyRlKER0LGUsdCl9bi5wb2ludGVyVHlwZT09PWB0b3VjaGA/KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpLGEudmFsdWU9aSxyLmFkZEV2ZW50TGlzdGVuZXIoYGNsaWNrYCxhLnZhbHVlLHtvbmNlOiEwfSkpOmkoKX1lbHNlIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpO2kudmFsdWU9ITF9fSxjPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ci5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVyZG93bmAscyl9LDApO28oKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcG9pbnRlcmRvd25gLHMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpfSl9KSx7b25Qb2ludGVyRG93bkNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9fX1mdW5jdGlvbiBqdChlLHQsbj0hMCl7bGV0IHI9dD8udmFsdWU/Lm93bmVyRG9jdW1lbnQ/P2dsb2JhbFRoaXM/LmRvY3VtZW50LGk9RighMSk7cmV0dXJuIHJlKGE9PntpZighaHx8IWcobikpcmV0dXJuO2xldCBvPWFzeW5jIG49PntpZighdD8udmFsdWUpcmV0dXJuO2F3YWl0IHhlKCksYXdhaXQgeGUoKTtsZXQgcj1uLnRhcmdldDshdC52YWx1ZXx8IXJ8fGt0KHQudmFsdWUscil8fG4udGFyZ2V0JiYhaS52YWx1ZSYmJGUoT3QsZSx7b3JpZ2luYWxFdmVudDpufSl9O3IuYWRkRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbyksYSgoKT0+ci5yZW1vdmVFdmVudExpc3RlbmVyKGBmb2N1c2luYCxvKSl9KSx7b25Gb2N1c0NhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9LG9uQmx1ckNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMSl9fX12YXIgTXQ9Uih7X19uYW1lOmBEaXNtaXNzYWJsZUxheWVyYCxwcm9wczp7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH19LGVtaXRzOltgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWAsYGZvY3VzT3V0c2lkZWAsYGludGVyYWN0T3V0c2lkZWAsYGRpc21pc3NgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT5vLnZhbHVlPy5vd25lckRvY3VtZW50Pz9nbG9iYWxUaGlzLmRvY3VtZW50KSxjPU0oKCk9PmV0LmxheWVyc1Jvb3QpLGw9TSgoKT0+by52YWx1ZT9BcnJheS5mcm9tKGMudmFsdWUpLmluZGV4T2Yoby52YWx1ZSk6LTEpLHU9TSgoKT0+ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT4wKSxkPU0oKCk9PntsZXQgZT1BcnJheS5mcm9tKGMudmFsdWUpLFt0XT1bLi4uZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSxuPWUuaW5kZXhPZih0KTtyZXR1cm4gbC52YWx1ZT49bn0pLGY9QXQoYXN5bmMgZT0+e2xldCB0PVsuLi5ldC5icmFuY2hlc10uc29tZSh0PT50Py5jb250YWlucyhlLnRhcmdldCkpOyFuLnByZXNlbnR8fCFkLnZhbHVlfHx0fHwocihgcG9pbnRlckRvd25PdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGF3YWl0IHhlKCksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSxvKSxwPWp0KGU9PntsZXQgdD1bLi4uZXQuYnJhbmNoZXNdLnNvbWUodD0+dD8uY29udGFpbnMoZS50YXJnZXQpKTshbi5wcmVzZW50fHx0fHwocihgZm9jdXNPdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGUuZGVmYXVsdFByZXZlbnRlZHx8cihgZGlzbWlzc2ApKX0sbyk7cmV0dXJuIFQoYEVzY2FwZWAsZT0+e24ucHJlc2VudCYmbC52YWx1ZT09PWMudmFsdWUuc2l6ZS0xJiYocihgZXNjYXBlS2V5RG93bmAsZSksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSksVihbbywoKT0+bi5kaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsKCk9Pm4ucHJlc2VudF0sKFtlLHQsbl0scixpKT0+eyFlfHwhbnx8dCYmKGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cz1zLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWApLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChlKSxpKCgpPT57ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKGUpLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYhc2UoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cykmJihzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1ldC5vcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzKX0pKX0se2ltbWVkaWF0ZTohMH0pLFYoW28sKCk9Pm4ucHJlc2VudF0sKFtlLHRdLG4scik9PnshZXx8IXR8fChjLnZhbHVlLmFkZChlKSxyKCgpPT57Yy52YWx1ZS5kZWxldGUoZSl9KSl9LHtpbW1lZGlhdGU6ITB9KSxyZShlPT57ZSgoKT0+e28udmFsdWUmJihjLnZhbHVlLmRlbGV0ZShvLnZhbHVlKSxldC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoby52YWx1ZSkpfSl9KSwoZSx0KT0+KE4oKSxJKGIoQSkse3JlZjpiKGEpLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsImRhdGEtZGlzbWlzc2FibGUtbGF5ZXIiOmBgLHN0eWxlOmkoe3BvaW50ZXJFdmVudHM6dS52YWx1ZT9kLnZhbHVlP2BhdXRvYDpgbm9uZWA6dm9pZCAwfSksb25Gb2N1c0NhcHR1cmU6YihwKS5vbkZvY3VzQ2FwdHVyZSxvbkJsdXJDYXB0dXJlOmIocCkub25CbHVyQ2FwdHVyZSxvblBvaW50ZXJkb3duQ2FwdHVyZTpiKGYpLm9uUG9pbnRlckRvd25DYXB0dXJlfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2AsYHN0eWxlYCxgb25Gb2N1c0NhcHR1cmVgLGBvbkJsdXJDYXB0dXJlYCxgb25Qb2ludGVyZG93bkNhcHR1cmVgXSkpfX0pLE50PUQoKCk9PkYoW10pKTtmdW5jdGlvbiBQdCgpe2xldCBlPU50KCk7cmV0dXJue2FkZCh0KXtsZXQgbj1lLnZhbHVlWzBdO3QhPT1uJiZuPy5wYXVzZSgpLGUudmFsdWU9RnQoZS52YWx1ZSx0KSxlLnZhbHVlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXtlLnZhbHVlPUZ0KGUudmFsdWUsdCksZS52YWx1ZVswXT8ucmVzdW1lKCl9fX1mdW5jdGlvbiBGdChlLHQpe2xldCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59dmFyIEl0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnRgLEx0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudGAsUnQ9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMH07ZnVuY3Rpb24genQoZSx7c2VsZWN0OnQ9ITF9PXt9KXtsZXQgbj1tKCk7Zm9yKGxldCByIG9mIGUpaWYoR3Qocix7c2VsZWN0OnR9KSxtKCkhPT1uKXJldHVybiEwfWZ1bmN0aW9uIEJ0KGUpe2xldCB0PVZ0KGUpO3JldHVybltIdCh0LGUpLEh0KHQucmV2ZXJzZSgpLGUpXX1mdW5jdGlvbiBWdChlKXtsZXQgdD1bXSxuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCx7YWNjZXB0Tm9kZTplPT57bGV0IHQ9ZS50YWdOYW1lPT09YElOUFVUYCYmZS50eXBlPT09YGhpZGRlbmA7cmV0dXJuIGUuZGlzYWJsZWR8fGUuaGlkZGVufHx0P05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ZS50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIEh0KGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoIVV0KG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIFV0KGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PWBoaWRkZW5gKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PWBub25lYClyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBXdChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJmBzZWxlY3RgaW4gZX1mdW5jdGlvbiBHdChlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2xldCBuPW0oKTtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJld0KGUpJiZ0JiZlLnNlbGVjdCgpfX12YXIgS3Q9Uih7X19uYW1lOmBGb2N1c1Njb3BlYCxwcm9wczp7bG9vcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LHRyYXBwZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Btb3VudEF1dG9Gb2N1c2AsYHVubW91bnRBdXRvRm9jdXNgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgcj1lLGk9dCx7Y3VycmVudFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1GKG51bGwpLGM9UHQoKSxsPW4oe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KTtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PW8udmFsdWU7aWYoIXIudHJhcHBlZClyZXR1cm47ZnVuY3Rpb24gbihlKXtpZihsLnBhdXNlZHx8IXQpcmV0dXJuO2xldCBuPWUudGFyZ2V0O3QuY29udGFpbnMobik/cy52YWx1ZT1uOkd0KHMudmFsdWUse3NlbGVjdDohMH0pfWZ1bmN0aW9uIGkoZSl7aWYobC5wYXVzZWR8fCF0KXJldHVybjtsZXQgbj1lLnJlbGF0ZWRUYXJnZXQ7biE9PW51bGwmJih0LmNvbnRhaW5zKG4pfHxHdChzLnZhbHVlLHtzZWxlY3Q6ITB9KSl9ZnVuY3Rpb24gYShlKXtsZXQgbj1zLnZhbHVlO24hPT1udWxsJiZlLnNvbWUoZT0+ZS5yZW1vdmVkTm9kZXMubGVuZ3RoPjApJiYodC5jb250YWlucyhuKXx8R3QodCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3VzaW5gLG4pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3Vzb3V0YCxpKTtsZXQgYz1uZXcgTXV0YXRpb25PYnNlcnZlcihhKTt0JiZjLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNvdXRgLGkpLGMuZGlzY29ubmVjdCgpfSl9KTtmdW5jdGlvbiB1KGUsdCl7bGV0IG49bmV3IEN1c3RvbUV2ZW50KEl0LFJ0KSxyPWU9PmkoYG1vdW50QXV0b0ZvY3VzYCxlKTtlLmFkZEV2ZW50TGlzdGVuZXIoSXQsciksZS5kaXNwYXRjaEV2ZW50KG4pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihJdCxyKSxuLmRlZmF1bHRQcmV2ZW50ZWR8fCh6dChWdChlKSx7c2VsZWN0OiEwfSksbSgpPT09dCYmR3QoZSkpfXJlKGFzeW5jIGU9PntsZXQgdD1vLnZhbHVlO2lmKGF3YWl0IHhlKCksIXQpcmV0dXJuO3IucHJlc2VudCE9PSExJiZjLmFkZChsKTtsZXQgbj1tKCk7IXQuY29udGFpbnMobikmJnIucHJlc2VudCE9PSExJiZ1KHQsbiksZSgoKT0+e2xldCBlPW5ldyBDdXN0b21FdmVudChMdCxSdCkscj1lPT57aShgdW5tb3VudEF1dG9Gb2N1c2AsZSl9O3QuYWRkRXZlbnRMaXN0ZW5lcihMdCxyKSx0LmRpc3BhdGNoRXZlbnQoZSksdC5zZXRBdHRyaWJ1dGUoYGRhdGEtZm9jdXMtc2NvcGUtdW5tb3VudGluZ2AsYGApLHNldFRpbWVvdXQoKCk9PntlLmRlZmF1bHRQcmV2ZW50ZWR8fEd0KG4/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihMdCxyKSxjLnJlbW92ZShsKSx0LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1mb2N1cy1zY29wZS11bm1vdW50aW5nYCl9LDApfSl9KSxWKCgpPT5yLnByZXNlbnQsYXN5bmMoZSx0KT0+e2lmKCFoKXJldHVybjtpZihlPT09ITEmJnQ9PT0hMCl7Yy5yZW1vdmUobCk7cmV0dXJufWlmKGUhPT0hMHx8dCE9PSExKXJldHVybjtjLmFkZChsKSxhd2FpdCB4ZSgpO2xldCBuPW8udmFsdWU7aWYoIW4pcmV0dXJuO2xldCByPW0oKTtuLmNvbnRhaW5zKHIpfHx1KG4scil9KTtmdW5jdGlvbiBkKGUpe2lmKCFyLmxvb3AmJiFyLnRyYXBwZWR8fGwucGF1c2VkKXJldHVybjtsZXQgdD1lLmtleT09PWBUYWJgJiYhZS5hbHRLZXkmJiFlLmN0cmxLZXkmJiFlLm1ldGFLZXksbj1tKCk7aWYodCYmbil7bGV0IHQ9ZS5jdXJyZW50VGFyZ2V0LFtpLGFdPUJ0KHQpO2kmJmE/IWUuc2hpZnRLZXkmJm49PT1hPyhlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChpLHtzZWxlY3Q6ITB9KSk6ZS5zaGlmdEtleSYmbj09PWkmJihlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChhLHtzZWxlY3Q6ITB9KSk6bj09PXQmJmUucHJldmVudERlZmF1bHQoKX19cmV0dXJuKGUsdCk9PihOKCksSShiKEEpLHtyZWZfa2V5OmBjdXJyZW50UmVmYCxyZWY6YSx0YWJpbmRleDpgLTFgLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25LZXlkb3duOmR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhcy1jaGlsZGAsYGFzYF0pKX19KSxxdD1bYEVudGVyYCxgIGBdLEp0PVtgQXJyb3dEb3duYCxgUGFnZVVwYCxgSG9tZWBdLFl0PVtgQXJyb3dVcGAsYFBhZ2VEb3duYCxgRW5kYF07Wy4uLkp0LC4uLll0XSxbLi4ucXRdLFsuLi5xdF07ZnVuY3Rpb24gWHQoZSl7bGV0IHQ9bSgpO2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHwobi5mb2N1cygpLG0oKSE9PXQpKXJldHVybn12YXIgWnQ9Uih7X19uYW1lOmBUZWxlcG9ydGAscHJvcHM6e3RvOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRlZmVyOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX19LHNldHVwKHQpe2xldCBuPXQscj1zKHt9KSxpPU0oKCk9Pm4udG8/P3IudGVsZXBvcnRUbz8udmFsdWU/P2Bib2R5YCksYT1FZSgpO3JldHVybih0LG4pPT5iKGEpfHx0LmZvcmNlTW91bnQ/KE4oKSxJKGUse2tleTowLHRvOmkudmFsdWUsZGlzYWJsZWQ6dC5kaXNhYmxlZCxkZWZlcjp0LmRlZmVyfSxbeih0LiRzbG90cyxgZGVmYXVsdGApXSw4LFtgdG9gLGBkaXNhYmxlZGAsYGRlZmVyYF0pKTp6ZShgdi1pZmAsITApfX0pLFF0PVIoe19fbmFtZTpgVmlzdWFsbHlIaWRkZW5gLHByb3BzOntmZWF0dXJlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBmb2N1c2FibGVgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkse2FzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsImFyaWEtaGlkZGVuIjplLmZlYXR1cmU9PT1gZm9jdXNhYmxlYHx8ZS5mZWF0dXJlPT09YGZ1bGx5LWhpZGRlbmA/YHRydWVgOnZvaWQgMCwiZGF0YS1oaWRkZW4iOmUuZmVhdHVyZT09PWBmdWxseS1oaWRkZW5gP2BgOnZvaWQgMCx0YWJpbmRleDplLmZlYXR1cmU9PT1gZnVsbHktaGlkZGVuYD9gLTFgOnZvaWQgMCxzdHlsZTp7cG9zaXRpb246YGFic29sdXRlYCxib3JkZXI6MCx3aWR0aDpgMXB4YCxoZWlnaHQ6YDFweGAscGFkZGluZzowLG1hcmdpbjpgLTFweGAsb3ZlcmZsb3c6YGhpZGRlbmAsY2xpcDpgcmVjdCgwLCAwLCAwLCAwKWAsY2xpcFBhdGg6YGluc2V0KDUwJSlgLHdoaXRlU3BhY2U6YG5vd3JhcGAsd29yZFdyYXA6YG5vcm1hbGAsdG9wOmAtMXB4YCxsZWZ0OmAtMXB4YH19LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgYXJpYS1oaWRkZW5gLGBkYXRhLWhpZGRlbmAsYHRhYmluZGV4YF0pKX19KSxbJHQsZW5dPW9lKGBQb3BwZXJSb290YCksdG49Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyUm9vdGAsc2V0dXAoZSl7bGV0IHQ9RigpO3JldHVybiBlbih7YW5jaG9yOnQsb25BbmNob3JDaGFuZ2U6ZT0+dC52YWx1ZT1lfSksKGUsdCk9PnooZS4kc2xvdHMsYGRlZmF1bHRgKX19KSxubj1SKHtfX25hbWU6YFBvcHBlckFuY2hvcmAscHJvcHM6e3JlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPSR0KCk7cmV0dXJuIG8oKCk9PntpLm9uQW5jaG9yQ2hhbmdlKHQucmVmZXJlbmNlPz9yLnZhbHVlKX0pLChlLHQpPT4oTigpLEkoYihBKSx7cmVmOmIobiksYXM6ZS5hcywiYXMtY2hpbGQiOmUuYXNDaGlsZH0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pO2Z1bmN0aW9uIHJuKGUpe3JldHVybiBlIT09bnVsbH1mdW5jdGlvbiBhbihlKXtyZXR1cm57bmFtZTpgdHJhbnNmb3JtT3JpZ2luYCxvcHRpb25zOmUsZm4odCl7bGV0e3BsYWNlbWVudDpuLHJlY3RzOnIsbWlkZGxld2FyZURhdGE6aX09dCxhPWkuYXJyb3c/LmNlbnRlck9mZnNldCE9PTAsbz1hPzA6ZS5hcnJvd1dpZHRoLHM9YT8wOmUuYXJyb3dIZWlnaHQsW2MsbF09b24obiksdT17c3RhcnQ6ZS5kaXI9PT1gcnRsYD9gMTAwJWA6YDAlYCxjZW50ZXI6YDUwJWAsZW5kOmUuZGlyPT09YHJ0bGA/YDAlYDpgMTAwJWB9W2xdLGQ9e3N0YXJ0OmAwJWAsY2VudGVyOmA1MCVgLGVuZDpgMTAwJWB9W2xdLGY9KGkuYXJyb3c/Lng/PzApK28vMixwPShpLmFycm93Py55Pz8wKStzLzIsbT1gYCxoPWBgO3JldHVybiBjPT09YGJvdHRvbWA/KG09YT91OmAke2Z9cHhgLGg9YCR7LXN9cHhgKTpjPT09YHRvcGA/KG09YT91OmAke2Z9cHhgLGg9YCR7ci5mbG9hdGluZy5oZWlnaHQrc31weGApOmM9PT1gcmlnaHRgPyhtPWAkey1zfXB4YCxoPWE/ZDpgJHtwfXB4YCk6Yz09PWBsZWZ0YCYmKG09YCR7ci5mbG9hdGluZy53aWR0aCtzfXB4YCxoPWE/ZDpgJHtwfXB4YCkse2RhdGE6e3g6bSx5Omh9fX19fWZ1bmN0aW9uIG9uKGUpe2xldFt0LG49YGNlbnRlcmBdPWUuc3BsaXQoYC1gKTtyZXR1cm5bdCxuXX12YXIgc249W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSxjbj1NYXRoLm1pbixsbj1NYXRoLm1heCx1bj1NYXRoLnJvdW5kLGRuPU1hdGguZmxvb3IsZm49ZT0+KHt4OmUseTplfSkscG49e2xlZnQ6YHJpZ2h0YCxyaWdodDpgbGVmdGAsYm90dG9tOmB0b3BgLHRvcDpgYm90dG9tYH07ZnVuY3Rpb24gbW4oZSx0LG4pe3JldHVybiBsbihlLGNuKHQsbikpfWZ1bmN0aW9uIGhuKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UodCk6ZX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZS5zcGxpdChgLWApWzBdfWZ1bmN0aW9uIF9uKGUpe3JldHVybiBlLnNwbGl0KGAtYClbMV19ZnVuY3Rpb24gdm4oZSl7cmV0dXJuIGU9PT1geGA/YHlgOmB4YH1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZT09PWB5YD9gaGVpZ2h0YDpgd2lkdGhgfWZ1bmN0aW9uIGJuKGUpe2xldCB0PWVbMF07cmV0dXJuIHQ9PT1gdGB8fHQ9PT1gYmA/YHlgOmB4YH1mdW5jdGlvbiB4bihlKXtyZXR1cm4gdm4oYm4oZSkpfWZ1bmN0aW9uIFNuKGUsdCxuKXtuPT09dm9pZCAwJiYobj0hMSk7bGV0IHI9X24oZSksaT14bihlKSxhPXluKGkpLG89aT09PWB4YD9yPT09KG4/YGVuZGA6YHN0YXJ0YCk/YHJpZ2h0YDpgbGVmdGA6cj09PWBzdGFydGA/YGJvdHRvbWA6YHRvcGA7cmV0dXJuIHQucmVmZXJlbmNlW2FdPnQuZmxvYXRpbmdbYV0mJihvPWpuKG8pKSxbbyxqbihvKV19ZnVuY3Rpb24gQ24oZSl7bGV0IHQ9am4oZSk7cmV0dXJuW3duKGUpLHQsd24odCldfWZ1bmN0aW9uIHduKGUpe3JldHVybiBlLmluY2x1ZGVzKGBzdGFydGApP2UucmVwbGFjZShgc3RhcnRgLGBlbmRgKTplLnJlcGxhY2UoYGVuZGAsYHN0YXJ0YCl9dmFyIFRuPVtgbGVmdGAsYHJpZ2h0YF0sRW49W2ByaWdodGAsYGxlZnRgXSxEbj1bYHRvcGAsYGJvdHRvbWBdLE9uPVtgYm90dG9tYCxgdG9wYF07ZnVuY3Rpb24ga24oZSx0LG4pe3N3aXRjaChlKXtjYXNlYHRvcGA6Y2FzZWBib3R0b21gOnJldHVybiBuP3Q/RW46VG46dD9UbjpFbjtjYXNlYGxlZnRgOmNhc2VgcmlnaHRgOnJldHVybiB0P0RuOk9uO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEFuKGUsdCxuLHIpe2xldCBpPV9uKGUpLGE9a24oZ24oZSksbj09PWBzdGFydGAscik7cmV0dXJuIGkmJihhPWEubWFwKGU9PmUrYC1gK2kpLHQmJihhPWEuY29uY2F0KGEubWFwKHduKSkpKSxhfWZ1bmN0aW9uIGpuKGUpe2xldCB0PWduKGUpO3JldHVybiBwblt0XStlLnNsaWNlKHQubGVuZ3RoKX1mdW5jdGlvbiBNbihlKXtyZXR1cm57dG9wOmUudG9wPz8wLHJpZ2h0OmUucmlnaHQ/PzAsYm90dG9tOmUuYm90dG9tPz8wLGxlZnQ6ZS5sZWZ0Pz8wfX1mdW5jdGlvbiBObihlKXtyZXR1cm4gdHlwZW9mIGU9PWBudW1iZXJgP3t0b3A6ZSxyaWdodDplLGJvdHRvbTplLGxlZnQ6ZX06TW4oZSl9ZnVuY3Rpb24gUG4oZSl7bGV0e3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6aX09ZTtyZXR1cm57d2lkdGg6cixoZWlnaHQ6aSx0b3A6bixsZWZ0OnQscmlnaHQ6dCtyLGJvdHRvbTpuK2kseDp0LHk6bn19ZnVuY3Rpb24gRm4oZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lLGE9Ym4odCksbz14bih0KSxzPXluKG8pLGM9Z24odCksbD1hPT09YHlgLHU9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMixwO3N3aXRjaChjKXtjYXNlYHRvcGA6cD17eDp1LHk6ci55LWkuaGVpZ2h0fTticmVhaztjYXNlYGJvdHRvbWA6cD17eDp1LHk6ci55K3IuaGVpZ2h0fTticmVhaztjYXNlYHJpZ2h0YDpwPXt4OnIueCtyLndpZHRoLHk6ZH07YnJlYWs7Y2FzZWBsZWZ0YDpwPXt4OnIueC1pLndpZHRoLHk6ZH07YnJlYWs7ZGVmYXVsdDpwPXt4OnIueCx5OnIueX19bGV0IG09X24odCk7cmV0dXJuIG0mJihwW29dKz1mKihtPT09YGVuZGA/MTotMSkqKG4mJmw/LTE6MSkpLHB9YXN5bmMgZnVuY3Rpb24gSW4oZSx0KXt0PT09dm9pZCAwJiYodD17fSk7bGV0e3g6bix5OnIscGxhdGZvcm06aSxyZWN0czphLGVsZW1lbnRzOm8sc3RyYXRlZ3k6c309ZSx7Ym91bmRhcnk6Yz1gY2xpcHBpbmdBbmNlc3RvcnNgLHJvb3RCb3VuZGFyeTpsPWB2aWV3cG9ydGAsZWxlbWVudENvbnRleHQ6dT1gZmxvYXRpbmdgLGFsdEJvdW5kYXJ5OmQ9ITEscGFkZGluZzpmPTB9PWhuKHQsZSkscD1ObihmKSxtPW9bZD91PT09YGZsb2F0aW5nYD9gcmVmZXJlbmNlYDpgZmxvYXRpbmdgOnVdLGg9UG4oYXdhaXQgaS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KG0pKT8/ITA/bTptLmNvbnRleHRFbGVtZW50fHxhd2FpdChpLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6aS5nZXREb2N1bWVudEVsZW1lbnQoby5mbG9hdGluZykpLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5Omwsc3RyYXRlZ3k6c30pKSxnPXU9PT1gZmxvYXRpbmdgP3t4Om4seTpyLHdpZHRoOmEuZmxvYXRpbmcud2lkdGgsaGVpZ2h0OmEuZmxvYXRpbmcuaGVpZ2h0fTphLnJlZmVyZW5jZSxfPWF3YWl0KGkuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDppLmdldE9mZnNldFBhcmVudChvLmZsb2F0aW5nKSksdj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoXykpJiZhd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9LHk9UG4oaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdD9hd2FpdCBpLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtlbGVtZW50czpvLHJlY3Q6ZyxvZmZzZXRQYXJlbnQ6XyxzdHJhdGVneTpzfSk6Zyk7cmV0dXJue3RvcDooaC50b3AteS50b3ArcC50b3ApL3YueSxib3R0b206KHkuYm90dG9tLWguYm90dG9tK3AuYm90dG9tKS92LnksbGVmdDooaC5sZWZ0LXkubGVmdCtwLmxlZnQpL3YueCxyaWdodDooeS5yaWdodC1oLnJpZ2h0K3AucmlnaHQpL3YueH19dmFyIExuPTUwLFJuPWFzeW5jKGUsdCxuKT0+e2xldHtwbGFjZW1lbnQ6cj1gYm90dG9tYCxzdHJhdGVneTppPWBhYnNvbHV0ZWAsbWlkZGxld2FyZTphPVtdLHBsYXRmb3JtOm99PW4scz1vLmRldGVjdE92ZXJmbG93P286ey4uLm8sZGV0ZWN0T3ZlcmZsb3c6SW59LGM9YXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTCh0KSksbD1hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSkse3g6dSx5OmR9PUZuKGwscixjKSxmPXIscD0wLG09e307Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKyspe2xldCBoPWFbbl07aWYoIWgpY29udGludWU7bGV0e25hbWU6ZyxmbjpffT1oLHt4OnYseSxkYXRhOmIscmVzZXQ6eH09YXdhaXQgXyh7eDp1LHk6ZCxpbml0aWFsUGxhY2VtZW50OnIscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptLHJlY3RzOmwscGxhdGZvcm06cyxlbGVtZW50czp7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dH19KTt1PXY/P3UsZD15Pz9kLG1bZ109ey4uLm1bZ10sLi4uYn0seCYmcDxMbiYmKHArKyx0eXBlb2YgeD09YG9iamVjdGAmJih4LnBsYWNlbWVudCYmKGY9eC5wbGFjZW1lbnQpLHgucmVjdHMmJihsPXgucmVjdHM9PT0hMD9hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6eC5yZWN0cykse3g6dSx5OmR9PUZuKGwsZixjKSksbj0tMSl9cmV0dXJue3g6dSx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptfX0sem49ZT0+KHtuYW1lOmBhcnJvd2Asb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEscGxhdGZvcm06byxlbGVtZW50czpzLG1pZGRsZXdhcmVEYXRhOmN9PXQse2VsZW1lbnQ6bCxwYWRkaW5nOnU9MH09aG4oZSx0KXx8e307aWYobD09bnVsbClyZXR1cm57fTtsZXQgZD1Obih1KSxmPXt4Om4seTpyfSxwPXhuKGkpLG09eW4ocCksaD1hd2FpdCBvLmdldERpbWVuc2lvbnMobCksZz1wPT09YHlgLF89Zz9gdG9wYDpgbGVmdGAsdj1nP2Bib3R0b21gOmByaWdodGAseT1nP2BjbGllbnRIZWlnaHRgOmBjbGllbnRXaWR0aGAsYj1hLnJlZmVyZW5jZVttXSthLnJlZmVyZW5jZVtwXS1mW3BdLWEuZmxvYXRpbmdbbV0seD1mW3BdLWEucmVmZXJlbmNlW3BdLFM9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KGwpKSxDPVM/U1t5XTowOyghQ3x8IWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudChTKSkpJiYoQz1zLmZsb2F0aW5nW3ldfHxhLmZsb2F0aW5nW21dKTtsZXQgdz1iLzIteC8yLFQ9Qy8yLWhbbV0vMi0xLEU9Y24oZFtfXSxUKSxEPWNuKGRbdl0sVCksTz1DLWhbbV0tRCxrPUMvMi1oW21dLzIrdyxlZT1tbihFLGssTyksdGU9IWMuYXJyb3cmJl9uKGkpIT1udWxsJiZrIT09ZWUmJmEucmVmZXJlbmNlW21dLzItKGs8RT9FOkQpLWhbbV0vMjwwLG5lPXRlP2s8RT9rLUU6ay1POjA7cmV0dXJue1twXTpmW3BdK25lLGRhdGE6e1twXTplZSxjZW50ZXJPZmZzZXQ6ay1lZS1uZSwuLi50ZSYme2FsaWdubWVudE9mZnNldDpuZX19LHJlc2V0OnRlfX19KSxCbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOmBmbGlwYCxvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG47bGV0e3BsYWNlbWVudDpyLG1pZGRsZXdhcmVEYXRhOmkscmVjdHM6YSxpbml0aWFsUGxhY2VtZW50Om8scGxhdGZvcm06cyxlbGVtZW50czpjfT10LHttYWluQXhpczpsPSEwLGNyb3NzQXhpczp1PSEwLGZhbGxiYWNrUGxhY2VtZW50czpkLGZhbGxiYWNrU3RyYXRlZ3k6Zj1gYmVzdEZpdGAsZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbjpwPWBub25lYCxmbGlwQWxpZ25tZW50Om09ITAsLi4uaH09aG4oZSx0KTtpZigobj1pLmFycm93KSE9bnVsbCYmbi5hbGlnbm1lbnRPZmZzZXQpcmV0dXJue307bGV0IGc9Z24ociksXz1ibihvKSx2PWduKG8pPT09byx5PWF3YWl0KHMuaXNSVEw9PW51bGw/dm9pZCAwOnMuaXNSVEwoYy5mbG9hdGluZykpLGI9ZHx8KHZ8fCFtP1tqbihvKV06Q24obykpLHg9cCE9PWBub25lYDshZCYmeCYmYi5wdXNoKC4uLkFuKG8sbSxwLHkpKTtsZXQgUz1bbywuLi5iXSxDPWF3YWl0IHMuZGV0ZWN0T3ZlcmZsb3codCxoKSx3PVtdLFQ9aS5mbGlwPy5vdmVyZmxvd3N8fFtdO2lmKGwmJncucHVzaChDW2ddKSx1KXtsZXQgZT1TbihyLGEseSk7dy5wdXNoKENbZVswXV0sQ1tlWzFdXSl9aWYoVD1bLi4uVCx7cGxhY2VtZW50OnIsb3ZlcmZsb3dzOnd9XSwhdy5ldmVyeShlPT5lPD0wKSl7bGV0IGU9KGkuZmxpcD8uaW5kZXh8fDApKzEsdD1TW2VdO2lmKHQmJih1IT09YGFsaWdubWVudGB8fF89PT1ibih0KXx8VC5ldmVyeShlPT5ibihlLnBsYWNlbWVudCkhPT1ffHxlLm92ZXJmbG93c1swXT4wKSkpcmV0dXJue2RhdGE6e2luZGV4OmUsb3ZlcmZsb3dzOlR9LHJlc2V0OntwbGFjZW1lbnQ6dH19O2xldCBuPVQuZmlsdGVyKGU9PmUub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChlLHQpPT5lLm92ZXJmbG93c1sxXS10Lm92ZXJmbG93c1sxXSlbMF0/LnBsYWNlbWVudDtpZighbilzd2l0Y2goZil7Y2FzZWBiZXN0Rml0YDp7bGV0IGU9VC5maWx0ZXIoZT0+e2lmKHgpe2xldCB0PWJuKGUucGxhY2VtZW50KTtyZXR1cm4gdD09PV98fHQ9PT1geWB9cmV0dXJuITB9KS5tYXAoZT0+W2UucGxhY2VtZW50LGUub3ZlcmZsb3dzLmZpbHRlcihlPT5lPjApLnJlZHVjZSgoZSx0KT0+ZSt0LDApXSkuc29ydCgoZSx0KT0+ZVsxXS10WzFdKVswXT8uWzBdO2UmJihuPWUpO2JyZWFrfWNhc2VgaW5pdGlhbFBsYWNlbWVudGA6bj1vfWlmKHIhPT1uKXJldHVybntyZXNldDp7cGxhY2VtZW50Om59fX1yZXR1cm57fX19fTtmdW5jdGlvbiBWbihlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gc24uc29tZSh0PT5lW3RdPj0wKX12YXIgVW49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZTpgaGlkZWAsb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHtyZWN0czpuLHBsYXRmb3JtOnJ9PXQse3N0cmF0ZWd5Omk9YHJlZmVyZW5jZUhpZGRlbmAsLi4uYX09aG4oZSx0KTtzd2l0Y2goaSl7Y2FzZWByZWZlcmVuY2VIaWRkZW5gOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsZWxlbWVudENvbnRleHQ6YHJlZmVyZW5jZWB9KSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6ZSxyZWZlcmVuY2VIaWRkZW46SG4oZSl9fX1jYXNlYGVzY2FwZWRgOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsYWx0Qm91bmRhcnk6ITB9KSxuLmZsb2F0aW5nKTtyZXR1cm57ZGF0YTp7ZXNjYXBlZE9mZnNldHM6ZSxlc2NhcGVkOkhuKGUpfX19ZGVmYXVsdDpyZXR1cm57fX19fX0sV249bmV3IFNldChbYGxlZnRgLGB0b3BgXSk7YXN5bmMgZnVuY3Rpb24gR24oZSx0KXtsZXR7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLGE9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbz1nbihuKSxzPV9uKG4pLGM9Ym4obik9PT1geWAsbD1Xbi5oYXMobyk/LTE6MSx1PWEmJmM/LTE6MSxkPWhuKHQsZSkse21haW5BeGlzOmYsY3Jvc3NBeGlzOnAsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09YG51bWJlcmA/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6ZC5tYWluQXhpc3x8MCxjcm9zc0F4aXM6ZC5jcm9zc0F4aXN8fDAsYWxpZ25tZW50QXhpczpkLmFsaWdubWVudEF4aXN9O3JldHVybiBzJiZ0eXBlb2YgbT09YG51bWJlcmAmJihwPXM9PT1gZW5kYD9tKi0xOm0pLGM/e3g6cCp1LHk6ZipsfTp7eDpmKmwseTpwKnV9fXZhciBLbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6YG9mZnNldGAsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuO2xldHt4OnIseTppLHBsYWNlbWVudDphLG1pZGRsZXdhcmVEYXRhOm99PXQscz1hd2FpdCBHbih0LGUpO3JldHVybiBhPT09by5vZmZzZXQ/LnBsYWNlbWVudCYmKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0P3t9Ont4OnIrcy54LHk6aStzLnksZGF0YTp7Li4ucyxwbGFjZW1lbnQ6YX19fX19LHFuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNoaWZ0YCxvcHRpb25zOmUsYXN5bmMgZm4odCl7bGV0e3g6bix5OnIscGxhY2VtZW50OmkscGxhdGZvcm06YX09dCx7bWFpbkF4aXM6bz0hMCxjcm9zc0F4aXM6cz0hMSxsaW1pdGVyOmM9e2ZuOmU9PntsZXR7eDp0LHk6bn09ZTtyZXR1cm57eDp0LHk6bn19fSwuLi5sfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9YXdhaXQgYS5kZXRlY3RPdmVyZmxvdyh0LGwpLGY9Ym4oaSkscD12bihmKSxtPXVbcF0saD11W2ZdLGc9KGUsdCk9Pm1uKHQrZFtlPT09YHlgP2B0b3BgOmBsZWZ0YF0sdCx0LWRbZT09PWB5YD9gYm90dG9tYDpgcmlnaHRgXSk7byYmKG09ZyhwLG0pKSxzJiYoaD1nKGYsaCkpO2xldCBfPWMuZm4oey4uLnQsW3BdOm0sW2ZdOmh9KTtyZXR1cm57Li4uXyxkYXRhOnt4Ol8ueC1uLHk6Xy55LXIsZW5hYmxlZDp7W3BdOm8sW2ZdOnN9fX19fX0sSm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7b3B0aW9uczplLGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6b309dCx7b2Zmc2V0OnM9MCxtYWluQXhpczpjPSEwLGNyb3NzQXhpczpsPSEwfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9Ym4oaSksZj12bihkKSxwPXVbZl0sbT11W2RdLGg9aG4ocyx0KSxnPXR5cGVvZiBoPT1gbnVtYmVyYD97bWFpbkF4aXM6aCxjcm9zc0F4aXM6MH06e21haW5BeGlzOmgubWFpbkF4aXM/PzAsY3Jvc3NBeGlzOmguY3Jvc3NBeGlzPz8wfTtpZihjKXtsZXQgZT1mPT09YHlgP2BoZWlnaHRgOmB3aWR0aGAsdD1hLnJlZmVyZW5jZVtmXS1hLmZsb2F0aW5nW2VdK2cubWFpbkF4aXMsbj1hLnJlZmVyZW5jZVtmXSthLnJlZmVyZW5jZVtlXS1nLm1haW5BeGlzO3A8dD9wPXQ6cD5uJiYocD1uKX1pZihsKXtsZXQgZT1mPT09YHlgP2B3aWR0aGA6YGhlaWdodGAsdD1Xbi5oYXMoZ24oaSkpLG49YS5yZWZlcmVuY2VbZF0tYS5mbG9hdGluZ1tlXSsodCYmby5vZmZzZXQ/LltkXXx8MCkrKHQ/MDpnLmNyb3NzQXhpcykscj1hLnJlZmVyZW5jZVtkXSthLnJlZmVyZW5jZVtlXSsodD8wOm8ub2Zmc2V0Py5bZF18fDApLSh0P2cuY3Jvc3NBeGlzOjApO208bj9tPW46bT5yJiYobT1yKX1yZXR1cm57W2ZdOnAsW2RdOm19fX19LFluPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNpemVgLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtsZXR7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOmF9PXQse2FwcGx5Om89KCk9Pnt9LC4uLnN9PWhuKGUsdCksYz1hd2FpdCBpLmRldGVjdE92ZXJmbG93KHQscyksbD1nbihuKSx1PV9uKG4pLGQ9Ym4obik9PT1geWAse3dpZHRoOmYsaGVpZ2h0OnB9PXIuZmxvYXRpbmcsbSxoO2w9PT1gdG9wYHx8bD09PWBib3R0b21gPyhtPWwsaD11PT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoYS5mbG9hdGluZykpP2BzdGFydGA6YGVuZGApP2BsZWZ0YDpgcmlnaHRgKTooaD1sLG09dT09PWBlbmRgP2B0b3BgOmBib3R0b21gKTtsZXQgZz1wLWMudG9wLWMuYm90dG9tLF89Zi1jLmxlZnQtYy5yaWdodCx2PWNuKHAtY1ttXSxnKSx5PWNuKGYtY1toXSxfKSxiPXQubWlkZGxld2FyZURhdGEuc2hpZnQseD0hYixTPXYsQz15O2IhPW51bGwmJmIuZW5hYmxlZC54JiYoQz1fKSxiIT1udWxsJiZiLmVuYWJsZWQueSYmKFM9ZykseCYmIXUmJihkP0M9Zi0yKmxuKGMubGVmdCxjLnJpZ2h0KTpTPXAtMipsbihjLnRvcCxjLmJvdHRvbSkpLGF3YWl0IG8oey4uLnQsYXZhaWxhYmxlV2lkdGg6QyxhdmFpbGFibGVIZWlnaHQ6U30pO2xldCB3PWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhhLmZsb2F0aW5nKTtyZXR1cm4gZiE9PXcud2lkdGh8fHAhPT13LmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gWG4oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzxgdWB9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuICRuKGUpPyhlLm5vZGVOYW1lfHxgYCkudG9Mb3dlckNhc2UoKTpgI2RvY3VtZW50YH1mdW5jdGlvbiBIKGUpe3ZhciB0O3JldHVybihlPT1udWxsfHwodD1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRlZmF1bHRWaWV3KXx8d2luZG93fWZ1bmN0aW9uIFFuKGUpe3JldHVybigoJG4oZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPy5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gJG4oZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBIKGUpLk5vZGU6ITF9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBIKGUpLkVsZW1lbnQ6ITF9ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHxlIGluc3RhbmNlb2YgSChlKS5IVE1MRWxlbWVudDohMX1mdW5jdGlvbiBucihlKXtyZXR1cm4hWG4oKXx8dHlwZW9mIFNoYWRvd1Jvb3Q+YHVgPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgSChlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHJyKGUpe2xldHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09bXIoZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiZpIT09YGlubGluZWAmJmkhPT1gY29udGVudHNgfWZ1bmN0aW9uIGlyKGUpe3JldHVybi9eKHRhYmxlfHRkfHRoKSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIGFyKGUpe3RyeXtpZihlLm1hdGNoZXMoYDpwb3BvdmVyLW9wZW5gKSlyZXR1cm4hMH1jYXRjaHt9dHJ5e3JldHVybiBlLm1hdGNoZXMoYDptb2RhbGApfWNhdGNoe3JldHVybiExfX12YXIgb3I9L3RyYW5zZm9ybXx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHBlcnNwZWN0aXZlfGZpbHRlci8sc3I9L3BhaW50fGxheW91dHxzdHJpY3R8Y29udGVudC8sY3I9ZT0+ISFlJiZlIT09YG5vbmVgLGxyO2Z1bmN0aW9uIHVyKGUpe2xldCB0PWVyKGUpP21yKGUpOmU7cmV0dXJuIGNyKHQudHJhbnNmb3JtKXx8Y3IodC50cmFuc2xhdGUpfHxjcih0LnNjYWxlKXx8Y3IodC5yb3RhdGUpfHxjcih0LnBlcnNwZWN0aXZlKXx8IWZyKCkmJihjcih0LmJhY2tkcm9wRmlsdGVyKXx8Y3IodC5maWx0ZXIpKXx8b3IudGVzdCh0LndpbGxDaGFuZ2V8fGBgKXx8c3IudGVzdCh0LmNvbnRhaW58fGBgKX1mdW5jdGlvbiBkcihlKXtsZXQgdD1ncihlKTtmb3IoO3RyKHQpJiYhcHIodCk7KXtpZih1cih0KSlyZXR1cm4gdDtpZihhcih0KSlyZXR1cm4gbnVsbDt0PWdyKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIGZyKCl7cmV0dXJuIGxyPz89dHlwZW9mIENTUzxgdWAmJkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKGAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcmAsYG5vbmVgKSxscn1mdW5jdGlvbiBwcihlKXtyZXR1cm4vXihodG1sfGJvZHl8I2RvY3VtZW50KSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIG1yKGUpe3JldHVybiBIKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIGVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUuc2Nyb2xsWCxzY3JvbGxUb3A6ZS5zY3JvbGxZfX1mdW5jdGlvbiBncihlKXtpZihabihlKT09PWBodG1sYClyZXR1cm4gZTtsZXQgdD1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHxucihlKSYmZS5ob3N0fHxRbihlKTtyZXR1cm4gbnIodCk/dC5ob3N0OnR9ZnVuY3Rpb24gX3IoZSl7bGV0IHQ9Z3IoZSk7cmV0dXJuIHByKHQpPyhlLm93bmVyRG9jdW1lbnR8fGUpLmJvZHk6dHIodCkmJnJyKHQpP3Q6X3IodCl9ZnVuY3Rpb24gdnIoZSx0LG4pe3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7bGV0IHI9X3IoZSksaT1yPT09ZS5vd25lckRvY3VtZW50Py5ib2R5LGE9SChyKTtpZihpKXtsZXQgZT15cihhKTtyZXR1cm4gdC5jb25jYXQoYSxhLnZpc3VhbFZpZXdwb3J0fHxbXSxycihyKT9yOltdLGUmJm4/dnIoZSk6W10pfXJldHVybiB0LmNvbmNhdChyLHZyKHIsW10sbikpfWZ1bmN0aW9uIHlyKGUpe3JldHVybiBlLnBhcmVudCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUucGFyZW50KT9lLmZyYW1lRWxlbWVudDpudWxsfWZ1bmN0aW9uIGJyKGUpe2xldCB0PW1yKGUpLG49cGFyc2VGbG9hdCh0LndpZHRoKXx8MCxyPXBhcnNlRmxvYXQodC5oZWlnaHQpfHwwLGk9dHIoZSksYT1pP2Uub2Zmc2V0V2lkdGg6bixvPWk/ZS5vZmZzZXRIZWlnaHQ6cixzPXVuKG4pIT09YXx8dW4ocikhPT1vO3JldHVybiBzJiYobj1hLHI9bykse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gZXIoZSk/ZTplLmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIFNyKGUpe2xldCB0PXhyKGUpO2lmKCF0cih0KSlyZXR1cm4gZm4oMSk7bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOmF9PWJyKHQpLG89KGE/dW4obi53aWR0aCk6bi53aWR0aCkvcixzPShhP3VuKG4uaGVpZ2h0KTpuLmhlaWdodCkvaTtyZXR1cm4oIW98fCFOdW1iZXIuaXNGaW5pdGUobykpJiYobz0xKSwoIXN8fCFOdW1iZXIuaXNGaW5pdGUocykpJiYocz0xKSx7eDpvLHk6c319dmFyIENyPWZuKDApO2Z1bmN0aW9uIHdyKGUpe2xldCB0PUgoZSk7cmV0dXJuIWZyKCl8fCF0LnZpc3VhbFZpZXdwb3J0P0NyOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBUcihlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhIW4mJnQmJm49PT1IKGUpfWZ1bmN0aW9uIEVyKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7bGV0IGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXhyKGUpLG89Zm4oMSk7dCYmKHI/ZXIocikmJihvPVNyKHIpKTpvPVNyKGUpKTtsZXQgcz1UcihhLG4scik/d3IoYSk6Zm4oMCksYz0oaS5sZWZ0K3MueCkvby54LGw9KGkudG9wK3MueSkvby55LHU9aS53aWR0aC9vLngsZD1pLmhlaWdodC9vLnk7aWYoYSYmcil7bGV0IGU9SChhKSx0PWVyKHIpP0gocik6cixuPWUsaT15cihuKTtmb3IoO2kmJnQhPT1uOyl7bGV0IGU9U3IoaSksdD1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bXIoaSksYT10LmxlZnQrKGkuY2xpZW50TGVmdCtwYXJzZUZsb2F0KHIucGFkZGluZ0xlZnQpKSplLngsbz10LnRvcCsoaS5jbGllbnRUb3ArcGFyc2VGbG9hdChyLnBhZGRpbmdUb3ApKSplLnk7Yyo9ZS54LGwqPWUueSx1Kj1lLngsZCo9ZS55LGMrPWEsbCs9byxuPUgoaSksaT15cihuKX19cmV0dXJuIFBuKHt3aWR0aDp1LGhlaWdodDpkLHg6Yyx5Omx9KX1mdW5jdGlvbiBEcihlLHQpe2xldCBuPWhyKGUpLnNjcm9sbExlZnQ7cmV0dXJuIHQ/dC5sZWZ0K246RXIoUW4oZSkpLmxlZnQrbn1mdW5jdGlvbiBPcihlLHQpe2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6bi5sZWZ0K3Quc2Nyb2xsTGVmdC1EcihlLG4pLHk6bi50b3ArdC5zY3JvbGxUb3B9fWZ1bmN0aW9uIGtyKGUpe2xldHtlbGVtZW50czp0LHJlY3Q6bixvZmZzZXRQYXJlbnQ6cixzdHJhdGVneTppfT1lLGE9aT09PWBmaXhlZGAsbz1RbihyKSxzPXQ/YXIodC5mbG9hdGluZyk6ITE7aWYocj09PW98fHMmJmEpcmV0dXJuIG47bGV0IGM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD1mbigxKSx1PWZuKDApLGQ9dHIocik7aWYoKGR8fCFhKSYmKChabihyKSE9PWBib2R5YHx8cnIobykpJiYoYz1ocihyKSksZCkpe2xldCBlPUVyKHIpO2w9U3IociksdS54PWUueCtyLmNsaWVudExlZnQsdS55PWUueStyLmNsaWVudFRvcH1sZXQgZj1vJiYhZCYmIWE/T3IobyxjKTpmbigwKTtyZXR1cm57d2lkdGg6bi53aWR0aCpsLngsaGVpZ2h0Om4uaGVpZ2h0KmwueSx4Om4ueCpsLngtYy5zY3JvbGxMZWZ0KmwueCt1LngrZi54LHk6bi55KmwueS1jLnNjcm9sbFRvcCpsLnkrdS55K2YueX19ZnVuY3Rpb24gQXIoZSl7cmV0dXJuIGUuZ2V0Q2xpZW50UmVjdHM/QXJyYXkuZnJvbShlLmdldENsaWVudFJlY3RzKCkpOltdfWZ1bmN0aW9uIGpyKGUpe2xldCB0PWhyKGUpLG49ZS5vd25lckRvY3VtZW50LmJvZHkscj1sbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsbi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoKSxpPWxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0KSxhPS10LnNjcm9sbExlZnQrRHIoZSksbz0tdC5zY3JvbGxUb3A7cmV0dXJuIG1yKG4pLmRpcmVjdGlvbj09PWBydGxgJiYoYSs9bG4oZS5jbGllbnRXaWR0aCxuLmNsaWVudFdpZHRoKS1yKSx7d2lkdGg6cixoZWlnaHQ6aSx4OmEseTpvfX12YXIgTXI9MjU7ZnVuY3Rpb24gTnIoZSx0LG4pe249PT12b2lkIDAmJihuPWB2aWV3cG9ydGApO2xldCByPW49PT1gbGF5b3V0Vmlld3BvcnRgLGk9SChlKSxhPVFuKGUpLG89aS52aXN1YWxWaWV3cG9ydCxzPWEuY2xpZW50V2lkdGgsYz1hLmNsaWVudEhlaWdodCxsPTAsdT0wO2lmKG8pe2xldCBlPSFmcigpfHx0PT09YGZpeGVkYDtyP2V8fChsPS1vLm9mZnNldExlZnQsdT0tby5vZmZzZXRUb3ApOihzPW8ud2lkdGgsYz1vLmhlaWdodCxlJiYobD1vLm9mZnNldExlZnQsdT1vLm9mZnNldFRvcCkpfWlmKERyKGEpPD0wKXtsZXQgZT1hLm93bmVyRG9jdW1lbnQsdD1lLmJvZHksbj1nZXRDb21wdXRlZFN0eWxlKHQpLHI9ZS5jb21wYXRNb2RlPT09YENTUzFDb21wYXRgJiZwYXJzZUZsb2F0KG4ubWFyZ2luTGVmdCkrcGFyc2VGbG9hdChuLm1hcmdpblJpZ2h0KXx8MCxpPU1hdGguYWJzKGEuY2xpZW50V2lkdGgtdC5jbGllbnRXaWR0aC1yKSxvPWdldENvbXB1dGVkU3R5bGUoYSkuc2Nyb2xsYmFyR3V0dGVyPT09YHN0YWJsZSBib3RoLWVkZ2VzYD9pLzI6aTtvPD1NciYmKHMtPW8pfXJldHVybnt3aWR0aDpzLGhlaWdodDpjLHg6bCx5OnV9fWZ1bmN0aW9uIFByKGUsdCl7bGV0IG49RXIoZSwhMCx0PT09YGZpeGVkYCkscj1uLnRvcCtlLmNsaWVudFRvcCxpPW4ubGVmdCtlLmNsaWVudExlZnQsYT1TcihlKTtyZXR1cm57d2lkdGg6ZS5jbGllbnRXaWR0aCphLngsaGVpZ2h0OmUuY2xpZW50SGVpZ2h0KmEueSx4OmkqYS54LHk6ciphLnl9fWZ1bmN0aW9uIEZyKGUsdCxuKXtsZXQgcjtpZih0PT09YHZpZXdwb3J0YHx8dD09PWBsYXlvdXRWaWV3cG9ydGApcj1OcihlLG4sdCk7ZWxzZSBpZih0PT09YGRvY3VtZW50YClyPWpyKFFuKGUpKTtlbHNlIGlmKGVyKHQpKXI9UHIodCxuKTtlbHNle2xldCBuPXdyKGUpO3I9e3g6dC54LW4ueCx5OnQueS1uLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiBQbihyKX1mdW5jdGlvbiBJcihlLHQpe2xldCBuPXQuZ2V0KGUpO2lmKG4pcmV0dXJuIG47bGV0IHI9dnIoZSxbXSwhMSkuZmlsdGVyKGU9PmVyKGUpJiZabihlKSE9PWBib2R5YCksaT1udWxsLGE9bXIoZSkucG9zaXRpb249PT1gZml4ZWRgLG89YT9ncihlKTplO2Zvcig7ZXIobykmJiFwcihvKTspe2xldCBlPW1yKG8pLHQ9dXIobyksbj1pP2kucG9zaXRpb246YT9gZml4ZWRgOmBgOyF0JiYobj09PWBmaXhlZGB8fG49PT1gYWJzb2x1dGVgJiZlLnBvc2l0aW9uPT09YHN0YXRpY2ApP3I9ci5maWx0ZXIoZT0+ZSE9PW8pOmk9ZSxvPWdyKG8pfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gTHIoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWUsYT1bLi4ubj09PWBjbGlwcGluZ0FuY2VzdG9yc2A/YXIodCk/W106SXIodCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0sbz1Gcih0LGFbMF0saSkscz1vLnRvcCxjPW8ucmlnaHQsbD1vLmJvdHRvbSx1PW8ubGVmdDtmb3IobGV0IGU9MTtlPGEubGVuZ3RoO2UrKyl7bGV0IG49RnIodCxhW2VdLGkpO3M9bG4obi50b3AscyksYz1jbihuLnJpZ2h0LGMpLGw9Y24obi5ib3R0b20sbCksdT1sbihuLmxlZnQsdSl9cmV0dXJue3dpZHRoOmMtdSxoZWlnaHQ6bC1zLHg6dSx5OnN9fWZ1bmN0aW9uIFJyKGUpe2xldHt3aWR0aDp0LGhlaWdodDpufT1icihlKTtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6bn19ZnVuY3Rpb24genIoZSx0LG4pe2xldCByPXRyKHQpLGk9UW4odCksYT1uPT09YGZpeGVkYCxvPUVyKGUsITAsYSx0KSxzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGM9Zm4oMCk7aWYoKHJ8fCFhKSYmKChabih0KSE9PWBib2R5YHx8cnIoaSkpJiYocz1ocih0KSkscikpe2xldCBlPUVyKHQsITAsYSx0KTtjLng9ZS54K3QuY2xpZW50TGVmdCxjLnk9ZS55K3QuY2xpZW50VG9wfSFyJiZpJiYoYy54PURyKGkpKTtsZXQgbD1pJiYhciYmIWE/T3IoaSxzKTpmbigwKTtyZXR1cm57eDpvLmxlZnQrcy5zY3JvbGxMZWZ0LWMueC1sLngseTpvLnRvcCtzLnNjcm9sbFRvcC1jLnktbC55LHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX1mdW5jdGlvbiBCcihlKXtyZXR1cm4gbXIoZSkucG9zaXRpb249PT1gc3RhdGljYH1mdW5jdGlvbiBWcihlLHQpe2lmKCF0cihlKXx8bXIoZSkucG9zaXRpb249PT1gZml4ZWRgKXJldHVybiBudWxsO2lmKHQpcmV0dXJuIHQoZSk7bGV0IG49ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIFFuKGUpPT09biYmKG49bi5vd25lckRvY3VtZW50LmJvZHkpLG59ZnVuY3Rpb24gSHIoZSx0KXtsZXQgbj1IKGUpO2lmKGFyKGUpKXJldHVybiBuO2lmKCF0cihlKSl7bGV0IHQ9Z3IoZSk7Zm9yKDt0JiYhcHIodCk7KXtpZihlcih0KSYmIUJyKHQpKXJldHVybiB0O3Q9Z3IodCl9cmV0dXJuIG59bGV0IHI9VnIoZSx0KTtmb3IoO3ImJmlyKHIpJiZCcihyKTspcj1WcihyLHQpO3JldHVybiByJiZwcihyKSYmQnIocikmJiF1cihyKT9uOnJ8fGRyKGUpfHxufXZhciBVcj1hc3luYyBmdW5jdGlvbihlKXtsZXQgdD10aGlzLmdldE9mZnNldFBhcmVudHx8SHIsbj10aGlzLmdldERpbWVuc2lvbnMscj1hd2FpdCBuKGUuZmxvYXRpbmcpO3JldHVybntyZWZlcmVuY2U6enIoZS5yZWZlcmVuY2UsYXdhaXQgdChlLmZsb2F0aW5nKSxlLnN0cmF0ZWd5KSxmbG9hdGluZzp7eDowLHk6MCx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH19fTtmdW5jdGlvbiBXcihlKXtyZXR1cm4gbXIoZSkuZGlyZWN0aW9uPT09YHJ0bGB9dmFyIEdyPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDprcixnZXREb2N1bWVudEVsZW1lbnQ6UW4sZ2V0Q2xpcHBpbmdSZWN0OkxyLGdldE9mZnNldFBhcmVudDpIcixnZXRFbGVtZW50UmVjdHM6VXIsZ2V0Q2xpZW50UmVjdHM6QXIsZ2V0RGltZW5zaW9uczpScixnZXRTY2FsZTpTcixpc0VsZW1lbnQ6ZXIsaXNSVEw6V3J9O2Z1bmN0aW9uIEtyKGUsdCl7cmV0dXJuIGUueD09PXQueCYmZS55PT09dC55JiZlLndpZHRoPT09dC53aWR0aCYmZS5oZWlnaHQ9PT10LmhlaWdodH1mdW5jdGlvbiBxcihlLHQsbil7bGV0IHI9bnVsbCxpLGE9UW4oZSk7ZnVuY3Rpb24gbygpe3ZhciBlO2NsZWFyVGltZW91dChpKSwoZT1yKT09bnVsbHx8ZS5kaXNjb25uZWN0KCkscj1udWxsfWZ1bmN0aW9uIHMobixjKXtuPT09dm9pZCAwJiYobj0hMSksYz09PXZvaWQgMCYmKGM9MSksbygpO2xldCBsPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2xlZnQ6dSx0b3A6ZCx3aWR0aDpmLGhlaWdodDpwfT1sO2lmKG58fHQoKSwhZnx8IXApcmV0dXJuO2xldCBtPWRuKGQpLGg9ZG4oYS5jbGllbnRXaWR0aC0odStmKSksZz1kbihhLmNsaWVudEhlaWdodC0oZCtwKSksXz1kbih1KSx2PXtyb290TWFyZ2luOi1tK2BweCBgKy1oK2BweCBgKy1nK2BweCBgKy1fK2BweGAsdGhyZXNob2xkOmxuKDAsY24oMSxjKSl8fDF9LHk9ITA7ZnVuY3Rpb24gYih0KXtsZXQgbj10WzBdLmludGVyc2VjdGlvblJhdGlvO2lmKCFLcihsLGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKXJldHVybiBzKCk7aWYobiE9PWMpe2lmKCF5KXJldHVybiBzKCk7bj9zKCExLG4pOmk9c2V0VGltZW91dCgoKT0+e3MoITEsMWUtNyl9LDFlMyl9eT0hMX10cnl7cj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYix7Li4udixyb290OmEub3duZXJEb2N1bWVudH0pfWNhdGNoe3I9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGIsdil9ci5vYnNlcnZlKGUpfWxldCBjPUgoZSksbD0oKT0+cyhuKTtyZXR1cm4gYy5hZGRFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLHMoITApLCgpPT57Yy5yZW1vdmVFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLG8oKX19ZnVuY3Rpb24gSnIoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2xldHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOmE9ITAsZWxlbWVudFJlc2l6ZTpvPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09YGZ1bmN0aW9uYCxsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09YGZ1bmN0aW9uYCxhbmltYXRpb25GcmFtZTpjPSExfT1yLGw9eHIoZSksdT1pfHxhP1suLi5sP3ZyKGwpOltdLC4uLnQ/dnIodCk6W11dOltdO3UuZm9yRWFjaChlPT57aSYmZS5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUuYWRkRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pO2xldCBkPWwmJnM/cXIobCxuLGEpOm51bGwsZj0tMSxwPW51bGw7byYmKHA9bmV3IFJlc2l6ZU9ic2VydmVyKGU9PntsZXRbcl09ZTtyJiZyLnRhcmdldD09PWwmJnAmJnQmJihwLnVub2JzZXJ2ZSh0KSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3ZhciBlOyhlPXApPT1udWxsfHxlLm9ic2VydmUodCl9KSksbigpfSksbCYmIWMmJnAub2JzZXJ2ZShsKSx0JiZwLm9ic2VydmUodCkpO2xldCBtLGg9Yz9FcihlKTpudWxsO2MmJmcoKTtmdW5jdGlvbiBnKCl7bGV0IHQ9RXIoZSk7aCYmIUtyKGgsdCkmJm4oKSxoPXQsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZyl9cmV0dXJuIG4oKSwoKT0+e3ZhciBlO3UuZm9yRWFjaChlPT57aSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pLGQ/LigpLChlPXApPT1udWxsfHxlLmRpc2Nvbm5lY3QoKSxwPW51bGwsYyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fXZhciBZcj1LbixYcj1xbixacj1CbixRcj1Zbiwkcj1VbixlaT16bix0aT1KbixuaT0oZSx0LG4pPT57bGV0IHI9bmV3IE1hcCxpPW4/P3t9LGE9ey4uLkdyLC4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIFJuKGUsdCx7Li4uaSxwbGF0Zm9ybTphfSl9O2Z1bmN0aW9uIHJpKGUpe3JldHVybiB0eXBlb2YgZT09YG9iamVjdGAmJiEhZSYmYCRlbGBpbiBlfWZ1bmN0aW9uIGlpKGUpe2lmKHJpKGUpKXtsZXQgdD1lLiRlbDtyZXR1cm4gJG4odCkmJlpuKHQpPT09YCNjb21tZW50YD9udWxsOnR9cmV0dXJuIGV9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UoKTpiKGUpfWZ1bmN0aW9uIG9pKGUpe3JldHVybntuYW1lOmBhcnJvd2Asb3B0aW9uczplLGZuKHQpe2xldCBuPWlpKGFpKGUuZWxlbWVudCkpO3JldHVybiBuPT1udWxsP3t9OmVpKHtlbGVtZW50Om4scGFkZGluZzplLnBhZGRpbmd9KS5mbih0KX19fWZ1bmN0aW9uIHNpKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PmB1YD8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBjaShlLHQpe2xldCBuPXNpKGUpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1mdW5jdGlvbiBsaShlLHQsbil7bj09PXZvaWQgMCYmKG49e30pO2xldCByPW4ud2hpbGVFbGVtZW50c01vdW50ZWQsaT1NKCgpPT5haShuLm9wZW4pPz8hMCksYT1NKCgpPT5haShuLm1pZGRsZXdhcmUpKSxvPU0oKCk9PmFpKG4ucGxhY2VtZW50KT8/YGJvdHRvbWApLHM9TSgoKT0+YWkobi5zdHJhdGVneSk/P2BhYnNvbHV0ZWApLGM9TSgoKT0+YWkobi50cmFuc2Zvcm0pPz8hMCksbD1NKCgpPT5paShlLnZhbHVlKSksZD1NKCgpPT5paSh0LnZhbHVlKSksZj1GKDApLHA9RigwKSxtPUYocy52YWx1ZSksaD1GKG8udmFsdWUpLGc9dyh7fSksXz1GKCExKSx2PU0oKCk9PntsZXQgZT17cG9zaXRpb246bS52YWx1ZSxsZWZ0OmAwYCx0b3A6YDBgfTtpZighZC52YWx1ZSlyZXR1cm4gZTtsZXQgdD1jaShkLnZhbHVlLGYudmFsdWUpLG49Y2koZC52YWx1ZSxwLnZhbHVlKTtyZXR1cm4gYy52YWx1ZT97Li4uZSx0cmFuc2Zvcm06YHRyYW5zbGF0ZShgK3QrYHB4LCBgK24rYHB4KWAsLi4uc2koZC52YWx1ZSk+PTEuNSYme3dpbGxDaGFuZ2U6YHRyYW5zZm9ybWB9fTp7cG9zaXRpb246bS52YWx1ZSxsZWZ0OnQrYHB4YCx0b3A6bitgcHhgfX0pLHk7ZnVuY3Rpb24gYigpe2lmKGwudmFsdWU9PW51bGx8fGQudmFsdWU9PW51bGwpcmV0dXJuO2xldCBlPWkudmFsdWU7bmkobC52YWx1ZSxkLnZhbHVlLHttaWRkbGV3YXJlOmEudmFsdWUscGxhY2VtZW50Om8udmFsdWUsc3RyYXRlZ3k6cy52YWx1ZX0pLnRoZW4odD0+e2YudmFsdWU9dC54LHAudmFsdWU9dC55LG0udmFsdWU9dC5zdHJhdGVneSxoLnZhbHVlPXQucGxhY2VtZW50LGcudmFsdWU9dC5taWRkbGV3YXJlRGF0YSxfLnZhbHVlPWUhPT0hMX0pfWZ1bmN0aW9uIHgoKXt0eXBlb2YgeT09YGZ1bmN0aW9uYCYmKHkoKSx5PXZvaWQgMCl9ZnVuY3Rpb24gQygpe2lmKHgoKSxyPT09dm9pZCAwKXtiKCk7cmV0dXJufWlmKGwudmFsdWUhPW51bGwmJmQudmFsdWUhPW51bGwpe3k9cihsLnZhbHVlLGQudmFsdWUsYik7cmV0dXJufX1mdW5jdGlvbiBUKCl7aS52YWx1ZXx8KF8udmFsdWU9ITEpfXJldHVybiBWKFthLG8scyxpXSxiLHtmbHVzaDpgc3luY2B9KSxWKFtsLGRdLEMse2ZsdXNoOmBzeW5jYH0pLFYoaSxULHtmbHVzaDpgc3luY2B9KSx1KCkmJk9lKHgpLHt4OlMoZikseTpTKHApLHN0cmF0ZWd5OlMobSkscGxhY2VtZW50OlMoaCksbWlkZGxld2FyZURhdGE6UyhnKSxpc1Bvc2l0aW9uZWQ6UyhfKSxmbG9hdGluZ1N0eWxlczp2LHVwZGF0ZTpifX12YXIgdWk9W2BkaXJgXSxkaT17c2lkZTpgYm90dG9tYCxzaWRlT2Zmc2V0OjAsc2lkZUZsaXA6ITAsYWxpZ246YGNlbnRlcmAsYWxpZ25PZmZzZXQ6MCxhbGlnbkZsaXA6ITAsYXJyb3dQYWRkaW5nOjAsaGlkZVNoaWZ0ZWRBcnJvdzohMCxhdm9pZENvbGxpc2lvbnM6ITAsY29sbGlzaW9uQm91bmRhcnk6KCk9PltdLGNvbGxpc2lvblBhZGRpbmc6MCxzdGlja3k6YHBhcnRpYWxgLGhpZGVXaGVuRGV0YWNoZWQ6ITEscG9zaXRpb25TdHJhdGVneTpgZml4ZWRgLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6YG9wdGltaXplZGAscHJpb3JpdGl6ZVBvc2l0aW9uOiExfSxbZmkscGldPW9lKGBQb3BwZXJDb250ZW50YCksbWk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyQ29udGVudGAscHJvcHM6V2Uoe21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSx7Li4uZGl9KSxlbWl0czpbYHBsYWNlZGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGE9JHQoKSx7Zm9yd2FyZFJlZjpzLGN1cnJlbnRFbGVtZW50OmN9PWllKCksdT1sKE0oKCk9Pm4uZGlyKSksZD1GKCksZj1GKCkse3dpZHRoOnAsaGVpZ2h0Om19PUN0KGYpLGg9TSgoKT0+bi5zaWRlKyhuLmFsaWduPT09YGNlbnRlcmA/YGA6YC0ke24uYWxpZ259YCkpLGc9TSgoKT0+dHlwZW9mIG4uY29sbGlzaW9uUGFkZGluZz09YG51bWJlcmA/bi5jb2xsaXNpb25QYWRkaW5nOnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MCwuLi5uLmNvbGxpc2lvblBhZGRpbmd9KSxfPU0oKCk9PkFycmF5LmlzQXJyYXkobi5jb2xsaXNpb25Cb3VuZGFyeSk/bi5jb2xsaXNpb25Cb3VuZGFyeTpbbi5jb2xsaXNpb25Cb3VuZGFyeV0pLHY9TSgoKT0+KHtwYWRkaW5nOmcudmFsdWUsYm91bmRhcnk6Xy52YWx1ZS5maWx0ZXIocm4pLGFsdEJvdW5kYXJ5Ol8udmFsdWUubGVuZ3RoPjB9KSkseT1NKCgpPT4oe21haW5BeGlzOm4uc2lkZUZsaXAsY3Jvc3NBeGlzOm4uYWxpZ25GbGlwfSkpLHg9TSgoKT0+W1lyKHttYWluQXhpczpuLnNpZGVPZmZzZXQrbS52YWx1ZSxhbGlnbm1lbnRBeGlzOm4uYWxpZ25PZmZzZXR9KSxuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxuLmF2b2lkQ29sbGlzaW9ucyYmWHIoe21haW5BeGlzOiEwLGNyb3NzQXhpczohIW4ucHJpb3JpdGl6ZVBvc2l0aW9uLGxpbWl0ZXI6bi5zdGlja3k9PT1gcGFydGlhbGA/dGkoKTp2b2lkIDAsLi4udi52YWx1ZX0pLCFuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxRcih7Li4udi52YWx1ZSxhcHBseTooe2VsZW1lbnRzOmUscmVjdHM6dCxhdmFpbGFibGVXaWR0aDpuLGF2YWlsYWJsZUhlaWdodDpyfSk9PntsZXR7d2lkdGg6aSxoZWlnaHQ6YX09dC5yZWZlcmVuY2Usbz1lLmZsb2F0aW5nLnN0eWxlO28uc2V0UHJvcGVydHkoYC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoYCxgJHtufXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0YCxgJHtyfXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGhgLGAke2l9cHhgKSxvLnNldFByb3BlcnR5KGAtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHRgLGAke2F9cHhgKX19KSxmLnZhbHVlJiZvaSh7ZWxlbWVudDpmLnZhbHVlLHBhZGRpbmc6bi5hcnJvd1BhZGRpbmd9KSxhbih7YXJyb3dXaWR0aDpwLnZhbHVlLGFycm93SGVpZ2h0Om0udmFsdWUsZGlyOnUudmFsdWV9KSxuLmhpZGVXaGVuRGV0YWNoZWQmJiRyKHtzdHJhdGVneTpgcmVmZXJlbmNlSGlkZGVuYCwuLi52LnZhbHVlfSldKSx7ZmxvYXRpbmdTdHlsZXM6UyxwbGFjZW1lbnQ6Qyxpc1Bvc2l0aW9uZWQ6dyxtaWRkbGV3YXJlRGF0YTpULHVwZGF0ZTpFfT1saShNKCgpPT5uLnJlZmVyZW5jZT8/YS5hbmNob3IudmFsdWUpLGQse3N0cmF0ZWd5Om4ucG9zaXRpb25TdHJhdGVneSxwbGFjZW1lbnQ6aCx3aGlsZUVsZW1lbnRzTW91bnRlZDooLi4uZSk9PkpyKC4uLmUse2xheW91dFNoaWZ0OiFuLmRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0LGFuaW1hdGlvbkZyYW1lOm4udXBkYXRlUG9zaXRpb25TdHJhdGVneT09PWBhbHdheXNgfSksbWlkZGxld2FyZTp4fSksRD1NKCgpPT5vbihDLnZhbHVlKVswXSksTz1NKCgpPT5vbihDLnZhbHVlKVsxXSk7bygoKT0+e3cudmFsdWUmJnIoYHBsYWNlZGApfSk7bGV0IGs9TSgoKT0+e2xldCBlPVQudmFsdWUuYXJyb3c/LmNlbnRlck9mZnNldCE9PTA7cmV0dXJuIG4uaGlkZVNoaWZ0ZWRBcnJvdyYmZX0pLGVlPUYoYGApO3JldHVybiByZSgoKT0+e2MudmFsdWUmJihlZS52YWx1ZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjLnZhbHVlKS56SW5kZXgpfSkscGkoe3BsYWNlZFNpZGU6RCxvbkFycm93Q2hhbmdlOmU9PmYudmFsdWU9ZSxhcnJvd1g6TSgoKT0+VC52YWx1ZS5hcnJvdz8ueD8/MCksYXJyb3dZOk0oKCk9PlQudmFsdWUuYXJyb3c/Lnk/PzApLHNob3VsZEhpZGVBcnJvdzprfSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgZmxvYXRpbmdSZWZgLHJlZjpkLCJkYXRhLXJla2EtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6YGAsZGlyOmIodSksc3R5bGU6aSh7Li4uYihTKSx0cmFuc2Zvcm06Yih3KT9iKFMpLnRyYW5zZm9ybTpgdHJhbnNsYXRlKDAsIC0yMDAlKWAsbWluV2lkdGg6YG1heC1jb250ZW50YCx6SW5kZXg6ZWUudmFsdWUsIi0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6W2IoVCkudHJhbnNmb3JtT3JpZ2luPy54LGIoVCkudHJhbnNmb3JtT3JpZ2luPy55XS5qb2luKGAgYCksLi4uYihUKS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4mJnt2aXNpYmlsaXR5OmBoaWRkZW5gLHBvaW50ZXJFdmVudHM6YG5vbmVgfX0pfSxbbi5tZW1vRGVwZW5kZW5jaWVzP2FlKFtuLmFzQ2hpbGQsbi5hcyxELnZhbHVlLE8udmFsdWUsYih3KSwuLi5PYmplY3QudmFsdWVzKGUuJGF0dHJzKSwuLi5uLm1lbW9EZXBlbmRlbmNpZXNdLCgpPT4oTigpLEkoYihBKSxqKHtrZXk6MCxyZWY6YihzKX0sZS4kYXR0cnMseyJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOm4uYXMsImRhdGEtc2lkZSI6RC52YWx1ZSwiZGF0YS1hbGlnbiI6Ty52YWx1ZSxzdHlsZTp7YW5pbWF0aW9uOmIodyk/dm9pZCAwOmBub25lYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGFzLWNoaWxkYCxgYXNgLGBkYXRhLXNpZGVgLGBkYXRhLWFsaWduYCxgc3R5bGVgXSkpLHQsMCk6KE4oKSxJKGIoQSksaih7a2V5OjEscmVmOmIocyl9LGUuJGF0dHJzLHsiYXMtY2hpbGQiOm4uYXNDaGlsZCxhczpuLmFzLCJkYXRhLXNpZGUiOkQudmFsdWUsImRhdGEtYWxpZ24iOk8udmFsdWUsZGlyOmIodSksc3R5bGU6e2FuaW1hdGlvbjpiKHcpP3ZvaWQgMDpgbm9uZWB9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2Bhcy1jaGlsZGAsYGFzYCxgZGF0YS1zaWRlYCxgZGF0YS1hbGlnbmAsYGRpcmAsYHN0eWxlYF0pKV0sMTIsdWkpKX19KTtmdW5jdGlvbiBoaShlKXtsZXQgdD1zKHtub25jZTpGKCl9KTtyZXR1cm4gTSgoKT0+ZT8udmFsdWV8fHQubm9uY2U/LnZhbHVlKX12YXIgZ2k9W2AgYCxgRW50ZXJgLGBBcnJvd1VwYCxgQXJyb3dEb3duYF0sX2k9W2AgYCxgRW50ZXJgXTtmdW5jdGlvbiB2aShlLHQsbil7cmV0dXJuIGU9PT12b2lkIDA/ITE6QXJyYXkuaXNBcnJheShlKT9lLnNvbWUoZT0+eWkoZSx0LG4pKTp5aShlLHQsbil9ZnVuY3Rpb24geWkoZSx0LG4pe3JldHVybiBlPT09dm9pZCAwfHx0PT09dm9pZCAwPyExOnR5cGVvZiBlPT1gc3RyaW5nYD9lPT09dDp0eXBlb2Ygbj09YGZ1bmN0aW9uYD9uKGUsdCk6dHlwZW9mIG49PWBzdHJpbmdgP2U/LltuXT09PXQ/LltuXTpsZShlLHQpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlPT1udWxsfHxlPT09YGB8fEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MH12YXIgeGk9W2B2YWx1ZWBdLFtTaSxDaV09b2UoYFNlbGVjdFJvb3RgKSx3aT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RSb290YCxwcm9wczp7b3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxkZWZhdWx0VmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sbW9kZWxWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxudWxsYWJsZVZhbHVlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxieTp7dHlwZTpbU3RyaW5nLEZ1bmN0aW9uXSxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sbmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYCxgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7cmVxdWlyZWQ6aSxkaXNhYmxlZDphLG11bHRpcGxlOm8sZGlyOnN9PWYobiksYz1DKG4sYG1vZGVsVmFsdWVgLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZT8/KG8udmFsdWU/W106dm9pZCAwKSxwYXNzaXZlOm4ubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSksdT1DKG4sYG9wZW5gLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRPcGVuLHBhc3NpdmU6bi5vcGVuPT09dm9pZCAwfSksZD1GKCkscD1GKCksbT1GKHt4OjAseTowfSksaD1NKCgpPT5vLnZhbHVlJiZBcnJheS5pc0FycmF5KGMudmFsdWUpP2MudmFsdWU/Lmxlbmd0aD09PTA6c2UoYy52YWx1ZSkpO0plKHtpc1Byb3ZpZGVyOiEwfSk7bGV0IGc9bChzKSxfPWZ0KGQpLHY9RihuZXcgU2V0KSx5PU0oKCk9PkFycmF5LmZyb20odi52YWx1ZSkubWFwKGU9PmUudmFsdWUpLmpvaW4oYDtgKSk7ZnVuY3Rpb24geChlKXtpZihvLnZhbHVlKXtsZXQgdD1BcnJheS5pc0FycmF5KGMudmFsdWUpP1suLi5jLnZhbHVlXTpbXSxyPXQuZmluZEluZGV4KHQ9PnlpKHQsZSxuLmJ5KSk7cj09PS0xP3QucHVzaChlKTp0LnNwbGljZShyLDEpLGMudmFsdWU9Wy4uLnRdfWVsc2UgYy52YWx1ZT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIEFycmF5LmZyb20odi52YWx1ZSkuZmluZCh0PT52aShlLHQudmFsdWUsbi5ieSkpfXJldHVybiBDaSh7dHJpZ2dlckVsZW1lbnQ6ZCxvblRyaWdnZXJDaGFuZ2U6ZT0+e2QudmFsdWU9ZX0sdmFsdWVFbGVtZW50OnAsb25WYWx1ZUVsZW1lbnRDaGFuZ2U6ZT0+e3AudmFsdWU9ZX0sY29udGVudElkOmBgLG1vZGVsVmFsdWU6YyxvblZhbHVlQ2hhbmdlOngsYnk6bi5ieSxvcGVuOnUsbXVsdGlwbGU6byxyZXF1aXJlZDppLG9uT3BlbkNoYW5nZTplPT57dS52YWx1ZT1lfSxkaXI6Zyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6bSxkaXNhYmxlZDphLGlzRW1wdHlNb2RlbFZhbHVlOmgsb3B0aW9uc1NldDp2LG9uT3B0aW9uQWRkOmU9PntsZXQgdD1TKGUudmFsdWUpO3QmJnYudmFsdWUuZGVsZXRlKHQpLHYudmFsdWUuYWRkKGUpfSxvbk9wdGlvblJlbW92ZTplPT57bGV0IHQ9UyhlLnZhbHVlKTt0JiZ2LnZhbHVlLmRlbGV0ZSh0KX19KSwoZSx0KT0+KE4oKSxJKGIodG4pLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOmIoYyksb3BlbjpiKHUpfSksYihfKSYmZS5uYW1lPyhOKCksSShUaSx7a2V5OnkudmFsdWUsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsdGFiaW5kZXg6YC0xYCxtdWx0aXBsZTpiKG8pLHJlcXVpcmVkOmIoaSksbmFtZTplLm5hbWUsYXV0b2NvbXBsZXRlOmUuYXV0b2NvbXBsZXRlLGRpc2FibGVkOmIoYSksdmFsdWU6YihjKX0se2RlZmF1bHQ6QigoKT0+W2Ioc2UpKGIoYykpPyhOKCksUChgb3B0aW9uYCx7a2V5OjAsdmFsdWU6ZS5udWxsYWJsZVZhbHVlfSxudWxsLDgseGkpKTp6ZShgdi1pZmAsITApLChOKCEwKSxQKGssbnVsbCxtZShBcnJheS5mcm9tKHYudmFsdWUpLGU9PihOKCksUChgb3B0aW9uYCxqKHtrZXk6ZS52YWx1ZT8/YGB9LHtyZWZfZm9yOiEwfSxlKSxudWxsLDE2KSkpLDEyOCkpXSksXzoxfSw4LFtgbXVsdGlwbGVgLGByZXF1aXJlZGAsYG5hbWVgLGBhdXRvY29tcGxldGVgLGBkaXNhYmxlZGAsYHZhbHVlYF0pKTp6ZShgdi1pZmAsITApXSksXzozfSkpfX0pLFRpPVIoe19fbmFtZTpgQnViYmxlU2VsZWN0YCxwcm9wczp7YXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcm06e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxuYW1lOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc2l6ZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49RigpLHI9U2koKTtWKCgpPT50LnZhbHVlLChlLHQpPT57bGV0IHI9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixgdmFsdWVgKS5zZXQ7aWYoZSE9PXQmJmkmJm4udmFsdWUpe2xldCB0PW5ldyBFdmVudChgY2hhbmdlYCx7YnViYmxlczohMH0pO2kuY2FsbChuLnZhbHVlLGUpLG4udmFsdWUuZGlzcGF0Y2hFdmVudCh0KX19KTtmdW5jdGlvbiBpKGUpe3Iub25WYWx1ZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9cmV0dXJuKGUscik9PihOKCksSShiKFF0KSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0hlKGBzZWxlY3RgLGooe3JlZl9rZXk6YHNlbGVjdEVsZW1lbnRgLHJlZjpufSx0LHtvbklucHV0Oml9KSxbeihlLiRzbG90cyxgZGVmYXVsdGApXSwxNildKSxfOjN9KSl9fSksRWk9Uih7X19uYW1lOmBTZWxlY3RQb3BwZXJQb3NpdGlvbmAscHJvcHM6e21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITEsZGVmYXVsdDoxMH0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1LZShlKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIobWkpLGooYih0KSx7c3R5bGU6e2JveFNpemluZzpgYm9yZGVyLWJveGAsIi0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjpgdmFyKC0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilgLCItLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKWAsIi0tcmVrYS1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClgLCItLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgiOmB2YXIoLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGgpYCwiLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6YHZhcigtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHQpYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLERpPXtvblZpZXdwb3J0Q2hhbmdlOigpPT57fSxpdGVtVGV4dFJlZkNhbGxiYWNrOigpPT57fSxpdGVtUmVmQ2FsbGJhY2s6KCk9Pnt9fSxbT2ksa2ldPW9lKGBTZWxlY3RDb250ZW50YCksQWk9Uih7X19uYW1lOmBTZWxlY3RDb250ZW50SW1wbGAscHJvcHM6e3Bvc2l0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBpdGVtLWFsaWduZWRgfSxib2R5TG9jazp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITF9LGFycm93UGFkZGluZzp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc3RpY2t5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0saGlkZVdoZW5EZXRhY2hlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sdXBkYXRlUG9zaXRpb25TdHJhdGVneTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxyZWZlcmVuY2U6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPVNpKCk7dXQoKSxvdChuLmJvZHlMb2NrKTtsZXR7Q29sbGVjdGlvblNsb3Q6YSxnZXRJdGVtczpvfT1KZSgpLHM9RigpO1N0KHMpO2xldHtzZWFyY2g6YyxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6bH09d3QoKSx1PUYoKSxkPUYoKSxmPUYoKSxwPUYoITEpLG09RighMSksaD1GKCExKTtmdW5jdGlvbiBnKCl7ZC52YWx1ZSYmcy52YWx1ZSYmWHQoW2QudmFsdWUscy52YWx1ZV0pfVYocCwoKT0+e2coKX0pO2xldHtvbk9wZW5DaGFuZ2U6Xyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6dn09aTtyZShlPT57aWYoIXMudmFsdWUpcmV0dXJuO2xldCB0PXt4OjAseTowfSxuPWU9Pnt0PXt4Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWCktKHYudmFsdWU/Lng/PzApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWSktKHYudmFsdWU/Lnk/PzApKX19LHI9ZT0+e2UucG9pbnRlclR5cGUhPT1gdG91Y2hgJiYodC54PD0xMCYmdC55PD0xMD9lLnByZXZlbnREZWZhdWx0KCk6cy52YWx1ZT8uY29udGFpbnMoZS50YXJnZXQpfHxfKCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksdi52YWx1ZT1udWxsKX07di52YWx1ZSE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihgcG9pbnRlcnVwYCxyLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksZSgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBvaW50ZXJtb3ZlYCxuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVydXBgLHIse2NhcHR1cmU6ITB9KX0pfSk7ZnVuY3Rpb24geShlKXtsZXQgdD1lLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXk7aWYoZS5rZXk9PT1gVGFiYCYmZS5wcmV2ZW50RGVmYXVsdCgpLCF0JiZlLmtleS5sZW5ndGg9PT0xJiZsKGUua2V5LG8oKSksW2BBcnJvd1VwYCxgQXJyb3dEb3duYCxgSG9tZWAsYEVuZGBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IHQ9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpXTtpZihbYEFycm93VXBgLGBFbmRgXS5pbmNsdWRlcyhlLmtleSkmJih0PXQuc2xpY2UoKS5yZXZlcnNlKCkpLFtgQXJyb3dVcGAsYEFycm93RG93bmBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IG49ZS50YXJnZXQscj10LmluZGV4T2Yobik7dD10LnNsaWNlKHIrMSl9c2V0VGltZW91dCgoKT0+WHQodCkpLGUucHJldmVudERlZmF1bHQoKX19bGV0IHg9TSgoKT0+bi5wb3NpdGlvbj09PWBwb3BwZXJgP246e30pLFM9S2UoeC52YWx1ZSk7cmV0dXJuIGtpKHtjb250ZW50OnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmU9Pnt1LnZhbHVlPWV9LGl0ZW1SZWZDYWxsYmFjazooZSx0LG4pPT57bGV0IHI9IW0udmFsdWUmJiFuLGE9dmkoaS5tb2RlbFZhbHVlLnZhbHVlLHQsaS5ieSk7aWYoaS5tdWx0aXBsZS52YWx1ZSl7aWYoaC52YWx1ZSlyZXR1cm47KGF8fHIpJiYoZC52YWx1ZT1lLGEmJihoLnZhbHVlPSEwKSl9ZWxzZShhfHxyKSYmKGQudmFsdWU9ZSk7ciYmKG0udmFsdWU9ITApfSxzZWxlY3RlZEl0ZW06ZCxzZWxlY3RlZEl0ZW1UZXh0OmYsb25JdGVtTGVhdmU6KCk9PntzLnZhbHVlPy5mb2N1cygpfSxpdGVtVGV4dFJlZkNhbGxiYWNrOihlLHQsbik9PntsZXQgcj0hbS52YWx1ZSYmIW47KHZpKGkubW9kZWxWYWx1ZS52YWx1ZSx0LGkuYnkpfHxyKSYmKGYudmFsdWU9ZSl9LGZvY3VzU2VsZWN0ZWRJdGVtOmcscG9zaXRpb246bi5wb3NpdGlvbixpc1Bvc2l0aW9uZWQ6cCxzZWFyY2hSZWY6Y30pLChlLHQpPT4oTigpLEkoYihhKSxudWxsLHtkZWZhdWx0OkIoKCk9PltMKGIoS3QpLHsiYXMtY2hpbGQiOmBgLG9uTW91bnRBdXRvRm9jdXM6dFs2XXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25Vbm1vdW50QXV0b0ZvY3VzOnRbN118fD1lPT57cihgY2xvc2VBdXRvRm9jdXNgLGUpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihiKGkpLnRyaWdnZXJFbGVtZW50LnZhbHVlPy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLGUucHJldmVudERlZmF1bHQoKSl9fSx7ZGVmYXVsdDpCKCgpPT5bTChiKE10KSx7ImFzLWNoaWxkIjpgYCwiZGlzYWJsZS1vdXRzaWRlLXBvaW50ZXItZXZlbnRzIjplLmRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxvbkZvY3VzT3V0c2lkZTp0WzJdfHw9ZmUoKCk9Pnt9LFtgcHJldmVudGBdKSxvbkRpc21pc3M6dFszXXx8PWU9PmIoaSkub25PcGVuQ2hhbmdlKCExKSxvbkVzY2FwZUtleURvd246dFs0XXx8PWU9PnIoYGVzY2FwZUtleURvd25gLGUpLG9uUG9pbnRlckRvd25PdXRzaWRlOnRbNV18fD1lPT5yKGBwb2ludGVyRG93bk91dHNpZGVgLGUpfSx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxJKFllKGUucG9zaXRpb249PT1gcG9wcGVyYD9FaTpOaSksaih7Li4uZS4kYXR0cnMsLi4uYihTKX0se2lkOmIoaSkuY29udGVudElkLHJlZjplPT57aWYoIWUpcmV0dXJuO2xldCB0PWIoRGUpKGUpO3Q/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9zLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6cy52YWx1ZT10fSxyb2xlOmBsaXN0Ym94YCwiZGF0YS1zdGF0ZSI6YihpKS5vcGVuLnZhbHVlP2BvcGVuYDpgY2xvc2VkYCxkaXI6YihpKS5kaXIudmFsdWUsc3R5bGU6e2Rpc3BsYXk6YGZsZXhgLGZsZXhEaXJlY3Rpb246YGNvbHVtbmAsb3V0bGluZTpgbm9uZWB9LG9uQ29udGV4dG1lbnU6dFswXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25QbGFjZWQ6dFsxXXx8PWU9PnAudmFsdWU9ITAsb25LZXlkb3duOnl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGlkYCxgZGF0YS1zdGF0ZWAsYGRpcmAsYG9uS2V5ZG93bmBdKSldKSxfOjN9LDgsW2BkaXNhYmxlLW91dHNpZGUtcG9pbnRlci1ldmVudHNgXSldKSxfOjN9KV0pLF86M30pKX19KSxbamksTWldPW9lKGBTZWxlY3RJdGVtQWxpZ25lZFBvc2l0aW9uYCksTmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0SXRlbUFsaWduZWRQb3NpdGlvbmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgcGxhY2VkYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2dldEl0ZW1zOmF9PUplKCksbz1TaSgpLHM9T2koKSxjPUYoITEpLGw9RighMCksdT1GKCkse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1pZSgpLHt2aWV3cG9ydDpwLHNlbGVjdGVkSXRlbTptLHNlbGVjdGVkSXRlbVRleHQ6aCxmb2N1c1NlbGVjdGVkSXRlbTpnfT1zO2Z1bmN0aW9uIF8oKXtpZihvLnRyaWdnZXJFbGVtZW50LnZhbHVlJiZvLnZhbHVlRWxlbWVudC52YWx1ZSYmdS52YWx1ZSYmZi52YWx1ZSYmcD8udmFsdWUmJm0/LnZhbHVlJiZoPy52YWx1ZSl7bGV0IGU9by50cmlnZ2VyRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1vLnZhbHVlRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWgudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoby5kaXIudmFsdWUhPT1gcnRsYCl7bGV0IHI9aS5sZWZ0LXQubGVmdCxhPW4ubGVmdC1yLG89ZS5sZWZ0LWEscz1lLndpZHRoK28sYz1NYXRoLm1heChzLHQud2lkdGgpLGw9d2luZG93LmlubmVyV2lkdGgtMTAsZD1RZShhLDEwLE1hdGgubWF4KDEwLGwtYykpO3UudmFsdWUuc3R5bGUubWluV2lkdGg9YCR7c31weGAsdS52YWx1ZS5zdHlsZS5sZWZ0PWAke2R9cHhgfWVsc2V7bGV0IHI9dC5yaWdodC1pLnJpZ2h0LGE9d2luZG93LmlubmVyV2lkdGgtbi5yaWdodC1yLG89d2luZG93LmlubmVyV2lkdGgtZS5yaWdodC1hLHM9ZS53aWR0aCtvLGM9TWF0aC5tYXgocyx0LndpZHRoKSxsPXdpbmRvdy5pbm5lcldpZHRoLTEwLGQ9UWUoYSwxMCxNYXRoLm1heCgxMCxsLWMpKTt1LnZhbHVlLnN0eWxlLm1pbldpZHRoPWAke3N9cHhgLHUudmFsdWUuc3R5bGUucmlnaHQ9YCR7ZH1weGB9bGV0IHM9YSgpLm1hcChlPT5lLnJlZiksbD13aW5kb3cuaW5uZXJIZWlnaHQtMjAsZD1wLnZhbHVlLnNjcm9sbEhlaWdodCxnPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLF89TnVtYmVyLnBhcnNlSW50KGcuYm9yZGVyVG9wV2lkdGgsMTApLHY9TnVtYmVyLnBhcnNlSW50KGcucGFkZGluZ1RvcCwxMCkseT1OdW1iZXIucGFyc2VJbnQoZy5ib3JkZXJCb3R0b21XaWR0aCwxMCksYj1OdW1iZXIucGFyc2VJbnQoZy5wYWRkaW5nQm90dG9tLDEwKSx4PV8rditkK2IreSxTPU1hdGgubWluKG0udmFsdWUub2Zmc2V0SGVpZ2h0KjUseCksQz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwLnZhbHVlKSx3PU51bWJlci5wYXJzZUludChDLnBhZGRpbmdUb3AsMTApLFQ9TnVtYmVyLnBhcnNlSW50KEMucGFkZGluZ0JvdHRvbSwxMCksRT1lLnRvcCtlLmhlaWdodC8yLTEwLEQ9bC1FLE89bS52YWx1ZS5vZmZzZXRIZWlnaHQvMixrPW0udmFsdWUub2Zmc2V0VG9wK08sZWU9Xyt2K2ssdGU9eC1lZTtpZihlZTw9RSl7bGV0IGU9bS52YWx1ZT09PXMuYXQoLTEpO3UudmFsdWUuc3R5bGUuYm90dG9tPWAwcHhgO2xldCB0PWYudmFsdWUuY2xpZW50SGVpZ2h0LXAudmFsdWUub2Zmc2V0VG9wLXAudmFsdWUub2Zmc2V0SGVpZ2h0LG49ZWUrTWF0aC5tYXgoRCxPKyhlP1Q6MCkrdCt5KTt1LnZhbHVlLnN0eWxlLmhlaWdodD1gJHtufXB4YH1lbHNle2xldCBlPW0udmFsdWU9PT1zWzBdO3UudmFsdWUuc3R5bGUudG9wPWAwcHhgO2xldCB0PU1hdGgubWF4KEUsXytwLnZhbHVlLm9mZnNldFRvcCsoZT93OjApK08pK3RlO3UudmFsdWUuc3R5bGUuaGVpZ2h0PWAke3R9cHhgLHAudmFsdWUuc2Nyb2xsVG9wPWVlLUUrcC52YWx1ZS5vZmZzZXRUb3B9dS52YWx1ZS5zdHlsZS5tYXJnaW49YDEwcHggMGAsdS52YWx1ZS5zdHlsZS5taW5IZWlnaHQ9YCR7U31weGAsdS52YWx1ZS5zdHlsZS5tYXhIZWlnaHQ9YCR7bH1weGAscihgcGxhY2VkYCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5jLnZhbHVlPSEwKX19bGV0IHY9RihgYCk7TWUoYXN5bmMoKT0+e2F3YWl0IHhlKCksXygpLGYudmFsdWUmJih2LnZhbHVlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLnpJbmRleCl9KTtmdW5jdGlvbiB5KGUpe2UmJmwudmFsdWU9PT0hMCYmKF8oKSxnPy4oKSxsLnZhbHVlPSExKX1yZXR1cm4geChvLnRyaWdnZXJFbGVtZW50LCgpPT57XygpfSksTWkoe2NvbnRlbnRXcmFwcGVyOnUsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6YyxvblNjcm9sbEJ1dHRvbkNoYW5nZTp5fSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgY29udGVudFdyYXBwZXJFbGVtZW50YCxyZWY6dSxzdHlsZTppKHtkaXNwbGF5OmBmbGV4YCxmbGV4RGlyZWN0aW9uOmBjb2x1bW5gLHBvc2l0aW9uOmBmaXhlZGAsekluZGV4OnYudmFsdWV9KX0sW0woYihBKSxqKHtyZWY6YihkKSxzdHlsZTp7Ym94U2l6aW5nOmBib3JkZXItYm94YCxtYXhIZWlnaHQ6YDEwMCVgfX0sey4uLmUuJGF0dHJzLC4uLm59KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNildLDQpKX19KSxQaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RQcm92aWRlcmAscHJvcHM6e2NvbnRleHQ6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfX0sc2V0dXAoZSl7cmV0dXJuIENpKGUuY29udGV4dCksa2koRGkpLChlLHQpPT56KGUuJHNsb3RzLGBkZWZhdWx0YCl9fSksRmk9e2tleToxfSxJaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RDb250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cCh0LHtlbWl0Om59KXtsZXQgcj10LGk9YShyLG4pLG89U2koKSxzPUYoKTtNZSgoKT0+e3MudmFsdWU9bmV3IERvY3VtZW50RnJhZ21lbnR9KTtsZXQgYz1GKCksbD1NKCgpPT5yLmZvcmNlTW91bnR8fG8ub3Blbi52YWx1ZSksdT1GKGwudmFsdWUpLGQ7ZnVuY3Rpb24gZigpe2QmJj0oY2xlYXJUaW1lb3V0KGQpLHZvaWQgMCl9cmV0dXJuIFYobCwoZSx0LG4pPT57ZigpLGQ9c2V0VGltZW91dCgoKT0+e3UudmFsdWU9bC52YWx1ZSxkPXZvaWQgMH0pLG4oZil9KSx3ZShmKSwodCxuKT0+bC52YWx1ZXx8dS52YWx1ZXx8Yy52YWx1ZT8ucHJlc2VudD8oTigpLEkoYihxZSkse2tleTowLHJlZl9rZXk6YHByZXNlbmNlUmVmYCxyZWY6YyxwcmVzZW50OmwudmFsdWV9LHtkZWZhdWx0OkIoKCk9PltMKEFpLFplKHZlKHsuLi5iKGkpLC4uLnQuJGF0dHJzfSkpLHtkZWZhdWx0OkIoKCk9Plt6KHQuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2KV0pLF86M30sOCxbYHByZXNlbnRgXSkpOnMudmFsdWU/KE4oKSxQKGBkaXZgLEZpLFsoTigpLEkoZSx7dG86cy52YWx1ZX0sW0woUGkse2NvbnRleHQ6YihvKX0se2RlZmF1bHQ6QigoKT0+W3oodC4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGNvbnRleHRgXSldLDgsW2B0b2BdKSldKSk6emUoYHYtaWZgLCEwKX19KSxMaT1SKHtfX25hbWU6YFNlbGVjdEljb25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkseyJhcmlhLWhpZGRlbiI6YHRydWVgLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCx7fSwoKT0+W3RbMF18fD1nZShg4pa8YCldKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pLFtSaSx6aV09b2UoYFNlbGVjdEl0ZW1gKSxCaT1SKHtfX25hbWU6YFNlbGVjdEl0ZW1gLHByb3BzOnt2YWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSx0ZXh0VmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHNlbGVjdGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LHtkaXNhYmxlZDppfT1mKG4pLGE9U2koKSxvPU9pKCkse2ZvcndhcmRSZWY6cyxjdXJyZW50RWxlbWVudDpjfT1pZSgpLHtDb2xsZWN0aW9uSXRlbTpsfT1KZSgpLHU9TSgoKT0+dmkoYS5tb2RlbFZhbHVlPy52YWx1ZSxuLnZhbHVlLGEuYnkpKSxkPUYoITEpLHA9RihuLnRleHRWYWx1ZT8/YGApLGg9bmUodm9pZCAwLGByZWthLXNlbGVjdC1pdGVtLXRleHRgKTthc3luYyBmdW5jdGlvbiBnKGUpe2UuZGVmYXVsdFByZXZlbnRlZHx8JGUoYHNlbGVjdC5zZWxlY3RgLF8se29yaWdpbmFsRXZlbnQ6ZSx2YWx1ZTpuLnZhbHVlfSl9YXN5bmMgZnVuY3Rpb24gXyhlKXthd2FpdCB4ZSgpLHIoYHNlbGVjdGAsZSksIWUuZGVmYXVsdFByZXZlbnRlZCYmKGkudmFsdWV8fChhLm9uVmFsdWVDaGFuZ2Uobi52YWx1ZSksYS5tdWx0aXBsZS52YWx1ZXx8YS5vbk9wZW5DaGFuZ2UoITEpKSl9YXN5bmMgZnVuY3Rpb24gdihlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihpLnZhbHVlP28ub25JdGVtTGVhdmU/LigpOmUuY3VycmVudFRhcmdldD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9YXN5bmMgZnVuY3Rpb24geShlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJmUuY3VycmVudFRhcmdldD09PW0oKSYmby5vbkl0ZW1MZWF2ZT8uKCl9YXN5bmMgZnVuY3Rpb24geChlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihvLnNlYXJjaFJlZj8udmFsdWU9PT1gYHx8ZS5rZXkhPT1gIGApJiYoX2kuaW5jbHVkZXMoZS5rZXkpJiZnKGUpLGUua2V5PT09YCBgJiZlLnByZXZlbnREZWZhdWx0KCkpfWlmKG4udmFsdWU9PT1gYCl0aHJvdyBFcnJvcihgQSA8U2VsZWN0SXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuYCk7cmV0dXJuIE1lKCgpPT57Yy52YWx1ZSYmby5pdGVtUmVmQ2FsbGJhY2soYy52YWx1ZSxuLnZhbHVlLG4uZGlzYWJsZWQpfSksemkoe3ZhbHVlOm4udmFsdWUsZGlzYWJsZWQ6aSx0ZXh0SWQ6aCxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTplPT57cC52YWx1ZT0oKHAudmFsdWV8fGU/LnRleHRDb250ZW50KT8/YGApLnRyaW0oKX19KSwoZSx0KT0+KE4oKSxJKGIobCkse3ZhbHVlOnt0ZXh0VmFsdWU6cC52YWx1ZX19LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHMpLHJvbGU6YG9wdGlvbmAsImFyaWEtbGFiZWxsZWRieSI6YihoKSwiZGF0YS1oaWdobGlnaHRlZCI6ZC52YWx1ZT9gYDp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUudmFsdWUsImRhdGEtc3RhdGUiOnUudmFsdWU/YGNoZWNrZWRgOmB1bmNoZWNrZWRgLCJhcmlhLWRpc2FibGVkIjpiKGkpfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmIoaSk/YGA6dm9pZCAwLHRhYmluZGV4OmIoaSk/dm9pZCAwOi0xLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsb25Gb2N1czp0WzBdfHw9ZT0+ZC52YWx1ZT0hMCxvbkJsdXI6dFsxXXx8PWU9PmQudmFsdWU9ITEsb25Qb2ludGVydXA6ZyxvblBvaW50ZXJkb3duOnRbMl18fD1lPT57ZS5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LG9uVG91Y2hlbmQ6dFszXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgLGBzdG9wYF0pLG9uUG9pbnRlcm1vdmU6dixvblBvaW50ZXJsZWF2ZTp5LG9uS2V5ZG93bjp4fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXJpYS1sYWJlbGxlZGJ5YCxgZGF0YS1oaWdobGlnaHRlZGAsYGFyaWEtc2VsZWN0ZWRgLGBkYXRhLXN0YXRlYCxgYXJpYS1kaXNhYmxlZGAsYGRhdGEtZGlzYWJsZWRgLGB0YWJpbmRleGAsYGFzYCxgYXMtY2hpbGRgXSldKSxfOjN9LDgsW2B2YWx1ZWBdKSl9fSksVmk9Uih7X19uYW1lOmBTZWxlY3RJdGVtSW5kaWNhdG9yYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVJpKCk7cmV0dXJuKGUscik9PmIobikuaXNTZWxlY3RlZC52YWx1ZT8oTigpLEkoYihBKSxqKHtrZXk6MCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKTp6ZShgdi1pZmAsITApfX0pLEhpPVIoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YFNlbGVjdEl0ZW1UZXh0YCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVNpKCkscj1PaSgpLGk9UmkoKSx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT4oe3ZhbHVlOmkudmFsdWUsZGlzYWJsZWQ6aS5kaXNhYmxlZC52YWx1ZSx0ZXh0Q29udGVudDpvLnZhbHVlPy50ZXh0Q29udGVudD8/aS52YWx1ZT8udG9TdHJpbmcoKT8/YGB9KSk7cmV0dXJuIE1lKCgpPT57by52YWx1ZSYmKGkub25JdGVtVGV4dENoYW5nZShvLnZhbHVlKSxyLml0ZW1UZXh0UmVmQ2FsbGJhY2soby52YWx1ZSxpLnZhbHVlLGkuZGlzYWJsZWQudmFsdWUpLG4ub25PcHRpb25BZGQocy52YWx1ZSkpfSksd2UoKCk9PntuLm9uT3B0aW9uUmVtb3ZlKHMudmFsdWUpfSksKGUsbik9PihOKCksSShiKEEpLGooe2lkOmIoaSkudGV4dElkLHJlZjpiKGEpfSx7Li4udCwuLi5lLiRhdHRyc30pLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgaWRgXSkpfX0pLFVpPVIoe19fbmFtZTpgU2VsZWN0UG9ydGFsYCxwcm9wczp7dG86e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZGVmZXI6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoWnQpLFplKHZlKHQpKSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLFdpPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsQnV0dG9uSW1wbGAsZW1pdHM6W2BhdXRvU2Nyb2xsYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49dCx7Z2V0SXRlbXM6cn09SmUoKSxpPU9pKCksYT1GKG51bGwpO2Z1bmN0aW9uIG8oKXthLnZhbHVlIT09bnVsbCYmKHdpbmRvdy5jbGVhckludGVydmFsKGEudmFsdWUpLGEudmFsdWU9bnVsbCl9cmUoKCk9PntyKCkubWFwKGU9PmUucmVmKS5maW5kKGU9PmU9PT1tKCkpPy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6YG5lYXJlc3RgfSl9KTtmdW5jdGlvbiBzKCl7YS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1mdW5jdGlvbiBjKCl7aS5vbkl0ZW1MZWF2ZT8uKCksYS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1yZXR1cm4gSWUoKCk9Pm8oKSksKGUsdCk9PihOKCksSShiKEEpLGooeyJhcmlhLWhpZGRlbiI6YHRydWVgLHN0eWxlOntmbGV4U2hyaW5rOjB9fSxlLiRwYXJlbnQ/LiRwcm9wcyx7b25Qb2ludGVyZG93bjpzLG9uUG9pbnRlcm1vdmU6YyxvblBvaW50ZXJsZWF2ZTp0WzBdfHw9KCk9PntvKCl9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KSxHaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbERvd25CdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1PaSgpLG49dC5wb3NpdGlvbj09PWBpdGVtLWFsaWduZWRgP2ppKCk6dm9pZCAwLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPUYoITEpO3JldHVybiByZShlPT57aWYodC52aWV3cG9ydD8udmFsdWUmJnQuaXNQb3NpdGlvbmVkPy52YWx1ZSl7bGV0IG49dC52aWV3cG9ydC52YWx1ZTtmdW5jdGlvbiByKCl7bGV0IGU9bi5zY3JvbGxIZWlnaHQtbi5jbGllbnRIZWlnaHQ7YS52YWx1ZT1NYXRoLmNlaWwobi5zY3JvbGxUb3ApPGV9cigpLG4uYWRkRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSxlKCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHNjcm9sbGAscikpfX0pLFYoaSwoKT0+e2kudmFsdWUmJm4/Lm9uU2Nyb2xsQnV0dG9uQ2hhbmdlKGkudmFsdWUpfSksKGUsbik9PmEudmFsdWU/KE4oKSxJKFdpLHtrZXk6MCxyZWY6YihyKSxvbkF1dG9TY3JvbGw6blswXXx8PSgpPT57bGV0e3ZpZXdwb3J0OmUsc2VsZWN0ZWRJdGVtOm59PWIodCk7ZT8udmFsdWUmJm4/LnZhbHVlJiYoZS52YWx1ZS5zY3JvbGxUb3A9ZS52YWx1ZS5zY3JvbGxUb3Arbi52YWx1ZS5vZmZzZXRIZWlnaHQpfX0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sNTEyKSk6emUoYHYtaWZgLCEwKX19KSxLaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbFVwQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9T2koKSxuPXQucG9zaXRpb249PT1gaXRlbS1hbGlnbmVkYD9qaSgpOnZvaWQgMCx7Zm9yd2FyZFJlZjpyLGN1cnJlbnRFbGVtZW50Oml9PWllKCksYT1GKCExKTtyZXR1cm4gcmUoZT0+e2lmKHQudmlld3BvcnQ/LnZhbHVlJiZ0LmlzUG9zaXRpb25lZD8udmFsdWUpe2xldCBuPXQudmlld3BvcnQudmFsdWU7ZnVuY3Rpb24gcigpe2EudmFsdWU9bi5zY3JvbGxUb3A+MH1yKCksbi5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLHIpLGUoKCk9Pm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSl9fSksVihpLCgpPT57aS52YWx1ZSYmbj8ub25TY3JvbGxCdXR0b25DaGFuZ2UoaS52YWx1ZSl9KSwoZSxuKT0+YS52YWx1ZT8oTigpLEkoV2kse2tleTowLHJlZjpiKHIpLG9uQXV0b1Njcm9sbDpuWzBdfHw9KCk9PntsZXR7dmlld3BvcnQ6ZSxzZWxlY3RlZEl0ZW06bn09Yih0KTtlPy52YWx1ZSYmbj8udmFsdWUmJihlLnZhbHVlLnNjcm9sbFRvcD1lLnZhbHVlLnNjcm9sbFRvcC1uLnZhbHVlLm9mZnNldEhlaWdodCl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw1MTIpKTp6ZShgdi1pZmAsITApfX0pLHFpPVIoe19fbmFtZTpgU2VsZWN0VHJpZ2dlcmAscHJvcHM6e2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWUsbj1TaSgpLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPU0oKCk9Pm4uZGlzYWJsZWQ/LnZhbHVlfHx0LmRpc2FibGVkKTtuLmNvbnRlbnRJZHx8PW5lKHZvaWQgMCxgcmVrYS1zZWxlY3QtY29udGVudGApLE1lKCgpPT57bi5vblRyaWdnZXJDaGFuZ2UoaS52YWx1ZSl9KTtsZXR7Z2V0SXRlbXM6b309SmUoKSx7c2VhcmNoOnMsaGFuZGxlVHlwZWFoZWFkU2VhcmNoOmMscmVzZXRUeXBlYWhlYWQ6bH09d3QoKTtmdW5jdGlvbiB1KCl7YS52YWx1ZXx8KG4ub25PcGVuQ2hhbmdlKCEwKSxsKCkpfWZ1bmN0aW9uIGQoZSl7dSgpLG4udHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLnZhbHVlPXt4Ok1hdGgucm91bmQoZS5wYWdlWCkseTpNYXRoLnJvdW5kKGUucGFnZVkpfX1mdW5jdGlvbiBmKGUpe3JldHVybiBlLmJ1dHRvbj09PTAmJmUuY3RybEtleT09PSExfWxldCBwPSExO2Z1bmN0aW9uIG0oZSl7aWYoZS5wb2ludGVyVHlwZT09PWB0b3VjaGApcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtsZXQgdD1lLnRhcmdldDt0Lmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSYmdC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpLGYoZSkmJihkKGUpLHA9ITApfWZ1bmN0aW9uIGgoZSl7ZihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGcoZSl7cHx8ZS5jdXJyZW50VGFyZ2V0Py5mb2N1cygpLHA9ITF9cmV0dXJuKGUsdCk9PihOKCksSShiKG5uKSx7ImFzLWNoaWxkIjpgYCxyZWZlcmVuY2U6ZS5yZWZlcmVuY2V9LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHIpLHJvbGU6YGNvbWJvYm94YCx0eXBlOmUuYXM9PT1gYnV0dG9uYD9gYnV0dG9uYDp2b2lkIDAsImFyaWEtY29udHJvbHMiOmIobikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpiKG4pLm9wZW4udmFsdWV8fCExLCJhcmlhLXJlcXVpcmVkIjpiKG4pLnJlcXVpcmVkPy52YWx1ZSwiYXJpYS1hdXRvY29tcGxldGUiOmBub25lYCxkaXNhYmxlZDphLnZhbHVlLGRpcjpiKG4pPy5kaXIudmFsdWUsImRhdGEtc3RhdGUiOmIobik/Lm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjphLnZhbHVlP2BgOnZvaWQgMCwiZGF0YS1wbGFjZWhvbGRlciI6YihiaSkoYihuKS5tb2RlbFZhbHVlPy52YWx1ZSk/YGA6dm9pZCAwLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25DbGljazpnLG9uUG9pbnRlcmRvd246bSxvbk1vdXNlZG93bjpoLG9uUG9pbnRlcnVwOnRbMF18fD1mZShlPT57ZS5wb2ludGVyVHlwZT09PWB0b3VjaGAmJmQoZSl9LFtgcHJldmVudGBdKSxvbktleWRvd246dFsxXXx8PWU9PntsZXQgdD1iKHMpIT09YGA7IShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiZlLmtleS5sZW5ndGg9PT0xJiZ0JiZlLmtleT09PWAgYHx8KGIoYykoZS5rZXksYihvKSgpKSxiKGdpKS5pbmNsdWRlcyhlLmtleSkmJih1KCksZS5wcmV2ZW50RGVmYXVsdCgpKSl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFyaWEtY29udHJvbHNgLGBhcmlhLWV4cGFuZGVkYCxgYXJpYS1yZXF1aXJlZGAsYGRpc2FibGVkYCxgZGlyYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXBsYWNlaG9sZGVyYCxgYXMtY2hpbGRgLGBhc2BdKV0pLF86M30sOCxbYHJlZmVyZW5jZWBdKSl9fSksSmk9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPVNpKCk7TWUoKCk9PntpLnZhbHVlRWxlbWVudD1yfSk7bGV0IGE9TSgoKT0+e2xldCBlPVtdLHQ9QXJyYXkuZnJvbShpLm9wdGlvbnNTZXQudmFsdWUpLG49ZT0+dC5maW5kKHQ9PnZpKGUsdC52YWx1ZSxpLmJ5KSk7cmV0dXJuIGU9QXJyYXkuaXNBcnJheShpLm1vZGVsVmFsdWUudmFsdWUpP2kubW9kZWxWYWx1ZS52YWx1ZS5tYXAoZT0+bihlKT8udGV4dENvbnRlbnQ/P2BgKTpbbihpLm1vZGVsVmFsdWUudmFsdWUpPy50ZXh0Q29udGVudD8/YGBdLGUuZmlsdGVyKEJvb2xlYW4pfSksbz1NKCgpPT5hLnZhbHVlLmxlbmd0aD9hLnZhbHVlLmpvaW4oYCwgYCk6dC5wbGFjZWhvbGRlcik7cmV0dXJuKGUscik9PihOKCksSShiKEEpLHtyZWY6YihuKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLHN0eWxlOntwb2ludGVyRXZlbnRzOmBub25lYH0sImRhdGEtcGxhY2Vob2xkZXIiOmEudmFsdWUubGVuZ3RoP3ZvaWQgMDp0LnBsYWNlaG9sZGVyfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse3NlbGVjdGVkTGFiZWw6YS52YWx1ZSxtb2RlbFZhbHVlOmIoaSkubW9kZWxWYWx1ZS52YWx1ZX0sKCk9PltnZShjZShvLnZhbHVlKSwxKV0pXSksXzozfSw4LFtgYXNgLGBhcy1jaGlsZGAsYGRhdGEtcGxhY2Vob2xkZXJgXSkpfX0pLFlpPVIoe19fbmFtZTpgU2VsZWN0Vmlld3BvcnRgLHByb3BzOntub25jZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse25vbmNlOm59PWYodCkscj1oaShuKSxpPU9pKCksYT1pLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGA/amkoKTp2b2lkIDAse2ZvcndhcmRSZWY6byxjdXJyZW50RWxlbWVudDpzfT1pZSgpO01lKCgpPT57aT8ub25WaWV3cG9ydENoYW5nZShzLnZhbHVlKX0pO2xldCBjPUYoMCk7ZnVuY3Rpb24gbChlKXtsZXQgdD1lLmN1cnJlbnRUYXJnZXQse3Nob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOm4sY29udGVudFdyYXBwZXI6cn09YT8/e307aWYobj8udmFsdWUmJnI/LnZhbHVlKXtsZXQgZT1NYXRoLmFicyhjLnZhbHVlLXQuc2Nyb2xsVG9wKTtpZihlPjApe2xldCBuPXdpbmRvdy5pbm5lckhlaWdodC0yMCxpPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUubWluSGVpZ2h0KSxhPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUuaGVpZ2h0KSxvPU1hdGgubWF4KGksYSk7aWYobzxuKXtsZXQgaT1vK2UsYT1NYXRoLm1pbihuLGkpLHM9aS1hO3IudmFsdWUuc3R5bGUuaGVpZ2h0PWAke2F9cHhgLHIudmFsdWUuc3R5bGUuYm90dG9tPT09YDBweGAmJih0LnNjcm9sbFRvcD1zPjA/czowLHIudmFsdWUuc3R5bGUuanVzdGlmeUNvbnRlbnQ9YGZsZXgtZW5kYCl9fX1jLnZhbHVlPXQuc2Nyb2xsVG9wfXJldHVybihlLG4pPT4oTigpLFAoayxudWxsLFtMKGIoQSksaih7cmVmOmIobyksImRhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnQiOmBgLHJvbGU6YHByZXNlbnRhdGlvbmB9LHsuLi5lLiRhdHRycywuLi50fSx7c3R5bGU6e3Bvc2l0aW9uOmByZWxhdGl2ZWAsZmxleDoxLG92ZXJmbG93OmBoaWRkZW4gYXV0b2B9LG9uU2Nyb2xsOmx9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNiksTChiKEEpLHthczpgc3R5bGVgLG5vbmNlOmIocil9LHtkZWZhdWx0OkIoKCk9Pm5bMF18fD1bZ2UoYCAvKiBIaWRlIHNjcm9sbGJhcnMgY3Jvc3MtYnJvd3NlciBhbmQgZW5hYmxlIG1vbWVudHVtIHNjcm9sbCBmb3IgdG91Y2ggZGV2aWNlcyAqLyBbZGF0YS1yZWthLXNlbGVjdC12aWV3cG9ydF0geyBzY3JvbGxiYXItd2lkdGg6bm9uZTsgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7IH0gW2RhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmU7IH0gYCldKSxfOjEsX186WzBdfSw4LFtgbm9uY2VgXSldLDY0KSl9fSksWGk9Uih7X19uYW1lOmBTZWxlY3RgLHByb3BzOntvcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRPcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRWYWx1ZTp7fSxtb2RlbFZhbHVlOnt9LG51bGxhYmxlVmFsdWU6e30sYnk6e3R5cGU6W1N0cmluZyxGdW5jdGlvbl19LGRpcjp7fSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxhdXRvY29tcGxldGU6e30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sbmFtZTp7fSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWAsYHVwZGF0ZTpvcGVuYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49YShlLHQpO3JldHVybihlLHQpPT4oTigpLEkoYih3aSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdGB9LGIobikpLHtkZWZhdWx0OkIodD0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLFplKHZlKHQpKSldKSxfOjN9LDE2KSl9fSksWmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0Q29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb246e2RlZmF1bHQ6YGl0ZW0tYWxpZ25lZGB9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW59LG1lbW9EZXBlbmRlbmNpZXM6e30sc2lkZTp7fSxzaWRlT2Zmc2V0Ont9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW59LGFsaWduOntkZWZhdWx0OmBjZW50ZXJgfSxhbGlnbk9mZnNldDp7fSxhbGlnbkZsaXA6e3R5cGU6Qm9vbGVhbn0sYXZvaWRDb2xsaXNpb25zOnt0eXBlOkJvb2xlYW59LGNvbGxpc2lvbkJvdW5kYXJ5Ont9LGNvbGxpc2lvblBhZGRpbmc6e30sYXJyb3dQYWRkaW5nOnt9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbn0sc3RpY2t5Ont9LGhpZGVXaGVuRGV0YWNoZWQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25TdHJhdGVneTp7fSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW59LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFufSxyZWZlcmVuY2U6e30sZGlyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW59LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYGNsb3NlQXV0b0ZvY3VzYCxgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGk9ZWUobixgY2xhc3NgKSxvPWEoaSxyKTtyZXR1cm4odCxyKT0+KE4oKSxJKGIoVWkpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihJaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1jb250ZW50YCwiZGF0YS1hbGlnbi10cmlnZ2VyIjplLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGB9LHsuLi50LiRhdHRycywuLi5iKG8pfSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLW9wZW46YW5pbWF0ZS1pbiBkYXRhLWNsb3NlZDphbmltYXRlLW91dCBkYXRhLWNsb3NlZDpmYWRlLW91dC0wIGRhdGEtb3BlbjpmYWRlLWluLTAgZGF0YS1jbG9zZWQ6em9vbS1vdXQtOTUgZGF0YS1vcGVuOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgcmluZy1mb3JlZ3JvdW5kLzEwIG1pbi13LTM2IHJvdW5kZWQtbGcgc2hhZG93LW1kIHJpbmctMSBkdXJhdGlvbi0xMDAgZGF0YS1bc2lkZT1pbmxpbmUtc3RhcnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPWlubGluZS1lbmRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGNuLW1lbnUtdHJhbnNsdWNlbnQgcmVsYXRpdmUgei01MCBtYXgtaC0oLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQpIG9yaWdpbi0oLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byBkYXRhLVthbGlnbi10cmlnZ2VyPXRydWVdOmFuaW1hdGUtbm9uZWAsZS5wb3NpdGlvbj09PWBwb3BwZXJgJiZgZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMWAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bTChiKHRhKSksTChiKFlpKSx7ImRhdGEtcG9zaXRpb24iOmUucG9zaXRpb24sY2xhc3M6dGUoYihwKShgZGF0YS1bcG9zaXRpb249cG9wcGVyXTpoLSgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0KSBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOnctZnVsbCBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOm1pbi13LSgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpYCkpfSx7ZGVmYXVsdDpCKCgpPT5beih0LiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS1wb3NpdGlvbmAsYGNsYXNzYF0pLEwoYihlYSkpXSksXzozfSwxNixbYGRhdGEtYWxpZ24tdHJpZ2dlcmAsYGNsYXNzYF0pXSksXzozfSkpfX0pLFFpPXtjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSByaWdodC0yIGZsZXggc2l6ZS00IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcmB9LCRpPVIoe19fbmFtZTpgU2VsZWN0SXRlbWAscHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW59LHRleHRWYWx1ZTp7fSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihCaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1pdGVtYH0sYihyKSx7Y2xhc3M6YihwKShgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgbm90LWRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOmZvY3VzOioqOnRleHQtYWNjZW50LWZvcmVncm91bmQgZ2FwLTEuNSByb3VuZGVkLW1kIHB5LTEgcHItOCBwbC0xLjUgdGV4dC1zbSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00ICo6W3NwYW5dOmxhc3Q6ZmxleCAqOltzcGFuXTpsYXN0Oml0ZW1zLWNlbnRlciAqOltzcGFuXTpsYXN0OmdhcC0yIHJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bSGUoYHNwYW5gLFFpLFtMKGIoVmkpLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGluZGljYXRvci1pY29uYCx7fSwoKT0+W0woYih1ZSkse2ljb246Yih2KSxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTMuNWB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30pXSksTChiKEhpKSxudWxsLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9KV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksZWE9Uih7X19uYW1lOmBTZWxlY3RTY3JvbGxEb3duQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPWVlKHQsYGNsYXNzYCkscj1LZShuKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoR2kpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3Qtc2Nyb2xsLWRvd24tYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoTGUpLGNsYXNzOmBzaXplLTRgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLHRhPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsVXBCdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihLaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoXyksY2xhc3M6YHNpemUtNGB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksbmE9Uih7X19uYW1lOmBTZWxlY3RUcmlnZ2VyYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0scmVmZXJlbmNlOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sc2l6ZTp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgLGBzaXplYCkscj1LZShuKTtyZXR1cm4obixpKT0+KE4oKSxJKGIocWkpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3QtdHJpZ2dlcmAsImRhdGEtc2l6ZSI6ZS5zaXplfSxiKHIpLHtjbGFzczpiKHApKGBib3JkZXItaW5wdXQgZGF0YS1wbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZS81MCBnYXAtMS41IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB5LTIgcHItMiBwbC0yLjUgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycyBzZWxlY3Qtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGRhdGEtW3NpemU9ZGVmYXVsdF06aC04IGRhdGEtW3NpemU9c21dOmgtNyBkYXRhLVtzaXplPXNtXTpyb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMHB4KV0gKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06Z2FwLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00IGZsZXggdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB3aGl0ZXNwYWNlLW5vd3JhcCBvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06bGluZS1jbGFtcC0xICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmZsZXggKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06aXRlbXMtY2VudGVyIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx0LmNsYXNzKX0pLHtkZWZhdWx0OkIoKCk9Plt6KG4uJHNsb3RzLGBkZWZhdWx0YCksTChiKExpKSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0woYih1ZSkse2ljb246YihMZSksY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBzaXplLTQgcG9pbnRlci1ldmVudHMtbm9uZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9KV0pLF86M30sMTYsW2BkYXRhLXNpemVgLGBjbGFzc2BdKSl9fSkscmE9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e319LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihOKCksSShiKEppKSxqKHsiZGF0YS1zbG90Ijpgc2VsZWN0LXZhbHVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KTtmdW5jdGlvbiBpYShlKXtyZXR1cm4gZSsuNXwwfXZhciBhYT0oZSx0LG4pPT5NYXRoLm1heChNYXRoLm1pbihlLG4pLHQpO2Z1bmN0aW9uIG9hKGUpe3JldHVybiBhYShpYShlKjIuNTUpLDAsMjU1KX1mdW5jdGlvbiBzYShlKXtyZXR1cm4gYWEoaWEoZSoyNTUpLDAsMjU1KX1mdW5jdGlvbiBjYShlKXtyZXR1cm4gYWEoaWEoZS8yLjU1KS8xMDAsMCwxKX1mdW5jdGlvbiBsYShlKXtyZXR1cm4gYWEoaWEoZSoxMDApLDAsMTAwKX12YXIgdWE9ezA6MCwxOjEsMjoyLDM6Myw0OjQsNTo1LDY6Niw3OjcsODo4LDk6OSxBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNSxhOjEwLGI6MTEsYzoxMixkOjEzLGU6MTQsZjoxNX0sZGE9Wy4uLmAwMTIzNDU2Nzg5QUJDREVGYF0sZmE9ZT0+ZGFbZSYxNV0scGE9ZT0+ZGFbKGUmMjQwKT4+NF0rZGFbZSYxNV0sbWE9ZT0+KGUmMjQwKT4+ND09KGUmMTUpLGhhPWU9Pm1hKGUucikmJm1hKGUuZykmJm1hKGUuYikmJm1hKGUuYSk7ZnVuY3Rpb24gZ2EoZSl7dmFyIHQ9ZS5sZW5ndGgsbjtyZXR1cm4gZVswXT09PWAjYCYmKHQ9PT00fHx0PT09NT9uPXtyOjI1NSZ1YVtlWzFdXSoxNyxnOjI1NSZ1YVtlWzJdXSoxNyxiOjI1NSZ1YVtlWzNdXSoxNyxhOnQ9PT01P3VhW2VbNF1dKjE3OjI1NX06KHQ9PT03fHx0PT09OSkmJihuPXtyOnVhW2VbMV1dPDw0fHVhW2VbMl1dLGc6dWFbZVszXV08PDR8dWFbZVs0XV0sYjp1YVtlWzVdXTw8NHx1YVtlWzZdXSxhOnQ9PT05P3VhW2VbN11dPDw0fHVhW2VbOF1dOjI1NX0pKSxufXZhciBfYT0oZSx0KT0+ZTwyNTU/dChlKTpgYDtmdW5jdGlvbiB2YShlKXt2YXIgdD1oYShlKT9mYTpwYTtyZXR1cm4gZT9gI2ArdChlLnIpK3QoZS5nKSt0KGUuYikrX2EoZS5hLHQpOnZvaWQgMH12YXIgeWE9L14oaHNsYT98aHdifGhzdilcKFxzKihbLSsuZVxkXSspKD86ZGVnKT9bXHMsXSsoWy0rLmVcZF0rKSVbXHMsXSsoWy0rLmVcZF0rKSUoPzpbXHMsXSsoWy0rLmVcZF0rKSglKT8pP1xzKlwpJC87ZnVuY3Rpb24gYmEoZSx0LG4pe2xldCByPXQqTWF0aC5taW4obiwxLW4pLGk9KHQsaT0odCtlLzMwKSUxMik9Pm4tcipNYXRoLm1heChNYXRoLm1pbihpLTMsOS1pLDEpLC0xKTtyZXR1cm5baSgwKSxpKDgpLGkoNCldfWZ1bmN0aW9uIHhhKGUsdCxuKXtsZXQgcj0ocixpPShyK2UvNjApJTYpPT5uLW4qdCpNYXRoLm1heChNYXRoLm1pbihpLDQtaSwxKSwwKTtyZXR1cm5bcig1KSxyKDMpLHIoMSldfWZ1bmN0aW9uIFNhKGUsdCxuKXtsZXQgcj1iYShlLDEsLjUpLGk7Zm9yKHQrbj4xJiYoaT0xLyh0K24pLHQqPWksbio9aSksaT0wO2k8MztpKyspcltpXSo9MS10LW4scltpXSs9dDtyZXR1cm4gcn1mdW5jdGlvbiBDYShlLHQsbixyLGkpe3JldHVybiBlPT09aT8odC1uKS9yKyh0PG4/NjowKTp0PT09aT8obi1lKS9yKzI6KGUtdCkvcis0fWZ1bmN0aW9uIHdhKGUpe2xldCB0PWUuci8yNTUsbj1lLmcvMjU1LHI9ZS5iLzI1NSxpPU1hdGgubWF4KHQsbixyKSxhPU1hdGgubWluKHQsbixyKSxvPShpK2EpLzIscyxjLGw7cmV0dXJuIGkhPT1hJiYobD1pLWEsYz1vPi41P2wvKDItaS1hKTpsLyhpK2EpLHM9Q2EodCxuLHIsbCxpKSxzPXMqNjArLjUpLFtzfDAsY3x8MCxvXX1mdW5jdGlvbiBUYShlLHQsbixyKXtyZXR1cm4oQXJyYXkuaXNBcnJheSh0KT9lKHRbMF0sdFsxXSx0WzJdKTplKHQsbixyKSkubWFwKHNhKX1mdW5jdGlvbiBFYShlLHQsbil7cmV0dXJuIFRhKGJhLGUsdCxuKX1mdW5jdGlvbiBEYShlLHQsbil7cmV0dXJuIFRhKFNhLGUsdCxuKX1mdW5jdGlvbiBPYShlLHQsbil7cmV0dXJuIFRhKHhhLGUsdCxuKX1mdW5jdGlvbiBrYShlKXtyZXR1cm4oZSUzNjArMzYwKSUzNjB9ZnVuY3Rpb24gQWEoZSl7bGV0IHQ9eWEuZXhlYyhlKSxuPTI1NSxyO2lmKCF0KXJldHVybjt0WzVdIT09ciYmKG49dFs2XT9vYSgrdFs1XSk6c2EoK3RbNV0pKTtsZXQgaT1rYSgrdFsyXSksYT10WzNdLzEwMCxvPXRbNF0vMTAwO3JldHVybiByPXRbMV09PT1gaHdiYD9EYShpLGEsbyk6dFsxXT09PWBoc3ZgP09hKGksYSxvKTpFYShpLGEsbykse3I6clswXSxnOnJbMV0sYjpyWzJdLGE6bn19ZnVuY3Rpb24gamEoZSx0KXt2YXIgbj13YShlKTtuWzBdPWthKG5bMF0rdCksbj1FYShuKSxlLnI9blswXSxlLmc9blsxXSxlLmI9blsyXX1mdW5jdGlvbiBNYShlKXtpZighZSlyZXR1cm47bGV0IHQ9d2EoZSksbj10WzBdLHI9bGEodFsxXSksaT1sYSh0WzJdKTtyZXR1cm4gZS5hPDI1NT9gaHNsYSgke259LCAke3J9JSwgJHtpfSUsICR7Y2EoZS5hKX0pYDpgaHNsKCR7bn0sICR7cn0lLCAke2l9JSlgfXZhciBOYT17eDpgZGFya2AsWjpgbGlnaHRgLFk6YHJlYCxYOmBibHVgLFc6YGdyYCxWOmBtZWRpdW1gLFU6YHNsYXRlYCxBOmBlZWAsVDpgb2xgLFM6YG9yYCxCOmByYWAsQzpgbGF0ZWdgLEQ6YGlnaHRzYCxSOmBpbmAsUTpgdHVycXVvaXNgLEU6YGhpYCxQOmByb2AsTzpgYWxgLE46YGxlYCxNOmBkZWAsTDpgeWVsbG9gLEY6YGVuYCxLOmBjaGAsRzpgYXJrc2AsSDpgZWFgLEk6YGlnaHRnYCxKOmB3aGB9LFBhPXtPaWNlWGU6YGYwZjhmZmAsYW50aXF1ZXdFdGU6YGZhZWJkN2AsYXF1YTpgZmZmZmAsYXF1YW1hclJlOmA3ZmZmZDRgLGF6dVk6YGYwZmZmZmAsYmVpZ2U6YGY1ZjVkY2AsYmlzcXVlOmBmZmU0YzRgLGJsYWNrOmAwYCxibGFuS2VkT21vbmQ6YGZmZWJjZGAsWGU6YGZmYCxYZXZpVGV0OmA4YTJiZTJgLGJQd246YGE1MmEyYWAsYnVybHl3b29kOmBkZWI4ODdgLGNhTXRYZTpgNWY5ZWEwYCxLYXJ0WXVzZTpgN2ZmZjAwYCxLb2NUYXRlOmBkMjY5MWVgLGNTTzpgZmY3ZjUwYCxjU25mbG93ZXJYZTpgNjQ5NWVkYCxjU25zaWxrOmBmZmY4ZGNgLGNyaW1zb246YGRjMTQzY2AsY3lhbjpgZmZmZmAseFhlOmA4YmAseGN5YW46YDhiOGJgLHhnVE1uUGQ6YGI4ODYwYmAseFdheTpgYTlhOWE5YCx4Z1lGOmA2NDAwYCx4Z1l5OmBhOWE5YTlgLHhraGFraTpgYmRiNzZiYCx4bWFnRnRhOmA4YjAwOGJgLHhUaXZlZ1lGOmA1NTZiMmZgLHhTYW5nZTpgZmY4YzAwYCx4U2NFZDpgOTkzMmNjYCx4WWQ6YDhiMDAwMGAseHNPbW9uOmBlOTk2N2FgLHhzSGdZRjpgOGZiYzhmYCx4VVhlOmA0ODNkOGJgLHhVV2F5OmAyZjRmNGZgLHhVZ1l5OmAyZjRmNGZgLHhRZTpgY2VkMWAseHZpVGV0OmA5NDAwZDNgLGRBcHBSazpgZmYxNDkzYCxkQXBza3lYZTpgYmZmZmAsZGltV2F5OmA2OTY5NjlgLGRpbWdZeTpgNjk2OTY5YCxkb2RnZXJYZTpgMWU5MGZmYCxmaVlicmljazpgYjIyMjIyYCxmbFNPd0V0ZTpgZmZmYWYwYCxmb1lzdFdBbjpgMjI4YjIyYCxmdUtzaWE6YGZmMDBmZmAsZ2FSc2JTbzpgZGNkY2RjYCxnaG9zdHdFdGU6YGY4ZjhmZmAsZ1RkOmBmZmQ3MDBgLGdUTW5QZDpgZGFhNTIwYCxXYXk6YDgwODA4MGAsZ1lGOmA4MDAwYCxnWUZMdzpgYWRmZjJmYCxnWXk6YDgwODA4MGAsaG9uZXlNdzpgZjBmZmYwYCxob3RwUms6YGZmNjliNGAsUmRpYW5ZZDpgY2Q1YzVjYCxSZGlnbzpgNGIwMDgyYCxpdlN5OmBmZmZmZjBgLGtoYWtpOmBmMGU2OGNgLGxhdkZNcjpgZTZlNmZhYCxsYXZGTXJYc2g6YGZmZjBmNWAsbGF3bmdZRjpgN2NmYzAwYCxObW9uY0VmZm9uOmBmZmZhY2RgLFpYZTpgYWRkOGU2YCxaY1NPOmBmMDgwODBgLFpjeWFuOmBlMGZmZmZgLFpnVE1uUGRMdzpgZmFmYWQyYCxaV2F5OmBkM2QzZDNgLFpnWUY6YDkwZWU5MGAsWmdZeTpgZDNkM2QzYCxacFJrOmBmZmI2YzFgLFpzT21vbjpgZmZhMDdhYCxac0hnWUY6YDIwYjJhYWAsWnNreVhlOmA4N2NlZmFgLFpVV2F5OmA3Nzg4OTlgLFpVZ1l5OmA3Nzg4OTlgLFpzdEFsWGU6YGIwYzRkZWAsWkx3OmBmZmZmZTBgLGxpbWU6YGZmMDBgLGxpbWVnWUY6YDMyY2QzMmAsbFJGOmBmYWYwZTZgLG1hZ0Z0YTpgZmYwMGZmYCxtYVBvbjpgODAwMDAwYCxWYXF1YW1hclJlOmA2NmNkYWFgLFZYZTpgY2RgLFZTY0VkOmBiYTU1ZDNgLFZwdXJwTjpgOTM3MGRiYCxWc0hnWUY6YDNjYjM3MWAsVlVYZTpgN2I2OGVlYCxWc3ByUmdnWUY6YGZhOWFgLFZRZTpgNDhkMWNjYCxWdmlUZXRZZDpgYzcxNTg1YCxtaWRuaWdodFhlOmAxOTE5NzBgLG1SdGNZYW06YGY1ZmZmYWAsbWlzdHlQc2U6YGZmZTRlMWAsbW9jY2FzUjpgZmZlNGI1YCxuYXZham93RXRlOmBmZmRlYWRgLG5hdnk6YDgwYCxUZGxhY2U6YGZkZjVlNmAsVGl2ZTpgODA4MDAwYCxUaXZlZEJiOmA2YjhlMjNgLFNhbmdlOmBmZmE1MDBgLFNhbmdlWWQ6YGZmNDUwMGAsU2NFZDpgZGE3MGQ2YCxwT2VnVE1uUGQ6YGVlZThhYWAscE9lZ1lGOmA5OGZiOThgLHBPZVFlOmBhZmVlZWVgLHBPZXZpVGV0WWQ6YGRiNzA5M2AscGFwYXlhd0VwOmBmZmVmZDVgLHBIS3B1ZmY6YGZmZGFiOWAscGVydTpgY2Q4NTNmYCxwUms6YGZmYzBjYmAscGx1bTpgZGRhMGRkYCxwb3dNclhlOmBiMGUwZTZgLHB1cnBOOmA4MDAwODBgLFliZWNjYXB1cnBOOmA2NjMzOTlgLFlkOmBmZjAwMDBgLFBzeWJyb3duOmBiYzhmOGZgLFB5T1hlOmA0MTY5ZTFgLHNhZGROYlB3bjpgOGI0NTEzYCxzT21vbjpgZmE4MDcyYCxzYW5keWJQd246YGY0YTQ2MGAsc0hnWUY6YDJlOGI1N2Asc0hzaGVsbDpgZmZmNWVlYCxzaUZuYTpgYTA1MjJkYCxzaWx2ZXI6YGMwYzBjMGAsc2t5WGU6YDg3Y2VlYmAsVVhlOmA2YTVhY2RgLFVXYXk6YDcwODA5MGAsVWdZeTpgNzA4MDkwYCxzbm93OmBmZmZhZmFgLHNwclJnZ1lGOmBmZjdmYCxzdEFsWGU6YDQ2ODJiNGAsdGFuOmBkMmI0OGNgLHRlTzpgODA4MGAsdEVzdE46YGQ4YmZkOGAsdG9tYXRvOmBmZjYzNDdgLFFlOmA0MGUwZDBgLHZpVGV0OmBlZTgyZWVgLEpIdDpgZjVkZWIzYCx3RXRlOmBmZmZmZmZgLHdFdGVzbW9rZTpgZjVmNWY1YCxMdzpgZmZmZjAwYCxMd2dZRjpgOWFjZDMyYH07ZnVuY3Rpb24gRmEoKXtsZXQgZT17fSx0PU9iamVjdC5rZXlzKFBhKSxuPU9iamVjdC5rZXlzKE5hKSxyLGksYSxvLHM7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7Zm9yKG89cz10W3JdLGk9MDtpPG4ubGVuZ3RoO2krKylhPW5baV0scz1zLnJlcGxhY2UoYSxOYVthXSk7YT1wYXJzZUludChQYVtvXSwxNiksZVtzXT1bYT4+MTYmMjU1LGE+PjgmMjU1LGEmMjU1XX1yZXR1cm4gZX12YXIgSWE7ZnVuY3Rpb24gTGEoZSl7SWF8fChJYT1GYSgpLElhLnRyYW5zcGFyZW50PVswLDAsMCwwXSk7bGV0IHQ9SWFbZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdCYme3I6dFswXSxnOnRbMV0sYjp0WzJdLGE6dC5sZW5ndGg9PT00P3RbM106MjU1fX12YXIgUmE9L15yZ2JhP1woXHMqKFstKy5cZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT8oPzpbXHMsL10rKFstKy5lXGRdKykoJSk/KT9ccypcKSQvO2Z1bmN0aW9uIHphKGUpe2xldCB0PVJhLmV4ZWMoZSksbj0yNTUscixpLGE7aWYodCl7aWYodFs3XSE9PXIpe2xldCBlPSt0WzddO249dFs4XT9vYShlKTphYShlKjI1NSwwLDI1NSl9cmV0dXJuIHI9K3RbMV0saT0rdFszXSxhPSt0WzVdLHI9MjU1Jih0WzJdP29hKHIpOmFhKHIsMCwyNTUpKSxpPTI1NSYodFs0XT9vYShpKTphYShpLDAsMjU1KSksYT0yNTUmKHRbNl0/b2EoYSk6YWEoYSwwLDI1NSkpLHtyLGc6aSxiOmEsYTpufX19ZnVuY3Rpb24gQmEoZSl7cmV0dXJuIGUmJihlLmE8MjU1P2ByZ2JhKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0sICR7Y2EoZS5hKX0pYDpgcmdiKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0pYCl9dmFyIFZhPWU9PmU8PS4wMDMxMzA4P2UqMTIuOTI6ZSoqKDEvMi40KSoxLjA1NS0uMDU1LEhhPWU9PmU8PS4wNDA0NT9lLzEyLjkyOigoZSsuMDU1KS8xLjA1NSkqKjIuNDtmdW5jdGlvbiBVYShlLHQsbil7bGV0IHI9SGEoY2EoZS5yKSksaT1IYShjYShlLmcpKSxhPUhhKGNhKGUuYikpO3JldHVybntyOnNhKFZhKHIrbiooSGEoY2EodC5yKSktcikpKSxnOnNhKFZhKGkrbiooSGEoY2EodC5nKSktaSkpKSxiOnNhKFZhKGErbiooSGEoY2EodC5iKSktYSkpKSxhOmUuYStuKih0LmEtZS5hKX19ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUpe2xldCByPXdhKGUpO3JbdF09TWF0aC5tYXgoMCxNYXRoLm1pbihyW3RdK3JbdF0qbix0PT09MD8zNjA6MSkpLHI9RWEociksZS5yPXJbMF0sZS5nPXJbMV0sZS5iPXJbMl19fWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIGUmJk9iamVjdC5hc3NpZ24odHx8e30sZSl9ZnVuY3Rpb24gS2EoZSl7dmFyIHQ9e3I6MCxnOjAsYjowLGE6MjU1fTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aD49MyYmKHQ9e3I6ZVswXSxnOmVbMV0sYjplWzJdLGE6MjU1fSxlLmxlbmd0aD4zJiYodC5hPXNhKGVbM10pKSk6KHQ9R2EoZSx7cjowLGc6MCxiOjAsYToxfSksdC5hPXNhKHQuYSkpLHR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGUuY2hhckF0KDApPT09YHJgP3phKGUpOkFhKGUpfXZhciBKYT1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiB0O2xldCBuPXR5cGVvZiB0LHI7bj09PWBvYmplY3RgP3I9S2EodCk6bj09PWBzdHJpbmdgJiYocj1nYSh0KXx8TGEodCl8fHFhKHQpKSx0aGlzLl9yZ2I9cix0aGlzLl92YWxpZD0hIXJ9Z2V0IHZhbGlkKCl7cmV0dXJuIHRoaXMuX3ZhbGlkfWdldCByZ2IoKXt2YXIgZT1HYSh0aGlzLl9yZ2IpO3JldHVybiBlJiYoZS5hPWNhKGUuYSkpLGV9c2V0IHJnYihlKXt0aGlzLl9yZ2I9S2EoZSl9cmdiU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkP0JhKHRoaXMuX3JnYik6dm9pZCAwfWhleFN0cmluZygpe3JldHVybiB0aGlzLl92YWxpZD92YSh0aGlzLl9yZ2IpOnZvaWQgMH1oc2xTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdmFsaWQ/TWEodGhpcy5fcmdiKTp2b2lkIDB9bWl4KGUsdCl7aWYoZSl7bGV0IG49dGhpcy5yZ2Iscj1lLnJnYixpLGE9dD09PWk/LjU6dCxvPTIqYS0xLHM9bi5hLXIuYSxjPSgobypzPT09LTE/bzoobytzKS8oMStvKnMpKSsxKS8yO2k9MS1jLG4ucj0yNTUmYypuLnIraSpyLnIrLjUsbi5nPTI1NSZjKm4uZytpKnIuZysuNSxuLmI9MjU1JmMqbi5iK2kqci5iKy41LG4uYT1hKm4uYSsoMS1hKSpyLmEsdGhpcy5yZ2I9bn1yZXR1cm4gdGhpc31pbnRlcnBvbGF0ZShlLHQpe3JldHVybiBlJiYodGhpcy5fcmdiPVVhKHRoaXMuX3JnYixlLl9yZ2IsdCkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IGUodGhpcy5yZ2IpfWFscGhhKGUpe3JldHVybiB0aGlzLl9yZ2IuYT1zYShlKSx0aGlzfWNsZWFyZXIoZSl7bGV0IHQ9dGhpcy5fcmdiO3JldHVybiB0LmEqPTEtZSx0aGlzfWdyZXlzY2FsZSgpe2xldCBlPXRoaXMuX3JnYjtyZXR1cm4gZS5yPWUuZz1lLmI9aWEoZS5yKi4zK2UuZyouNTkrZS5iKi4xMSksdGhpc31vcGFxdWVyKGUpe2xldCB0PXRoaXMuX3JnYjtyZXR1cm4gdC5hKj0xK2UsdGhpc31uZWdhdGUoKXtsZXQgZT10aGlzLl9yZ2I7cmV0dXJuIGUucj0yNTUtZS5yLGUuZz0yNTUtZS5nLGUuYj0yNTUtZS5iLHRoaXN9bGlnaHRlbihlKXtyZXR1cm4gV2EodGhpcy5fcmdiLDIsZSksdGhpc31kYXJrZW4oZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwyLC1lKSx0aGlzfXNhdHVyYXRlKGUpe3JldHVybiBXYSh0aGlzLl9yZ2IsMSxlKSx0aGlzfWRlc2F0dXJhdGUoZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwxLC1lKSx0aGlzfXJvdGF0ZShlKXtyZXR1cm4gamEodGhpcy5fcmdiLGUpLHRoaXN9fTtmdW5jdGlvbiBZYSgpe312YXIgWGE9KCgpPT57bGV0IGU9MDtyZXR1cm4oKT0+ZSsrfSkoKTtmdW5jdGlvbiBVKGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIFcoZSl7aWYoQXJyYXkuaXNBcnJheSYmQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoMCw3KT09PWBbb2JqZWN0YCYmdC5zbGljZSgtNik9PT1gQXJyYXldYH1mdW5jdGlvbiBHKGUpe3JldHVybiBlIT09bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWB9ZnVuY3Rpb24gSyhlKXtyZXR1cm4odHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmaXNGaW5pdGUoK2UpfWZ1bmN0aW9uIFphKGUsdCl7cmV0dXJuIEsoZSk/ZTp0fWZ1bmN0aW9uIHEoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD90OmV9dmFyIFFhPShlLHQpPT50eXBlb2YgZT09YHN0cmluZ2AmJmUuZW5kc1dpdGgoYCVgKT9wYXJzZUZsb2F0KGUpLzEwMCp0OitlO2Z1bmN0aW9uIEooZSx0LG4pe2lmKGUmJnR5cGVvZiBlLmNhbGw9PWBmdW5jdGlvbmApcmV0dXJuIGUuYXBwbHkobix0KX1mdW5jdGlvbiBZKGUsdCxuLHIpe2xldCBpLGEsbztpZihXKGUpKXtpZihhPWUubGVuZ3RoLHIpZm9yKGk9YS0xO2k+PTA7aS0tKXQuY2FsbChuLGVbaV0saSk7ZWxzZSBmb3IoaT0wO2k8YTtpKyspdC5jYWxsKG4sZVtpXSxpKX1lbHNlIGlmKEcoZSkpZm9yKG89T2JqZWN0LmtleXMoZSksYT1vLmxlbmd0aCxpPTA7aTxhO2krKyl0LmNhbGwobixlW29baV1dLG9baV0pfWZ1bmN0aW9uICRhKGUsdCl7bGV0IG4scixpLGE7aWYoIWV8fCF0fHxlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKWlmKGk9ZVtuXSxhPXRbbl0saS5kYXRhc2V0SW5kZXghPT1hLmRhdGFzZXRJbmRleHx8aS5pbmRleCE9PWEuaW5kZXgpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZW8oZSl7aWYoVyhlKSlyZXR1cm4gZS5tYXAoZW8pO2lmKEcoZSkpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1PYmplY3Qua2V5cyhlKSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdFtuW2ldXT1lbyhlW25baV1dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiB0byhlKXtyZXR1cm5bYF9fcHJvdG9fX2AsYHByb3RvdHlwZWAsYGNvbnN0cnVjdG9yYF0uaW5kZXhPZihlKT09PS0xfWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKCF0byhlKSlyZXR1cm47bGV0IGk9dFtlXSxhPW5bZV07RyhpKSYmRyhhKT9ybyhpLGEscik6dFtlXT1lbyhhKX1mdW5jdGlvbiBybyhlLHQsbil7bGV0IHI9Vyh0KT90Olt0XSxpPXIubGVuZ3RoO2lmKCFHKGUpKXJldHVybiBlO258fD17fTtsZXQgYT1uLm1lcmdlcnx8bm8sbztmb3IobGV0IHQ9MDt0PGk7Kyt0KXtpZihvPXJbdF0sIUcobykpY29udGludWU7bGV0IGk9T2JqZWN0LmtleXMobyk7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7Kyt0KWEoaVt0XSxlLG8sbil9cmV0dXJuIGV9ZnVuY3Rpb24gaW8oZSx0KXtyZXR1cm4gcm8oZSx0LHttZXJnZXI6YW99KX1mdW5jdGlvbiBhbyhlLHQsbil7aWYoIXRvKGUpKXJldHVybjtsZXQgcj10W2VdLGk9bltlXTtHKHIpJiZHKGkpP2lvKHIsaSk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl8fCh0W2VdPWVvKGkpKX12YXIgb289eyIiOmU9PmUseDplPT5lLngseTplPT5lLnl9O2Z1bmN0aW9uIHNvKGUpe2xldCB0PWUuc3BsaXQoYC5gKSxuPVtdLHI9YGA7Zm9yKGxldCBlIG9mIHQpcis9ZSxyLmVuZHNXaXRoKGBcXGApP3I9ci5zbGljZSgwLC0xKStgLmA6KG4ucHVzaChyKSxyPWBgKTtyZXR1cm4gbn1mdW5jdGlvbiBjbyhlKXtsZXQgdD1zbyhlKTtyZXR1cm4gZT0+e2ZvcihsZXQgbiBvZiB0KXtpZihuPT09YGApYnJlYWs7ZSYmPWVbbl19cmV0dXJuIGV9fWZ1bmN0aW9uIGxvKGUsdCl7cmV0dXJuKG9vW3RdfHwob29bdF09Y28odCkpKShlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfXZhciBmbz1lPT5lIT09dm9pZCAwLHBvPWU9PnR5cGVvZiBlPT1gZnVuY3Rpb25gLG1vPShlLHQpPT57aWYoZS5zaXplIT09dC5zaXplKXJldHVybiExO2ZvcihsZXQgbiBvZiBlKWlmKCF0LmhhcyhuKSlyZXR1cm4hMTtyZXR1cm4hMH07ZnVuY3Rpb24gaG8oZSl7cmV0dXJuIGUudHlwZT09PWBtb3VzZXVwYHx8ZS50eXBlPT09YGNsaWNrYHx8ZS50eXBlPT09YGNvbnRleHRtZW51YH12YXIgWD1NYXRoLlBJLGdvPTIqWDtnbytYO3ZhciBfbz0xLzAsdm89WC8xODAseW89WC8yLGJvPVgvNCx4bz1YKjIvMyxTbz1NYXRoLmxvZzEwLENvPU1hdGguc2lnbjtmdW5jdGlvbiB3byhlLHQsbil7cmV0dXJuIE1hdGguYWJzKGUtdCk8bn1mdW5jdGlvbiBUbyhlKXtsZXQgdD1NYXRoLnJvdW5kKGUpO2U9d28oZSx0LGUvMWUzKT90OmU7bGV0IG49MTAqKk1hdGguZmxvb3IoU28oZSkpLHI9ZS9uO3JldHVybihyPD0xPzE6cjw9Mj8yOnI8PTU/NToxMCkqbn1mdW5jdGlvbiBFbyhlKXtsZXQgdD1bXSxuPU1hdGguc3FydChlKSxyO2ZvcihyPTE7cjxuO3IrKyllJXI9PT0wJiYodC5wdXNoKHIpLHQucHVzaChlL3IpKTtyZXR1cm4gbj09PShufDApJiZ0LnB1c2gobiksdC5zb3J0KChlLHQpPT5lLXQpLnBvcCgpLHR9ZnVuY3Rpb24gRG8oZSl7cmV0dXJuIHR5cGVvZiBlPT1gc3ltYm9sYHx8dHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJiEoU3ltYm9sLnRvUHJpbWl0aXZlIGluIGV8fGB0b1N0cmluZ2BpbiBlfHxgdmFsdWVPZmBpbiBlKX1mdW5jdGlvbiBPbyhlKXtyZXR1cm4hRG8oZSkmJiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24ga28oZSx0KXtsZXQgbj1NYXRoLnJvdW5kKGUpO3JldHVybiBuLXQ8PWUmJm4rdD49ZX1mdW5jdGlvbiBBbyhlLHQsbil7bGV0IHIsaSxhO2ZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKWE9ZVtyXVtuXSxpc05hTihhKXx8KHQubWluPU1hdGgubWluKHQubWluLGEpLHQubWF4PU1hdGgubWF4KHQubWF4LGEpKX1mdW5jdGlvbiBqbyhlKXtyZXR1cm4gWC8xODAqZX1mdW5jdGlvbiBNbyhlKXtyZXR1cm4gMTgwL1gqZX1mdW5jdGlvbiBObyhlKXtpZighSyhlKSlyZXR1cm47bGV0IHQ9MSxuPTA7Zm9yKDtNYXRoLnJvdW5kKGUqdCkvdCE9PWU7KXQqPTEwLG4rKztyZXR1cm4gbn1mdW5jdGlvbiBQbyhlLHQpe2xldCBuPXQueC1lLngscj10LnktZS55LGk9TWF0aC5zcXJ0KG4qbityKnIpLGE9TWF0aC5hdGFuMihyLG4pO3JldHVybiBhPC0uNSpYJiYoYSs9Z28pLHthbmdsZTphLGRpc3RhbmNlOml9fWZ1bmN0aW9uIEZvKGUsdCl7cmV0dXJuIE1hdGguc3FydCgodC54LWUueCkqKjIrKHQueS1lLnkpKioyKX1mdW5jdGlvbiBJbyhlKXtyZXR1cm4oZSVnbytnbyklZ299ZnVuY3Rpb24gTG8oZSx0LG4scil7bGV0IGk9SW8oZSksYT1Jbyh0KSxvPUlvKG4pLHM9SW8oYS1pKSxjPUlvKG8taSksbD1JbyhpLWEpLHU9SW8oaS1vKTtyZXR1cm4gaT09PWF8fGk9PT1vfHxyJiZhPT09b3x8cz5jJiZsPHV9ZnVuY3Rpb24gUm8oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfWZ1bmN0aW9uIHpvKGUpe3JldHVybiBSbyhlLC0zMjc2OCwzMjc2Nyl9ZnVuY3Rpb24gQm8oZSx0LG4scj0xZS02KXtyZXR1cm4gZT49TWF0aC5taW4odCxuKS1yJiZlPD1NYXRoLm1heCh0LG4pK3J9ZnVuY3Rpb24gVm8oZSx0LG4pe258fD0obj0+ZVtuXTx0KTtsZXQgcj1lLmxlbmd0aC0xLGk9MCxhO2Zvcig7ci1pPjE7KWE9aStyPj4xLG4oYSk/aT1hOnI9YTtyZXR1cm57bG86aSxoaTpyfX12YXIgSG89KGUsdCxuLHIpPT5WbyhlLG4scj9yPT57bGV0IGk9ZVtyXVt0XTtyZXR1cm4gaTxufHxpPT09biYmZVtyKzFdW3RdPT09bn06cj0+ZVtyXVt0XTxuKSxVbz0oZSx0LG4pPT5WbyhlLG4scj0+ZVtyXVt0XT49bik7ZnVuY3Rpb24gV28oZSx0LG4pe2xldCByPTAsaT1lLmxlbmd0aDtmb3IoO3I8aSYmZVtyXTx0OylyKys7Zm9yKDtpPnImJmVbaS0xXT5uOylpLS07cmV0dXJuIHI+MHx8aTxlLmxlbmd0aD9lLnNsaWNlKHIsaSk6ZX12YXIgR289W2BwdXNoYCxgcG9wYCxgc2hpZnRgLGBzcGxpY2VgLGB1bnNoaWZ0YF07ZnVuY3Rpb24gS28oZSx0KXtpZihlLl9jaGFydGpzKXtlLl9jaGFydGpzLmxpc3RlbmVycy5wdXNoKHQpO3JldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX2NoYXJ0anMiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTp7bGlzdGVuZXJzOlt0XX19KSxHby5mb3JFYWNoKHQ9PntsZXQgbj1gX29uRGF0YWArdW8odCkscj1lW3RdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlKC4uLnQpe2xldCBpPXIuYXBwbHkodGhpcyx0KTtyZXR1cm4gZS5fY2hhcnRqcy5saXN0ZW5lcnMuZm9yRWFjaChlPT57dHlwZW9mIGVbbl09PWBmdW5jdGlvbmAmJmVbbl0oLi4udCl9KSxpfX0pfSl9ZnVuY3Rpb24gcW8oZSx0KXtsZXQgbj1lLl9jaGFydGpzO2lmKCFuKXJldHVybjtsZXQgcj1uLmxpc3RlbmVycyxpPXIuaW5kZXhPZih0KTtpIT09LTEmJnIuc3BsaWNlKGksMSksIShyLmxlbmd0aD4wKSYmKEdvLmZvckVhY2godD0+e2RlbGV0ZSBlW3RdfSksZGVsZXRlIGUuX2NoYXJ0anMpfWZ1bmN0aW9uIEpvKGUpe2xldCB0PW5ldyBTZXQoZSk7cmV0dXJuIHQuc2l6ZT09PWUubGVuZ3RoP2U6QXJyYXkuZnJvbSh0KX12YXIgWW89ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz5gdWA/ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX06d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZX0oKTtmdW5jdGlvbiBYbyhlLHQpe2xldCBuPVtdLHI9ITE7cmV0dXJuIGZ1bmN0aW9uKC4uLmkpe249aSxyfHwocj0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3I9ITEsZS5hcHBseSh0LG4pfSkpfX1mdW5jdGlvbiBabyhlLHQpe2xldCBuO3JldHVybiBmdW5jdGlvbiguLi5yKXtyZXR1cm4gdD8oY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChlLHQscikpOmUuYXBwbHkodGhpcyxyKSx0fX12YXIgUW89ZT0+ZT09PWBzdGFydGA/YGxlZnRgOmU9PT1gZW5kYD9gcmlnaHRgOmBjZW50ZXJgLCRvPShlLHQsbik9PmU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246KHQrbikvMixlcz0oZSx0LG4scik9PmU9PT0ocj9gbGVmdGA6YHJpZ2h0YCk/bjplPT09YGNlbnRlcmA/KHQrbikvMjp0LHRzPWU9PmU9PT0wfHxlPT09MSxucz0oZSx0LG4pPT4tKDIqKigxMCotLWUpKk1hdGguc2luKChlLXQpKmdvL24pKSxycz0oZSx0LG4pPT4yKiooLTEwKmUpKk1hdGguc2luKChlLXQpKmdvL24pKzEsaXM9e2xpbmVhcjplPT5lLGVhc2VJblF1YWQ6ZT0+ZSplLGVhc2VPdXRRdWFkOmU9Pi1lKihlLTIpLGVhc2VJbk91dFF1YWQ6ZT0+KGUvPS41KTwxPy41KmUqZTotLjUqKC0tZSooZS0yKS0xKSxlYXNlSW5DdWJpYzplPT5lKmUqZSxlYXNlT3V0Q3ViaWM6ZT0+LS1lKmUqZSsxLGVhc2VJbk91dEN1YmljOmU9PihlLz0uNSk8MT8uNSplKmUqZTouNSooKGUtPTIpKmUqZSsyKSxlYXNlSW5RdWFydDplPT5lKmUqZSplLGVhc2VPdXRRdWFydDplPT4tKC0tZSplKmUqZS0xKSxlYXNlSW5PdXRRdWFydDplPT4oZS89LjUpPDE/LjUqZSplKmUqZTotLjUqKChlLT0yKSplKmUqZS0yKSxlYXNlSW5RdWludDplPT5lKmUqZSplKmUsZWFzZU91dFF1aW50OmU9Pi0tZSplKmUqZSplKzEsZWFzZUluT3V0UXVpbnQ6ZT0+KGUvPS41KTwxPy41KmUqZSplKmUqZTouNSooKGUtPTIpKmUqZSplKmUrMiksZWFzZUluU2luZTplPT4tTWF0aC5jb3MoZSp5bykrMSxlYXNlT3V0U2luZTplPT5NYXRoLnNpbihlKnlvKSxlYXNlSW5PdXRTaW5lOmU9Pi0uNSooTWF0aC5jb3MoWCplKS0xKSxlYXNlSW5FeHBvOmU9PmU9PT0wPzA6MioqKDEwKihlLTEpKSxlYXNlT3V0RXhwbzplPT5lPT09MT8xOi0oMioqKC0xMCplKSkrMSxlYXNlSW5PdXRFeHBvOmU9PnRzKGUpP2U6ZTwuNT8uNSoyKiooMTAqKGUqMi0xKSk6LjUqKC0oMioqKC0xMCooZSoyLTEpKSkrMiksZWFzZUluQ2lyYzplPT5lPj0xP2U6LShNYXRoLnNxcnQoMS1lKmUpLTEpLGVhc2VPdXRDaXJjOmU9Pk1hdGguc3FydCgxLSAtLWUqZSksZWFzZUluT3V0Q2lyYzplPT4oZS89LjUpPDE/LS41KihNYXRoLnNxcnQoMS1lKmUpLTEpOi41KihNYXRoLnNxcnQoMS0oZS09MikqZSkrMSksZWFzZUluRWxhc3RpYzplPT50cyhlKT9lOm5zKGUsLjA3NSwuMyksZWFzZU91dEVsYXN0aWM6ZT0+dHMoZSk/ZTpycyhlLC4wNzUsLjMpLGVhc2VJbk91dEVsYXN0aWMoZSl7bGV0IHQ9LjExMjUsbj0uNDU7cmV0dXJuIHRzKGUpP2U6ZTwuNT8uNSpucyhlKjIsdCxuKTouNSsuNSpycyhlKjItMSx0LG4pfSxlYXNlSW5CYWNrKGUpe3JldHVybiBlKmUqKDIuNzAxNTgqZS0xLjcwMTU4KX0sZWFzZU91dEJhY2soZSl7cmV0dXJuLS1lKmUqKDIuNzAxNTgqZSsxLjcwMTU4KSsxfSxlYXNlSW5PdXRCYWNrKGUpe2xldCB0PTEuNzAxNTg7cmV0dXJuKGUvPS41KTwxPy41KihlKmUqKCgodCo9MS41MjUpKzEpKmUtdCkpOi41KigoZS09MikqZSooKCh0Kj0xLjUyNSkrMSkqZSt0KSsyKX0sZWFzZUluQm91bmNlOmU9PjEtaXMuZWFzZU91dEJvdW5jZSgxLWUpLGVhc2VPdXRCb3VuY2UoZSl7bGV0IHQ9Ny41NjI1LG49Mi43NTtyZXR1cm4gZTwxL24/dCplKmU6ZTwyL24/dCooZS09MS41L24pKmUrLjc1OmU8Mi41L24/dCooZS09Mi4yNS9uKSplKy45Mzc1OnQqKGUtPTIuNjI1L24pKmUrLjk4NDM3NX0sZWFzZUluT3V0Qm91bmNlOmU9PmU8LjU/aXMuZWFzZUluQm91bmNlKGUqMikqLjU6aXMuZWFzZU91dEJvdW5jZShlKjItMSkqLjUrLjV9O2Z1bmN0aW9uIGFzKGUpe2lmKGUmJnR5cGVvZiBlPT1gb2JqZWN0YCl7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PT09YFtvYmplY3QgQ2FudmFzUGF0dGVybl1gfHx0PT09YFtvYmplY3QgQ2FudmFzR3JhZGllbnRdYH1yZXR1cm4hMX1mdW5jdGlvbiBvcyhlKXtyZXR1cm4gYXMoZSk/ZTpuZXcgSmEoZSl9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGFzKGUpP2U6bmV3IEphKGUpLnNhdHVyYXRlKC41KS5kYXJrZW4oLjEpLmhleFN0cmluZygpfXZhciBjcz1bYHhgLGB5YCxgYm9yZGVyV2lkdGhgLGByYWRpdXNgLGB0ZW5zaW9uYF0sbHM9W2Bjb2xvcmAsYGJvcmRlckNvbG9yYCxgYmFja2dyb3VuZENvbG9yYF07ZnVuY3Rpb24gdXMoZSl7ZS5zZXQoYGFuaW1hdGlvbmAse2RlbGF5OnZvaWQgMCxkdXJhdGlvbjoxZTMsZWFzaW5nOmBlYXNlT3V0UXVhcnRgLGZuOnZvaWQgMCxmcm9tOnZvaWQgMCxsb29wOnZvaWQgMCx0bzp2b2lkIDAsdHlwZTp2b2lkIDB9KSxlLmRlc2NyaWJlKGBhbmltYXRpb25gLHtfZmFsbGJhY2s6ITEsX2luZGV4YWJsZTohMSxfc2NyaXB0YWJsZTplPT5lIT09YG9uUHJvZ3Jlc3NgJiZlIT09YG9uQ29tcGxldGVgJiZlIT09YGZuYH0pLGUuc2V0KGBhbmltYXRpb25zYCx7Y29sb3JzOnt0eXBlOmBjb2xvcmAscHJvcGVydGllczpsc30sbnVtYmVyczp7dHlwZTpgbnVtYmVyYCxwcm9wZXJ0aWVzOmNzfX0pLGUuZGVzY3JpYmUoYGFuaW1hdGlvbnNgLHtfZmFsbGJhY2s6YGFuaW1hdGlvbmB9KSxlLnNldChgdHJhbnNpdGlvbnNgLHthY3RpdmU6e2FuaW1hdGlvbjp7ZHVyYXRpb246NDAwfX0scmVzaXplOnthbmltYXRpb246e2R1cmF0aW9uOjB9fSxzaG93OnthbmltYXRpb25zOntjb2xvcnM6e2Zyb206YHRyYW5zcGFyZW50YH0sdmlzaWJsZTp7dHlwZTpgYm9vbGVhbmAsZHVyYXRpb246MH19fSxoaWRlOnthbmltYXRpb25zOntjb2xvcnM6e3RvOmB0cmFuc3BhcmVudGB9LHZpc2libGU6e3R5cGU6YGJvb2xlYW5gLGVhc2luZzpgbGluZWFyYCxmbjplPT5lfDB9fX19KX1mdW5jdGlvbiBkcyhlKXtlLnNldChgbGF5b3V0YCx7YXV0b1BhZGRpbmc6ITAscGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fSl9dmFyIGZzPW5ldyBNYXA7ZnVuY3Rpb24gcHMoZSx0KXt0fHw9e307bGV0IG49ZStKU09OLnN0cmluZ2lmeSh0KSxyPWZzLmdldChuKTtyZXR1cm4gcnx8KHI9bmV3IEludGwuTnVtYmVyRm9ybWF0KGUsdCksZnMuc2V0KG4scikpLHJ9ZnVuY3Rpb24gbXMoZSx0LG4pe3JldHVybiBwcyh0LG4pLmZvcm1hdChlKX12YXIgaHM9e3ZhbHVlcyhlKXtyZXR1cm4gVyhlKT9lOmBgK2V9LG51bWVyaWMoZSx0LG4pe2lmKGU9PT0wKXJldHVybmAwYDtsZXQgcj10aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLGksYT1lO2lmKG4ubGVuZ3RoPjEpe2xldCB0PU1hdGgubWF4KE1hdGguYWJzKG5bMF0udmFsdWUpLE1hdGguYWJzKG5bbi5sZW5ndGgtMV0udmFsdWUpKTsodDwxZS00fHx0PjB4MzhkN2VhNGM2ODAwMCkmJihpPWBzY2llbnRpZmljYCksYT1ncyhlLG4pfWxldCBvPVNvKE1hdGguYWJzKGEpKSxzPWlzTmFOKG8pPzE6TWF0aC5tYXgoTWF0aC5taW4oLTEqTWF0aC5mbG9vcihvKSwyMCksMCksYz17bm90YXRpb246aSxtaW5pbXVtRnJhY3Rpb25EaWdpdHM6cyxtYXhpbXVtRnJhY3Rpb25EaWdpdHM6c307cmV0dXJuIE9iamVjdC5hc3NpZ24oYyx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KSxtcyhlLHIsYyl9LGxvZ2FyaXRobWljKGUsdCxuKXtpZihlPT09MClyZXR1cm5gMGA7bGV0IHI9blt0XS5zaWduaWZpY2FuZHx8ZS8xMCoqTWF0aC5mbG9vcihTbyhlKSk7cmV0dXJuWzEsMiwzLDUsMTAsMTVdLmluY2x1ZGVzKHIpfHx0Pi44Km4ubGVuZ3RoP2hzLm51bWVyaWMuY2FsbCh0aGlzLGUsdCxuKTpgYH19O2Z1bmN0aW9uIGdzKGUsdCl7bGV0IG49dC5sZW5ndGg+Mz90WzJdLnZhbHVlLXRbMV0udmFsdWU6dFsxXS52YWx1ZS10WzBdLnZhbHVlO3JldHVybiBNYXRoLmFicyhuKT49MSYmZSE9PU1hdGguZmxvb3IoZSkmJihuPWUtTWF0aC5mbG9vcihlKSksbn12YXIgX3M9e2Zvcm1hdHRlcnM6aHN9O2Z1bmN0aW9uIHZzKGUpe2Uuc2V0KGBzY2FsZWAse2Rpc3BsYXk6ITAsb2Zmc2V0OiExLHJldmVyc2U6ITEsYmVnaW5BdFplcm86ITEsYm91bmRzOmB0aWNrc2AsY2xpcDohMCxncmFjZTowLGdyaWQ6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsZHJhd09uQ2hhcnRBcmVhOiEwLGRyYXdUaWNrczohMCx0aWNrTGVuZ3RoOjgsdGlja1dpZHRoOihlLHQpPT50LmxpbmVXaWR0aCx0aWNrQ29sb3I6KGUsdCk9PnQuY29sb3Isb2Zmc2V0OiExfSxib3JkZXI6e2Rpc3BsYXk6ITAsZGFzaDpbXSxkYXNoT2Zmc2V0OjAsd2lkdGg6MX0sdGl0bGU6e2Rpc3BsYXk6ITEsdGV4dDpgYCxwYWRkaW5nOnt0b3A6NCxib3R0b206NH19LHRpY2tzOnttaW5Sb3RhdGlvbjowLG1heFJvdGF0aW9uOjUwLG1pcnJvcjohMSx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0U3Ryb2tlQ29sb3I6YGAscGFkZGluZzozLGRpc3BsYXk6ITAsYXV0b1NraXA6ITAsYXV0b1NraXBQYWRkaW5nOjMsbGFiZWxPZmZzZXQ6MCxjYWxsYmFjazpfcy5mb3JtYXR0ZXJzLnZhbHVlcyxtaW5vcjp7fSxtYWpvcjp7fSxhbGlnbjpgY2VudGVyYCxjcm9zc0FsaWduOmBuZWFyYCxzaG93TGFiZWxCYWNrZHJvcDohMSxiYWNrZHJvcENvbG9yOmByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpYCxiYWNrZHJvcFBhZGRpbmc6Mn19KSxlLnJvdXRlKGBzY2FsZS50aWNrc2AsYGNvbG9yYCxgYCxgY29sb3JgKSxlLnJvdXRlKGBzY2FsZS5ncmlkYCxgY29sb3JgLGBgLGBib3JkZXJDb2xvcmApLGUucm91dGUoYHNjYWxlLmJvcmRlcmAsYGNvbG9yYCxgYCxgYm9yZGVyQ29sb3JgKSxlLnJvdXRlKGBzY2FsZS50aXRsZWAsYGNvbG9yYCxgYCxgY29sb3JgKSxlLmRlc2NyaWJlKGBzY2FsZWAse19mYWxsYmFjazohMSxfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBiZWZvcmVgKSYmIWUuc3RhcnRzV2l0aChgYWZ0ZXJgKSYmZSE9PWBjYWxsYmFja2AmJmUhPT1gcGFyc2VyYCxfaW5kZXhhYmxlOmU9PmUhPT1gYm9yZGVyRGFzaGAmJmUhPT1gdGlja0JvcmRlckRhc2hgJiZlIT09YGRhc2hgfSksZS5kZXNjcmliZShgc2NhbGVzYCx7X2ZhbGxiYWNrOmBzY2FsZWB9KSxlLmRlc2NyaWJlKGBzY2FsZS50aWNrc2Ase19zY3JpcHRhYmxlOmU9PmUhPT1gYmFja2Ryb3BQYWRkaW5nYCYmZSE9PWBjYWxsYmFja2AsX2luZGV4YWJsZTplPT5lIT09YGJhY2tkcm9wUGFkZGluZ2B9KX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKSxicz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHhzKGUsdCl7aWYoIXQpcmV0dXJuIGU7bGV0IG49dC5zcGxpdChgLmApO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dDxyOysrdCl7bGV0IHI9blt0XTtlPWVbcl18fChlW3JdPU9iamVjdC5jcmVhdGUobnVsbCkpfXJldHVybiBlfWZ1bmN0aW9uIFNzKGUsdCxuKXtyZXR1cm4gdHlwZW9mIHQ9PWBzdHJpbmdgP3JvKHhzKGUsdCksbik6cm8oeHMoZSxgYCksdCl9dmFyIFo9bmV3IGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5hbmltYXRpb249dm9pZCAwLHRoaXMuYmFja2dyb3VuZENvbG9yPWByZ2JhKDAsMCwwLDAuMSlgLHRoaXMuYm9yZGVyQ29sb3I9YHJnYmEoMCwwLDAsMC4xKWAsdGhpcy5jb2xvcj1gIzY2NmAsdGhpcy5kYXRhc2V0cz17fSx0aGlzLmRldmljZVBpeGVsUmF0aW89ZT0+ZS5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCksdGhpcy5lbGVtZW50cz17fSx0aGlzLmV2ZW50cz1bYG1vdXNlbW92ZWAsYG1vdXNlb3V0YCxgY2xpY2tgLGB0b3VjaHN0YXJ0YCxgdG91Y2htb3ZlYF0sdGhpcy5mb250PXtmYW1pbHk6YCdIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmYCxzaXplOjEyLHN0eWxlOmBub3JtYWxgLGxpbmVIZWlnaHQ6MS4yLHdlaWdodDpudWxsfSx0aGlzLmhvdmVyPXt9LHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3I9KGUsdCk9PnNzKHQuYmFja2dyb3VuZENvbG9yKSx0aGlzLmhvdmVyQm9yZGVyQ29sb3I9KGUsdCk9PnNzKHQuYm9yZGVyQ29sb3IpLHRoaXMuaG92ZXJDb2xvcj0oZSx0KT0+c3ModC5jb2xvciksdGhpcy5pbmRleEF4aXM9YHhgLHRoaXMuaW50ZXJhY3Rpb249e21vZGU6YG5lYXJlc3RgLGludGVyc2VjdDohMCxpbmNsdWRlSW52aXNpYmxlOiExfSx0aGlzLm1haW50YWluQXNwZWN0UmF0aW89ITAsdGhpcy5vbkhvdmVyPW51bGwsdGhpcy5vbkNsaWNrPW51bGwsdGhpcy5wYXJzaW5nPSEwLHRoaXMucGx1Z2lucz17fSx0aGlzLnJlc3BvbnNpdmU9ITAsdGhpcy5zY2FsZT12b2lkIDAsdGhpcy5zY2FsZXM9e30sdGhpcy5zaG93TGluZT0hMCx0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wPSEwLHRoaXMuZGVzY3JpYmUoZSksdGhpcy5hcHBseSh0KX1zZXQoZSx0KXtyZXR1cm4gU3ModGhpcyxlLHQpfWdldChlKXtyZXR1cm4geHModGhpcyxlKX1kZXNjcmliZShlLHQpe3JldHVybiBTcyhicyxlLHQpfW92ZXJyaWRlKGUsdCl7cmV0dXJuIFNzKHlzLGUsdCl9cm91dGUoZSx0LG4scil7bGV0IGk9eHModGhpcyxlKSxhPXhzKHRoaXMsbiksbz1gX2ArdDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLHtbb106e3ZhbHVlOmlbdF0sd3JpdGFibGU6ITB9LFt0XTp7ZW51bWVyYWJsZTohMCxnZXQoKXtsZXQgZT10aGlzW29dLHQ9YVtyXTtyZXR1cm4gRyhlKT9PYmplY3QuYXNzaWduKHt9LHQsZSk6cShlLHQpfSxzZXQoZSl7dGhpc1tvXT1lfX19KX1hcHBseShlKXtlLmZvckVhY2goZT0+ZSh0aGlzKSl9fSh7X3NjcmlwdGFibGU6ZT0+IWUuc3RhcnRzV2l0aChgb25gKSxfaW5kZXhhYmxlOmU9PmUhPT1gZXZlbnRzYCxob3Zlcjp7X2ZhbGxiYWNrOmBpbnRlcmFjdGlvbmB9LGludGVyYWN0aW9uOntfc2NyaXB0YWJsZTohMSxfaW5kZXhhYmxlOiExfX0sW3VzLGRzLHZzXSk7ZnVuY3Rpb24gQ3MoZSl7cmV0dXJuIWV8fFUoZS5zaXplKXx8VShlLmZhbWlseSk/bnVsbDooZS5zdHlsZT9lLnN0eWxlK2AgYDpgYCkrKGUud2VpZ2h0P2Uud2VpZ2h0K2AgYDpgYCkrZS5zaXplK2BweCBgK2UuZmFtaWx5fWZ1bmN0aW9uIHdzKGUsdCxuLHIsaSl7bGV0IGE9dFtpXTtyZXR1cm4gYXx8KGE9dFtpXT1lLm1lYXN1cmVUZXh0KGkpLndpZHRoLG4ucHVzaChpKSksYT5yJiYocj1hKSxyfWZ1bmN0aW9uIFRzKGUsdCxuLHIpe3J8fD17fTtsZXQgaT1yLmRhdGE9ci5kYXRhfHx7fSxhPXIuZ2FyYmFnZUNvbGxlY3Q9ci5nYXJiYWdlQ29sbGVjdHx8W107ci5mb250IT09dCYmKGk9ci5kYXRhPXt9LGE9ci5nYXJiYWdlQ29sbGVjdD1bXSxyLmZvbnQ9dCksZS5zYXZlKCksZS5mb250PXQ7bGV0IG89MCxzPW4ubGVuZ3RoLGMsbCx1LGQsZjtmb3IoYz0wO2M8cztjKyspaWYoZD1uW2NdLGQhPW51bGwmJiFXKGQpKW89d3MoZSxpLGEsbyxkKTtlbHNlIGlmKFcoZCkpZm9yKGw9MCx1PWQubGVuZ3RoO2w8dTtsKyspZj1kW2xdLGYhPW51bGwmJiFXKGYpJiYobz13cyhlLGksYSxvLGYpKTtlLnJlc3RvcmUoKTtsZXQgcD1hLmxlbmd0aC8yO2lmKHA+bi5sZW5ndGgpe2ZvcihjPTA7YzxwO2MrKylkZWxldGUgaVthW2NdXTthLnNwbGljZSgwLHApfXJldHVybiBvfWZ1bmN0aW9uIEVzKGUsdCxuKXtsZXQgcj1lLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvLGk9bj09PTA/MDpNYXRoLm1heChuLzIsLjUpO3JldHVybiBNYXRoLnJvdW5kKCh0LWkpKnIpL3IraX1mdW5jdGlvbiBEcyhlLHQpeyF0JiYhZXx8KHR8fD1lLmdldENvbnRleHQoYDJkYCksdC5zYXZlKCksdC5yZXNldFRyYW5zZm9ybSgpLHQuY2xlYXJSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0LnJlc3RvcmUoKSl9ZnVuY3Rpb24gT3MoZSx0LG4scil7a3MoZSx0LG4scixudWxsKX1mdW5jdGlvbiBrcyhlLHQsbixyLGkpe2xldCBhLG8scyxjLGwsdSxkLGYscD10LnBvaW50U3R5bGUsbT10LnJvdGF0aW9uLGg9dC5yYWRpdXMsZz0obXx8MCkqdm87aWYocCYmdHlwZW9mIHA9PWBvYmplY3RgJiYoYT1wLnRvU3RyaW5nKCksYT09PWBbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdYHx8YT09PWBbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XWApKXtlLnNhdmUoKSxlLnRyYW5zbGF0ZShuLHIpLGUucm90YXRlKGcpLGUuZHJhd0ltYWdlKHAsLXAud2lkdGgvMiwtcC5oZWlnaHQvMixwLndpZHRoLHAuaGVpZ2h0KSxlLnJlc3RvcmUoKTtyZXR1cm59aWYoIShpc05hTihoKXx8aDw9MCkpe3N3aXRjaChlLmJlZ2luUGF0aCgpLHApe2RlZmF1bHQ6aT9lLmVsbGlwc2UobixyLGkvMixoLDAsMCxnbyk6ZS5hcmMobixyLGgsMCxnbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHRyaWFuZ2xlYDp1PWk/aS8yOmgsZS5tb3ZlVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RSb3VuZGVkYDpsPWgqLjUxNixjPWgtbCxvPU1hdGguY29zKGcrYm8pKmMsZD1NYXRoLmNvcyhnK2JvKSooaT9pLzItbDpjKSxzPU1hdGguc2luKGcrYm8pKmMsZj1NYXRoLnNpbihnK2JvKSooaT9pLzItbDpjKSxlLmFyYyhuLWQsci1zLGwsZy1YLGcteW8pLGUuYXJjKG4rZixyLW8sbCxnLXlvLGcpLGUuYXJjKG4rZCxyK3MsbCxnLGcreW8pLGUuYXJjKG4tZixyK28sbCxnK3lvLGcrWCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RgOmlmKCFtKXtjPU1hdGguU1FSVDFfMipoLHU9aT9pLzI6YyxlLnJlY3Qobi11LHItYywyKnUsMipjKTticmVha31nKz1ibztjYXNlYHJlY3RSb3RgOmQ9TWF0aC5jb3MoZykqKGk/aS8yOmgpLG89TWF0aC5jb3MoZykqaCxzPU1hdGguc2luKGcpKmgsZj1NYXRoLnNpbihnKSooaT9pLzI6aCksZS5tb3ZlVG8obi1kLHItcyksZS5saW5lVG8obitmLHItbyksZS5saW5lVG8obitkLHIrcyksZS5saW5lVG8obi1mLHIrbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYGNyb3NzUm90YDpnKz1ibztjYXNlYGNyb3NzYDpkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2Vgc3RhcmA6ZD1NYXRoLmNvcyhnKSooaT9pLzI6aCksbz1NYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxmPU1hdGguc2luKGcpKihpP2kvMjpoKSxlLm1vdmVUbyhuLWQsci1zKSxlLmxpbmVUbyhuK2QscitzKSxlLm1vdmVUbyhuK2Ysci1vKSxlLmxpbmVUbyhuLWYscitvKSxnKz1ibyxkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2VgbGluZWA6bz1pP2kvMjpNYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxlLm1vdmVUbyhuLW8sci1zKSxlLmxpbmVUbyhuK28scitzKTticmVhaztjYXNlYGRhc2hgOmUubW92ZVRvKG4sciksZS5saW5lVG8obitNYXRoLmNvcyhnKSooaT9pLzI6aCkscitNYXRoLnNpbihnKSpoKTticmVhaztjYXNlITE6ZS5jbG9zZVBhdGgoKX1lLmZpbGwoKSx0LmJvcmRlcldpZHRoPjAmJmUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEFzKGUsdCxuKXtyZXR1cm4gbnx8PS41LCF0fHxlJiZlLng+dC5sZWZ0LW4mJmUueDx0LnJpZ2h0K24mJmUueT50LnRvcC1uJiZlLnk8dC5ib3R0b20rbn1mdW5jdGlvbiBqcyhlLHQpe2Uuc2F2ZSgpLGUuYmVnaW5QYXRoKCksZS5yZWN0KHQubGVmdCx0LnRvcCx0LnJpZ2h0LXQubGVmdCx0LmJvdHRvbS10LnRvcCksZS5jbGlwKCl9ZnVuY3Rpb24gTXMoZSl7ZS5yZXN0b3JlKCl9ZnVuY3Rpb24gTnMoZSx0KXt0LnRyYW5zbGF0aW9uJiZlLnRyYW5zbGF0ZSh0LnRyYW5zbGF0aW9uWzBdLHQudHJhbnNsYXRpb25bMV0pLFUodC5yb3RhdGlvbil8fGUucm90YXRlKHQucm90YXRpb24pLHQuY29sb3ImJihlLmZpbGxTdHlsZT10LmNvbG9yKSx0LnRleHRBbGlnbiYmKGUudGV4dEFsaWduPXQudGV4dEFsaWduKSx0LnRleHRCYXNlbGluZSYmKGUudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lKX1mdW5jdGlvbiBQcyhlLHQsbixyLGkpe2lmKGkuc3RyaWtldGhyb3VnaHx8aS51bmRlcmxpbmUpe2xldCBhPWUubWVhc3VyZVRleHQociksbz10LWEuYWN0dWFsQm91bmRpbmdCb3hMZWZ0LHM9dCthLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQsYz1uLWEuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsbD1uK2EuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50LHU9aS5zdHJpa2V0aHJvdWdoPyhjK2wpLzI6bDtlLnN0cm9rZVN0eWxlPWUuZmlsbFN0eWxlLGUuYmVnaW5QYXRoKCksZS5saW5lV2lkdGg9aS5kZWNvcmF0aW9uV2lkdGh8fDIsZS5tb3ZlVG8obyx1KSxlLmxpbmVUbyhzLHUpLGUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEZzKGUsdCl7bGV0IG49ZS5maWxsU3R5bGU7ZS5maWxsU3R5bGU9dC5jb2xvcixlLmZpbGxSZWN0KHQubGVmdCx0LnRvcCx0LndpZHRoLHQuaGVpZ2h0KSxlLmZpbGxTdHlsZT1ufWZ1bmN0aW9uIElzKGUsdCxuLHIsaSxhPXt9KXtsZXQgbz1XKHQpP3Q6W3RdLHM9YS5zdHJva2VXaWR0aD4wJiZhLnN0cm9rZUNvbG9yIT09YGAsYyxsO2ZvcihlLnNhdmUoKSxlLmZvbnQ9aS5zdHJpbmcsTnMoZSxhKSxjPTA7YzxvLmxlbmd0aDsrK2MpbD1vW2NdLGEuYmFja2Ryb3AmJkZzKGUsYS5iYWNrZHJvcCkscyYmKGEuc3Ryb2tlQ29sb3ImJihlLnN0cm9rZVN0eWxlPWEuc3Ryb2tlQ29sb3IpLFUoYS5zdHJva2VXaWR0aCl8fChlLmxpbmVXaWR0aD1hLnN0cm9rZVdpZHRoKSxlLnN0cm9rZVRleHQobCxuLHIsYS5tYXhXaWR0aCkpLGUuZmlsbFRleHQobCxuLHIsYS5tYXhXaWR0aCksUHMoZSxuLHIsbCxhKSxyKz1OdW1iZXIoaS5saW5lSGVpZ2h0KTtlLnJlc3RvcmUoKX1mdW5jdGlvbiBMcyhlLHQpe2xldHt4Om4seTpyLHc6aSxoOmEscmFkaXVzOm99PXQ7ZS5hcmMobitvLnRvcExlZnQscitvLnRvcExlZnQsby50b3BMZWZ0LDEuNSpYLFgsITApLGUubGluZVRvKG4scithLW8uYm90dG9tTGVmdCksZS5hcmMobitvLmJvdHRvbUxlZnQscithLW8uYm90dG9tTGVmdCxvLmJvdHRvbUxlZnQsWCx5bywhMCksZS5saW5lVG8obitpLW8uYm90dG9tUmlnaHQscithKSxlLmFyYyhuK2ktby5ib3R0b21SaWdodCxyK2Etby5ib3R0b21SaWdodCxvLmJvdHRvbVJpZ2h0LHlvLDAsITApLGUubGluZVRvKG4raSxyK28udG9wUmlnaHQpLGUuYXJjKG4raS1vLnRvcFJpZ2h0LHIrby50b3BSaWdodCxvLnRvcFJpZ2h0LDAsLXlvLCEwKSxlLmxpbmVUbyhuK28udG9wTGVmdCxyKX12YXIgUnM9L14obm9ybWFsfChcZCsoPzpcLlxkKyk/KShweHxlbXwlKT8pJC8senM9L14obm9ybWFsfGl0YWxpY3xpbml0aWFsfGluaGVyaXR8dW5zZXR8KG9ibGlxdWUoIC0/WzAtOV0/WzAtOV1kZWcpPykpJC87ZnVuY3Rpb24gQnMoZSx0KXtsZXQgbj0oYGArZSkubWF0Y2goUnMpO2lmKCFufHxuWzFdPT09YG5vcm1hbGApcmV0dXJuIHQqMS4yO3N3aXRjaChlPStuWzJdLG5bM10pe2Nhc2VgcHhgOnJldHVybiBlO2Nhc2VgJWA6ZS89MTAwfXJldHVybiB0KmV9dmFyIFZzPWU9PitlfHwwO2Z1bmN0aW9uIEhzKGUsdCl7bGV0IG49e30scj1HKHQpLGk9cj9PYmplY3Qua2V5cyh0KTp0LGE9RyhlKT9yP249PnEoZVtuXSxlW3Rbbl1dKTp0PT5lW3RdOigpPT5lO2ZvcihsZXQgZSBvZiBpKW5bZV09VnMoYShlKSk7cmV0dXJuIG59ZnVuY3Rpb24gVXMoZSl7cmV0dXJuIEhzKGUse3RvcDpgeWAscmlnaHQ6YHhgLGJvdHRvbTpgeWAsbGVmdDpgeGB9KX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gSHMoZSxbYHRvcExlZnRgLGB0b3BSaWdodGAsYGJvdHRvbUxlZnRgLGBib3R0b21SaWdodGBdKX1mdW5jdGlvbiBRKGUpe2xldCB0PVVzKGUpO3JldHVybiB0LndpZHRoPXQubGVmdCt0LnJpZ2h0LHQuaGVpZ2h0PXQudG9wK3QuYm90dG9tLHR9ZnVuY3Rpb24gJChlLHQpe2V8fD17fSx0fHw9Wi5mb250O2xldCBuPXEoZS5zaXplLHQuc2l6ZSk7dHlwZW9mIG49PWBzdHJpbmdgJiYobj1wYXJzZUludChuLDEwKSk7bGV0IHI9cShlLnN0eWxlLHQuc3R5bGUpO3ImJiEoYGArcikubWF0Y2goenMpJiYoY29uc29sZS53YXJuKGBJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiAiYCtyK2AiYCkscj12b2lkIDApO2xldCBpPXtmYW1pbHk6cShlLmZhbWlseSx0LmZhbWlseSksbGluZUhlaWdodDpCcyhxKGUubGluZUhlaWdodCx0LmxpbmVIZWlnaHQpLG4pLHNpemU6bixzdHlsZTpyLHdlaWdodDpxKGUud2VpZ2h0LHQud2VpZ2h0KSxzdHJpbmc6YGB9O3JldHVybiBpLnN0cmluZz1DcyhpKSxpfWZ1bmN0aW9uIEdzKGUsdCxuLHIpe2xldCBpPSEwLGEsbyxzO2ZvcihhPTAsbz1lLmxlbmd0aDthPG87KythKWlmKHM9ZVthXSxzIT09dm9pZCAwJiYodCE9PXZvaWQgMCYmdHlwZW9mIHM9PWBmdW5jdGlvbmAmJihzPXModCksaT0hMSksbiE9PXZvaWQgMCYmVyhzKSYmKHM9c1tuJXMubGVuZ3RoXSxpPSExKSxzIT09dm9pZCAwKSlyZXR1cm4gciYmIWkmJihyLmNhY2hlYWJsZT0hMSksc31mdW5jdGlvbiBLcyhlLHQsbil7bGV0e21pbjpyLG1heDppfT1lLGE9UWEodCwoaS1yKS8yKSxvPShlLHQpPT5uJiZlPT09MD8wOmUrdDtyZXR1cm57bWluOm8ociwtTWF0aC5hYnMoYSkpLG1heDpvKGksYSl9fWZ1bmN0aW9uIHFzKGUsdCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShlKSx0KX1mdW5jdGlvbiBKcyhlLHQ9W2BgXSxuLHIsaT0oKT0+ZVswXSl7bGV0IGE9bnx8ZTtyZXR1cm4gcj09PXZvaWQgMCYmKHI9dWMoYF9mYWxsYmFja2AsZSkpLG5ldyBQcm94eSh7W1N5bWJvbC50b1N0cmluZ1RhZ106YE9iamVjdGAsX2NhY2hlYWJsZTohMCxfc2NvcGVzOmUsX3Jvb3RTY29wZXM6YSxfZmFsbGJhY2s6cixfZ2V0VGFyZ2V0Omksb3ZlcnJpZGU6bj0+SnMoW24sLi4uZV0sdCxhLHIpfSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIHQuX2tleXMsZGVsZXRlIGVbMF1bbl0sITB9LGdldChuLHIpe3JldHVybiAkcyhuLHIsKCk9PmxjKHIsdCxlLG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuX3Njb3Blc1swXSx0KX0sZ2V0UHJvdG90eXBlT2YoKXtyZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihlWzBdKX0saGFzKGUsdCl7cmV0dXJuIGRjKGUpLmluY2x1ZGVzKHQpfSxvd25LZXlzKGUpe3JldHVybiBkYyhlKX0sc2V0KGUsdCxuKXtsZXQgcj1lLl9zdG9yYWdlfHw9aSgpO3JldHVybiBlW3RdPXJbdF09bixkZWxldGUgZS5fa2V5cywhMH19KX1mdW5jdGlvbiBZcyhlLHQsbixyKXtsZXQgaT17X2NhY2hlYWJsZTohMSxfcHJveHk6ZSxfY29udGV4dDp0LF9zdWJQcm94eTpuLF9zdGFjazpuZXcgU2V0LF9kZXNjcmlwdG9yczpYcyhlLHIpLHNldENvbnRleHQ6dD0+WXMoZSx0LG4sciksb3ZlcnJpZGU6aT0+WXMoZS5vdmVycmlkZShpKSx0LG4scil9O3JldHVybiBuZXcgUHJveHkoaSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIGVbbl0sITB9LGdldChlLHQsbil7cmV0dXJuICRzKGUsdCwoKT0+ZWMoZSx0LG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7cmV0dXJuIHQuX2Rlc2NyaXB0b3JzLmFsbEtleXM/UmVmbGVjdC5oYXMoZSxuKT97ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9OnZvaWQgMDpSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pfSxnZXRQcm90b3R5cGVPZigpe3JldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGUpfSxoYXModCxuKXtyZXR1cm4gUmVmbGVjdC5oYXMoZSxuKX0sb3duS2V5cygpe3JldHVybiBSZWZsZWN0Lm93bktleXMoZSl9LHNldCh0LG4scil7cmV0dXJuIGVbbl09cixkZWxldGUgdFtuXSwhMH19KX1mdW5jdGlvbiBYcyhlLHQ9e3NjcmlwdGFibGU6ITAsaW5kZXhhYmxlOiEwfSl7bGV0e19zY3JpcHRhYmxlOm49dC5zY3JpcHRhYmxlLF9pbmRleGFibGU6cj10LmluZGV4YWJsZSxfYWxsS2V5czppPXQuYWxsS2V5c309ZTtyZXR1cm57YWxsS2V5czppLHNjcmlwdGFibGU6bixpbmRleGFibGU6cixpc1NjcmlwdGFibGU6cG8obik/bjooKT0+bixpc0luZGV4YWJsZTpwbyhyKT9yOigpPT5yfX12YXIgWnM9KGUsdCk9PmU/ZSt1byh0KTp0LFFzPShlLHQpPT5HKHQpJiZlIT09YGFkYXB0ZXJzYCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGx8fHQuY29uc3RydWN0b3I9PT1PYmplY3QpO2Z1bmN0aW9uICRzKGUsdCxuKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KXx8dD09PWBjb25zdHJ1Y3RvcmApcmV0dXJuIGVbdF07bGV0IHI9bigpO3JldHVybiBlW3RdPXIscn1mdW5jdGlvbiBlYyhlLHQsbil7bGV0e19wcm94eTpyLF9jb250ZXh0OmksX3N1YlByb3h5OmEsX2Rlc2NyaXB0b3JzOm99PWUscz1yW3RdO3JldHVybiBwbyhzKSYmby5pc1NjcmlwdGFibGUodCkmJihzPXRjKHQscyxlLG4pKSxXKHMpJiZzLmxlbmd0aCYmKHM9bmModCxzLGUsby5pc0luZGV4YWJsZSkpLFFzKHQscykmJihzPVlzKHMsaSxhJiZhW3RdLG8pKSxzfWZ1bmN0aW9uIHRjKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9zdGFjazpzfT1uO2lmKHMuaGFzKGUpKXRocm93IEVycm9yKGBSZWN1cnNpb24gZGV0ZWN0ZWQ6IGArQXJyYXkuZnJvbShzKS5qb2luKGAtPmApK2AtPmArZSk7cy5hZGQoZSk7bGV0IGM9dChhLG98fHIpO3JldHVybiBzLmRlbGV0ZShlKSxRcyhlLGMpJiYoYz1vYyhpLl9zY29wZXMsaSxlLGMpKSxjfWZ1bmN0aW9uIG5jKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9kZXNjcmlwdG9yczpzfT1uO2lmKGEuaW5kZXghPT12b2lkIDAmJnIoZSkpcmV0dXJuIHRbYS5pbmRleCV0Lmxlbmd0aF07aWYoRyh0WzBdKSl7bGV0IG49dCxyPWkuX3Njb3Blcy5maWx0ZXIoZT0+ZSE9PW4pO3Q9W107Zm9yKGxldCBjIG9mIG4pe2xldCBuPW9jKHIsaSxlLGMpO3QucHVzaChZcyhuLGEsbyYmb1tlXSxzKSl9fXJldHVybiB0fWZ1bmN0aW9uIHJjKGUsdCxuKXtyZXR1cm4gcG8oZSk/ZSh0LG4pOmV9dmFyIGljPShlLHQpPT5lPT09ITA/dDp0eXBlb2YgZT09YHN0cmluZ2A/bG8odCxlKTp2b2lkIDA7ZnVuY3Rpb24gYWMoZSx0LG4scixpKXtmb3IobGV0IGEgb2YgdCl7bGV0IHQ9aWMobixhKTtpZih0KXtlLmFkZCh0KTtsZXQgYT1yYyh0Ll9mYWxsYmFjayxuLGkpO2lmKGEhPT12b2lkIDAmJmEhPT1uJiZhIT09cilyZXR1cm4gYX1lbHNlIGlmKHQ9PT0hMSYmciE9PXZvaWQgMCYmbiE9PXIpcmV0dXJuIG51bGx9cmV0dXJuITF9ZnVuY3Rpb24gb2MoZSx0LG4scil7bGV0IGk9dC5fcm9vdFNjb3BlcyxhPXJjKHQuX2ZhbGxiYWNrLG4sciksbz1bLi4uZSwuLi5pXSxzPW5ldyBTZXQ7cy5hZGQocik7bGV0IGM9c2MocyxvLG4sYXx8bixyKTtyZXR1cm4gYz09PW51bGx8fGEhPT12b2lkIDAmJmEhPT1uJiYoYz1zYyhzLG8sYSxjLHIpLGM9PT1udWxsKT8hMTpKcyhBcnJheS5mcm9tKHMpLFtgYF0saSxhLCgpPT5jYyh0LG4scikpfWZ1bmN0aW9uIHNjKGUsdCxuLHIsaSl7Zm9yKDtuOyluPWFjKGUsdCxuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gY2MoZSx0LG4pe2xldCByPWUuX2dldFRhcmdldCgpO3QgaW4gcnx8KHJbdF09e30pO2xldCBpPXJbdF07cmV0dXJuIFcoaSkmJkcobik/bjppfHx7fX1mdW5jdGlvbiBsYyhlLHQsbixyKXtsZXQgaTtmb3IobGV0IGEgb2YgdClpZihpPXVjKFpzKGEsZSksbiksaSE9PXZvaWQgMClyZXR1cm4gUXMoZSxpKT9vYyhuLHIsZSxpKTppfWZ1bmN0aW9uIHVjKGUsdCl7Zm9yKGxldCBuIG9mIHQpe2lmKCFuKWNvbnRpbnVlO2xldCB0PW5bZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdH19ZnVuY3Rpb24gZGMoZSl7bGV0IHQ9ZS5fa2V5cztyZXR1cm4gdHx8PWUuX2tleXM9ZmMoZS5fc2NvcGVzKSx0fWZ1bmN0aW9uIGZjKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIGUpZm9yKGxldCBlIG9mIE9iamVjdC5rZXlzKG4pLmZpbHRlcihlPT4hZS5zdGFydHNXaXRoKGBfYCkpKXQuYWRkKGUpO3JldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8YHVgJiZ0eXBlb2YgZG9jdW1lbnQ8YHVgfWZ1bmN0aW9uIG1jKGUpe2xldCB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC50b1N0cmluZygpPT09YFtvYmplY3QgU2hhZG93Um9vdF1gJiYodD10Lmhvc3QpLHR9ZnVuY3Rpb24gaGMoZSx0LG4pe2xldCByO3JldHVybiB0eXBlb2YgZT09YHN0cmluZ2A/KHI9cGFyc2VJbnQoZSwxMCksZS5pbmRleE9mKGAlYCkhPT0tMSYmKHI9ci8xMDAqdC5wYXJlbnROb2RlW25dKSk6cj1lLHJ9dmFyIGdjPWU9PmUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCk7ZnVuY3Rpb24gX2MoZSx0KXtyZXR1cm4gZ2MoZSkuZ2V0UHJvcGVydHlWYWx1ZSh0KX12YXIgdmM9W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXTtmdW5jdGlvbiB5YyhlLHQsbil7bGV0IHI9e307bj1uP2AtYCtuOmBgO2ZvcihsZXQgaT0wO2k8NDtpKyspe2xldCBhPXZjW2ldO3JbYV09cGFyc2VGbG9hdChlW3QrYC1gK2Erbl0pfHwwfXJldHVybiByLndpZHRoPXIubGVmdCtyLnJpZ2h0LHIuaGVpZ2h0PXIudG9wK3IuYm90dG9tLHJ9dmFyIGJjPShlLHQsbik9PihlPjB8fHQ+MCkmJighbnx8IW4uc2hhZG93Um9vdCk7ZnVuY3Rpb24geGMoZSx0KXtsZXQgbj1lLnRvdWNoZXMscj1uJiZuLmxlbmd0aD9uWzBdOmUse29mZnNldFg6aSxvZmZzZXRZOmF9PXIsbz0hMSxzLGM7aWYoYmMoaSxhLGUudGFyZ2V0KSlzPWksYz1hO2Vsc2V7bGV0IGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtzPXIuY2xpZW50WC1lLmxlZnQsYz1yLmNsaWVudFktZS50b3Asbz0hMH1yZXR1cm57eDpzLHk6Yyxib3g6b319ZnVuY3Rpb24gU2MoZSx0KXtpZihgbmF0aXZlYGluIGUpcmV0dXJuIGU7bGV0e2NhbnZhczpuLGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvOnJ9PXQsaT1nYyhuKSxhPWkuYm94U2l6aW5nPT09YGJvcmRlci1ib3hgLG89eWMoaSxgcGFkZGluZ2ApLHM9eWMoaSxgYm9yZGVyYCxgd2lkdGhgKSx7eDpjLHk6bCxib3g6dX09eGMoZSxuKSxkPW8ubGVmdCsodSYmcy5sZWZ0KSxmPW8udG9wKyh1JiZzLnRvcCkse3dpZHRoOnAsaGVpZ2h0Om19PXQ7cmV0dXJuIGEmJihwLT1vLndpZHRoK3Mud2lkdGgsbS09by5oZWlnaHQrcy5oZWlnaHQpLHt4Ok1hdGgucm91bmQoKGMtZCkvcCpuLndpZHRoL3IpLHk6TWF0aC5yb3VuZCgobC1mKS9tKm4uaGVpZ2h0L3IpfX1mdW5jdGlvbiBDYyhlLHQsbil7bGV0IHIsaTtpZih0PT09dm9pZCAwfHxuPT09dm9pZCAwKXtsZXQgYT1lJiZtYyhlKTtpZighYSl0PWUuY2xpZW50V2lkdGgsbj1lLmNsaWVudEhlaWdodDtlbHNle2xldCBlPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1nYyhhKSxzPXljKG8sYGJvcmRlcmAsYHdpZHRoYCksYz15YyhvLGBwYWRkaW5nYCk7dD1lLndpZHRoLWMud2lkdGgtcy53aWR0aCxuPWUuaGVpZ2h0LWMuaGVpZ2h0LXMuaGVpZ2h0LHI9aGMoby5tYXhXaWR0aCxhLGBjbGllbnRXaWR0aGApLGk9aGMoby5tYXhIZWlnaHQsYSxgY2xpZW50SGVpZ2h0YCl9fXJldHVybnt3aWR0aDp0LGhlaWdodDpuLG1heFdpZHRoOnJ8fF9vLG1heEhlaWdodDppfHxfb319dmFyIHdjPWU9Pk1hdGgucm91bmQoZSoxMCkvMTA7ZnVuY3Rpb24gVGMoZSx0LG4scil7bGV0IGk9Z2MoZSksYT15YyhpLGBtYXJnaW5gKSxvPWhjKGkubWF4V2lkdGgsZSxgY2xpZW50V2lkdGhgKXx8X28scz1oYyhpLm1heEhlaWdodCxlLGBjbGllbnRIZWlnaHRgKXx8X28sYz1DYyhlLHQsbikse3dpZHRoOmwsaGVpZ2h0OnV9PWM7aWYoaS5ib3hTaXppbmc9PT1gY29udGVudC1ib3hgKXtsZXQgZT15YyhpLGBib3JkZXJgLGB3aWR0aGApLHQ9eWMoaSxgcGFkZGluZ2ApO2wtPXQud2lkdGgrZS53aWR0aCx1LT10LmhlaWdodCtlLmhlaWdodH1yZXR1cm4gbD1NYXRoLm1heCgwLGwtYS53aWR0aCksdT1NYXRoLm1heCgwLHI/bC9yOnUtYS5oZWlnaHQpLGw9d2MoTWF0aC5taW4obCxvLGMubWF4V2lkdGgpKSx1PXdjKE1hdGgubWluKHUscyxjLm1heEhlaWdodCkpLGwmJiF1JiYodT13YyhsLzIpKSwodCE9PXZvaWQgMHx8biE9PXZvaWQgMCkmJnImJmMuaGVpZ2h0JiZ1PmMuaGVpZ2h0JiYodT1jLmhlaWdodCxsPXdjKE1hdGguZmxvb3IodSpyKSkpLHt3aWR0aDpsLGhlaWdodDp1fX1mdW5jdGlvbiBFYyhlLHQsbil7bGV0IHI9dHx8MSxpPXdjKGUuaGVpZ2h0KnIpLGE9d2MoZS53aWR0aCpyKTtlLmhlaWdodD13YyhlLmhlaWdodCksZS53aWR0aD13YyhlLndpZHRoKTtsZXQgbz1lLmNhbnZhcztyZXR1cm4gby5zdHlsZSYmKG58fCFvLnN0eWxlLmhlaWdodCYmIW8uc3R5bGUud2lkdGgpJiYoby5zdHlsZS5oZWlnaHQ9YCR7ZS5oZWlnaHR9cHhgLG8uc3R5bGUud2lkdGg9YCR7ZS53aWR0aH1weGApLGUuY3VycmVudERldmljZVBpeGVsUmF0aW8hPT1yfHxvLmhlaWdodCE9PWl8fG8ud2lkdGghPT1hPyhlLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvPXIsby5oZWlnaHQ9aSxvLndpZHRoPWEsZS5jdHguc2V0VHJhbnNmb3JtKHIsMCwwLHIsMCwwKSwhMCk6ITF9dmFyIERjPWZ1bmN0aW9uKCl7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX07cGMoKSYmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpKX1jYXRjaHt9cmV0dXJuIGV9KCk7ZnVuY3Rpb24gT2MoZSx0KXtsZXQgbj1fYyhlLHQpLHI9biYmbi5tYXRjaCgvXihcZCspKFwuXGQrKT9weCQvKTtyZXR1cm4gcj8rclsxXTp2b2lkIDB9dmFyIGtjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3gobil7cmV0dXJuIGUrZSt0LW59LHNldFdpZHRoKGUpe3Q9ZX0sdGV4dEFsaWduKGUpe3JldHVybiBlPT09YGNlbnRlcmA/ZTplPT09YHJpZ2h0YD9gbGVmdGA6YHJpZ2h0YH0seFBsdXMoZSx0KXtyZXR1cm4gZS10fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGUtdH19fSxBYz1mdW5jdGlvbigpe3JldHVybnt4KGUpe3JldHVybiBlfSxzZXRXaWR0aChlKXt9LHRleHRBbGlnbihlKXtyZXR1cm4gZX0seFBsdXMoZSx0KXtyZXR1cm4gZSt0fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGV9fX07ZnVuY3Rpb24gamMoZSx0LG4pe3JldHVybiBlP2tjKHQsbik6QWMoKX1mdW5jdGlvbiBNYyhlLHQpe2xldCBuLHI7KHQ9PT1gbHRyYHx8dD09PWBydGxgKSYmKG49ZS5jYW52YXMuc3R5bGUscj1bbi5nZXRQcm9wZXJ0eVZhbHVlKGBkaXJlY3Rpb25gKSxuLmdldFByb3BlcnR5UHJpb3JpdHkoYGRpcmVjdGlvbmApXSxuLnNldFByb3BlcnR5KGBkaXJlY3Rpb25gLHQsYGltcG9ydGFudGApLGUucHJldlRleHREaXJlY3Rpb249cil9ZnVuY3Rpb24gTmMoZSx0KXt0IT09dm9pZCAwJiYoZGVsZXRlIGUucHJldlRleHREaXJlY3Rpb24sZS5jYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoYGRpcmVjdGlvbmAsdFswXSx0WzFdKSl9ZnVuY3Rpb24gUGMoZSx0LG4pe3JldHVybiBlLm9wdGlvbnMuY2xpcD9lW25dOnRbbl19ZnVuY3Rpb24gRmMoZSx0KXtsZXR7eFNjYWxlOm4seVNjYWxlOnJ9PWU7cmV0dXJuIG4mJnI/e2xlZnQ6UGMobix0LGBsZWZ0YCkscmlnaHQ6UGMobix0LGByaWdodGApLHRvcDpQYyhyLHQsYHRvcGApLGJvdHRvbTpQYyhyLHQsYGJvdHRvbWApfTp0fWZ1bmN0aW9uIEljKGUsdCl7bGV0IG49dC5fY2xpcDtpZihuLmRpc2FibGVkKXJldHVybiExO2xldCByPUZjKHQsZS5jaGFydEFyZWEpO3JldHVybntsZWZ0Om4ubGVmdD09PSExPzA6ci5sZWZ0LShuLmxlZnQ9PT0hMD8wOm4ubGVmdCkscmlnaHQ6bi5yaWdodD09PSExP2Uud2lkdGg6ci5yaWdodCsobi5yaWdodD09PSEwPzA6bi5yaWdodCksdG9wOm4udG9wPT09ITE/MDpyLnRvcC0obi50b3A9PT0hMD8wOm4udG9wKSxib3R0b206bi5ib3R0b209PT0hMT9lLmhlaWdodDpyLmJvdHRvbSsobi5ib3R0b209PT0hMD8wOm4uYm90dG9tKX19dmFyIExjPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9jaGFydHM9bmV3IE1hcCx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX2xhc3REYXRlPXZvaWQgMH1fbm90aWZ5KGUsdCxuLHIpe2xldCBpPXQubGlzdGVuZXJzW3JdLGE9dC5kdXJhdGlvbjtpLmZvckVhY2gocj0+cih7Y2hhcnQ6ZSxpbml0aWFsOnQuaW5pdGlhbCxudW1TdGVwczphLGN1cnJlbnRTdGVwOk1hdGgubWluKG4tdC5zdGFydCxhKX0pKX1fcmVmcmVzaCgpe3RoaXMuX3JlcXVlc3R8fD0odGhpcy5fcnVubmluZz0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3RoaXMuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZWZyZXNoKCl9KSl9X3VwZGF0ZShlPURhdGUubm93KCkpe2xldCB0PTA7dGhpcy5fY2hhcnRzLmZvckVhY2goKG4scik9PntpZighbi5ydW5uaW5nfHwhbi5pdGVtcy5sZW5ndGgpcmV0dXJuO2xldCBpPW4uaXRlbXMsYT1pLmxlbmd0aC0xLG89ITEscztmb3IoO2E+PTA7LS1hKXM9aVthXSxzLl9hY3RpdmU/KHMuX3RvdGFsPm4uZHVyYXRpb24mJihuLmR1cmF0aW9uPXMuX3RvdGFsKSxzLnRpY2soZSksbz0hMCk6KGlbYV09aVtpLmxlbmd0aC0xXSxpLnBvcCgpKTtvJiYoci5kcmF3KCksdGhpcy5fbm90aWZ5KHIsbixlLGBwcm9ncmVzc2ApKSxpLmxlbmd0aHx8KG4ucnVubmluZz0hMSx0aGlzLl9ub3RpZnkocixuLGUsYGNvbXBsZXRlYCksbi5pbml0aWFsPSExKSx0Kz1pLmxlbmd0aH0pLHRoaXMuX2xhc3REYXRlPWUsdD09PTAmJih0aGlzLl9ydW5uaW5nPSExKX1fZ2V0QW5pbXMoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLG49dC5nZXQoZSk7cmV0dXJuIG58fChuPXtydW5uaW5nOiExLGluaXRpYWw6ITAsaXRlbXM6W10sbGlzdGVuZXJzOntjb21wbGV0ZTpbXSxwcm9ncmVzczpbXX19LHQuc2V0KGUsbikpLG59bGlzdGVuKGUsdCxuKXt0aGlzLl9nZXRBbmltcyhlKS5saXN0ZW5lcnNbdF0ucHVzaChuKX1hZGQoZSx0KXshdHx8IXQubGVuZ3RofHx0aGlzLl9nZXRBbmltcyhlKS5pdGVtcy5wdXNoKC4uLnQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fZ2V0QW5pbXMoZSkuaXRlbXMubGVuZ3RoPjB9c3RhcnQoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTt0JiYodC5ydW5uaW5nPSEwLHQuc3RhcnQ9RGF0ZS5ub3coKSx0LmR1cmF0aW9uPXQuaXRlbXMucmVkdWNlKChlLHQpPT5NYXRoLm1heChlLHQuX2R1cmF0aW9uKSwwKSx0aGlzLl9yZWZyZXNoKCkpfXJ1bm5pbmcoZSl7aWYoIXRoaXMuX3J1bm5pbmcpcmV0dXJuITE7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtyZXR1cm4hKCF0fHwhdC5ydW5uaW5nfHwhdC5pdGVtcy5sZW5ndGgpfXN0b3AoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtpZighdHx8IXQuaXRlbXMubGVuZ3RoKXJldHVybjtsZXQgbj10Lml0ZW1zLHI9bi5sZW5ndGgtMTtmb3IoO3I+PTA7LS1yKW5bcl0uY2FuY2VsKCk7dC5pdGVtcz1bXSx0aGlzLl9ub3RpZnkoZSx0LERhdGUubm93KCksYGNvbXBsZXRlYCl9cmVtb3ZlKGUpe3JldHVybiB0aGlzLl9jaGFydHMuZGVsZXRlKGUpfX0sUmM9YHRyYW5zcGFyZW50YCx6Yz17Ym9vbGVhbihlLHQsbil7cmV0dXJuIG4+LjU/dDplfSxjb2xvcihlLHQsbil7bGV0IHI9b3MoZXx8UmMpLGk9ci52YWxpZCYmb3ModHx8UmMpO3JldHVybiBpJiZpLnZhbGlkP2kubWl4KHIsbikuaGV4U3RyaW5nKCk6dH0sbnVtYmVyKGUsdCxuKXtyZXR1cm4gZSsodC1lKSpufX0sQmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7bGV0IGk9dFtuXTtyPUdzKFtlLnRvLHIsaSxlLmZyb21dKTtsZXQgYT1HcyhbZS5mcm9tLGkscl0pO3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9mbj1lLmZufHx6Y1tlLnR5cGV8fHR5cGVvZiBhXSx0aGlzLl9lYXNpbmc9aXNbZS5lYXNpbmddfHxpcy5saW5lYXIsdGhpcy5fc3RhcnQ9TWF0aC5mbG9vcihEYXRlLm5vdygpKyhlLmRlbGF5fHwwKSksdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWw9TWF0aC5mbG9vcihlLmR1cmF0aW9uKSx0aGlzLl9sb29wPSEhZS5sb29wLHRoaXMuX3RhcmdldD10LHRoaXMuX3Byb3A9bix0aGlzLl9mcm9tPWEsdGhpcy5fdG89cix0aGlzLl9wcm9taXNlcz12b2lkIDB9YWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX11cGRhdGUoZSx0LG4pe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fbm90aWZ5KCExKTtsZXQgcj10aGlzLl90YXJnZXRbdGhpcy5fcHJvcF0saT1uLXRoaXMuX3N0YXJ0LGE9dGhpcy5fZHVyYXRpb24taTt0aGlzLl9zdGFydD1uLHRoaXMuX2R1cmF0aW9uPU1hdGguZmxvb3IoTWF0aC5tYXgoYSxlLmR1cmF0aW9uKSksdGhpcy5fdG90YWwrPWksdGhpcy5fbG9vcD0hIWUubG9vcCx0aGlzLl90bz1HcyhbZS50byx0LHIsZS5mcm9tXSksdGhpcy5fZnJvbT1HcyhbZS5mcm9tLHIsdF0pfX1jYW5jZWwoKXt0aGlzLl9hY3RpdmUmJih0aGlzLnRpY2soRGF0ZS5ub3coKSksdGhpcy5fYWN0aXZlPSExLHRoaXMuX25vdGlmeSghMSkpfXRpY2soZSl7bGV0IHQ9ZS10aGlzLl9zdGFydCxuPXRoaXMuX2R1cmF0aW9uLHI9dGhpcy5fcHJvcCxpPXRoaXMuX2Zyb20sYT10aGlzLl9sb29wLG89dGhpcy5fdG8scztpZih0aGlzLl9hY3RpdmU9aSE9PW8mJihhfHx0PG4pLCF0aGlzLl9hY3RpdmUpe3RoaXMuX3RhcmdldFtyXT1vLHRoaXMuX25vdGlmeSghMCk7cmV0dXJufWlmKHQ8MCl7dGhpcy5fdGFyZ2V0W3JdPWk7cmV0dXJufXM9dC9uJTIscz1hJiZzPjE/Mi1zOnMscz10aGlzLl9lYXNpbmcoTWF0aC5taW4oMSxNYXRoLm1heCgwLHMpKSksdGhpcy5fdGFyZ2V0W3JdPXRoaXMuX2ZuKGksbyxzKX13YWl0KCl7bGV0IGU9dGhpcy5fcHJvbWlzZXN8fD1bXTtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntlLnB1c2goe3Jlczp0LHJlajpufSl9KX1fbm90aWZ5KGUpe2xldCB0PWU/YHJlc2A6YHJlamAsbj10aGlzLl9wcm9taXNlc3x8W107Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXVt0XSgpfX0sVmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9jaGFydD1lLHRoaXMuX3Byb3BlcnRpZXM9bmV3IE1hcCx0aGlzLmNvbmZpZ3VyZSh0KX1jb25maWd1cmUoZSl7aWYoIUcoZSkpcmV0dXJuO2xldCB0PU9iamVjdC5rZXlzKFouYW5pbWF0aW9uKSxuPXRoaXMuX3Byb3BlcnRpZXM7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuZm9yRWFjaChyPT57bGV0IGk9ZVtyXTtpZighRyhpKSlyZXR1cm47bGV0IGE9e307Zm9yKGxldCBlIG9mIHQpYVtlXT1pW2VdOyhXKGkucHJvcGVydGllcykmJmkucHJvcGVydGllc3x8W3JdKS5mb3JFYWNoKGU9PnsoZT09PXJ8fCFuLmhhcyhlKSkmJm4uc2V0KGUsYSl9KX0pfV9hbmltYXRlT3B0aW9ucyhlLHQpe2xldCBuPXQub3B0aW9ucyxyPVVjKGUsbik7aWYoIXIpcmV0dXJuW107bGV0IGk9dGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhyLG4pO3JldHVybiBuLiRzaGFyZWQmJkhjKGUub3B0aW9ucy4kYW5pbWF0aW9ucyxuKS50aGVuKCgpPT57ZS5vcHRpb25zPW59LCgpPT57fSksaX1fY3JlYXRlQW5pbWF0aW9ucyhlLHQpe2xldCBuPXRoaXMuX3Byb3BlcnRpZXMscj1bXSxpPWUuJGFuaW1hdGlvbnN8fD17fSxhPU9iamVjdC5rZXlzKHQpLG89RGF0ZS5ub3coKSxzO2ZvcihzPWEubGVuZ3RoLTE7cz49MDstLXMpe2xldCBjPWFbc107aWYoYy5jaGFyQXQoMCk9PT1gJGApY29udGludWU7aWYoYz09PWBvcHRpb25zYCl7ci5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKGUsdCkpO2NvbnRpbnVlfWxldCBsPXRbY10sdT1pW2NdLGQ9bi5nZXQoYyk7aWYodSl7aWYoZCYmdS5hY3RpdmUoKSl7dS51cGRhdGUoZCxsLG8pO2NvbnRpbnVlfXUuY2FuY2VsKCl9aWYoIWR8fCFkLmR1cmF0aW9uKXtlW2NdPWw7Y29udGludWV9aVtjXT11PW5ldyBCYyhkLGUsYyxsKSxyLnB1c2godSl9cmV0dXJuIHJ9dXBkYXRlKGUsdCl7aWYodGhpcy5fcHJvcGVydGllcy5zaXplPT09MCl7T2JqZWN0LmFzc2lnbihlLHQpO3JldHVybn1sZXQgbj10aGlzLl9jcmVhdGVBbmltYXRpb25zKGUsdCk7aWYobi5sZW5ndGgpcmV0dXJuIExjLmFkZCh0aGlzLl9jaGFydCxuKSwhMH19O2Z1bmN0aW9uIEhjKGUsdCl7bGV0IG49W10scj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7bGV0IGk9ZVtyW3RdXTtpJiZpLmFjdGl2ZSgpJiZuLnB1c2goaS53YWl0KCkpfXJldHVybiBQcm9taXNlLmFsbChuKX1mdW5jdGlvbiBVYyhlLHQpe2lmKCF0KXJldHVybjtsZXQgbj1lLm9wdGlvbnM7aWYoIW4pe2Uub3B0aW9ucz10O3JldHVybn1yZXR1cm4gbi4kc2hhcmVkJiYoZS5vcHRpb25zPW49T2JqZWN0LmFzc2lnbih7fSxuLHskc2hhcmVkOiExLCRhbmltYXRpb25zOnt9fSkpLG59ZnVuY3Rpb24gV2MoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnN8fHt9LHI9bi5yZXZlcnNlLGk9bi5taW49PT12b2lkIDA/dDowLGE9bi5tYXg9PT12b2lkIDA/dDowO3JldHVybntzdGFydDpyP2E6aSxlbmQ6cj9pOmF9fWZ1bmN0aW9uIEdjKGUsdCxuKXtpZihuPT09ITEpcmV0dXJuITE7bGV0IHI9V2MoZSxuKSxpPVdjKHQsbik7cmV0dXJue3RvcDppLmVuZCxyaWdodDpyLmVuZCxib3R0b206aS5zdGFydCxsZWZ0OnIuc3RhcnR9fWZ1bmN0aW9uIEtjKGUpe2xldCB0LG4scixpO3JldHVybiBHKGUpPyh0PWUudG9wLG49ZS5yaWdodCxyPWUuYm90dG9tLGk9ZS5sZWZ0KTp0PW49cj1pPWUse3RvcDp0LHJpZ2h0Om4sYm90dG9tOnIsbGVmdDppLGRpc2FibGVkOmU9PT0hMX19ZnVuY3Rpb24gcWMoZSx0KXtsZXQgbj1bXSxyPWUuX2dldFNvcnRlZERhdGFzZXRNZXRhcyh0KSxpLGE7Zm9yKGk9MCxhPXIubGVuZ3RoO2k8YTsrK2kpbi5wdXNoKHJbaV0uaW5kZXgpO3JldHVybiBufWZ1bmN0aW9uIEpjKGUsdCxuLHI9e30pe2xldCBpPWUua2V5cyxhPXIubW9kZT09PWBzaW5nbGVgLG8scyxjLGw7aWYodD09PW51bGwpcmV0dXJuO2xldCB1PSExO2ZvcihvPTAscz1pLmxlbmd0aDtvPHM7KytvKXtpZihjPStpW29dLGM9PT1uKXtpZih1PSEwLHIuYWxsKWNvbnRpbnVlO2JyZWFrfWw9ZS52YWx1ZXNbY10sSyhsKSYmKGF8fHQ9PT0wfHxDbyh0KT09PUNvKGwpKSYmKHQrPWwpfXJldHVybiF1JiYhci5hbGw/MDp0fWZ1bmN0aW9uIFljKGUsdCl7bGV0e2lTY2FsZTpuLHZTY2FsZTpyfT10LGk9bi5heGlzPT09YHhgP2B4YDpgeWAsYT1yLmF4aXM9PT1geGA/YHhgOmB5YCxvPU9iamVjdC5rZXlzKGUpLHM9QXJyYXkoby5sZW5ndGgpLGMsbCx1O2ZvcihjPTAsbD1vLmxlbmd0aDtjPGw7KytjKXU9b1tjXSxzW2NdPXtbaV06dSxbYV06ZVt1XX07cmV0dXJuIHN9ZnVuY3Rpb24gWGMoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnMuc3RhY2tlZDtyZXR1cm4gbnx8bj09PXZvaWQgMCYmdC5zdGFjayE9PXZvaWQgMH1mdW5jdGlvbiBaYyhlLHQsbil7cmV0dXJuYCR7ZS5pZH0uJHt0LmlkfS4ke24uc3RhY2t8fG4udHlwZX1gfWZ1bmN0aW9uIFFjKGUpe2xldHttaW46dCxtYXg6bixtaW5EZWZpbmVkOnIsbWF4RGVmaW5lZDppfT1lLmdldFVzZXJCb3VuZHMoKTtyZXR1cm57bWluOnI/dDotMS8wLG1heDppP246MS8wfX1mdW5jdGlvbiAkYyhlLHQsbil7bGV0IHI9ZVt0XXx8KGVbdF09e30pO3JldHVybiByW25dfHwocltuXT17fSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7Zm9yKGxldCBpIG9mIHQuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMocikucmV2ZXJzZSgpKXtsZXQgdD1lW2kuaW5kZXhdO2lmKG4mJnQ+MHx8IW4mJnQ8MClyZXR1cm4gaS5pbmRleH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0bChlLHQpe2xldHtjaGFydDpuLF9jYWNoZWRNZXRhOnJ9PWUsaT1uLl9zdGFja3N8fD17fSx7aVNjYWxlOmEsdlNjYWxlOm8saW5kZXg6c309cixjPWEuYXhpcyxsPW8uYXhpcyx1PVpjKGEsbyxyKSxkPXQubGVuZ3RoLGY7Zm9yKGxldCBlPTA7ZTxkOysrZSl7bGV0IG49dFtlXSx7W2NdOmEsW2xdOmR9PW4scD1uLl9zdGFja3N8fD17fTtmPXBbbF09JGMoaSx1LGEpLGZbc109ZCxmLl90b3A9ZWwoZixvLCEwLHIudHlwZSksZi5fYm90dG9tPWVsKGYsbywhMSxyLnR5cGUpO2xldCBtPWYuX3Zpc3VhbFZhbHVlc3x8KGYuX3Zpc3VhbFZhbHVlcz17fSk7bVtzXT1kfX1mdW5jdGlvbiBubChlLHQpe2xldCBuPWUuc2NhbGVzO3JldHVybiBPYmplY3Qua2V5cyhuKS5maWx0ZXIoZT0+bltlXS5heGlzPT09dCkuc2hpZnQoKX1mdW5jdGlvbiBybChlLHQpe3JldHVybiBxcyhlLHthY3RpdmU6ITEsZGF0YXNldDp2b2lkIDAsZGF0YXNldEluZGV4OnQsaW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhc2V0YH0pfWZ1bmN0aW9uIGlsKGUsdCxuKXtyZXR1cm4gcXMoZSx7YWN0aXZlOiExLGRhdGFJbmRleDp0LHBhcnNlZDp2b2lkIDAscmF3OnZvaWQgMCxlbGVtZW50Om4saW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhYH0pfWZ1bmN0aW9uIGFsKGUsdCl7bGV0IG49ZS5jb250cm9sbGVyLmluZGV4LHI9ZS52U2NhbGUmJmUudlNjYWxlLmF4aXM7aWYocil7dHx8PWUuX3BhcnNlZDtmb3IobGV0IGUgb2YgdCl7bGV0IHQ9ZS5fc3RhY2tzO2lmKCF0fHx0W3JdPT09dm9pZCAwfHx0W3JdW25dPT09dm9pZCAwKXJldHVybjtkZWxldGUgdFtyXVtuXSx0W3JdLl92aXN1YWxWYWx1ZXMhPT12b2lkIDAmJnRbcl0uX3Zpc3VhbFZhbHVlc1tuXSE9PXZvaWQgMCYmZGVsZXRlIHRbcl0uX3Zpc3VhbFZhbHVlc1tuXX19fXZhciBvbD1lPT5lPT09YHJlc2V0YHx8ZT09PWBub25lYCxzbD0oZSx0KT0+dD9lOk9iamVjdC5hc3NpZ24oe30sZSksY2w9KGUsdCxuKT0+ZSYmIXQuaGlkZGVuJiZ0Ll9zdGFja2VkJiZ7a2V5czpxYyhuLCEwKSx2YWx1ZXM6bnVsbH0sbGw9Y2xhc3N7c3RhdGljIGRlZmF1bHRzPXt9O3N0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGU9bnVsbDtzdGF0aWMgZGF0YUVsZW1lbnRUeXBlPW51bGw7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoYXJ0PWUsdGhpcy5fY3R4PWUuY3R4LHRoaXMuaW5kZXg9dCx0aGlzLl9jYWNoZWREYXRhT3B0cz17fSx0aGlzLl9jYWNoZWRNZXRhPXRoaXMuZ2V0TWV0YSgpLHRoaXMuX3R5cGU9dGhpcy5fY2FjaGVkTWV0YS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5fcGFyc2luZz0hMSx0aGlzLl9kYXRhPXZvaWQgMCx0aGlzLl9vYmplY3REYXRhPXZvaWQgMCx0aGlzLl9zaGFyZWRPcHRpb25zPXZvaWQgMCx0aGlzLl9kcmF3U3RhcnQ9dm9pZCAwLHRoaXMuX2RyYXdDb3VudD12b2lkIDAsdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSExLHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlLHRoaXMuZGF0YUVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlLHRoaXMuaW5pdGlhbGl6ZSgpfWluaXRpYWxpemUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuY29uZmlndXJlKCksdGhpcy5saW5rU2NhbGVzKCksZS5fc3RhY2tlZD1YYyhlLnZTY2FsZSxlKSx0aGlzLmFkZEVsZW1lbnRzKCksdGhpcy5vcHRpb25zLmZpbGwmJiF0aGlzLmNoYXJ0LmlzUGx1Z2luRW5hYmxlZChgZmlsbGVyYCkmJmNvbnNvbGUud2FybihgVHJpZWQgdG8gdXNlIHRoZSAnZmlsbCcgb3B0aW9uIHdpdGhvdXQgdGhlICdGaWxsZXInIHBsdWdpbiBlbmFibGVkLiBQbGVhc2UgaW1wb3J0IGFuZCByZWdpc3RlciB0aGUgJ0ZpbGxlcicgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGRpc2FibGVkIGluIHRoZSBvcHRpb25zYCl9dXBkYXRlSW5kZXgoZSl7dGhpcy5pbmRleCE9PWUmJmFsKHRoaXMuX2NhY2hlZE1ldGEpLHRoaXMuaW5kZXg9ZX1saW5rU2NhbGVzKCl7bGV0IGU9dGhpcy5jaGFydCx0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPShlLHQsbixyKT0+ZT09PWB4YD90OmU9PT1gcmA/cjpuLGk9dC54QXhpc0lEPXEobi54QXhpc0lELG5sKGUsYHhgKSksYT10LnlBeGlzSUQ9cShuLnlBeGlzSUQsbmwoZSxgeWApKSxvPXQuckF4aXNJRD1xKG4uckF4aXNJRCxubChlLGByYCkpLHM9dC5pbmRleEF4aXMsYz10LmlBeGlzSUQ9cihzLGksYSxvKSxsPXQudkF4aXNJRD1yKHMsYSxpLG8pO3QueFNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChpKSx0LnlTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQoYSksdC5yU2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKG8pLHQuaVNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChjKSx0LnZTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQobCl9Z2V0RGF0YXNldCgpe3JldHVybiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbdGhpcy5pbmRleF19Z2V0TWV0YSgpe3JldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpfWdldFNjYWxlRm9ySWQoZSl7cmV0dXJuIHRoaXMuY2hhcnQuc2NhbGVzW2VdfV9nZXRPdGhlclNjYWxlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7cmV0dXJuIGU9PT10LmlTY2FsZT90LnZTY2FsZTp0LmlTY2FsZX1yZXNldCgpe3RoaXMuX3VwZGF0ZShgcmVzZXRgKX1fZGVzdHJveSgpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5fZGF0YSYmcW8odGhpcy5fZGF0YSx0aGlzKSxlLl9zdGFja2VkJiZhbChlKX1fZGF0YUNoZWNrKCl7bGV0IGU9dGhpcy5nZXREYXRhc2V0KCksdD1lLmRhdGF8fD1bXSxuPXRoaXMuX2RhdGE7aWYoRyh0KSl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLl9kYXRhPVljKHQsZSl9ZWxzZSBpZihuIT09dCl7aWYobil7cW8obix0aGlzKTtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO2FsKGUpLGUuX3BhcnNlZD1bXX10JiZPYmplY3QuaXNFeHRlbnNpYmxlKHQpJiZLbyh0LHRoaXMpLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuX2RhdGE9dH19YWRkRWxlbWVudHMoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuX2RhdGFDaGVjaygpLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlJiYoZS5kYXRhc2V0PW5ldyB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSl9YnVpbGRPclVwZGF0ZUVsZW1lbnRzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPSExO3RoaXMuX2RhdGFDaGVjaygpO2xldCBpPXQuX3N0YWNrZWQ7dC5fc3RhY2tlZD1YYyh0LnZTY2FsZSx0KSx0LnN0YWNrIT09bi5zdGFjayYmKHI9ITAsYWwodCksdC5zdGFjaz1uLnN0YWNrKSx0aGlzLl9yZXN5bmNFbGVtZW50cyhlKSwocnx8aSE9PXQuX3N0YWNrZWQpJiYodGwodGhpcyx0Ll9wYXJzZWQpLHQuX3N0YWNrZWQ9WGModC52U2NhbGUsdCkpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMuY2hhcnQuY29uZmlnLHQ9ZS5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpLG49ZS5nZXRPcHRpb25TY29wZXModGhpcy5nZXREYXRhc2V0KCksdCwhMCk7dGhpcy5vcHRpb25zPWUuY3JlYXRlUmVzb2x2ZXIobix0aGlzLmdldENvbnRleHQoKSksdGhpcy5fcGFyc2luZz10aGlzLm9wdGlvbnMucGFyc2luZyx0aGlzLl9jYWNoZWREYXRhT3B0cz17fX1wYXJzZShlLHQpe2xldHtfY2FjaGVkTWV0YTpuLF9kYXRhOnJ9PXRoaXMse2lTY2FsZTppLF9zdGFja2VkOmF9PW4sbz1pLmF4aXMscz1lPT09MCYmdD09PXIubGVuZ3RofHxuLl9zb3J0ZWQsYz1lPjAmJm4uX3BhcnNlZFtlLTFdLGwsdSxkO2lmKHRoaXMuX3BhcnNpbmc9PT0hMSluLl9wYXJzZWQ9cixuLl9zb3J0ZWQ9ITAsZD1yO2Vsc2V7ZD1XKHJbZV0pP3RoaXMucGFyc2VBcnJheURhdGEobixyLGUsdCk6RyhyW2VdKT90aGlzLnBhcnNlT2JqZWN0RGF0YShuLHIsZSx0KTp0aGlzLnBhcnNlUHJpbWl0aXZlRGF0YShuLHIsZSx0KTtsZXQgaT0oKT0+dVtvXT09PW51bGx8fGMmJnVbb108Y1tvXTtmb3IobD0wO2w8dDsrK2wpbi5fcGFyc2VkW2wrZV09dT1kW2xdLHMmJihpKCkmJihzPSExKSxjPXUpO24uX3NvcnRlZD1zfWEmJnRsKHRoaXMsZCl9cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSxvPWkuYXhpcyxzPWEuYXhpcyxjPWkuZ2V0TGFiZWxzKCksbD1pPT09YSx1PUFycmF5KHIpLGQsZixwO2ZvcihkPTAsZj1yO2Q8ZjsrK2QpcD1kK24sdVtkXT17W29dOmx8fGkucGFyc2UoY1twXSxwKSxbc106YS5wYXJzZSh0W3BdLHApfTtyZXR1cm4gdX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtsZXR7eFNjYWxlOmkseVNjYWxlOmF9PWUsbz1BcnJheShyKSxzLGMsbCx1O2ZvcihzPTAsYz1yO3M8YzsrK3MpbD1zK24sdT10W2xdLG9bc109e3g6aS5wYXJzZSh1WzBdLGwpLHk6YS5wYXJzZSh1WzFdLGwpfTtyZXR1cm4gb31wYXJzZU9iamVjdERhdGEoZSx0LG4scil7bGV0e3hTY2FsZTppLHlTY2FsZTphfT1lLHt4QXhpc0tleTpvPWB4YCx5QXhpc0tleTpzPWB5YH09dGhpcy5fcGFyc2luZyxjPUFycmF5KHIpLGwsdSxkLGY7Zm9yKGw9MCx1PXI7bDx1OysrbClkPWwrbixmPXRbZF0sY1tsXT17eDppLnBhcnNlKGxvKGYsbyksZCkseTphLnBhcnNlKGxvKGYscyksZCl9O3JldHVybiBjfWdldFBhcnNlZChlKXtyZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2VdfWdldERhdGFFbGVtZW50KGUpe3JldHVybiB0aGlzLl9jYWNoZWRNZXRhLmRhdGFbZV19YXBwbHlTdGFjayhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZE1ldGEsYT10W2UuYXhpc107cmV0dXJuIEpjKHtrZXlzOnFjKHIsITApLHZhbHVlczp0Ll9zdGFja3NbZS5heGlzXS5fdmlzdWFsVmFsdWVzfSxhLGkuaW5kZXgse21vZGU6bn0pfXVwZGF0ZVJhbmdlRnJvbVBhcnNlZChlLHQsbixyKXtsZXQgaT1uW3QuYXhpc10sYT1pPT09bnVsbD9OYU46aSxvPXImJm4uX3N0YWNrc1t0LmF4aXNdO3ImJm8mJihyLnZhbHVlcz1vLGE9SmMocixpLHRoaXMuX2NhY2hlZE1ldGEuaW5kZXgpKSxlLm1pbj1NYXRoLm1pbihlLm1pbixhKSxlLm1heD1NYXRoLm1heChlLm1heCxhKX1nZXRNaW5NYXgoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5fcGFyc2VkLGk9bi5fc29ydGVkJiZlPT09bi5pU2NhbGUsYT1yLmxlbmd0aCxvPXRoaXMuX2dldE90aGVyU2NhbGUoZSkscz1jbCh0LG4sdGhpcy5jaGFydCksYz17bWluOjEvMCxtYXg6LTEvMH0se21pbjpsLG1heDp1fT1RYyhvKSxkLGY7ZnVuY3Rpb24gcCgpe2Y9cltkXTtsZXQgdD1mW28uYXhpc107cmV0dXJuIUsoZltlLmF4aXNdKXx8bD50fHx1PHR9Zm9yKGQ9MDtkPGEmJiEoIXAoKSYmKHRoaXMudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGMsZSxmLHMpLGkpKTsrK2QpO2lmKGkpe2ZvcihkPWEtMTtkPj0wOy0tZClpZighcCgpKXt0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChjLGUsZixzKTticmVha319cmV0dXJuIGN9Z2V0QWxsUGFyc2VkVmFsdWVzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuX3BhcnNlZCxuPVtdLHIsaSxhO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWE9dFtyXVtlLmF4aXNdLEsoYSkmJm4ucHVzaChhKTtyZXR1cm4gbn1nZXRNYXhPdmVyZmxvdygpe3JldHVybiExfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0IHQ9dGhpcy5fY2FjaGVkTWV0YSxuPXQuaVNjYWxlLHI9dC52U2NhbGUsaT10aGlzLmdldFBhcnNlZChlKTtyZXR1cm57bGFiZWw6bj9gYCtuLmdldExhYmVsRm9yVmFsdWUoaVtuLmF4aXNdKTpgYCx2YWx1ZTpyP2BgK3IuZ2V0TGFiZWxGb3JWYWx1ZShpW3IuYXhpc10pOmBgfX1fdXBkYXRlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy51cGRhdGUoZXx8YGRlZmF1bHRgKSx0Ll9jbGlwPUtjKHEodGhpcy5vcHRpb25zLmNsaXAsR2ModC54U2NhbGUsdC55U2NhbGUsdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpfXVwZGF0ZShlKXt9ZHJhdygpe2xldCBlPXRoaXMuX2N0eCx0PXRoaXMuY2hhcnQsbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5kYXRhfHxbXSxpPXQuY2hhcnRBcmVhLGE9W10sbz10aGlzLl9kcmF3U3RhcnR8fDAscz10aGlzLl9kcmF3Q291bnR8fHIubGVuZ3RoLW8sYz10aGlzLm9wdGlvbnMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AsbDtmb3Iobi5kYXRhc2V0JiZuLmRhdGFzZXQuZHJhdyhlLGksbyxzKSxsPW87bDxvK3M7KytsKXtsZXQgdD1yW2xdO3QuaGlkZGVufHwodC5hY3RpdmUmJmM/YS5wdXNoKHQpOnQuZHJhdyhlLGkpKX1mb3IobD0wO2w8YS5sZW5ndGg7KytsKWFbbF0uZHJhdyhlLGkpfWdldFN0eWxlKGUsdCl7bGV0IG49dD9gYWN0aXZlYDpgZGVmYXVsdGA7cmV0dXJuIGU9PT12b2lkIDAmJnRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldD90aGlzLnJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMobik6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGV8fDAsbil9Z2V0Q29udGV4dChlLHQsbil7bGV0IHI9dGhpcy5nZXREYXRhc2V0KCksaTtpZihlPj0wJiZlPHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGgpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YVtlXTtpPXQuJGNvbnRleHR8fD1pbCh0aGlzLmdldENvbnRleHQoKSxlLHQpLGkucGFyc2VkPXRoaXMuZ2V0UGFyc2VkKGUpLGkucmF3PXIuZGF0YVtlXSxpLmluZGV4PWkuZGF0YUluZGV4PWV9ZWxzZSBpPXRoaXMuJGNvbnRleHR8fD1ybCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLmluZGV4KSxpLmRhdGFzZXQ9cixpLmluZGV4PWkuZGF0YXNldEluZGV4PXRoaXMuaW5kZXg7cmV0dXJuIGkuYWN0aXZlPSEhdCxpLm1vZGU9bixpfXJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCxlKX1yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGUsdCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCx0LGUpfV9yZXNvbHZlRWxlbWVudE9wdGlvbnMoZSx0PWBkZWZhdWx0YCxuKXtsZXQgcj10PT09YGFjdGl2ZWAsaT10aGlzLl9jYWNoZWREYXRhT3B0cyxhPWUrYC1gK3Qsbz1pW2FdLHM9dGhpcy5lbmFibGVPcHRpb25TaGFyaW5nJiZmbyhuKTtpZihvKXJldHVybiBzbChvLHMpO2xldCBjPXRoaXMuY2hhcnQuY29uZmlnLGw9Yy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLGUpLHU9cj9bYCR7ZX1Ib3ZlcmAsYGhvdmVyYCxlLGBgXTpbZSxgYF0sZD1jLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxsKSxmPU9iamVjdC5rZXlzKFouZWxlbWVudHNbZV0pLHA9Yy5yZXNvbHZlTmFtZWRPcHRpb25zKGQsZiwoKT0+dGhpcy5nZXRDb250ZXh0KG4scix0KSx1KTtyZXR1cm4gcC4kc2hhcmVkJiYocC4kc2hhcmVkPXMsaVthXT1PYmplY3QuZnJlZXplKHNsKHAscykpKSxwfV9yZXNvbHZlQW5pbWF0aW9ucyhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZERhdGFPcHRzLGE9YGFuaW1hdGlvbi0ke3R9YCxvPWlbYV07aWYobylyZXR1cm4gbztsZXQgcztpZihyLm9wdGlvbnMuYW5pbWF0aW9uIT09ITEpe2xldCByPXRoaXMuY2hhcnQuY29uZmlnLGk9ci5kYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKHRoaXMuX3R5cGUsdCksYT1yLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxpKTtzPXIuY3JlYXRlUmVzb2x2ZXIoYSx0aGlzLmdldENvbnRleHQoZSxuLHQpKX1sZXQgYz1uZXcgVmMocixzJiZzLmFuaW1hdGlvbnMpO3JldHVybiBzJiZzLl9jYWNoZWFibGUmJihpW2FdPU9iamVjdC5mcmVlemUoYykpLGN9Z2V0U2hhcmVkT3B0aW9ucyhlKXtpZihlLiRzaGFyZWQpcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnN8fD1PYmplY3QuYXNzaWduKHt9LGUpfWluY2x1ZGVPcHRpb25zKGUsdCl7cmV0dXJuIXR8fG9sKGUpfHx0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWR9X2dldFNoYXJlZE9wdGlvbnMoZSx0KXtsZXQgbj10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZSx0KSxyPXRoaXMuX3NoYXJlZE9wdGlvbnMsaT10aGlzLmdldFNoYXJlZE9wdGlvbnMobiksYT10aGlzLmluY2x1ZGVPcHRpb25zKHQsaSl8fGkhPT1yO3JldHVybiB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoaSx0LG4pLHtzaGFyZWRPcHRpb25zOmksaW5jbHVkZU9wdGlvbnM6YX19dXBkYXRlRWxlbWVudChlLHQsbixyKXtvbChyKT9PYmplY3QuYXNzaWduKGUsbik6dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxyKS51cGRhdGUoZSxuKX11cGRhdGVTaGFyZWRPcHRpb25zKGUsdCxuKXtlJiYhb2wodCkmJnRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCx0KS51cGRhdGUoZSxuKX1fc2V0U3R5bGUoZSx0LG4scil7ZS5hY3RpdmU9cjtsZXQgaT10aGlzLmdldFN0eWxlKHQscik7dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxuLHIpLnVwZGF0ZShlLHtvcHRpb25zOiFyJiZ0aGlzLmdldFNoYXJlZE9wdGlvbnMoaSl8fGl9KX1yZW1vdmVIb3ZlclN0eWxlKGUsdCxuKXt0aGlzLl9zZXRTdHlsZShlLG4sYGFjdGl2ZWAsITEpfXNldEhvdmVyU3R5bGUoZSx0LG4pe3RoaXMuX3NldFN0eWxlKGUsbixgYWN0aXZlYCwhMCl9X3JlbW92ZURhdGFzZXRIb3ZlclN0eWxlKCl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O2UmJnRoaXMuX3NldFN0eWxlKGUsdm9pZCAwLGBhY3RpdmVgLCExKX1fc2V0RGF0YXNldEhvdmVyU3R5bGUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7ZSYmdGhpcy5fc2V0U3R5bGUoZSx2b2lkIDAsYGFjdGl2ZWAsITApfV9yZXN5bmNFbGVtZW50cyhlKXtsZXQgdD10aGlzLl9kYXRhLG49dGhpcy5fY2FjaGVkTWV0YS5kYXRhO2ZvcihsZXRbZSx0LG5db2YgdGhpcy5fc3luY0xpc3QpdGhpc1tlXSh0LG4pO3RoaXMuX3N5bmNMaXN0PVtdO2xldCByPW4ubGVuZ3RoLGk9dC5sZW5ndGgsYT1NYXRoLm1pbihpLHIpO2EmJnRoaXMucGFyc2UoMCxhKSxpPnI/dGhpcy5faW5zZXJ0RWxlbWVudHMocixpLXIsZSk6aTxyJiZ0aGlzLl9yZW1vdmVFbGVtZW50cyhpLHItaSl9X2luc2VydEVsZW1lbnRzKGUsdCxuPSEwKXtsZXQgcj10aGlzLl9jYWNoZWRNZXRhLGk9ci5kYXRhLGE9ZSt0LG8scz1lPT57Zm9yKGUubGVuZ3RoKz10LG89ZS5sZW5ndGgtMTtvPj1hO28tLSllW29dPWVbby10XX07Zm9yKHMoaSksbz1lO288YTsrK28paVtvXT1uZXcgdGhpcy5kYXRhRWxlbWVudFR5cGU7dGhpcy5fcGFyc2luZyYmcyhyLl9wYXJzZWQpLHRoaXMucGFyc2UoZSx0KSxuJiZ0aGlzLnVwZGF0ZUVsZW1lbnRzKGksZSx0LGByZXNldGApfXVwZGF0ZUVsZW1lbnRzKGUsdCxuLHIpe31fcmVtb3ZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhO2lmKHRoaXMuX3BhcnNpbmcpe2xldCByPW4uX3BhcnNlZC5zcGxpY2UoZSx0KTtuLl9zdGFja2VkJiZhbChuLHIpfW4uZGF0YS5zcGxpY2UoZSx0KX1fc3luYyhlKXtpZih0aGlzLl9wYXJzaW5nKXRoaXMuX3N5bmNMaXN0LnB1c2goZSk7ZWxzZXtsZXRbdCxuLHJdPWU7dGhpc1t0XShuLHIpfXRoaXMuY2hhcnQuX2RhdGFDaGFuZ2VzLnB1c2goW3RoaXMuaW5kZXgsLi4uZV0pfV9vbkRhdGFQdXNoKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aDt0aGlzLl9zeW5jKFtgX2luc2VydEVsZW1lbnRzYCx0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aC1lLGVdKX1fb25EYXRhUG9wKCl7dGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aC0xLDFdKX1fb25EYXRhU2hpZnQoKXt0aGlzLl9zeW5jKFtgX3JlbW92ZUVsZW1lbnRzYCwwLDFdKX1fb25EYXRhU3BsaWNlKGUsdCl7dCYmdGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsZSx0XSk7bGV0IG49YXJndW1lbnRzLmxlbmd0aC0yO24mJnRoaXMuX3N5bmMoW2BfaW5zZXJ0RWxlbWVudHNgLGUsbl0pfV9vbkRhdGFVbnNoaWZ0KCl7dGhpcy5fc3luYyhbYF9pbnNlcnRFbGVtZW50c2AsMCxhcmd1bWVudHMubGVuZ3RoXSl9fTtmdW5jdGlvbiB1bChlLHQpe2lmKCFlLl9jYWNoZS4kYmFyKXtsZXQgbj1lLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHQpLHI9W107Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKXI9ci5jb25jYXQoblt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhlKSk7ZS5fY2FjaGUuJGJhcj1KbyhyLnNvcnQoKGUsdCk9PmUtdCkpfXJldHVybiBlLl9jYWNoZS4kYmFyfWZ1bmN0aW9uIGRsKGUpe2xldCB0PWUuaVNjYWxlLG49dWwodCxlLnR5cGUpLHI9dC5fbGVuZ3RoLGksYSxvLHMsYz0oKT0+e28hPT0zMjc2NyYmbyE9PS0zMjc2OCYmKGZvKHMpJiYocj1NYXRoLm1pbihyLE1hdGguYWJzKG8tcyl8fHIpKSxzPW8pfTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhOysraSlvPXQuZ2V0UGl4ZWxGb3JWYWx1ZShuW2ldKSxjKCk7Zm9yKHM9dm9pZCAwLGk9MCxhPXQudGlja3MubGVuZ3RoO2k8YTsrK2kpbz10LmdldFBpeGVsRm9yVGljayhpKSxjKCk7cmV0dXJuIHJ9ZnVuY3Rpb24gZmwoZSx0LG4scil7bGV0IGk9bi5iYXJUaGlja25lc3MsYSxvO3JldHVybiBVKGkpPyhhPXQubWluKm4uY2F0ZWdvcnlQZXJjZW50YWdlLG89bi5iYXJQZXJjZW50YWdlKTooYT1pKnIsbz0xKSx7Y2h1bms6YS9yLHJhdGlvOm8sc3RhcnQ6dC5waXhlbHNbZV0tYS8yfX1mdW5jdGlvbiBwbChlLHQsbixyKXtsZXQgaT10LnBpeGVscyxhPWlbZV0sbz1lPjA/aVtlLTFdOm51bGwscz1lPGkubGVuZ3RoLTE/aVtlKzFdOm51bGwsYz1uLmNhdGVnb3J5UGVyY2VudGFnZTtvPT09bnVsbCYmKG89YS0ocz09PW51bGw/dC5lbmQtdC5zdGFydDpzLWEpKSxzPT09bnVsbCYmKHM9YSthLW8pO2xldCBsPWEtKGEtTWF0aC5taW4obyxzKSkvMipjO3JldHVybntjaHVuazpNYXRoLmFicyhzLW8pLzIqYy9yLHJhdGlvOm4uYmFyUGVyY2VudGFnZSxzdGFydDpsfX1mdW5jdGlvbiBtbChlLHQsbixyKXtsZXQgaT1uLnBhcnNlKGVbMF0sciksYT1uLnBhcnNlKGVbMV0sciksbz1NYXRoLm1pbihpLGEpLHM9TWF0aC5tYXgoaSxhKSxjPW8sbD1zO01hdGguYWJzKG8pPk1hdGguYWJzKHMpJiYoYz1zLGw9byksdFtuLmF4aXNdPWwsdC5fY3VzdG9tPXtiYXJTdGFydDpjLGJhckVuZDpsLHN0YXJ0OmksZW5kOmEsbWluOm8sbWF4OnN9fWZ1bmN0aW9uIGhsKGUsdCxuLHIpe3JldHVybiBXKGUpP21sKGUsdCxuLHIpOnRbbi5heGlzXT1uLnBhcnNlKGUsciksdH1mdW5jdGlvbiBnbChlLHQsbixyKXtsZXQgaT1lLmlTY2FsZSxhPWUudlNjYWxlLG89aS5nZXRMYWJlbHMoKSxzPWk9PT1hLGM9W10sbCx1LGQsZjtmb3IobD1uLHU9bityO2w8dTsrK2wpZj10W2xdLGQ9e30sZFtpLmF4aXNdPXN8fGkucGFyc2Uob1tsXSxsKSxjLnB1c2goaGwoZixkLGEsbCkpO3JldHVybiBjfWZ1bmN0aW9uIF9sKGUpe3JldHVybiBlJiZlLmJhclN0YXJ0IT09dm9pZCAwJiZlLmJhckVuZCE9PXZvaWQgMH1mdW5jdGlvbiB2bChlLHQsbil7cmV0dXJuIGU9PT0wPyh0LmlzSG9yaXpvbnRhbCgpPzE6LTEpKih0Lm1pbj49bj8xOi0xKTpDbyhlKX1mdW5jdGlvbiB5bChlKXtsZXQgdCxuLHIsaSxhO3JldHVybiBlLmhvcml6b250YWw/KHQ9ZS5iYXNlPmUueCxuPWBsZWZ0YCxyPWByaWdodGApOih0PWUuYmFzZTxlLnksbj1gYm90dG9tYCxyPWB0b3BgKSx0PyhpPWBlbmRgLGE9YHN0YXJ0YCk6KGk9YHN0YXJ0YCxhPWBlbmRgKSx7c3RhcnQ6bixlbmQ6cixyZXZlcnNlOnQsdG9wOmksYm90dG9tOmF9fWZ1bmN0aW9uIGJsKGUsdCxuLHIpe2xldCBpPXQuYm9yZGVyU2tpcHBlZCxhPXt9O2lmKCFpKXtlLmJvcmRlclNraXBwZWQ9YTtyZXR1cm59aWYoaT09PSEwKXtlLmJvcmRlclNraXBwZWQ9e3RvcDohMCxyaWdodDohMCxib3R0b206ITAsbGVmdDohMH07cmV0dXJufWxldHtzdGFydDpvLGVuZDpzLHJldmVyc2U6Yyx0b3A6bCxib3R0b206dX09eWwoZSk7aT09PWBtaWRkbGVgJiZuJiYoZS5lbmFibGVCb3JkZXJSYWRpdXM9ITAsKG4uX3RvcHx8MCk9PT1yP2k9bDoobi5fYm90dG9tfHwwKT09PXI/aT11OihhW3hsKHUsbyxzLGMpXT0hMCxpPWwpKSxhW3hsKGksbyxzLGMpXT0hMCxlLmJvcmRlclNraXBwZWQ9YX1mdW5jdGlvbiB4bChlLHQsbixyKXtyZXR1cm4gcj8oZT1TbChlLHQsbiksZT1DbChlLG4sdCkpOmU9Q2woZSx0LG4pLGV9ZnVuY3Rpb24gU2woZSx0LG4pe3JldHVybiBlPT09dD9uOmU9PT1uP3Q6ZX1mdW5jdGlvbiBDbChlLHQsbil7cmV0dXJuIGU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246ZX1mdW5jdGlvbiB3bChlLHtpbmZsYXRlQW1vdW50OnR9LG4pe2UuaW5mbGF0ZUFtb3VudD10PT09YGF1dG9gP249PT0xPy4zMzowOnR9dmFyIFRsPWNsYXNzIGV4dGVuZHMgbGx7c3RhdGljIGlkPWBiYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiExLGRhdGFFbGVtZW50VHlwZTpgYmFyYCxjYXRlZ29yeVBlcmNlbnRhZ2U6LjgsYmFyUGVyY2VudGFnZTouOSxncm91cGVkOiEwLGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgYmFzZWAsYHdpZHRoYCxgaGVpZ2h0YF19fX07c3RhdGljIG92ZXJyaWRlcz17c2NhbGVzOntfaW5kZXhfOnt0eXBlOmBjYXRlZ29yeWAsb2Zmc2V0OiEwLGdyaWQ6e29mZnNldDohMH19LF92YWx1ZV86e3R5cGU6YGxpbmVhcmAsYmVnaW5BdFplcm86ITB9fX07cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe3JldHVybiBnbChlLHQsbixyKX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtyZXR1cm4gZ2woZSx0LG4scil9cGFyc2VPYmplY3REYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSx7eEF4aXNLZXk6bz1geGAseUF4aXNLZXk6cz1geWB9PXRoaXMuX3BhcnNpbmcsYz1pLmF4aXM9PT1geGA/bzpzLGw9YS5heGlzPT09YHhgP286cyx1PVtdLGQsZixwLG07Zm9yKGQ9bixmPW4rcjtkPGY7KytkKW09dFtkXSxwPXt9LHBbaS5heGlzXT1pLnBhcnNlKGxvKG0sYyksZCksdS5wdXNoKGhsKGxvKG0sbCkscCxhLGQpKTtyZXR1cm4gdX11cGRhdGVSYW5nZUZyb21QYXJzZWQoZSx0LG4scil7c3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGUsdCxuLHIpO2xldCBpPW4uX2N1c3RvbTtpJiZ0PT09dGhpcy5fY2FjaGVkTWV0YS52U2NhbGUmJihlLm1pbj1NYXRoLm1pbihlLm1pbixpLm1pbiksZS5tYXg9TWF0aC5tYXgoZS5tYXgsaS5tYXgpKX1nZXRNYXhPdmVyZmxvdygpe3JldHVybiAwfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0e2lTY2FsZTp0LHZTY2FsZTpufT10aGlzLl9jYWNoZWRNZXRhLHI9dGhpcy5nZXRQYXJzZWQoZSksaT1yLl9jdXN0b20sYT1fbChpKT9gW2AraS5zdGFydCtgLCBgK2kuZW5kK2BdYDpgYCtuLmdldExhYmVsRm9yVmFsdWUocltuLmF4aXNdKTtyZXR1cm57bGFiZWw6YGArdC5nZXRMYWJlbEZvclZhbHVlKHJbdC5heGlzXSksdmFsdWU6YX19aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCk7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTtlLnN0YWNrPXRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrfXVwZGF0ZShlKXtsZXQgdD10aGlzLl9jYWNoZWRNZXRhO3RoaXMudXBkYXRlRWxlbWVudHModC5kYXRhLDAsdC5kYXRhLmxlbmd0aCxlKX11cGRhdGVFbGVtZW50cyhlLHQsbixyKXtsZXQgaT1yPT09YHJlc2V0YCx7aW5kZXg6YSxfY2FjaGVkTWV0YTp7dlNjYWxlOm99fT10aGlzLHM9by5nZXRCYXNlUGl4ZWwoKSxjPW8uaXNIb3Jpem9udGFsKCksbD10aGlzLl9nZXRSdWxlcigpLHtzaGFyZWRPcHRpb25zOnUsaW5jbHVkZU9wdGlvbnM6ZH09dGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyh0LHIpO2ZvcihsZXQgZj10O2Y8dCtuO2YrKyl7bGV0IHQ9dGhpcy5nZXRQYXJzZWQoZiksbj1pfHxVKHRbby5heGlzXSk/e2Jhc2U6cyxoZWFkOnN9OnRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGYpLHA9dGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoZixsKSxtPSh0Ll9zdGFja3N8fHt9KVtvLmF4aXNdLGg9e2hvcml6b250YWw6YyxiYXNlOm4uYmFzZSxlbmFibGVCb3JkZXJSYWRpdXM6IW18fF9sKHQuX2N1c3RvbSl8fGE9PT1tLl90b3B8fGE9PT1tLl9ib3R0b20seDpjP24uaGVhZDpwLmNlbnRlcix5OmM/cC5jZW50ZXI6bi5oZWFkLGhlaWdodDpjP3Auc2l6ZTpNYXRoLmFicyhuLnNpemUpLHdpZHRoOmM/TWF0aC5hYnMobi5zaXplKTpwLnNpemV9O2QmJihoLm9wdGlvbnM9dXx8dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGYsZVtmXS5hY3RpdmU/YGFjdGl2ZWA6cikpO2xldCBnPWgub3B0aW9uc3x8ZVtmXS5vcHRpb25zO2JsKGgsZyxtLGEpLHdsKGgsZyxsLnJhdGlvKSx0aGlzLnVwZGF0ZUVsZW1lbnQoZVtmXSxmLGgscil9fV9nZXRTdGFja3MoZSx0KXtsZXR7aVNjYWxlOm59PXRoaXMuX2NhY2hlZE1ldGEscj1uLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHRoaXMuX3R5cGUpLmZpbHRlcihlPT5lLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKSxpPW4ub3B0aW9ucy5zdGFja2VkLGE9W10sbz10aGlzLl9jYWNoZWRNZXRhLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKHQpLHM9byYmb1tuLmF4aXNdLGM9ZT0+e2xldCB0PWUuX3BhcnNlZC5maW5kKGU9PmVbbi5heGlzXT09PXMpLHI9dCYmdFtlLnZTY2FsZS5heGlzXTtpZihVKHIpfHxpc05hTihyKSlyZXR1cm4hMH07Zm9yKGxldCBuIG9mIHIpaWYoISh0IT09dm9pZCAwJiZjKG4pKSYmKChpPT09ITF8fGEuaW5kZXhPZihuLnN0YWNrKT09PS0xfHxpPT09dm9pZCAwJiZuLnN0YWNrPT09dm9pZCAwKSYmYS5wdXNoKG4uc3RhY2spLG4uaW5kZXg9PT1lKSlicmVhaztyZXR1cm4gYS5sZW5ndGh8fGEucHVzaCh2b2lkIDApLGF9X2dldFN0YWNrQ291bnQoZSl7cmV0dXJuIHRoaXMuX2dldFN0YWNrcyh2b2lkIDAsZSkubGVuZ3RofV9nZXRBeGlzQ291bnQoKXtyZXR1cm4gdGhpcy5fZ2V0QXhpcygpLmxlbmd0aH1nZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKXtsZXQgZT10aGlzLmNoYXJ0LnNjYWxlcyx0PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZpbHRlcihuPT5lW25dLmF4aXM9PT10KS5zaGlmdCgpfV9nZXRBeGlzKCl7bGV0IGU9e30sdD10aGlzLmdldEZpcnN0U2NhbGVJZEZvckluZGV4QXhpcygpO2ZvcihsZXQgbiBvZiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpZVtxKHRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/bi54QXhpc0lEOm4ueUF4aXNJRCx0KV09ITA7cmV0dXJuIE9iamVjdC5rZXlzKGUpfV9nZXRTdGFja0luZGV4KGUsdCxuKXtsZXQgcj10aGlzLl9nZXRTdGFja3MoZSxuKSxpPXQ9PT12b2lkIDA/LTE6ci5pbmRleE9mKHQpO3JldHVybiBpPT09LTE/ci5sZW5ndGgtMTppfV9nZXRSdWxlcigpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2NhY2hlZE1ldGEsbj10LmlTY2FsZSxyPVtdLGksYTtmb3IoaT0wLGE9dC5kYXRhLmxlbmd0aDtpPGE7KytpKXIucHVzaChuLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbbi5heGlzXSxpKSk7bGV0IG89ZS5iYXJUaGlja25lc3M7cmV0dXJue21pbjpvfHxkbCh0KSxwaXhlbHM6cixzdGFydDpuLl9zdGFydFBpeGVsLGVuZDpuLl9lbmRQaXhlbCxzdGFja0NvdW50OnRoaXMuX2dldFN0YWNrQ291bnQoKSxzY2FsZTpuLGdyb3VwZWQ6ZS5ncm91cGVkLHJhdGlvOm8/MTplLmNhdGVnb3J5UGVyY2VudGFnZSplLmJhclBlcmNlbnRhZ2V9fV9jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhlKXtsZXR7X2NhY2hlZE1ldGE6e3ZTY2FsZTp0LF9zdGFja2VkOm4saW5kZXg6cn0sb3B0aW9uczp7YmFzZTppLG1pbkJhckxlbmd0aDphfX09dGhpcyxvPWl8fDAscz10aGlzLmdldFBhcnNlZChlKSxjPXMuX2N1c3RvbSxsPV9sKGMpLHU9c1t0LmF4aXNdLGQ9MCxmPW4/dGhpcy5hcHBseVN0YWNrKHQscyxuKTp1LHAsbTtmIT09dSYmKGQ9Zi11LGY9dSksbCYmKHU9Yy5iYXJTdGFydCxmPWMuYmFyRW5kLWMuYmFyU3RhcnQsdSE9PTAmJkNvKHUpIT09Q28oYy5iYXJFbmQpJiYoZD0wKSxkKz11KTtsZXQgaD0hVShpKSYmIWw/aTpkLGc9dC5nZXRQaXhlbEZvclZhbHVlKGgpO2lmKHA9dGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShlKT90LmdldFBpeGVsRm9yVmFsdWUoZCtmKTpnLG09cC1nLE1hdGguYWJzKG0pPGEpe209dmwobSx0LG8pKmEsdT09PW8mJihnLT1tLzIpO2xldCBlPXQuZ2V0UGl4ZWxGb3JEZWNpbWFsKDApLGk9dC5nZXRQaXhlbEZvckRlY2ltYWwoMSk7Zz1NYXRoLm1heChNYXRoLm1pbihnLE1hdGgubWF4KGUsaSkpLE1hdGgubWluKGUsaSkpLHA9ZyttLG4mJiFsJiYocy5fc3RhY2tzW3QuYXhpc10uX3Zpc3VhbFZhbHVlc1tyXT10LmdldFZhbHVlRm9yUGl4ZWwocCktdC5nZXRWYWx1ZUZvclBpeGVsKGcpKX1pZihnPT09dC5nZXRQaXhlbEZvclZhbHVlKG8pKXtsZXQgZT1DbyhtKSp0LmdldExpbmVXaWR0aEZvclZhbHVlKG8pLzI7Zys9ZSxtLT1lfXJldHVybntzaXplOm0sYmFzZTpnLGhlYWQ6cCxjZW50ZXI6cCttLzJ9fV9jYWxjdWxhdGVCYXJJbmRleFBpeGVscyhlLHQpe2xldCBuPXQuc2NhbGUscj10aGlzLm9wdGlvbnMsaT1yLnNraXBOdWxsLGE9cShyLm1heEJhclRoaWNrbmVzcywxLzApLG8scyxjPXRoaXMuX2dldEF4aXNDb3VudCgpO2lmKHQuZ3JvdXBlZCl7bGV0IG49aT90aGlzLl9nZXRTdGFja0NvdW50KGUpOnQuc3RhY2tDb3VudCxsPXIuYmFyVGhpY2tuZXNzPT09YGZsZXhgP3BsKGUsdCxyLG4qYyk6ZmwoZSx0LHIsbipjKSx1PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/dGhpcy5nZXREYXRhc2V0KCkueEF4aXNJRDp0aGlzLmdldERhdGFzZXQoKS55QXhpc0lELGQ9dGhpcy5fZ2V0QXhpcygpLmluZGV4T2YocSh1LHRoaXMuZ2V0Rmlyc3RTY2FsZUlkRm9ySW5kZXhBeGlzKCkpKSxmPXRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCx0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLGk/ZTp2b2lkIDApK2Q7bz1sLnN0YXJ0K2wuY2h1bmsqZitsLmNodW5rLzIscz1NYXRoLm1pbihhLGwuY2h1bmsqbC5yYXRpbyl9ZWxzZSBvPW4uZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChlKVtuLmF4aXNdLGUpLHM9TWF0aC5taW4oYSx0Lm1pbip0LnJhdGlvKTtyZXR1cm57YmFzZTpvLXMvMixoZWFkOm8rcy8yLGNlbnRlcjpvLHNpemU6c319ZHJhdygpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGEsdD1lLnZTY2FsZSxuPWUuZGF0YSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdGhpcy5nZXRQYXJzZWQoaSlbdC5heGlzXSE9PW51bGwmJiFuW2ldLmhpZGRlbiYmbltpXS5kcmF3KHRoaXMuX2N0eCl9fTtmdW5jdGlvbiBFbCgpe3Rocm93IEVycm9yKGBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuYCl9dmFyIERsPXtfZGF0ZTpjbGFzcyBle3N0YXRpYyBvdmVycmlkZSh0KXtPYmplY3QuYXNzaWduKGUucHJvdG90eXBlLHQpfW9wdGlvbnM7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fHt9fWluaXQoKXt9Zm9ybWF0cygpe3JldHVybiBFbCgpfXBhcnNlKCl7cmV0dXJuIEVsKCl9Zm9ybWF0KCl7cmV0dXJuIEVsKCl9YWRkKCl7cmV0dXJuIEVsKCl9ZGlmZigpe3JldHVybiBFbCgpfXN0YXJ0T2YoKXtyZXR1cm4gRWwoKX1lbmRPZigpe3JldHVybiBFbCgpfX19O2Z1bmN0aW9uIE9sKGUsdCxuLHIpe2xldHtjb250cm9sbGVyOmksZGF0YTphLF9zb3J0ZWQ6b309ZSxzPWkuX2NhY2hlZE1ldGEuaVNjYWxlLGM9ZS5kYXRhc2V0JiZlLmRhdGFzZXQub3B0aW9ucz9lLmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwczpudWxsO2lmKHMmJnQ9PT1zLmF4aXMmJnQhPT1gcmAmJm8mJmEubGVuZ3RoKXtsZXQgbz1zLl9yZXZlcnNlUGl4ZWxzP1VvOkhvO2lmKCFyKXtsZXQgcj1vKGEsdCxuKTtpZihjKXtsZXR7dlNjYWxlOnR9PWkuX2NhY2hlZE1ldGEse19wYXJzZWQ6bn09ZSxhPW4uc2xpY2UoMCxyLmxvKzEpLnJldmVyc2UoKS5maW5kSW5kZXgoZT0+IVUoZVt0LmF4aXNdKSk7ci5sby09TWF0aC5tYXgoMCxhKTtsZXQgbz1uLnNsaWNlKHIuaGkpLmZpbmRJbmRleChlPT4hVShlW3QuYXhpc10pKTtyLmhpKz1NYXRoLm1heCgwLG8pfXJldHVybiByfWlmKGkuX3NoYXJlZE9wdGlvbnMpe2xldCBlPWFbMF0scj10eXBlb2YgZS5nZXRSYW5nZT09YGZ1bmN0aW9uYCYmZS5nZXRSYW5nZSh0KTtpZihyKXtsZXQgZT1vKGEsdCxuLXIpLGk9byhhLHQsbityKTtyZXR1cm57bG86ZS5sbyxoaTppLmhpfX19fXJldHVybntsbzowLGhpOmEubGVuZ3RoLTF9fWZ1bmN0aW9uIGtsKGUsdCxuLHIsaSl7bGV0IGE9ZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCksbz1uW3RdO2ZvcihsZXQgZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7bGV0e2luZGV4Om4sZGF0YTpzfT1hW2VdLHtsbzpjLGhpOmx9PU9sKGFbZV0sdCxvLGkpO2ZvcihsZXQgZT1jO2U8PWw7KytlKXtsZXQgdD1zW2VdO3Quc2tpcHx8cih0LG4sZSl9fX1mdW5jdGlvbiBBbChlKXtsZXQgdD1lLmluZGV4T2YoYHhgKSE9PS0xLG49ZS5pbmRleE9mKGB5YCkhPT0tMTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtsZXQgaT10P01hdGguYWJzKGUueC1yLngpOjAsYT1uP01hdGguYWJzKGUueS1yLnkpOjA7cmV0dXJuIE1hdGguc3FydChpKioyK2EqKjIpfX1mdW5jdGlvbiBqbChlLHQsbixyLGkpe2xldCBhPVtdO3JldHVybiFpJiYhZS5pc1BvaW50SW5BcmVhKHQpfHxrbChlLG4sdCxmdW5jdGlvbihuLG8scyl7IWkmJiFBcyhuLGUuY2hhcnRBcmVhLDApfHxuLmluUmFuZ2UodC54LHQueSxyKSYmYS5wdXNoKHtlbGVtZW50Om4sZGF0YXNldEluZGV4Om8saW5kZXg6c30pfSwhMCksYX1mdW5jdGlvbiBNbChlLHQsbixyKXtsZXQgaT1bXTtmdW5jdGlvbiBhKGUsbixhKXtsZXR7c3RhcnRBbmdsZTpvLGVuZEFuZ2xlOnN9PWUuZ2V0UHJvcHMoW2BzdGFydEFuZ2xlYCxgZW5kQW5nbGVgXSxyKSx7YW5nbGU6Y309UG8oZSx7eDp0LngseTp0Lnl9KTtMbyhjLG8scykmJmkucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpuLGluZGV4OmF9KX1yZXR1cm4ga2woZSxuLHQsYSksaX1mdW5jdGlvbiBObChlLHQsbixyLGksYSl7bGV0IG89W10scz1BbChuKSxjPTEvMDtmdW5jdGlvbiBsKG4sbCx1KXtsZXQgZD1uLmluUmFuZ2UodC54LHQueSxpKTtpZihyJiYhZClyZXR1cm47bGV0IGY9bi5nZXRDZW50ZXJQb2ludChpKTtpZighKGF8fGUuaXNQb2ludEluQXJlYShmKSkmJiFkKXJldHVybjtsZXQgcD1zKHQsZik7cDxjPyhvPVt7ZWxlbWVudDpuLGRhdGFzZXRJbmRleDpsLGluZGV4OnV9XSxjPXApOnA9PT1jJiZvLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6bCxpbmRleDp1fSl9cmV0dXJuIGtsKGUsbix0LGwpLG99ZnVuY3Rpb24gUGwoZSx0LG4scixpLGEpe3JldHVybiFhJiYhZS5pc1BvaW50SW5BcmVhKHQpP1tdOm49PT1gcmAmJiFyP01sKGUsdCxuLGkpOk5sKGUsdCxuLHIsaSxhKX1mdW5jdGlvbiBGbChlLHQsbixyLGkpe2xldCBhPVtdLG89bj09PWB4YD9gaW5YUmFuZ2VgOmBpbllSYW5nZWAscz0hMTtyZXR1cm4ga2woZSxuLHQsKGUscixjKT0+e2Vbb10mJmVbb10odFtuXSxpKSYmKGEucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpyLGluZGV4OmN9KSxzfHw9ZS5pblJhbmdlKHQueCx0LnksaSkpfSksciYmIXM/W106YX12YXIgSWw9e2V2YWx1YXRlSW50ZXJhY3Rpb25JdGVtczprbCxtb2Rlczp7aW5kZXgoZSx0LG4scil7bGV0IGk9U2ModCxlKSxhPW4uYXhpc3x8YHhgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKSxjPVtdO3JldHVybiBzLmxlbmd0aD8oZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkuZm9yRWFjaChlPT57bGV0IHQ9c1swXS5pbmRleCxuPWUuZGF0YVt0XTtuJiYhbi5za2lwJiZjLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6ZS5pbmRleCxpbmRleDp0fSl9KSxjKTpbXX0sZGF0YXNldChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKTtpZihzLmxlbmd0aD4wKXtsZXQgdD1zWzBdLmRhdGFzZXRJbmRleCxuPWUuZ2V0RGF0YXNldE1ldGEodCkuZGF0YTtzPVtdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXMucHVzaCh7ZWxlbWVudDpuW2VdLGRhdGFzZXRJbmRleDp0LGluZGV4OmV9KX1yZXR1cm4gc30scG9pbnQoZSx0LG4scil7cmV0dXJuIGpsKGUsU2ModCxlKSxuLmF4aXN8fGB4eWAscixuLmluY2x1ZGVJbnZpc2libGV8fCExKX0sbmVhcmVzdChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMTtyZXR1cm4gUGwoZSxpLGEsbi5pbnRlcnNlY3QscixvKX0seChlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB4YCxuLmludGVyc2VjdCxyKX0seShlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB5YCxuLmludGVyc2VjdCxyKX19fSxMbD1bYGxlZnRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWBdO2Z1bmN0aW9uIFJsKGUsdCl7cmV0dXJuIGUuZmlsdGVyKGU9PmUucG9zPT09dCl9ZnVuY3Rpb24gemwoZSx0KXtyZXR1cm4gZS5maWx0ZXIoZT0+TGwuaW5kZXhPZihlLnBvcyk9PT0tMSYmZS5ib3guYXhpcz09PXQpfWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIGUuc29ydCgoZSxuKT0+e2xldCByPXQ/bjplLGk9dD9lOm47cmV0dXJuIHIud2VpZ2h0PT09aS53ZWlnaHQ/ci5pbmRleC1pLmluZGV4OnIud2VpZ2h0LWkud2VpZ2h0fSl9ZnVuY3Rpb24gVmwoZSl7bGV0IHQ9W10sbixyLGksYSxvLHM7Zm9yKG49MCxyPShlfHxbXSkubGVuZ3RoO248cjsrK24paT1lW25dLHtwb3NpdGlvbjphLG9wdGlvbnM6e3N0YWNrOm8sc3RhY2tXZWlnaHQ6cz0xfX09aSx0LnB1c2goe2luZGV4Om4sYm94OmkscG9zOmEsaG9yaXpvbnRhbDppLmlzSG9yaXpvbnRhbCgpLHdlaWdodDppLndlaWdodCxzdGFjazpvJiZhK28sc3RhY2tXZWlnaHQ6c30pO3JldHVybiB0fWZ1bmN0aW9uIEhsKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBvZiBlKXtsZXR7c3RhY2s6ZSxwb3M6cixzdGFja1dlaWdodDppfT1uO2lmKCFlfHwhTGwuaW5jbHVkZXMocikpY29udGludWU7bGV0IGE9dFtlXXx8KHRbZV09e2NvdW50OjAscGxhY2VkOjAsd2VpZ2h0OjAsc2l6ZTowfSk7YS5jb3VudCsrLGEud2VpZ2h0Kz1pfXJldHVybiB0fWZ1bmN0aW9uIFVsKGUsdCl7bGV0IG49SGwoZSkse3ZCb3hNYXhXaWR0aDpyLGhCb3hNYXhIZWlnaHQ6aX09dCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7cz1lW2FdO2xldHtmdWxsU2l6ZTpvfT1zLmJveCxjPW5bcy5zdGFja10sbD1jJiZzLnN0YWNrV2VpZ2h0L2Mud2VpZ2h0O3MuaG9yaXpvbnRhbD8ocy53aWR0aD1sP2wqcjpvJiZ0LmF2YWlsYWJsZVdpZHRoLHMuaGVpZ2h0PWkpOihzLndpZHRoPXIscy5oZWlnaHQ9bD9sKmk6byYmdC5hdmFpbGFibGVIZWlnaHQpfXJldHVybiBufWZ1bmN0aW9uIFdsKGUpe2xldCB0PVZsKGUpLG49QmwodC5maWx0ZXIoZT0+ZS5ib3guZnVsbFNpemUpLCEwKSxyPUJsKFJsKHQsYGxlZnRgKSwhMCksaT1CbChSbCh0LGByaWdodGApKSxhPUJsKFJsKHQsYHRvcGApLCEwKSxvPUJsKFJsKHQsYGJvdHRvbWApKSxzPXpsKHQsYHhgKSxjPXpsKHQsYHlgKTtyZXR1cm57ZnVsbFNpemU6bixsZWZ0QW5kVG9wOnIuY29uY2F0KGEpLHJpZ2h0QW5kQm90dG9tOmkuY29uY2F0KGMpLmNvbmNhdChvKS5jb25jYXQocyksY2hhcnRBcmVhOlJsKHQsYGNoYXJ0QXJlYWApLHZlcnRpY2FsOnIuY29uY2F0KGkpLmNvbmNhdChjKSxob3Jpem9udGFsOmEuY29uY2F0KG8pLmNvbmNhdChzKX19ZnVuY3Rpb24gR2woZSx0LG4scil7cmV0dXJuIE1hdGgubWF4KGVbbl0sdFtuXSkrTWF0aC5tYXgoZVtyXSx0W3JdKX1mdW5jdGlvbiBLbChlLHQpe2UudG9wPU1hdGgubWF4KGUudG9wLHQudG9wKSxlLmxlZnQ9TWF0aC5tYXgoZS5sZWZ0LHQubGVmdCksZS5ib3R0b209TWF0aC5tYXgoZS5ib3R0b20sdC5ib3R0b20pLGUucmlnaHQ9TWF0aC5tYXgoZS5yaWdodCx0LnJpZ2h0KX1mdW5jdGlvbiBxbChlLHQsbixyKXtsZXR7cG9zOmksYm94OmF9PW4sbz1lLm1heFBhZGRpbmc7aWYoIUcoaSkpe24uc2l6ZSYmKGVbaV0tPW4uc2l6ZSk7bGV0IHQ9cltuLnN0YWNrXXx8e3NpemU6MCxjb3VudDoxfTt0LnNpemU9TWF0aC5tYXgodC5zaXplLG4uaG9yaXpvbnRhbD9hLmhlaWdodDphLndpZHRoKSxuLnNpemU9dC5zaXplL3QuY291bnQsZVtpXSs9bi5zaXplfWEuZ2V0UGFkZGluZyYmS2wobyxhLmdldFBhZGRpbmcoKSk7bGV0IHM9TWF0aC5tYXgoMCx0Lm91dGVyV2lkdGgtR2wobyxlLGBsZWZ0YCxgcmlnaHRgKSksYz1NYXRoLm1heCgwLHQub3V0ZXJIZWlnaHQtR2wobyxlLGB0b3BgLGBib3R0b21gKSksbD1zIT09ZS53LHU9YyE9PWUuaDtyZXR1cm4gZS53PXMsZS5oPWMsbi5ob3Jpem9udGFsP3tzYW1lOmwsb3RoZXI6dX06e3NhbWU6dSxvdGhlcjpsfX1mdW5jdGlvbiBKbChlKXtsZXQgdD1lLm1heFBhZGRpbmc7ZnVuY3Rpb24gbihuKXtsZXQgcj1NYXRoLm1heCh0W25dLWVbbl0sMCk7cmV0dXJuIGVbbl0rPXIscn1lLnkrPW4oYHRvcGApLGUueCs9bihgbGVmdGApLG4oYHJpZ2h0YCksbihgYm90dG9tYCl9ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj10Lm1heFBhZGRpbmc7ZnVuY3Rpb24gcihlKXtsZXQgcj17bGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9O3JldHVybiBlLmZvckVhY2goZT0+e3JbZV09TWF0aC5tYXgodFtlXSxuW2VdKX0pLHJ9cmV0dXJuIHIoZT9bYGxlZnRgLGByaWdodGBdOltgdG9wYCxgYm90dG9tYF0pfWZ1bmN0aW9uIFhsKGUsdCxuLHIpe2xldCBpPVtdLGEsbyxzLGMsbCx1O2ZvcihhPTAsbz1lLmxlbmd0aCxsPTA7YTxvOysrYSl7cz1lW2FdLGM9cy5ib3gsYy51cGRhdGUocy53aWR0aHx8dC53LHMuaGVpZ2h0fHx0LmgsWWwocy5ob3Jpem9udGFsLHQpKTtsZXR7c2FtZTpvLG90aGVyOmR9PXFsKHQsbixzLHIpO2x8PW8mJmkubGVuZ3RoLHV8fD1kLGMuZnVsbFNpemV8fGkucHVzaChzKX1yZXR1cm4gbCYmWGwoaSx0LG4scil8fHV9ZnVuY3Rpb24gWmwoZSx0LG4scixpKXtlLnRvcD1uLGUubGVmdD10LGUucmlnaHQ9dCtyLGUuYm90dG9tPW4raSxlLndpZHRoPXIsZS5oZWlnaHQ9aX1mdW5jdGlvbiBRbChlLHQsbixyKXtsZXQgaT1uLnBhZGRpbmcse3g6YSx5Om99PXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBlPXMuYm94LGM9cltzLnN0YWNrXXx8e2NvdW50OjEscGxhY2VkOjAsd2VpZ2h0OjF9LGw9cy5zdGFja1dlaWdodC9jLndlaWdodHx8MTtpZihzLmhvcml6b250YWwpe2xldCByPXQudypsLGE9Yy5zaXplfHxlLmhlaWdodDtmbyhjLnN0YXJ0KSYmKG89Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGkubGVmdCxvLG4ub3V0ZXJXaWR0aC1pLnJpZ2h0LWkubGVmdCxhKTpabChlLHQubGVmdCtjLnBsYWNlZCxvLHIsYSksYy5zdGFydD1vLGMucGxhY2VkKz1yLG89ZS5ib3R0b219ZWxzZXtsZXQgcj10LmgqbCxvPWMuc2l6ZXx8ZS53aWR0aDtmbyhjLnN0YXJ0KSYmKGE9Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGEsaS50b3AsbyxuLm91dGVySGVpZ2h0LWkuYm90dG9tLWkudG9wKTpabChlLGEsdC50b3ArYy5wbGFjZWQsbyxyKSxjLnN0YXJ0PWEsYy5wbGFjZWQrPXIsYT1lLnJpZ2h0fX10Lng9YSx0Lnk9b312YXIgJGw9e2FkZEJveChlLHQpe2UuYm94ZXN8fD1bXSx0LmZ1bGxTaXplPXQuZnVsbFNpemV8fCExLHQucG9zaXRpb249dC5wb3NpdGlvbnx8YHRvcGAsdC53ZWlnaHQ9dC53ZWlnaHR8fDAsdC5fbGF5ZXJzPXQuX2xheWVyc3x8ZnVuY3Rpb24oKXtyZXR1cm5be3o6MCxkcmF3KGUpe3QuZHJhdyhlKX19XX0sZS5ib3hlcy5wdXNoKHQpfSxyZW1vdmVCb3goZSx0KXtsZXQgbj1lLmJveGVzP2UuYm94ZXMuaW5kZXhPZih0KTotMTtuIT09LTEmJmUuYm94ZXMuc3BsaWNlKG4sMSl9LGNvbmZpZ3VyZShlLHQsbil7dC5mdWxsU2l6ZT1uLmZ1bGxTaXplLHQucG9zaXRpb249bi5wb3NpdGlvbix0LndlaWdodD1uLndlaWdodH0sdXBkYXRlKGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXQgaT1RKGUub3B0aW9ucy5sYXlvdXQucGFkZGluZyksYT1NYXRoLm1heCh0LWkud2lkdGgsMCksbz1NYXRoLm1heChuLWkuaGVpZ2h0LDApLHM9V2woZS5ib3hlcyksYz1zLnZlcnRpY2FsLGw9cy5ob3Jpem9udGFsO1koZS5ib3hlcyxlPT57dHlwZW9mIGUuYmVmb3JlTGF5b3V0PT1gZnVuY3Rpb25gJiZlLmJlZm9yZUxheW91dCgpfSk7bGV0IHU9Yy5yZWR1Y2UoKGUsdCk9PnQuYm94Lm9wdGlvbnMmJnQuYm94Lm9wdGlvbnMuZGlzcGxheT09PSExP2U6ZSsxLDApfHwxLGQ9T2JqZWN0LmZyZWV6ZSh7b3V0ZXJXaWR0aDp0LG91dGVySGVpZ2h0Om4scGFkZGluZzppLGF2YWlsYWJsZVdpZHRoOmEsYXZhaWxhYmxlSGVpZ2h0Om8sdkJveE1heFdpZHRoOmEvMi91LGhCb3hNYXhIZWlnaHQ6by8yfSksZj1PYmplY3QuYXNzaWduKHt9LGkpO0tsKGYsUShyKSk7bGV0IHA9T2JqZWN0LmFzc2lnbih7bWF4UGFkZGluZzpmLHc6YSxoOm8seDppLmxlZnQseTppLnRvcH0saSksbT1VbChjLmNvbmNhdChsKSxkKTtYbChzLmZ1bGxTaXplLHAsZCxtKSxYbChjLHAsZCxtKSxYbChsLHAsZCxtKSYmWGwoYyxwLGQsbSksSmwocCksUWwocy5sZWZ0QW5kVG9wLHAsZCxtKSxwLngrPXAudyxwLnkrPXAuaCxRbChzLnJpZ2h0QW5kQm90dG9tLHAsZCxtKSxlLmNoYXJ0QXJlYT17bGVmdDpwLmxlZnQsdG9wOnAudG9wLHJpZ2h0OnAubGVmdCtwLncsYm90dG9tOnAudG9wK3AuaCxoZWlnaHQ6cC5oLHdpZHRoOnAud30sWShzLmNoYXJ0QXJlYSx0PT57bGV0IG49dC5ib3g7T2JqZWN0LmFzc2lnbihuLGUuY2hhcnRBcmVhKSxuLnVwZGF0ZShwLncscC5oLHtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0pfSl9fSxldT1jbGFzc3thY3F1aXJlQ29udGV4dChlLHQpe31yZWxlYXNlQ29udGV4dChlKXtyZXR1cm4hMX1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt9cmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsbil7fWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gMX1nZXRNYXhpbXVtU2l6ZShlLHQsbixyKXtyZXR1cm4gdD1NYXRoLm1heCgwLHR8fGUud2lkdGgpLG58fD1lLmhlaWdodCx7d2lkdGg6dCxoZWlnaHQ6TWF0aC5tYXgoMCxyP01hdGguZmxvb3IodC9yKTpuKX19aXNBdHRhY2hlZChlKXtyZXR1cm4hMH11cGRhdGVDb25maWcoZSl7fX0sdHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlKXtyZXR1cm4gZSYmZS5nZXRDb250ZXh0JiZlLmdldENvbnRleHQoYDJkYCl8fG51bGx9dXBkYXRlQ29uZmlnKGUpe2Uub3B0aW9ucy5hbmltYXRpb249ITF9fSxudT1gJGNoYXJ0anNgLHJ1PXt0b3VjaHN0YXJ0OmBtb3VzZWRvd25gLHRvdWNobW92ZTpgbW91c2Vtb3ZlYCx0b3VjaGVuZDpgbW91c2V1cGAscG9pbnRlcmVudGVyOmBtb3VzZWVudGVyYCxwb2ludGVyZG93bjpgbW91c2Vkb3duYCxwb2ludGVybW92ZTpgbW91c2Vtb3ZlYCxwb2ludGVydXA6YG1vdXNldXBgLHBvaW50ZXJsZWF2ZTpgbW91c2VvdXRgLHBvaW50ZXJvdXQ6YG1vdXNlb3V0YH0saXU9ZT0+ZT09PW51bGx8fGU9PT1gYDtmdW5jdGlvbiBhdShlLHQpe2xldCBuPWUuc3R5bGUscj1lLmdldEF0dHJpYnV0ZShgaGVpZ2h0YCksaT1lLmdldEF0dHJpYnV0ZShgd2lkdGhgKTtpZihlW251XT17aW5pdGlhbDp7aGVpZ2h0OnIsd2lkdGg6aSxzdHlsZTp7ZGlzcGxheTpuLmRpc3BsYXksaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGh9fX0sbi5kaXNwbGF5PW4uZGlzcGxheXx8YGJsb2NrYCxuLmJveFNpemluZz1uLmJveFNpemluZ3x8YGJvcmRlci1ib3hgLGl1KGkpKXtsZXQgdD1PYyhlLGB3aWR0aGApO3QhPT12b2lkIDAmJihlLndpZHRoPXQpfWlmKGl1KHIpKXtpZihlLnN0eWxlLmhlaWdodD09PWBgKWUuaGVpZ2h0PWUud2lkdGgvKHR8fDIpO2Vsc2V7bGV0IHQ9T2MoZSxgaGVpZ2h0YCk7dCE9PXZvaWQgMCYmKGUuaGVpZ2h0PXQpfX1yZXR1cm4gZX12YXIgb3U9RGM/e3Bhc3NpdmU6ITB9OiExO2Z1bmN0aW9uIHN1KGUsdCxuKXtlJiZlLmFkZEV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBjdShlLHQsbil7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBsdShlLHQpe2xldCBuPXJ1W2UudHlwZV18fGUudHlwZSx7eDpyLHk6aX09U2MoZSx0KTtyZXR1cm57dHlwZTpuLGNoYXJ0OnQsbmF0aXZlOmUseDpyPT09dm9pZCAwP251bGw6cix5Omk9PT12b2lkIDA/bnVsbDppfX1mdW5jdGlvbiB1dShlLHQpe2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHxuLmNvbnRhaW5zKHQpKXJldHVybiEwfWZ1bmN0aW9uIGR1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5hZGRlZE5vZGVzLHIpLHQmJj0hdXUobi5yZW1vdmVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfWZ1bmN0aW9uIGZ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5yZW1vdmVkTm9kZXMsciksdCYmPSF1dShuLmFkZGVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfXZhciBwdT1uZXcgTWFwLG11PTA7ZnVuY3Rpb24gaHUoKXtsZXQgZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztlIT09bXUmJihtdT1lLHB1LmZvckVhY2goKHQsbik9PntuLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIT09ZSYmdCgpfSkpfWZ1bmN0aW9uIGd1KGUsdCl7cHUuc2l6ZXx8d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHJlc2l6ZWAsaHUpLHB1LnNldChlLHQpfWZ1bmN0aW9uIF91KGUpe3B1LmRlbGV0ZShlKSxwdS5zaXplfHx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxodSl9ZnVuY3Rpb24gdnUoZSx0LG4pe2xldCByPWUuY2FudmFzLGk9ciYmbWMocik7aWYoIWkpcmV0dXJuO2xldCBhPVhvKChlLHQpPT57bGV0IHI9aS5jbGllbnRXaWR0aDtuKGUsdCkscjxpLmNsaWVudFdpZHRoJiZuKCl9LHdpbmRvdyksbz1uZXcgUmVzaXplT2JzZXJ2ZXIoZT0+e2xldCB0PWVbMF0sbj10LmNvbnRlbnRSZWN0LndpZHRoLHI9dC5jb250ZW50UmVjdC5oZWlnaHQ7KG4hPT0wfHxyIT09MCkmJmEobixyKX0pO3JldHVybiBvLm9ic2VydmUoaSksZ3UoZSxhKSxvfWZ1bmN0aW9uIHl1KGUsdCxuKXtuJiZuLmRpc2Nvbm5lY3QoKSx0PT09YHJlc2l6ZWAmJl91KGUpfWZ1bmN0aW9uIGJ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPVhvKHQ9PntlLmN0eCE9PW51bGwmJm4obHUodCxlKSl9LGUpO3JldHVybiBzdShyLHQsaSksaX12YXIgeHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlLHQpe2xldCBuPWUmJmUuZ2V0Q29udGV4dCYmZS5nZXRDb250ZXh0KGAyZGApO3JldHVybiBuJiZuLmNhbnZhcz09PWU/KGF1KGUsdCksbik6bnVsbH1yZWxlYXNlQ29udGV4dChlKXtsZXQgdD1lLmNhbnZhcztpZighdFtudV0pcmV0dXJuITE7bGV0IG49dFtudV0uaW5pdGlhbDtbYGhlaWdodGAsYHdpZHRoYF0uZm9yRWFjaChlPT57bGV0IHI9bltlXTtVKHIpP3QucmVtb3ZlQXR0cmlidXRlKGUpOnQuc2V0QXR0cmlidXRlKGUscil9KTtsZXQgcj1uLnN0eWxlfHx7fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChlPT57dC5zdHlsZVtlXT1yW2VdfSksdC53aWR0aD10LndpZHRoLGRlbGV0ZSB0W251XSwhMH1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KTtsZXQgcj1lLiRwcm94aWVzfHw9e307clt0XT0oe2F0dGFjaDpkdSxkZXRhY2g6ZnUscmVzaXplOnZ1fVt0XXx8YnUpKGUsdCxuKX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IG49ZS4kcHJveGllc3x8PXt9LHI9blt0XTtyJiYoKHthdHRhY2g6eXUsZGV0YWNoOnl1LHJlc2l6ZTp5dX1bdF18fGN1KShlLHQsciksblt0XT12b2lkIDApfWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW99Z2V0TWF4aW11bVNpemUoZSx0LG4scil7cmV0dXJuIFRjKGUsdCxuLHIpfWlzQXR0YWNoZWQoZSl7bGV0IHQ9ZSYmbWMoZSk7cmV0dXJuISEodCYmdC5pc0Nvbm5lY3RlZCl9fTtmdW5jdGlvbiBTdShlKXtyZXR1cm4hcGMoKXx8dHlwZW9mIE9mZnNjcmVlbkNhbnZhczxgdWAmJmUgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXM/dHU6eHV9dmFyIEN1PWNsYXNze3N0YXRpYyBkZWZhdWx0cz17fTtzdGF0aWMgZGVmYXVsdFJvdXRlcz12b2lkIDA7eDt5O2FjdGl2ZT0hMTtvcHRpb25zOyRhbmltYXRpb25zO3Rvb2x0aXBQb3NpdGlvbihlKXtsZXR7eDp0LHk6bn09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YF0sZSk7cmV0dXJue3g6dCx5Om59fWhhc1ZhbHVlKCl7cmV0dXJuIE9vKHRoaXMueCkmJk9vKHRoaXMueSl9Z2V0UHJvcHMoZSx0KXtsZXQgbj10aGlzLiRhbmltYXRpb25zO2lmKCF0fHwhbilyZXR1cm4gdGhpcztsZXQgcj17fTtyZXR1cm4gZS5mb3JFYWNoKGU9PntyW2VdPW5bZV0mJm5bZV0uYWN0aXZlKCk/bltlXS5fdG86dGhpc1tlXX0pLHJ9fTtmdW5jdGlvbiB3dShlLHQpe2xldCBuPWUub3B0aW9ucy50aWNrcyxyPVR1KGUpLGk9TWF0aC5taW4obi5tYXhUaWNrc0xpbWl0fHxyLHIpLGE9bi5tYWpvci5lbmFibGVkP0R1KHQpOltdLG89YS5sZW5ndGgscz1hWzBdLGM9YVtvLTFdLGw9W107aWYobz5pKXJldHVybiBPdSh0LGwsYSxvL2kpLGw7bGV0IHU9RXUoYSx0LGkpO2lmKG8+MCl7bGV0IGUsbixyPW8+MT9NYXRoLnJvdW5kKChjLXMpLyhvLTEpKTpudWxsO2ZvcihrdSh0LGwsdSxVKHIpPzA6cy1yLHMpLGU9MCxuPW8tMTtlPG47ZSsrKWt1KHQsbCx1LGFbZV0sYVtlKzFdKTtyZXR1cm4ga3UodCxsLHUsYyxVKHIpP3QubGVuZ3RoOmMrciksbH1yZXR1cm4ga3UodCxsLHUpLGx9ZnVuY3Rpb24gVHUoZSl7bGV0IHQ9ZS5vcHRpb25zLm9mZnNldCxuPWUuX3RpY2tTaXplKCkscj1lLl9sZW5ndGgvbisgKyF0LGk9ZS5fbWF4TGVuZ3RoL247cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5taW4ocixpKSl9ZnVuY3Rpb24gRXUoZSx0LG4pe2xldCByPUF1KGUpLGk9dC5sZW5ndGgvbjtpZighcilyZXR1cm4gTWF0aC5tYXgoaSwxKTtsZXQgYT1FbyhyKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoLTE7ZTx0O2UrKyl7bGV0IHQ9YVtlXTtpZih0PmkpcmV0dXJuIHR9cmV0dXJuIE1hdGgubWF4KGksMSl9ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9W10sbixyO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0ubWFqb3ImJnQucHVzaChuKTtyZXR1cm4gdH1mdW5jdGlvbiBPdShlLHQsbixyKXtsZXQgaT0wLGE9blswXSxvO2ZvcihyPU1hdGguY2VpbChyKSxvPTA7bzxlLmxlbmd0aDtvKyspbz09PWEmJih0LnB1c2goZVtvXSksaSsrLGE9bltpKnJdKX1mdW5jdGlvbiBrdShlLHQsbixyLGkpe2xldCBhPXEociwwKSxvPU1hdGgubWluKHEoaSxlLmxlbmd0aCksZS5sZW5ndGgpLHM9MCxjLGwsdTtmb3Iobj1NYXRoLmNlaWwobiksaSYmKGM9aS1yLG49Yy9NYXRoLmZsb29yKGMvbikpLHU9YTt1PDA7KXMrKyx1PU1hdGgucm91bmQoYStzKm4pO2ZvcihsPU1hdGgubWF4KGEsMCk7bDxvO2wrKylsPT09dSYmKHQucHVzaChlW2xdKSxzKyssdT1NYXRoLnJvdW5kKGErcypuKSl9ZnVuY3Rpb24gQXUoZSl7bGV0IHQ9ZS5sZW5ndGgsbixyO2lmKHQ8MilyZXR1cm4hMTtmb3Iocj1lWzBdLG49MTtuPHQ7KytuKWlmKGVbbl0tZVtuLTFdIT09cilyZXR1cm4hMTtyZXR1cm4gcn12YXIganU9ZT0+ZT09PWBsZWZ0YD9gcmlnaHRgOmU9PT1gcmlnaHRgP2BsZWZ0YDplLE11PShlLHQsbik9PnQ9PT1gdG9wYHx8dD09PWBsZWZ0YD9lW3RdK246ZVt0XS1uLE51PShlLHQpPT5NYXRoLm1pbih0fHxlLGUpO2Z1bmN0aW9uIFB1KGUsdCl7bGV0IG49W10scj1lLmxlbmd0aC90LGk9ZS5sZW5ndGgsYT0wO2Zvcig7YTxpO2ErPXIpbi5wdXNoKGVbTWF0aC5mbG9vcihhKV0pO3JldHVybiBufWZ1bmN0aW9uIEZ1KGUsdCxuKXtsZXQgcj1lLnRpY2tzLmxlbmd0aCxpPU1hdGgubWluKHQsci0xKSxhPWUuX3N0YXJ0UGl4ZWwsbz1lLl9lbmRQaXhlbCxzPTFlLTYsYz1lLmdldFBpeGVsRm9yVGljayhpKSxsO2lmKCEobiYmKGw9cj09PTE/TWF0aC5tYXgoYy1hLG8tYyk6dD09PTA/KGUuZ2V0UGl4ZWxGb3JUaWNrKDEpLWMpLzI6KGMtZS5nZXRQaXhlbEZvclRpY2soaS0xKSkvMixjKz1pPHQ/bDotbCxjPGEtc3x8Yz5vK3MpKSlyZXR1cm4gY31mdW5jdGlvbiBJdShlLHQpe1koZSxlPT57bGV0IG49ZS5nYyxyPW4ubGVuZ3RoLzIsaTtpZihyPnQpe2ZvcihpPTA7aTxyOysraSlkZWxldGUgZS5kYXRhW25baV1dO24uc3BsaWNlKDAscil9fSl9ZnVuY3Rpb24gTHUoZSl7cmV0dXJuIGUuZHJhd1RpY2tzP2UudGlja0xlbmd0aDowfWZ1bmN0aW9uIFJ1KGUsdCl7aWYoIWUuZGlzcGxheSlyZXR1cm4gMDtsZXQgbj0kKGUuZm9udCx0KSxyPVEoZS5wYWRkaW5nKTtyZXR1cm4oVyhlLnRleHQpP2UudGV4dC5sZW5ndGg6MSkqbi5saW5lSGVpZ2h0K3IuaGVpZ2h0fWZ1bmN0aW9uIHp1KGUsdCl7cmV0dXJuIHFzKGUse3NjYWxlOnQsdHlwZTpgc2NhbGVgfSl9ZnVuY3Rpb24gQnUoZSx0LG4pe3JldHVybiBxcyhlLHt0aWNrOm4saW5kZXg6dCx0eXBlOmB0aWNrYH0pfWZ1bmN0aW9uIFZ1KGUsdCxuKXtsZXQgcj1RbyhlKTtyZXR1cm4obiYmdCE9PWByaWdodGB8fCFuJiZ0PT09YHJpZ2h0YCkmJihyPWp1KHIpKSxyfWZ1bmN0aW9uIEh1KGUsdCxuLHIpe2xldHt0b3A6aSxsZWZ0OmEsYm90dG9tOm8scmlnaHQ6cyxjaGFydDpjfT1lLHtjaGFydEFyZWE6bCxzY2FsZXM6dX09YyxkPTAsZixwLG0saD1vLWksZz1zLWE7aWYoZS5pc0hvcml6b250YWwoKSl7aWYocD0kbyhyLGEscyksRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO209dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpK2gtdH1lbHNlIG09bj09PWBjZW50ZXJgPyhsLmJvdHRvbStsLnRvcCkvMitoLXQ6TXUoZSxuLHQpO2Y9cy1hfWVsc2V7aWYoRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO3A9dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpLWcrdH1lbHNlIHA9bj09PWBjZW50ZXJgPyhsLmxlZnQrbC5yaWdodCkvMi1nK3Q6TXUoZSxuLHQpO209JG8ocixvLGkpLGQ9bj09PWBsZWZ0YD8teW86eW99cmV0dXJue3RpdGxlWDpwLHRpdGxlWTptLG1heFdpZHRoOmYscm90YXRpb246ZH19dmFyIFV1PWNsYXNzIGUgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaWQ9ZS5pZCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5jdHg9ZS5jdHgsdGhpcy5jaGFydD1lLmNoYXJ0LHRoaXMudG9wPXZvaWQgMCx0aGlzLmJvdHRvbT12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5fbWFyZ2lucz17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9LHRoaXMubWF4V2lkdGg9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLnBhZGRpbmdUb3A9dm9pZCAwLHRoaXMucGFkZGluZ0JvdHRvbT12b2lkIDAsdGhpcy5wYWRkaW5nTGVmdD12b2lkIDAsdGhpcy5wYWRkaW5nUmlnaHQ9dm9pZCAwLHRoaXMuYXhpcz12b2lkIDAsdGhpcy5sYWJlbFJvdGF0aW9uPXZvaWQgMCx0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwLHRoaXMuX3JhbmdlPXZvaWQgMCx0aGlzLnRpY2tzPVtdLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2xlbmd0aD0wLHRoaXMuX21heExlbmd0aD0wLHRoaXMuX2xvbmdlc3RUZXh0Q2FjaGU9e30sdGhpcy5fc3RhcnRQaXhlbD12b2lkIDAsdGhpcy5fZW5kUGl4ZWw9dm9pZCAwLHRoaXMuX3JldmVyc2VQaXhlbHM9ITEsdGhpcy5fdXNlck1heD12b2lkIDAsdGhpcy5fdXNlck1pbj12b2lkIDAsdGhpcy5fc3VnZ2VzdGVkTWF4PXZvaWQgMCx0aGlzLl9zdWdnZXN0ZWRNaW49dm9pZCAwLHRoaXMuX3RpY2tzTGVuZ3RoPTAsdGhpcy5fYm9yZGVyVmFsdWU9MCx0aGlzLl9jYWNoZT17fSx0aGlzLl9kYXRhTGltaXRzQ2FjaGVkPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwfWluaXQoZSl7dGhpcy5vcHRpb25zPWUuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksdGhpcy5heGlzPWUuYXhpcyx0aGlzLl91c2VyTWluPXRoaXMucGFyc2UoZS5taW4pLHRoaXMuX3VzZXJNYXg9dGhpcy5wYXJzZShlLm1heCksdGhpcy5fc3VnZ2VzdGVkTWluPXRoaXMucGFyc2UoZS5zdWdnZXN0ZWRNaW4pLHRoaXMuX3N1Z2dlc3RlZE1heD10aGlzLnBhcnNlKGUuc3VnZ2VzdGVkTWF4KX1wYXJzZShlLHQpe3JldHVybiBlfWdldFVzZXJCb3VuZHMoKXtsZXR7X3VzZXJNaW46ZSxfdXNlck1heDp0LF9zdWdnZXN0ZWRNaW46bixfc3VnZ2VzdGVkTWF4OnJ9PXRoaXM7cmV0dXJuIGU9WmEoZSwxLzApLHQ9WmEodCwtMS8wKSxuPVphKG4sMS8wKSxyPVphKHIsLTEvMCkse21pbjpaYShlLG4pLG1heDpaYSh0LHIpLG1pbkRlZmluZWQ6SyhlKSxtYXhEZWZpbmVkOksodCl9fWdldE1pbk1heChlKXtsZXR7bWluOnQsbWF4Om4sbWluRGVmaW5lZDpyLG1heERlZmluZWQ6aX09dGhpcy5nZXRVc2VyQm91bmRzKCksYTtpZihyJiZpKXJldHVybnttaW46dCxtYXg6bn07bGV0IG89dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO2ZvcihsZXQgcz0wLGM9by5sZW5ndGg7czxjOysrcylhPW9bc10uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcyxlKSxyfHwodD1NYXRoLm1pbih0LGEubWluKSksaXx8KG49TWF0aC5tYXgobixhLm1heCkpO3JldHVybiB0PWkmJnQ+bj9uOnQsbj1yJiZ0Pm4/dDpuLHttaW46WmEodCxaYShuLHQpKSxtYXg6WmEobixaYSh0LG4pKX19Z2V0UGFkZGluZygpe3JldHVybntsZWZ0OnRoaXMucGFkZGluZ0xlZnR8fDAsdG9wOnRoaXMucGFkZGluZ1RvcHx8MCxyaWdodDp0aGlzLnBhZGRpbmdSaWdodHx8MCxib3R0b206dGhpcy5wYWRkaW5nQm90dG9tfHwwfX1nZXRUaWNrcygpe3JldHVybiB0aGlzLnRpY2tzfWdldExhYmVscygpe2xldCBlPXRoaXMuY2hhcnQuZGF0YTtyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsc3x8KHRoaXMuaXNIb3Jpem9udGFsKCk/ZS54TGFiZWxzOmUueUxhYmVscyl8fGUubGFiZWxzfHxbXX1nZXRMYWJlbEl0ZW1zKGU9dGhpcy5jaGFydC5jaGFydEFyZWEpe3JldHVybiB0aGlzLl9sYWJlbEl0ZW1zfHw9dGhpcy5fY29tcHV0ZUxhYmVsSXRlbXMoZSl9YmVmb3JlTGF5b3V0KCl7dGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMX1iZWZvcmVVcGRhdGUoKXtKKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsW3RoaXNdKX11cGRhdGUoZSx0LG4pe2xldHtiZWdpbkF0WmVybzpyLGdyYWNlOmksdGlja3M6YX09dGhpcy5vcHRpb25zLG89YS5zYW1wbGVTaXplO3RoaXMuYmVmb3JlVXBkYXRlKCksdGhpcy5tYXhXaWR0aD1lLHRoaXMubWF4SGVpZ2h0PXQsdGhpcy5fbWFyZ2lucz1uPU9iamVjdC5hc3NpZ24oe2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfSxuKSx0aGlzLnRpY2tzPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5iZWZvcmVTZXREaW1lbnNpb25zKCksdGhpcy5zZXREaW1lbnNpb25zKCksdGhpcy5hZnRlclNldERpbWVuc2lvbnMoKSx0aGlzLl9tYXhMZW5ndGg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLndpZHRoK24ubGVmdCtuLnJpZ2h0OnRoaXMuaGVpZ2h0K24udG9wK24uYm90dG9tLHRoaXMuX2RhdGFMaW1pdHNDYWNoZWR8fD0odGhpcy5iZWZvcmVEYXRhTGltaXRzKCksdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCksdGhpcy5hZnRlckRhdGFMaW1pdHMoKSx0aGlzLl9yYW5nZT1Lcyh0aGlzLGksciksITApLHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpLHRoaXMudGlja3M9dGhpcy5idWlsZFRpY2tzKCl8fFtdLHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7bGV0IHM9bzx0aGlzLnRpY2tzLmxlbmd0aDt0aGlzLl9jb252ZXJ0VGlja3NUb0xhYmVscyhzP1B1KHRoaXMudGlja3Msbyk6dGhpcy50aWNrcyksdGhpcy5jb25maWd1cmUoKSx0aGlzLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLGEuZGlzcGxheSYmKGEuYXV0b1NraXB8fGEuc291cmNlPT09YGF1dG9gKSYmKHRoaXMudGlja3M9d3UodGhpcyx0aGlzLnRpY2tzKSx0aGlzLl9sYWJlbFNpemVzPW51bGwsdGhpcy5hZnRlckF1dG9Ta2lwKCkpLHMmJnRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRoaXMudGlja3MpLHRoaXMuYmVmb3JlRml0KCksdGhpcy5maXQoKSx0aGlzLmFmdGVyRml0KCksdGhpcy5hZnRlclVwZGF0ZSgpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMub3B0aW9ucy5yZXZlcnNlLHQsbjt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0PXRoaXMubGVmdCxuPXRoaXMucmlnaHQpOih0PXRoaXMudG9wLG49dGhpcy5ib3R0b20sZT0hZSksdGhpcy5fc3RhcnRQaXhlbD10LHRoaXMuX2VuZFBpeGVsPW4sdGhpcy5fcmV2ZXJzZVBpeGVscz1lLHRoaXMuX2xlbmd0aD1uLXQsdGhpcy5fYWxpZ25Ub1BpeGVscz10aGlzLm9wdGlvbnMuYWxpZ25Ub1BpeGVsc31hZnRlclVwZGF0ZSgpe0oodGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlLFt0aGlzXSl9YmVmb3JlU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsW3RoaXNdKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD0wLHRoaXMucmlnaHQ9dGhpcy53aWR0aCk6KHRoaXMuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LHRoaXMudG9wPTAsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdUb3A9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wfWFmdGVyU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucyxbdGhpc10pfV9jYWxsSG9va3MoZSl7dGhpcy5jaGFydC5ub3RpZnlQbHVnaW5zKGUsdGhpcy5nZXRDb250ZXh0KCkpLEoodGhpcy5vcHRpb25zW2VdLFt0aGlzXSl9YmVmb3JlRGF0YUxpbWl0cygpe3RoaXMuX2NhbGxIb29rcyhgYmVmb3JlRGF0YUxpbWl0c2ApfWRldGVybWluZURhdGFMaW1pdHMoKXt9YWZ0ZXJEYXRhTGltaXRzKCl7dGhpcy5fY2FsbEhvb2tzKGBhZnRlckRhdGFMaW1pdHNgKX1iZWZvcmVCdWlsZFRpY2tzKCl7dGhpcy5fY2FsbEhvb2tzKGBiZWZvcmVCdWlsZFRpY2tzYCl9YnVpbGRUaWNrcygpe3JldHVybltdfWFmdGVyQnVpbGRUaWNrcygpe3RoaXMuX2NhbGxIb29rcyhgYWZ0ZXJCdWlsZFRpY2tzYCl9YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCl7Sih0aGlzLm9wdGlvbnMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9Z2VuZXJhdGVUaWNrTGFiZWxzKGUpe2xldCB0PXRoaXMub3B0aW9ucy50aWNrcyxuLHIsaTtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpPWVbbl0saS5sYWJlbD1KKHQuY2FsbGJhY2ssW2kudmFsdWUsbixlXSx0aGlzKX1hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpe0oodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9YmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpe0oodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1jYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPU51KHRoaXMudGlja3MubGVuZ3RoLGUudGlja3MubWF4VGlja3NMaW1pdCkscj10Lm1pblJvdGF0aW9ufHwwLGk9dC5tYXhSb3RhdGlvbixhPXIsbyxzLGM7aWYoIXRoaXMuX2lzVmlzaWJsZSgpfHwhdC5kaXNwbGF5fHxyPj1pfHxuPD0xfHwhdGhpcy5pc0hvcml6b250YWwoKSl7dGhpcy5sYWJlbFJvdGF0aW9uPXI7cmV0dXJufWxldCBsPXRoaXMuX2dldExhYmVsU2l6ZXMoKSx1PWwud2lkZXN0LndpZHRoLGQ9bC5oaWdoZXN0LmhlaWdodCxmPVJvKHRoaXMuY2hhcnQud2lkdGgtdSwwLHRoaXMubWF4V2lkdGgpO289ZS5vZmZzZXQ/dGhpcy5tYXhXaWR0aC9uOmYvKG4tMSksdSs2Pm8mJihvPWYvKG4tKGUub2Zmc2V0Py41OjEpKSxzPXRoaXMubWF4SGVpZ2h0LUx1KGUuZ3JpZCktdC5wYWRkaW5nLVJ1KGUudGl0bGUsdGhpcy5jaGFydC5vcHRpb25zLmZvbnQpLGM9TWF0aC5zcXJ0KHUqdStkKmQpLGE9TW8oTWF0aC5taW4oTWF0aC5hc2luKFJvKChsLmhpZ2hlc3QuaGVpZ2h0KzYpL28sLTEsMSkpLE1hdGguYXNpbihSbyhzL2MsLTEsMSkpLU1hdGguYXNpbihSbyhkL2MsLTEsMSkpKSksYT1NYXRoLm1heChyLE1hdGgubWluKGksYSkpKSx0aGlzLmxhYmVsUm90YXRpb249YX1hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKXtKKHRoaXMub3B0aW9ucy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1hZnRlckF1dG9Ta2lwKCl7fWJlZm9yZUZpdCgpe0oodGhpcy5vcHRpb25zLmJlZm9yZUZpdCxbdGhpc10pfWZpdCgpe2xldCBlPXt3aWR0aDowLGhlaWdodDowfSx7Y2hhcnQ6dCxvcHRpb25zOnt0aWNrczpuLHRpdGxlOnIsZ3JpZDppfX09dGhpcyxhPXRoaXMuX2lzVmlzaWJsZSgpLG89dGhpcy5pc0hvcml6b250YWwoKTtpZihhKXtsZXQgYT1SdShyLHQub3B0aW9ucy5mb250KTtpZihvPyhlLndpZHRoPXRoaXMubWF4V2lkdGgsZS5oZWlnaHQ9THUoaSkrYSk6KGUuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LGUud2lkdGg9THUoaSkrYSksbi5kaXNwbGF5JiZ0aGlzLnRpY2tzLmxlbmd0aCl7bGV0e2ZpcnN0OnQsbGFzdDpyLHdpZGVzdDppLGhpZ2hlc3Q6YX09dGhpcy5fZ2V0TGFiZWxTaXplcygpLHM9bi5wYWRkaW5nKjIsYz1qbyh0aGlzLmxhYmVsUm90YXRpb24pLGw9TWF0aC5jb3MoYyksdT1NYXRoLnNpbihjKTtpZihvKXtsZXQgdD1uLm1pcnJvcj8wOnUqaS53aWR0aCtsKmEuaGVpZ2h0O2UuaGVpZ2h0PU1hdGgubWluKHRoaXMubWF4SGVpZ2h0LGUuaGVpZ2h0K3Qrcyl9ZWxzZXtsZXQgdD1uLm1pcnJvcj8wOmwqaS53aWR0aCt1KmEuaGVpZ2h0O2Uud2lkdGg9TWF0aC5taW4odGhpcy5tYXhXaWR0aCxlLndpZHRoK3Qrcyl9dGhpcy5fY2FsY3VsYXRlUGFkZGluZyh0LHIsdSxsKX19dGhpcy5faGFuZGxlTWFyZ2lucygpLG8/KHRoaXMud2lkdGg9dGhpcy5fbGVuZ3RoPXQud2lkdGgtdGhpcy5fbWFyZ2lucy5sZWZ0LXRoaXMuX21hcmdpbnMucmlnaHQsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQpOih0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5fbGVuZ3RoPXQuaGVpZ2h0LXRoaXMuX21hcmdpbnMudG9wLXRoaXMuX21hcmdpbnMuYm90dG9tKX1fY2FsY3VsYXRlUGFkZGluZyhlLHQsbixyKXtsZXR7dGlja3M6e2FsaWduOmkscGFkZGluZzphfSxwb3NpdGlvbjpvfT10aGlzLm9wdGlvbnMscz10aGlzLmxhYmVsUm90YXRpb24hPT0wLGM9byE9PWB0b3BgJiZ0aGlzLmF4aXM9PT1geGA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7bGV0IG89dGhpcy5nZXRQaXhlbEZvclRpY2soMCktdGhpcy5sZWZ0LGw9dGhpcy5yaWdodC10aGlzLmdldFBpeGVsRm9yVGljayh0aGlzLnRpY2tzLmxlbmd0aC0xKSx1PTAsZD0wO3M/Yz8odT1yKmUud2lkdGgsZD1uKnQuaGVpZ2h0KToodT1uKmUuaGVpZ2h0LGQ9cip0LndpZHRoKTppPT09YHN0YXJ0YD9kPXQud2lkdGg6aT09PWBlbmRgP3U9ZS53aWR0aDppIT09YGlubmVyYCYmKHU9ZS53aWR0aC8yLGQ9dC53aWR0aC8yKSx0aGlzLnBhZGRpbmdMZWZ0PU1hdGgubWF4KCh1LW8rYSkqdGhpcy53aWR0aC8odGhpcy53aWR0aC1vKSwwKSx0aGlzLnBhZGRpbmdSaWdodD1NYXRoLm1heCgoZC1sK2EpKnRoaXMud2lkdGgvKHRoaXMud2lkdGgtbCksMCl9ZWxzZXtsZXQgbj10LmhlaWdodC8yLHI9ZS5oZWlnaHQvMjtpPT09YHN0YXJ0YD8obj0wLHI9ZS5oZWlnaHQpOmk9PT1gZW5kYCYmKG49dC5oZWlnaHQscj0wKSx0aGlzLnBhZGRpbmdUb3A9bithLHRoaXMucGFkZGluZ0JvdHRvbT1yK2F9fV9oYW5kbGVNYXJnaW5zKCl7dGhpcy5fbWFyZ2lucyYmKHRoaXMuX21hcmdpbnMubGVmdD1NYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMuX21hcmdpbnMubGVmdCksdGhpcy5fbWFyZ2lucy50b3A9TWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLHRoaXMuX21hcmdpbnMudG9wKSx0aGlzLl9tYXJnaW5zLnJpZ2h0PU1hdGgubWF4KHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMuX21hcmdpbnMucmlnaHQpLHRoaXMuX21hcmdpbnMuYm90dG9tPU1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLl9tYXJnaW5zLmJvdHRvbSkpfWFmdGVyRml0KCl7Sih0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsW3RoaXNdKX1pc0hvcml6b250YWwoKXtsZXR7YXhpczplLHBvc2l0aW9uOnR9PXRoaXMub3B0aW9ucztyZXR1cm4gdD09PWB0b3BgfHx0PT09YGJvdHRvbWB8fGU9PT1geGB9aXNGdWxsU2l6ZSgpe3JldHVybiB0aGlzLm9wdGlvbnMuZnVsbFNpemV9X2NvbnZlcnRUaWNrc1RvTGFiZWxzKGUpe3RoaXMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCksdGhpcy5nZW5lcmF0ZVRpY2tMYWJlbHMoZSk7bGV0IHQsbjtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKylVKGVbdF0ubGFiZWwpJiYoZS5zcGxpY2UodCwxKSxuLS0sdC0tKTt0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCl9X2dldExhYmVsU2l6ZXMoKXtsZXQgZT10aGlzLl9sYWJlbFNpemVzO2lmKCFlKXtsZXQgdD10aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZSxuPXRoaXMudGlja3M7dDxuLmxlbmd0aCYmKG49UHUobix0KSksdGhpcy5fbGFiZWxTaXplcz1lPXRoaXMuX2NvbXB1dGVMYWJlbFNpemVzKG4sbi5sZW5ndGgsdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpfXJldHVybiBlfV9jb21wdXRlTGFiZWxTaXplcyhlLHQsbil7bGV0e2N0eDpyLF9sb25nZXN0VGV4dENhY2hlOml9PXRoaXMsYT1bXSxvPVtdLHM9TWF0aC5mbG9vcih0L051KHQsbikpLGM9MCxsPTAsdSxkLGYscCxtLGgsZyxfLHYseSxiO2Zvcih1PTA7dTx0O3UrPXMpe2lmKHA9ZVt1XS5sYWJlbCxtPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnModSksci5mb250PWg9bS5zdHJpbmcsZz1pW2hdPWlbaF18fHtkYXRhOnt9LGdjOltdfSxfPW0ubGluZUhlaWdodCx2PXk9MCwhVShwKSYmIVcocCkpdj13cyhyLGcuZGF0YSxnLmdjLHYscCkseT1fO2Vsc2UgaWYoVyhwKSlmb3IoZD0wLGY9cC5sZW5ndGg7ZDxmOysrZCliPXBbZF0sIVUoYikmJiFXKGIpJiYodj13cyhyLGcuZGF0YSxnLmdjLHYsYikseSs9Xyk7YS5wdXNoKHYpLG8ucHVzaCh5KSxjPU1hdGgubWF4KHYsYyksbD1NYXRoLm1heCh5LGwpfUl1KGksdCk7bGV0IHg9YS5pbmRleE9mKGMpLFM9by5pbmRleE9mKGwpLEM9ZT0+KHt3aWR0aDphW2VdfHwwLGhlaWdodDpvW2VdfHwwfSk7cmV0dXJue2ZpcnN0OkMoMCksbGFzdDpDKHQtMSksd2lkZXN0OkMoeCksaGlnaGVzdDpDKFMpLHdpZHRoczphLGhlaWdodHM6b319Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZX1nZXRQaXhlbEZvclZhbHVlKGUsdCl7cmV0dXJuIE5hTn1nZXRWYWx1ZUZvclBpeGVsKGUpe31nZXRQaXhlbEZvclRpY2soZSl7bGV0IHQ9dGhpcy50aWNrcztyZXR1cm4gZTwwfHxlPnQubGVuZ3RoLTE/bnVsbDp0aGlzLmdldFBpeGVsRm9yVmFsdWUodFtlXS52YWx1ZSl9Z2V0UGl4ZWxGb3JEZWNpbWFsKGUpe3RoaXMuX3JldmVyc2VQaXhlbHMmJihlPTEtZSk7bGV0IHQ9dGhpcy5fc3RhcnRQaXhlbCtlKnRoaXMuX2xlbmd0aDtyZXR1cm4gem8odGhpcy5fYWxpZ25Ub1BpeGVscz9Fcyh0aGlzLmNoYXJ0LHQsMCk6dCl9Z2V0RGVjaW1hbEZvclBpeGVsKGUpe2xldCB0PShlLXRoaXMuX3N0YXJ0UGl4ZWwpL3RoaXMuX2xlbmd0aDtyZXR1cm4gdGhpcy5fcmV2ZXJzZVBpeGVscz8xLXQ6dH1nZXRCYXNlUGl4ZWwoKXtyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldEJhc2VWYWx1ZSgpe2xldHttaW46ZSxtYXg6dH09dGhpcztyZXR1cm4gZTwwJiZ0PDA/dDplPjAmJnQ+MD9lOjB9Z2V0Q29udGV4dChlKXtsZXQgdD10aGlzLnRpY2tzfHxbXTtpZihlPj0wJiZlPHQubGVuZ3RoKXtsZXQgbj10W2VdO3JldHVybiBuLiRjb250ZXh0fHw9QnUodGhpcy5nZXRDb250ZXh0KCksZSxuKX1yZXR1cm4gdGhpcy4kY29udGV4dHx8PXp1KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHRoaXMpfV90aWNrU2l6ZSgpe2xldCBlPXRoaXMub3B0aW9ucy50aWNrcyx0PWpvKHRoaXMubGFiZWxSb3RhdGlvbiksbj1NYXRoLmFicyhNYXRoLmNvcyh0KSkscj1NYXRoLmFicyhNYXRoLnNpbih0KSksaT10aGlzLl9nZXRMYWJlbFNpemVzKCksYT1lLmF1dG9Ta2lwUGFkZGluZ3x8MCxvPWk/aS53aWRlc3Qud2lkdGgrYTowLHM9aT9pLmhpZ2hlc3QuaGVpZ2h0K2E6MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT9zKm4+bypyP28vbjpzL3I6cypyPG8qbj9zL246by9yfV9pc1Zpc2libGUoKXtsZXQgZT10aGlzLm9wdGlvbnMuZGlzcGxheTtyZXR1cm4gZT09PWBhdXRvYD90aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCkubGVuZ3RoPjA6ISFlfV9jb21wdXRlR3JpZExpbmVJdGVtcyhlKXtsZXQgdD10aGlzLmF4aXMsbj10aGlzLmNoYXJ0LHI9dGhpcy5vcHRpb25zLHtncmlkOmkscG9zaXRpb246YSxib3JkZXI6b309cixzPWkub2Zmc2V0LGM9dGhpcy5pc0hvcml6b250YWwoKSxsPXRoaXMudGlja3MubGVuZ3RoKyArISFzLHU9THUoaSksZD1bXSxmPW8uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscD1mLmRpc3BsYXk/Zi53aWR0aDowLG09cC8yLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIEVzKG4sZSxwKX0sZyxfLHYseSxiLHgsUyxDLHcsVCxFLEQ7aWYoYT09PWB0b3BgKWc9aCh0aGlzLmJvdHRvbSkseD10aGlzLmJvdHRvbS11LEM9Zy1tLFQ9aChlLnRvcCkrbSxEPWUuYm90dG9tO2Vsc2UgaWYoYT09PWBib3R0b21gKWc9aCh0aGlzLnRvcCksVD1lLnRvcCxEPWgoZS5ib3R0b20pLW0seD1nK20sQz10aGlzLnRvcCt1O2Vsc2UgaWYoYT09PWBsZWZ0YClnPWgodGhpcy5yaWdodCksYj10aGlzLnJpZ2h0LXUsUz1nLW0sdz1oKGUubGVmdCkrbSxFPWUucmlnaHQ7ZWxzZSBpZihhPT09YHJpZ2h0YClnPWgodGhpcy5sZWZ0KSx3PWUubGVmdCxFPWgoZS5yaWdodCktbSxiPWcrbSxTPXRoaXMubGVmdCt1O2Vsc2UgaWYodD09PWB4YCl7aWYoYT09PWBjZW50ZXJgKWc9aCgoZS50b3ArZS5ib3R0b20pLzIrLjUpO2Vsc2UgaWYoRyhhKSl7bGV0IGU9T2JqZWN0LmtleXMoYSlbMF0sdD1hW2VdO2c9aCh0aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpKX1UPWUudG9wLEQ9ZS5ib3R0b20seD1nK20sQz14K3V9ZWxzZSBpZih0PT09YHlgKXtpZihhPT09YGNlbnRlcmApZz1oKChlLmxlZnQrZS5yaWdodCkvMik7ZWxzZSBpZihHKGEpKXtsZXQgZT1PYmplY3Qua2V5cyhhKVswXSx0PWFbZV07Zz1oKHRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCkpfWI9Zy1tLFM9Yi11LHc9ZS5sZWZ0LEU9ZS5yaWdodH1sZXQgTz1xKHIudGlja3MubWF4VGlja3NMaW1pdCxsKSxrPU1hdGgubWF4KDEsTWF0aC5jZWlsKGwvTykpO2ZvcihfPTA7XzxsO18rPWspe2xldCBlPXRoaXMuZ2V0Q29udGV4dChfKSx0PWkuc2V0Q29udGV4dChlKSxyPW8uc2V0Q29udGV4dChlKSxhPXQubGluZVdpZHRoLGw9dC5jb2xvcix1PXIuZGFzaHx8W10sZj1yLmRhc2hPZmZzZXQscD10LnRpY2tXaWR0aCxtPXQudGlja0NvbG9yLGg9dC50aWNrQm9yZGVyRGFzaHx8W10sZz10LnRpY2tCb3JkZXJEYXNoT2Zmc2V0O3Y9RnUodGhpcyxfLHMpLHYhPT12b2lkIDAmJih5PUVzKG4sdixhKSxjP2I9Uz13PUU9eTp4PUM9VD1EPXksZC5wdXNoKHt0eDE6Yix0eTE6eCx0eDI6Uyx0eTI6Qyx4MTp3LHkxOlQseDI6RSx5MjpELHdpZHRoOmEsY29sb3I6bCxib3JkZXJEYXNoOnUsYm9yZGVyRGFzaE9mZnNldDpmLHRpY2tXaWR0aDpwLHRpY2tDb2xvcjptLHRpY2tCb3JkZXJEYXNoOmgsdGlja0JvcmRlckRhc2hPZmZzZXQ6Z30pKX1yZXR1cm4gdGhpcy5fdGlja3NMZW5ndGg9bCx0aGlzLl9ib3JkZXJWYWx1ZT1nLGR9X2NvbXB1dGVMYWJlbEl0ZW1zKGUpe2xldCB0PXRoaXMuYXhpcyxuPXRoaXMub3B0aW9ucyx7cG9zaXRpb246cix0aWNrczppfT1uLGE9dGhpcy5pc0hvcml6b250YWwoKSxvPXRoaXMudGlja3Mse2FsaWduOnMsY3Jvc3NBbGlnbjpjLHBhZGRpbmc6bCxtaXJyb3I6dX09aSxkPUx1KG4uZ3JpZCksZj1kK2wscD11Py1sOmYsbT0tam8odGhpcy5sYWJlbFJvdGF0aW9uKSxoPVtdLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE89YG1pZGRsZWA7aWYocj09PWB0b3BgKXg9dGhpcy5ib3R0b20tcCxTPXRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtlbHNlIGlmKHI9PT1gYm90dG9tYCl4PXRoaXMudG9wK3AsUz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7ZWxzZSBpZihyPT09YGxlZnRgKXtsZXQgZT10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpO1M9ZS50ZXh0QWxpZ24sYj1lLnh9ZWxzZSBpZihyPT09YHJpZ2h0YCl7bGV0IGU9dGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudChkKTtTPWUudGV4dEFsaWduLGI9ZS54fWVsc2UgaWYodD09PWB4YCl7aWYocj09PWBjZW50ZXJgKXg9KGUudG9wK2UuYm90dG9tKS8yK2Y7ZWxzZSBpZihHKHIpKXtsZXQgZT1PYmplY3Qua2V5cyhyKVswXSx0PXJbZV07eD10aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpK2Z9Uz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl9ZWxzZSBpZih0PT09YHlgKXtpZihyPT09YGNlbnRlcmApYj0oZS5sZWZ0K2UucmlnaHQpLzItZjtlbHNlIGlmKEcocikpe2xldCBlPU9iamVjdC5rZXlzKHIpWzBdLHQ9cltlXTtiPXRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCl9Uz10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpLnRleHRBbGlnbn10PT09YHlgJiYocz09PWBzdGFydGA/Tz1gdG9wYDpzPT09YGVuZGAmJihPPWBib3R0b21gKSk7bGV0IGs9dGhpcy5fZ2V0TGFiZWxTaXplcygpO2ZvcihnPTAsXz1vLmxlbmd0aDtnPF87KytnKXt2PW9bZ10seT12LmxhYmVsO2xldCBlPWkuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoZykpO0M9dGhpcy5nZXRQaXhlbEZvclRpY2soZykraS5sYWJlbE9mZnNldCx3PXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZyksVD13LmxpbmVIZWlnaHQsRT1XKHkpP3kubGVuZ3RoOjE7bGV0IHQ9RS8yLG49ZS5jb2xvcixzPWUudGV4dFN0cm9rZUNvbG9yLGw9ZS50ZXh0U3Ryb2tlV2lkdGgsZD1TO2E/KGI9QyxTPT09YGlubmVyYCYmKGQ9Zz09PV8tMT90aGlzLm9wdGlvbnMucmV2ZXJzZT9gbGVmdGA6YHJpZ2h0YDpnPT09MD90aGlzLm9wdGlvbnMucmV2ZXJzZT9gcmlnaHRgOmBsZWZ0YDpgY2VudGVyYCksRD1yPT09YHRvcGA/Yz09PWBuZWFyYHx8bSE9PTA/LUUqVCtULzI6Yz09PWBjZW50ZXJgPy1rLmhpZ2hlc3QuaGVpZ2h0LzItdCpUK1Q6LWsuaGlnaGVzdC5oZWlnaHQrVC8yOmM9PT1gbmVhcmB8fG0hPT0wP1QvMjpjPT09YGNlbnRlcmA/ay5oaWdoZXN0LmhlaWdodC8yLXQqVDprLmhpZ2hlc3QuaGVpZ2h0LUUqVCx1JiYoRCo9LTEpLG0hPT0wJiYhZS5zaG93TGFiZWxCYWNrZHJvcCYmKGIrPVQvMipNYXRoLnNpbihtKSkpOih4PUMsRD0oMS1FKSpULzIpO2xldCBmO2lmKGUuc2hvd0xhYmVsQmFja2Ryb3Ape2xldCB0PVEoZS5iYWNrZHJvcFBhZGRpbmcpLG49ay5oZWlnaHRzW2ddLHI9ay53aWR0aHNbZ10saT1ELXQudG9wLGE9MC10LmxlZnQ7c3dpdGNoKE8pe2Nhc2VgbWlkZGxlYDppLT1uLzI7YnJlYWs7Y2FzZWBib3R0b21gOmktPW59c3dpdGNoKFMpe2Nhc2VgY2VudGVyYDphLT1yLzI7YnJlYWs7Y2FzZWByaWdodGA6YS09cjticmVhaztjYXNlYGlubmVyYDpnPT09Xy0xP2EtPXI6Zz4wJiYoYS09ci8yKX1mPXtsZWZ0OmEsdG9wOmksd2lkdGg6cit0LndpZHRoLGhlaWdodDpuK3QuaGVpZ2h0LGNvbG9yOmUuYmFja2Ryb3BDb2xvcn19aC5wdXNoKHtsYWJlbDp5LGZvbnQ6dyx0ZXh0T2Zmc2V0OkQsb3B0aW9uczp7cm90YXRpb246bSxjb2xvcjpuLHN0cm9rZUNvbG9yOnMsc3Ryb2tlV2lkdGg6bCx0ZXh0QWxpZ246ZCx0ZXh0QmFzZWxpbmU6Tyx0cmFuc2xhdGlvbjpbYix4XSxiYWNrZHJvcDpmfX0pfXJldHVybiBofV9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl7bGV0e3Bvc2l0aW9uOmUsdGlja3M6dH09dGhpcy5vcHRpb25zO2lmKC1qbyh0aGlzLmxhYmVsUm90YXRpb24pKXJldHVybiBlPT09YHRvcGA/YGxlZnRgOmByaWdodGA7bGV0IG49YGNlbnRlcmA7cmV0dXJuIHQuYWxpZ249PT1gc3RhcnRgP249YGxlZnRgOnQuYWxpZ249PT1gZW5kYD9uPWByaWdodGA6dC5hbGlnbj09PWBpbm5lcmAmJihuPWBpbm5lcmApLG59X2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZSl7bGV0e3Bvc2l0aW9uOnQsdGlja3M6e2Nyb3NzQWxpZ246bixtaXJyb3I6cixwYWRkaW5nOml9fT10aGlzLm9wdGlvbnMsYT10aGlzLl9nZXRMYWJlbFNpemVzKCksbz1lK2kscz1hLndpZGVzdC53aWR0aCxjLGw7cmV0dXJuIHQ9PT1gbGVmdGA/cj8obD10aGlzLnJpZ2h0K2ksbj09PWBuZWFyYD9jPWBsZWZ0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbCs9cy8yKTooYz1gcmlnaHRgLGwrPXMpKToobD10aGlzLnJpZ2h0LW8sbj09PWBuZWFyYD9jPWByaWdodGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwtPXMvMik6KGM9YGxlZnRgLGw9dGhpcy5sZWZ0KSk6dD09PWByaWdodGA/cj8obD10aGlzLmxlZnQraSxuPT09YG5lYXJgP2M9YHJpZ2h0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbC09cy8yKTooYz1gbGVmdGAsbC09cykpOihsPXRoaXMubGVmdCtvLG49PT1gbmVhcmA/Yz1gbGVmdGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwrPXMvMik6KGM9YHJpZ2h0YCxsPXRoaXMucmlnaHQpKTpjPWByaWdodGAse3RleHRBbGlnbjpjLHg6bH19X2NvbXB1dGVMYWJlbEFyZWEoKXtpZih0aGlzLm9wdGlvbnMudGlja3MubWlycm9yKXJldHVybjtsZXQgZT10aGlzLmNoYXJ0LHQ9dGhpcy5vcHRpb25zLnBvc2l0aW9uO2lmKHQ9PT1gbGVmdGB8fHQ9PT1gcmlnaHRgKXJldHVybnt0b3A6MCxsZWZ0OnRoaXMubGVmdCxib3R0b206ZS5oZWlnaHQscmlnaHQ6dGhpcy5yaWdodH07aWYodD09PWB0b3BgfHx0PT09YGJvdHRvbWApcmV0dXJue3RvcDp0aGlzLnRvcCxsZWZ0OjAsYm90dG9tOnRoaXMuYm90dG9tLHJpZ2h0OmUud2lkdGh9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2N0eDplLG9wdGlvbnM6e2JhY2tncm91bmRDb2xvcjp0fSxsZWZ0Om4sdG9wOnIsd2lkdGg6aSxoZWlnaHQ6YX09dGhpczt0JiYoZS5zYXZlKCksZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KG4scixpLGEpLGUucmVzdG9yZSgpKX1nZXRMaW5lV2lkdGhGb3JWYWx1ZShlKXtsZXQgdD10aGlzLm9wdGlvbnMuZ3JpZDtpZighdGhpcy5faXNWaXNpYmxlKCl8fCF0LmRpc3BsYXkpcmV0dXJuIDA7bGV0IG49dGhpcy50aWNrcy5maW5kSW5kZXgodD0+dC52YWx1ZT09PWUpO3JldHVybiBuPj0wP3Quc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobikpLmxpbmVXaWR0aDowfWRyYXdHcmlkKGUpe2xldCB0PXRoaXMub3B0aW9ucy5ncmlkLG49dGhpcy5jdHgscj10aGlzLl9ncmlkTGluZUl0ZW1zfHw9dGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXMoZSksaSxhLG89KGUsdCxyKT0+eyFyLndpZHRofHwhci5jb2xvcnx8KG4uc2F2ZSgpLG4ubGluZVdpZHRoPXIud2lkdGgsbi5zdHJva2VTdHlsZT1yLmNvbG9yLG4uc2V0TGluZURhc2goci5ib3JkZXJEYXNofHxbXSksbi5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQsbi5iZWdpblBhdGgoKSxuLm1vdmVUbyhlLngsZS55KSxuLmxpbmVUbyh0LngsdC55KSxuLnN0cm9rZSgpLG4ucmVzdG9yZSgpKX07aWYodC5kaXNwbGF5KWZvcihpPTAsYT1yLmxlbmd0aDtpPGE7KytpKXtsZXQgZT1yW2ldO3QuZHJhd09uQ2hhcnRBcmVhJiZvKHt4OmUueDEseTplLnkxfSx7eDplLngyLHk6ZS55Mn0sZSksdC5kcmF3VGlja3MmJm8oe3g6ZS50eDEseTplLnR5MX0se3g6ZS50eDIseTplLnR5Mn0se2NvbG9yOmUudGlja0NvbG9yLHdpZHRoOmUudGlja1dpZHRoLGJvcmRlckRhc2g6ZS50aWNrQm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OmUudGlja0JvcmRlckRhc2hPZmZzZXR9KX19ZHJhd0JvcmRlcigpe2xldHtjaGFydDplLGN0eDp0LG9wdGlvbnM6e2JvcmRlcjpuLGdyaWQ6cn19PXRoaXMsaT1uLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLGE9bi5kaXNwbGF5P2kud2lkdGg6MDtpZighYSlyZXR1cm47bGV0IG89ci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoLHM9dGhpcy5fYm9yZGVyVmFsdWUsYyxsLHUsZDt0aGlzLmlzSG9yaXpvbnRhbCgpPyhjPUVzKGUsdGhpcy5sZWZ0LGEpLWEvMixsPUVzKGUsdGhpcy5yaWdodCxvKStvLzIsdT1kPXMpOih1PUVzKGUsdGhpcy50b3AsYSktYS8yLGQ9RXMoZSx0aGlzLmJvdHRvbSxvKStvLzIsYz1sPXMpLHQuc2F2ZSgpLHQubGluZVdpZHRoPWkud2lkdGgsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oYyx1KSx0LmxpbmVUbyhsLGQpLHQuc3Ryb2tlKCksdC5yZXN0b3JlKCl9ZHJhd0xhYmVscyhlKXtpZighdGhpcy5vcHRpb25zLnRpY2tzLmRpc3BsYXkpcmV0dXJuO2xldCB0PXRoaXMuY3R4LG49dGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO24mJmpzKHQsbik7bGV0IHI9dGhpcy5nZXRMYWJlbEl0ZW1zKGUpO2ZvcihsZXQgZSBvZiByKXtsZXQgbj1lLm9wdGlvbnMscj1lLmZvbnQsaT1lLmxhYmVsLGE9ZS50ZXh0T2Zmc2V0O0lzKHQsaSwwLGEscixuKX1uJiZNcyh0KX1kcmF3VGl0bGUoKXtsZXR7Y3R4OmUsb3B0aW9uczp7cG9zaXRpb246dCx0aXRsZTpuLHJldmVyc2U6cn19PXRoaXM7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IGk9JChuLmZvbnQpLGE9UShuLnBhZGRpbmcpLG89bi5hbGlnbixzPWkubGluZUhlaWdodC8yO3Q9PT1gYm90dG9tYHx8dD09PWBjZW50ZXJgfHxHKHQpPyhzKz1hLmJvdHRvbSxXKG4udGV4dCkmJihzKz1pLmxpbmVIZWlnaHQqKG4udGV4dC5sZW5ndGgtMSkpKTpzKz1hLnRvcDtsZXR7dGl0bGVYOmMsdGl0bGVZOmwsbWF4V2lkdGg6dSxyb3RhdGlvbjpkfT1IdSh0aGlzLHMsdCxvKTtJcyhlLG4udGV4dCwwLDAsaSx7Y29sb3I6bi5jb2xvcixtYXhXaWR0aDp1LHJvdGF0aW9uOmQsdGV4dEFsaWduOlZ1KG8sdCxyKSx0ZXh0QmFzZWxpbmU6YG1pZGRsZWAsdHJhbnNsYXRpb246W2MsbF19KX1kcmF3KGUpe3RoaXMuX2lzVmlzaWJsZSgpJiYodGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQoZSksdGhpcy5kcmF3Qm9yZGVyKCksdGhpcy5kcmF3VGl0bGUoKSx0aGlzLmRyYXdMYWJlbHMoZSkpfV9sYXllcnMoKXtsZXQgdD10aGlzLm9wdGlvbnMsbj10LnRpY2tzJiZ0LnRpY2tzLnp8fDAscj1xKHQuZ3JpZCYmdC5ncmlkLnosLTEpLGk9cSh0LmJvcmRlciYmdC5ib3JkZXIueiwwKTtyZXR1cm4hdGhpcy5faXNWaXNpYmxlKCl8fHRoaXMuZHJhdyE9PWUucHJvdG90eXBlLmRyYXc/W3t6Om4sZHJhdzplPT57dGhpcy5kcmF3KGUpfX1dOlt7ejpyLGRyYXc6ZT0+e3RoaXMuZHJhd0JhY2tncm91bmQoKSx0aGlzLmRyYXdHcmlkKGUpLHRoaXMuZHJhd1RpdGxlKCl9fSx7ejppLGRyYXc6KCk9Pnt0aGlzLmRyYXdCb3JkZXIoKX19LHt6Om4sZHJhdzplPT57dGhpcy5kcmF3TGFiZWxzKGUpfX1dfWdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKGUpe2xldCB0PXRoaXMuY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLG49dGhpcy5heGlzK2BBeGlzSURgLHI9W10saSxhO2ZvcihpPTAsYT10Lmxlbmd0aDtpPGE7KytpKXtsZXQgYT10W2ldO2Fbbl09PT10aGlzLmlkJiYoIWV8fGEudHlwZT09PWUpJiZyLnB1c2goYSl9cmV0dXJuIHJ9X3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZSl7cmV0dXJuICQodGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGUpKS5mb250KX1fbWF4RGlnaXRzKCl7bGV0IGU9dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5saW5lSGVpZ2h0O3JldHVybih0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGg6dGhpcy5oZWlnaHQpL2V9fSxXdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5zY29wZT10LHRoaXMub3ZlcnJpZGU9bix0aGlzLml0ZW1zPU9iamVjdC5jcmVhdGUobnVsbCl9aXNGb3JUeXBlKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbCh0aGlzLnR5cGUucHJvdG90eXBlLGUucHJvdG90eXBlKX1yZWdpc3RlcihlKXtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSksbjtxdSh0KSYmKG49dGhpcy5yZWdpc3Rlcih0KSk7bGV0IHI9dGhpcy5pdGVtcyxpPWUuaWQsYT10aGlzLnNjb3BlK2AuYCtpO2lmKCFpKXRocm93IEVycm9yKGBjbGFzcyBkb2VzIG5vdCBoYXZlIGlkOiBgK2UpO3JldHVybiBpIGluIHI/YToocltpXT1lLEd1KGUsYSxuKSx0aGlzLm92ZXJyaWRlJiZaLm92ZXJyaWRlKGUuaWQsZS5vdmVycmlkZXMpLGEpfWdldChlKXtyZXR1cm4gdGhpcy5pdGVtc1tlXX11bnJlZ2lzdGVyKGUpe2xldCB0PXRoaXMuaXRlbXMsbj1lLmlkLHI9dGhpcy5zY29wZTtuIGluIHQmJmRlbGV0ZSB0W25dLHImJm4gaW4gWltyXSYmKGRlbGV0ZSBaW3JdW25dLHRoaXMub3ZlcnJpZGUmJmRlbGV0ZSB5c1tuXSl9fTtmdW5jdGlvbiBHdShlLHQsbil7bGV0IHI9cm8oT2JqZWN0LmNyZWF0ZShudWxsKSxbbj9aLmdldChuKTp7fSxaLmdldCh0KSxlLmRlZmF1bHRzXSk7Wi5zZXQodCxyKSxlLmRlZmF1bHRSb3V0ZXMmJkt1KHQsZS5kZWZhdWx0Um91dGVzKSxlLmRlc2NyaXB0b3JzJiZaLmRlc2NyaWJlKHQsZS5kZXNjcmlwdG9ycyl9ZnVuY3Rpb24gS3UoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49PntsZXQgcj1uLnNwbGl0KGAuYCksaT1yLnBvcCgpLGE9W2VdLmNvbmNhdChyKS5qb2luKGAuYCksbz10W25dLnNwbGl0KGAuYCkscz1vLnBvcCgpLGM9by5qb2luKGAuYCk7Wi5yb3V0ZShhLGksYyxzKX0pfWZ1bmN0aW9uIHF1KGUpe3JldHVybmBpZGBpbiBlJiZgZGVmYXVsdHNgaW4gZX12YXIgSnU9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jb250cm9sbGVycz1uZXcgV3UobGwsYGRhdGFzZXRzYCwhMCksdGhpcy5lbGVtZW50cz1uZXcgV3UoQ3UsYGVsZW1lbnRzYCksdGhpcy5wbHVnaW5zPW5ldyBXdShPYmplY3QsYHBsdWdpbnNgKSx0aGlzLnNjYWxlcz1uZXcgV3UoVXUsYHNjYWxlc2ApLHRoaXMuX3R5cGVkUmVnaXN0cmllcz1bdGhpcy5jb250cm9sbGVycyx0aGlzLnNjYWxlcyx0aGlzLmVsZW1lbnRzXX1hZGQoLi4uZSl7dGhpcy5fZWFjaChgcmVnaXN0ZXJgLGUpfXJlbW92ZSguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlKX1hZGRDb250cm9sbGVycyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1hZGRFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmVsZW1lbnRzKX1hZGRQbHVnaW5zKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMucGx1Z2lucyl9YWRkU2NhbGVzKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1nZXRDb250cm9sbGVyKGUpe3JldHVybiB0aGlzLl9nZXQoZSx0aGlzLmNvbnRyb2xsZXJzLGBjb250cm9sbGVyYCl9Z2V0RWxlbWVudChlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5lbGVtZW50cyxgZWxlbWVudGApfWdldFBsdWdpbihlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5wbHVnaW5zLGBwbHVnaW5gKX1nZXRTY2FsZShlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5zY2FsZXMsYHNjYWxlYCl9cmVtb3ZlQ29udHJvbGxlcnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1yZW1vdmVFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuZWxlbWVudHMpfXJlbW92ZVBsdWdpbnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLnBsdWdpbnMpfXJlbW92ZVNjYWxlcyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1fZWFjaChlLHQsbil7Wy4uLnRdLmZvckVhY2godD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTtufHxyLmlzRm9yVHlwZSh0KXx8cj09PXRoaXMucGx1Z2lucyYmdC5pZD90aGlzLl9leGVjKGUscix0KTpZKHQsdD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTt0aGlzLl9leGVjKGUscix0KX0pfSl9X2V4ZWMoZSx0LG4pe2xldCByPXVvKGUpO0oobltgYmVmb3JlYCtyXSxbXSxuKSx0W2VdKG4pLEoobltgYWZ0ZXJgK3JdLFtdLG4pfV9nZXRSZWdpc3RyeUZvclR5cGUoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLl90eXBlZFJlZ2lzdHJpZXMubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5fdHlwZWRSZWdpc3RyaWVzW3RdO2lmKG4uaXNGb3JUeXBlKGUpKXJldHVybiBufXJldHVybiB0aGlzLnBsdWdpbnN9X2dldChlLHQsbil7bGV0IHI9dC5nZXQoZSk7aWYocj09PXZvaWQgMCl0aHJvdyBFcnJvcihgImArZStgIiBpcyBub3QgYSByZWdpc3RlcmVkIGArbitgLmApO3JldHVybiByfX0sWXU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9pbml0PXZvaWQgMH1ub3RpZnkoZSx0LG4scil7aWYodD09PWBiZWZvcmVJbml0YCYmKHRoaXMuX2luaXQ9dGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoZSwhMCksdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsZSxgaW5zdGFsbGApKSx0aGlzLl9pbml0PT09dm9pZCAwKXJldHVybjtsZXQgaT1yP3RoaXMuX2Rlc2NyaXB0b3JzKGUpLmZpbHRlcihyKTp0aGlzLl9kZXNjcmlwdG9ycyhlKSxhPXRoaXMuX25vdGlmeShpLGUsdCxuKTtyZXR1cm4gdD09PWBhZnRlckRlc3Ryb3lgJiYodGhpcy5fbm90aWZ5KGksZSxgc3RvcGApLHRoaXMuX25vdGlmeSh0aGlzLl9pbml0LGUsYHVuaW5zdGFsbGApLHRoaXMuX2luaXQ9dm9pZCAwKSxhfV9ub3RpZnkoZSx0LG4scil7cnx8PXt9O2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1pLnBsdWdpbixhPWVbbl07aWYoSihhLFt0LHIsaS5vcHRpb25zXSxlKT09PSExJiZyLmNhbmNlbGFibGUpcmV0dXJuITF9cmV0dXJuITB9aW52YWxpZGF0ZSgpe1UodGhpcy5fY2FjaGUpfHwodGhpcy5fb2xkQ2FjaGU9dGhpcy5fY2FjaGUsdGhpcy5fY2FjaGU9dm9pZCAwKX1fZGVzY3JpcHRvcnMoZSl7aWYodGhpcy5fY2FjaGUpcmV0dXJuIHRoaXMuX2NhY2hlO2xldCB0PXRoaXMuX2NhY2hlPXRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGUpO3JldHVybiB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXMoZSksdH1fY3JlYXRlRGVzY3JpcHRvcnMoZSx0KXtsZXQgbj1lJiZlLmNvbmZpZyxyPXEobi5vcHRpb25zJiZuLm9wdGlvbnMucGx1Z2lucyx7fSksaT1YdShuKTtyZXR1cm4gcj09PSExJiYhdD9bXTpRdShlLGkscix0KX1fbm90aWZ5U3RhdGVDaGFuZ2VzKGUpe2xldCB0PXRoaXMuX29sZENhY2hlfHxbXSxuPXRoaXMuX2NhY2hlLHI9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5wbHVnaW4uaWQ9PT10LnBsdWdpbi5pZCkpO3RoaXMuX25vdGlmeShyKHQsbiksZSxgc3RvcGApLHRoaXMuX25vdGlmeShyKG4sdCksZSxgc3RhcnRgKX19O2Z1bmN0aW9uIFh1KGUpe2xldCB0PXt9LG49W10scj1PYmplY3Qua2V5cyhKdS5wbHVnaW5zLml0ZW1zKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKyluLnB1c2goSnUuZ2V0UGx1Z2luKHJbZV0pKTtsZXQgaT1lLnBsdWdpbnN8fFtdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgcj1pW2VdO24uaW5kZXhPZihyKT09PS0xJiYobi5wdXNoKHIpLHRbci5pZF09ITApfXJldHVybntwbHVnaW5zOm4sbG9jYWxJZHM6dH19ZnVuY3Rpb24gWnUoZSx0KXtyZXR1cm4hdCYmZT09PSExP251bGw6ZT09PSEwP3t9OmV9ZnVuY3Rpb24gUXUoZSx7cGx1Z2luczp0LGxvY2FsSWRzOm59LHIsaSl7bGV0IGE9W10sbz1lLmdldENvbnRleHQoKTtmb3IobGV0IHMgb2YgdCl7bGV0IHQ9cy5pZCxjPVp1KHJbdF0saSk7YyE9PW51bGwmJmEucHVzaCh7cGx1Z2luOnMsb3B0aW9uczokdShlLmNvbmZpZyx7cGx1Z2luOnMsbG9jYWw6blt0XX0sYyxvKX0pfXJldHVybiBhfWZ1bmN0aW9uICR1KGUse3BsdWdpbjp0LGxvY2FsOm59LHIsaSl7bGV0IGE9ZS5wbHVnaW5TY29wZUtleXModCksbz1lLmdldE9wdGlvblNjb3BlcyhyLGEpO3JldHVybiBuJiZ0LmRlZmF1bHRzJiZvLnB1c2godC5kZWZhdWx0cyksZS5jcmVhdGVSZXNvbHZlcihvLGksW2BgXSx7c2NyaXB0YWJsZTohMSxpbmRleGFibGU6ITEsYWxsS2V5czohMH0pfWZ1bmN0aW9uIGVkKGUsdCl7bGV0IG49Wi5kYXRhc2V0c1tlXXx8e307cmV0dXJuKCh0LmRhdGFzZXRzfHx7fSlbZV18fHt9KS5pbmRleEF4aXN8fHQuaW5kZXhBeGlzfHxuLmluZGV4QXhpc3x8YHhgfWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZTtyZXR1cm4gZT09PWBfaW5kZXhfYD9uPXQ6ZT09PWBfdmFsdWVfYCYmKG49dD09PWB4YD9geWA6YHhgKSxufWZ1bmN0aW9uIG5kKGUsdCl7cmV0dXJuIGU9PT10P2BfaW5kZXhfYDpgX3ZhbHVlX2B9ZnVuY3Rpb24gcmQoZSl7aWYoZT09PWB4YHx8ZT09PWB5YHx8ZT09PWByYClyZXR1cm4gZX1mdW5jdGlvbiBpZChlKXtpZihlPT09YHRvcGB8fGU9PT1gYm90dG9tYClyZXR1cm5geGA7aWYoZT09PWBsZWZ0YHx8ZT09PWByaWdodGApcmV0dXJuYHlgfWZ1bmN0aW9uIGFkKGUsLi4udCl7aWYocmQoZSkpcmV0dXJuIGU7Zm9yKGxldCBuIG9mIHQpe2xldCB0PW4uYXhpc3x8aWQobi5wb3NpdGlvbil8fGUubGVuZ3RoPjEmJnJkKGVbMF0udG9Mb3dlckNhc2UoKSk7aWYodClyZXR1cm4gdH10aHJvdyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke2V9JyBheGlzLiBQbGVhc2UgcHJvdmlkZSAnYXhpcycgb3IgJ3Bvc2l0aW9uJyBvcHRpb24uYCl9ZnVuY3Rpb24gb2QoZSx0LG4pe2lmKG5bdCtgQXhpc0lEYF09PT1lKXJldHVybntheGlzOnR9fWZ1bmN0aW9uIHNkKGUsdCl7aWYodC5kYXRhJiZ0LmRhdGEuZGF0YXNldHMpe2xldCBuPXQuZGF0YS5kYXRhc2V0cy5maWx0ZXIodD0+dC54QXhpc0lEPT09ZXx8dC55QXhpc0lEPT09ZSk7aWYobi5sZW5ndGgpcmV0dXJuIG9kKGUsYHhgLG5bMF0pfHxvZChlLGB5YCxuWzBdKX1yZXR1cm57fX1mdW5jdGlvbiBjZChlLHQpe2xldCBuPXlzW2UudHlwZV18fHtzY2FsZXM6e319LHI9dC5zY2FsZXN8fHt9LGk9ZWQoZS50eXBlLHQpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCh0PT57bGV0IG89clt0XTtpZighRyhvKSlyZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHt0fWApO2lmKG8uX3Byb3h5KXJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHt0fWApO2xldCBzPWFkKHQsbyxzZCh0LGUpLFouc2NhbGVzW28udHlwZV0pLGM9bmQocyxpKSxsPW4uc2NhbGVzfHx7fTthW3RdPWlvKE9iamVjdC5jcmVhdGUobnVsbCksW3theGlzOnN9LG8sbFtzXSxsW2NdXSl9KSxlLmRhdGEuZGF0YXNldHMuZm9yRWFjaChuPT57bGV0IGk9bi50eXBlfHxlLnR5cGUsbz1uLmluZGV4QXhpc3x8ZWQoaSx0KSxzPSh5c1tpXXx8e30pLnNjYWxlc3x8e307T2JqZWN0LmtleXMocykuZm9yRWFjaChlPT57bGV0IHQ9dGQoZSxvKSxpPW5bdCtgQXhpc0lEYF18fHQ7YVtpXT1hW2ldfHxPYmplY3QuY3JlYXRlKG51bGwpLGlvKGFbaV0sW3theGlzOnR9LHJbaV0sc1tlXV0pfSl9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGU9PntsZXQgdD1hW2VdO2lvKHQsW1ouc2NhbGVzW3QudHlwZV0sWi5zY2FsZV0pfSksYX1mdW5jdGlvbiBsZChlKXtsZXQgdD1lLm9wdGlvbnN8fD17fTt0LnBsdWdpbnM9cSh0LnBsdWdpbnMse30pLHQuc2NhbGVzPWNkKGUsdCl9ZnVuY3Rpb24gdWQoZSl7cmV0dXJuIGV8fD17fSxlLmRhdGFzZXRzPWUuZGF0YXNldHN8fFtdLGUubGFiZWxzPWUubGFiZWxzfHxbXSxlfWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlfHw9e30sZS5kYXRhPXVkKGUuZGF0YSksbGQoZSksZX12YXIgZmQ9bmV3IE1hcCxwZD1uZXcgU2V0O2Z1bmN0aW9uIG1kKGUsdCl7bGV0IG49ZmQuZ2V0KGUpO3JldHVybiBufHwobj10KCksZmQuc2V0KGUsbikscGQuYWRkKG4pKSxufXZhciBoZD0oZSx0LG4pPT57bGV0IHI9bG8odCxuKTtyIT09dm9pZCAwJiZlLmFkZChyKX0sZ2Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fY29uZmlnPWRkKGUpLHRoaXMuX3Njb3BlQ2FjaGU9bmV3IE1hcCx0aGlzLl9yZXNvbHZlckNhY2hlPW5ldyBNYXB9Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5wbGF0Zm9ybX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl9jb25maWcudHlwZX1zZXQgdHlwZShlKXt0aGlzLl9jb25maWcudHlwZT1lfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuX2NvbmZpZy5kYXRhPXVkKGUpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuX2NvbmZpZy5vcHRpb25zPWV9Z2V0IHBsdWdpbnMoKXtyZXR1cm4gdGhpcy5fY29uZmlnLnBsdWdpbnN9dXBkYXRlKCl7bGV0IGU9dGhpcy5fY29uZmlnO3RoaXMuY2xlYXJDYWNoZSgpLGxkKGUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9zY29wZUNhY2hlLmNsZWFyKCksdGhpcy5fcmVzb2x2ZXJDYWNoZS5jbGVhcigpfWRhdGFzZXRTY29wZUtleXMoZSl7cmV0dXJuIG1kKGUsKCk9PltbYGRhdGFzZXRzLiR7ZX1gLGBgXV0pfWRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0udHJhbnNpdGlvbi4ke3R9YCwoKT0+W1tgZGF0YXNldHMuJHtlfS50cmFuc2l0aW9ucy4ke3R9YCxgdHJhbnNpdGlvbnMuJHt0fWBdLFtgZGF0YXNldHMuJHtlfWAsYGBdXSl9ZGF0YXNldEVsZW1lbnRTY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0tJHt0fWAsKCk9PltbYGRhdGFzZXRzLiR7ZX0uZWxlbWVudHMuJHt0fWAsYGRhdGFzZXRzLiR7ZX1gLGBlbGVtZW50cy4ke3R9YCxgYF1dKX1wbHVnaW5TY29wZUtleXMoZSl7bGV0IHQ9ZS5pZCxuPXRoaXMudHlwZTtyZXR1cm4gbWQoYCR7bn0tcGx1Z2luLSR7dH1gLCgpPT5bW2BwbHVnaW5zLiR7dH1gLC4uLmUuYWRkaXRpb25hbE9wdGlvblNjb3Blc3x8W11dXSl9X2NhY2hlZFNjb3BlcyhlLHQpe2xldCBuPXRoaXMuX3Njb3BlQ2FjaGUscj1uLmdldChlKTtyZXR1cm4oIXJ8fHQpJiYocj1uZXcgTWFwLG4uc2V0KGUscikpLHJ9Z2V0T3B0aW9uU2NvcGVzKGUsdCxuKXtsZXR7b3B0aW9uczpyLHR5cGU6aX09dGhpcyxhPXRoaXMuX2NhY2hlZFNjb3BlcyhlLG4pLG89YS5nZXQodCk7aWYobylyZXR1cm4gbztsZXQgcz1uZXcgU2V0O3QuZm9yRWFjaCh0PT57ZSYmKHMuYWRkKGUpLHQuZm9yRWFjaCh0PT5oZChzLGUsdCkpKSx0LmZvckVhY2goZT0+aGQocyxyLGUpKSx0LmZvckVhY2goZT0+aGQocyx5c1tpXXx8e30sZSkpLHQuZm9yRWFjaChlPT5oZChzLFosZSkpLHQuZm9yRWFjaChlPT5oZChzLGJzLGUpKX0pO2xldCBjPUFycmF5LmZyb20ocyk7cmV0dXJuIGMubGVuZ3RoPT09MCYmYy5wdXNoKE9iamVjdC5jcmVhdGUobnVsbCkpLHBkLmhhcyh0KSYmYS5zZXQodCxjKSxjfWNoYXJ0T3B0aW9uU2NvcGVzKCl7bGV0e29wdGlvbnM6ZSx0eXBlOnR9PXRoaXM7cmV0dXJuW2UseXNbdF18fHt9LFouZGF0YXNldHNbdF18fHt9LHt0eXBlOnR9LFosYnNdfXJlc29sdmVOYW1lZE9wdGlvbnMoZSx0LG4scj1bYGBdKXtsZXQgaT17JHNoYXJlZDohMH0se3Jlc29sdmVyOmEsc3ViUHJlZml4ZXM6b309X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLHIpLHM9YTtpZih5ZChhLHQpKXtpLiRzaGFyZWQ9ITEsbj1wbyhuKT9uKCk6bjtsZXQgdD10aGlzLmNyZWF0ZVJlc29sdmVyKGUsbixvKTtzPVlzKGEsbix0KX1mb3IobGV0IGUgb2YgdClpW2VdPXNbZV07cmV0dXJuIGl9Y3JlYXRlUmVzb2x2ZXIoZSx0LG49W2BgXSxyKXtsZXR7cmVzb2x2ZXI6aX09X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLG4pO3JldHVybiBHKHQpP1lzKGksdCx2b2lkIDAscik6aX19O2Z1bmN0aW9uIF9kKGUsdCxuKXtsZXQgcj1lLmdldCh0KTtyfHwocj1uZXcgTWFwLGUuc2V0KHQscikpO2xldCBpPW4uam9pbigpLGE9ci5nZXQoaSk7cmV0dXJuIGF8fChhPXtyZXNvbHZlcjpKcyh0LG4pLHN1YlByZWZpeGVzOm4uZmlsdGVyKGU9PiFlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYGhvdmVyYCkpfSxyLnNldChpLGEpKSxhfXZhciB2ZD1lPT5HKGUpJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5zb21lKHQ9PnBvKGVbdF0pKTtmdW5jdGlvbiB5ZChlLHQpe2xldHtpc1NjcmlwdGFibGU6bixpc0luZGV4YWJsZTpyfT1YcyhlKTtmb3IobGV0IGkgb2YgdCl7bGV0IHQ9bihpKSxhPXIoaSksbz0oYXx8dCkmJmVbaV07aWYodCYmKHBvKG8pfHx2ZChvKSl8fGEmJlcobykpcmV0dXJuITB9cmV0dXJuITF9dmFyIGJkPWA0LjUuMWAseGQ9W2B0b3BgLGBib3R0b21gLGBsZWZ0YCxgcmlnaHRgLGBjaGFydEFyZWFgXTtmdW5jdGlvbiBTZChlLHQpe3JldHVybiBlPT09YHRvcGB8fGU9PT1gYm90dG9tYHx8eGQuaW5kZXhPZihlKT09PS0xJiZ0PT09YHhgfWZ1bmN0aW9uIENkKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bZV09PT1yW2VdP25bdF0tclt0XTpuW2VdLXJbZV19fWZ1bmN0aW9uIHdkKGUpe2xldCB0PWUuY2hhcnQsbj10Lm9wdGlvbnMuYW5pbWF0aW9uO3Qubm90aWZ5UGx1Z2lucyhgYWZ0ZXJSZW5kZXJgKSxKKG4mJm4ub25Db21wbGV0ZSxbZV0sdCl9ZnVuY3Rpb24gVGQoZSl7bGV0IHQ9ZS5jaGFydCxuPXQub3B0aW9ucy5hbmltYXRpb247SihuJiZuLm9uUHJvZ3Jlc3MsW2VdLHQpfWZ1bmN0aW9uIEVkKGUpe3JldHVybiBwYygpJiZ0eXBlb2YgZT09YHN0cmluZ2A/ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplJiZlLmxlbmd0aCYmKGU9ZVswXSksZSYmZS5jYW52YXMmJihlPWUuY2FudmFzKSxlfXZhciBEZD17fSxPZD1lPT57bGV0IHQ9RWQoZSk7cmV0dXJuIE9iamVjdC52YWx1ZXMoRGQpLmZpbHRlcihlPT5lLmNhbnZhcz09PXQpLnBvcCgpfTtmdW5jdGlvbiBrZChlLHQsbil7bGV0IHI9T2JqZWN0LmtleXMoZSk7Zm9yKGxldCBpIG9mIHIpe2xldCByPStpO2lmKHI+PXQpe2xldCBhPWVbaV07ZGVsZXRlIGVbaV0sKG4+MHx8cj50KSYmKGVbcituXT1hKX19fWZ1bmN0aW9uIEFkKGUsdCxuLHIpe3JldHVybiFufHxlLnR5cGU9PT1gbW91c2VvdXRgP251bGw6cj90OmV9dmFyIGpkPWNsYXNze3N0YXRpYyBkZWZhdWx0cz1aO3N0YXRpYyBpbnN0YW5jZXM9RGQ7c3RhdGljIG92ZXJyaWRlcz15cztzdGF0aWMgcmVnaXN0cnk9SnU7c3RhdGljIHZlcnNpb249YmQ7c3RhdGljIGdldENoYXJ0PU9kO3N0YXRpYyByZWdpc3RlciguLi5lKXtKdS5hZGQoLi4uZSksTWQoKX1zdGF0aWMgdW5yZWdpc3RlciguLi5lKXtKdS5yZW1vdmUoLi4uZSksTWQoKX1jb25zdHJ1Y3RvcihlLHQpe2xldCBuPXRoaXMuY29uZmlnPW5ldyBnZCh0KSxyPUVkKGUpLGk9T2Qocik7aWYoaSl0aHJvdyBFcnJvcihgQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEICdgK2kuaWQrYCcgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjYW52YXMgd2l0aCBJRCAnYCtpLmNhbnZhcy5pZCtgJyBjYW4gYmUgcmV1c2VkLmApO2xldCBhPW4uY3JlYXRlUmVzb2x2ZXIobi5jaGFydE9wdGlvblNjb3BlcygpLHRoaXMuZ2V0Q29udGV4dCgpKTt0aGlzLnBsYXRmb3JtPW5ldyhuLnBsYXRmb3JtfHwoU3UocikpKSx0aGlzLnBsYXRmb3JtLnVwZGF0ZUNvbmZpZyhuKTtsZXQgbz10aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KHIsYS5hc3BlY3RSYXRpbykscz1vJiZvLmNhbnZhcyxjPXMmJnMuaGVpZ2h0LGw9cyYmcy53aWR0aDtpZih0aGlzLmlkPVhhKCksdGhpcy5jdHg9byx0aGlzLmNhbnZhcz1zLHRoaXMud2lkdGg9bCx0aGlzLmhlaWdodD1jLHRoaXMuX29wdGlvbnM9YSx0aGlzLl9hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHRoaXMuX2xheWVycz1bXSx0aGlzLl9tZXRhc2V0cz1bXSx0aGlzLl9zdGFja3M9dm9pZCAwLHRoaXMuYm94ZXM9W10sdGhpcy5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz12b2lkIDAsdGhpcy5jaGFydEFyZWE9dm9pZCAwLHRoaXMuX2FjdGl2ZT1bXSx0aGlzLl9sYXN0RXZlbnQ9dm9pZCAwLHRoaXMuX2xpc3RlbmVycz17fSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zb3J0ZWRNZXRhc2V0cz1bXSx0aGlzLnNjYWxlcz17fSx0aGlzLl9wbHVnaW5zPW5ldyBZdSx0aGlzLiRwcm94aWVzPXt9LHRoaXMuX2hpZGRlbkluZGljZXM9e30sdGhpcy5hdHRhY2hlZD0hMSx0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQ9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX2RvUmVzaXplPVpvKGU9PnRoaXMudXBkYXRlKGUpLGEucmVzaXplRGVsYXl8fDApLHRoaXMuX2RhdGFDaGFuZ2VzPVtdLERkW3RoaXMuaWRdPXRoaXMsIW98fCFzKXtjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNoYXJ0OiBjYW4ndCBhY3F1aXJlIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gaXRlbWApO3JldHVybn1MYy5saXN0ZW4odGhpcyxgY29tcGxldGVgLHdkKSxMYy5saXN0ZW4odGhpcyxgcHJvZ3Jlc3NgLFRkKSx0aGlzLl9pbml0aWFsaXplKCksdGhpcy5hdHRhY2hlZCYmdGhpcy51cGRhdGUoKX1nZXQgYXNwZWN0UmF0aW8oKXtsZXR7b3B0aW9uczp7YXNwZWN0UmF0aW86ZSxtYWludGFpbkFzcGVjdFJhdGlvOnR9LHdpZHRoOm4saGVpZ2h0OnIsX2FzcGVjdFJhdGlvOml9PXRoaXM7cmV0dXJuIFUoZSk/dCYmaT9pOnI/bi9yOm51bGw6ZX1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmNvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuY29uZmlnLmRhdGE9ZX1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuY29uZmlnLm9wdGlvbnM9ZX1nZXQgcmVnaXN0cnkoKXtyZXR1cm4gSnV9X2luaXRpYWxpemUoKXtyZXR1cm4gdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVJbml0YCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5yZXNpemUoKTpFYyh0aGlzLHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmJpbmRFdmVudHMoKSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVySW5pdGApLHRoaXN9Y2xlYXIoKXtyZXR1cm4gRHModGhpcy5jYW52YXMsdGhpcy5jdHgpLHRoaXN9c3RvcCgpe3JldHVybiBMYy5zdG9wKHRoaXMpLHRoaXN9cmVzaXplKGUsdCl7TGMucnVubmluZyh0aGlzKT90aGlzLl9yZXNpemVCZWZvcmVEcmF3PXt3aWR0aDplLGhlaWdodDp0fTp0aGlzLl9yZXNpemUoZSx0KX1fcmVzaXplKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLHI9dGhpcy5jYW52YXMsaT1uLm1haW50YWluQXNwZWN0UmF0aW8mJnRoaXMuYXNwZWN0UmF0aW8sYT10aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKHIsZSx0LGkpLG89bi5kZXZpY2VQaXhlbFJhdGlvfHx0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKSxzPXRoaXMud2lkdGg/YHJlc2l6ZWA6YGF0dGFjaGA7dGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuX2FzcGVjdFJhdGlvPXRoaXMuYXNwZWN0UmF0aW8sRWModGhpcyxvLCEwKSYmKHRoaXMubm90aWZ5UGx1Z2lucyhgcmVzaXplYCx7c2l6ZTphfSksSihuLm9uUmVzaXplLFt0aGlzLGFdLHRoaXMpLHRoaXMuYXR0YWNoZWQmJnRoaXMuX2RvUmVzaXplKHMpJiZ0aGlzLnJlbmRlcigpKX1lbnN1cmVTY2FsZXNIYXZlSURzKCl7WSh0aGlzLm9wdGlvbnMuc2NhbGVzfHx7fSwoZSx0KT0+e2UuaWQ9dH0pfWJ1aWxkT3JVcGRhdGVTY2FsZXMoKXtsZXQgZT10aGlzLm9wdGlvbnMsdD1lLnNjYWxlcyxuPXRoaXMuc2NhbGVzLHI9T2JqZWN0LmtleXMobikucmVkdWNlKChlLHQpPT4oZVt0XT0hMSxlKSx7fSksaT1bXTt0JiYoaT1pLmNvbmNhdChPYmplY3Qua2V5cyh0KS5tYXAoZT0+e2xldCBuPXRbZV0scj1hZChlLG4pLGk9cj09PWByYCxhPXI9PT1geGA7cmV0dXJue29wdGlvbnM6bixkcG9zaXRpb246aT9gY2hhcnRBcmVhYDphP2Bib3R0b21gOmBsZWZ0YCxkdHlwZTppP2ByYWRpYWxMaW5lYXJgOmE/YGNhdGVnb3J5YDpgbGluZWFyYH19KSkpLFkoaSx0PT57bGV0IGk9dC5vcHRpb25zLGE9aS5pZCxvPWFkKGEsaSkscz1xKGkudHlwZSx0LmR0eXBlKTsoaS5wb3NpdGlvbj09PXZvaWQgMHx8U2QoaS5wb3NpdGlvbixvKSE9PVNkKHQuZHBvc2l0aW9uKSkmJihpLnBvc2l0aW9uPXQuZHBvc2l0aW9uKSxyW2FdPSEwO2xldCBjPW51bGw7YSBpbiBuJiZuW2FdLnR5cGU9PT1zP2M9blthXTooYz1uZXcoSnUuZ2V0U2NhbGUocykpKHtpZDphLHR5cGU6cyxjdHg6dGhpcy5jdHgsY2hhcnQ6dGhpc30pLG5bYy5pZF09YyksYy5pbml0KGksZSl9KSxZKHIsKGUsdCk9PntlfHxkZWxldGUgblt0XX0pLFkobixlPT57JGwuY29uZmlndXJlKHRoaXMsZSxlLm9wdGlvbnMpLCRsLmFkZEJveCh0aGlzLGUpfSl9X3VwZGF0ZU1ldGFzZXRzKCl7bGV0IGU9dGhpcy5fbWV0YXNldHMsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49ZS5sZW5ndGg7aWYoZS5zb3J0KChlLHQpPT5lLmluZGV4LXQuaW5kZXgpLG4+dCl7Zm9yKGxldCBlPXQ7ZTxuOysrZSl0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoZSk7ZS5zcGxpY2UodCxuLXQpfXRoaXMuX3NvcnRlZE1ldGFzZXRzPWUuc2xpY2UoMCkuc29ydChDZChgb3JkZXJgLGBpbmRleGApKX1fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKXtsZXR7X21ldGFzZXRzOmUsZGF0YTp7ZGF0YXNldHM6dH19PXRoaXM7ZS5sZW5ndGg+dC5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9zdGFja3MsZS5mb3JFYWNoKChlLG4pPT57dC5maWx0ZXIodD0+dD09PWUuX2RhdGFzZXQpLmxlbmd0aD09PTAmJnRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShuKX0pfWJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpe2xldCBlPVtdLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLG4scjtmb3IodGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtsZXQgcj10W25dLGk9dGhpcy5nZXREYXRhc2V0TWV0YShuKSxhPXIudHlwZXx8dGhpcy5jb25maWcudHlwZTtpZihpLnR5cGUmJmkudHlwZSE9PWEmJih0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEobiksaT10aGlzLmdldERhdGFzZXRNZXRhKG4pKSxpLnR5cGU9YSxpLmluZGV4QXhpcz1yLmluZGV4QXhpc3x8ZWQoYSx0aGlzLm9wdGlvbnMpLGkub3JkZXI9ci5vcmRlcnx8MCxpLmluZGV4PW4saS5sYWJlbD1gYCtyLmxhYmVsLGkudmlzaWJsZT10aGlzLmlzRGF0YXNldFZpc2libGUobiksaS5jb250cm9sbGVyKWkuY29udHJvbGxlci51cGRhdGVJbmRleChuKSxpLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO2Vsc2V7bGV0IHQ9SnUuZ2V0Q29udHJvbGxlcihhKSx7ZGF0YXNldEVsZW1lbnRUeXBlOnIsZGF0YUVsZW1lbnRUeXBlOm99PVouZGF0YXNldHNbYV07T2JqZWN0LmFzc2lnbih0LHtkYXRhRWxlbWVudFR5cGU6SnUuZ2V0RWxlbWVudChvKSxkYXRhc2V0RWxlbWVudFR5cGU6ciYmSnUuZ2V0RWxlbWVudChyKX0pLGkuY29udHJvbGxlcj1uZXcgdCh0aGlzLG4pLGUucHVzaChpLmNvbnRyb2xsZXIpfX1yZXR1cm4gdGhpcy5fdXBkYXRlTWV0YXNldHMoKSxlfV9yZXNldEVsZW1lbnRzKCl7WSh0aGlzLmRhdGEuZGF0YXNldHMsKGUsdCk9Pnt0aGlzLmdldERhdGFzZXRNZXRhKHQpLmNvbnRyb2xsZXIucmVzZXQoKX0sdGhpcyl9cmVzZXQoKXt0aGlzLl9yZXNldEVsZW1lbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKGByZXNldGApfXVwZGF0ZShlKXtsZXQgdD10aGlzLmNvbmZpZzt0LnVwZGF0ZSgpO2xldCBuPXRoaXMuX29wdGlvbnM9dC5jcmVhdGVSZXNvbHZlcih0LmNoYXJ0T3B0aW9uU2NvcGVzKCksdGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSFuLmFuaW1hdGlvbjtpZih0aGlzLl91cGRhdGVTY2FsZXMoKSx0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKSx0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCksdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCksdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVVcGRhdGVgLHttb2RlOmUsY2FuY2VsYWJsZTohMH0pPT09ITEpcmV0dXJuO2xldCBpPXRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVFbGVtZW50c1VwZGF0ZWApO2xldCBhPTA7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDtlKyspe2xldHtjb250cm9sbGVyOnR9PXRoaXMuZ2V0RGF0YXNldE1ldGEoZSksbj0hciYmaS5pbmRleE9mKHQpPT09LTE7dC5idWlsZE9yVXBkYXRlRWxlbWVudHMobiksYT1NYXRoLm1heCgrdC5nZXRNYXhPdmVyZmxvdygpLGEpfWE9dGhpcy5fbWluUGFkZGluZz1uLmxheW91dC5hdXRvUGFkZGluZz9hOjAsdGhpcy5fdXBkYXRlTGF5b3V0KGEpLHJ8fFkoaSxlPT57ZS5yZXNldCgpfSksdGhpcy5fdXBkYXRlRGF0YXNldHMoZSksdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlclVwZGF0ZWAse21vZGU6ZX0pLHRoaXMuX2xheWVycy5zb3J0KENkKGB6YCxgX2lkeGApKTtsZXR7X2FjdGl2ZTpvLF9sYXN0RXZlbnQ6c309dGhpcztzP3RoaXMuX2V2ZW50SGFuZGxlcihzLCEwKTpvLmxlbmd0aCYmdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMobyxvLCEwKSx0aGlzLnJlbmRlcigpfV91cGRhdGVTY2FsZXMoKXtZKHRoaXMuc2NhbGVzLGU9PnskbC5yZW1vdmVCb3godGhpcyxlKX0pLHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpLHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpfV9jaGVja0V2ZW50QmluZGluZ3MoKXtsZXQgZT10aGlzLm9wdGlvbnM7KCFtbyhuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpLG5ldyBTZXQoZS5ldmVudHMpKXx8ISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzIT09ZS5yZXNwb25zaXZlKSYmKHRoaXMudW5iaW5kRXZlbnRzKCksdGhpcy5iaW5kRXZlbnRzKCkpfV91cGRhdGVIaWRkZW5JbmRpY2VzKCl7bGV0e19oaWRkZW5JbmRpY2VzOmV9PXRoaXMsdD10aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXx8W107Zm9yKGxldHttZXRob2Q6bixzdGFydDpyLGNvdW50Oml9b2YgdClrZChlLHIsbj09PWBfcmVtb3ZlRWxlbWVudHNgPy1pOmkpfV9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXtsZXQgZT10aGlzLl9kYXRhQ2hhbmdlcztpZighZXx8IWUubGVuZ3RoKXJldHVybjt0aGlzLl9kYXRhQ2hhbmdlcz1bXTtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49dD0+bmV3IFNldChlLmZpbHRlcihlPT5lWzBdPT09dCkubWFwKChlLHQpPT50K2AsYCtlLnNwbGljZSgxKS5qb2luKGAsYCkpKSxyPW4oMCk7Zm9yKGxldCBlPTE7ZTx0O2UrKylpZighbW8ocixuKGUpKSlyZXR1cm47cmV0dXJuIEFycmF5LmZyb20ocikubWFwKGU9PmUuc3BsaXQoYCxgKSkubWFwKGU9Pih7bWV0aG9kOmVbMV0sc3RhcnQ6K2VbMl0sY291bnQ6K2VbM119KSl9X3VwZGF0ZUxheW91dChlKXtpZih0aGlzLm5vdGlmeVBsdWdpbnMoYGJlZm9yZUxheW91dGAse2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjskbC51cGRhdGUodGhpcyx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LGUpO2xldCB0PXRoaXMuY2hhcnRBcmVhLG49dC53aWR0aDw9MHx8dC5oZWlnaHQ8PTA7dGhpcy5fbGF5ZXJzPVtdLFkodGhpcy5ib3hlcyxlPT57biYmZS5wb3NpdGlvbj09PWBjaGFydEFyZWFgfHwoZS5jb25maWd1cmUmJmUuY29uZmlndXJlKCksdGhpcy5fbGF5ZXJzLnB1c2goLi4uZS5fbGF5ZXJzKCkpKX0sdGhpcyksdGhpcy5fbGF5ZXJzLmZvckVhY2goKGUsdCk9PntlLl9pZHg9dH0pLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJMYXlvdXRgKX1fdXBkYXRlRGF0YXNldHMoZSl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZSxjYW5jZWxhYmxlOiEwfSkhPT0hMSl7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDsrK2UpdGhpcy5nZXREYXRhc2V0TWV0YShlKS5jb250cm9sbGVyLmNvbmZpZ3VyZSgpO2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDt0PG47Kyt0KXRoaXMuX3VwZGF0ZURhdGFzZXQodCxwbyhlKT9lKHtkYXRhc2V0SW5kZXg6dH0pOmUpO3RoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZX0pfX1fdXBkYXRlRGF0YXNldChlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSkscj17bWV0YTpuLGluZGV4OmUsbW9kZTp0LGNhbmNlbGFibGU6ITB9O3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRGF0YXNldFVwZGF0ZWAscikhPT0hMSYmKG4uY29udHJvbGxlci5fdXBkYXRlKHQpLHIuY2FuY2VsYWJsZT0hMSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVyRGF0YXNldFVwZGF0ZWAscikpfXJlbmRlcigpe3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlUmVuZGVyYCx7Y2FuY2VsYWJsZTohMH0pIT09ITEmJihMYy5oYXModGhpcyk/dGhpcy5hdHRhY2hlZCYmIUxjLnJ1bm5pbmcodGhpcykmJkxjLnN0YXJ0KHRoaXMpOih0aGlzLmRyYXcoKSx3ZCh7Y2hhcnQ6dGhpc30pKSl9ZHJhdygpe2xldCBlO2lmKHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcpe2xldHt3aWR0aDplLGhlaWdodDp0fT10aGlzLl9yZXNpemVCZWZvcmVEcmF3O3RoaXMuX3Jlc2l6ZUJlZm9yZURyYXc9bnVsbCx0aGlzLl9yZXNpemUoZSx0KX1pZih0aGlzLmNsZWFyKCksdGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTB8fHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRHJhd2Ase2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjtsZXQgdD10aGlzLl9sYXllcnM7Zm9yKGU9MDtlPHQubGVuZ3RoJiZ0W2VdLno8PTA7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7Zm9yKHRoaXMuX2RyYXdEYXRhc2V0cygpO2U8dC5sZW5ndGg7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRyYXdgKX1fZ2V0U29ydGVkRGF0YXNldE1ldGFzKGUpe2xldCB0PXRoaXMuX3NvcnRlZE1ldGFzZXRzLG49W10scixpO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKXtsZXQgaT10W3JdOyghZXx8aS52aXNpYmxlKSYmbi5wdXNoKGkpfXJldHVybiBufWdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKXtyZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCEwKX1fZHJhd0RhdGFzZXRzKCl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c0RyYXdgLHtjYW5jZWxhYmxlOiEwfSk9PT0hMSlyZXR1cm47bGV0IGU9dGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5fZHJhd0RhdGFzZXQoZVt0XSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXRzRHJhd2ApfV9kcmF3RGF0YXNldChlKXtsZXQgdD10aGlzLmN0eCxuPXttZXRhOmUsaW5kZXg6ZS5pbmRleCxjYW5jZWxhYmxlOiEwfSxyPUljKHRoaXMsZSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0RHJhd2AsbikhPT0hMSYmKHImJmpzKHQsciksZS5jb250cm9sbGVyLmRyYXcoKSxyJiZNcyh0KSxuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXREcmF3YCxuKSl9aXNQb2ludEluQXJlYShlKXtyZXR1cm4gQXMoZSx0aGlzLmNoYXJ0QXJlYSx0aGlzLl9taW5QYWRkaW5nKX1nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsdCxuLHIpe2xldCBpPUlsLm1vZGVzW3RdO3JldHVybiB0eXBlb2YgaT09YGZ1bmN0aW9uYD9pKHRoaXMsZSxuLHIpOltdfWdldERhdGFzZXRNZXRhKGUpe2xldCB0PXRoaXMuZGF0YS5kYXRhc2V0c1tlXSxuPXRoaXMuX21ldGFzZXRzLHI9bi5maWx0ZXIoZT0+ZSYmZS5fZGF0YXNldD09PXQpLnBvcCgpO3JldHVybiByfHwocj17dHlwZTpudWxsLGRhdGE6W10sZGF0YXNldDpudWxsLGNvbnRyb2xsZXI6bnVsbCxoaWRkZW46bnVsbCx4QXhpc0lEOm51bGwseUF4aXNJRDpudWxsLG9yZGVyOnQmJnQub3JkZXJ8fDAsaW5kZXg6ZSxfZGF0YXNldDp0LF9wYXJzZWQ6W10sX3NvcnRlZDohMX0sbi5wdXNoKHIpKSxyfWdldENvbnRleHQoKXtyZXR1cm4gdGhpcy4kY29udGV4dHx8PXFzKG51bGwse2NoYXJ0OnRoaXMsdHlwZTpgY2hhcnRgfSl9Z2V0VmlzaWJsZURhdGFzZXRDb3VudCgpe3JldHVybiB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5sZW5ndGh9aXNEYXRhc2V0VmlzaWJsZShlKXtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHNbZV07aWYoIXQpcmV0dXJuITE7bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtyZXR1cm4gdHlwZW9mIG4uaGlkZGVuPT1gYm9vbGVhbmA/IW4uaGlkZGVuOiF0LmhpZGRlbn1zZXREYXRhc2V0VmlzaWJpbGl0eShlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSk7bi5oaWRkZW49IXR9dG9nZ2xlRGF0YVZpc2liaWxpdHkoZSl7dGhpcy5faGlkZGVuSW5kaWNlc1tlXT0hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1nZXREYXRhVmlzaWJpbGl0eShlKXtyZXR1cm4hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1fdXBkYXRlVmlzaWJpbGl0eShlLHQsbil7bGV0IHI9bj9gc2hvd2A6YGhpZGVgLGk9dGhpcy5nZXREYXRhc2V0TWV0YShlKSxhPWkuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModm9pZCAwLHIpO2ZvKHQpPyhpLmRhdGFbdF0uaGlkZGVuPSFuLHRoaXMudXBkYXRlKCkpOih0aGlzLnNldERhdGFzZXRWaXNpYmlsaXR5KGUsbiksYS51cGRhdGUoaSx7dmlzaWJsZTpufSksdGhpcy51cGRhdGUodD0+dC5kYXRhc2V0SW5kZXg9PT1lP3I6dm9pZCAwKSl9aGlkZShlLHQpe3RoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZSx0LCExKX1zaG93KGUsdCl7dGhpcy5fdXBkYXRlVmlzaWJpbGl0eShlLHQsITApfV9kZXN0cm95RGF0YXNldE1ldGEoZSl7bGV0IHQ9dGhpcy5fbWV0YXNldHNbZV07dCYmdC5jb250cm9sbGVyJiZ0LmNvbnRyb2xsZXIuX2Rlc3Ryb3koKSxkZWxldGUgdGhpcy5fbWV0YXNldHNbZV19X3N0b3AoKXtsZXQgZSx0O2Zvcih0aGlzLnN0b3AoKSxMYy5yZW1vdmUodGhpcyksZT0wLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtlPHQ7KytlKXRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShlKX1kZXN0cm95KCl7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEZXN0cm95YCk7bGV0e2NhbnZhczplLGN0eDp0fT10aGlzO3RoaXMuX3N0b3AoKSx0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCksZSYmKHRoaXMudW5iaW5kRXZlbnRzKCksRHMoZSx0KSx0aGlzLnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0KHQpLHRoaXMuY2FudmFzPW51bGwsdGhpcy5jdHg9bnVsbCksZGVsZXRlIERkW3RoaXMuaWRdLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEZXN0cm95YCl9dG9CYXNlNjRJbWFnZSguLi5lKXtyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmUpfWJpbmRFdmVudHMoKXt0aGlzLmJpbmRVc2VyRXZlbnRzKCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpOnRoaXMuYXR0YWNoZWQ9ITB9YmluZFVzZXJFdmVudHMoKXtsZXQgZT10aGlzLl9saXN0ZW5lcnMsdD10aGlzLnBsYXRmb3JtLG49KG4scik9Pnt0LmFkZEV2ZW50TGlzdGVuZXIodGhpcyxuLHIpLGVbbl09cn0scj0oZSx0LG4pPT57ZS5vZmZzZXRYPXQsZS5vZmZzZXRZPW4sdGhpcy5fZXZlbnRIYW5kbGVyKGUpfTtZKHRoaXMub3B0aW9ucy5ldmVudHMsZT0+bihlLHIpKX1iaW5kUmVzcG9uc2l2ZUV2ZW50cygpe3RoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnN8fD17fTtsZXQgZT10aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLHQ9dGhpcy5wbGF0Zm9ybSxuPShuLHIpPT57dC5hZGRFdmVudExpc3RlbmVyKHRoaXMsbixyKSxlW25dPXJ9LHI9KG4scik9PntlW25dJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsbixyKSxkZWxldGUgZVtuXSl9LGk9KGUsdCk9Pnt0aGlzLmNhbnZhcyYmdGhpcy5yZXNpemUoZSx0KX0sYSxvPSgpPT57cihgYXR0YWNoYCxvKSx0aGlzLmF0dGFjaGVkPSEwLHRoaXMucmVzaXplKCksbihgcmVzaXplYCxpKSxuKGBkZXRhY2hgLGEpfTthPSgpPT57dGhpcy5hdHRhY2hlZD0hMSxyKGByZXNpemVgLGkpLHRoaXMuX3N0b3AoKSx0aGlzLl9yZXNpemUoMCwwKSxuKGBhdHRhY2hgLG8pfSx0LmlzQXR0YWNoZWQodGhpcy5jYW52YXMpP28oKTphKCl9dW5iaW5kRXZlbnRzKCl7WSh0aGlzLl9saXN0ZW5lcnMsKGUsdCk9Pnt0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyx0LGUpfSksdGhpcy5fbGlzdGVuZXJzPXt9LFkodGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycywoZSx0KT0+e3RoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLHQsZSl9KSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMH11cGRhdGVIb3ZlclN0eWxlKGUsdCxuKXtsZXQgcj1uP2BzZXRgOmByZW1vdmVgLGksYSxvLHM7Zm9yKHQ9PT1gZGF0YXNldGAmJihpPXRoaXMuZ2V0RGF0YXNldE1ldGEoZVswXS5kYXRhc2V0SW5kZXgpLGkuY29udHJvbGxlcltgX2ArcitgRGF0YXNldEhvdmVyU3R5bGVgXSgpKSxvPTAscz1lLmxlbmd0aDtvPHM7KytvKXthPWVbb107bGV0IHQ9YSYmdGhpcy5nZXREYXRhc2V0TWV0YShhLmRhdGFzZXRJbmRleCkuY29udHJvbGxlcjt0JiZ0W3IrYEhvdmVyU3R5bGVgXShhLmVsZW1lbnQsYS5kYXRhc2V0SW5kZXgsYS5pbmRleCl9fWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSl7bGV0IHQ9dGhpcy5fYWN0aXZlfHxbXSxuPWUubWFwKCh7ZGF0YXNldEluZGV4OmUsaW5kZXg6dH0pPT57bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtpZighbil0aHJvdyBFcnJvcihgTm8gZGF0YXNldCBmb3VuZCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pOyRhKG4sdCl8fCh0aGlzLl9hY3RpdmU9bix0aGlzLl9sYXN0RXZlbnQ9bnVsbCx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhuLHQpKX1ub3RpZnlQbHVnaW5zKGUsdCxuKXtyZXR1cm4gdGhpcy5fcGx1Z2lucy5ub3RpZnkodGhpcyxlLHQsbil9aXNQbHVnaW5FbmFibGVkKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIodD0+dC5wbHVnaW4uaWQ9PT1lKS5sZW5ndGg9PT0xfV91cGRhdGVIb3ZlclN0eWxlcyhlLHQsbil7bGV0IHI9dGhpcy5vcHRpb25zLmhvdmVyLGk9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgpKSxhPWkodCxlKSxvPW4/ZTppKGUsdCk7YS5sZW5ndGgmJnRoaXMudXBkYXRlSG92ZXJTdHlsZShhLHIubW9kZSwhMSksby5sZW5ndGgmJnIubW9kZSYmdGhpcy51cGRhdGVIb3ZlclN0eWxlKG8sci5tb2RlLCEwKX1fZXZlbnRIYW5kbGVyKGUsdCl7bGV0IG49e2V2ZW50OmUscmVwbGF5OnQsY2FuY2VsYWJsZTohMCxpbkNoYXJ0QXJlYTp0aGlzLmlzUG9pbnRJbkFyZWEoZSl9LHI9dD0+KHQub3B0aW9ucy5ldmVudHN8fHRoaXMub3B0aW9ucy5ldmVudHMpLmluY2x1ZGVzKGUubmF0aXZlLnR5cGUpO2lmKHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRXZlbnRgLG4scik9PT0hMSlyZXR1cm47bGV0IGk9dGhpcy5faGFuZGxlRXZlbnQoZSx0LG4uaW5DaGFydEFyZWEpO3JldHVybiBuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckV2ZW50YCxuLHIpLChpfHxuLmNoYW5nZWQpJiZ0aGlzLnJlbmRlcigpLHRoaXN9X2hhbmRsZUV2ZW50KGUsdCxuKXtsZXR7X2FjdGl2ZTpyPVtdLG9wdGlvbnM6aX09dGhpcyxhPXQsbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLHIsbixhKSxzPWhvKGUpLGM9QWQoZSx0aGlzLl9sYXN0RXZlbnQsbixzKTtuJiYodGhpcy5fbGFzdEV2ZW50PW51bGwsSihpLm9uSG92ZXIsW2Usbyx0aGlzXSx0aGlzKSxzJiZKKGkub25DbGljayxbZSxvLHRoaXNdLHRoaXMpKTtsZXQgbD0hJGEobyxyKTtyZXR1cm4obHx8dCkmJih0aGlzLl9hY3RpdmU9byx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhvLHIsdCkpLHRoaXMuX2xhc3RFdmVudD1jLGx9X2dldEFjdGl2ZUVsZW1lbnRzKGUsdCxuLHIpe2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIW4pcmV0dXJuIHQ7bGV0IGk9dGhpcy5vcHRpb25zLmhvdmVyO3JldHVybiB0aGlzLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxyKX19O2Z1bmN0aW9uIE1kKCl7cmV0dXJuIFkoamQuaW5zdGFuY2VzLGU9PmUuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKX1mdW5jdGlvbiBOZChlLHQpe2xldHt4Om4seTpyLGJhc2U6aSx3aWR0aDphLGhlaWdodDpvfT1lLmdldFByb3BzKFtgeGAsYHlgLGBiYXNlYCxgd2lkdGhgLGBoZWlnaHRgXSx0KSxzLGMsbCx1LGQ7cmV0dXJuIGUuaG9yaXpvbnRhbD8oZD1vLzIscz1NYXRoLm1pbihuLGkpLGM9TWF0aC5tYXgobixpKSxsPXItZCx1PXIrZCk6KGQ9YS8yLHM9bi1kLGM9bitkLGw9TWF0aC5taW4ocixpKSx1PU1hdGgubWF4KHIsaSkpLHtsZWZ0OnMsdG9wOmwscmlnaHQ6Yyxib3R0b206dX19ZnVuY3Rpb24gUGQoZSx0LG4scil7cmV0dXJuIGU/MDpSbyh0LG4scil9ZnVuY3Rpb24gRmQoZSx0LG4pe2xldCByPWUub3B0aW9ucy5ib3JkZXJXaWR0aCxpPWUuYm9yZGVyU2tpcHBlZCxhPVVzKHIpO3JldHVybnt0OlBkKGkudG9wLGEudG9wLDAsbikscjpQZChpLnJpZ2h0LGEucmlnaHQsMCx0KSxiOlBkKGkuYm90dG9tLGEuYm90dG9tLDAsbiksbDpQZChpLmxlZnQsYS5sZWZ0LDAsdCl9fWZ1bmN0aW9uIElkKGUsdCxuKXtsZXR7ZW5hYmxlQm9yZGVyUmFkaXVzOnJ9PWUuZ2V0UHJvcHMoW2BlbmFibGVCb3JkZXJSYWRpdXNgXSksaT1lLm9wdGlvbnMuYm9yZGVyUmFkaXVzLGE9V3MoaSksbz1NYXRoLm1pbih0LG4pLHM9ZS5ib3JkZXJTa2lwcGVkLGM9cnx8RyhpKTtyZXR1cm57dG9wTGVmdDpQZCghY3x8cy50b3B8fHMubGVmdCxhLnRvcExlZnQsMCxvKSx0b3BSaWdodDpQZCghY3x8cy50b3B8fHMucmlnaHQsYS50b3BSaWdodCwwLG8pLGJvdHRvbUxlZnQ6UGQoIWN8fHMuYm90dG9tfHxzLmxlZnQsYS5ib3R0b21MZWZ0LDAsbyksYm90dG9tUmlnaHQ6UGQoIWN8fHMuYm90dG9tfHxzLnJpZ2h0LGEuYm90dG9tUmlnaHQsMCxvKX19ZnVuY3Rpb24gTGQoZSl7bGV0IHQ9TmQoZSksbj10LnJpZ2h0LXQubGVmdCxyPXQuYm90dG9tLXQudG9wLGk9RmQoZSxuLzIsci8yKSxhPUlkKGUsbi8yLHIvMik7cmV0dXJue291dGVyOnt4OnQubGVmdCx5OnQudG9wLHc6bixoOnIscmFkaXVzOmF9LGlubmVyOnt4OnQubGVmdCtpLmwseTp0LnRvcCtpLnQsdzpuLWkubC1pLnIsaDpyLWkudC1pLmIscmFkaXVzOnt0b3BMZWZ0Ok1hdGgubWF4KDAsYS50b3BMZWZ0LU1hdGgubWF4KGkudCxpLmwpKSx0b3BSaWdodDpNYXRoLm1heCgwLGEudG9wUmlnaHQtTWF0aC5tYXgoaS50LGkucikpLGJvdHRvbUxlZnQ6TWF0aC5tYXgoMCxhLmJvdHRvbUxlZnQtTWF0aC5tYXgoaS5iLGkubCkpLGJvdHRvbVJpZ2h0Ok1hdGgubWF4KDAsYS5ib3R0b21SaWdodC1NYXRoLm1heChpLmIsaS5yKSl9fX19ZnVuY3Rpb24gUmQoZSx0LG4scil7bGV0IGk9dD09PW51bGwsYT1uPT09bnVsbCxvPWUmJiEoaSYmYSkmJk5kKGUscik7cmV0dXJuIG8mJihpfHxCbyh0LG8ubGVmdCxvLnJpZ2h0KSkmJihhfHxCbyhuLG8udG9wLG8uYm90dG9tKSl9ZnVuY3Rpb24gemQoZSl7cmV0dXJuIGUudG9wTGVmdHx8ZS50b3BSaWdodHx8ZS5ib3R0b21MZWZ0fHxlLmJvdHRvbVJpZ2h0fWZ1bmN0aW9uIEJkKGUsdCl7ZS5yZWN0KHQueCx0LnksdC53LHQuaCl9ZnVuY3Rpb24gVmQoZSx0LG49e30pe2xldCByPWUueD09PW4ueD8wOi10LGk9ZS55PT09bi55PzA6LXQsYT0oZS54K2Uudz09PW4ueCtuLnc/MDp0KS1yLG89KGUueStlLmg9PT1uLnkrbi5oPzA6dCktaTtyZXR1cm57eDplLngrcix5OmUueStpLHc6ZS53K2EsaDplLmgrbyxyYWRpdXM6ZS5yYWRpdXN9fXZhciBIZD1jbGFzcyBleHRlbmRzIEN1e3N0YXRpYyBpZD1gYmFyYDtzdGF0aWMgZGVmYXVsdHM9e2JvcmRlclNraXBwZWQ6YHN0YXJ0YCxib3JkZXJXaWR0aDowLGJvcmRlclJhZGl1czowLGluZmxhdGVBbW91bnQ6YGF1dG9gLHBvaW50U3R5bGU6dm9pZCAwfTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17YmFja2dyb3VuZENvbG9yOmBiYWNrZ3JvdW5kQ29sb3JgLGJvcmRlckNvbG9yOmBib3JkZXJDb2xvcmB9O2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLmhvcml6b250YWw9dm9pZCAwLHRoaXMuYmFzZT12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMuaW5mbGF0ZUFtb3VudD12b2lkIDAsZSYmT2JqZWN0LmFzc2lnbih0aGlzLGUpfWRyYXcoZSl7bGV0e2luZmxhdGVBbW91bnQ6dCxvcHRpb25zOntib3JkZXJDb2xvcjpuLGJhY2tncm91bmRDb2xvcjpyfX09dGhpcyx7aW5uZXI6aSxvdXRlcjphfT1MZCh0aGlzKSxvPXpkKGEucmFkaXVzKT9MczpCZDtlLnNhdmUoKSwoYS53IT09aS53fHxhLmghPT1pLmgpJiYoZS5iZWdpblBhdGgoKSxvKGUsVmQoYSx0LGkpKSxlLmNsaXAoKSxvKGUsVmQoaSwtdCxhKSksZS5maWxsU3R5bGU9bixlLmZpbGwoYGV2ZW5vZGRgKSksZS5iZWdpblBhdGgoKSxvKGUsVmQoaSx0KSksZS5maWxsU3R5bGU9cixlLmZpbGwoKSxlLnJlc3RvcmUoKX1pblJhbmdlKGUsdCxuKXtyZXR1cm4gUmQodGhpcyxlLHQsbil9aW5YUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxlLG51bGwsdCl9aW5ZUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxudWxsLGUsdCl9Z2V0Q2VudGVyUG9pbnQoZSl7bGV0e3g6dCx5Om4sYmFzZTpyLGhvcml6b250YWw6aX09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YCxgYmFzZWAsYGhvcml6b250YWxgXSxlKTtyZXR1cm57eDppPyh0K3IpLzI6dCx5Omk/bjoobityKS8yfX1nZXRSYW5nZShlKXtyZXR1cm4gZT09PWB4YD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMn19LFVkPShlLHQpPT57bGV0e2JveEhlaWdodDpuPXQsYm94V2lkdGg6cj10fT1lO3JldHVybiBlLnVzZVBvaW50U3R5bGUmJihuPU1hdGgubWluKG4sdCkscj1lLnBvaW50U3R5bGVXaWR0aHx8TWF0aC5taW4ocix0KSkse2JveFdpZHRoOnIsYm94SGVpZ2h0Om4saXRlbUhlaWdodDpNYXRoLm1heCh0LG4pfX0sV2Q9KGUsdCk9PmUhPT1udWxsJiZ0IT09bnVsbCYmZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgsR2Q9Y2xhc3MgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2FkZGVkPSExLHRoaXMubGVnZW5kSGl0Qm94ZXM9W10sdGhpcy5faG92ZXJlZEl0ZW09bnVsbCx0aGlzLmRvdWdobnV0TW9kZT0hMSx0aGlzLmNoYXJ0PWUuY2hhcnQsdGhpcy5vcHRpb25zPWUub3B0aW9ucyx0aGlzLmN0eD1lLmN0eCx0aGlzLmxlZ2VuZEl0ZW1zPXZvaWQgMCx0aGlzLmNvbHVtblNpemVzPXZvaWQgMCx0aGlzLmxpbmVXaWR0aHM9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLm1heFdpZHRoPXZvaWQgMCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuX21hcmdpbnM9dm9pZCAwLHRoaXMucG9zaXRpb249dm9pZCAwLHRoaXMud2VpZ2h0PXZvaWQgMCx0aGlzLmZ1bGxTaXplPXZvaWQgMH11cGRhdGUoZSx0LG4pe3RoaXMubWF4V2lkdGg9ZSx0aGlzLm1heEhlaWdodD10LHRoaXMuX21hcmdpbnM9bix0aGlzLnNldERpbWVuc2lvbnMoKSx0aGlzLmJ1aWxkTGFiZWxzKCksdGhpcy5maXQoKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD10aGlzLl9tYXJnaW5zLmxlZnQsdGhpcy5yaWdodD10aGlzLndpZHRoKToodGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdGhpcy50b3A9dGhpcy5fbWFyZ2lucy50b3AsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpfWJ1aWxkTGFiZWxzKCl7bGV0IGU9dGhpcy5vcHRpb25zLmxhYmVsc3x8e30sdD1KKGUuZ2VuZXJhdGVMYWJlbHMsW3RoaXMuY2hhcnRdLHRoaXMpfHxbXTtlLmZpbHRlciYmKHQ9dC5maWx0ZXIodD0+ZS5maWx0ZXIodCx0aGlzLmNoYXJ0LmRhdGEpKSksZS5zb3J0JiYodD10LnNvcnQoKHQsbik9PmUuc29ydCh0LG4sdGhpcy5jaGFydC5kYXRhKSkpLHRoaXMub3B0aW9ucy5yZXZlcnNlJiZ0LnJldmVyc2UoKSx0aGlzLmxlZ2VuZEl0ZW1zPXR9Zml0KCl7bGV0e29wdGlvbnM6ZSxjdHg6dH09dGhpcztpZighZS5kaXNwbGF5KXt0aGlzLndpZHRoPXRoaXMuaGVpZ2h0PTA7cmV0dXJufWxldCBuPWUubGFiZWxzLHI9JChuLmZvbnQpLGk9ci5zaXplLGE9dGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCkse2JveFdpZHRoOm8saXRlbUhlaWdodDpzfT1VZChuLGkpLGMsbDt0LmZvbnQ9ci5zdHJpbmcsdGhpcy5pc0hvcml6b250YWwoKT8oYz10aGlzLm1heFdpZHRoLGw9dGhpcy5fZml0Um93cyhhLGksbyxzKSsxMCk6KGw9dGhpcy5tYXhIZWlnaHQsYz10aGlzLl9maXRDb2xzKGEscixvLHMpKzEwKSx0aGlzLndpZHRoPU1hdGgubWluKGMsZS5tYXhXaWR0aHx8dGhpcy5tYXhXaWR0aCksdGhpcy5oZWlnaHQ9TWF0aC5taW4obCxlLm1heEhlaWdodHx8dGhpcy5tYXhIZWlnaHQpfV9maXRSb3dzKGUsdCxuLHIpe2xldHtjdHg6aSxtYXhXaWR0aDphLG9wdGlvbnM6e2xhYmVsczp7cGFkZGluZzpvfX19PXRoaXMscz10aGlzLmxlZ2VuZEhpdEJveGVzPVtdLGM9dGhpcy5saW5lV2lkdGhzPVswXSxsPXIrbyx1PWU7aS50ZXh0QWxpZ249YGxlZnRgLGkudGV4dEJhc2VsaW5lPWBtaWRkbGVgO2xldCBkPS0xLGY9LWw7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxwKT0+e2xldCBtPW4rdC8yK2kubWVhc3VyZVRleHQoZS50ZXh0KS53aWR0aDsocD09PTB8fGNbYy5sZW5ndGgtMV0rbSsyKm8+YSkmJih1Kz1sLGNbYy5sZW5ndGgtKHA+MD8wOjEpXT0wLGYrPWwsZCsrKSxzW3BdPXtsZWZ0OjAsdG9wOmYscm93OmQsd2lkdGg6bSxoZWlnaHQ6cn0sY1tjLmxlbmd0aC0xXSs9bStvfSksdX1fZml0Q29scyhlLHQsbixyKXtsZXR7Y3R4OmksbWF4SGVpZ2h0OmEsb3B0aW9uczp7bGFiZWxzOntwYWRkaW5nOm99fX09dGhpcyxzPXRoaXMubGVnZW5kSGl0Qm94ZXM9W10sYz10aGlzLmNvbHVtblNpemVzPVtdLGw9YS1lLHU9byxkPTAsZj0wLHA9MCxtPTA7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxhKT0+e2xldHtpdGVtV2lkdGg6aCxpdGVtSGVpZ2h0Omd9PUtkKG4sdCxpLGUscik7YT4wJiZmK2crMipvPmwmJih1Kz1kK28sYy5wdXNoKHt3aWR0aDpkLGhlaWdodDpmfSkscCs9ZCtvLG0rKyxkPWY9MCksc1thXT17bGVmdDpwLHRvcDpmLGNvbDptLHdpZHRoOmgsaGVpZ2h0Omd9LGQ9TWF0aC5tYXgoZCxoKSxmKz1nK299KSx1Kz1kLGMucHVzaCh7d2lkdGg6ZCxoZWlnaHQ6Zn0pLHV9YWRqdXN0SGl0Qm94ZXMoKXtpZighdGhpcy5vcHRpb25zLmRpc3BsYXkpcmV0dXJuO2xldCBlPXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpLHtsZWdlbmRIaXRCb3hlczp0LG9wdGlvbnM6e2FsaWduOm4sbGFiZWxzOntwYWRkaW5nOnJ9LHJ0bDppfX09dGhpcyxhPWpjKGksdGhpcy5sZWZ0LHRoaXMud2lkdGgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2xldCBpPTAsbz0kbyhuLHRoaXMubGVmdCtyLHRoaXMucmlnaHQtdGhpcy5saW5lV2lkdGhzW2ldKTtmb3IobGV0IHMgb2YgdClpIT09cy5yb3cmJihpPXMucm93LG89JG8obix0aGlzLmxlZnQrcix0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tpXSkpLHMudG9wKz10aGlzLnRvcCtlK3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngobykscy53aWR0aCksbys9cy53aWR0aCtyfWVsc2V7bGV0IGk9MCxvPSRvKG4sdGhpcy50b3ArZStyLHRoaXMuYm90dG9tLXRoaXMuY29sdW1uU2l6ZXNbaV0uaGVpZ2h0KTtmb3IobGV0IHMgb2YgdClzLmNvbCE9PWkmJihpPXMuY29sLG89JG8obix0aGlzLnRvcCtlK3IsdGhpcy5ib3R0b20tdGhpcy5jb2x1bW5TaXplc1tpXS5oZWlnaHQpKSxzLnRvcD1vLHMubGVmdCs9dGhpcy5sZWZ0K3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngocy5sZWZ0KSxzLndpZHRoKSxvKz1zLmhlaWdodCtyfX1pc0hvcml6b250YWwoKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uPT09YHRvcGB8fHRoaXMub3B0aW9ucy5wb3NpdGlvbj09PWBib3R0b21gfWRyYXcoKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSl7bGV0IGU9dGhpcy5jdHg7anMoZSx0aGlzKSx0aGlzLl9kcmF3KCksTXMoZSl9fV9kcmF3KCl7bGV0e29wdGlvbnM6ZSxjb2x1bW5TaXplczp0LGxpbmVXaWR0aHM6bixjdHg6cn09dGhpcyx7YWxpZ246aSxsYWJlbHM6YX09ZSxvPVouY29sb3Iscz1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYz0kKGEuZm9udCkse3BhZGRpbmc6bH09YSx1PWMuc2l6ZSxkPXUvMixmO3RoaXMuZHJhd1RpdGxlKCksci50ZXh0QWxpZ249cy50ZXh0QWxpZ24oYGxlZnRgKSxyLnRleHRCYXNlbGluZT1gbWlkZGxlYCxyLmxpbmVXaWR0aD0uNSxyLmZvbnQ9Yy5zdHJpbmc7bGV0e2JveFdpZHRoOnAsYm94SGVpZ2h0Om0saXRlbUhlaWdodDpofT1VZChhLHUpLGc9ZnVuY3Rpb24oZSx0LG4pe2lmKGlzTmFOKHApfHxwPD0wfHxpc05hTihtKXx8bTwwKXJldHVybjtyLnNhdmUoKTtsZXQgaT1xKG4ubGluZVdpZHRoLDEpO2lmKHIuZmlsbFN0eWxlPXEobi5maWxsU3R5bGUsbyksci5saW5lQ2FwPXEobi5saW5lQ2FwLGBidXR0YCksci5saW5lRGFzaE9mZnNldD1xKG4ubGluZURhc2hPZmZzZXQsMCksci5saW5lSm9pbj1xKG4ubGluZUpvaW4sYG1pdGVyYCksci5saW5lV2lkdGg9aSxyLnN0cm9rZVN0eWxlPXEobi5zdHJva2VTdHlsZSxvKSxyLnNldExpbmVEYXNoKHEobi5saW5lRGFzaCxbXSkpLGEudXNlUG9pbnRTdHlsZSl7bGV0IG89e3JhZGl1czptKk1hdGguU1FSVDIvMixwb2ludFN0eWxlOm4ucG9pbnRTdHlsZSxyb3RhdGlvbjpuLnJvdGF0aW9uLGJvcmRlcldpZHRoOml9LGM9cy54UGx1cyhlLHAvMiksbD10K2Q7a3MocixvLGMsbCxhLnBvaW50U3R5bGVXaWR0aCYmcCl9ZWxzZXtsZXQgYT10K01hdGgubWF4KCh1LW0pLzIsMCksbz1zLmxlZnRGb3JMdHIoZSxwKSxjPVdzKG4uYm9yZGVyUmFkaXVzKTtyLmJlZ2luUGF0aCgpLE9iamVjdC52YWx1ZXMoYykuc29tZShlPT5lIT09MCk/THMocix7eDpvLHk6YSx3OnAsaDptLHJhZGl1czpjfSk6ci5yZWN0KG8sYSxwLG0pLHIuZmlsbCgpLGkhPT0wJiZyLnN0cm9rZSgpfXIucmVzdG9yZSgpfSxfPWZ1bmN0aW9uKGUsdCxuKXtJcyhyLG4udGV4dCxlLHQraC8yLGMse3N0cmlrZXRocm91Z2g6bi5oaWRkZW4sdGV4dEFsaWduOnMudGV4dEFsaWduKG4udGV4dEFsaWduKX0pfSx2PXRoaXMuaXNIb3Jpem9udGFsKCkseT10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtmPXY/e3g6JG8oaSx0aGlzLmxlZnQrbCx0aGlzLnJpZ2h0LW5bMF0pLHk6dGhpcy50b3ArbCt5LGxpbmU6MH06e3g6dGhpcy5sZWZ0K2wseTokbyhpLHRoaXMudG9wK3krbCx0aGlzLmJvdHRvbS10WzBdLmhlaWdodCksbGluZTowfSxNYyh0aGlzLmN0eCxlLnRleHREaXJlY3Rpb24pO2xldCBiPWgrbDt0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKG8sdSk9PntyLnN0cm9rZVN0eWxlPW8uZm9udENvbG9yLHIuZmlsbFN0eWxlPW8uZm9udENvbG9yO2xldCBtPXIubWVhc3VyZVRleHQoby50ZXh0KS53aWR0aCxoPXMudGV4dEFsaWduKG8udGV4dEFsaWdufHw9YS50ZXh0QWxpZ24pLHg9cCtkK20sUz1mLngsQz1mLnk7cy5zZXRXaWR0aCh0aGlzLndpZHRoKSx2P3U+MCYmUyt4K2w+dGhpcy5yaWdodCYmKEM9Zi55Kz1iLGYubGluZSsrLFM9Zi54PSRvKGksdGhpcy5sZWZ0K2wsdGhpcy5yaWdodC1uW2YubGluZV0pKTp1PjAmJkMrYj50aGlzLmJvdHRvbSYmKFM9Zi54PVMrdFtmLmxpbmVdLndpZHRoK2wsZi5saW5lKyssQz1mLnk9JG8oaSx0aGlzLnRvcCt5K2wsdGhpcy5ib3R0b20tdFtmLmxpbmVdLmhlaWdodCkpO2xldCB3PXMueChTKTtpZihnKHcsQyxvKSxTPWVzKGgsUytwK2Qsdj9TK3g6dGhpcy5yaWdodCxlLnJ0bCksXyhzLngoUyksQyxvKSx2KWYueCs9eCtsO2Vsc2UgaWYodHlwZW9mIG8udGV4dCE9YHN0cmluZ2Ape2xldCBlPWMubGluZUhlaWdodDtmLnkrPVlkKG8sZSkrbH1lbHNlIGYueSs9Yn0pLE5jKHRoaXMuY3R4LGUudGV4dERpcmVjdGlvbil9ZHJhd1RpdGxlKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aXRsZSxuPSQodC5mb250KSxyPVEodC5wYWRkaW5nKTtpZighdC5kaXNwbGF5KXJldHVybjtsZXQgaT1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYT10aGlzLmN0eCxvPXQucG9zaXRpb24scz1uLnNpemUvMixjPXIudG9wK3MsbCx1PXRoaXMubGVmdCxkPXRoaXMud2lkdGg7aWYodGhpcy5pc0hvcml6b250YWwoKSlkPU1hdGgubWF4KC4uLnRoaXMubGluZVdpZHRocyksbD10aGlzLnRvcCtjLHU9JG8oZS5hbGlnbix1LHRoaXMucmlnaHQtZCk7ZWxzZXtsZXQgdD10aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoZSx0KT0+TWF0aC5tYXgoZSx0LmhlaWdodCksMCk7bD1jKyRvKGUuYWxpZ24sdGhpcy50b3AsdGhpcy5ib3R0b20tdC1lLmxhYmVscy5wYWRkaW5nLXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKX1sZXQgZj0kbyhvLHUsdStkKTthLnRleHRBbGlnbj1pLnRleHRBbGlnbihRbyhvKSksYS50ZXh0QmFzZWxpbmU9YG1pZGRsZWAsYS5zdHJva2VTdHlsZT10LmNvbG9yLGEuZmlsbFN0eWxlPXQuY29sb3IsYS5mb250PW4uc3RyaW5nLElzKGEsdC50ZXh0LGYsbCxuKX1fY29tcHV0ZVRpdGxlSGVpZ2h0KCl7bGV0IGU9dGhpcy5vcHRpb25zLnRpdGxlLHQ9JChlLmZvbnQpLG49UShlLnBhZGRpbmcpO3JldHVybiBlLmRpc3BsYXk/dC5saW5lSGVpZ2h0K24uaGVpZ2h0OjB9X2dldExlZ2VuZEl0ZW1BdChlLHQpe2xldCBuLHIsaTtpZihCbyhlLHRoaXMubGVmdCx0aGlzLnJpZ2h0KSYmQm8odCx0aGlzLnRvcCx0aGlzLmJvdHRvbSkpe2ZvcihpPXRoaXMubGVnZW5kSGl0Qm94ZXMsbj0wO248aS5sZW5ndGg7KytuKWlmKHI9aVtuXSxCbyhlLHIubGVmdCxyLmxlZnQrci53aWR0aCkmJkJvKHQsci50b3Asci50b3Arci5oZWlnaHQpKXJldHVybiB0aGlzLmxlZ2VuZEl0ZW1zW25dfXJldHVybiBudWxsfWhhbmRsZUV2ZW50KGUpe2xldCB0PXRoaXMub3B0aW9ucztpZighWGQoZS50eXBlLHQpKXJldHVybjtsZXQgbj10aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LGUueSk7aWYoZS50eXBlPT09YG1vdXNlbW92ZWB8fGUudHlwZT09PWBtb3VzZW91dGApe2xldCByPXRoaXMuX2hvdmVyZWRJdGVtLGk9V2QocixuKTtyJiYhaSYmSih0Lm9uTGVhdmUsW2Uscix0aGlzXSx0aGlzKSx0aGlzLl9ob3ZlcmVkSXRlbT1uLG4mJiFpJiZKKHQub25Ib3ZlcixbZSxuLHRoaXNdLHRoaXMpfWVsc2UgbiYmSih0Lm9uQ2xpY2ssW2Usbix0aGlzXSx0aGlzKX19O2Z1bmN0aW9uIEtkKGUsdCxuLHIsaSl7cmV0dXJue2l0ZW1XaWR0aDpxZChyLGUsdCxuKSxpdGVtSGVpZ2h0OkpkKGkscix0LmxpbmVIZWlnaHQpfX1mdW5jdGlvbiBxZChlLHQsbixyKXtsZXQgaT1lLnRleHQ7cmV0dXJuIGkmJnR5cGVvZiBpIT1gc3RyaW5nYCYmKGk9aS5yZWR1Y2UoKGUsdCk9PmUubGVuZ3RoPnQubGVuZ3RoP2U6dCkpLHQrbi5zaXplLzIrci5tZWFzdXJlVGV4dChpKS53aWR0aH1mdW5jdGlvbiBKZChlLHQsbil7bGV0IHI9ZTtyZXR1cm4gdHlwZW9mIHQudGV4dCE9YHN0cmluZ2AmJihyPVlkKHQsbikpLHJ9ZnVuY3Rpb24gWWQoZSx0KXtyZXR1cm4gdCooZS50ZXh0P2UudGV4dC5sZW5ndGg6MCl9ZnVuY3Rpb24gWGQoZSx0KXtyZXR1cm4hISgoZT09PWBtb3VzZW1vdmVgfHxlPT09YG1vdXNlb3V0YCkmJih0Lm9uSG92ZXJ8fHQub25MZWF2ZSl8fHQub25DbGljayYmKGU9PT1gY2xpY2tgfHxlPT09YG1vdXNldXBgKSl9dmFyIFpkPXtpZDpgbGVnZW5kYCxfZWxlbWVudDpHZCxzdGFydChlLHQsbil7bGV0IHI9ZS5sZWdlbmQ9bmV3IEdkKHtjdHg6ZS5jdHgsb3B0aW9uczpuLGNoYXJ0OmV9KTskbC5jb25maWd1cmUoZSxyLG4pLCRsLmFkZEJveChlLHIpfSxzdG9wKGUpeyRsLnJlbW92ZUJveChlLGUubGVnZW5kKSxkZWxldGUgZS5sZWdlbmR9LGJlZm9yZVVwZGF0ZShlLHQsbil7bGV0IHI9ZS5sZWdlbmQ7JGwuY29uZmlndXJlKGUscixuKSxyLm9wdGlvbnM9bn0sYWZ0ZXJVcGRhdGUoZSl7bGV0IHQ9ZS5sZWdlbmQ7dC5idWlsZExhYmVscygpLHQuYWRqdXN0SGl0Qm94ZXMoKX0sYWZ0ZXJFdmVudChlLHQpe3QucmVwbGF5fHxlLmxlZ2VuZC5oYW5kbGVFdmVudCh0LmV2ZW50KX0sZGVmYXVsdHM6e2Rpc3BsYXk6ITAscG9zaXRpb246YHRvcGAsYWxpZ246YGNlbnRlcmAsZnVsbFNpemU6ITAscmV2ZXJzZTohMSx3ZWlnaHQ6MWUzLG9uQ2xpY2soZSx0LG4pe2xldCByPXQuZGF0YXNldEluZGV4LGk9bi5jaGFydDtpLmlzRGF0YXNldFZpc2libGUocik/KGkuaGlkZShyKSx0LmhpZGRlbj0hMCk6KGkuc2hvdyhyKSx0LmhpZGRlbj0hMSl9LG9uSG92ZXI6bnVsbCxvbkxlYXZlOm51bGwsbGFiZWxzOntjb2xvcjplPT5lLmNoYXJ0Lm9wdGlvbnMuY29sb3IsYm94V2lkdGg6NDAscGFkZGluZzoxMCxnZW5lcmF0ZUxhYmVscyhlKXtsZXQgdD1lLmRhdGEuZGF0YXNldHMse2xhYmVsczp7dXNlUG9pbnRTdHlsZTpuLHBvaW50U3R5bGU6cix0ZXh0QWxpZ246aSxjb2xvcjphLHVzZUJvcmRlclJhZGl1czpvLGJvcmRlclJhZGl1czpzfX09ZS5sZWdlbmQub3B0aW9ucztyZXR1cm4gZS5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCkubWFwKGU9PntsZXQgYz1lLmNvbnRyb2xsZXIuZ2V0U3R5bGUobj8wOnZvaWQgMCksbD1RKGMuYm9yZGVyV2lkdGgpO3JldHVybnt0ZXh0OnRbZS5pbmRleF0ubGFiZWwsZmlsbFN0eWxlOmMuYmFja2dyb3VuZENvbG9yLGZvbnRDb2xvcjphLGhpZGRlbjohZS52aXNpYmxlLGxpbmVDYXA6Yy5ib3JkZXJDYXBTdHlsZSxsaW5lRGFzaDpjLmJvcmRlckRhc2gsbGluZURhc2hPZmZzZXQ6Yy5ib3JkZXJEYXNoT2Zmc2V0LGxpbmVKb2luOmMuYm9yZGVySm9pblN0eWxlLGxpbmVXaWR0aDoobC53aWR0aCtsLmhlaWdodCkvNCxzdHJva2VTdHlsZTpjLmJvcmRlckNvbG9yLHBvaW50U3R5bGU6cnx8Yy5wb2ludFN0eWxlLHJvdGF0aW9uOmMucm90YXRpb24sdGV4dEFsaWduOml8fGMudGV4dEFsaWduLGJvcmRlclJhZGl1czpvJiYoc3x8Yy5ib3JkZXJSYWRpdXMpLGRhdGFzZXRJbmRleDplLmluZGV4fX0sdGhpcyl9fSx0aXRsZTp7Y29sb3I6ZT0+ZS5jaGFydC5vcHRpb25zLmNvbG9yLGRpc3BsYXk6ITEscG9zaXRpb246YGNlbnRlcmAsdGV4dDpgYH19LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBvbmApLGxhYmVsczp7X3NjcmlwdGFibGU6ZT0+IVtgZ2VuZXJhdGVMYWJlbHNgLGBmaWx0ZXJgLGBzb3J0YF0uaW5jbHVkZXMoZSl9fX0sUWQ9e2F2ZXJhZ2UoZSl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCB0LG4scj1uZXcgU2V0LGk9MCxhPTA7Zm9yKHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3Qpe2xldCBuPWVbdF0uZWxlbWVudDtpZihuJiZuLmhhc1ZhbHVlKCkpe2xldCBlPW4udG9vbHRpcFBvc2l0aW9uKCk7ci5hZGQoZS54KSxpKz1lLnksKythfX1yZXR1cm4gYT09PTB8fHIuc2l6ZT09PTA/ITE6e3g6Wy4uLnJdLnJlZHVjZSgoZSx0KT0+ZSt0KS9yLnNpemUseTppL2F9fSxuZWFyZXN0KGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCBuPXQueCxyPXQueSxpPTEvMCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7bGV0IG49ZVthXS5lbGVtZW50O2lmKG4mJm4uaGFzVmFsdWUoKSl7bGV0IGU9Rm8odCxuLmdldENlbnRlclBvaW50KCkpO2U8aSYmKGk9ZSxzPW4pfX1pZihzKXtsZXQgZT1zLnRvb2x0aXBQb3NpdGlvbigpO249ZS54LHI9ZS55fXJldHVybnt4Om4seTpyfX19O2Z1bmN0aW9uICRkKGUsdCl7cmV0dXJuIHQmJihXKHQpP0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsdCk6ZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGVmKGUpe3JldHVybih0eXBlb2YgZT09YHN0cmluZ2B8fGUgaW5zdGFuY2VvZiBTdHJpbmcpJiZlLmluZGV4T2YoYApgKT4tMT9lLnNwbGl0KGAKYCk6ZX1mdW5jdGlvbiB0ZihlLHQpe2xldHtlbGVtZW50Om4sZGF0YXNldEluZGV4OnIsaW5kZXg6aX09dCxhPWUuZ2V0RGF0YXNldE1ldGEocikuY29udHJvbGxlcix7bGFiZWw6byx2YWx1ZTpzfT1hLmdldExhYmVsQW5kVmFsdWUoaSk7cmV0dXJue2NoYXJ0OmUsbGFiZWw6byxwYXJzZWQ6YS5nZXRQYXJzZWQoaSkscmF3OmUuZGF0YS5kYXRhc2V0c1tyXS5kYXRhW2ldLGZvcm1hdHRlZFZhbHVlOnMsZGF0YXNldDphLmdldERhdGFzZXQoKSxkYXRhSW5kZXg6aSxkYXRhc2V0SW5kZXg6cixlbGVtZW50Om59fWZ1bmN0aW9uIG5mKGUsdCl7bGV0IG49ZS5jaGFydC5jdHgse2JvZHk6cixmb290ZXI6aSx0aXRsZTphfT1lLHtib3hXaWR0aDpvLGJveEhlaWdodDpzfT10LGM9JCh0LmJvZHlGb250KSxsPSQodC50aXRsZUZvbnQpLHU9JCh0LmZvb3RlckZvbnQpLGQ9YS5sZW5ndGgsZj1pLmxlbmd0aCxwPXIubGVuZ3RoLG09USh0LnBhZGRpbmcpLGg9bS5oZWlnaHQsZz0wLF89ci5yZWR1Y2UoKGUsdCk9PmUrdC5iZWZvcmUubGVuZ3RoK3QubGluZXMubGVuZ3RoK3QuYWZ0ZXIubGVuZ3RoLDApO2lmKF8rPWUuYmVmb3JlQm9keS5sZW5ndGgrZS5hZnRlckJvZHkubGVuZ3RoLGQmJihoKz1kKmwubGluZUhlaWdodCsoZC0xKSp0LnRpdGxlU3BhY2luZyt0LnRpdGxlTWFyZ2luQm90dG9tKSxfKXtsZXQgZT10LmRpc3BsYXlDb2xvcnM/TWF0aC5tYXgocyxjLmxpbmVIZWlnaHQpOmMubGluZUhlaWdodDtoKz1wKmUrKF8tcCkqYy5saW5lSGVpZ2h0KyhfLTEpKnQuYm9keVNwYWNpbmd9ZiYmKGgrPXQuZm9vdGVyTWFyZ2luVG9wK2YqdS5saW5lSGVpZ2h0KyhmLTEpKnQuZm9vdGVyU3BhY2luZyk7bGV0IHY9MCx5PWZ1bmN0aW9uKGUpe2c9TWF0aC5tYXgoZyxuLm1lYXN1cmVUZXh0KGUpLndpZHRoK3YpfTtyZXR1cm4gbi5zYXZlKCksbi5mb250PWwuc3RyaW5nLFkoZS50aXRsZSx5KSxuLmZvbnQ9Yy5zdHJpbmcsWShlLmJlZm9yZUJvZHkuY29uY2F0KGUuYWZ0ZXJCb2R5KSx5KSx2PXQuZGlzcGxheUNvbG9ycz9vKzIrdC5ib3hQYWRkaW5nOjAsWShyLGU9PntZKGUuYmVmb3JlLHkpLFkoZS5saW5lcyx5KSxZKGUuYWZ0ZXIseSl9KSx2PTAsbi5mb250PXUuc3RyaW5nLFkoZS5mb290ZXIseSksbi5yZXN0b3JlKCksZys9bS53aWR0aCx7d2lkdGg6ZyxoZWlnaHQ6aH19ZnVuY3Rpb24gcmYoZSx0KXtsZXR7eTpuLGhlaWdodDpyfT10O3JldHVybiBuPHIvMj9gdG9wYDpuPmUuaGVpZ2h0LXIvMj9gYm90dG9tYDpgY2VudGVyYH1mdW5jdGlvbiBhZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PXIsbz1uLmNhcmV0U2l6ZStuLmNhcmV0UGFkZGluZztpZihlPT09YGxlZnRgJiZpK2Erbz50LndpZHRofHxlPT09YHJpZ2h0YCYmaS1hLW88MClyZXR1cm4hMH1mdW5jdGlvbiBvZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PW4se3dpZHRoOm8sY2hhcnRBcmVhOntsZWZ0OnMscmlnaHQ6Y319PWUsbD1gY2VudGVyYDtyZXR1cm4gcj09PWBjZW50ZXJgP2w9aTw9KHMrYykvMj9gbGVmdGA6YHJpZ2h0YDppPD1hLzI/bD1gbGVmdGA6aT49by1hLzImJihsPWByaWdodGApLGFmKGwsZSx0LG4pJiYobD1gY2VudGVyYCksbH1mdW5jdGlvbiBzZihlLHQsbil7bGV0IHI9bi55QWxpZ258fHQueUFsaWdufHxyZihlLG4pO3JldHVybnt4QWxpZ246bi54QWxpZ258fHQueEFsaWdufHxvZihlLHQsbixyKSx5QWxpZ246cn19ZnVuY3Rpb24gY2YoZSx0KXtsZXR7eDpuLHdpZHRoOnJ9PWU7cmV0dXJuIHQ9PT1gcmlnaHRgP24tPXI6dD09PWBjZW50ZXJgJiYobi09ci8yKSxufWZ1bmN0aW9uIGxmKGUsdCxuKXtsZXR7eTpyLGhlaWdodDppfT1lO3JldHVybiB0PT09YHRvcGA/cis9bjpyLT10PT09YGJvdHRvbWA/aStuOmkvMixyfWZ1bmN0aW9uIHVmKGUsdCxuLHIpe2xldHtjYXJldFNpemU6aSxjYXJldFBhZGRpbmc6YSxjb3JuZXJSYWRpdXM6b309ZSx7eEFsaWduOnMseUFsaWduOmN9PW4sbD1pK2Ese3RvcExlZnQ6dSx0b3BSaWdodDpkLGJvdHRvbUxlZnQ6Zixib3R0b21SaWdodDpwfT1XcyhvKSxtPWNmKHQscyksaD1sZih0LGMsbCk7cmV0dXJuIGM9PT1gY2VudGVyYD9zPT09YGxlZnRgP20rPWw6cz09PWByaWdodGAmJihtLT1sKTpzPT09YGxlZnRgP20tPU1hdGgubWF4KHUsZikraTpzPT09YHJpZ2h0YCYmKG0rPU1hdGgubWF4KGQscCkraSkse3g6Um8obSwwLHIud2lkdGgtdC53aWR0aCkseTpSbyhoLDAsci5oZWlnaHQtdC5oZWlnaHQpfX1mdW5jdGlvbiBkZihlLHQsbil7bGV0IHI9UShuLnBhZGRpbmcpO3JldHVybiB0PT09YGNlbnRlcmA/ZS54K2Uud2lkdGgvMjp0PT09YHJpZ2h0YD9lLngrZS53aWR0aC1yLnJpZ2h0OmUueCtyLmxlZnR9ZnVuY3Rpb24gZmYoZSl7cmV0dXJuICRkKFtdLGVmKGUpKX1mdW5jdGlvbiBwZihlLHQsbil7cmV0dXJuIHFzKGUse3Rvb2x0aXA6dCx0b29sdGlwSXRlbXM6bix0eXBlOmB0b29sdGlwYH0pfWZ1bmN0aW9uIG1mKGUsdCl7bGV0IG49dCYmdC5kYXRhc2V0JiZ0LmRhdGFzZXQudG9vbHRpcCYmdC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO3JldHVybiBuP2Uub3ZlcnJpZGUobik6ZX12YXIgaGY9e2JlZm9yZVRpdGxlOllhLHRpdGxlKGUpe2lmKGUubGVuZ3RoPjApe2xldCB0PWVbMF0sbj10LmNoYXJ0LmRhdGEubGFiZWxzLHI9bj9uLmxlbmd0aDowO2lmKHRoaXMmJnRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm1vZGU9PT1gZGF0YXNldGApcmV0dXJuIHQuZGF0YXNldC5sYWJlbHx8YGA7aWYodC5sYWJlbClyZXR1cm4gdC5sYWJlbDtpZihyPjAmJnQuZGF0YUluZGV4PHIpcmV0dXJuIG5bdC5kYXRhSW5kZXhdfXJldHVybmBgfSxhZnRlclRpdGxlOllhLGJlZm9yZUJvZHk6WWEsYmVmb3JlTGFiZWw6WWEsbGFiZWwoZSl7aWYodGhpcyYmdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubW9kZT09PWBkYXRhc2V0YClyZXR1cm4gZS5sYWJlbCtgOiBgK2UuZm9ybWF0dGVkVmFsdWV8fGUuZm9ybWF0dGVkVmFsdWU7bGV0IHQ9ZS5kYXRhc2V0LmxhYmVsfHxgYDt0JiYodCs9YDogYCk7bGV0IG49ZS5mb3JtYXR0ZWRWYWx1ZTtyZXR1cm4gVShuKXx8KHQrPW4pLHR9LGxhYmVsQ29sb3IoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue2JvcmRlckNvbG9yOnQuYm9yZGVyQ29sb3IsYmFja2dyb3VuZENvbG9yOnQuYmFja2dyb3VuZENvbG9yLGJvcmRlcldpZHRoOnQuYm9yZGVyV2lkdGgsYm9yZGVyRGFzaDp0LmJvcmRlckRhc2gsYm9yZGVyRGFzaE9mZnNldDp0LmJvcmRlckRhc2hPZmZzZXQsYm9yZGVyUmFkaXVzOjB9fSxsYWJlbFRleHRDb2xvcigpe3JldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yfSxsYWJlbFBvaW50U3R5bGUoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue3BvaW50U3R5bGU6dC5wb2ludFN0eWxlLHJvdGF0aW9uOnQucm90YXRpb259fSxhZnRlckxhYmVsOllhLGFmdGVyQm9keTpZYSxiZWZvcmVGb290ZXI6WWEsZm9vdGVyOllhLGFmdGVyRm9vdGVyOllhfTtmdW5jdGlvbiBnZihlLHQsbixyKXtsZXQgaT1lW3RdLmNhbGwobixyKTtyZXR1cm4gaT09PXZvaWQgMD9oZlt0XS5jYWxsKG4scik6aX12YXIgX2Y9Y2xhc3MgZXh0ZW5kcyBDdXtzdGF0aWMgcG9zaXRpb25lcnM9UWQ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLm9wYWNpdHk9MCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fZXZlbnRQb3NpdGlvbj12b2lkIDAsdGhpcy5fc2l6ZT12b2lkIDAsdGhpcy5fY2FjaGVkQW5pbWF0aW9ucz12b2lkIDAsdGhpcy5fdG9vbHRpcEl0ZW1zPVtdLHRoaXMuJGFuaW1hdGlvbnM9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuY2hhcnQ9ZS5jaGFydCx0aGlzLm9wdGlvbnM9ZS5vcHRpb25zLHRoaXMuZGF0YVBvaW50cz12b2lkIDAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5iZWZvcmVCb2R5PXZvaWQgMCx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuYWZ0ZXJCb2R5PXZvaWQgMCx0aGlzLmZvb3Rlcj12b2lkIDAsdGhpcy54QWxpZ249dm9pZCAwLHRoaXMueUFsaWduPXZvaWQgMCx0aGlzLng9dm9pZCAwLHRoaXMueT12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuY2FyZXRYPXZvaWQgMCx0aGlzLmNhcmV0WT12b2lkIDAsdGhpcy5sYWJlbENvbG9ycz12b2lkIDAsdGhpcy5sYWJlbFBvaW50U3R5bGVzPXZvaWQgMCx0aGlzLmxhYmVsVGV4dENvbG9ycz12b2lkIDB9aW5pdGlhbGl6ZShlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLl9jYWNoZWRBbmltYXRpb25zPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMH1fcmVzb2x2ZUFuaW1hdGlvbnMoKXtsZXQgZT10aGlzLl9jYWNoZWRBbmltYXRpb25zO2lmKGUpcmV0dXJuIGU7bGV0IHQ9dGhpcy5jaGFydCxuPXRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKSxyPW4uZW5hYmxlZCYmdC5vcHRpb25zLmFuaW1hdGlvbiYmbi5hbmltYXRpb25zLGk9bmV3IFZjKHRoaXMuY2hhcnQscik7cmV0dXJuIHIuX2NhY2hlYWJsZSYmKHRoaXMuX2NhY2hlZEFuaW1hdGlvbnM9T2JqZWN0LmZyZWV6ZShpKSksaX1nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuJGNvbnRleHR8fD1wZih0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLHRoaXMuX3Rvb2x0aXBJdGVtcyl9Z2V0VGl0bGUoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVUaXRsZWAsdGhpcyxlKSxpPWdmKG4sYHRpdGxlYCx0aGlzLGUpLGE9Z2YobixgYWZ0ZXJUaXRsZWAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfWdldEJlZm9yZUJvZHkoZSx0KXtyZXR1cm4gZmYoZ2YodC5jYWxsYmFja3MsYGJlZm9yZUJvZHlgLHRoaXMsZSkpfWdldEJvZHkoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1bXTtyZXR1cm4gWShlLGU9PntsZXQgdD17YmVmb3JlOltdLGxpbmVzOltdLGFmdGVyOltdfSxpPW1mKG4sZSk7JGQodC5iZWZvcmUsZWYoZ2YoaSxgYmVmb3JlTGFiZWxgLHRoaXMsZSkpKSwkZCh0LmxpbmVzLGdmKGksYGxhYmVsYCx0aGlzLGUpKSwkZCh0LmFmdGVyLGVmKGdmKGksYGFmdGVyTGFiZWxgLHRoaXMsZSkpKSxyLnB1c2godCl9KSxyfWdldEFmdGVyQm9keShlLHQpe3JldHVybiBmZihnZih0LmNhbGxiYWNrcyxgYWZ0ZXJCb2R5YCx0aGlzLGUpKX1nZXRGb290ZXIoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVGb290ZXJgLHRoaXMsZSksaT1nZihuLGBmb290ZXJgLHRoaXMsZSksYT1nZihuLGBhZnRlckZvb3RlcmAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfV9jcmVhdGVJdGVtcyhlKXtsZXQgdD10aGlzLl9hY3RpdmUsbj10aGlzLmNoYXJ0LmRhdGEscj1bXSxpPVtdLGE9W10sbz1bXSxzLGM7Zm9yKHM9MCxjPXQubGVuZ3RoO3M8YzsrK3Mpby5wdXNoKHRmKHRoaXMuY2hhcnQsdFtzXSkpO3JldHVybiBlLmZpbHRlciYmKG89by5maWx0ZXIoKHQscixpKT0+ZS5maWx0ZXIodCxyLGksbikpKSxlLml0ZW1Tb3J0JiYobz1vLnNvcnQoKHQscik9PmUuaXRlbVNvcnQodCxyLG4pKSksWShvLHQ9PntsZXQgbj1tZihlLmNhbGxiYWNrcyx0KTtyLnB1c2goZ2YobixgbGFiZWxDb2xvcmAsdGhpcyx0KSksaS5wdXNoKGdmKG4sYGxhYmVsUG9pbnRTdHlsZWAsdGhpcyx0KSksYS5wdXNoKGdmKG4sYGxhYmVsVGV4dENvbG9yYCx0aGlzLHQpKX0pLHRoaXMubGFiZWxDb2xvcnM9cix0aGlzLmxhYmVsUG9pbnRTdHlsZXM9aSx0aGlzLmxhYmVsVGV4dENvbG9ycz1hLHRoaXMuZGF0YVBvaW50cz1vLG99dXBkYXRlKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYWN0aXZlLGksYT1bXTtpZighci5sZW5ndGgpdGhpcy5vcGFjaXR5IT09MCYmKGk9e29wYWNpdHk6MH0pO2Vsc2V7bGV0IGU9UWRbbi5wb3NpdGlvbl0uY2FsbCh0aGlzLHIsdGhpcy5fZXZlbnRQb3NpdGlvbik7YT10aGlzLl9jcmVhdGVJdGVtcyhuKSx0aGlzLnRpdGxlPXRoaXMuZ2V0VGl0bGUoYSxuKSx0aGlzLmJlZm9yZUJvZHk9dGhpcy5nZXRCZWZvcmVCb2R5KGEsbiksdGhpcy5ib2R5PXRoaXMuZ2V0Qm9keShhLG4pLHRoaXMuYWZ0ZXJCb2R5PXRoaXMuZ2V0QWZ0ZXJCb2R5KGEsbiksdGhpcy5mb290ZXI9dGhpcy5nZXRGb290ZXIoYSxuKTtsZXQgdD10aGlzLl9zaXplPW5mKHRoaXMsbiksbz1PYmplY3QuYXNzaWduKHt9LGUsdCkscz1zZih0aGlzLmNoYXJ0LG4sbyksYz11ZihuLG8scyx0aGlzLmNoYXJ0KTt0aGlzLnhBbGlnbj1zLnhBbGlnbix0aGlzLnlBbGlnbj1zLnlBbGlnbixpPXtvcGFjaXR5OjEseDpjLngseTpjLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsY2FyZXRYOmUueCxjYXJldFk6ZS55fX10aGlzLl90b29sdGlwSXRlbXM9YSx0aGlzLiRjb250ZXh0PXZvaWQgMCxpJiZ0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLGkpLGUmJm4uZXh0ZXJuYWwmJm4uZXh0ZXJuYWwuY2FsbCh0aGlzLHtjaGFydDp0aGlzLmNoYXJ0LHRvb2x0aXA6dGhpcyxyZXBsYXk6dH0pfWRyYXdDYXJldChlLHQsbixyKXtsZXQgaT10aGlzLmdldENhcmV0UG9zaXRpb24oZSxuLHIpO3QubGluZVRvKGkueDEsaS55MSksdC5saW5lVG8oaS54MixpLnkyKSx0LmxpbmVUbyhpLngzLGkueTMpfWdldENhcmV0UG9zaXRpb24oZSx0LG4pe2xldHt4QWxpZ246cix5QWxpZ246aX09dGhpcyx7Y2FyZXRTaXplOmEsY29ybmVyUmFkaXVzOm99PW4se3RvcExlZnQ6cyx0b3BSaWdodDpjLGJvdHRvbUxlZnQ6bCxib3R0b21SaWdodDp1fT1XcyhvKSx7eDpkLHk6Zn09ZSx7d2lkdGg6cCxoZWlnaHQ6bX09dCxoLGcsXyx2LHksYjtyZXR1cm4gaT09PWBjZW50ZXJgPyh5PWYrbS8yLHI9PT1gbGVmdGA/KGg9ZCxnPWgtYSx2PXkrYSxiPXktYSk6KGg9ZCtwLGc9aCthLHY9eS1hLGI9eSthKSxfPWgpOihnPXI9PT1gbGVmdGA/ZCtNYXRoLm1heChzLGwpK2E6cj09PWByaWdodGA/ZCtwLU1hdGgubWF4KGMsdSktYTp0aGlzLmNhcmV0WCxpPT09YHRvcGA/KHY9Zix5PXYtYSxoPWctYSxfPWcrYSk6KHY9ZittLHk9dithLGg9ZythLF89Zy1hKSxiPXYpLHt4MTpoLHgyOmcseDM6Xyx5MTp2LHkyOnkseTM6Yn19ZHJhd1RpdGxlKGUsdCxuKXtsZXQgcj10aGlzLnRpdGxlLGk9ci5sZW5ndGgsYSxvLHM7aWYoaSl7bGV0IGM9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpO2ZvcihlLng9ZGYodGhpcyxuLnRpdGxlQWxpZ24sbiksdC50ZXh0QWxpZ249Yy50ZXh0QWxpZ24obi50aXRsZUFsaWduKSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCxhPSQobi50aXRsZUZvbnQpLG89bi50aXRsZVNwYWNpbmcsdC5maWxsU3R5bGU9bi50aXRsZUNvbG9yLHQuZm9udD1hLnN0cmluZyxzPTA7czxpOysrcyl0LmZpbGxUZXh0KHJbc10sYy54KGUueCksZS55K2EubGluZUhlaWdodC8yKSxlLnkrPWEubGluZUhlaWdodCtvLHMrMT09PWkmJihlLnkrPW4udGl0bGVNYXJnaW5Cb3R0b20tbyl9fV9kcmF3Q29sb3JCb3goZSx0LG4scixpKXtsZXQgYT10aGlzLmxhYmVsQ29sb3JzW25dLG89dGhpcy5sYWJlbFBvaW50U3R5bGVzW25dLHtib3hIZWlnaHQ6cyxib3hXaWR0aDpjfT1pLGw9JChpLmJvZHlGb250KSx1PWRmKHRoaXMsYGxlZnRgLGkpLGQ9ci54KHUpLGY9czxsLmxpbmVIZWlnaHQ/KGwubGluZUhlaWdodC1zKS8yOjAscD10LnkrZjtpZihpLnVzZVBvaW50U3R5bGUpe2xldCB0PXtyYWRpdXM6TWF0aC5taW4oYyxzKS8yLHBvaW50U3R5bGU6by5wb2ludFN0eWxlLHJvdGF0aW9uOm8ucm90YXRpb24sYm9yZGVyV2lkdGg6MX0sbj1yLmxlZnRGb3JMdHIoZCxjKStjLzIsbD1wK3MvMjtlLnN0cm9rZVN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLE9zKGUsdCxuLGwpLGUuc3Ryb2tlU3R5bGU9YS5ib3JkZXJDb2xvcixlLmZpbGxTdHlsZT1hLmJhY2tncm91bmRDb2xvcixPcyhlLHQsbixsKX1lbHNle2UubGluZVdpZHRoPUcoYS5ib3JkZXJXaWR0aCk/TWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhhLmJvcmRlcldpZHRoKSk6YS5ib3JkZXJXaWR0aHx8MSxlLnN0cm9rZVN0eWxlPWEuYm9yZGVyQ29sb3IsZS5zZXRMaW5lRGFzaChhLmJvcmRlckRhc2h8fFtdKSxlLmxpbmVEYXNoT2Zmc2V0PWEuYm9yZGVyRGFzaE9mZnNldHx8MDtsZXQgdD1yLmxlZnRGb3JMdHIoZCxjKSxuPXIubGVmdEZvckx0cihyLnhQbHVzKGQsMSksYy0yKSxvPVdzKGEuYm9yZGVyUmFkaXVzKTtPYmplY3QudmFsdWVzKG8pLnNvbWUoZT0+ZSE9PTApPyhlLmJlZ2luUGF0aCgpLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLExzKGUse3g6dCx5OnAsdzpjLGg6cyxyYWRpdXM6b30pLGUuZmlsbCgpLGUuc3Ryb2tlKCksZS5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsZS5iZWdpblBhdGgoKSxMcyhlLHt4Om4seTpwKzEsdzpjLTIsaDpzLTIscmFkaXVzOm99KSxlLmZpbGwoKSk6KGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFJlY3QodCxwLGMscyksZS5zdHJva2VSZWN0KHQscCxjLHMpLGUuZmlsbFN0eWxlPWEuYmFja2dyb3VuZENvbG9yLGUuZmlsbFJlY3QobixwKzEsYy0yLHMtMikpfWUuZmlsbFN0eWxlPXRoaXMubGFiZWxUZXh0Q29sb3JzW25dfWRyYXdCb2R5KGUsdCxuKXtsZXR7Ym9keTpyfT10aGlzLHtib2R5U3BhY2luZzppLGJvZHlBbGlnbjphLGRpc3BsYXlDb2xvcnM6byxib3hIZWlnaHQ6cyxib3hXaWR0aDpjLGJveFBhZGRpbmc6bH09bix1PSQobi5ib2R5Rm9udCksZD11LmxpbmVIZWlnaHQsZj0wLHA9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpLG09ZnVuY3Rpb24obil7dC5maWxsVGV4dChuLHAueChlLngrZiksZS55K2QvMiksZS55Kz1kK2l9LGg9cC50ZXh0QWxpZ24oYSksZyxfLHYseSxiLHgsUztmb3IodC50ZXh0QWxpZ249YSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCx0LmZvbnQ9dS5zdHJpbmcsZS54PWRmKHRoaXMsaCxuKSx0LmZpbGxTdHlsZT1uLmJvZHlDb2xvcixZKHRoaXMuYmVmb3JlQm9keSxtKSxmPW8mJmghPT1gcmlnaHRgP2E9PT1gY2VudGVyYD9jLzIrbDpjKzIrbDowLHk9MCx4PXIubGVuZ3RoO3k8eDsrK3kpe2ZvcihnPXJbeV0sXz10aGlzLmxhYmVsVGV4dENvbG9yc1t5XSx0LmZpbGxTdHlsZT1fLFkoZy5iZWZvcmUsbSksdj1nLmxpbmVzLG8mJnYubGVuZ3RoJiYodGhpcy5fZHJhd0NvbG9yQm94KHQsZSx5LHAsbiksZD1NYXRoLm1heCh1LmxpbmVIZWlnaHQscykpLGI9MCxTPXYubGVuZ3RoO2I8UzsrK2IpbSh2W2JdKSxkPXUubGluZUhlaWdodDtZKGcuYWZ0ZXIsbSl9Zj0wLGQ9dS5saW5lSGVpZ2h0LFkodGhpcy5hZnRlckJvZHksbSksZS55LT1pfWRyYXdGb290ZXIoZSx0LG4pe2xldCByPXRoaXMuZm9vdGVyLGk9ci5sZW5ndGgsYSxvO2lmKGkpe2xldCBzPWpjKG4ucnRsLHRoaXMueCx0aGlzLndpZHRoKTtmb3IoZS54PWRmKHRoaXMsbi5mb290ZXJBbGlnbixuKSxlLnkrPW4uZm9vdGVyTWFyZ2luVG9wLHQudGV4dEFsaWduPXMudGV4dEFsaWduKG4uZm9vdGVyQWxpZ24pLHQudGV4dEJhc2VsaW5lPWBtaWRkbGVgLGE9JChuLmZvb3RlckZvbnQpLHQuZmlsbFN0eWxlPW4uZm9vdGVyQ29sb3IsdC5mb250PWEuc3RyaW5nLG89MDtvPGk7KytvKXQuZmlsbFRleHQocltvXSxzLngoZS54KSxlLnkrYS5saW5lSGVpZ2h0LzIpLGUueSs9YS5saW5lSGVpZ2h0K24uZm9vdGVyU3BhY2luZ319ZHJhd0JhY2tncm91bmQoZSx0LG4scil7bGV0e3hBbGlnbjppLHlBbGlnbjphfT10aGlzLHt4Om8seTpzfT1lLHt3aWR0aDpjLGhlaWdodDpsfT1uLHt0b3BMZWZ0OnUsdG9wUmlnaHQ6ZCxib3R0b21MZWZ0OmYsYm90dG9tUmlnaHQ6cH09V3Moci5jb3JuZXJSYWRpdXMpO3QuZmlsbFN0eWxlPXIuYmFja2dyb3VuZENvbG9yLHQuc3Ryb2tlU3R5bGU9ci5ib3JkZXJDb2xvcix0LmxpbmVXaWR0aD1yLmJvcmRlcldpZHRoLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8obyt1LHMpLGE9PT1gdG9wYCYmdGhpcy5kcmF3Q2FyZXQoZSx0LG4sciksdC5saW5lVG8obytjLWQscyksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzLG8rYyxzK2QpLGE9PT1gY2VudGVyYCYmaT09PWByaWdodGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rYyxzK2wtcCksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzK2wsbytjLXAscytsKSxhPT09YGJvdHRvbWAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rZixzK2wpLHQucXVhZHJhdGljQ3VydmVUbyhvLHMrbCxvLHMrbC1mKSxhPT09YGNlbnRlcmAmJmk9PT1gbGVmdGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8scyt1KSx0LnF1YWRyYXRpY0N1cnZlVG8obyxzLG8rdSxzKSx0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHIuYm9yZGVyV2lkdGg+MCYmdC5zdHJva2UoKX1fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KGUpe2xldCB0PXRoaXMuY2hhcnQsbj10aGlzLiRhbmltYXRpb25zLHI9biYmbi54LGk9biYmbi55O2lmKHJ8fGkpe2xldCBuPVFkW2UucG9zaXRpb25dLmNhbGwodGhpcyx0aGlzLl9hY3RpdmUsdGhpcy5fZXZlbnRQb3NpdGlvbik7aWYoIW4pcmV0dXJuO2xldCBhPXRoaXMuX3NpemU9bmYodGhpcyxlKSxvPU9iamVjdC5hc3NpZ24oe30sbix0aGlzLl9zaXplKSxzPXNmKHQsZSxvKSxjPXVmKGUsbyxzLHQpOyhyLl90byE9PWMueHx8aS5fdG8hPT1jLnkpJiYodGhpcy54QWxpZ249cy54QWxpZ24sdGhpcy55QWxpZ249cy55QWxpZ24sdGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuY2FyZXRYPW4ueCx0aGlzLmNhcmV0WT1uLnksdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcyxjKSl9fV93aWxsUmVuZGVyKCl7cmV0dXJuISF0aGlzLm9wYWNpdHl9ZHJhdyhlKXtsZXQgdD10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksbj10aGlzLm9wYWNpdHk7aWYoIW4pcmV0dXJuO3RoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldCh0KTtsZXQgcj17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9LGk9e3g6dGhpcy54LHk6dGhpcy55fTtuPU1hdGguYWJzKG4pPC4wMDE/MDpuO2xldCBhPVEodC5wYWRkaW5nKSxvPXRoaXMudGl0bGUubGVuZ3RofHx0aGlzLmJlZm9yZUJvZHkubGVuZ3RofHx0aGlzLmJvZHkubGVuZ3RofHx0aGlzLmFmdGVyQm9keS5sZW5ndGh8fHRoaXMuZm9vdGVyLmxlbmd0aDt0LmVuYWJsZWQmJm8mJihlLnNhdmUoKSxlLmdsb2JhbEFscGhhPW4sdGhpcy5kcmF3QmFja2dyb3VuZChpLGUscix0KSxNYyhlLHQudGV4dERpcmVjdGlvbiksaS55Kz1hLnRvcCx0aGlzLmRyYXdUaXRsZShpLGUsdCksdGhpcy5kcmF3Qm9keShpLGUsdCksdGhpcy5kcmF3Rm9vdGVyKGksZSx0KSxOYyhlLHQudGV4dERpcmVjdGlvbiksZS5yZXN0b3JlKCkpfWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9hY3RpdmUscj1lLm1hcCgoe2RhdGFzZXRJbmRleDplLGluZGV4OnR9KT0+e2xldCBuPXRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pLGk9ISRhKG4sciksYT10aGlzLl9wb3NpdGlvbkNoYW5nZWQocix0KTsoaXx8YSkmJih0aGlzLl9hY3RpdmU9cix0aGlzLl9ldmVudFBvc2l0aW9uPXQsdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzPSEwLHRoaXMudXBkYXRlKCEwKSl9aGFuZGxlRXZlbnQoZSx0LG49ITApe2lmKHQmJnRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cylyZXR1cm4hMTt0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHM9ITE7bGV0IHI9dGhpcy5vcHRpb25zLGk9dGhpcy5fYWN0aXZlfHxbXSxhPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsaSx0LG4pLG89dGhpcy5fcG9zaXRpb25DaGFuZ2VkKGEsZSkscz10fHwhJGEoYSxpKXx8bztyZXR1cm4gcyYmKHRoaXMuX2FjdGl2ZT1hLChyLmVuYWJsZWR8fHIuZXh0ZXJuYWwpJiYodGhpcy5fZXZlbnRQb3NpdGlvbj17eDplLngseTplLnl9LHRoaXMudXBkYXRlKCEwLHQpKSksc31fZ2V0QWN0aXZlRWxlbWVudHMoZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zO2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIXIpcmV0dXJuIHQuZmlsdGVyKGU9PnRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tlLmRhdGFzZXRJbmRleF0mJnRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZS5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKGUuaW5kZXgpIT09dm9pZCAwKTtsZXQgYT10aGlzLmNoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxuKTtyZXR1cm4gaS5yZXZlcnNlJiZhLnJldmVyc2UoKSxhfV9wb3NpdGlvbkNoYW5nZWQoZSx0KXtsZXR7Y2FyZXRYOm4sY2FyZXRZOnIsb3B0aW9uczppfT10aGlzLGE9UWRbaS5wb3NpdGlvbl0uY2FsbCh0aGlzLGUsdCk7cmV0dXJuIGEhPT0hMSYmKG4hPT1hLnh8fHIhPT1hLnkpfX0sdmY9e2lkOmB0b29sdGlwYCxfZWxlbWVudDpfZixwb3NpdGlvbmVyczpRZCxhZnRlckluaXQoZSx0LG4pe24mJihlLnRvb2x0aXA9bmV3IF9mKHtjaGFydDplLG9wdGlvbnM6bn0pKX0sYmVmb3JlVXBkYXRlKGUsdCxuKXtlLnRvb2x0aXAmJmUudG9vbHRpcC5pbml0aWFsaXplKG4pfSxyZXNldChlLHQsbil7ZS50b29sdGlwJiZlLnRvb2x0aXAuaW5pdGlhbGl6ZShuKX0sYWZ0ZXJEcmF3KGUpe2xldCB0PWUudG9vbHRpcDtpZih0JiZ0Ll93aWxsUmVuZGVyKCkpe2xldCBuPXt0b29sdGlwOnR9O2lmKGUubm90aWZ5UGx1Z2lucyhgYmVmb3JlVG9vbHRpcERyYXdgLHsuLi5uLGNhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjt0LmRyYXcoZS5jdHgpLGUubm90aWZ5UGx1Z2lucyhgYWZ0ZXJUb29sdGlwRHJhd2Asbil9fSxhZnRlckV2ZW50KGUsdCl7aWYoZS50b29sdGlwKXtsZXQgbj10LnJlcGxheTtlLnRvb2x0aXAuaGFuZGxlRXZlbnQodC5ldmVudCxuLHQuaW5DaGFydEFyZWEpJiYodC5jaGFuZ2VkPSEwKX19LGRlZmF1bHRzOntlbmFibGVkOiEwLGV4dGVybmFsOm51bGwscG9zaXRpb246YGF2ZXJhZ2VgLGJhY2tncm91bmRDb2xvcjpgcmdiYSgwLDAsMCwwLjgpYCx0aXRsZUNvbG9yOmAjZmZmYCx0aXRsZUZvbnQ6e3dlaWdodDpgYm9sZGB9LHRpdGxlU3BhY2luZzoyLHRpdGxlTWFyZ2luQm90dG9tOjYsdGl0bGVBbGlnbjpgbGVmdGAsYm9keUNvbG9yOmAjZmZmYCxib2R5U3BhY2luZzoyLGJvZHlGb250Ont9LGJvZHlBbGlnbjpgbGVmdGAsZm9vdGVyQ29sb3I6YCNmZmZgLGZvb3RlclNwYWNpbmc6Mixmb290ZXJNYXJnaW5Ub3A6Nixmb290ZXJGb250Ont3ZWlnaHQ6YGJvbGRgfSxmb290ZXJBbGlnbjpgbGVmdGAscGFkZGluZzo2LGNhcmV0UGFkZGluZzoyLGNhcmV0U2l6ZTo1LGNvcm5lclJhZGl1czo2LGJveEhlaWdodDooZSx0KT0+dC5ib2R5Rm9udC5zaXplLGJveFdpZHRoOihlLHQpPT50LmJvZHlGb250LnNpemUsbXVsdGlLZXlCYWNrZ3JvdW5kOmAjZmZmYCxkaXNwbGF5Q29sb3JzOiEwLGJveFBhZGRpbmc6MCxib3JkZXJDb2xvcjpgcmdiYSgwLDAsMCwwKWAsYm9yZGVyV2lkdGg6MCxhbmltYXRpb246e2R1cmF0aW9uOjQwMCxlYXNpbmc6YGVhc2VPdXRRdWFydGB9LGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgd2lkdGhgLGBoZWlnaHRgLGBjYXJldFhgLGBjYXJldFlgXX0sb3BhY2l0eTp7ZWFzaW5nOmBsaW5lYXJgLGR1cmF0aW9uOjIwMH19LGNhbGxiYWNrczpoZn0sZGVmYXVsdFJvdXRlczp7Ym9keUZvbnQ6YGZvbnRgLGZvb3RlckZvbnQ6YGZvbnRgLHRpdGxlRm9udDpgZm9udGB9LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT5lIT09YGZpbHRlcmAmJmUhPT1gaXRlbVNvcnRgJiZlIT09YGV4dGVybmFsYCxfaW5kZXhhYmxlOiExLGNhbGxiYWNrczp7X3NjcmlwdGFibGU6ITEsX2luZGV4YWJsZTohMX0sYW5pbWF0aW9uOntfZmFsbGJhY2s6ITF9LGFuaW1hdGlvbnM6e19mYWxsYmFjazpgYW5pbWF0aW9uYH19LGFkZGl0aW9uYWxPcHRpb25TY29wZXM6W2BpbnRlcmFjdGlvbmBdfSx5Zj0oZSx0LG4scik9Pih0eXBlb2YgdD09YHN0cmluZ2A/KG49ZS5wdXNoKHQpLTEsci51bnNoaWZ0KHtpbmRleDpuLGxhYmVsOnR9KSk6aXNOYU4odCkmJihuPW51bGwpLG4pO2Z1bmN0aW9uIGJmKGUsdCxuLHIpe2xldCBpPWUuaW5kZXhPZih0KTtyZXR1cm4gaT09PS0xP3lmKGUsdCxuLHIpOmk9PT1lLmxhc3RJbmRleE9mKHQpP2k6bn12YXIgeGY9KGUsdCk9PmU9PT1udWxsP251bGw6Um8oTWF0aC5yb3VuZChlKSwwLHQpO2Z1bmN0aW9uIFNmKGUpe2xldCB0PXRoaXMuZ2V0TGFiZWxzKCk7cmV0dXJuIGU+PTAmJmU8dC5sZW5ndGg/dFtlXTplfXZhciBDZj1jbGFzcyBleHRlbmRzIFV1e3N0YXRpYyBpZD1gY2F0ZWdvcnlgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOlNmfX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wLHRoaXMuX2FkZGVkTGFiZWxzPVtdfWluaXQoZSl7bGV0IHQ9dGhpcy5fYWRkZWRMYWJlbHM7aWYodC5sZW5ndGgpe2xldCBlPXRoaXMuZ2V0TGFiZWxzKCk7Zm9yKGxldHtpbmRleDpuLGxhYmVsOnJ9b2YgdCllW25dPT09ciYmZS5zcGxpY2UobiwxKTt0aGlzLl9hZGRlZExhYmVscz1bXX1zdXBlci5pbml0KGUpfXBhcnNlKGUsdCl7aWYoVShlKSlyZXR1cm4gbnVsbDtsZXQgbj10aGlzLmdldExhYmVscygpO3JldHVybiB0PWlzRmluaXRlKHQpJiZuW3RdPT09ZT90OmJmKG4sZSxxKHQsZSksdGhpcy5fYWRkZWRMYWJlbHMpLHhmKHQsbi5sZW5ndGgtMSl9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOm4sbWF4OnJ9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm9wdGlvbnMuYm91bmRzPT09YHRpY2tzYCYmKGV8fChuPTApLHR8fChyPXRoaXMuZ2V0TGFiZWxzKCkubGVuZ3RoLTEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMubWluLHQ9dGhpcy5tYXgsbj10aGlzLm9wdGlvbnMub2Zmc2V0LHI9W10saT10aGlzLmdldExhYmVscygpO2k9ZT09PTAmJnQ9PT1pLmxlbmd0aC0xP2k6aS5zbGljZShlLHQrMSksdGhpcy5fdmFsdWVSYW5nZT1NYXRoLm1heChpLmxlbmd0aC0rIW4sMSksdGhpcy5fc3RhcnRWYWx1ZT10aGlzLm1pbi0obj8uNTowKTtmb3IobGV0IG49ZTtuPD10O24rKylyLnB1c2goe3ZhbHVlOm59KTtyZXR1cm4gcn1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBTZi5jYWxsKHRoaXMsZSl9Y29uZmlndXJlKCl7c3VwZXIuY29uZmlndXJlKCksdGhpcy5pc0hvcml6b250YWwoKXx8KHRoaXMuX3JldmVyc2VQaXhlbHM9IXRoaXMuX3JldmVyc2VQaXhlbHMpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIHR5cGVvZiBlIT1gbnVtYmVyYCYmKGU9dGhpcy5wYXJzZShlKSksZT09PW51bGw/TmFOOnRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKChlLXRoaXMuX3N0YXJ0VmFsdWUpL3RoaXMuX3ZhbHVlUmFuZ2UpfWdldFBpeGVsRm9yVGljayhlKXtsZXQgdD10aGlzLnRpY2tzO3JldHVybiBlPDB8fGU+dC5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0W2VdLnZhbHVlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUrdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwoZSkqdGhpcy5fdmFsdWVSYW5nZSl9Z2V0QmFzZVBpeGVsKCl7cmV0dXJuIHRoaXMuYm90dG9tfX07ZnVuY3Rpb24gd2YoZSx0KXtsZXQgbj1bXSx7Ym91bmRzOnIsc3RlcDppLG1pbjphLG1heDpvLHByZWNpc2lvbjpzLGNvdW50OmMsbWF4VGlja3M6bCxtYXhEaWdpdHM6dSxpbmNsdWRlQm91bmRzOmR9PWUsZj1pfHwxLHA9bC0xLHttaW46bSxtYXg6aH09dCxnPSFVKGEpLF89IVUobyksdj0hVShjKSx5PShoLW0pLyh1KzEpLGI9VG8oKGgtbSkvcC9mKSpmLHgsUyxDLHc7aWYoYjwxZS0xNCYmIWcmJiFfKXJldHVyblt7dmFsdWU6bX0se3ZhbHVlOmh9XTt3PU1hdGguY2VpbChoL2IpLU1hdGguZmxvb3IobS9iKSx3PnAmJihiPVRvKHcqYi9wL2YpKmYpLFUocyl8fCh4PTEwKipzLGI9TWF0aC5jZWlsKGIqeCkveCkscj09PWB0aWNrc2A/KFM9TWF0aC5mbG9vcihtL2IpKmIsQz1NYXRoLmNlaWwoaC9iKSpiKTooUz1tLEM9aCksZyYmXyYmaSYma28oKG8tYSkvaSxiLzFlMyk/KHc9TWF0aC5yb3VuZChNYXRoLm1pbigoby1hKS9iLGwpKSxiPShvLWEpL3csUz1hLEM9byk6dj8oUz1nP2E6UyxDPV8/bzpDLHc9Yy0xLGI9KEMtUykvdyk6KHc9KEMtUykvYix3PXdvKHcsTWF0aC5yb3VuZCh3KSxiLzFlMyk/TWF0aC5yb3VuZCh3KTpNYXRoLmNlaWwodykpO2xldCBUPU1hdGgubWF4KE5vKGIpLE5vKFMpKTt4PTEwKiooVShzKT9UOnMpLFM9TWF0aC5yb3VuZChTKngpL3gsQz1NYXRoLnJvdW5kKEMqeCkveDtsZXQgRT0wO2ZvcihnJiYoZCYmUyE9PWE/KG4ucHVzaCh7dmFsdWU6YX0pLFM8YSYmRSsrLHdvKE1hdGgucm91bmQoKFMrRSpiKSp4KS94LGEsVGYoYSx5LGUpKSYmRSsrKTpTPGEmJkUrKyk7RTx3OysrRSl7bGV0IGU9TWF0aC5yb3VuZCgoUytFKmIpKngpL3g7aWYoXyYmZT5vKWJyZWFrO24ucHVzaCh7dmFsdWU6ZX0pfXJldHVybiBfJiZkJiZDIT09bz9uLmxlbmd0aCYmd28obltuLmxlbmd0aC0xXS52YWx1ZSxvLFRmKG8seSxlKSk/bltuLmxlbmd0aC0xXS52YWx1ZT1vOm4ucHVzaCh7dmFsdWU6b30pOighX3x8Qz09PW8pJiZuLnB1c2goe3ZhbHVlOkN9KSxufWZ1bmN0aW9uIFRmKGUsdCx7aG9yaXpvbnRhbDpuLG1pblJvdGF0aW9uOnJ9KXtsZXQgaT1qbyhyKSxhPShuP01hdGguc2luKGkpOk1hdGguY29zKGkpKXx8LjAwMSxvPS43NSp0KihgYCtlKS5sZW5ndGg7cmV0dXJuIE1hdGgubWluKHQvYSxvKX12YXIgRWY9Y2xhc3MgZXh0ZW5kcyBVdXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fZW5kVmFsdWU9dm9pZCAwLHRoaXMuX3ZhbHVlUmFuZ2U9MH1wYXJzZShlLHQpe3JldHVybiBVKGUpfHwodHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmIWlzRmluaXRlKCtlKT9udWxsOitlfWhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKXtsZXR7YmVnaW5BdFplcm86ZX09dGhpcy5vcHRpb25zLHttaW5EZWZpbmVkOnQsbWF4RGVmaW5lZDpufT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOnIsbWF4Oml9PXRoaXMsYT1lPT5yPXQ/cjplLG89ZT0+aT1uP2k6ZTtpZihlKXtsZXQgZT1DbyhyKSx0PUNvKGkpO2U8MCYmdDwwP28oMCk6ZT4wJiZ0PjAmJmEoMCl9aWYocj09PWkpe2xldCB0PWk9PT0wPzE6TWF0aC5hYnMoaSouMDUpO28oaSt0KSxlfHxhKHItdCl9dGhpcy5taW49cix0aGlzLm1heD1pfWdldFRpY2tMaW1pdCgpe2xldHttYXhUaWNrc0xpbWl0OmUsc3RlcFNpemU6dH09dGhpcy5vcHRpb25zLnRpY2tzLG47cmV0dXJuIHQ/KG49TWF0aC5jZWlsKHRoaXMubWF4L3QpLU1hdGguZmxvb3IodGhpcy5taW4vdCkrMSxuPjFlMyYmKGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7dH0gd291bGQgcmVzdWx0IGdlbmVyYXRpbmcgdXAgdG8gJHtufSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKSxuPTFlMykpOihuPXRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpLGV8fD0xMSksZSYmKG49TWF0aC5taW4oZSxuKSksbn1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIDEvMH1idWlsZFRpY2tzKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPXRoaXMuZ2V0VGlja0xpbWl0KCk7bj1NYXRoLm1heCgyLG4pO2xldCByPXdmKHttYXhUaWNrczpuLGJvdW5kczplLmJvdW5kcyxtaW46ZS5taW4sbWF4OmUubWF4LHByZWNpc2lvbjp0LnByZWNpc2lvbixzdGVwOnQuc3RlcFNpemUsY291bnQ6dC5jb3VudCxtYXhEaWdpdHM6dGhpcy5fbWF4RGlnaXRzKCksaG9yaXpvbnRhbDp0aGlzLmlzSG9yaXpvbnRhbCgpLG1pblJvdGF0aW9uOnQubWluUm90YXRpb258fDAsaW5jbHVkZUJvdW5kczp0LmluY2x1ZGVCb3VuZHMhPT0hMX0sdGhpcy5fcmFuZ2V8fHRoaXMpO3JldHVybiBlLmJvdW5kcz09PWB0aWNrc2AmJkFvKHIsdGhpcyxgdmFsdWVgKSxlLnJldmVyc2U/KHIucmV2ZXJzZSgpLHRoaXMuc3RhcnQ9dGhpcy5tYXgsdGhpcy5lbmQ9dGhpcy5taW4pOih0aGlzLnN0YXJ0PXRoaXMubWluLHRoaXMuZW5kPXRoaXMubWF4KSxyfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMudGlja3MsdD10aGlzLm1pbixuPXRoaXMubWF4O2lmKHN1cGVyLmNvbmZpZ3VyZSgpLHRoaXMub3B0aW9ucy5vZmZzZXQmJmUubGVuZ3RoKXtsZXQgcj0obi10KS9NYXRoLm1heChlLmxlbmd0aC0xLDEpLzI7dC09cixuKz1yfXRoaXMuX3N0YXJ0VmFsdWU9dCx0aGlzLl9lbmRWYWx1ZT1uLHRoaXMuX3ZhbHVlUmFuZ2U9bi10fWdldExhYmVsRm9yVmFsdWUoZSl7cmV0dXJuIG1zKGUsdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KX19LERmPWNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWBsaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY319O2RldGVybWluZURhdGFMaW1pdHMoKXtsZXR7bWluOmUsbWF4OnR9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1LKGUpP2U6MCx0aGlzLm1heD1LKHQpP3Q6MSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7bGV0IGU9dGhpcy5pc0hvcml6b250YWwoKSx0PWU/dGhpcy53aWR0aDp0aGlzLmhlaWdodCxuPWpvKHRoaXMub3B0aW9ucy50aWNrcy5taW5Sb3RhdGlvbikscj0oZT9NYXRoLnNpbihuKTpNYXRoLmNvcyhuKSl8fC4wMDEsaT10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApO3JldHVybiBNYXRoLmNlaWwodC9NYXRoLm1pbig0MCxpLmxpbmVIZWlnaHQvcikpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIGU9PT1udWxsP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgoZS10aGlzLl9zdGFydFZhbHVlKS90aGlzLl92YWx1ZVJhbmdlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiB0aGlzLl9zdGFydFZhbHVlK3RoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpKnRoaXMuX3ZhbHVlUmFuZ2V9fSxPZj1lPT5NYXRoLmZsb29yKFNvKGUpKSxrZj0oZSx0KT0+MTAqKihPZihlKSt0KTtmdW5jdGlvbiBBZihlKXtyZXR1cm4gZS8xMCoqT2YoZSk9PTF9ZnVuY3Rpb24gamYoZSx0LG4pe2xldCByPTEwKipuLGk9TWF0aC5mbG9vcihlL3IpO3JldHVybiBNYXRoLmNlaWwodC9yKS1pfWZ1bmN0aW9uIE1mKGUsdCl7bGV0IG49T2YodC1lKTtmb3IoO2pmKGUsdCxuKT4xMDspbisrO2Zvcig7amYoZSx0LG4pPDEwOyluLS07cmV0dXJuIE1hdGgubWluKG4sT2YoZSkpfWZ1bmN0aW9uIE5mKGUse21pbjp0LG1heDpufSl7dD1aYShlLm1pbix0KTtsZXQgcj1bXSxpPU9mKHQpLGE9TWYodCxuKSxvPWE8MD8xMCoqTWF0aC5hYnMoYSk6MSxzPTEwKiphLGM9aT5hPzEwKippOjAsbD1NYXRoLnJvdW5kKCh0LWMpKm8pL28sdT1NYXRoLmZsb29yKCh0LWMpL3MvMTApKnMqMTAsZD1NYXRoLmZsb29yKChsLXUpLzEwKiphKSxmPVphKGUubWluLE1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vKTtmb3IoO2Y8bjspci5wdXNoKHt2YWx1ZTpmLG1ham9yOkFmKGYpLHNpZ25pZmljYW5kOmR9KSxkPj0xMD9kPWQ8MTU/MTU6MjA6ZCsrLGQ+PTIwJiYoYSsrLGQ9MixvPWE+PTA/MTpvKSxmPU1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vO2xldCBwPVphKGUubWF4LGYpO3JldHVybiByLnB1c2goe3ZhbHVlOnAsbWFqb3I6QWYocCksc2lnbmlmaWNhbmQ6ZH0pLHJ9KGNsYXNzIGV4dGVuZHMgVXV7c3RhdGljIGlkPWBsb2dhcml0aG1pY2A7c3RhdGljIGRlZmF1bHRzPXt0aWNrczp7Y2FsbGJhY2s6X3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxtYWpvcjp7ZW5hYmxlZDohMH19fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKGUsdCl7bGV0IG49RWYucHJvdG90eXBlLnBhcnNlLmFwcGx5KHRoaXMsW2UsdF0pO2lmKG49PT0wKXt0aGlzLl96ZXJvPSEwO3JldHVybn1yZXR1cm4gSyhuKSYmbj4wP246bnVsbH1kZXRlcm1pbmVEYXRhTGltaXRzKCl7bGV0e21pbjplLG1heDp0fT10aGlzLmdldE1pbk1heCghMCk7dGhpcy5taW49SyhlKT9NYXRoLm1heCgwLGUpOm51bGwsdGhpcy5tYXg9Syh0KT9NYXRoLm1heCgwLHQpOm51bGwsdGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvJiYodGhpcy5femVybz0hMCksdGhpcy5femVybyYmdGhpcy5taW4hPT10aGlzLl9zdWdnZXN0ZWRNaW4mJiFLKHRoaXMuX3VzZXJNaW4pJiYodGhpcy5taW49ZT09PWtmKHRoaXMubWluLDApP2tmKHRoaXMubWluLC0xKTprZih0aGlzLm1pbiwwKSksdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCl9aGFuZGxlVGlja1JhbmdlT3B0aW9ucygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSxuPXRoaXMubWluLHI9dGhpcy5tYXgsaT10PT5uPWU/bjp0LGE9ZT0+cj10P3I6ZTtuPT09ciYmKG48PTA/KGkoMSksYSgxMCkpOihpKGtmKG4sLTEpKSxhKGtmKHIsMSkpKSksbjw9MCYmaShrZihyLC0xKSkscjw9MCYmYShrZihuLDEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PU5mKHttaW46dGhpcy5fdXNlck1pbixtYXg6dGhpcy5fdXNlck1heH0sdGhpcyk7cmV0dXJuIGUuYm91bmRzPT09YHRpY2tzYCYmQW8odCx0aGlzLGB2YWx1ZWApLGUucmV2ZXJzZT8odC5yZXZlcnNlKCksdGhpcy5zdGFydD10aGlzLm1heCx0aGlzLmVuZD10aGlzLm1pbik6KHRoaXMuc3RhcnQ9dGhpcy5taW4sdGhpcy5lbmQ9dGhpcy5tYXgpLHR9Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZT09PXZvaWQgMD9gMGA6bXMoZSx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMubWluO3N1cGVyLmNvbmZpZ3VyZSgpLHRoaXMuX3N0YXJ0VmFsdWU9U28oZSksdGhpcy5fdmFsdWVSYW5nZT1Tbyh0aGlzLm1heCktU28oZSl9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtyZXR1cm4oZT09PXZvaWQgMHx8ZT09PTApJiYoZT10aGlzLm1pbiksZT09PW51bGx8fGlzTmFOKGUpP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbChlPT09dGhpcy5taW4/MDooU28oZSktdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbChlKXtsZXQgdD10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKTtyZXR1cm4gMTAqKih0aGlzLl9zdGFydFZhbHVlK3QqdGhpcy5fdmFsdWVSYW5nZSl9fSk7ZnVuY3Rpb24gUGYoZSl7bGV0IHQ9ZS50aWNrcztpZih0LmRpc3BsYXkmJmUuZGlzcGxheSl7bGV0IGU9USh0LmJhY2tkcm9wUGFkZGluZyk7cmV0dXJuIHEodC5mb250JiZ0LmZvbnQuc2l6ZSxaLmZvbnQuc2l6ZSkrZS5oZWlnaHR9cmV0dXJuIDB9ZnVuY3Rpb24gRmYoZSx0LG4pe3JldHVybiBuPVcobik/bjpbbl0se3c6VHMoZSx0LnN0cmluZyxuKSxoOm4ubGVuZ3RoKnQubGluZUhlaWdodH19ZnVuY3Rpb24gSWYoZSx0LG4scixpKXtyZXR1cm4gZT09PXJ8fGU9PT1pP3tzdGFydDp0LW4vMixlbmQ6dCtuLzJ9OmU8cnx8ZT5pP3tzdGFydDp0LW4sZW5kOnR9OntzdGFydDp0LGVuZDp0K259fWZ1bmN0aW9uIExmKGUpe2xldCB0PXtsOmUubGVmdCtlLl9wYWRkaW5nLmxlZnQscjplLnJpZ2h0LWUuX3BhZGRpbmcucmlnaHQsdDplLnRvcCtlLl9wYWRkaW5nLnRvcCxiOmUuYm90dG9tLWUuX3BhZGRpbmcuYm90dG9tfSxuPU9iamVjdC5hc3NpZ24oe30sdCkscj1bXSxpPVtdLGE9ZS5fcG9pbnRMYWJlbHMubGVuZ3RoLG89ZS5vcHRpb25zLnBvaW50TGFiZWxzLHM9by5jZW50ZXJQb2ludExhYmVscz9YL2E6MDtmb3IobGV0IGM9MDtjPGE7YysrKXtsZXQgYT1vLnNldENvbnRleHQoZS5nZXRQb2ludExhYmVsQ29udGV4dChjKSk7aVtjXT1hLnBhZGRpbmc7bGV0IGw9ZS5nZXRQb2ludFBvc2l0aW9uKGMsZS5kcmF3aW5nQXJlYStpW2NdLHMpLHU9JChhLmZvbnQpLGQ9RmYoZS5jdHgsdSxlLl9wb2ludExhYmVsc1tjXSk7cltjXT1kO2xldCBmPUlvKGUuZ2V0SW5kZXhBbmdsZShjKStzKSxwPU1hdGgucm91bmQoTW8oZikpO1JmKG4sdCxmLElmKHAsbC54LGQudywwLDE4MCksSWYocCxsLnksZC5oLDkwLDI3MCkpfWUuc2V0Q2VudGVyUG9pbnQodC5sLW4ubCxuLnItdC5yLHQudC1uLnQsbi5iLXQuYiksZS5fcG9pbnRMYWJlbEl0ZW1zPVZmKGUscixpKX1mdW5jdGlvbiBSZihlLHQsbixyLGkpe2xldCBhPU1hdGguYWJzKE1hdGguc2luKG4pKSxvPU1hdGguYWJzKE1hdGguY29zKG4pKSxzPTAsYz0wO3Iuc3RhcnQ8dC5sPyhzPSh0Lmwtci5zdGFydCkvYSxlLmw9TWF0aC5taW4oZS5sLHQubC1zKSk6ci5lbmQ+dC5yJiYocz0oci5lbmQtdC5yKS9hLGUucj1NYXRoLm1heChlLnIsdC5yK3MpKSxpLnN0YXJ0PHQudD8oYz0odC50LWkuc3RhcnQpL28sZS50PU1hdGgubWluKGUudCx0LnQtYykpOmkuZW5kPnQuYiYmKGM9KGkuZW5kLXQuYikvbyxlLmI9TWF0aC5tYXgoZS5iLHQuYitjKSl9ZnVuY3Rpb24gemYoZSx0LG4pe2xldCByPWUuZHJhd2luZ0FyZWEse2V4dHJhOmksYWRkaXRpb25hbEFuZ2xlOmEscGFkZGluZzpvLHNpemU6c309bixjPWUuZ2V0UG9pbnRQb3NpdGlvbih0LHIraStvLGEpLGw9TWF0aC5yb3VuZChNbyhJbyhjLmFuZ2xlK3lvKSkpLHU9V2YoYy55LHMuaCxsKSxkPUhmKGwpLGY9VWYoYy54LHMudyxkKTtyZXR1cm57dmlzaWJsZTohMCx4OmMueCx5OnUsdGV4dEFsaWduOmQsbGVmdDpmLHRvcDp1LHJpZ2h0OmYrcy53LGJvdHRvbTp1K3MuaH19ZnVuY3Rpb24gQmYoZSx0KXtpZighdClyZXR1cm4hMDtsZXR7bGVmdDpuLHRvcDpyLHJpZ2h0OmksYm90dG9tOmF9PWU7cmV0dXJuIShBcyh7eDpuLHk6cn0sdCl8fEFzKHt4Om4seTphfSx0KXx8QXMoe3g6aSx5OnJ9LHQpfHxBcyh7eDppLHk6YX0sdCkpfWZ1bmN0aW9uIFZmKGUsdCxuKXtsZXQgcj1bXSxpPWUuX3BvaW50TGFiZWxzLmxlbmd0aCxhPWUub3B0aW9ucyx7Y2VudGVyUG9pbnRMYWJlbHM6byxkaXNwbGF5OnN9PWEucG9pbnRMYWJlbHMsYz17ZXh0cmE6UGYoYSkvMixhZGRpdGlvbmFsQW5nbGU6bz9YL2k6MH0sbDtmb3IobGV0IGE9MDthPGk7YSsrKXtjLnBhZGRpbmc9blthXSxjLnNpemU9dFthXTtsZXQgaT16ZihlLGEsYyk7ci5wdXNoKGkpLHM9PT1gYXV0b2AmJihpLnZpc2libGU9QmYoaSxsKSxpLnZpc2libGUmJihsPWkpKX1yZXR1cm4gcn1mdW5jdGlvbiBIZihlKXtyZXR1cm4gZT09PTB8fGU9PT0xODA/YGNlbnRlcmA6ZTwxODA/YGxlZnRgOmByaWdodGB9ZnVuY3Rpb24gVWYoZSx0LG4pe3JldHVybiBuPT09YHJpZ2h0YD9lLT10Om49PT1gY2VudGVyYCYmKGUtPXQvMiksZX1mdW5jdGlvbiBXZihlLHQsbil7cmV0dXJuIG49PT05MHx8bj09PTI3MD9lLT10LzI6KG4+MjcwfHxuPDkwKSYmKGUtPXQpLGV9ZnVuY3Rpb24gR2YoZSx0LG4pe2xldHtsZWZ0OnIsdG9wOmkscmlnaHQ6YSxib3R0b206b309bix7YmFja2Ryb3BDb2xvcjpzfT10O2lmKCFVKHMpKXtsZXQgbj1Xcyh0LmJvcmRlclJhZGl1cyksYz1RKHQuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxTdHlsZT1zO2xldCBsPXItYy5sZWZ0LHU9aS1jLnRvcCxkPWEtcitjLndpZHRoLGY9by1pK2MuaGVpZ2h0O09iamVjdC52YWx1ZXMobikuc29tZShlPT5lIT09MCk/KGUuYmVnaW5QYXRoKCksTHMoZSx7eDpsLHk6dSx3OmQsaDpmLHJhZGl1czpufSksZS5maWxsKCkpOmUuZmlsbFJlY3QobCx1LGQsZil9fWZ1bmN0aW9uIEtmKGUsdCl7bGV0e2N0eDpuLG9wdGlvbnM6e3BvaW50TGFiZWxzOnJ9fT1lO2ZvcihsZXQgaT10LTE7aT49MDtpLS0pe2xldCB0PWUuX3BvaW50TGFiZWxJdGVtc1tpXTtpZighdC52aXNpYmxlKWNvbnRpbnVlO2xldCBhPXIuc2V0Q29udGV4dChlLmdldFBvaW50TGFiZWxDb250ZXh0KGkpKTtHZihuLGEsdCk7bGV0IG89JChhLmZvbnQpLHt4OnMseTpjLHRleHRBbGlnbjpsfT10O0lzKG4sZS5fcG9pbnRMYWJlbHNbaV0scyxjK28ubGluZUhlaWdodC8yLG8se2NvbG9yOmEuY29sb3IsdGV4dEFsaWduOmwsdGV4dEJhc2VsaW5lOmBtaWRkbGVgfSl9fWZ1bmN0aW9uIHFmKGUsdCxuLHIpe2xldHtjdHg6aX09ZTtpZihuKWkuYXJjKGUueENlbnRlcixlLnlDZW50ZXIsdCwwLGdvKTtlbHNle2xldCBuPWUuZ2V0UG9pbnRQb3NpdGlvbigwLHQpO2kubW92ZVRvKG4ueCxuLnkpO2ZvcihsZXQgYT0xO2E8cjthKyspbj1lLmdldFBvaW50UG9zaXRpb24oYSx0KSxpLmxpbmVUbyhuLngsbi55KX19ZnVuY3Rpb24gSmYoZSx0LG4scixpKXtsZXQgYT1lLmN0eCxvPXQuY2lyY3VsYXIse2NvbG9yOnMsbGluZVdpZHRoOmN9PXQ7IW8mJiFyfHwhc3x8IWN8fG48MHx8KGEuc2F2ZSgpLGEuc3Ryb2tlU3R5bGU9cyxhLmxpbmVXaWR0aD1jLGEuc2V0TGluZURhc2goaS5kYXNofHxbXSksYS5saW5lRGFzaE9mZnNldD1pLmRhc2hPZmZzZXQsYS5iZWdpblBhdGgoKSxxZihlLG4sbyxyKSxhLmNsb3NlUGF0aCgpLGEuc3Ryb2tlKCksYS5yZXN0b3JlKCkpfWZ1bmN0aW9uIFlmKGUsdCxuKXtyZXR1cm4gcXMoZSx7bGFiZWw6bixpbmRleDp0LHR5cGU6YHBvaW50TGFiZWxgfSl9KGNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWByYWRpYWxMaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGlzcGxheTohMCxhbmltYXRlOiEwLHBvc2l0aW9uOmBjaGFydEFyZWFgLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjB9LGdyaWQ6e2NpcmN1bGFyOiExfSxzdGFydEFuZ2xlOjAsdGlja3M6e3Nob3dMYWJlbEJhY2tkcm9wOiEwLGNhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY30scG9pbnRMYWJlbHM6e2JhY2tkcm9wQ29sb3I6dm9pZCAwLGJhY2tkcm9wUGFkZGluZzoyLGRpc3BsYXk6ITAsZm9udDp7c2l6ZToxMH0sY2FsbGJhY2soZSl7cmV0dXJuIGV9LHBhZGRpbmc6NSxjZW50ZXJQb2ludExhYmVsczohMX19O3N0YXRpYyBkZWZhdWx0Um91dGVzPXsiYW5nbGVMaW5lcy5jb2xvciI6YGJvcmRlckNvbG9yYCwicG9pbnRMYWJlbHMuY29sb3IiOmBjb2xvcmAsInRpY2tzLmNvbG9yIjpgY29sb3JgfTtzdGF0aWMgZGVzY3JpcHRvcnM9e2FuZ2xlTGluZXM6e19mYWxsYmFjazpgZ3JpZGB9fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnhDZW50ZXI9dm9pZCAwLHRoaXMueUNlbnRlcj12b2lkIDAsdGhpcy5kcmF3aW5nQXJlYT12b2lkIDAsdGhpcy5fcG9pbnRMYWJlbHM9W10sdGhpcy5fcG9pbnRMYWJlbEl0ZW1zPVtdfXNldERpbWVuc2lvbnMoKXtsZXQgZT10aGlzLl9wYWRkaW5nPVEoUGYodGhpcy5vcHRpb25zKS8yKSx0PXRoaXMud2lkdGg9dGhpcy5tYXhXaWR0aC1lLndpZHRoLG49dGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQtZS5oZWlnaHQ7dGhpcy54Q2VudGVyPU1hdGguZmxvb3IodGhpcy5sZWZ0K3QvMitlLmxlZnQpLHRoaXMueUNlbnRlcj1NYXRoLmZsb29yKHRoaXMudG9wK24vMitlLnRvcCksdGhpcy5kcmF3aW5nQXJlYT1NYXRoLmZsb29yKE1hdGgubWluKHQsbikvMil9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW46ZSxtYXg6dH09dGhpcy5nZXRNaW5NYXgoITEpO3RoaXMubWluPUsoZSkmJiFpc05hTihlKT9lOjAsdGhpcy5tYXg9Syh0KSYmIWlzTmFOKHQpP3Q6MCx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhL1BmKHRoaXMub3B0aW9ucykpfWdlbmVyYXRlVGlja0xhYmVscyhlKXtFZi5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcyxlKSx0aGlzLl9wb2ludExhYmVscz10aGlzLmdldExhYmVscygpLm1hcCgoZSx0KT0+e2xldCBuPUoodGhpcy5vcHRpb25zLnBvaW50TGFiZWxzLmNhbGxiYWNrLFtlLHRdLHRoaXMpO3JldHVybiBufHxuPT09MD9uOmBgfSkuZmlsdGVyKChlLHQpPT50aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KHQpKX1maXQoKXtsZXQgZT10aGlzLm9wdGlvbnM7ZS5kaXNwbGF5JiZlLnBvaW50TGFiZWxzLmRpc3BsYXk/TGYodGhpcyk6dGhpcy5zZXRDZW50ZXJQb2ludCgwLDAsMCwwKX1zZXRDZW50ZXJQb2ludChlLHQsbixyKXt0aGlzLnhDZW50ZXIrPU1hdGguZmxvb3IoKGUtdCkvMiksdGhpcy55Q2VudGVyKz1NYXRoLmZsb29yKChuLXIpLzIpLHRoaXMuZHJhd2luZ0FyZWEtPU1hdGgubWluKHRoaXMuZHJhd2luZ0FyZWEvMixNYXRoLm1heChlLHQsbixyKSl9Z2V0SW5kZXhBbmdsZShlKXtsZXQgdD1nby8odGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RofHwxKSxuPXRoaXMub3B0aW9ucy5zdGFydEFuZ2xlfHwwO3JldHVybiBJbyhlKnQram8obikpfWdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbik7cmV0dXJuIHRoaXMub3B0aW9ucy5yZXZlcnNlPyh0aGlzLm1heC1lKSp0OihlLXRoaXMubWluKSp0fWdldFZhbHVlRm9yRGlzdGFuY2VGcm9tQ2VudGVyKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD1lLyh0aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbikpO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT90aGlzLm1heC10OnRoaXMubWluK3R9Z2V0UG9pbnRMYWJlbENvbnRleHQoZSl7bGV0IHQ9dGhpcy5fcG9pbnRMYWJlbHN8fFtdO2lmKGU+PTAmJmU8dC5sZW5ndGgpe2xldCBuPXRbZV07cmV0dXJuIFlmKHRoaXMuZ2V0Q29udGV4dCgpLGUsbil9fWdldFBvaW50UG9zaXRpb24oZSx0LG49MCl7bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKGUpLXlvK247cmV0dXJue3g6TWF0aC5jb3MocikqdCt0aGlzLnhDZW50ZXIseTpNYXRoLnNpbihyKSp0K3RoaXMueUNlbnRlcixhbmdsZTpyfX1nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGUsdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0KSl9Z2V0QmFzZVBvc2l0aW9uKGUpe3JldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShlfHwwLHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldFBvaW50TGFiZWxQb3NpdGlvbihlKXtsZXR7bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9PXRoaXMuX3BvaW50TGFiZWxJdGVtc1tlXTtyZXR1cm57bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2JhY2tncm91bmRDb2xvcjplLGdyaWQ6e2NpcmN1bGFyOnR9fT10aGlzLm9wdGlvbnM7aWYoZSl7bGV0IG49dGhpcy5jdHg7bi5zYXZlKCksbi5iZWdpblBhdGgoKSxxZih0aGlzLHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5fZW5kVmFsdWUpLHQsdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoKSxuLmNsb3NlUGF0aCgpLG4uZmlsbFN0eWxlPWUsbi5maWxsKCksbi5yZXN0b3JlKCl9fWRyYXdHcmlkKCl7bGV0IGU9dGhpcy5jdHgsdD10aGlzLm9wdGlvbnMse2FuZ2xlTGluZXM6bixncmlkOnIsYm9yZGVyOml9PXQsYT10aGlzLl9wb2ludExhYmVscy5sZW5ndGgsbyxzLGM7aWYodC5wb2ludExhYmVscy5kaXNwbGF5JiZLZih0aGlzLGEpLHIuZGlzcGxheSYmdGhpcy50aWNrcy5mb3JFYWNoKChlLHQpPT57aWYodCE9PTB8fHQ9PT0wJiZ0aGlzLm1pbjwwKXtzPXRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZS52YWx1ZSk7bGV0IG49dGhpcy5nZXRDb250ZXh0KHQpLG89ci5zZXRDb250ZXh0KG4pLGM9aS5zZXRDb250ZXh0KG4pO0pmKHRoaXMsbyxzLGEsYyl9fSksbi5kaXNwbGF5KXtmb3IoZS5zYXZlKCksbz1hLTE7bz49MDtvLS0pe2xldCByPW4uc2V0Q29udGV4dCh0aGlzLmdldFBvaW50TGFiZWxDb250ZXh0KG8pKSx7Y29sb3I6aSxsaW5lV2lkdGg6YX09cjshYXx8IWl8fChlLmxpbmVXaWR0aD1hLGUuc3Ryb2tlU3R5bGU9aSxlLnNldExpbmVEYXNoKHIuYm9yZGVyRGFzaCksZS5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQscz10aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHQucmV2ZXJzZT90aGlzLm1pbjp0aGlzLm1heCksYz10aGlzLmdldFBvaW50UG9zaXRpb24obyxzKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHRoaXMueENlbnRlcix0aGlzLnlDZW50ZXIpLGUubGluZVRvKGMueCxjLnkpLGUuc3Ryb2tlKCkpfWUucmVzdG9yZSgpfX1kcmF3Qm9yZGVyKCl7fWRyYXdMYWJlbHMoKXtsZXQgZT10aGlzLmN0eCx0PXRoaXMub3B0aW9ucyxuPXQudGlja3M7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKDApLGksYTtlLnNhdmUoKSxlLnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSxlLnJvdGF0ZShyKSxlLnRleHRBbGlnbj1gY2VudGVyYCxlLnRleHRCYXNlbGluZT1gbWlkZGxlYCx0aGlzLnRpY2tzLmZvckVhY2goKHIsbyk9PntpZihvPT09MCYmdGhpcy5taW4+PTAmJiF0LnJldmVyc2UpcmV0dXJuO2xldCBzPW4uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobykpLGM9JChzLmZvbnQpO2lmKGk9dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW29dLnZhbHVlKSxzLnNob3dMYWJlbEJhY2tkcm9wKXtlLmZvbnQ9Yy5zdHJpbmcsYT1lLm1lYXN1cmVUZXh0KHIubGFiZWwpLndpZHRoLGUuZmlsbFN0eWxlPXMuYmFja2Ryb3BDb2xvcjtsZXQgdD1RKHMuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxSZWN0KC1hLzItdC5sZWZ0LC1pLWMuc2l6ZS8yLXQudG9wLGErdC53aWR0aCxjLnNpemUrdC5oZWlnaHQpfUlzKGUsci5sYWJlbCwwLC1pLGMse2NvbG9yOnMuY29sb3Isc3Ryb2tlQ29sb3I6cy50ZXh0U3Ryb2tlQ29sb3Isc3Ryb2tlV2lkdGg6cy50ZXh0U3Ryb2tlV2lkdGh9KX0pLGUucmVzdG9yZSgpfWRyYXdUaXRsZSgpe319KTt2YXIgWGY9e21pbGxpc2Vjb25kOntjb21tb246ITAsc2l6ZToxLHN0ZXBzOjFlM30sc2Vjb25kOntjb21tb246ITAsc2l6ZToxZTMsc3RlcHM6NjB9LG1pbnV0ZTp7Y29tbW9uOiEwLHNpemU6NmU0LHN0ZXBzOjYwfSxob3VyOntjb21tb246ITAsc2l6ZTozNmU1LHN0ZXBzOjI0fSxkYXk6e2NvbW1vbjohMCxzaXplOjg2NGU1LHN0ZXBzOjMwfSx3ZWVrOntjb21tb246ITEsc2l6ZTo2MDQ4ZTUsc3RlcHM6NH0sbW9udGg6e2NvbW1vbjohMCxzaXplOjI2MjhlNixzdGVwczoxMn0scXVhcnRlcjp7Y29tbW9uOiExLHNpemU6Nzg4NGU2LHN0ZXBzOjR9LHllYXI6e2NvbW1vbjohMCxzaXplOjMxNTRlN319LFpmPU9iamVjdC5rZXlzKFhmKTtmdW5jdGlvbiBRZihlLHQpe3JldHVybiBlLXR9ZnVuY3Rpb24gJGYoZSx0KXtpZihVKHQpKXJldHVybiBudWxsO2xldCBuPWUuX2FkYXB0ZXIse3BhcnNlcjpyLHJvdW5kOmksaXNvV2Vla2RheTphfT1lLl9wYXJzZU9wdHMsbz10O3JldHVybiB0eXBlb2Ygcj09YGZ1bmN0aW9uYCYmKG89cihvKSksSyhvKXx8KG89dHlwZW9mIHI9PWBzdHJpbmdgP24ucGFyc2UobyxyKTpuLnBhcnNlKG8pKSxvPT09bnVsbD9udWxsOihpJiYobz1pPT09YHdlZWtgJiYoT28oYSl8fGE9PT0hMCk/bi5zdGFydE9mKG8sYGlzb1dlZWtgLGEpOm4uc3RhcnRPZihvLGkpKSwrbyl9ZnVuY3Rpb24gZXAoZSx0LG4scil7bGV0IGk9WmYubGVuZ3RoO2ZvcihsZXQgYT1aZi5pbmRleE9mKGUpO2E8aS0xOysrYSl7bGV0IGU9WGZbWmZbYV1dLGk9ZS5zdGVwcz9lLnN0ZXBzOjIqKjUzLTE7aWYoZS5jb21tb24mJk1hdGguY2VpbCgobi10KS8oaSplLnNpemUpKTw9cilyZXR1cm4gWmZbYV19cmV0dXJuIFpmW2ktMV19ZnVuY3Rpb24gdHAoZSx0LG4scixpKXtmb3IobGV0IGE9WmYubGVuZ3RoLTE7YT49WmYuaW5kZXhPZihuKTthLS0pe2xldCBuPVpmW2FdO2lmKFhmW25dLmNvbW1vbiYmZS5fYWRhcHRlci5kaWZmKGkscixuKT49dC0xKXJldHVybiBufXJldHVybiBaZltuP1pmLmluZGV4T2Yobik6MF19ZnVuY3Rpb24gbnAoZSl7Zm9yKGxldCB0PVpmLmluZGV4T2YoZSkrMSxuPVpmLmxlbmd0aDt0PG47Kyt0KWlmKFhmW1pmW3RdXS5jb21tb24pcmV0dXJuIFpmW3RdfWZ1bmN0aW9uIHJwKGUsdCxuKXtpZighbillW3RdPSEwO2Vsc2UgaWYobi5sZW5ndGgpe2xldHtsbzpyLGhpOml9PVZvKG4sdCksYT1uW3JdPj10P25bcl06bltpXTtlW2FdPSEwfX1mdW5jdGlvbiBpcChlLHQsbixyKXtsZXQgaT1lLl9hZGFwdGVyLGE9K2kuc3RhcnRPZih0WzBdLnZhbHVlLHIpLG89dFt0Lmxlbmd0aC0xXS52YWx1ZSxzLGM7Zm9yKHM9YTtzPD1vO3M9K2kuYWRkKHMsMSxyKSljPW5bc10sYz49MCYmKHRbY10ubWFqb3I9ITApO3JldHVybiB0fWZ1bmN0aW9uIGFwKGUsdCxuKXtsZXQgcj1bXSxpPXt9LGE9dC5sZW5ndGgsbyxzO2ZvcihvPTA7bzxhOysrbylzPXRbb10saVtzXT1vLHIucHVzaCh7dmFsdWU6cyxtYWpvcjohMX0pO3JldHVybiBhPT09MHx8IW4/cjppcChlLHIsaSxuKX12YXIgb3A9Y2xhc3MgZXh0ZW5kcyBVdXtzdGF0aWMgaWQ9YHRpbWVgO3N0YXRpYyBkZWZhdWx0cz17Ym91bmRzOmBkYXRhYCxhZGFwdGVyczp7fSx0aW1lOntwYXJzZXI6ITEsdW5pdDohMSxyb3VuZDohMSxpc29XZWVrZGF5OiExLG1pblVuaXQ6YG1pbGxpc2Vjb25kYCxkaXNwbGF5Rm9ybWF0czp7fX0sdGlja3M6e3NvdXJjZTpgYXV0b2AsY2FsbGJhY2s6ITEsbWFqb3I6e2VuYWJsZWQ6ITF9fX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX0sdGhpcy5fdW5pdD1gZGF5YCx0aGlzLl9tYWpvclVuaXQ9dm9pZCAwLHRoaXMuX29mZnNldHM9e30sdGhpcy5fbm9ybWFsaXplZD0hMSx0aGlzLl9wYXJzZU9wdHM9dm9pZCAwfWluaXQoZSx0PXt9KXtsZXQgbj1lLnRpbWV8fD17fSxyPXRoaXMuX2FkYXB0ZXI9bmV3IERsLl9kYXRlKGUuYWRhcHRlcnMuZGF0ZSk7ci5pbml0KHQpLGlvKG4uZGlzcGxheUZvcm1hdHMsci5mb3JtYXRzKCkpLHRoaXMuX3BhcnNlT3B0cz17cGFyc2VyOm4ucGFyc2VyLHJvdW5kOm4ucm91bmQsaXNvV2Vla2RheTpuLmlzb1dlZWtkYXl9LHN1cGVyLmluaXQoZSksdGhpcy5fbm9ybWFsaXplZD10Lm5vcm1hbGl6ZWR9cGFyc2UoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD9udWxsOiRmKHRoaXMsZSl9YmVmb3JlTGF5b3V0KCl7c3VwZXIuYmVmb3JlTGF5b3V0KCksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX19ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2FkYXB0ZXIsbj1lLnRpbWUudW5pdHx8YGRheWAse21pbjpyLG1heDppLG1pbkRlZmluZWQ6YSxtYXhEZWZpbmVkOm99PXRoaXMuZ2V0VXNlckJvdW5kcygpO2Z1bmN0aW9uIHMoZSl7IWEmJiFpc05hTihlLm1pbikmJihyPU1hdGgubWluKHIsZS5taW4pKSwhbyYmIWlzTmFOKGUubWF4KSYmKGk9TWF0aC5tYXgoaSxlLm1heCkpfSghYXx8IW8pJiYocyh0aGlzLl9nZXRMYWJlbEJvdW5kcygpKSwoZS5ib3VuZHMhPT1gdGlja3NgfHxlLnRpY2tzLnNvdXJjZSE9PWBsYWJlbHNgKSYmcyh0aGlzLmdldE1pbk1heCghMSkpKSxyPUsocikmJiFpc05hTihyKT9yOit0LnN0YXJ0T2YoRGF0ZS5ub3coKSxuKSxpPUsoaSkmJiFpc05hTihpKT9pOit0LmVuZE9mKERhdGUubm93KCksbikrMSx0aGlzLm1pbj1NYXRoLm1pbihyLGktMSksdGhpcy5tYXg9TWF0aC5tYXgocisxLGkpfV9nZXRMYWJlbEJvdW5kcygpe2xldCBlPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCksdD0xLzAsbj0tMS8wO3JldHVybiBlLmxlbmd0aCYmKHQ9ZVswXSxuPWVbZS5sZW5ndGgtMV0pLHttaW46dCxtYXg6bn19YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PWUudGltZSxuPWUudGlja3Mscj1uLnNvdXJjZT09PWBsYWJlbHNgP3RoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk6dGhpcy5fZ2VuZXJhdGUoKTtlLmJvdW5kcz09PWB0aWNrc2AmJnIubGVuZ3RoJiYodGhpcy5taW49dGhpcy5fdXNlck1pbnx8clswXSx0aGlzLm1heD10aGlzLl91c2VyTWF4fHxyW3IubGVuZ3RoLTFdKTtsZXQgaT10aGlzLm1pbixhPXRoaXMubWF4LG89V28ocixpLGEpO3JldHVybiB0aGlzLl91bml0PXQudW5pdHx8KG4uYXV0b1NraXA/ZXAodC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4LHRoaXMuX2dldExhYmVsQ2FwYWNpdHkoaSkpOnRwKHRoaXMsby5sZW5ndGgsdC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4KSksdGhpcy5fbWFqb3JVbml0PSFuLm1ham9yLmVuYWJsZWR8fHRoaXMuX3VuaXQ9PT1geWVhcmA/dm9pZCAwOm5wKHRoaXMuX3VuaXQpLHRoaXMuaW5pdE9mZnNldHMociksZS5yZXZlcnNlJiZvLnJldmVyc2UoKSxhcCh0aGlzLG8sdGhpcy5fbWFqb3JVbml0KX1hZnRlckF1dG9Ta2lwKCl7dGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXAmJnRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAoZT0+K2UudmFsdWUpKX1pbml0T2Zmc2V0cyhlPVtdKXtsZXQgdD0wLG49MCxyLGk7dGhpcy5vcHRpb25zLm9mZnNldCYmZS5sZW5ndGgmJihyPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbMF0pLHQ9ZS5sZW5ndGg9PT0xPzEtcjoodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVsxXSktcikvMixpPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbZS5sZW5ndGgtMV0pLG49ZS5sZW5ndGg9PT0xP2k6KGktdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVtlLmxlbmd0aC0yXSkpLzIpO2xldCBhPWUubGVuZ3RoPDM/LjU6LjI1O3Q9Um8odCwwLGEpLG49Um8obiwwLGEpLHRoaXMuX29mZnNldHM9e3N0YXJ0OnQsZW5kOm4sZmFjdG9yOjEvKHQrMStuKX19X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5fYWRhcHRlcix0PXRoaXMubWluLG49dGhpcy5tYXgscj10aGlzLm9wdGlvbnMsaT1yLnRpbWUsYT1pLnVuaXR8fGVwKGkubWluVW5pdCx0LG4sdGhpcy5fZ2V0TGFiZWxDYXBhY2l0eSh0KSksbz1xKHIudGlja3Muc3RlcFNpemUsMSkscz1hPT09YHdlZWtgJiZpLmlzb1dlZWtkYXksYz1PbyhzKXx8cz09PSEwLGw9e30sdT10LGQsZjtpZihjJiYodT0rZS5zdGFydE9mKHUsYGlzb1dlZWtgLHMpKSx1PStlLnN0YXJ0T2YodSxjP2BkYXlgOmEpLGUuZGlmZihuLHQsYSk+MWU1Km8pdGhyb3cgRXJyb3IodCtgIGFuZCBgK24rYCBhcmUgdG9vIGZhciBhcGFydCB3aXRoIHN0ZXBTaXplIG9mIGArbytgIGArYSk7bGV0IHA9ci50aWNrcy5zb3VyY2U9PT1gZGF0YWAmJnRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtmb3IoZD11LGY9MDtkPG47ZD0rZS5hZGQoZCxvLGEpLGYrKylycChsLGQscCk7cmV0dXJuKGQ9PT1ufHxyLmJvdW5kcz09PWB0aWNrc2B8fGY9PT0xKSYmcnAobCxkLHApLE9iamVjdC5rZXlzKGwpLnNvcnQoUWYpLm1hcChlPT4rZSl9Z2V0TGFiZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9hZGFwdGVyLG49dGhpcy5vcHRpb25zLnRpbWU7cmV0dXJuIG4udG9vbHRpcEZvcm1hdD90LmZvcm1hdChlLG4udG9vbHRpcEZvcm1hdCk6dC5mb3JtYXQoZSxuLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKX1mb3JtYXQoZSx0KXtsZXQgbj10aGlzLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cyxyPXRoaXMuX3VuaXQsaT10fHxuW3JdO3JldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdChlLGkpfV90aWNrRm9ybWF0RnVuY3Rpb24oZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zLGE9aS50aWNrcy5jYWxsYmFjaztpZihhKXJldHVybiBKKGEsW2UsdCxuXSx0aGlzKTtsZXQgbz1pLnRpbWUuZGlzcGxheUZvcm1hdHMscz10aGlzLl91bml0LGM9dGhpcy5fbWFqb3JVbml0LGw9cyYmb1tzXSx1PWMmJm9bY10sZD1uW3RdLGY9YyYmdSYmZCYmZC5tYWpvcjtyZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQoZSxyfHwoZj91OmwpKX1nZW5lcmF0ZVRpY2tMYWJlbHMoZSl7bGV0IHQsbixyO2Zvcih0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXI9ZVt0XSxyLmxhYmVsPXRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihyLnZhbHVlLHQsZSl9Z2V0RGVjaW1hbEZvclZhbHVlKGUpe3JldHVybiBlPT09bnVsbD9OYU46KGUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9vZmZzZXRzLG49dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZSk7cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh0LnN0YXJ0K24pKnQuZmFjdG9yKX1nZXRWYWx1ZUZvclBpeGVsKGUpe2xldCB0PXRoaXMuX29mZnNldHMsbj10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKS90LmZhY3Rvci10LmVuZDtyZXR1cm4gdGhpcy5taW4rbioodGhpcy5tYXgtdGhpcy5taW4pfV9nZXRMYWJlbFNpemUoZSl7bGV0IHQ9dGhpcy5vcHRpb25zLnRpY2tzLG49dGhpcy5jdHgubWVhc3VyZVRleHQoZSkud2lkdGgscj1qbyh0aGlzLmlzSG9yaXpvbnRhbCgpP3QubWF4Um90YXRpb246dC5taW5Sb3RhdGlvbiksaT1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLG89dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5zaXplO3JldHVybnt3Om4qaStvKmEsaDpuKmErbyppfX1fZ2V0TGFiZWxDYXBhY2l0eShlKXtsZXQgdD10aGlzLm9wdGlvbnMudGltZSxuPXQuZGlzcGxheUZvcm1hdHMscj1uW3QudW5pdF18fG4ubWlsbGlzZWNvbmQsaT10aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24oZSwwLGFwKHRoaXMsW2VdLHRoaXMuX21ham9yVW5pdCksciksYT10aGlzLl9nZXRMYWJlbFNpemUoaSksbz1NYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aC9hLnc6dGhpcy5oZWlnaHQvYS5oKS0xO3JldHVybiBvPjA/bzoxfWdldERhdGFUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUuZGF0YXx8W10sdCxuO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCByPXRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKTtpZih0aGlzLl9ub3JtYWxpemVkJiZyLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FjaGUuZGF0YT1yWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpO2Zvcih0PTAsbj1yLmxlbmd0aDt0PG47Kyt0KWU9ZS5jb25jYXQoclt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmRhdGE9dGhpcy5ub3JtYWxpemUoZSl9Z2V0TGFiZWxUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUubGFiZWxzfHxbXSx0LG47aWYoZS5sZW5ndGgpcmV0dXJuIGU7bGV0IHI9dGhpcy5nZXRMYWJlbHMoKTtmb3IodD0wLG49ci5sZW5ndGg7dDxuOysrdCllLnB1c2goJGYodGhpcyxyW3RdKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmxhYmVscz10aGlzLl9ub3JtYWxpemVkP2U6dGhpcy5ub3JtYWxpemUoZSl9bm9ybWFsaXplKGUpe3JldHVybiBKbyhlLnNvcnQoUWYpKX19O2Z1bmN0aW9uIHNwKGUsdCxuKXtsZXQgcj0wLGk9ZS5sZW5ndGgtMSxhLG8scyxjO24/KHQ+PWVbcl0ucG9zJiZ0PD1lW2ldLnBvcyYmKHtsbzpyLGhpOml9PUhvKGUsYHBvc2AsdCkpLHtwb3M6YSx0aW1lOnN9PWVbcl0se3BvczpvLHRpbWU6Y309ZVtpXSk6KHQ+PWVbcl0udGltZSYmdDw9ZVtpXS50aW1lJiYoe2xvOnIsaGk6aX09SG8oZSxgdGltZWAsdCkpLHt0aW1lOmEscG9zOnN9PWVbcl0se3RpbWU6byxwb3M6Y309ZVtpXSk7bGV0IGw9by1hO3JldHVybiBsP3MrKGMtcykqKHQtYSkvbDpzfShjbGFzcyBleHRlbmRzIG9we3N0YXRpYyBpZD1gdGltZXNlcmllc2A7c3RhdGljIGRlZmF1bHRzPW9wLmRlZmF1bHRzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuX3RhYmxlPVtdLHRoaXMuX21pblBvcz12b2lkIDAsdGhpcy5fdGFibGVSYW5nZT12b2lkIDB9aW5pdE9mZnNldHMoKXtsZXQgZT10aGlzLl9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKSx0PXRoaXMuX3RhYmxlPXRoaXMuYnVpbGRMb29rdXBUYWJsZShlKTt0aGlzLl9taW5Qb3M9c3AodCx0aGlzLm1pbiksdGhpcy5fdGFibGVSYW5nZT1zcCh0LHRoaXMubWF4KS10aGlzLl9taW5Qb3Msc3VwZXIuaW5pdE9mZnNldHMoZSl9YnVpbGRMb29rdXBUYWJsZShlKXtsZXR7bWluOnQsbWF4Om59PXRoaXMscj1bXSxpPVtdLGEsbyxzLGMsbDtmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSljPWVbYV0sYz49dCYmYzw9biYmci5wdXNoKGMpO2lmKHIubGVuZ3RoPDIpcmV0dXJuW3t0aW1lOnQscG9zOjB9LHt0aW1lOm4scG9zOjF9XTtmb3IoYT0wLG89ci5sZW5ndGg7YTxvOysrYSlsPXJbYSsxXSxzPXJbYS0xXSxjPXJbYV0sTWF0aC5yb3VuZCgobCtzKS8yKSE9PWMmJmkucHVzaCh7dGltZTpjLHBvczphLyhvLTEpfSk7cmV0dXJuIGl9X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5taW4sdD10aGlzLm1heCxuPXN1cGVyLmdldERhdGFUaW1lc3RhbXBzKCk7cmV0dXJuKCFuLmluY2x1ZGVzKGUpfHwhbi5sZW5ndGgpJiZuLnNwbGljZSgwLDAsZSksKCFuLmluY2x1ZGVzKHQpfHxuLmxlbmd0aD09PTEpJiZuLnB1c2godCksbi5zb3J0KChlLHQpPT5lLXQpfV9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKXtsZXQgZT10aGlzLl9jYWNoZS5hbGx8fFtdO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCB0PXRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKSxuPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7cmV0dXJuIGU9dC5sZW5ndGgmJm4ubGVuZ3RoP3RoaXMubm9ybWFsaXplKHQuY29uY2F0KG4pKTp0Lmxlbmd0aD90Om4sZT10aGlzLl9jYWNoZS5hbGw9ZSxlfWdldERlY2ltYWxGb3JWYWx1ZShlKXtyZXR1cm4oc3AodGhpcy5fdGFibGUsZSktdGhpcy5fbWluUG9zKS90aGlzLl90YWJsZVJhbmdlfWdldFZhbHVlRm9yUGl4ZWwoZSl7bGV0IHQ9dGhpcy5fb2Zmc2V0cyxuPXRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpL3QuZmFjdG9yLXQuZW5kO3JldHVybiBzcCh0aGlzLl90YWJsZSxuKnRoaXMuX3RhYmxlUmFuZ2UrdGhpcy5fbWluUG9zLCEwKX19KTt2YXIgY3A9e2RhdGE6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfSxvcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OigpPT4oe30pfSxwbHVnaW5zOnt0eXBlOkFycmF5LGRlZmF1bHQ6KCk9PltdfSxkYXRhc2V0SWRLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6YGxhYmVsYH0sdXBkYXRlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp2b2lkIDB9fSxscD17YXJpYUxhYmVsOnt0eXBlOlN0cmluZ30sYXJpYURlc2NyaWJlZGJ5Ont0eXBlOlN0cmluZ319LHVwPXt0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzdHJveURlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LC4uLmNwLC4uLmxwfSxkcD0oZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQpO2Z1bmN0aW9uIGZwKGUpe3JldHVybiBjKGUpP08oZSk6ZX1mdW5jdGlvbiBwcChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZTtyZXR1cm4gYyh0KT9uZXcgUHJveHkoZSx7fSk6ZX1mdW5jdGlvbiBtcChlLHQpe2xldCBuPWUub3B0aW9ucztuJiZ0JiZPYmplY3QuYXNzaWduKG4sdCl9ZnVuY3Rpb24gaHAoZSx0KXtlLmxhYmVscz10fWZ1bmN0aW9uIGdwKGUsdCxuKXtsZXQgcj1bXTtlLmRhdGFzZXRzPXQubWFwKHQ9PntsZXQgaT1lLmRhdGFzZXRzLmZpbmQoZT0+ZVtuXT09PXRbbl0pO3JldHVybiFpfHwhdC5kYXRhfHxyLmluY2x1ZGVzKGkpP3suLi50fTooci5wdXNoKGkpLE9iamVjdC5hc3NpZ24oaSx0KSxpKX0pfWZ1bmN0aW9uIF9wKGUsdCl7bGV0IG49e2xhYmVsczpbXSxkYXRhc2V0czpbXX07cmV0dXJuIGhwKG4sZS5sYWJlbHMpLGdwKG4sZS5kYXRhc2V0cyx0KSxufXZhciB2cD1SKHtwcm9wczp1cCxzZXR1cChlLHQpe2xldHtleHBvc2U6bixzbG90czpyfT10LGk9RihudWxsKSxhPXcobnVsbCk7bih7Y2hhcnQ6YX0pO2xldCBvPSgpPT57aWYoIWkudmFsdWUpcmV0dXJuO2xldHt0eXBlOnQsZGF0YTpuLG9wdGlvbnM6cixwbHVnaW5zOm8sZGF0YXNldElkS2V5OnN9PWUsYz1wcChfcChuLHMpLG4pO2EudmFsdWU9bmV3IGpkKGkudmFsdWUse3R5cGU6dCxkYXRhOmMsb3B0aW9uczp7Li4ucn0scGx1Z2luczpvfSl9LHM9KCk9PntsZXQgdD1PKGEudmFsdWUpO3QmJihlLmRlc3Ryb3lEZWxheT4wP3NldFRpbWVvdXQoKCk9Pnt0LmRlc3Ryb3koKSxhLnZhbHVlPW51bGx9LGUuZGVzdHJveURlbGF5KToodC5kZXN0cm95KCksYS52YWx1ZT1udWxsKSl9LGM9dD0+e3QudXBkYXRlKGUudXBkYXRlTW9kZSl9O3JldHVybiBNZShvKSx3ZShzKSxWKFsoKT0+ZS5vcHRpb25zLCgpPT5lLmRhdGFdLCh0LG4pPT57bGV0W3IsaV09dCxbbyxzXT1uLGw9TyhhLnZhbHVlKTtpZighbClyZXR1cm47bGV0IHU9ITE7aWYocil7bGV0IGU9ZnAociksdD1mcChvKTtlJiZlIT09dCYmKG1wKGwsZSksdT0hMCl9aWYoaSl7bGV0IHQ9ZnAoaS5sYWJlbHMpLG49ZnAocy5sYWJlbHMpLHI9ZnAoaS5kYXRhc2V0cyksYT1mcChzLmRhdGFzZXRzKTt0IT09biYmKGhwKGwuY29uZmlnLmRhdGEsdCksdT0hMCksciYmciE9PWEmJihncChsLmNvbmZpZy5kYXRhLHIsZS5kYXRhc2V0SWRLZXkpLHU9ITApfXUmJnhlKCgpPT57YyhsKX0pfSx7ZGVlcDohMH0pLCgpPT5BZShgY2FudmFzYCx7cm9sZTpgaW1nYCwiYXJpYS1sYWJlbCI6ZS5hcmlhTGFiZWwsImFyaWEtZGVzY3JpYmVkYnkiOmUuYXJpYURlc2NyaWJlZGJ5LHJlZjppfSxbQWUoYHBgLHt9LFtyLmRlZmF1bHQ/ci5kZWZhdWx0KCk6YGBdKV0pfX0pO2Z1bmN0aW9uIHlwKGUsdCl7cmV0dXJuIGpkLnJlZ2lzdGVyKHQpLFIoe3Byb3BzOmNwLHNldHVwKHQsbil7bGV0e2V4cG9zZTpyfT1uLGk9dyhudWxsKSxhPXcobnVsbCk7VigoKT0+YS52YWx1ZT8uY2hhcnQ/P251bGwsZT0+e2kudmFsdWU9ZX0se2ZsdXNoOmBzeW5jYH0pLHIoe2NoYXJ0Oml9KTtsZXQgbz1lPT57YS52YWx1ZT1lfTtyZXR1cm4oKT0+QWUodnAsZHAoe3JlZjpvfSx7dHlwZTplLC4uLnR9KSl9fSl9dmFyIGJwPXlwKGBiYXJgLFRsKTtqZC5yZWdpc3RlcihUbCxIZCxDZixEZixaZCx2Zik7ZnVuY3Rpb24geHAoKXtsZXQgZT1GKGBgKSx0PUYoYGApLG49RihgYCk7ZnVuY3Rpb24gcigpe2xldCByPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtlLnZhbHVlPXIuZ2V0UHJvcGVydHlWYWx1ZShgLS1mb3JlZ3JvdW5kYCkudHJpbSgpLHQudmFsdWU9ci5nZXRQcm9wZXJ0eVZhbHVlKGAtLW11dGVkLWZvcmVncm91bmRgKS50cmltKCksbi52YWx1ZT1yLmdldFByb3BlcnR5VmFsdWUoYC0tYm9yZGVyYCkudHJpbSgpfWxldCBpO3JldHVybiBNZSgoKT0+e3IoKSxpPXdpbmRvdy5tYXRjaE1lZGlhKGAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspYCksaS5hZGRFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSksSWUoKCk9PntpPy5yZW1vdmVFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSkse2ZvcmVncm91bmQ6ZSxtdXRlZEZvcmVncm91bmQ6dCxib3JkZXI6bn19dmFyIFNwPXtjb3N0OmBDb3N0YCxyZXE6YFJlcXVlc3RzYCx0b2tpbjpgVG9rZW5zIGluYCx0b2tvdXQ6YFRva2VucyBvdXRgfSxDcD0yMCx3cD0xMDAsVHA9M2U0LEVwPXtob3VyOjI0LGRheTozMCxtb250aDoxMn0sRHA9e2hvdXI6YDI0aGAsZGF5OmAzMGRgLG1vbnRoOmAxMm1vYH07ZnVuY3Rpb24gT3AoZSl7c3dpdGNoKGUpe2Nhc2VgcmVxdWVzdHNgOnJldHVybltgcmVxYF07Y2FzZWB0b2tlbnNgOnJldHVybltgdG9raW5gLGB0b2tvdXRgXTtjYXNlYGNvc3RgOnJldHVybltgY29zdGBdO2Nhc2VgbW9kZWxzYDpyZXR1cm5bXX19dmFyIGtwPWRlKGBoaXN0b3J5YCx7c3RhdGU6KCk9Pih7c2NvcGU6YHRvdGFsYCx3aW5kb3c6YGhvdXJgLHRhYjpgcmVxdWVzdHNgLG1vZGVsTWV0cmljOmBjb3N0YCxzZXJpZXNCeU1ldHJpYzp7fSxtb2RlbFJhbmtpbmc6W10sbW9kZWxPcHRpb25zOltdLGxvYWRpbmc6ITEsZXJyb3I6YGAsdGltZXI6dm9pZCAwfSksYWN0aW9uczp7c2V0U2NvcGUoZSl7ZSE9PXRoaXMuc2NvcGUmJih0aGlzLnNjb3BlPWUsdGhpcy5yZWZyZXNoKCkpfSxzZXRXaW5kb3coZSl7ZSE9PXRoaXMud2luZG93JiYodGhpcy53aW5kb3c9ZSx0aGlzLnJlZnJlc2goKSl9LHNldFRhYihlKXtlIT09dGhpcy50YWImJih0aGlzLnRhYj1lLHRoaXMucmVmcmVzaCgpKX0sc2V0TW9kZWxNZXRyaWMoZSl7ZSE9PXRoaXMubW9kZWxNZXRyaWMmJih0aGlzLm1vZGVsTWV0cmljPWUsdGhpcy5yZWZyZXNoKCkpfSxhc3luYyByZWZyZXNoKCl7YXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMudGFiPT09YG1vZGVsc2A/dGhpcy5mZXRjaE1vZGVsUmFua2luZygpOnRoaXMuZmV0Y2hTZXJpZXMoKSx0aGlzLmZldGNoTW9kZWxPcHRpb25zKCldKX0sYXN5bmMgZmV0Y2hTZXJpZXMoKXtpZihqZSgpLmlzQXV0aGVudGljYXRlZCl7dGhpcy5sb2FkaW5nPSEwO3RyeXtsZXQgZT1FcFt0aGlzLndpbmRvd10sdD1PcCh0aGlzLnRhYiksbj1hd2FpdCBQcm9taXNlLmFsbCh0Lm1hcCh0PT5GZShgL2FkbWluL2FwaS91c2FnZS9oaXN0b3J5P3Njb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2NvcGUpfSZtZXRyaWM9JHt0fSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mc3Bhbj0ke2V9YCkpKSxyPXt9O3QuZm9yRWFjaCgoZSx0KT0+e3JbZV09blt0XS5wb2ludHN9KSx0aGlzLnNlcmllc0J5TWV0cmljPXIsdGhpcy5lcnJvcj1gYH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgYmUmJihlLnN0YXR1cz09PTQwMXx8ZS5zdGF0dXM9PT00MDMpKXJldHVybjt0aGlzLmVycm9yPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWZpbmFsbHl7dGhpcy5sb2FkaW5nPSExfX19LGFzeW5jIGZldGNoTW9kZWxSYW5raW5nKCl7aWYoamUoKS5pc0F1dGhlbnRpY2F0ZWQpe3RoaXMubG9hZGluZz0hMDt0cnl7bGV0IGU9YXdhaXQgRmUoYC9hZG1pbi9hcGkvdXNhZ2UvbW9kZWxzP21ldHJpYz0ke3RoaXMubW9kZWxNZXRyaWN9JndpbmRvdz0ke3RoaXMud2luZG93fSZsaW1pdD0ke0NwfWApO3RoaXMubW9kZWxSYW5raW5nPWUubW9kZWxzLHRoaXMuZXJyb3I9YGB9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGJlJiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSlyZXR1cm47dGhpcy5lcnJvcj1lIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1maW5hbGx5e3RoaXMubG9hZGluZz0hMX19fSxhc3luYyBmZXRjaE1vZGVsT3B0aW9ucygpe2lmKGplKCkuaXNBdXRoZW50aWNhdGVkKXRyeXtsZXQgZT1hd2FpdCBGZShgL2FkbWluL2FwaS91c2FnZS9tb2RlbHM/bWV0cmljPXJlcSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mbGltaXQ9JHt3cH1gKTt0aGlzLm1vZGVsT3B0aW9ucz1lLm1vZGVsc31jYXRjaHt9fSxzdGFydEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lcj09PXZvaWQgMCYmKHRoaXMudGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgdGhpcy5yZWZyZXNoKCksVHApKX0sc3RvcEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxBcD17a2V5OjAsY2xhc3M6YHB5LTggdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxqcD1SKHtfX25hbWU6YE1vZGVsVXNhZ2VDaGFydGAscHJvcHM6e21ldHJpYzp7fSxtb2RlbHM6e319LHNldHVwKGUpe2xldCB0PWUse2ZvcmVncm91bmQ6bixtdXRlZEZvcmVncm91bmQ6cixib3JkZXI6YX09eHAoKSxvPXtyZXE6YC0tY2hhcnQtcmVxdWVzdHNgLHRva2luOmAtLWNoYXJ0LXRva2Vucy1pbmAsdG9rb3V0OmAtLWNoYXJ0LXRva2Vucy1vdXRgLGNvc3Q6YC0tY2hhcnQtY29zdGB9O2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZT09PWBjb3N0YD90LzFlNjp0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGUpLnRyaW0oKX1sZXQgbD1NKCgpPT4obi52YWx1ZSx7bGFiZWxzOnQubW9kZWxzLm1hcChlPT5lLmlkKSxkYXRhc2V0czpbe2xhYmVsOlNwW3QubWV0cmljXSxiYWNrZ3JvdW5kQ29sb3I6YyhvW3QubWV0cmljXSksZGF0YTp0Lm1vZGVscy5tYXAoZT0+cyh0Lm1ldHJpYyxlLnZhbHVlKSl9XX0pKSx1PU0oKCk9PmAke01hdGgubWF4KDE4MCx0Lm1vZGVscy5sZW5ndGgqMjgrNjApfXB4YCksZD1NKCgpPT4oe2luZGV4QXhpczpgeWAscmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e2JlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmEudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQubWV0cmljPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19LHk6e2dyaWQ6e2Rpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGF1dG9Ta2lwOiExfX19LHBsdWdpbnM6e2xlZ2VuZDp7ZGlzcGxheTohMX0sdG9vbHRpcDp7Y2FsbGJhY2tzOntsYWJlbDplPT57bGV0IG49ZS5wYXJzZWQueD8/MDtyZXR1cm4gdC5tZXRyaWM9PT1gY29zdGA/YCR7U3BbdC5tZXRyaWNdfTogJCR7bi50b0ZpeGVkKDQpfWA6YCR7U3BbdC5tZXRyaWNdfTogJHtrZShuKX0gKCR7VWUobil9KWB9fX19fSkpO3JldHVybih0LG4pPT5lLm1vZGVscy5sZW5ndGg9PT0wPyhOKCksUChgcGAsQXAsYCBObyBtb2RlbCByZWNvcmRlZCBhbnkgdXNhZ2UgaW4gdGhpcyB3aW5kb3cuIGApKTooTigpLFAoYGRpdmAse2tleToxLGNsYXNzOmB3LWZ1bGxgLHN0eWxlOmkoe2hlaWdodDp1LnZhbHVlfSl9LFtMKGIoYnApLHtkYXRhOmwudmFsdWUsb3B0aW9uczpkLnZhbHVlfSxudWxsLDgsW2BkYXRhYCxgb3B0aW9uc2BdKV0sNCkpfX0pLE1wPXtjbGFzczpgaC03MiB3LWZ1bGxgfSxOcD1SKHtfX25hbWU6YFVzYWdlQ2hhcnRgLHByb3BzOnt0YWI6e30sd2luZG93Ont9LHNlcmllc0J5TWV0cmljOnt9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3JlZ3JvdW5kOm4sbXV0ZWRGb3JlZ3JvdW5kOnIsYm9yZGVyOml9PXhwKCksYT17cmVxdWVzdHM6W3ttZXRyaWM6YHJlcWAsbGFiZWw6YFJlcXVlc3RzYCxjb2xvcjpgLS1jaGFydC1yZXF1ZXN0c2B9XSx0b2tlbnM6W3ttZXRyaWM6YHRva2luYCxsYWJlbDpgVG9rZW5zIGluYCxjb2xvcjpgLS1jaGFydC10b2tlbnMtaW5gfSx7bWV0cmljOmB0b2tvdXRgLGxhYmVsOmBUb2tlbnMgb3V0YCxjb2xvcjpgLS1jaGFydC10b2tlbnMtb3V0YH1dLGNvc3Q6W3ttZXRyaWM6YGNvc3RgLGxhYmVsOmBDb3N0IChVU0QpYCxjb2xvcjpgLS1jaGFydC1jb3N0YH1dfTtmdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGU9PT1gY29zdGA/dC8xZTY6dH1sZXQgcz1NKCgpPT57bGV0IGU9YVt0LnRhYl0sbj1uZXcgU2V0O2ZvcihsZXQgciBvZiBlKWZvcihsZXQgZSBvZiB0LnNlcmllc0J5TWV0cmljW3IubWV0cmljXT8/W10pbi5hZGQoZS5idWNrZXQpO3JldHVybiBBcnJheS5mcm9tKG4pLnNvcnQoKX0pLGM9TSgoKT0+cy52YWx1ZS5tYXAoZT0+X2UoZSx0LndpbmRvdykpKTtmdW5jdGlvbiBsKGUpe3JldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShlKS50cmltKCl9bGV0IHU9TSgoKT0+e24udmFsdWU7bGV0IGU9cy52YWx1ZTtyZXR1cm57bGFiZWxzOmMudmFsdWUsZGF0YXNldHM6YVt0LnRhYl0ubWFwKG49PntsZXQgcj1uZXcgTWFwKCh0LnNlcmllc0J5TWV0cmljW24ubWV0cmljXT8/W10pLm1hcChlPT5bZS5idWNrZXQsZS52YWx1ZV0pKTtyZXR1cm57bGFiZWw6bi5sYWJlbCxiYWNrZ3JvdW5kQ29sb3I6bChuLmNvbG9yKSxkYXRhOmUubWFwKGU9Pm8obi5tZXRyaWMsci5nZXQoZSk/PzApKX19KX19KSxkPU0oKCk9PmFbdC50YWJdLmxlbmd0aD4xKSxmPU0oKCk9Pih7cmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e3N0YWNrZWQ6ZC52YWx1ZSxncmlkOntjb2xvcjppLnZhbHVlLGRpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlfX0seTp7c3RhY2tlZDpkLnZhbHVlLGJlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmkudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQudGFiPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19fSxwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZC52YWx1ZSxsYWJlbHM6e2NvbG9yOm4udmFsdWV9fSx0b29sdGlwOntjYWxsYmFja3M6e2xhYmVsOmU9PntsZXQgbj1lLnBhcnNlZC55Pz8wO3JldHVybiB0LnRhYj09PWBjb3N0YD9gJHtlLmRhdGFzZXQubGFiZWx9OiAkJHtuLnRvRml4ZWQoNCl9YDpgJHtlLmRhdGFzZXQubGFiZWx9OiAke2tlKG4pfSAoJHtVZShuKX0pYH19fX19KSk7cmV0dXJuKGUsdCk9PihOKCksUChgZGl2YCxNcCxbTChiKGJwKSx7ZGF0YTp1LnZhbHVlLG9wdGlvbnM6Zi52YWx1ZX0sbnVsbCw4LFtgZGF0YWAsYG9wdGlvbnNgXSldKSl9fSksUHA9e2NsYXNzOmBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNgfSxGcD17a2V5OjAsY2xhc3M6YHRleHQtc20gdGV4dC1kZXN0cnVjdGl2ZWB9LElwPXtjbGFzczpgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxMcD1SKHtfX25hbWU6YENoYXJ0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXllKCksbj1rcCgpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT1QZSgpLG89TSgoKT0+e2xldCBlPXQudXNhZ2U/LnVzZXJzPz9bXSxyPXQudXNhZ2U/Lmdyb3Vwcz8/W10sbz1lLmZpbHRlcihlPT4hYS52YWx1ZXx8TmUoZSxpLnZhbHVlKXx8YHVzZXI6JHtlLmlkfWA9PT1uLnNjb3BlKS5tYXAoZT0+KHt2YWx1ZTpgdXNlcjoke2UuaWR9YCxsYWJlbDplLmlkfSkpLHM9ci5maWx0ZXIodD0+IWEudmFsdWV8fFZlKHQsZSxpLnZhbHVlKXx8YGdyb3VwOiR7dC5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YGdyb3VwOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSksYz0obi5tb2RlbE9wdGlvbnM/P1tdKS5maWx0ZXIoZT0+IWEudmFsdWV8fGUuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpLnZhbHVlKXx8YG1vZGVsOiR7ZS5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YG1vZGVsOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSk7cmV0dXJuIG4uc2NvcGUuc3RhcnRzV2l0aChgbW9kZWw6YCkmJiFjLnNvbWUoZT0+ZS52YWx1ZT09PW4uc2NvcGUpJiZjLnB1c2goe3ZhbHVlOm4uc2NvcGUsbGFiZWw6bi5zY29wZS5zbGljZSg2KX0pLFt7dmFsdWU6YHRvdGFsYCxsYWJlbDpgVG90YWwgKGFsbCB0cmFmZmljKWB9LC4uLnMsLi4ubywuLi5jXX0pLHM9W2Bob3VyYCxgZGF5YCxgbW9udGhgXSxjPVtgY29zdGAsYHJlcWAsYHRva2luYCxgdG9rb3V0YF0sbD1NKCgpPT5uLnRhYj09PWBtb2RlbHNgP2ByZXF1ZXN0c2A6bi50YWIpO2Z1bmN0aW9uIHUoZSl7bi5zZXRUYWIoZSl9ZnVuY3Rpb24gZChlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0U2NvcGUoZSl9ZnVuY3Rpb24gZihlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0TW9kZWxNZXRyaWMoZSl9cmV0dXJuIE1lKCgpPT57bi5yZWZyZXNoKCksbi5zdGFydEF1dG9SZWZyZXNoKCl9KSx3ZSgoKT0+e24uc3RvcEF1dG9SZWZyZXNoKCl9KSxWKG8sZT0+e2Uuc29tZShlPT5lLnZhbHVlPT09bi5zY29wZSl8fG4uc2V0U2NvcGUoYHRvdGFsYCl9KSwoZSx0KT0+KE4oKSxJKGIoR2UpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihTZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5gfSx7ZGVmYXVsdDpCKCgpPT5bTChiKENlKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsuLi50WzJdfHw9W2dlKGBVc2FnZSBjaGFydHNgLC0xKV1dKSxfOjF9KSxIZShgZGl2YCxQcCxbTChCZSx7bW9kZWxWYWx1ZTpiKHIpLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+RShyKT9yLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzLCBncm91cHMgb3IgbW9kZWxzYCxjbGFzczpgdy01NmB9LG51bGwsOCxbYG1vZGVsVmFsdWVgXSksYihuKS50YWI9PT1gbW9kZWxzYD8oTigpLEkoYihYaSkse2tleTowLCJtb2RlbC12YWx1ZSI6YihuKS5tb2RlbE1ldHJpYywib25VcGRhdGU6bW9kZWxWYWx1ZSI6Zn0se2RlZmF1bHQ6QigoKT0+W0woYihuYSkse2NsYXNzOmB3LTQwYCwiYXJpYS1sYWJlbCI6YFJhbmsgbW9kZWxzIGJ5YH0se2RlZmF1bHQ6QigoKT0+W0woYihyYSkse3BsYWNlaG9sZGVyOmBSYW5rIGJ5YH0pXSksXzoxfSksTChiKFppKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsoTigpLFAoayxudWxsLG1lKGMsZT0+TChiKCRpKSx7a2V5OmUsdmFsdWU6ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGIoU3ApW2VdKSwxKV0pLF86Mn0sMTAzMixbYHZhbHVlYF0pKSw2NCkpXSksXzoxfSldKSxfOjF9LDgsW2Btb2RlbC12YWx1ZWBdKSk6KE4oKSxJKGIoWGkpLHtrZXk6MSwibW9kZWwtdmFsdWUiOmIobikuc2NvcGUsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmR9LHtkZWZhdWx0OkIoKCk9PltMKGIobmEpLHtjbGFzczpgdy01NmB9LHtkZWZhdWx0OkIoKCk9PltMKGIocmEpLHtwbGFjZWhvbGRlcjpgU2NvcGVgfSldKSxfOjF9KSxMKGIoWmkpLG51bGwse2RlZmF1bHQ6QigoKT0+WyhOKCEwKSxQKGssbnVsbCxtZShvLnZhbHVlLGU9PihOKCksSShiKCRpKSx7a2V5OmUudmFsdWUsdmFsdWU6ZS52YWx1ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGUubGFiZWwpLDEpXSksXzoyfSwxMDMyLFtgdmFsdWVgXSkpKSwxMjgpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSkpLEwoYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS53aW5kb3csIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMV18fD1lPT5iKG4pLnNldFdpbmRvdyhlKX0se2RlZmF1bHQ6QigoKT0+W0woYihUZSksbnVsbCx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxQKGssbnVsbCxtZShzLGU9PkwoYihSZSkse2tleTplLHZhbHVlOmV9LHtkZWZhdWx0OkIoKCk9PltnZShjZShiKERwKVtlXSksMSldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSksNjQpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSldKV0pLF86MX0pLEwoYihwZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00YH0se2RlZmF1bHQ6QigoKT0+W0woYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS50YWIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnV9LHtkZWZhdWx0OkIoKCk9PltMKGIoVGUpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihSZSkse3ZhbHVlOmByZXF1ZXN0c2B9LHtkZWZhdWx0OkIoKCk9PlsuLi50WzNdfHw9W2dlKGBSZXF1ZXN0c2AsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmB0b2tlbnNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs0XXx8PVtnZShgVG9rZW5zYCwtMSldXSksXzoxfSksTChiKFJlKSx7dmFsdWU6YGNvc3RgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs1XXx8PVtnZShgQ29zdGAsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmBtb2RlbHNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs2XXx8PVtnZShgTW9kZWxzYCwtMSldXSksXzoxfSldKSxfOjF9KV0pLF86MX0sOCxbYG1vZGVsLXZhbHVlYF0pLGIobikuZXJyb3I/KE4oKSxQKGBwYCxGcCxjZShiKG4pLmVycm9yKSwxKSk6emUoYGAsITApLGIobikudGFiPT09YG1vZGVsc2A/KE4oKSxQKGsse2tleToxfSxbSGUoYHBgLElwLGAgTW9kZWxzIHdpdGggdXNhZ2UgaW4gdGhlIHNlbGVjdGVkIHdpbmRvdywgcmFua2VkIGJ5IGArY2UoYihTcClbYihuKS5tb2RlbE1ldHJpY10udG9Mb3dlckNhc2UoKSkrYC4gRWFjaCByb3cgaXMgdGhlIHByb3ZpZGVyIHRoYXQgc2VydmVkIHRoZSB0cmFmZmljLCBzbyBhIG1vZGVsIHJlYWNoZWQgdGhyb3VnaCBtb3JlIHRoYW4gb25lIHByb3ZpZGVyIGFwcGVhcnMgb25jZSBwZXIgcHJvdmlkZXIuIGAsMSksTChqcCx7bWV0cmljOmIobikubW9kZWxNZXRyaWMsbW9kZWxzOmIobikubW9kZWxSYW5raW5nfSxudWxsLDgsW2BtZXRyaWNgLGBtb2RlbHNgXSldLDY0KSk6KE4oKSxJKE5wLHtrZXk6Mix0YWI6bC52YWx1ZSx3aW5kb3c6YihuKS53aW5kb3csInNlcmllcy1ieS1tZXRyaWMiOmIobikuc2VyaWVzQnlNZXRyaWN9LG51bGwsOCxbYHRhYmAsYHdpbmRvd2AsYHNlcmllcy1ieS1tZXRyaWNgXSkpXSksXzoxfSldKSxfOjF9KSl9fSk7ZXhwb3J0e0xwIGFzIGRlZmF1bHR9Ow==", + "aW1wb3J0eyQgYXMgZSxBIGFzIHQsQXQgYXMgbixCIGFzIHIsQnQgYXMgaSxDIGFzIGEsQ3QgYXMgbyxEIGFzIHMsRHQgYXMgYyxFIGFzIGwsRXQgYXMgdSxGIGFzIGQsRnQgYXMgZixHIGFzIHAsSCBhcyBtLEkgYXMgaCxJdCBhcyBnLEogYXMgXyxLIGFzIHYsTCBhcyB5LEx0IGFzIGIsTSBhcyB4LE10IGFzIFMsTiBhcyBDLE50IGFzIHcsTyBhcyBULE90IGFzIEUsUCBhcyBELFB0IGFzIE8sUSBhcyBrLFIgYXMgZWUsUnQgYXMgdGUsUyBhcyBuZSxTdCBhcyByZSxUIGFzIGllLFR0IGFzIGFlLFUgYXMgb2UsViBhcyBzZSxWdCBhcyBjZSxXIGFzIGxlLFggYXMgdWUsWSBhcyBkZSxaIGFzIGZlLF8gYXMgcGUsX3QgYXMgbWUsYSBhcyBoZSxhdCBhcyBnZSxiIGFzIEEsYyBhcyBfZSxjdCBhcyB2ZSxkIGFzIHllLGR0IGFzIGosZXQgYXMgTSxmIGFzIGJlLGZ0IGFzIHhlLGcgYXMgU2UsZ3QgYXMgTixoIGFzIENlLGh0IGFzIHdlLGkgYXMgVGUsaXQgYXMgUCxqIGFzIEVlLGp0IGFzIEYsayBhcyBEZSxrdCBhcyBPZSxsIGFzIGtlLGx0IGFzIEFlLG0gYXMgamUsbXQgYXMgTWUsbiBhcyBOZSxudCBhcyBJLG8gYXMgUGUsb3QgYXMgTCxwIGFzIEZlLHB0IGFzIEllLHEgYXMgTGUsciBhcyBSZSxydCBhcyB6ZSxzIGFzIEJlLHN0IGFzIFIsdCBhcyBWZSx0dCBhcyBIZSx1IGFzIFVlLHV0IGFzIFdlLHYgYXMgR2UsdnQgYXMgeix3IGFzIEtlLHd0IGFzIEIseCBhcyBxZSx4dCBhcyBWLHkgYXMgSmUseXQgYXMgWWUseiBhcyBYZSx6dCBhcyBaZX1mcm9tIi4vaW5kZXgtQ242dkVBalAuanMiO2Z1bmN0aW9uIFFlKGUsdD0tMS8wLG49MS8wKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiAkZShlLHQsbil7bGV0IHI9bi5vcmlnaW5hbEV2ZW50LnRhcmdldCxpPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITAsZGV0YWlsOm59KTt0JiZyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LHtvbmNlOiEwfSksci5kaXNwYXRjaEV2ZW50KGkpfXZhciBldD1uKHtsYXllcnNSb290Om5ldyBTZXQsbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6bmV3IFNldCxvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzOnZvaWQgMCxicmFuY2hlczpuZXcgU2V0fSk7ZnVuY3Rpb24gdHQoZSl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4hMTtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHQhPT1udWxsJiZ0IT09T2JqZWN0LnByb3RvdHlwZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpIT09bnVsbHx8U3ltYm9sLml0ZXJhdG9yIGluIGU/ITE6U3ltYm9sLnRvU3RyaW5nVGFnIGluIGU/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgTW9kdWxlXWA6ITB9ZnVuY3Rpb24gbnQoZSx0LG49YC5gLHIpe2lmKCF0dCh0KSlyZXR1cm4gbnQoZSx7fSxuLHIpO2xldCBpPXsuLi50fTtmb3IobGV0IHQgb2YgT2JqZWN0LmtleXMoZSkpe2lmKHQ9PT1gX19wcm90b19fYHx8dD09PWBjb25zdHJ1Y3RvcmApY29udGludWU7bGV0IGE9ZVt0XTthIT1udWxsJiYociYmcihpLHQsYSxuKXx8KGlbdF09QXJyYXkuaXNBcnJheShhKSYmQXJyYXkuaXNBcnJheShpW3RdKT9bLi4uYSwuLi5pW3RdXTp0dChhKSYmdHQoaVt0XSk/bnQoYSxpW3RdLChuP2Ake259LmA6YGApK3QudG9TdHJpbmcoKSxyKTphKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuKC4uLnQpPT50LnJlZHVjZSgodCxuKT0+bnQodCxuLGBgLGUpLHt9KX12YXIgaXQ9cnQoKSxhdD1kKCgpPT57bGV0IGU9RihuZXcgTWFwKSxuPUYoKSxyPU0oKCk9Pntmb3IobGV0IHQgb2YgZS52YWx1ZS52YWx1ZXMoKSlpZih0KXJldHVybiEwO3JldHVybiExfSksaT1zKHtzY3JvbGxCb2R5OkYoITApfSksYT1udWxsLG89KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1gYCxkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0PWBgLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzPWBgKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0tc2Nyb2xsYmFyLXdpZHRoYCksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1uLnZhbHVlPz9gYCx5JiZhPy4oKSxuLnZhbHVlPXZvaWQgMH07cmV0dXJuIFYociwoZSxzKT0+e2lmKCFoKXJldHVybjtpZighZSl7cyYmbygpO3JldHVybn1uLnZhbHVlPT09dm9pZCAwJiYobi52YWx1ZT1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93KTtsZXQgYz13aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsbD17cGFkZGluZzpjLG1hcmdpbjowfSx1PWkuc2Nyb2xsQm9keT8udmFsdWU/dHlwZW9mIGkuc2Nyb2xsQm9keS52YWx1ZT09YG9iamVjdGA/aXQoe3BhZGRpbmc6aS5zY3JvbGxCb2R5LnZhbHVlLnBhZGRpbmc9PT0hMD9jOmkuc2Nyb2xsQm9keS52YWx1ZS5wYWRkaW5nLG1hcmdpbjppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2luPT09ITA/YzppLnNjcm9sbEJvZHkudmFsdWUubWFyZ2lufSxsKTpsOntwYWRkaW5nOjAsbWFyZ2luOjB9O2M+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXR5cGVvZiB1LnBhZGRpbmc9PWBudW1iZXJgP2Ake3UucGFkZGluZ31weGA6U3RyaW5nKHUucGFkZGluZyksZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodD10eXBlb2YgdS5tYXJnaW49PWBudW1iZXJgP2Ake3UubWFyZ2lufXB4YDpTdHJpbmcodS5tYXJnaW4pLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShgLS1zY3JvbGxiYXItd2lkdGhgLGAke2N9cHhgKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PWBoaWRkZW5gKSx5JiYoYT10KGRvY3VtZW50LGB0b3VjaG1vdmVgLGU9PmN0KGUpLHtwYXNzaXZlOiExfSkpLHhlKCgpPT57ci52YWx1ZSYmKGRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1gaGlkZGVuYCl9KX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgc3luY2B9KSxlfSk7ZnVuY3Rpb24gb3QoZSl7bGV0IHQ9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsNyksbj1hdCgpO24udmFsdWUuc2V0KHQsZT8/ITEpO2xldCBpPU0oe2dldDooKT0+bi52YWx1ZS5nZXQodCk/PyExLHNldDplPT5uLnZhbHVlLnNldCh0LGUpfSk7cmV0dXJuIHIoKCk9PntuLnZhbHVlLmRlbGV0ZSh0KX0pLGl9ZnVuY3Rpb24gc3QoZSl7bGV0IHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7aWYodC5vdmVyZmxvd1g9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1k9PT1gc2Nyb2xsYHx8dC5vdmVyZmxvd1g9PT1gYXV0b2AmJmUuY2xpZW50V2lkdGg8ZS5zY3JvbGxXaWR0aHx8dC5vdmVyZmxvd1k9PT1gYXV0b2AmJmUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0KXJldHVybiEwO3tsZXQgdD1lLnBhcmVudE5vZGU7cmV0dXJuISh0IGluc3RhbmNlb2YgRWxlbWVudCl8fHQudGFnTmFtZT09PWBCT0RZYD8hMTpzdCh0KX19ZnVuY3Rpb24gY3QoZSl7bGV0IHQ9ZXx8d2luZG93LmV2ZW50LG49dC50YXJnZXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBFbGVtZW50JiZzdChuKT8hMTp0LnRvdWNoZXMubGVuZ3RoPjF8fCh0LnByZXZlbnREZWZhdWx0JiZ0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKSwhMSl9dmFyIGx0PTA7ZnVuY3Rpb24gdXQoKXtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtZm9jdXMtZ3VhcmRdYCk7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoYGFmdGVyYmVnaW5gLHRbMF0/P2R0KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KGBiZWZvcmVlbmRgLHRbMV0/P2R0KCkpLGx0KyssZSgoKT0+e2x0PT09MSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtcmVrYS1mb2N1cy1ndWFyZF1gKS5mb3JFYWNoKGU9PmUucmVtb3ZlKCkpLGx0LS19KX0pfWZ1bmN0aW9uIGR0KCl7bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgc3BhbmApO3JldHVybiBlLnNldEF0dHJpYnV0ZShgZGF0YS1yZWthLWZvY3VzLWd1YXJkYCxgYCksZS50YWJJbmRleD0wLGUuc3R5bGUub3V0bGluZT1gbm9uZWAsZS5zdHlsZS5vcGFjaXR5PWAwYCxlLnN0eWxlLnBvc2l0aW9uPWBmaXhlZGAsZS5zdHlsZS5wb2ludGVyRXZlbnRzPWBub25lYCxlfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBNKCgpPT4hZyhlKXx8ISFEZShlKT8uY2xvc2VzdChgZm9ybWApKX12YXIgcHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudD5gdWA/bnVsbDooQXJyYXkuaXNBcnJheShlKT9lWzBdOmUpLm93bmVyRG9jdW1lbnQuYm9keX0sbXQ9bmV3IFdlYWtNYXAsaHQ9bmV3IFdlYWtNYXAsZ3Q9e30sX3Q9MCx2dD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuaG9zdHx8dnQoZS5wYXJlbnROb2RlKSl9LHl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe2lmKGUuY29udGFpbnModCkpcmV0dXJuIHQ7dmFyIG49dnQodCk7cmV0dXJuIG4mJmUuY29udGFpbnMobik/bjooY29uc29sZS5lcnJvcihgYXJpYS1oaWRkZW5gLHQsYGluIG5vdCBjb250YWluZWQgaW5zaWRlYCxlLGAuIERvaW5nIG5vdGhpbmdgKSxudWxsKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hIWV9KX0sYnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eXQodCxBcnJheS5pc0FycmF5KGUpP2U6W2VdKTtndFtuXXx8KGd0W25dPW5ldyBXZWFrTWFwKTt2YXIgYT1ndFtuXSxvPVtdLHM9bmV3IFNldCxjPW5ldyBTZXQoaSksbD1mdW5jdGlvbihlKXshZXx8cy5oYXMoZSl8fChzLmFkZChlKSxsKGUucGFyZW50Tm9kZSkpfTtpLmZvckVhY2gobCk7dmFyIHU9ZnVuY3Rpb24oZSl7IWV8fGMuaGFzKGUpfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7aWYocy5oYXMoZSkpdShlKTtlbHNlIHRyeXt2YXIgdD1lLmdldEF0dHJpYnV0ZShyKSxpPXQhPT1udWxsJiZ0IT09YGZhbHNlYCxjPShtdC5nZXQoZSl8fDApKzEsbD0oYS5nZXQoZSl8fDApKzE7bXQuc2V0KGUsYyksYS5zZXQoZSxsKSxvLnB1c2goZSksYz09PTEmJmkmJmh0LnNldChlLCEwKSxsPT09MSYmZS5zZXRBdHRyaWJ1dGUobixgdHJ1ZWApLGl8fGUuc2V0QXR0cmlidXRlKHIsYHRydWVgKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKGBhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gYCxlLHQpfX0pfTtyZXR1cm4gdSh0KSxzLmNsZWFyKCksX3QrKyxmdW5jdGlvbigpe28uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1tdC5nZXQoZSktMSxpPWEuZ2V0KGUpLTE7bXQuc2V0KGUsdCksYS5zZXQoZSxpKSx0fHwoaHQuaGFzKGUpfHxlLnJlbW92ZUF0dHJpYnV0ZShyKSxodC5kZWxldGUoZSkpLGl8fGUucmVtb3ZlQXR0cmlidXRlKG4pfSksX3QtLSxfdHx8KG10PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGd0PXt9KX19LHh0PWZ1bmN0aW9uKGUsdCxuKXtuPT09dm9pZCAwJiYobj1gZGF0YS1hcmlhLWhpZGRlbmApO3ZhciByPUFycmF5LmZyb20oQXJyYXkuaXNBcnJheShlKT9lOltlXSksaT10fHxwdChlKTtyZXR1cm4gaT8oci5wdXNoLmFwcGx5KHIsQXJyYXkuZnJvbShpLnF1ZXJ5U2VsZWN0b3JBbGwoYFthcmlhLWxpdmVdLCBzY3JpcHRgKSkpLGJ0KHIsaSxuLGBhcmlhLWhpZGRlbmApKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX07ZnVuY3Rpb24gU3QoZSl7bGV0IHQ7VigoKT0+RGUoZSksZT0+e2xldCBuPSExO3RyeXtuPSEhZT8uY2xvc2VzdChgW3BvcG92ZXJdOm5vdCg6cG9wb3Zlci1vcGVuKWApfWNhdGNoe31lJiYhbj90PXh0KGUpOnQmJnQoKX0pLHdlKCgpPT57dCYmdCgpfSl9ZnVuY3Rpb24gQ3QoZSl7bGV0IHQ9RigpLG49TSgoKT0+dC52YWx1ZT8ud2lkdGg/PzApLHI9TSgoKT0+dC52YWx1ZT8uaGVpZ2h0Pz8wKSxpO3JldHVybiBNZSgoKT0+e2xldCBuPURlKGUpO24/KHQudmFsdWU9e3dpZHRoOm4ub2Zmc2V0V2lkdGgsaGVpZ2h0Om4ub2Zmc2V0SGVpZ2h0fSxpPW5ldyBSZXNpemVPYnNlcnZlcihlPT57aWYoIUFycmF5LmlzQXJyYXkoZSl8fCFlLmxlbmd0aClyZXR1cm47bGV0IHI9ZVswXSxpLGE7aWYoYGJvcmRlckJveFNpemVgaW4gcil7bGV0IGU9ci5ib3JkZXJCb3hTaXplLHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7aT10LmlubGluZVNpemUsYT10LmJsb2NrU2l6ZX1lbHNlIGk9bi5vZmZzZXRXaWR0aCxhPW4ub2Zmc2V0SGVpZ2h0O3QudmFsdWU9e3dpZHRoOmksaGVpZ2h0OmF9fSksaS5vYnNlcnZlKG4se2JveDpgYm9yZGVyLWJveGB9KSk6dC52YWx1ZT12b2lkIDB9KSx3ZSgoKT0+e2k/LmRpc2Nvbm5lY3QoKSxpPXZvaWQgMH0pLHt3aWR0aDpuLGhlaWdodDpyfX1mdW5jdGlvbiB3dChlKXtsZXQgdD1YZShgYCwxZTMpO3JldHVybntzZWFyY2g6dCxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6KG4scik9PntpZih0LnZhbHVlKz1uLGUpZShuKTtlbHNle2xldCBlPW0oKSxuPXIubWFwKGU9Pih7Li4uZSx0ZXh0VmFsdWU6ZS52YWx1ZT8udGV4dFZhbHVlPz9lLnJlZi50ZXh0Q29udGVudD8udHJpbSgpPz9gYH0pKSxpPW4uZmluZCh0PT50LnJlZj09PWUpLGE9RXQobi5tYXAoZT0+ZS50ZXh0VmFsdWUpLHQudmFsdWUsaT8udGV4dFZhbHVlKSxvPW4uZmluZChlPT5lLnRleHRWYWx1ZT09PWEpO3JldHVybiBvJiZvLnJlZi5mb2N1cygpLG8/LnJlZn19LHJlc2V0VHlwZWFoZWFkOigpPT57dC52YWx1ZT1gYH19fWZ1bmN0aW9uIFR0KGUsdCl7cmV0dXJuIGUubWFwKChuLHIpPT5lWyh0K3IpJWUubGVuZ3RoXSl9ZnVuY3Rpb24gRXQoZSx0LG4pe2xldCByPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkoZT0+ZT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xLGE9VHQoZSxNYXRoLm1heChpLDApKTtyLmxlbmd0aD09PTEmJihhPWEuZmlsdGVyKGU9PmUhPT1uKSk7bGV0IG89YS5maW5kKGU9PmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHIudG9Mb3dlckNhc2UoKSkpO3JldHVybiBvPT09bj92b2lkIDA6b312YXIgRHQ9YGRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlYCxPdD1gZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGVgO2Z1bmN0aW9uIGt0KGUsdCl7aWYoISh0IGluc3RhbmNlb2YgRWxlbWVudCkpcmV0dXJuITE7bGV0IG49dC5jbG9zZXN0KGBbZGF0YS1kaXNtaXNzYWJsZS1sYXllcl1gKSxyPWUuZGF0YXNldC5kaXNtaXNzYWJsZUxheWVyPT09YGA/ZTplLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWRpc21pc3NhYmxlLWxheWVyXWApLGk9QXJyYXkuZnJvbShlLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtZGlzbWlzc2FibGUtbGF5ZXJdYCkpO3JldHVybiEhKG4mJihyPT09bnx8aS5pbmRleE9mKHIpPGkuaW5kZXhPZihuKSkpfWZ1bmN0aW9uIEF0KGUsdCxuPSEwKXtsZXQgcj10Py52YWx1ZT8ub3duZXJEb2N1bWVudD8/Z2xvYmFsVGhpcz8uZG9jdW1lbnQsaT1GKCExKSxhPUYoKCk9Pnt9KTtyZXR1cm4gcmUobz0+e2lmKCFofHwhZyhuKSlyZXR1cm47bGV0IHM9YXN5bmMgbj0+e2xldCBvPW4udGFyZ2V0O2lmKCEoIXQ/LnZhbHVlfHwhbykpe2lmKGt0KHQudmFsdWUsbykpe2kudmFsdWU9ITE7cmV0dXJufWlmKG4udGFyZ2V0JiYhaS52YWx1ZSl7bGV0IHQ9e29yaWdpbmFsRXZlbnQ6bn07ZnVuY3Rpb24gaSgpeyRlKER0LGUsdCl9bi5wb2ludGVyVHlwZT09PWB0b3VjaGA/KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpLGEudmFsdWU9aSxyLmFkZEV2ZW50TGlzdGVuZXIoYGNsaWNrYCxhLnZhbHVlLHtvbmNlOiEwfSkpOmkoKX1lbHNlIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpO2kudmFsdWU9ITF9fSxjPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ci5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVyZG93bmAscyl9LDApO28oKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcG9pbnRlcmRvd25gLHMpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihgY2xpY2tgLGEudmFsdWUpfSl9KSx7b25Qb2ludGVyRG93bkNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9fX1mdW5jdGlvbiBqdChlLHQsbj0hMCl7bGV0IHI9dD8udmFsdWU/Lm93bmVyRG9jdW1lbnQ/P2dsb2JhbFRoaXM/LmRvY3VtZW50LGk9RighMSk7cmV0dXJuIHJlKGE9PntpZighaHx8IWcobikpcmV0dXJuO2xldCBvPWFzeW5jIG49PntpZighdD8udmFsdWUpcmV0dXJuO2F3YWl0IHhlKCksYXdhaXQgeGUoKTtsZXQgcj1uLnRhcmdldDshdC52YWx1ZXx8IXJ8fGt0KHQudmFsdWUscil8fG4udGFyZ2V0JiYhaS52YWx1ZSYmJGUoT3QsZSx7b3JpZ2luYWxFdmVudDpufSl9O3IuYWRkRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbyksYSgoKT0+ci5yZW1vdmVFdmVudExpc3RlbmVyKGBmb2N1c2luYCxvKSl9KSx7b25Gb2N1c0NhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMCl9LG9uQmx1ckNhcHR1cmU6KCk9PntnKG4pJiYoaS52YWx1ZT0hMSl9fX12YXIgTXQ9Uih7X19uYW1lOmBEaXNtaXNzYWJsZUxheWVyYCxwcm9wczp7ZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH19LGVtaXRzOltgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWAsYGZvY3VzT3V0c2lkZWAsYGludGVyYWN0T3V0c2lkZWAsYGRpc21pc3NgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT5vLnZhbHVlPy5vd25lckRvY3VtZW50Pz9nbG9iYWxUaGlzLmRvY3VtZW50KSxjPU0oKCk9PmV0LmxheWVyc1Jvb3QpLGw9TSgoKT0+by52YWx1ZT9BcnJheS5mcm9tKGMudmFsdWUpLmluZGV4T2Yoby52YWx1ZSk6LTEpLHU9TSgoKT0+ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT4wKSxkPU0oKCk9PntsZXQgZT1BcnJheS5mcm9tKGMudmFsdWUpLFt0XT1bLi4uZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSxuPWUuaW5kZXhPZih0KTtyZXR1cm4gbC52YWx1ZT49bn0pLGY9QXQoYXN5bmMgZT0+e2xldCB0PVsuLi5ldC5icmFuY2hlc10uc29tZSh0PT50Py5jb250YWlucyhlLnRhcmdldCkpOyFuLnByZXNlbnR8fCFkLnZhbHVlfHx0fHwocihgcG9pbnRlckRvd25PdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGF3YWl0IHhlKCksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSxvKSxwPWp0KGU9PntsZXQgdD1bLi4uZXQuYnJhbmNoZXNdLnNvbWUodD0+dD8uY29udGFpbnMoZS50YXJnZXQpKTshbi5wcmVzZW50fHx0fHwocihgZm9jdXNPdXRzaWRlYCxlKSxyKGBpbnRlcmFjdE91dHNpZGVgLGUpLGUuZGVmYXVsdFByZXZlbnRlZHx8cihgZGlzbWlzc2ApKX0sbyk7cmV0dXJuIFQoYEVzY2FwZWAsZT0+e24ucHJlc2VudCYmbC52YWx1ZT09PWMudmFsdWUuc2l6ZS0xJiYocihgZXNjYXBlS2V5RG93bmAsZSksZS5kZWZhdWx0UHJldmVudGVkfHxyKGBkaXNtaXNzYCkpfSksVihbbywoKT0+bi5kaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsKCk9Pm4ucHJlc2VudF0sKFtlLHQsbl0scixpKT0+eyFlfHwhbnx8dCYmKGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cz1zLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1gbm9uZWApLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChlKSxpKCgpPT57ZXQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKGUpLGV0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYhc2UoZXQub3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cykmJihzLnZhbHVlLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1ldC5vcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzKX0pKX0se2ltbWVkaWF0ZTohMH0pLFYoW28sKCk9Pm4ucHJlc2VudF0sKFtlLHRdLG4scik9PnshZXx8IXR8fChjLnZhbHVlLmFkZChlKSxyKCgpPT57Yy52YWx1ZS5kZWxldGUoZSl9KSl9LHtpbW1lZGlhdGU6ITB9KSxyZShlPT57ZSgoKT0+e28udmFsdWUmJihjLnZhbHVlLmRlbGV0ZShvLnZhbHVlKSxldC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoby52YWx1ZSkpfSl9KSwoZSx0KT0+KE4oKSxJKGIoQSkse3JlZjpiKGEpLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsImRhdGEtZGlzbWlzc2FibGUtbGF5ZXIiOmBgLHN0eWxlOmkoe3BvaW50ZXJFdmVudHM6dS52YWx1ZT9kLnZhbHVlP2BhdXRvYDpgbm9uZWA6dm9pZCAwfSksb25Gb2N1c0NhcHR1cmU6YihwKS5vbkZvY3VzQ2FwdHVyZSxvbkJsdXJDYXB0dXJlOmIocCkub25CbHVyQ2FwdHVyZSxvblBvaW50ZXJkb3duQ2FwdHVyZTpiKGYpLm9uUG9pbnRlckRvd25DYXB0dXJlfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2AsYHN0eWxlYCxgb25Gb2N1c0NhcHR1cmVgLGBvbkJsdXJDYXB0dXJlYCxgb25Qb2ludGVyZG93bkNhcHR1cmVgXSkpfX0pLE50PUQoKCk9PkYoW10pKTtmdW5jdGlvbiBQdCgpe2xldCBlPU50KCk7cmV0dXJue2FkZCh0KXtsZXQgbj1lLnZhbHVlWzBdO3QhPT1uJiZuPy5wYXVzZSgpLGUudmFsdWU9RnQoZS52YWx1ZSx0KSxlLnZhbHVlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXtlLnZhbHVlPUZ0KGUudmFsdWUsdCksZS52YWx1ZVswXT8ucmVzdW1lKCl9fX1mdW5jdGlvbiBGdChlLHQpe2xldCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59dmFyIEl0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnRgLEx0PWBmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudGAsUnQ9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMH07ZnVuY3Rpb24genQoZSx7c2VsZWN0OnQ9ITF9PXt9KXtsZXQgbj1tKCk7Zm9yKGxldCByIG9mIGUpaWYoR3Qocix7c2VsZWN0OnR9KSxtKCkhPT1uKXJldHVybiEwfWZ1bmN0aW9uIEJ0KGUpe2xldCB0PVZ0KGUpO3JldHVybltIdCh0LGUpLEh0KHQucmV2ZXJzZSgpLGUpXX1mdW5jdGlvbiBWdChlKXtsZXQgdD1bXSxuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCx7YWNjZXB0Tm9kZTplPT57bGV0IHQ9ZS50YWdOYW1lPT09YElOUFVUYCYmZS50eXBlPT09YGhpZGRlbmA7cmV0dXJuIGUuZGlzYWJsZWR8fGUuaGlkZGVufHx0P05vZGVGaWx0ZXIuRklMVEVSX1NLSVA6ZS50YWJJbmRleD49MD9Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ6Tm9kZUZpbHRlci5GSUxURVJfU0tJUH19KTtmb3IoO24ubmV4dE5vZGUoKTspdC5wdXNoKG4uY3VycmVudE5vZGUpO3JldHVybiB0fWZ1bmN0aW9uIEh0KGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoIVV0KG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIFV0KGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PWBoaWRkZW5gKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PWBub25lYClyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBXdChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJmBzZWxlY3RgaW4gZX1mdW5jdGlvbiBHdChlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2xldCBuPW0oKTtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJld0KGUpJiZ0JiZlLnNlbGVjdCgpfX12YXIgS3Q9Uih7X19uYW1lOmBGb2N1c1Njb3BlYCxwcm9wczp7bG9vcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LHRyYXBwZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxwcmVzZW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Btb3VudEF1dG9Gb2N1c2AsYHVubW91bnRBdXRvRm9jdXNgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgcj1lLGk9dCx7Y3VycmVudFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1GKG51bGwpLGM9UHQoKSxsPW4oe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KTtyZShlPT57aWYoIWgpcmV0dXJuO2xldCB0PW8udmFsdWU7aWYoIXIudHJhcHBlZClyZXR1cm47ZnVuY3Rpb24gbihlKXtpZihsLnBhdXNlZHx8IXQpcmV0dXJuO2xldCBuPWUudGFyZ2V0O3QuY29udGFpbnMobik/cy52YWx1ZT1uOkd0KHMudmFsdWUse3NlbGVjdDohMH0pfWZ1bmN0aW9uIGkoZSl7aWYobC5wYXVzZWR8fCF0KXJldHVybjtsZXQgbj1lLnJlbGF0ZWRUYXJnZXQ7biE9PW51bGwmJih0LmNvbnRhaW5zKG4pfHxHdChzLnZhbHVlLHtzZWxlY3Q6ITB9KSl9ZnVuY3Rpb24gYShlKXtsZXQgbj1zLnZhbHVlO24hPT1udWxsJiZlLnNvbWUoZT0+ZS5yZW1vdmVkTm9kZXMubGVuZ3RoPjApJiYodC5jb250YWlucyhuKXx8R3QodCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3VzaW5gLG4pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYGZvY3Vzb3V0YCxpKTtsZXQgYz1uZXcgTXV0YXRpb25PYnNlcnZlcihhKTt0JiZjLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNpbmAsbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihgZm9jdXNvdXRgLGkpLGMuZGlzY29ubmVjdCgpfSl9KTtmdW5jdGlvbiB1KGUsdCl7bGV0IG49bmV3IEN1c3RvbUV2ZW50KEl0LFJ0KSxyPWU9PmkoYG1vdW50QXV0b0ZvY3VzYCxlKTtlLmFkZEV2ZW50TGlzdGVuZXIoSXQsciksZS5kaXNwYXRjaEV2ZW50KG4pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihJdCxyKSxuLmRlZmF1bHRQcmV2ZW50ZWR8fCh6dChWdChlKSx7c2VsZWN0OiEwfSksbSgpPT09dCYmR3QoZSkpfXJlKGFzeW5jIGU9PntsZXQgdD1vLnZhbHVlO2lmKGF3YWl0IHhlKCksIXQpcmV0dXJuO3IucHJlc2VudCE9PSExJiZjLmFkZChsKTtsZXQgbj1tKCk7IXQuY29udGFpbnMobikmJnIucHJlc2VudCE9PSExJiZ1KHQsbiksZSgoKT0+e2xldCBlPW5ldyBDdXN0b21FdmVudChMdCxSdCkscj1lPT57aShgdW5tb3VudEF1dG9Gb2N1c2AsZSl9O3QuYWRkRXZlbnRMaXN0ZW5lcihMdCxyKSx0LmRpc3BhdGNoRXZlbnQoZSksdC5zZXRBdHRyaWJ1dGUoYGRhdGEtZm9jdXMtc2NvcGUtdW5tb3VudGluZ2AsYGApLHNldFRpbWVvdXQoKCk9PntlLmRlZmF1bHRQcmV2ZW50ZWR8fEd0KG4/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihMdCxyKSxjLnJlbW92ZShsKSx0LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1mb2N1cy1zY29wZS11bm1vdW50aW5nYCl9LDApfSl9KSxWKCgpPT5yLnByZXNlbnQsYXN5bmMoZSx0KT0+e2lmKCFoKXJldHVybjtpZihlPT09ITEmJnQ9PT0hMCl7Yy5yZW1vdmUobCk7cmV0dXJufWlmKGUhPT0hMHx8dCE9PSExKXJldHVybjtjLmFkZChsKSxhd2FpdCB4ZSgpO2xldCBuPW8udmFsdWU7aWYoIW4pcmV0dXJuO2xldCByPW0oKTtuLmNvbnRhaW5zKHIpfHx1KG4scil9KTtmdW5jdGlvbiBkKGUpe2lmKCFyLmxvb3AmJiFyLnRyYXBwZWR8fGwucGF1c2VkKXJldHVybjtsZXQgdD1lLmtleT09PWBUYWJgJiYhZS5hbHRLZXkmJiFlLmN0cmxLZXkmJiFlLm1ldGFLZXksbj1tKCk7aWYodCYmbil7bGV0IHQ9ZS5jdXJyZW50VGFyZ2V0LFtpLGFdPUJ0KHQpO2kmJmE/IWUuc2hpZnRLZXkmJm49PT1hPyhlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChpLHtzZWxlY3Q6ITB9KSk6ZS5zaGlmdEtleSYmbj09PWkmJihlLnByZXZlbnREZWZhdWx0KCksci5sb29wJiZHdChhLHtzZWxlY3Q6ITB9KSk6bj09PXQmJmUucHJldmVudERlZmF1bHQoKX19cmV0dXJuKGUsdCk9PihOKCksSShiKEEpLHtyZWZfa2V5OmBjdXJyZW50UmVmYCxyZWY6YSx0YWJpbmRleDpgLTFgLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25LZXlkb3duOmR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhcy1jaGlsZGAsYGFzYF0pKX19KSxxdD1bYEVudGVyYCxgIGBdLEp0PVtgQXJyb3dEb3duYCxgUGFnZVVwYCxgSG9tZWBdLFl0PVtgQXJyb3dVcGAsYFBhZ2VEb3duYCxgRW5kYF07Wy4uLkp0LC4uLll0XSxbLi4ucXRdLFsuLi5xdF07ZnVuY3Rpb24gWHQoZSl7bGV0IHQ9bSgpO2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHwobi5mb2N1cygpLG0oKSE9PXQpKXJldHVybn12YXIgWnQ9Uih7X19uYW1lOmBUZWxlcG9ydGAscHJvcHM6e3RvOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRlZmVyOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX19LHNldHVwKHQpe2xldCBuPXQscj1zKHt9KSxpPU0oKCk9Pm4udG8/P3IudGVsZXBvcnRUbz8udmFsdWU/P2Bib2R5YCksYT1FZSgpO3JldHVybih0LG4pPT5iKGEpfHx0LmZvcmNlTW91bnQ/KE4oKSxJKGUse2tleTowLHRvOmkudmFsdWUsZGlzYWJsZWQ6dC5kaXNhYmxlZCxkZWZlcjp0LmRlZmVyfSxbeih0LiRzbG90cyxgZGVmYXVsdGApXSw4LFtgdG9gLGBkaXNhYmxlZGAsYGRlZmVyYF0pKTp6ZShgdi1pZmAsITApfX0pLFF0PVIoe19fbmFtZTpgVmlzdWFsbHlIaWRkZW5gLHByb3BzOntmZWF0dXJlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBmb2N1c2FibGVgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkse2FzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsImFyaWEtaGlkZGVuIjplLmZlYXR1cmU9PT1gZm9jdXNhYmxlYHx8ZS5mZWF0dXJlPT09YGZ1bGx5LWhpZGRlbmA/YHRydWVgOnZvaWQgMCwiZGF0YS1oaWRkZW4iOmUuZmVhdHVyZT09PWBmdWxseS1oaWRkZW5gP2BgOnZvaWQgMCx0YWJpbmRleDplLmZlYXR1cmU9PT1gZnVsbHktaGlkZGVuYD9gLTFgOnZvaWQgMCxzdHlsZTp7cG9zaXRpb246YGFic29sdXRlYCxib3JkZXI6MCx3aWR0aDpgMXB4YCxoZWlnaHQ6YDFweGAscGFkZGluZzowLG1hcmdpbjpgLTFweGAsb3ZlcmZsb3c6YGhpZGRlbmAsY2xpcDpgcmVjdCgwLCAwLCAwLCAwKWAsY2xpcFBhdGg6YGluc2V0KDUwJSlgLHdoaXRlU3BhY2U6YG5vd3JhcGAsd29yZFdyYXA6YG5vcm1hbGAsdG9wOmAtMXB4YCxsZWZ0OmAtMXB4YH19LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgYXJpYS1oaWRkZW5gLGBkYXRhLWhpZGRlbmAsYHRhYmluZGV4YF0pKX19KSxbJHQsZW5dPW9lKGBQb3BwZXJSb290YCksdG49Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyUm9vdGAsc2V0dXAoZSl7bGV0IHQ9RigpO3JldHVybiBlbih7YW5jaG9yOnQsb25BbmNob3JDaGFuZ2U6ZT0+dC52YWx1ZT1lfSksKGUsdCk9PnooZS4kc2xvdHMsYGRlZmF1bHRgKX19KSxubj1SKHtfX25hbWU6YFBvcHBlckFuY2hvcmAscHJvcHM6e3JlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPSR0KCk7cmV0dXJuIG8oKCk9PntpLm9uQW5jaG9yQ2hhbmdlKHQucmVmZXJlbmNlPz9yLnZhbHVlKX0pLChlLHQpPT4oTigpLEkoYihBKSx7cmVmOmIobiksYXM6ZS5hcywiYXMtY2hpbGQiOmUuYXNDaGlsZH0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pO2Z1bmN0aW9uIHJuKGUpe3JldHVybiBlIT09bnVsbH1mdW5jdGlvbiBhbihlKXtyZXR1cm57bmFtZTpgdHJhbnNmb3JtT3JpZ2luYCxvcHRpb25zOmUsZm4odCl7bGV0e3BsYWNlbWVudDpuLHJlY3RzOnIsbWlkZGxld2FyZURhdGE6aX09dCxhPWkuYXJyb3c/LmNlbnRlck9mZnNldCE9PTAsbz1hPzA6ZS5hcnJvd1dpZHRoLHM9YT8wOmUuYXJyb3dIZWlnaHQsW2MsbF09b24obiksdT17c3RhcnQ6ZS5kaXI9PT1gcnRsYD9gMTAwJWA6YDAlYCxjZW50ZXI6YDUwJWAsZW5kOmUuZGlyPT09YHJ0bGA/YDAlYDpgMTAwJWB9W2xdLGQ9e3N0YXJ0OmAwJWAsY2VudGVyOmA1MCVgLGVuZDpgMTAwJWB9W2xdLGY9KGkuYXJyb3c/Lng/PzApK28vMixwPShpLmFycm93Py55Pz8wKStzLzIsbT1gYCxoPWBgO3JldHVybiBjPT09YGJvdHRvbWA/KG09YT91OmAke2Z9cHhgLGg9YCR7LXN9cHhgKTpjPT09YHRvcGA/KG09YT91OmAke2Z9cHhgLGg9YCR7ci5mbG9hdGluZy5oZWlnaHQrc31weGApOmM9PT1gcmlnaHRgPyhtPWAkey1zfXB4YCxoPWE/ZDpgJHtwfXB4YCk6Yz09PWBsZWZ0YCYmKG09YCR7ci5mbG9hdGluZy53aWR0aCtzfXB4YCxoPWE/ZDpgJHtwfXB4YCkse2RhdGE6e3g6bSx5Omh9fX19fWZ1bmN0aW9uIG9uKGUpe2xldFt0LG49YGNlbnRlcmBdPWUuc3BsaXQoYC1gKTtyZXR1cm5bdCxuXX12YXIgc249W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSxjbj1NYXRoLm1pbixsbj1NYXRoLm1heCx1bj1NYXRoLnJvdW5kLGRuPU1hdGguZmxvb3IsZm49ZT0+KHt4OmUseTplfSkscG49e2xlZnQ6YHJpZ2h0YCxyaWdodDpgbGVmdGAsYm90dG9tOmB0b3BgLHRvcDpgYm90dG9tYH07ZnVuY3Rpb24gbW4oZSx0LG4pe3JldHVybiBsbihlLGNuKHQsbikpfWZ1bmN0aW9uIGhuKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UodCk6ZX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZS5zcGxpdChgLWApWzBdfWZ1bmN0aW9uIF9uKGUpe3JldHVybiBlLnNwbGl0KGAtYClbMV19ZnVuY3Rpb24gdm4oZSl7cmV0dXJuIGU9PT1geGA/YHlgOmB4YH1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZT09PWB5YD9gaGVpZ2h0YDpgd2lkdGhgfWZ1bmN0aW9uIGJuKGUpe2xldCB0PWVbMF07cmV0dXJuIHQ9PT1gdGB8fHQ9PT1gYmA/YHlgOmB4YH1mdW5jdGlvbiB4bihlKXtyZXR1cm4gdm4oYm4oZSkpfWZ1bmN0aW9uIFNuKGUsdCxuKXtuPT09dm9pZCAwJiYobj0hMSk7bGV0IHI9X24oZSksaT14bihlKSxhPXluKGkpLG89aT09PWB4YD9yPT09KG4/YGVuZGA6YHN0YXJ0YCk/YHJpZ2h0YDpgbGVmdGA6cj09PWBzdGFydGA/YGJvdHRvbWA6YHRvcGA7cmV0dXJuIHQucmVmZXJlbmNlW2FdPnQuZmxvYXRpbmdbYV0mJihvPWpuKG8pKSxbbyxqbihvKV19ZnVuY3Rpb24gQ24oZSl7bGV0IHQ9am4oZSk7cmV0dXJuW3duKGUpLHQsd24odCldfWZ1bmN0aW9uIHduKGUpe3JldHVybiBlLmluY2x1ZGVzKGBzdGFydGApP2UucmVwbGFjZShgc3RhcnRgLGBlbmRgKTplLnJlcGxhY2UoYGVuZGAsYHN0YXJ0YCl9dmFyIFRuPVtgbGVmdGAsYHJpZ2h0YF0sRW49W2ByaWdodGAsYGxlZnRgXSxEbj1bYHRvcGAsYGJvdHRvbWBdLE9uPVtgYm90dG9tYCxgdG9wYF07ZnVuY3Rpb24ga24oZSx0LG4pe3N3aXRjaChlKXtjYXNlYHRvcGA6Y2FzZWBib3R0b21gOnJldHVybiBuP3Q/RW46VG46dD9UbjpFbjtjYXNlYGxlZnRgOmNhc2VgcmlnaHRgOnJldHVybiB0P0RuOk9uO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEFuKGUsdCxuLHIpe2xldCBpPV9uKGUpLGE9a24oZ24oZSksbj09PWBzdGFydGAscik7cmV0dXJuIGkmJihhPWEubWFwKGU9PmUrYC1gK2kpLHQmJihhPWEuY29uY2F0KGEubWFwKHduKSkpKSxhfWZ1bmN0aW9uIGpuKGUpe2xldCB0PWduKGUpO3JldHVybiBwblt0XStlLnNsaWNlKHQubGVuZ3RoKX1mdW5jdGlvbiBNbihlKXtyZXR1cm57dG9wOmUudG9wPz8wLHJpZ2h0OmUucmlnaHQ/PzAsYm90dG9tOmUuYm90dG9tPz8wLGxlZnQ6ZS5sZWZ0Pz8wfX1mdW5jdGlvbiBObihlKXtyZXR1cm4gdHlwZW9mIGU9PWBudW1iZXJgP3t0b3A6ZSxyaWdodDplLGJvdHRvbTplLGxlZnQ6ZX06TW4oZSl9ZnVuY3Rpb24gUG4oZSl7bGV0e3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6aX09ZTtyZXR1cm57d2lkdGg6cixoZWlnaHQ6aSx0b3A6bixsZWZ0OnQscmlnaHQ6dCtyLGJvdHRvbTpuK2kseDp0LHk6bn19ZnVuY3Rpb24gRm4oZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzppfT1lLGE9Ym4odCksbz14bih0KSxzPXluKG8pLGM9Z24odCksbD1hPT09YHlgLHU9ci54K3Iud2lkdGgvMi1pLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1pLmhlaWdodC8yLGY9cltzXS8yLWlbc10vMixwO3N3aXRjaChjKXtjYXNlYHRvcGA6cD17eDp1LHk6ci55LWkuaGVpZ2h0fTticmVhaztjYXNlYGJvdHRvbWA6cD17eDp1LHk6ci55K3IuaGVpZ2h0fTticmVhaztjYXNlYHJpZ2h0YDpwPXt4OnIueCtyLndpZHRoLHk6ZH07YnJlYWs7Y2FzZWBsZWZ0YDpwPXt4OnIueC1pLndpZHRoLHk6ZH07YnJlYWs7ZGVmYXVsdDpwPXt4OnIueCx5OnIueX19bGV0IG09X24odCk7cmV0dXJuIG0mJihwW29dKz1mKihtPT09YGVuZGA/MTotMSkqKG4mJmw/LTE6MSkpLHB9YXN5bmMgZnVuY3Rpb24gSW4oZSx0KXt0PT09dm9pZCAwJiYodD17fSk7bGV0e3g6bix5OnIscGxhdGZvcm06aSxyZWN0czphLGVsZW1lbnRzOm8sc3RyYXRlZ3k6c309ZSx7Ym91bmRhcnk6Yz1gY2xpcHBpbmdBbmNlc3RvcnNgLHJvb3RCb3VuZGFyeTpsPWB2aWV3cG9ydGAsZWxlbWVudENvbnRleHQ6dT1gZmxvYXRpbmdgLGFsdEJvdW5kYXJ5OmQ9ITEscGFkZGluZzpmPTB9PWhuKHQsZSkscD1ObihmKSxtPW9bZD91PT09YGZsb2F0aW5nYD9gcmVmZXJlbmNlYDpgZmxvYXRpbmdgOnVdLGg9UG4oYXdhaXQgaS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KG0pKT8/ITA/bTptLmNvbnRleHRFbGVtZW50fHxhd2FpdChpLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6aS5nZXREb2N1bWVudEVsZW1lbnQoby5mbG9hdGluZykpLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5Omwsc3RyYXRlZ3k6c30pKSxnPXU9PT1gZmxvYXRpbmdgP3t4Om4seTpyLHdpZHRoOmEuZmxvYXRpbmcud2lkdGgsaGVpZ2h0OmEuZmxvYXRpbmcuaGVpZ2h0fTphLnJlZmVyZW5jZSxfPWF3YWl0KGkuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDppLmdldE9mZnNldFBhcmVudChvLmZsb2F0aW5nKSksdj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoXykpJiZhd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9LHk9UG4oaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdD9hd2FpdCBpLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtlbGVtZW50czpvLHJlY3Q6ZyxvZmZzZXRQYXJlbnQ6XyxzdHJhdGVneTpzfSk6Zyk7cmV0dXJue3RvcDooaC50b3AteS50b3ArcC50b3ApL3YueSxib3R0b206KHkuYm90dG9tLWguYm90dG9tK3AuYm90dG9tKS92LnksbGVmdDooaC5sZWZ0LXkubGVmdCtwLmxlZnQpL3YueCxyaWdodDooeS5yaWdodC1oLnJpZ2h0K3AucmlnaHQpL3YueH19dmFyIExuPTUwLFJuPWFzeW5jKGUsdCxuKT0+e2xldHtwbGFjZW1lbnQ6cj1gYm90dG9tYCxzdHJhdGVneTppPWBhYnNvbHV0ZWAsbWlkZGxld2FyZTphPVtdLHBsYXRmb3JtOm99PW4scz1vLmRldGVjdE92ZXJmbG93P286ey4uLm8sZGV0ZWN0T3ZlcmZsb3c6SW59LGM9YXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTCh0KSksbD1hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSkse3g6dSx5OmR9PUZuKGwscixjKSxmPXIscD0wLG09e307Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKyspe2xldCBoPWFbbl07aWYoIWgpY29udGludWU7bGV0e25hbWU6ZyxmbjpffT1oLHt4OnYseSxkYXRhOmIscmVzZXQ6eH09YXdhaXQgXyh7eDp1LHk6ZCxpbml0aWFsUGxhY2VtZW50OnIscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptLHJlY3RzOmwscGxhdGZvcm06cyxlbGVtZW50czp7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dH19KTt1PXY/P3UsZD15Pz9kLG1bZ109ey4uLm1bZ10sLi4uYn0seCYmcDxMbiYmKHArKyx0eXBlb2YgeD09YG9iamVjdGAmJih4LnBsYWNlbWVudCYmKGY9eC5wbGFjZW1lbnQpLHgucmVjdHMmJihsPXgucmVjdHM9PT0hMD9hd2FpdCBvLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTppfSk6eC5yZWN0cykse3g6dSx5OmR9PUZuKGwsZixjKSksbj0tMSl9cmV0dXJue3g6dSx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6aSxtaWRkbGV3YXJlRGF0YTptfX0sem49ZT0+KHtuYW1lOmBhcnJvd2Asb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEscGxhdGZvcm06byxlbGVtZW50czpzLG1pZGRsZXdhcmVEYXRhOmN9PXQse2VsZW1lbnQ6bCxwYWRkaW5nOnU9MH09aG4oZSx0KXx8e307aWYobD09bnVsbClyZXR1cm57fTtsZXQgZD1Obih1KSxmPXt4Om4seTpyfSxwPXhuKGkpLG09eW4ocCksaD1hd2FpdCBvLmdldERpbWVuc2lvbnMobCksZz1wPT09YHlgLF89Zz9gdG9wYDpgbGVmdGAsdj1nP2Bib3R0b21gOmByaWdodGAseT1nP2BjbGllbnRIZWlnaHRgOmBjbGllbnRXaWR0aGAsYj1hLnJlZmVyZW5jZVttXSthLnJlZmVyZW5jZVtwXS1mW3BdLWEuZmxvYXRpbmdbbV0seD1mW3BdLWEucmVmZXJlbmNlW3BdLFM9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KGwpKSxDPVM/U1t5XTowOyghQ3x8IWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudChTKSkpJiYoQz1zLmZsb2F0aW5nW3ldfHxhLmZsb2F0aW5nW21dKTtsZXQgdz1iLzIteC8yLFQ9Qy8yLWhbbV0vMi0xLEU9Y24oZFtfXSxUKSxEPWNuKGRbdl0sVCksTz1DLWhbbV0tRCxrPUMvMi1oW21dLzIrdyxlZT1tbihFLGssTyksdGU9IWMuYXJyb3cmJl9uKGkpIT1udWxsJiZrIT09ZWUmJmEucmVmZXJlbmNlW21dLzItKGs8RT9FOkQpLWhbbV0vMjwwLG5lPXRlP2s8RT9rLUU6ay1POjA7cmV0dXJue1twXTpmW3BdK25lLGRhdGE6e1twXTplZSxjZW50ZXJPZmZzZXQ6ay1lZS1uZSwuLi50ZSYme2FsaWdubWVudE9mZnNldDpuZX19LHJlc2V0OnRlfX19KSxCbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOmBmbGlwYCxvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG47bGV0e3BsYWNlbWVudDpyLG1pZGRsZXdhcmVEYXRhOmkscmVjdHM6YSxpbml0aWFsUGxhY2VtZW50Om8scGxhdGZvcm06cyxlbGVtZW50czpjfT10LHttYWluQXhpczpsPSEwLGNyb3NzQXhpczp1PSEwLGZhbGxiYWNrUGxhY2VtZW50czpkLGZhbGxiYWNrU3RyYXRlZ3k6Zj1gYmVzdEZpdGAsZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbjpwPWBub25lYCxmbGlwQWxpZ25tZW50Om09ITAsLi4uaH09aG4oZSx0KTtpZigobj1pLmFycm93KSE9bnVsbCYmbi5hbGlnbm1lbnRPZmZzZXQpcmV0dXJue307bGV0IGc9Z24ociksXz1ibihvKSx2PWduKG8pPT09byx5PWF3YWl0KHMuaXNSVEw9PW51bGw/dm9pZCAwOnMuaXNSVEwoYy5mbG9hdGluZykpLGI9ZHx8KHZ8fCFtP1tqbihvKV06Q24obykpLHg9cCE9PWBub25lYDshZCYmeCYmYi5wdXNoKC4uLkFuKG8sbSxwLHkpKTtsZXQgUz1bbywuLi5iXSxDPWF3YWl0IHMuZGV0ZWN0T3ZlcmZsb3codCxoKSx3PVtdLFQ9aS5mbGlwPy5vdmVyZmxvd3N8fFtdO2lmKGwmJncucHVzaChDW2ddKSx1KXtsZXQgZT1TbihyLGEseSk7dy5wdXNoKENbZVswXV0sQ1tlWzFdXSl9aWYoVD1bLi4uVCx7cGxhY2VtZW50OnIsb3ZlcmZsb3dzOnd9XSwhdy5ldmVyeShlPT5lPD0wKSl7bGV0IGU9KGkuZmxpcD8uaW5kZXh8fDApKzEsdD1TW2VdO2lmKHQmJih1IT09YGFsaWdubWVudGB8fF89PT1ibih0KXx8VC5ldmVyeShlPT5ibihlLnBsYWNlbWVudCkhPT1ffHxlLm92ZXJmbG93c1swXT4wKSkpcmV0dXJue2RhdGE6e2luZGV4OmUsb3ZlcmZsb3dzOlR9LHJlc2V0OntwbGFjZW1lbnQ6dH19O2xldCBuPVQuZmlsdGVyKGU9PmUub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChlLHQpPT5lLm92ZXJmbG93c1sxXS10Lm92ZXJmbG93c1sxXSlbMF0/LnBsYWNlbWVudDtpZighbilzd2l0Y2goZil7Y2FzZWBiZXN0Rml0YDp7bGV0IGU9VC5maWx0ZXIoZT0+e2lmKHgpe2xldCB0PWJuKGUucGxhY2VtZW50KTtyZXR1cm4gdD09PV98fHQ9PT1geWB9cmV0dXJuITB9KS5tYXAoZT0+W2UucGxhY2VtZW50LGUub3ZlcmZsb3dzLmZpbHRlcihlPT5lPjApLnJlZHVjZSgoZSx0KT0+ZSt0LDApXSkuc29ydCgoZSx0KT0+ZVsxXS10WzFdKVswXT8uWzBdO2UmJihuPWUpO2JyZWFrfWNhc2VgaW5pdGlhbFBsYWNlbWVudGA6bj1vfWlmKHIhPT1uKXJldHVybntyZXNldDp7cGxhY2VtZW50Om59fX1yZXR1cm57fX19fTtmdW5jdGlvbiBWbihlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gc24uc29tZSh0PT5lW3RdPj0wKX12YXIgVW49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZTpgaGlkZWAsb3B0aW9uczplLGFzeW5jIGZuKHQpe2xldHtyZWN0czpuLHBsYXRmb3JtOnJ9PXQse3N0cmF0ZWd5Omk9YHJlZmVyZW5jZUhpZGRlbmAsLi4uYX09aG4oZSx0KTtzd2l0Y2goaSl7Y2FzZWByZWZlcmVuY2VIaWRkZW5gOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsZWxlbWVudENvbnRleHQ6YHJlZmVyZW5jZWB9KSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6ZSxyZWZlcmVuY2VIaWRkZW46SG4oZSl9fX1jYXNlYGVzY2FwZWRgOntsZXQgZT1Wbihhd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsYWx0Qm91bmRhcnk6ITB9KSxuLmZsb2F0aW5nKTtyZXR1cm57ZGF0YTp7ZXNjYXBlZE9mZnNldHM6ZSxlc2NhcGVkOkhuKGUpfX19ZGVmYXVsdDpyZXR1cm57fX19fX0sV249bmV3IFNldChbYGxlZnRgLGB0b3BgXSk7YXN5bmMgZnVuY3Rpb24gR24oZSx0KXtsZXR7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czppfT1lLGE9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChpLmZsb2F0aW5nKSksbz1nbihuKSxzPV9uKG4pLGM9Ym4obik9PT1geWAsbD1Xbi5oYXMobyk/LTE6MSx1PWEmJmM/LTE6MSxkPWhuKHQsZSkse21haW5BeGlzOmYsY3Jvc3NBeGlzOnAsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09YG51bWJlcmA/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6ZC5tYWluQXhpc3x8MCxjcm9zc0F4aXM6ZC5jcm9zc0F4aXN8fDAsYWxpZ25tZW50QXhpczpkLmFsaWdubWVudEF4aXN9O3JldHVybiBzJiZ0eXBlb2YgbT09YG51bWJlcmAmJihwPXM9PT1gZW5kYD9tKi0xOm0pLGM/e3g6cCp1LHk6ZipsfTp7eDpmKmwseTpwKnV9fXZhciBLbj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6YG9mZnNldGAsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuO2xldHt4OnIseTppLHBsYWNlbWVudDphLG1pZGRsZXdhcmVEYXRhOm99PXQscz1hd2FpdCBHbih0LGUpO3JldHVybiBhPT09by5vZmZzZXQ/LnBsYWNlbWVudCYmKG49by5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0P3t9Ont4OnIrcy54LHk6aStzLnksZGF0YTp7Li4ucyxwbGFjZW1lbnQ6YX19fX19LHFuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNoaWZ0YCxvcHRpb25zOmUsYXN5bmMgZm4odCl7bGV0e3g6bix5OnIscGxhY2VtZW50OmkscGxhdGZvcm06YX09dCx7bWFpbkF4aXM6bz0hMCxjcm9zc0F4aXM6cz0hMSxsaW1pdGVyOmM9e2ZuOmU9PntsZXR7eDp0LHk6bn09ZTtyZXR1cm57eDp0LHk6bn19fSwuLi5sfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9YXdhaXQgYS5kZXRlY3RPdmVyZmxvdyh0LGwpLGY9Ym4oaSkscD12bihmKSxtPXVbcF0saD11W2ZdLGc9KGUsdCk9Pm1uKHQrZFtlPT09YHlgP2B0b3BgOmBsZWZ0YF0sdCx0LWRbZT09PWB5YD9gYm90dG9tYDpgcmlnaHRgXSk7byYmKG09ZyhwLG0pKSxzJiYoaD1nKGYsaCkpO2xldCBfPWMuZm4oey4uLnQsW3BdOm0sW2ZdOmh9KTtyZXR1cm57Li4uXyxkYXRhOnt4Ol8ueC1uLHk6Xy55LXIsZW5hYmxlZDp7W3BdOm8sW2ZdOnN9fX19fX0sSm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7b3B0aW9uczplLGZuKHQpe2xldHt4Om4seTpyLHBsYWNlbWVudDppLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6b309dCx7b2Zmc2V0OnM9MCxtYWluQXhpczpjPSEwLGNyb3NzQXhpczpsPSEwfT1obihlLHQpLHU9e3g6bix5OnJ9LGQ9Ym4oaSksZj12bihkKSxwPXVbZl0sbT11W2RdLGg9aG4ocyx0KSxnPXR5cGVvZiBoPT1gbnVtYmVyYD97bWFpbkF4aXM6aCxjcm9zc0F4aXM6MH06e21haW5BeGlzOmgubWFpbkF4aXM/PzAsY3Jvc3NBeGlzOmguY3Jvc3NBeGlzPz8wfTtpZihjKXtsZXQgZT1mPT09YHlgP2BoZWlnaHRgOmB3aWR0aGAsdD1hLnJlZmVyZW5jZVtmXS1hLmZsb2F0aW5nW2VdK2cubWFpbkF4aXMsbj1hLnJlZmVyZW5jZVtmXSthLnJlZmVyZW5jZVtlXS1nLm1haW5BeGlzO3A8dD9wPXQ6cD5uJiYocD1uKX1pZihsKXtsZXQgZT1mPT09YHlgP2B3aWR0aGA6YGhlaWdodGAsdD1Xbi5oYXMoZ24oaSkpLG49YS5yZWZlcmVuY2VbZF0tYS5mbG9hdGluZ1tlXSsodCYmby5vZmZzZXQ/LltkXXx8MCkrKHQ/MDpnLmNyb3NzQXhpcykscj1hLnJlZmVyZW5jZVtkXSthLnJlZmVyZW5jZVtlXSsodD8wOm8ub2Zmc2V0Py5bZF18fDApLSh0P2cuY3Jvc3NBeGlzOjApO208bj9tPW46bT5yJiYobT1yKX1yZXR1cm57W2ZdOnAsW2RdOm19fX19LFluPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6YHNpemVgLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtsZXR7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTppLGVsZW1lbnRzOmF9PXQse2FwcGx5Om89KCk9Pnt9LC4uLnN9PWhuKGUsdCksYz1hd2FpdCBpLmRldGVjdE92ZXJmbG93KHQscyksbD1nbihuKSx1PV9uKG4pLGQ9Ym4obik9PT1geWAse3dpZHRoOmYsaGVpZ2h0OnB9PXIuZmxvYXRpbmcsbSxoO2w9PT1gdG9wYHx8bD09PWBib3R0b21gPyhtPWwsaD11PT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoYS5mbG9hdGluZykpP2BzdGFydGA6YGVuZGApP2BsZWZ0YDpgcmlnaHRgKTooaD1sLG09dT09PWBlbmRgP2B0b3BgOmBib3R0b21gKTtsZXQgZz1wLWMudG9wLWMuYm90dG9tLF89Zi1jLmxlZnQtYy5yaWdodCx2PWNuKHAtY1ttXSxnKSx5PWNuKGYtY1toXSxfKSxiPXQubWlkZGxld2FyZURhdGEuc2hpZnQseD0hYixTPXYsQz15O2IhPW51bGwmJmIuZW5hYmxlZC54JiYoQz1fKSxiIT1udWxsJiZiLmVuYWJsZWQueSYmKFM9ZykseCYmIXUmJihkP0M9Zi0yKmxuKGMubGVmdCxjLnJpZ2h0KTpTPXAtMipsbihjLnRvcCxjLmJvdHRvbSkpLGF3YWl0IG8oey4uLnQsYXZhaWxhYmxlV2lkdGg6QyxhdmFpbGFibGVIZWlnaHQ6U30pO2xldCB3PWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhhLmZsb2F0aW5nKTtyZXR1cm4gZiE9PXcud2lkdGh8fHAhPT13LmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gWG4oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzxgdWB9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuICRuKGUpPyhlLm5vZGVOYW1lfHxgYCkudG9Mb3dlckNhc2UoKTpgI2RvY3VtZW50YH1mdW5jdGlvbiBIKGUpe3ZhciB0O3JldHVybihlPT1udWxsfHwodD1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRlZmF1bHRWaWV3KXx8d2luZG93fWZ1bmN0aW9uIFFuKGUpe3JldHVybigoJG4oZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPy5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gJG4oZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBIKGUpLk5vZGU6ITF9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBIKGUpLkVsZW1lbnQ6ITF9ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIFhuKCk/ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHxlIGluc3RhbmNlb2YgSChlKS5IVE1MRWxlbWVudDohMX1mdW5jdGlvbiBucihlKXtyZXR1cm4hWG4oKXx8dHlwZW9mIFNoYWRvd1Jvb3Q+YHVgPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgSChlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHJyKGUpe2xldHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09bXIoZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiZpIT09YGlubGluZWAmJmkhPT1gY29udGVudHNgfWZ1bmN0aW9uIGlyKGUpe3JldHVybi9eKHRhYmxlfHRkfHRoKSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIGFyKGUpe3RyeXtpZihlLm1hdGNoZXMoYDpwb3BvdmVyLW9wZW5gKSlyZXR1cm4hMH1jYXRjaHt9dHJ5e3JldHVybiBlLm1hdGNoZXMoYDptb2RhbGApfWNhdGNoe3JldHVybiExfX12YXIgb3I9L3RyYW5zZm9ybXx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHBlcnNwZWN0aXZlfGZpbHRlci8sc3I9L3BhaW50fGxheW91dHxzdHJpY3R8Y29udGVudC8sY3I9ZT0+ISFlJiZlIT09YG5vbmVgLGxyO2Z1bmN0aW9uIHVyKGUpe2xldCB0PWVyKGUpP21yKGUpOmU7cmV0dXJuIGNyKHQudHJhbnNmb3JtKXx8Y3IodC50cmFuc2xhdGUpfHxjcih0LnNjYWxlKXx8Y3IodC5yb3RhdGUpfHxjcih0LnBlcnNwZWN0aXZlKXx8IWZyKCkmJihjcih0LmJhY2tkcm9wRmlsdGVyKXx8Y3IodC5maWx0ZXIpKXx8b3IudGVzdCh0LndpbGxDaGFuZ2V8fGBgKXx8c3IudGVzdCh0LmNvbnRhaW58fGBgKX1mdW5jdGlvbiBkcihlKXtsZXQgdD1ncihlKTtmb3IoO3RyKHQpJiYhcHIodCk7KXtpZih1cih0KSlyZXR1cm4gdDtpZihhcih0KSlyZXR1cm4gbnVsbDt0PWdyKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIGZyKCl7cmV0dXJuIGxyPz89dHlwZW9mIENTUzxgdWAmJkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKGAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcmAsYG5vbmVgKSxscn1mdW5jdGlvbiBwcihlKXtyZXR1cm4vXihodG1sfGJvZHl8I2RvY3VtZW50KSQvLnRlc3QoWm4oZSkpfWZ1bmN0aW9uIG1yKGUpe3JldHVybiBIKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIGVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUuc2Nyb2xsWCxzY3JvbGxUb3A6ZS5zY3JvbGxZfX1mdW5jdGlvbiBncihlKXtpZihabihlKT09PWBodG1sYClyZXR1cm4gZTtsZXQgdD1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHxucihlKSYmZS5ob3N0fHxRbihlKTtyZXR1cm4gbnIodCk/dC5ob3N0OnR9ZnVuY3Rpb24gX3IoZSl7bGV0IHQ9Z3IoZSk7cmV0dXJuIHByKHQpPyhlLm93bmVyRG9jdW1lbnR8fGUpLmJvZHk6dHIodCkmJnJyKHQpP3Q6X3IodCl9ZnVuY3Rpb24gdnIoZSx0LG4pe3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7bGV0IHI9X3IoZSksaT1yPT09ZS5vd25lckRvY3VtZW50Py5ib2R5LGE9SChyKTtpZihpKXtsZXQgZT15cihhKTtyZXR1cm4gdC5jb25jYXQoYSxhLnZpc3VhbFZpZXdwb3J0fHxbXSxycihyKT9yOltdLGUmJm4/dnIoZSk6W10pfXJldHVybiB0LmNvbmNhdChyLHZyKHIsW10sbikpfWZ1bmN0aW9uIHlyKGUpe3JldHVybiBlLnBhcmVudCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUucGFyZW50KT9lLmZyYW1lRWxlbWVudDpudWxsfWZ1bmN0aW9uIGJyKGUpe2xldCB0PW1yKGUpLG49cGFyc2VGbG9hdCh0LndpZHRoKXx8MCxyPXBhcnNlRmxvYXQodC5oZWlnaHQpfHwwLGk9dHIoZSksYT1pP2Uub2Zmc2V0V2lkdGg6bixvPWk/ZS5vZmZzZXRIZWlnaHQ6cixzPXVuKG4pIT09YXx8dW4ocikhPT1vO3JldHVybiBzJiYobj1hLHI9bykse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gZXIoZSk/ZTplLmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIFNyKGUpe2xldCB0PXhyKGUpO2lmKCF0cih0KSlyZXR1cm4gZm4oMSk7bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6aSwkOmF9PWJyKHQpLG89KGE/dW4obi53aWR0aCk6bi53aWR0aCkvcixzPShhP3VuKG4uaGVpZ2h0KTpuLmhlaWdodCkvaTtyZXR1cm4oIW98fCFOdW1iZXIuaXNGaW5pdGUobykpJiYobz0xKSwoIXN8fCFOdW1iZXIuaXNGaW5pdGUocykpJiYocz0xKSx7eDpvLHk6c319dmFyIENyPWZuKDApO2Z1bmN0aW9uIHdyKGUpe2xldCB0PUgoZSk7cmV0dXJuIWZyKCl8fCF0LnZpc3VhbFZpZXdwb3J0P0NyOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBUcihlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhIW4mJnQmJm49PT1IKGUpfWZ1bmN0aW9uIEVyKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7bGV0IGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXhyKGUpLG89Zm4oMSk7dCYmKHI/ZXIocikmJihvPVNyKHIpKTpvPVNyKGUpKTtsZXQgcz1UcihhLG4scik/d3IoYSk6Zm4oMCksYz0oaS5sZWZ0K3MueCkvby54LGw9KGkudG9wK3MueSkvby55LHU9aS53aWR0aC9vLngsZD1pLmhlaWdodC9vLnk7aWYoYSYmcil7bGV0IGU9SChhKSx0PWVyKHIpP0gocik6cixuPWUsaT15cihuKTtmb3IoO2kmJnQhPT1uOyl7bGV0IGU9U3IoaSksdD1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bXIoaSksYT10LmxlZnQrKGkuY2xpZW50TGVmdCtwYXJzZUZsb2F0KHIucGFkZGluZ0xlZnQpKSplLngsbz10LnRvcCsoaS5jbGllbnRUb3ArcGFyc2VGbG9hdChyLnBhZGRpbmdUb3ApKSplLnk7Yyo9ZS54LGwqPWUueSx1Kj1lLngsZCo9ZS55LGMrPWEsbCs9byxuPUgoaSksaT15cihuKX19cmV0dXJuIFBuKHt3aWR0aDp1LGhlaWdodDpkLHg6Yyx5Omx9KX1mdW5jdGlvbiBEcihlLHQpe2xldCBuPWhyKGUpLnNjcm9sbExlZnQ7cmV0dXJuIHQ/dC5sZWZ0K246RXIoUW4oZSkpLmxlZnQrbn1mdW5jdGlvbiBPcihlLHQpe2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6bi5sZWZ0K3Quc2Nyb2xsTGVmdC1EcihlLG4pLHk6bi50b3ArdC5zY3JvbGxUb3B9fWZ1bmN0aW9uIGtyKGUpe2xldHtlbGVtZW50czp0LHJlY3Q6bixvZmZzZXRQYXJlbnQ6cixzdHJhdGVneTppfT1lLGE9aT09PWBmaXhlZGAsbz1RbihyKSxzPXQ/YXIodC5mbG9hdGluZyk6ITE7aWYocj09PW98fHMmJmEpcmV0dXJuIG47bGV0IGM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD1mbigxKSx1PWZuKDApLGQ9dHIocik7aWYoKGR8fCFhKSYmKChabihyKSE9PWBib2R5YHx8cnIobykpJiYoYz1ocihyKSksZCkpe2xldCBlPUVyKHIpO2w9U3IociksdS54PWUueCtyLmNsaWVudExlZnQsdS55PWUueStyLmNsaWVudFRvcH1sZXQgZj1vJiYhZCYmIWE/T3IobyxjKTpmbigwKTtyZXR1cm57d2lkdGg6bi53aWR0aCpsLngsaGVpZ2h0Om4uaGVpZ2h0KmwueSx4Om4ueCpsLngtYy5zY3JvbGxMZWZ0KmwueCt1LngrZi54LHk6bi55KmwueS1jLnNjcm9sbFRvcCpsLnkrdS55K2YueX19ZnVuY3Rpb24gQXIoZSl7cmV0dXJuIGUuZ2V0Q2xpZW50UmVjdHM/QXJyYXkuZnJvbShlLmdldENsaWVudFJlY3RzKCkpOltdfWZ1bmN0aW9uIGpyKGUpe2xldCB0PWhyKGUpLG49ZS5vd25lckRvY3VtZW50LmJvZHkscj1sbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsbi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoKSxpPWxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0KSxhPS10LnNjcm9sbExlZnQrRHIoZSksbz0tdC5zY3JvbGxUb3A7cmV0dXJuIG1yKG4pLmRpcmVjdGlvbj09PWBydGxgJiYoYSs9bG4oZS5jbGllbnRXaWR0aCxuLmNsaWVudFdpZHRoKS1yKSx7d2lkdGg6cixoZWlnaHQ6aSx4OmEseTpvfX12YXIgTXI9MjU7ZnVuY3Rpb24gTnIoZSx0LG4pe249PT12b2lkIDAmJihuPWB2aWV3cG9ydGApO2xldCByPW49PT1gbGF5b3V0Vmlld3BvcnRgLGk9SChlKSxhPVFuKGUpLG89aS52aXN1YWxWaWV3cG9ydCxzPWEuY2xpZW50V2lkdGgsYz1hLmNsaWVudEhlaWdodCxsPTAsdT0wO2lmKG8pe2xldCBlPSFmcigpfHx0PT09YGZpeGVkYDtyP2V8fChsPS1vLm9mZnNldExlZnQsdT0tby5vZmZzZXRUb3ApOihzPW8ud2lkdGgsYz1vLmhlaWdodCxlJiYobD1vLm9mZnNldExlZnQsdT1vLm9mZnNldFRvcCkpfWlmKERyKGEpPD0wKXtsZXQgZT1hLm93bmVyRG9jdW1lbnQsdD1lLmJvZHksbj1nZXRDb21wdXRlZFN0eWxlKHQpLHI9ZS5jb21wYXRNb2RlPT09YENTUzFDb21wYXRgJiZwYXJzZUZsb2F0KG4ubWFyZ2luTGVmdCkrcGFyc2VGbG9hdChuLm1hcmdpblJpZ2h0KXx8MCxpPU1hdGguYWJzKGEuY2xpZW50V2lkdGgtdC5jbGllbnRXaWR0aC1yKSxvPWdldENvbXB1dGVkU3R5bGUoYSkuc2Nyb2xsYmFyR3V0dGVyPT09YHN0YWJsZSBib3RoLWVkZ2VzYD9pLzI6aTtvPD1NciYmKHMtPW8pfXJldHVybnt3aWR0aDpzLGhlaWdodDpjLHg6bCx5OnV9fWZ1bmN0aW9uIFByKGUsdCl7bGV0IG49RXIoZSwhMCx0PT09YGZpeGVkYCkscj1uLnRvcCtlLmNsaWVudFRvcCxpPW4ubGVmdCtlLmNsaWVudExlZnQsYT1TcihlKTtyZXR1cm57d2lkdGg6ZS5jbGllbnRXaWR0aCphLngsaGVpZ2h0OmUuY2xpZW50SGVpZ2h0KmEueSx4OmkqYS54LHk6ciphLnl9fWZ1bmN0aW9uIEZyKGUsdCxuKXtsZXQgcjtpZih0PT09YHZpZXdwb3J0YHx8dD09PWBsYXlvdXRWaWV3cG9ydGApcj1OcihlLG4sdCk7ZWxzZSBpZih0PT09YGRvY3VtZW50YClyPWpyKFFuKGUpKTtlbHNlIGlmKGVyKHQpKXI9UHIodCxuKTtlbHNle2xldCBuPXdyKGUpO3I9e3g6dC54LW4ueCx5OnQueS1uLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiBQbihyKX1mdW5jdGlvbiBJcihlLHQpe2xldCBuPXQuZ2V0KGUpO2lmKG4pcmV0dXJuIG47bGV0IHI9dnIoZSxbXSwhMSkuZmlsdGVyKGU9PmVyKGUpJiZabihlKSE9PWBib2R5YCksaT1udWxsLGE9bXIoZSkucG9zaXRpb249PT1gZml4ZWRgLG89YT9ncihlKTplO2Zvcig7ZXIobykmJiFwcihvKTspe2xldCBlPW1yKG8pLHQ9dXIobyksbj1pP2kucG9zaXRpb246YT9gZml4ZWRgOmBgOyF0JiYobj09PWBmaXhlZGB8fG49PT1gYWJzb2x1dGVgJiZlLnBvc2l0aW9uPT09YHN0YXRpY2ApP3I9ci5maWx0ZXIoZT0+ZSE9PW8pOmk9ZSxvPWdyKG8pfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gTHIoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Oml9PWUsYT1bLi4ubj09PWBjbGlwcGluZ0FuY2VzdG9yc2A/YXIodCk/W106SXIodCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0sbz1Gcih0LGFbMF0saSkscz1vLnRvcCxjPW8ucmlnaHQsbD1vLmJvdHRvbSx1PW8ubGVmdDtmb3IobGV0IGU9MTtlPGEubGVuZ3RoO2UrKyl7bGV0IG49RnIodCxhW2VdLGkpO3M9bG4obi50b3AscyksYz1jbihuLnJpZ2h0LGMpLGw9Y24obi5ib3R0b20sbCksdT1sbihuLmxlZnQsdSl9cmV0dXJue3dpZHRoOmMtdSxoZWlnaHQ6bC1zLHg6dSx5OnN9fWZ1bmN0aW9uIFJyKGUpe2xldHt3aWR0aDp0LGhlaWdodDpufT1icihlKTtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6bn19ZnVuY3Rpb24genIoZSx0LG4pe2xldCByPXRyKHQpLGk9UW4odCksYT1uPT09YGZpeGVkYCxvPUVyKGUsITAsYSx0KSxzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGM9Zm4oMCk7aWYoKHJ8fCFhKSYmKChabih0KSE9PWBib2R5YHx8cnIoaSkpJiYocz1ocih0KSkscikpe2xldCBlPUVyKHQsITAsYSx0KTtjLng9ZS54K3QuY2xpZW50TGVmdCxjLnk9ZS55K3QuY2xpZW50VG9wfSFyJiZpJiYoYy54PURyKGkpKTtsZXQgbD1pJiYhciYmIWE/T3IoaSxzKTpmbigwKTtyZXR1cm57eDpvLmxlZnQrcy5zY3JvbGxMZWZ0LWMueC1sLngseTpvLnRvcCtzLnNjcm9sbFRvcC1jLnktbC55LHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX1mdW5jdGlvbiBCcihlKXtyZXR1cm4gbXIoZSkucG9zaXRpb249PT1gc3RhdGljYH1mdW5jdGlvbiBWcihlLHQpe2lmKCF0cihlKXx8bXIoZSkucG9zaXRpb249PT1gZml4ZWRgKXJldHVybiBudWxsO2lmKHQpcmV0dXJuIHQoZSk7bGV0IG49ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIFFuKGUpPT09biYmKG49bi5vd25lckRvY3VtZW50LmJvZHkpLG59ZnVuY3Rpb24gSHIoZSx0KXtsZXQgbj1IKGUpO2lmKGFyKGUpKXJldHVybiBuO2lmKCF0cihlKSl7bGV0IHQ9Z3IoZSk7Zm9yKDt0JiYhcHIodCk7KXtpZihlcih0KSYmIUJyKHQpKXJldHVybiB0O3Q9Z3IodCl9cmV0dXJuIG59bGV0IHI9VnIoZSx0KTtmb3IoO3ImJmlyKHIpJiZCcihyKTspcj1WcihyLHQpO3JldHVybiByJiZwcihyKSYmQnIocikmJiF1cihyKT9uOnJ8fGRyKGUpfHxufXZhciBVcj1hc3luYyBmdW5jdGlvbihlKXtsZXQgdD10aGlzLmdldE9mZnNldFBhcmVudHx8SHIsbj10aGlzLmdldERpbWVuc2lvbnMscj1hd2FpdCBuKGUuZmxvYXRpbmcpO3JldHVybntyZWZlcmVuY2U6enIoZS5yZWZlcmVuY2UsYXdhaXQgdChlLmZsb2F0aW5nKSxlLnN0cmF0ZWd5KSxmbG9hdGluZzp7eDowLHk6MCx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH19fTtmdW5jdGlvbiBXcihlKXtyZXR1cm4gbXIoZSkuZGlyZWN0aW9uPT09YHJ0bGB9dmFyIEdyPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDprcixnZXREb2N1bWVudEVsZW1lbnQ6UW4sZ2V0Q2xpcHBpbmdSZWN0OkxyLGdldE9mZnNldFBhcmVudDpIcixnZXRFbGVtZW50UmVjdHM6VXIsZ2V0Q2xpZW50UmVjdHM6QXIsZ2V0RGltZW5zaW9uczpScixnZXRTY2FsZTpTcixpc0VsZW1lbnQ6ZXIsaXNSVEw6V3J9O2Z1bmN0aW9uIEtyKGUsdCl7cmV0dXJuIGUueD09PXQueCYmZS55PT09dC55JiZlLndpZHRoPT09dC53aWR0aCYmZS5oZWlnaHQ9PT10LmhlaWdodH1mdW5jdGlvbiBxcihlLHQsbil7bGV0IHI9bnVsbCxpLGE9UW4oZSk7ZnVuY3Rpb24gbygpe3ZhciBlO2NsZWFyVGltZW91dChpKSwoZT1yKT09bnVsbHx8ZS5kaXNjb25uZWN0KCkscj1udWxsfWZ1bmN0aW9uIHMobixjKXtuPT09dm9pZCAwJiYobj0hMSksYz09PXZvaWQgMCYmKGM9MSksbygpO2xldCBsPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2xlZnQ6dSx0b3A6ZCx3aWR0aDpmLGhlaWdodDpwfT1sO2lmKG58fHQoKSwhZnx8IXApcmV0dXJuO2xldCBtPWRuKGQpLGg9ZG4oYS5jbGllbnRXaWR0aC0odStmKSksZz1kbihhLmNsaWVudEhlaWdodC0oZCtwKSksXz1kbih1KSx2PXtyb290TWFyZ2luOi1tK2BweCBgKy1oK2BweCBgKy1nK2BweCBgKy1fK2BweGAsdGhyZXNob2xkOmxuKDAsY24oMSxjKSl8fDF9LHk9ITA7ZnVuY3Rpb24gYih0KXtsZXQgbj10WzBdLmludGVyc2VjdGlvblJhdGlvO2lmKCFLcihsLGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKXJldHVybiBzKCk7aWYobiE9PWMpe2lmKCF5KXJldHVybiBzKCk7bj9zKCExLG4pOmk9c2V0VGltZW91dCgoKT0+e3MoITEsMWUtNyl9LDFlMyl9eT0hMX10cnl7cj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYix7Li4udixyb290OmEub3duZXJEb2N1bWVudH0pfWNhdGNoe3I9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGIsdil9ci5vYnNlcnZlKGUpfWxldCBjPUgoZSksbD0oKT0+cyhuKTtyZXR1cm4gYy5hZGRFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLHMoITApLCgpPT57Yy5yZW1vdmVFdmVudExpc3RlbmVyKGByZXNpemVgLGwpLG8oKX19ZnVuY3Rpb24gSnIoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2xldHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOmE9ITAsZWxlbWVudFJlc2l6ZTpvPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09YGZ1bmN0aW9uYCxsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09YGZ1bmN0aW9uYCxhbmltYXRpb25GcmFtZTpjPSExfT1yLGw9eHIoZSksdT1pfHxhP1suLi5sP3ZyKGwpOltdLC4uLnQ/dnIodCk6W11dOltdO3UuZm9yRWFjaChlPT57aSYmZS5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUuYWRkRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pO2xldCBkPWwmJnM/cXIobCxuLGEpOm51bGwsZj0tMSxwPW51bGw7byYmKHA9bmV3IFJlc2l6ZU9ic2VydmVyKGU9PntsZXRbcl09ZTtyJiZyLnRhcmdldD09PWwmJnAmJnQmJihwLnVub2JzZXJ2ZSh0KSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3ZhciBlOyhlPXApPT1udWxsfHxlLm9ic2VydmUodCl9KSksbigpfSksbCYmIWMmJnAub2JzZXJ2ZShsKSx0JiZwLm9ic2VydmUodCkpO2xldCBtLGg9Yz9FcihlKTpudWxsO2MmJmcoKTtmdW5jdGlvbiBnKCl7bGV0IHQ9RXIoZSk7aCYmIUtyKGgsdCkmJm4oKSxoPXQsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZyl9cmV0dXJuIG4oKSwoKT0+e3ZhciBlO3UuZm9yRWFjaChlPT57aSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGBzY3JvbGxgLG4pLGEmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxuKX0pLGQ/LigpLChlPXApPT1udWxsfHxlLmRpc2Nvbm5lY3QoKSxwPW51bGwsYyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fXZhciBZcj1LbixYcj1xbixacj1CbixRcj1Zbiwkcj1VbixlaT16bix0aT1KbixuaT0oZSx0LG4pPT57bGV0IHI9bmV3IE1hcCxpPW4/P3t9LGE9ey4uLkdyLC4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIFJuKGUsdCx7Li4uaSxwbGF0Zm9ybTphfSl9O2Z1bmN0aW9uIHJpKGUpe3JldHVybiB0eXBlb2YgZT09YG9iamVjdGAmJiEhZSYmYCRlbGBpbiBlfWZ1bmN0aW9uIGlpKGUpe2lmKHJpKGUpKXtsZXQgdD1lLiRlbDtyZXR1cm4gJG4odCkmJlpuKHQpPT09YCNjb21tZW50YD9udWxsOnR9cmV0dXJuIGV9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuIHR5cGVvZiBlPT1gZnVuY3Rpb25gP2UoKTpiKGUpfWZ1bmN0aW9uIG9pKGUpe3JldHVybntuYW1lOmBhcnJvd2Asb3B0aW9uczplLGZuKHQpe2xldCBuPWlpKGFpKGUuZWxlbWVudCkpO3JldHVybiBuPT1udWxsP3t9OmVpKHtlbGVtZW50Om4scGFkZGluZzplLnBhZGRpbmd9KS5mbih0KX19fWZ1bmN0aW9uIHNpKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PmB1YD8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBjaShlLHQpe2xldCBuPXNpKGUpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1mdW5jdGlvbiBsaShlLHQsbil7bj09PXZvaWQgMCYmKG49e30pO2xldCByPW4ud2hpbGVFbGVtZW50c01vdW50ZWQsaT1NKCgpPT5haShuLm9wZW4pPz8hMCksYT1NKCgpPT5haShuLm1pZGRsZXdhcmUpKSxvPU0oKCk9PmFpKG4ucGxhY2VtZW50KT8/YGJvdHRvbWApLHM9TSgoKT0+YWkobi5zdHJhdGVneSk/P2BhYnNvbHV0ZWApLGM9TSgoKT0+YWkobi50cmFuc2Zvcm0pPz8hMCksbD1NKCgpPT5paShlLnZhbHVlKSksZD1NKCgpPT5paSh0LnZhbHVlKSksZj1GKDApLHA9RigwKSxtPUYocy52YWx1ZSksaD1GKG8udmFsdWUpLGc9dyh7fSksXz1GKCExKSx2PU0oKCk9PntsZXQgZT17cG9zaXRpb246bS52YWx1ZSxsZWZ0OmAwYCx0b3A6YDBgfTtpZighZC52YWx1ZSlyZXR1cm4gZTtsZXQgdD1jaShkLnZhbHVlLGYudmFsdWUpLG49Y2koZC52YWx1ZSxwLnZhbHVlKTtyZXR1cm4gYy52YWx1ZT97Li4uZSx0cmFuc2Zvcm06YHRyYW5zbGF0ZShgK3QrYHB4LCBgK24rYHB4KWAsLi4uc2koZC52YWx1ZSk+PTEuNSYme3dpbGxDaGFuZ2U6YHRyYW5zZm9ybWB9fTp7cG9zaXRpb246bS52YWx1ZSxsZWZ0OnQrYHB4YCx0b3A6bitgcHhgfX0pLHk7ZnVuY3Rpb24gYigpe2lmKGwudmFsdWU9PW51bGx8fGQudmFsdWU9PW51bGwpcmV0dXJuO2xldCBlPWkudmFsdWU7bmkobC52YWx1ZSxkLnZhbHVlLHttaWRkbGV3YXJlOmEudmFsdWUscGxhY2VtZW50Om8udmFsdWUsc3RyYXRlZ3k6cy52YWx1ZX0pLnRoZW4odD0+e2YudmFsdWU9dC54LHAudmFsdWU9dC55LG0udmFsdWU9dC5zdHJhdGVneSxoLnZhbHVlPXQucGxhY2VtZW50LGcudmFsdWU9dC5taWRkbGV3YXJlRGF0YSxfLnZhbHVlPWUhPT0hMX0pfWZ1bmN0aW9uIHgoKXt0eXBlb2YgeT09YGZ1bmN0aW9uYCYmKHkoKSx5PXZvaWQgMCl9ZnVuY3Rpb24gQygpe2lmKHgoKSxyPT09dm9pZCAwKXtiKCk7cmV0dXJufWlmKGwudmFsdWUhPW51bGwmJmQudmFsdWUhPW51bGwpe3k9cihsLnZhbHVlLGQudmFsdWUsYik7cmV0dXJufX1mdW5jdGlvbiBUKCl7aS52YWx1ZXx8KF8udmFsdWU9ITEpfXJldHVybiBWKFthLG8scyxpXSxiLHtmbHVzaDpgc3luY2B9KSxWKFtsLGRdLEMse2ZsdXNoOmBzeW5jYH0pLFYoaSxULHtmbHVzaDpgc3luY2B9KSx1KCkmJk9lKHgpLHt4OlMoZikseTpTKHApLHN0cmF0ZWd5OlMobSkscGxhY2VtZW50OlMoaCksbWlkZGxld2FyZURhdGE6UyhnKSxpc1Bvc2l0aW9uZWQ6UyhfKSxmbG9hdGluZ1N0eWxlczp2LHVwZGF0ZTpifX12YXIgdWk9W2BkaXJgXSxkaT17c2lkZTpgYm90dG9tYCxzaWRlT2Zmc2V0OjAsc2lkZUZsaXA6ITAsYWxpZ246YGNlbnRlcmAsYWxpZ25PZmZzZXQ6MCxhbGlnbkZsaXA6ITAsYXJyb3dQYWRkaW5nOjAsaGlkZVNoaWZ0ZWRBcnJvdzohMCxhdm9pZENvbGxpc2lvbnM6ITAsY29sbGlzaW9uQm91bmRhcnk6KCk9PltdLGNvbGxpc2lvblBhZGRpbmc6MCxzdGlja3k6YHBhcnRpYWxgLGhpZGVXaGVuRGV0YWNoZWQ6ITEscG9zaXRpb25TdHJhdGVneTpgZml4ZWRgLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6YG9wdGltaXplZGAscHJpb3JpdGl6ZVBvc2l0aW9uOiExfSxbZmkscGldPW9lKGBQb3BwZXJDb250ZW50YCksbWk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgUG9wcGVyQ29udGVudGAscHJvcHM6V2Uoe21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSx7Li4uZGl9KSxlbWl0czpbYHBsYWNlZGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGE9JHQoKSx7Zm9yd2FyZFJlZjpzLGN1cnJlbnRFbGVtZW50OmN9PWllKCksdT1sKE0oKCk9Pm4uZGlyKSksZD1GKCksZj1GKCkse3dpZHRoOnAsaGVpZ2h0Om19PUN0KGYpLGg9TSgoKT0+bi5zaWRlKyhuLmFsaWduPT09YGNlbnRlcmA/YGA6YC0ke24uYWxpZ259YCkpLGc9TSgoKT0+dHlwZW9mIG4uY29sbGlzaW9uUGFkZGluZz09YG51bWJlcmA/bi5jb2xsaXNpb25QYWRkaW5nOnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MCwuLi5uLmNvbGxpc2lvblBhZGRpbmd9KSxfPU0oKCk9PkFycmF5LmlzQXJyYXkobi5jb2xsaXNpb25Cb3VuZGFyeSk/bi5jb2xsaXNpb25Cb3VuZGFyeTpbbi5jb2xsaXNpb25Cb3VuZGFyeV0pLHY9TSgoKT0+KHtwYWRkaW5nOmcudmFsdWUsYm91bmRhcnk6Xy52YWx1ZS5maWx0ZXIocm4pLGFsdEJvdW5kYXJ5Ol8udmFsdWUubGVuZ3RoPjB9KSkseT1NKCgpPT4oe21haW5BeGlzOm4uc2lkZUZsaXAsY3Jvc3NBeGlzOm4uYWxpZ25GbGlwfSkpLHg9TSgoKT0+W1lyKHttYWluQXhpczpuLnNpZGVPZmZzZXQrbS52YWx1ZSxhbGlnbm1lbnRBeGlzOm4uYWxpZ25PZmZzZXR9KSxuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxuLmF2b2lkQ29sbGlzaW9ucyYmWHIoe21haW5BeGlzOiEwLGNyb3NzQXhpczohIW4ucHJpb3JpdGl6ZVBvc2l0aW9uLGxpbWl0ZXI6bi5zdGlja3k9PT1gcGFydGlhbGA/dGkoKTp2b2lkIDAsLi4udi52YWx1ZX0pLCFuLnByaW9yaXRpemVQb3NpdGlvbiYmbi5hdm9pZENvbGxpc2lvbnMmJlpyKHsuLi52LnZhbHVlLC4uLnkudmFsdWV9KSxRcih7Li4udi52YWx1ZSxhcHBseTooe2VsZW1lbnRzOmUscmVjdHM6dCxhdmFpbGFibGVXaWR0aDpuLGF2YWlsYWJsZUhlaWdodDpyfSk9PntsZXR7d2lkdGg6aSxoZWlnaHQ6YX09dC5yZWZlcmVuY2Usbz1lLmZsb2F0aW5nLnN0eWxlO28uc2V0UHJvcGVydHkoYC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoYCxgJHtufXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0YCxgJHtyfXB4YCksby5zZXRQcm9wZXJ0eShgLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGhgLGAke2l9cHhgKSxvLnNldFByb3BlcnR5KGAtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHRgLGAke2F9cHhgKX19KSxmLnZhbHVlJiZvaSh7ZWxlbWVudDpmLnZhbHVlLHBhZGRpbmc6bi5hcnJvd1BhZGRpbmd9KSxhbih7YXJyb3dXaWR0aDpwLnZhbHVlLGFycm93SGVpZ2h0Om0udmFsdWUsZGlyOnUudmFsdWV9KSxuLmhpZGVXaGVuRGV0YWNoZWQmJiRyKHtzdHJhdGVneTpgcmVmZXJlbmNlSGlkZGVuYCwuLi52LnZhbHVlfSldKSx7ZmxvYXRpbmdTdHlsZXM6UyxwbGFjZW1lbnQ6Qyxpc1Bvc2l0aW9uZWQ6dyxtaWRkbGV3YXJlRGF0YTpULHVwZGF0ZTpFfT1saShNKCgpPT5uLnJlZmVyZW5jZT8/YS5hbmNob3IudmFsdWUpLGQse3N0cmF0ZWd5Om4ucG9zaXRpb25TdHJhdGVneSxwbGFjZW1lbnQ6aCx3aGlsZUVsZW1lbnRzTW91bnRlZDooLi4uZSk9PkpyKC4uLmUse2xheW91dFNoaWZ0OiFuLmRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0LGFuaW1hdGlvbkZyYW1lOm4udXBkYXRlUG9zaXRpb25TdHJhdGVneT09PWBhbHdheXNgfSksbWlkZGxld2FyZTp4fSksRD1NKCgpPT5vbihDLnZhbHVlKVswXSksTz1NKCgpPT5vbihDLnZhbHVlKVsxXSk7bygoKT0+e3cudmFsdWUmJnIoYHBsYWNlZGApfSk7bGV0IGs9TSgoKT0+e2xldCBlPVQudmFsdWUuYXJyb3c/LmNlbnRlck9mZnNldCE9PTA7cmV0dXJuIG4uaGlkZVNoaWZ0ZWRBcnJvdyYmZX0pLGVlPUYoYGApO3JldHVybiByZSgoKT0+e2MudmFsdWUmJihlZS52YWx1ZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjLnZhbHVlKS56SW5kZXgpfSkscGkoe3BsYWNlZFNpZGU6RCxvbkFycm93Q2hhbmdlOmU9PmYudmFsdWU9ZSxhcnJvd1g6TSgoKT0+VC52YWx1ZS5hcnJvdz8ueD8/MCksYXJyb3dZOk0oKCk9PlQudmFsdWUuYXJyb3c/Lnk/PzApLHNob3VsZEhpZGVBcnJvdzprfSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgZmxvYXRpbmdSZWZgLHJlZjpkLCJkYXRhLXJla2EtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6YGAsZGlyOmIodSksc3R5bGU6aSh7Li4uYihTKSx0cmFuc2Zvcm06Yih3KT9iKFMpLnRyYW5zZm9ybTpgdHJhbnNsYXRlKDAsIC0yMDAlKWAsbWluV2lkdGg6YG1heC1jb250ZW50YCx6SW5kZXg6ZWUudmFsdWUsIi0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6W2IoVCkudHJhbnNmb3JtT3JpZ2luPy54LGIoVCkudHJhbnNmb3JtT3JpZ2luPy55XS5qb2luKGAgYCksLi4uYihUKS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4mJnt2aXNpYmlsaXR5OmBoaWRkZW5gLHBvaW50ZXJFdmVudHM6YG5vbmVgfX0pfSxbbi5tZW1vRGVwZW5kZW5jaWVzP2FlKFtuLmFzQ2hpbGQsbi5hcyxELnZhbHVlLE8udmFsdWUsYih3KSwuLi5PYmplY3QudmFsdWVzKGUuJGF0dHJzKSwuLi5uLm1lbW9EZXBlbmRlbmNpZXNdLCgpPT4oTigpLEkoYihBKSxqKHtrZXk6MCxyZWY6YihzKX0sZS4kYXR0cnMseyJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOm4uYXMsImRhdGEtc2lkZSI6RC52YWx1ZSwiZGF0YS1hbGlnbiI6Ty52YWx1ZSxzdHlsZTp7YW5pbWF0aW9uOmIodyk/dm9pZCAwOmBub25lYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGFzLWNoaWxkYCxgYXNgLGBkYXRhLXNpZGVgLGBkYXRhLWFsaWduYCxgc3R5bGVgXSkpLHQsMCk6KE4oKSxJKGIoQSksaih7a2V5OjEscmVmOmIocyl9LGUuJGF0dHJzLHsiYXMtY2hpbGQiOm4uYXNDaGlsZCxhczpuLmFzLCJkYXRhLXNpZGUiOkQudmFsdWUsImRhdGEtYWxpZ24iOk8udmFsdWUsZGlyOmIodSksc3R5bGU6e2FuaW1hdGlvbjpiKHcpP3ZvaWQgMDpgbm9uZWB9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYsW2Bhcy1jaGlsZGAsYGFzYCxgZGF0YS1zaWRlYCxgZGF0YS1hbGlnbmAsYGRpcmAsYHN0eWxlYF0pKV0sMTIsdWkpKX19KTtmdW5jdGlvbiBoaShlKXtsZXQgdD1zKHtub25jZTpGKCl9KTtyZXR1cm4gTSgoKT0+ZT8udmFsdWV8fHQubm9uY2U/LnZhbHVlKX12YXIgZ2k9W2AgYCxgRW50ZXJgLGBBcnJvd1VwYCxgQXJyb3dEb3duYF0sX2k9W2AgYCxgRW50ZXJgXTtmdW5jdGlvbiB2aShlLHQsbil7cmV0dXJuIGU9PT12b2lkIDA/ITE6QXJyYXkuaXNBcnJheShlKT9lLnNvbWUoZT0+eWkoZSx0LG4pKTp5aShlLHQsbil9ZnVuY3Rpb24geWkoZSx0LG4pe3JldHVybiBlPT09dm9pZCAwfHx0PT09dm9pZCAwPyExOnR5cGVvZiBlPT1gc3RyaW5nYD9lPT09dDp0eXBlb2Ygbj09YGZ1bmN0aW9uYD9uKGUsdCk6dHlwZW9mIG49PWBzdHJpbmdgP2U/LltuXT09PXQ/LltuXTpsZShlLHQpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlPT1udWxsfHxlPT09YGB8fEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MH12YXIgeGk9W2B2YWx1ZWBdLFtTaSxDaV09b2UoYFNlbGVjdFJvb3RgKSx3aT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RSb290YCxwcm9wczp7b3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxkZWZhdWx0VmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sbW9kZWxWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxudWxsYWJsZVZhbHVlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxieTp7dHlwZTpbU3RyaW5nLEZ1bmN0aW9uXSxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sbmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYCxgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCx7cmVxdWlyZWQ6aSxkaXNhYmxlZDphLG11bHRpcGxlOm8sZGlyOnN9PWYobiksYz1DKG4sYG1vZGVsVmFsdWVgLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZT8/KG8udmFsdWU/W106dm9pZCAwKSxwYXNzaXZlOm4ubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSksdT1DKG4sYG9wZW5gLHIse2RlZmF1bHRWYWx1ZTpuLmRlZmF1bHRPcGVuLHBhc3NpdmU6bi5vcGVuPT09dm9pZCAwfSksZD1GKCkscD1GKCksbT1GKHt4OjAseTowfSksaD1NKCgpPT5vLnZhbHVlJiZBcnJheS5pc0FycmF5KGMudmFsdWUpP2MudmFsdWU/Lmxlbmd0aD09PTA6c2UoYy52YWx1ZSkpO0plKHtpc1Byb3ZpZGVyOiEwfSk7bGV0IGc9bChzKSxfPWZ0KGQpLHY9RihuZXcgU2V0KSx5PU0oKCk9PkFycmF5LmZyb20odi52YWx1ZSkubWFwKGU9PmUudmFsdWUpLmpvaW4oYDtgKSk7ZnVuY3Rpb24geChlKXtpZihvLnZhbHVlKXtsZXQgdD1BcnJheS5pc0FycmF5KGMudmFsdWUpP1suLi5jLnZhbHVlXTpbXSxyPXQuZmluZEluZGV4KHQ9PnlpKHQsZSxuLmJ5KSk7cj09PS0xP3QucHVzaChlKTp0LnNwbGljZShyLDEpLGMudmFsdWU9Wy4uLnRdfWVsc2UgYy52YWx1ZT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIEFycmF5LmZyb20odi52YWx1ZSkuZmluZCh0PT52aShlLHQudmFsdWUsbi5ieSkpfXJldHVybiBDaSh7dHJpZ2dlckVsZW1lbnQ6ZCxvblRyaWdnZXJDaGFuZ2U6ZT0+e2QudmFsdWU9ZX0sdmFsdWVFbGVtZW50OnAsb25WYWx1ZUVsZW1lbnRDaGFuZ2U6ZT0+e3AudmFsdWU9ZX0sY29udGVudElkOmBgLG1vZGVsVmFsdWU6YyxvblZhbHVlQ2hhbmdlOngsYnk6bi5ieSxvcGVuOnUsbXVsdGlwbGU6byxyZXF1aXJlZDppLG9uT3BlbkNoYW5nZTplPT57dS52YWx1ZT1lfSxkaXI6Zyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6bSxkaXNhYmxlZDphLGlzRW1wdHlNb2RlbFZhbHVlOmgsb3B0aW9uc1NldDp2LG9uT3B0aW9uQWRkOmU9PntsZXQgdD1TKGUudmFsdWUpO3QmJnYudmFsdWUuZGVsZXRlKHQpLHYudmFsdWUuYWRkKGUpfSxvbk9wdGlvblJlbW92ZTplPT57bGV0IHQ9UyhlLnZhbHVlKTt0JiZ2LnZhbHVlLmRlbGV0ZSh0KX19KSwoZSx0KT0+KE4oKSxJKGIodG4pLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOmIoYyksb3BlbjpiKHUpfSksYihfKSYmZS5uYW1lPyhOKCksSShUaSx7a2V5OnkudmFsdWUsImFyaWEtaGlkZGVuIjpgdHJ1ZWAsdGFiaW5kZXg6YC0xYCxtdWx0aXBsZTpiKG8pLHJlcXVpcmVkOmIoaSksbmFtZTplLm5hbWUsYXV0b2NvbXBsZXRlOmUuYXV0b2NvbXBsZXRlLGRpc2FibGVkOmIoYSksdmFsdWU6YihjKX0se2RlZmF1bHQ6QigoKT0+W2Ioc2UpKGIoYykpPyhOKCksUChgb3B0aW9uYCx7a2V5OjAsdmFsdWU6ZS5udWxsYWJsZVZhbHVlfSxudWxsLDgseGkpKTp6ZShgdi1pZmAsITApLChOKCEwKSxQKGssbnVsbCxtZShBcnJheS5mcm9tKHYudmFsdWUpLGU9PihOKCksUChgb3B0aW9uYCxqKHtrZXk6ZS52YWx1ZT8/YGB9LHtyZWZfZm9yOiEwfSxlKSxudWxsLDE2KSkpLDEyOCkpXSksXzoxfSw4LFtgbXVsdGlwbGVgLGByZXF1aXJlZGAsYG5hbWVgLGBhdXRvY29tcGxldGVgLGBkaXNhYmxlZGAsYHZhbHVlYF0pKTp6ZShgdi1pZmAsITApXSksXzozfSkpfX0pLFRpPVIoe19fbmFtZTpgQnViYmxlU2VsZWN0YCxwcm9wczp7YXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGZvcm06e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxuYW1lOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc2l6ZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49RigpLHI9U2koKTtWKCgpPT50LnZhbHVlLChlLHQpPT57bGV0IHI9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixgdmFsdWVgKS5zZXQ7aWYoZSE9PXQmJmkmJm4udmFsdWUpe2xldCB0PW5ldyBFdmVudChgY2hhbmdlYCx7YnViYmxlczohMH0pO2kuY2FsbChuLnZhbHVlLGUpLG4udmFsdWUuZGlzcGF0Y2hFdmVudCh0KX19KTtmdW5jdGlvbiBpKGUpe3Iub25WYWx1ZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9cmV0dXJuKGUscik9PihOKCksSShiKFF0KSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0hlKGBzZWxlY3RgLGooe3JlZl9rZXk6YHNlbGVjdEVsZW1lbnRgLHJlZjpufSx0LHtvbklucHV0Oml9KSxbeihlLiRzbG90cyxgZGVmYXVsdGApXSwxNildKSxfOjN9KSl9fSksRWk9Uih7X19uYW1lOmBTZWxlY3RQb3BwZXJQb3NpdGlvbmAscHJvcHM6e21lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITEsZGVmYXVsdDoxMH0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1LZShlKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIobWkpLGooYih0KSx7c3R5bGU6e2JveFNpemluZzpgYm9yZGVyLWJveGAsIi0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjpgdmFyKC0tcmVrYS1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilgLCItLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKWAsIi0tcmVrYS1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjpgdmFyKC0tcmVrYS1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClgLCItLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgiOmB2YXIoLS1yZWthLXBvcHBlci1hbmNob3Itd2lkdGgpYCwiLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6YHZhcigtLXJla2EtcG9wcGVyLWFuY2hvci1oZWlnaHQpYH19KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLERpPXtvblZpZXdwb3J0Q2hhbmdlOigpPT57fSxpdGVtVGV4dFJlZkNhbGxiYWNrOigpPT57fSxpdGVtUmVmQ2FsbGJhY2s6KCk9Pnt9fSxbT2ksa2ldPW9lKGBTZWxlY3RDb250ZW50YCksQWk9Uih7X19uYW1lOmBTZWxlY3RDb250ZW50SW1wbGAscHJvcHM6e3Bvc2l0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBpdGVtLWFsaWduZWRgfSxib2R5TG9jazp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3RhcnRgfSxhbGlnbk9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGFsaWduRmxpcDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhdm9pZENvbGxpc2lvbnM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sY29sbGlzaW9uQm91bmRhcnk6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sY29sbGlzaW9uUGFkZGluZzp7dHlwZTpbTnVtYmVyLE9iamVjdF0scmVxdWlyZWQ6ITF9LGFycm93UGFkZGluZzp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sc3RpY2t5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0saGlkZVdoZW5EZXRhY2hlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sdXBkYXRlUG9zaXRpb25TdHJhdGVneTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxyZWZlcmVuY2U6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPVNpKCk7dXQoKSxvdChuLmJvZHlMb2NrKTtsZXR7Q29sbGVjdGlvblNsb3Q6YSxnZXRJdGVtczpvfT1KZSgpLHM9RigpO1N0KHMpO2xldHtzZWFyY2g6YyxoYW5kbGVUeXBlYWhlYWRTZWFyY2g6bH09d3QoKSx1PUYoKSxkPUYoKSxmPUYoKSxwPUYoITEpLG09RighMSksaD1GKCExKTtmdW5jdGlvbiBnKCl7ZC52YWx1ZSYmcy52YWx1ZSYmWHQoW2QudmFsdWUscy52YWx1ZV0pfVYocCwoKT0+e2coKX0pO2xldHtvbk9wZW5DaGFuZ2U6Xyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6dn09aTtyZShlPT57aWYoIXMudmFsdWUpcmV0dXJuO2xldCB0PXt4OjAseTowfSxuPWU9Pnt0PXt4Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWCktKHYudmFsdWU/Lng/PzApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoZS5wYWdlWSktKHYudmFsdWU/Lnk/PzApKX19LHI9ZT0+e2UucG9pbnRlclR5cGUhPT1gdG91Y2hgJiYodC54PD0xMCYmdC55PD0xMD9lLnByZXZlbnREZWZhdWx0KCk6cy52YWx1ZT8uY29udGFpbnMoZS50YXJnZXQpfHxfKCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksdi52YWx1ZT1udWxsKX07di52YWx1ZSE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGBwb2ludGVybW92ZWAsbiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihgcG9pbnRlcnVwYCxyLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksZSgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBvaW50ZXJtb3ZlYCxuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGBwb2ludGVydXBgLHIse2NhcHR1cmU6ITB9KX0pfSk7ZnVuY3Rpb24geShlKXtsZXQgdD1lLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXk7aWYoZS5rZXk9PT1gVGFiYCYmZS5wcmV2ZW50RGVmYXVsdCgpLCF0JiZlLmtleS5sZW5ndGg9PT0xJiZsKGUua2V5LG8oKSksW2BBcnJvd1VwYCxgQXJyb3dEb3duYCxgSG9tZWAsYEVuZGBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IHQ9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpXTtpZihbYEFycm93VXBgLGBFbmRgXS5pbmNsdWRlcyhlLmtleSkmJih0PXQuc2xpY2UoKS5yZXZlcnNlKCkpLFtgQXJyb3dVcGAsYEFycm93RG93bmBdLmluY2x1ZGVzKGUua2V5KSl7bGV0IG49ZS50YXJnZXQscj10LmluZGV4T2Yobik7dD10LnNsaWNlKHIrMSl9c2V0VGltZW91dCgoKT0+WHQodCkpLGUucHJldmVudERlZmF1bHQoKX19bGV0IHg9TSgoKT0+bi5wb3NpdGlvbj09PWBwb3BwZXJgP246e30pLFM9S2UoeC52YWx1ZSk7cmV0dXJuIGtpKHtjb250ZW50OnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmU9Pnt1LnZhbHVlPWV9LGl0ZW1SZWZDYWxsYmFjazooZSx0LG4pPT57bGV0IHI9IW0udmFsdWUmJiFuLGE9dmkoaS5tb2RlbFZhbHVlLnZhbHVlLHQsaS5ieSk7aWYoaS5tdWx0aXBsZS52YWx1ZSl7aWYoaC52YWx1ZSlyZXR1cm47KGF8fHIpJiYoZC52YWx1ZT1lLGEmJihoLnZhbHVlPSEwKSl9ZWxzZShhfHxyKSYmKGQudmFsdWU9ZSk7ciYmKG0udmFsdWU9ITApfSxzZWxlY3RlZEl0ZW06ZCxzZWxlY3RlZEl0ZW1UZXh0OmYsb25JdGVtTGVhdmU6KCk9PntzLnZhbHVlPy5mb2N1cygpfSxpdGVtVGV4dFJlZkNhbGxiYWNrOihlLHQsbik9PntsZXQgcj0hbS52YWx1ZSYmIW47KHZpKGkubW9kZWxWYWx1ZS52YWx1ZSx0LGkuYnkpfHxyKSYmKGYudmFsdWU9ZSl9LGZvY3VzU2VsZWN0ZWRJdGVtOmcscG9zaXRpb246bi5wb3NpdGlvbixpc1Bvc2l0aW9uZWQ6cCxzZWFyY2hSZWY6Y30pLChlLHQpPT4oTigpLEkoYihhKSxudWxsLHtkZWZhdWx0OkIoKCk9PltMKGIoS3QpLHsiYXMtY2hpbGQiOmBgLG9uTW91bnRBdXRvRm9jdXM6dFs2XXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25Vbm1vdW50QXV0b0ZvY3VzOnRbN118fD1lPT57cihgY2xvc2VBdXRvRm9jdXNgLGUpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihiKGkpLnRyaWdnZXJFbGVtZW50LnZhbHVlPy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLGUucHJldmVudERlZmF1bHQoKSl9fSx7ZGVmYXVsdDpCKCgpPT5bTChiKE10KSx7ImFzLWNoaWxkIjpgYCwiZGlzYWJsZS1vdXRzaWRlLXBvaW50ZXItZXZlbnRzIjplLmRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxvbkZvY3VzT3V0c2lkZTp0WzJdfHw9ZmUoKCk9Pnt9LFtgcHJldmVudGBdKSxvbkRpc21pc3M6dFszXXx8PWU9PmIoaSkub25PcGVuQ2hhbmdlKCExKSxvbkVzY2FwZUtleURvd246dFs0XXx8PWU9PnIoYGVzY2FwZUtleURvd25gLGUpLG9uUG9pbnRlckRvd25PdXRzaWRlOnRbNV18fD1lPT5yKGBwb2ludGVyRG93bk91dHNpZGVgLGUpfSx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxJKFllKGUucG9zaXRpb249PT1gcG9wcGVyYD9FaTpOaSksaih7Li4uZS4kYXR0cnMsLi4uYihTKX0se2lkOmIoaSkuY29udGVudElkLHJlZjplPT57aWYoIWUpcmV0dXJuO2xldCB0PWIoRGUpKGUpO3Q/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9zLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6cy52YWx1ZT10fSxyb2xlOmBsaXN0Ym94YCwiZGF0YS1zdGF0ZSI6YihpKS5vcGVuLnZhbHVlP2BvcGVuYDpgY2xvc2VkYCxkaXI6YihpKS5kaXIudmFsdWUsc3R5bGU6e2Rpc3BsYXk6YGZsZXhgLGZsZXhEaXJlY3Rpb246YGNvbHVtbmAsb3V0bGluZTpgbm9uZWB9LG9uQ29udGV4dG1lbnU6dFswXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgXSksb25QbGFjZWQ6dFsxXXx8PWU9PnAudmFsdWU9ITAsb25LZXlkb3duOnl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGlkYCxgZGF0YS1zdGF0ZWAsYGRpcmAsYG9uS2V5ZG93bmBdKSldKSxfOjN9LDgsW2BkaXNhYmxlLW91dHNpZGUtcG9pbnRlci1ldmVudHNgXSldKSxfOjN9KV0pLF86M30pKX19KSxbamksTWldPW9lKGBTZWxlY3RJdGVtQWxpZ25lZFBvc2l0aW9uYCksTmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0SXRlbUFsaWduZWRQb3NpdGlvbmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgcGxhY2VkYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2dldEl0ZW1zOmF9PUplKCksbz1TaSgpLHM9T2koKSxjPUYoITEpLGw9RighMCksdT1GKCkse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1pZSgpLHt2aWV3cG9ydDpwLHNlbGVjdGVkSXRlbTptLHNlbGVjdGVkSXRlbVRleHQ6aCxmb2N1c1NlbGVjdGVkSXRlbTpnfT1zO2Z1bmN0aW9uIF8oKXtpZihvLnRyaWdnZXJFbGVtZW50LnZhbHVlJiZvLnZhbHVlRWxlbWVudC52YWx1ZSYmdS52YWx1ZSYmZi52YWx1ZSYmcD8udmFsdWUmJm0/LnZhbHVlJiZoPy52YWx1ZSl7bGV0IGU9by50cmlnZ2VyRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1vLnZhbHVlRWxlbWVudC52YWx1ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWgudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoby5kaXIudmFsdWUhPT1gcnRsYCl7bGV0IHI9aS5sZWZ0LXQubGVmdCxhPW4ubGVmdC1yLG89ZS5sZWZ0LWEscz1lLndpZHRoK28sYz1NYXRoLm1heChzLHQud2lkdGgpLGw9d2luZG93LmlubmVyV2lkdGgtMTAsZD1RZShhLDEwLE1hdGgubWF4KDEwLGwtYykpO3UudmFsdWUuc3R5bGUubWluV2lkdGg9YCR7c31weGAsdS52YWx1ZS5zdHlsZS5sZWZ0PWAke2R9cHhgfWVsc2V7bGV0IHI9dC5yaWdodC1pLnJpZ2h0LGE9d2luZG93LmlubmVyV2lkdGgtbi5yaWdodC1yLG89d2luZG93LmlubmVyV2lkdGgtZS5yaWdodC1hLHM9ZS53aWR0aCtvLGM9TWF0aC5tYXgocyx0LndpZHRoKSxsPXdpbmRvdy5pbm5lcldpZHRoLTEwLGQ9UWUoYSwxMCxNYXRoLm1heCgxMCxsLWMpKTt1LnZhbHVlLnN0eWxlLm1pbldpZHRoPWAke3N9cHhgLHUudmFsdWUuc3R5bGUucmlnaHQ9YCR7ZH1weGB9bGV0IHM9YSgpLm1hcChlPT5lLnJlZiksbD13aW5kb3cuaW5uZXJIZWlnaHQtMjAsZD1wLnZhbHVlLnNjcm9sbEhlaWdodCxnPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLF89TnVtYmVyLnBhcnNlSW50KGcuYm9yZGVyVG9wV2lkdGgsMTApLHY9TnVtYmVyLnBhcnNlSW50KGcucGFkZGluZ1RvcCwxMCkseT1OdW1iZXIucGFyc2VJbnQoZy5ib3JkZXJCb3R0b21XaWR0aCwxMCksYj1OdW1iZXIucGFyc2VJbnQoZy5wYWRkaW5nQm90dG9tLDEwKSx4PV8rditkK2IreSxTPU1hdGgubWluKG0udmFsdWUub2Zmc2V0SGVpZ2h0KjUseCksQz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwLnZhbHVlKSx3PU51bWJlci5wYXJzZUludChDLnBhZGRpbmdUb3AsMTApLFQ9TnVtYmVyLnBhcnNlSW50KEMucGFkZGluZ0JvdHRvbSwxMCksRT1lLnRvcCtlLmhlaWdodC8yLTEwLEQ9bC1FLE89bS52YWx1ZS5vZmZzZXRIZWlnaHQvMixrPW0udmFsdWUub2Zmc2V0VG9wK08sZWU9Xyt2K2ssdGU9eC1lZTtpZihlZTw9RSl7bGV0IGU9bS52YWx1ZT09PXMuYXQoLTEpO3UudmFsdWUuc3R5bGUuYm90dG9tPWAwcHhgO2xldCB0PWYudmFsdWUuY2xpZW50SGVpZ2h0LXAudmFsdWUub2Zmc2V0VG9wLXAudmFsdWUub2Zmc2V0SGVpZ2h0LG49ZWUrTWF0aC5tYXgoRCxPKyhlP1Q6MCkrdCt5KTt1LnZhbHVlLnN0eWxlLmhlaWdodD1gJHtufXB4YH1lbHNle2xldCBlPW0udmFsdWU9PT1zWzBdO3UudmFsdWUuc3R5bGUudG9wPWAwcHhgO2xldCB0PU1hdGgubWF4KEUsXytwLnZhbHVlLm9mZnNldFRvcCsoZT93OjApK08pK3RlO3UudmFsdWUuc3R5bGUuaGVpZ2h0PWAke3R9cHhgLHAudmFsdWUuc2Nyb2xsVG9wPWVlLUUrcC52YWx1ZS5vZmZzZXRUb3B9dS52YWx1ZS5zdHlsZS5tYXJnaW49YDEwcHggMGAsdS52YWx1ZS5zdHlsZS5taW5IZWlnaHQ9YCR7U31weGAsdS52YWx1ZS5zdHlsZS5tYXhIZWlnaHQ9YCR7bH1weGAscihgcGxhY2VkYCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5jLnZhbHVlPSEwKX19bGV0IHY9RihgYCk7TWUoYXN5bmMoKT0+e2F3YWl0IHhlKCksXygpLGYudmFsdWUmJih2LnZhbHVlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYudmFsdWUpLnpJbmRleCl9KTtmdW5jdGlvbiB5KGUpe2UmJmwudmFsdWU9PT0hMCYmKF8oKSxnPy4oKSxsLnZhbHVlPSExKX1yZXR1cm4geChvLnRyaWdnZXJFbGVtZW50LCgpPT57XygpfSksTWkoe2NvbnRlbnRXcmFwcGVyOnUsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6YyxvblNjcm9sbEJ1dHRvbkNoYW5nZTp5fSksKGUsdCk9PihOKCksUChgZGl2YCx7cmVmX2tleTpgY29udGVudFdyYXBwZXJFbGVtZW50YCxyZWY6dSxzdHlsZTppKHtkaXNwbGF5OmBmbGV4YCxmbGV4RGlyZWN0aW9uOmBjb2x1bW5gLHBvc2l0aW9uOmBmaXhlZGAsekluZGV4OnYudmFsdWV9KX0sW0woYihBKSxqKHtyZWY6YihkKSxzdHlsZTp7Ym94U2l6aW5nOmBib3JkZXItYm94YCxtYXhIZWlnaHQ6YDEwMCVgfX0sey4uLmUuJGF0dHJzLC4uLm59KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNildLDQpKX19KSxQaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RQcm92aWRlcmAscHJvcHM6e2NvbnRleHQ6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfX0sc2V0dXAoZSl7cmV0dXJuIENpKGUuY29udGV4dCksa2koRGkpLChlLHQpPT56KGUuJHNsb3RzLGBkZWZhdWx0YCl9fSksRmk9e2tleToxfSxJaT1SKHtpbmhlcml0QXR0cnM6ITEsX19uYW1lOmBTZWxlY3RDb250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LG1lbW9EZXBlbmRlbmNpZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITF9LHNpZGU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sc2lkZU9mZnNldDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITF9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFsaWduOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGFsaWduT2Zmc2V0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMX0sYWxpZ25GbGlwOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGF2b2lkQ29sbGlzaW9uczp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxjb2xsaXNpb25Cb3VuZGFyeTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxjb2xsaXNpb25QYWRkaW5nOnt0eXBlOltOdW1iZXIsT2JqZWN0XSxyZXF1aXJlZDohMX0sYXJyb3dQYWRkaW5nOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMX0saGlkZVNoaWZ0ZWRBcnJvdzp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxzdGlja3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxoaWRlV2hlbkRldGFjaGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHBvc2l0aW9uU3RyYXRlZ3k6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sZGlzYWJsZVVwZGF0ZU9uTGF5b3V0U2hpZnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0scHJpb3JpdGl6ZVBvc2l0aW9uOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sZW1pdHM6W2BjbG9zZUF1dG9Gb2N1c2AsYGVzY2FwZUtleURvd25gLGBwb2ludGVyRG93bk91dHNpZGVgXSxzZXR1cCh0LHtlbWl0Om59KXtsZXQgcj10LGk9YShyLG4pLG89U2koKSxzPUYoKTtNZSgoKT0+e3MudmFsdWU9bmV3IERvY3VtZW50RnJhZ21lbnR9KTtsZXQgYz1GKCksbD1NKCgpPT5yLmZvcmNlTW91bnR8fG8ub3Blbi52YWx1ZSksdT1GKGwudmFsdWUpLGQ7ZnVuY3Rpb24gZigpe2QmJj0oY2xlYXJUaW1lb3V0KGQpLHZvaWQgMCl9cmV0dXJuIFYobCwoZSx0LG4pPT57ZigpLGQ9c2V0VGltZW91dCgoKT0+e3UudmFsdWU9bC52YWx1ZSxkPXZvaWQgMH0pLG4oZil9KSx3ZShmKSwodCxuKT0+bC52YWx1ZXx8dS52YWx1ZXx8Yy52YWx1ZT8ucHJlc2VudD8oTigpLEkoYihxZSkse2tleTowLHJlZl9rZXk6YHByZXNlbmNlUmVmYCxyZWY6YyxwcmVzZW50OmwudmFsdWV9LHtkZWZhdWx0OkIoKCk9PltMKEFpLFplKHZlKHsuLi5iKGkpLC4uLnQuJGF0dHJzfSkpLHtkZWZhdWx0OkIoKCk9Plt6KHQuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2KV0pLF86M30sOCxbYHByZXNlbnRgXSkpOnMudmFsdWU/KE4oKSxQKGBkaXZgLEZpLFsoTigpLEkoZSx7dG86cy52YWx1ZX0sW0woUGkse2NvbnRleHQ6YihvKX0se2RlZmF1bHQ6QigoKT0+W3oodC4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGNvbnRleHRgXSldLDgsW2B0b2BdKSldKSk6emUoYHYtaWZgLCEwKX19KSxMaT1SKHtfX25hbWU6YFNlbGVjdEljb25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtyZXR1cm4oZSx0KT0+KE4oKSxJKGIoQSkseyJhcmlhLWhpZGRlbiI6YHRydWVgLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGR9LHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCx7fSwoKT0+W3RbMF18fD1nZShg4pa8YCldKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgXSkpfX0pLFtSaSx6aV09b2UoYFNlbGVjdEl0ZW1gKSxCaT1SKHtfX25hbWU6YFNlbGVjdEl0ZW1gLHByb3BzOnt2YWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSx0ZXh0VmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHNlbGVjdGBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LHtkaXNhYmxlZDppfT1mKG4pLGE9U2koKSxvPU9pKCkse2ZvcndhcmRSZWY6cyxjdXJyZW50RWxlbWVudDpjfT1pZSgpLHtDb2xsZWN0aW9uSXRlbTpsfT1KZSgpLHU9TSgoKT0+dmkoYS5tb2RlbFZhbHVlPy52YWx1ZSxuLnZhbHVlLGEuYnkpKSxkPUYoITEpLHA9RihuLnRleHRWYWx1ZT8/YGApLGg9bmUodm9pZCAwLGByZWthLXNlbGVjdC1pdGVtLXRleHRgKTthc3luYyBmdW5jdGlvbiBnKGUpe2UuZGVmYXVsdFByZXZlbnRlZHx8JGUoYHNlbGVjdC5zZWxlY3RgLF8se29yaWdpbmFsRXZlbnQ6ZSx2YWx1ZTpuLnZhbHVlfSl9YXN5bmMgZnVuY3Rpb24gXyhlKXthd2FpdCB4ZSgpLHIoYHNlbGVjdGAsZSksIWUuZGVmYXVsdFByZXZlbnRlZCYmKGkudmFsdWV8fChhLm9uVmFsdWVDaGFuZ2Uobi52YWx1ZSksYS5tdWx0aXBsZS52YWx1ZXx8YS5vbk9wZW5DaGFuZ2UoITEpKSl9YXN5bmMgZnVuY3Rpb24gdihlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihpLnZhbHVlP28ub25JdGVtTGVhdmU/LigpOmUuY3VycmVudFRhcmdldD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9YXN5bmMgZnVuY3Rpb24geShlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJmUuY3VycmVudFRhcmdldD09PW0oKSYmby5vbkl0ZW1MZWF2ZT8uKCl9YXN5bmMgZnVuY3Rpb24geChlKXthd2FpdCB4ZSgpLCFlLmRlZmF1bHRQcmV2ZW50ZWQmJihvLnNlYXJjaFJlZj8udmFsdWU9PT1gYHx8ZS5rZXkhPT1gIGApJiYoX2kuaW5jbHVkZXMoZS5rZXkpJiZnKGUpLGUua2V5PT09YCBgJiZlLnByZXZlbnREZWZhdWx0KCkpfWlmKG4udmFsdWU9PT1gYCl0aHJvdyBFcnJvcihgQSA8U2VsZWN0SXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuYCk7cmV0dXJuIE1lKCgpPT57Yy52YWx1ZSYmby5pdGVtUmVmQ2FsbGJhY2soYy52YWx1ZSxuLnZhbHVlLG4uZGlzYWJsZWQpfSksemkoe3ZhbHVlOm4udmFsdWUsZGlzYWJsZWQ6aSx0ZXh0SWQ6aCxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTplPT57cC52YWx1ZT0oKHAudmFsdWV8fGU/LnRleHRDb250ZW50KT8/YGApLnRyaW0oKX19KSwoZSx0KT0+KE4oKSxJKGIobCkse3ZhbHVlOnt0ZXh0VmFsdWU6cC52YWx1ZX19LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHMpLHJvbGU6YG9wdGlvbmAsImFyaWEtbGFiZWxsZWRieSI6YihoKSwiZGF0YS1oaWdobGlnaHRlZCI6ZC52YWx1ZT9gYDp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUudmFsdWUsImRhdGEtc3RhdGUiOnUudmFsdWU/YGNoZWNrZWRgOmB1bmNoZWNrZWRgLCJhcmlhLWRpc2FibGVkIjpiKGkpfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmIoaSk/YGA6dm9pZCAwLHRhYmluZGV4OmIoaSk/dm9pZCAwOi0xLGFzOmUuYXMsImFzLWNoaWxkIjplLmFzQ2hpbGQsb25Gb2N1czp0WzBdfHw9ZT0+ZC52YWx1ZT0hMCxvbkJsdXI6dFsxXXx8PWU9PmQudmFsdWU9ITEsb25Qb2ludGVydXA6ZyxvblBvaW50ZXJkb3duOnRbMl18fD1lPT57ZS5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LG9uVG91Y2hlbmQ6dFszXXx8PWZlKCgpPT57fSxbYHByZXZlbnRgLGBzdG9wYF0pLG9uUG9pbnRlcm1vdmU6dixvblBvaW50ZXJsZWF2ZTp5LG9uS2V5ZG93bjp4fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgYXJpYS1sYWJlbGxlZGJ5YCxgZGF0YS1oaWdobGlnaHRlZGAsYGFyaWEtc2VsZWN0ZWRgLGBkYXRhLXN0YXRlYCxgYXJpYS1kaXNhYmxlZGAsYGRhdGEtZGlzYWJsZWRgLGB0YWJpbmRleGAsYGFzYCxgYXMtY2hpbGRgXSldKSxfOjN9LDgsW2B2YWx1ZWBdKSl9fSksVmk9Uih7X19uYW1lOmBTZWxlY3RJdGVtSW5kaWNhdG9yYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVJpKCk7cmV0dXJuKGUscik9PmIobikuaXNTZWxlY3RlZC52YWx1ZT8oTigpLEkoYihBKSxqKHtrZXk6MCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKTp6ZShgdi1pZmAsITApfX0pLEhpPVIoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YFNlbGVjdEl0ZW1UZXh0YCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHNwYW5gfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVNpKCkscj1PaSgpLGk9UmkoKSx7Zm9yd2FyZFJlZjphLGN1cnJlbnRFbGVtZW50Om99PWllKCkscz1NKCgpPT4oe3ZhbHVlOmkudmFsdWUsZGlzYWJsZWQ6aS5kaXNhYmxlZC52YWx1ZSx0ZXh0Q29udGVudDpvLnZhbHVlPy50ZXh0Q29udGVudD8/aS52YWx1ZT8udG9TdHJpbmcoKT8/YGB9KSk7cmV0dXJuIE1lKCgpPT57by52YWx1ZSYmKGkub25JdGVtVGV4dENoYW5nZShvLnZhbHVlKSxyLml0ZW1UZXh0UmVmQ2FsbGJhY2soby52YWx1ZSxpLnZhbHVlLGkuZGlzYWJsZWQudmFsdWUpLG4ub25PcHRpb25BZGQocy52YWx1ZSkpfSksd2UoKCk9PntuLm9uT3B0aW9uUmVtb3ZlKHMudmFsdWUpfSksKGUsbik9PihOKCksSShiKEEpLGooe2lkOmIoaSkudGV4dElkLHJlZjpiKGEpfSx7Li4udCwuLi5lLiRhdHRyc30pLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgaWRgXSkpfX0pLFVpPVIoe19fbmFtZTpgU2VsZWN0UG9ydGFsYCxwcm9wczp7dG86e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZGVmZXI6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sZm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoWnQpLFplKHZlKHQpKSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNikpfX0pLFdpPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsQnV0dG9uSW1wbGAsZW1pdHM6W2BhdXRvU2Nyb2xsYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49dCx7Z2V0SXRlbXM6cn09SmUoKSxpPU9pKCksYT1GKG51bGwpO2Z1bmN0aW9uIG8oKXthLnZhbHVlIT09bnVsbCYmKHdpbmRvdy5jbGVhckludGVydmFsKGEudmFsdWUpLGEudmFsdWU9bnVsbCl9cmUoKCk9PntyKCkubWFwKGU9PmUucmVmKS5maW5kKGU9PmU9PT1tKCkpPy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6YG5lYXJlc3RgfSl9KTtmdW5jdGlvbiBzKCl7YS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1mdW5jdGlvbiBjKCl7aS5vbkl0ZW1MZWF2ZT8uKCksYS52YWx1ZT09PW51bGwmJihhLnZhbHVlPXdpbmRvdy5zZXRJbnRlcnZhbCgoKT0+e24oYGF1dG9TY3JvbGxgKX0sNTApKX1yZXR1cm4gSWUoKCk9Pm8oKSksKGUsdCk9PihOKCksSShiKEEpLGooeyJhcmlhLWhpZGRlbiI6YHRydWVgLHN0eWxlOntmbGV4U2hyaW5rOjB9fSxlLiRwYXJlbnQ/LiRwcm9wcyx7b25Qb2ludGVyZG93bjpzLG9uUG9pbnRlcm1vdmU6YyxvblBvaW50ZXJsZWF2ZTp0WzBdfHw9KCk9PntvKCl9fSkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KSxHaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbERvd25CdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1PaSgpLG49dC5wb3NpdGlvbj09PWBpdGVtLWFsaWduZWRgP2ppKCk6dm9pZCAwLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPUYoITEpO3JldHVybiByZShlPT57aWYodC52aWV3cG9ydD8udmFsdWUmJnQuaXNQb3NpdGlvbmVkPy52YWx1ZSl7bGV0IG49dC52aWV3cG9ydC52YWx1ZTtmdW5jdGlvbiByKCl7bGV0IGU9bi5zY3JvbGxIZWlnaHQtbi5jbGllbnRIZWlnaHQ7YS52YWx1ZT1NYXRoLmNlaWwobi5zY3JvbGxUb3ApPGV9cigpLG4uYWRkRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSxlKCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHNjcm9sbGAscikpfX0pLFYoaSwoKT0+e2kudmFsdWUmJm4/Lm9uU2Nyb2xsQnV0dG9uQ2hhbmdlKGkudmFsdWUpfSksKGUsbik9PmEudmFsdWU/KE4oKSxJKFdpLHtrZXk6MCxyZWY6YihyKSxvbkF1dG9TY3JvbGw6blswXXx8PSgpPT57bGV0e3ZpZXdwb3J0OmUsc2VsZWN0ZWRJdGVtOm59PWIodCk7ZT8udmFsdWUmJm4/LnZhbHVlJiYoZS52YWx1ZS5zY3JvbGxUb3A9ZS52YWx1ZS5zY3JvbGxUb3Arbi52YWx1ZS5vZmZzZXRIZWlnaHQpfX0se2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sNTEyKSk6emUoYHYtaWZgLCEwKX19KSxLaT1SKHtfX25hbWU6YFNlbGVjdFNjcm9sbFVwQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0IHQ9T2koKSxuPXQucG9zaXRpb249PT1gaXRlbS1hbGlnbmVkYD9qaSgpOnZvaWQgMCx7Zm9yd2FyZFJlZjpyLGN1cnJlbnRFbGVtZW50Oml9PWllKCksYT1GKCExKTtyZXR1cm4gcmUoZT0+e2lmKHQudmlld3BvcnQ/LnZhbHVlJiZ0LmlzUG9zaXRpb25lZD8udmFsdWUpe2xldCBuPXQudmlld3BvcnQudmFsdWU7ZnVuY3Rpb24gcigpe2EudmFsdWU9bi5zY3JvbGxUb3A+MH1yKCksbi5hZGRFdmVudExpc3RlbmVyKGBzY3JvbGxgLHIpLGUoKCk9Pm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgc2Nyb2xsYCxyKSl9fSksVihpLCgpPT57aS52YWx1ZSYmbj8ub25TY3JvbGxCdXR0b25DaGFuZ2UoaS52YWx1ZSl9KSwoZSxuKT0+YS52YWx1ZT8oTigpLEkoV2kse2tleTowLHJlZjpiKHIpLG9uQXV0b1Njcm9sbDpuWzBdfHw9KCk9PntsZXR7dmlld3BvcnQ6ZSxzZWxlY3RlZEl0ZW06bn09Yih0KTtlPy52YWx1ZSYmbj8udmFsdWUmJihlLnZhbHVlLnNjcm9sbFRvcD1lLnZhbHVlLnNjcm9sbFRvcC1uLnZhbHVlLm9mZnNldEhlaWdodCl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw1MTIpKTp6ZShgdi1pZmAsITApfX0pLHFpPVIoe19fbmFtZTpgU2VsZWN0VHJpZ2dlcmAscHJvcHM6e2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LHJlZmVyZW5jZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWUsbj1TaSgpLHtmb3J3YXJkUmVmOnIsY3VycmVudEVsZW1lbnQ6aX09aWUoKSxhPU0oKCk9Pm4uZGlzYWJsZWQ/LnZhbHVlfHx0LmRpc2FibGVkKTtuLmNvbnRlbnRJZHx8PW5lKHZvaWQgMCxgcmVrYS1zZWxlY3QtY29udGVudGApLE1lKCgpPT57bi5vblRyaWdnZXJDaGFuZ2UoaS52YWx1ZSl9KTtsZXR7Z2V0SXRlbXM6b309SmUoKSx7c2VhcmNoOnMsaGFuZGxlVHlwZWFoZWFkU2VhcmNoOmMscmVzZXRUeXBlYWhlYWQ6bH09d3QoKTtmdW5jdGlvbiB1KCl7YS52YWx1ZXx8KG4ub25PcGVuQ2hhbmdlKCEwKSxsKCkpfWZ1bmN0aW9uIGQoZSl7dSgpLG4udHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLnZhbHVlPXt4Ok1hdGgucm91bmQoZS5wYWdlWCkseTpNYXRoLnJvdW5kKGUucGFnZVkpfX1mdW5jdGlvbiBmKGUpe3JldHVybiBlLmJ1dHRvbj09PTAmJmUuY3RybEtleT09PSExfWxldCBwPSExO2Z1bmN0aW9uIG0oZSl7aWYoZS5wb2ludGVyVHlwZT09PWB0b3VjaGApcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtsZXQgdD1lLnRhcmdldDt0Lmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSYmdC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpLGYoZSkmJihkKGUpLHA9ITApfWZ1bmN0aW9uIGgoZSl7ZihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGcoZSl7cHx8ZS5jdXJyZW50VGFyZ2V0Py5mb2N1cygpLHA9ITF9cmV0dXJuKGUsdCk9PihOKCksSShiKG5uKSx7ImFzLWNoaWxkIjpgYCxyZWZlcmVuY2U6ZS5yZWZlcmVuY2V9LHtkZWZhdWx0OkIoKCk9PltMKGIoQSkse3JlZjpiKHIpLHJvbGU6YGNvbWJvYm94YCx0eXBlOmUuYXM9PT1gYnV0dG9uYD9gYnV0dG9uYDp2b2lkIDAsImFyaWEtY29udHJvbHMiOmIobikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpiKG4pLm9wZW4udmFsdWV8fCExLCJhcmlhLXJlcXVpcmVkIjpiKG4pLnJlcXVpcmVkPy52YWx1ZSwiYXJpYS1hdXRvY29tcGxldGUiOmBub25lYCxkaXNhYmxlZDphLnZhbHVlLGRpcjpiKG4pPy5kaXIudmFsdWUsImRhdGEtc3RhdGUiOmIobik/Lm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjphLnZhbHVlP2BgOnZvaWQgMCwiZGF0YS1wbGFjZWhvbGRlciI6YihiaSkoYihuKS5tb2RlbFZhbHVlPy52YWx1ZSk/YGA6dm9pZCAwLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGFzOmUuYXMsb25DbGljazpnLG9uUG9pbnRlcmRvd246bSxvbk1vdXNlZG93bjpoLG9uUG9pbnRlcnVwOnRbMF18fD1mZShlPT57ZS5wb2ludGVyVHlwZT09PWB0b3VjaGAmJmQoZSl9LFtgcHJldmVudGBdKSxvbktleWRvd246dFsxXXx8PWU9PntsZXQgdD1iKHMpIT09YGA7IShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiZlLmtleS5sZW5ndGg9PT0xJiZ0JiZlLmtleT09PWAgYHx8KGIoYykoZS5rZXksYihvKSgpKSxiKGdpKS5pbmNsdWRlcyhlLmtleSkmJih1KCksZS5wcmV2ZW50RGVmYXVsdCgpKSl9fSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFyaWEtY29udHJvbHNgLGBhcmlhLWV4cGFuZGVkYCxgYXJpYS1yZXF1aXJlZGAsYGRpc2FibGVkYCxgZGlyYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXBsYWNlaG9sZGVyYCxgYXMtY2hpbGRgLGBhc2BdKV0pLF86M30sOCxbYHJlZmVyZW5jZWBdKSl9fSksSmk9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBgfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3J3YXJkUmVmOm4sY3VycmVudEVsZW1lbnQ6cn09aWUoKSxpPVNpKCk7TWUoKCk9PntpLnZhbHVlRWxlbWVudD1yfSk7bGV0IGE9TSgoKT0+e2xldCBlPVtdLHQ9QXJyYXkuZnJvbShpLm9wdGlvbnNTZXQudmFsdWUpLG49ZT0+dC5maW5kKHQ9PnZpKGUsdC52YWx1ZSxpLmJ5KSk7cmV0dXJuIGU9QXJyYXkuaXNBcnJheShpLm1vZGVsVmFsdWUudmFsdWUpP2kubW9kZWxWYWx1ZS52YWx1ZS5tYXAoZT0+bihlKT8udGV4dENvbnRlbnQ/P2BgKTpbbihpLm1vZGVsVmFsdWUudmFsdWUpPy50ZXh0Q29udGVudD8/YGBdLGUuZmlsdGVyKEJvb2xlYW4pfSksbz1NKCgpPT5hLnZhbHVlLmxlbmd0aD9hLnZhbHVlLmpvaW4oYCwgYCk6dC5wbGFjZWhvbGRlcik7cmV0dXJuKGUscik9PihOKCksSShiKEEpLHtyZWY6YihuKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLHN0eWxlOntwb2ludGVyRXZlbnRzOmBub25lYH0sImRhdGEtcGxhY2Vob2xkZXIiOmEudmFsdWUubGVuZ3RoP3ZvaWQgMDp0LnBsYWNlaG9sZGVyfSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse3NlbGVjdGVkTGFiZWw6YS52YWx1ZSxtb2RlbFZhbHVlOmIoaSkubW9kZWxWYWx1ZS52YWx1ZX0sKCk9PltnZShjZShvLnZhbHVlKSwxKV0pXSksXzozfSw4LFtgYXNgLGBhcy1jaGlsZGAsYGRhdGEtcGxhY2Vob2xkZXJgXSkpfX0pLFlpPVIoe19fbmFtZTpgU2VsZWN0Vmlld3BvcnRgLHByb3BzOntub25jZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse25vbmNlOm59PWYodCkscj1oaShuKSxpPU9pKCksYT1pLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGA/amkoKTp2b2lkIDAse2ZvcndhcmRSZWY6byxjdXJyZW50RWxlbWVudDpzfT1pZSgpO01lKCgpPT57aT8ub25WaWV3cG9ydENoYW5nZShzLnZhbHVlKX0pO2xldCBjPUYoMCk7ZnVuY3Rpb24gbChlKXtsZXQgdD1lLmN1cnJlbnRUYXJnZXQse3Nob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOm4sY29udGVudFdyYXBwZXI6cn09YT8/e307aWYobj8udmFsdWUmJnI/LnZhbHVlKXtsZXQgZT1NYXRoLmFicyhjLnZhbHVlLXQuc2Nyb2xsVG9wKTtpZihlPjApe2xldCBuPXdpbmRvdy5pbm5lckhlaWdodC0yMCxpPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUubWluSGVpZ2h0KSxhPU51bWJlci5wYXJzZUZsb2F0KHIudmFsdWUuc3R5bGUuaGVpZ2h0KSxvPU1hdGgubWF4KGksYSk7aWYobzxuKXtsZXQgaT1vK2UsYT1NYXRoLm1pbihuLGkpLHM9aS1hO3IudmFsdWUuc3R5bGUuaGVpZ2h0PWAke2F9cHhgLHIudmFsdWUuc3R5bGUuYm90dG9tPT09YDBweGAmJih0LnNjcm9sbFRvcD1zPjA/czowLHIudmFsdWUuc3R5bGUuanVzdGlmeUNvbnRlbnQ9YGZsZXgtZW5kYCl9fX1jLnZhbHVlPXQuc2Nyb2xsVG9wfXJldHVybihlLG4pPT4oTigpLFAoayxudWxsLFtMKGIoQSksaih7cmVmOmIobyksImRhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnQiOmBgLHJvbGU6YHByZXNlbnRhdGlvbmB9LHsuLi5lLiRhdHRycywuLi50fSx7c3R5bGU6e3Bvc2l0aW9uOmByZWxhdGl2ZWAsZmxleDoxLG92ZXJmbG93OmBoaWRkZW4gYXV0b2B9LG9uU2Nyb2xsOmx9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNiksTChiKEEpLHthczpgc3R5bGVgLG5vbmNlOmIocil9LHtkZWZhdWx0OkIoKCk9Pm5bMF18fD1bZ2UoYCAvKiBIaWRlIHNjcm9sbGJhcnMgY3Jvc3MtYnJvd3NlciBhbmQgZW5hYmxlIG1vbWVudHVtIHNjcm9sbCBmb3IgdG91Y2ggZGV2aWNlcyAqLyBbZGF0YS1yZWthLXNlbGVjdC12aWV3cG9ydF0geyBzY3JvbGxiYXItd2lkdGg6bm9uZTsgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7IH0gW2RhdGEtcmVrYS1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmU7IH0gYCldKSxfOjEsX186WzBdfSw4LFtgbm9uY2VgXSldLDY0KSl9fSksWGk9Uih7X19uYW1lOmBTZWxlY3RgLHByb3BzOntvcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRPcGVuOnt0eXBlOkJvb2xlYW59LGRlZmF1bHRWYWx1ZTp7fSxtb2RlbFZhbHVlOnt9LG51bGxhYmxlVmFsdWU6e30sYnk6e3R5cGU6W1N0cmluZyxGdW5jdGlvbl19LGRpcjp7fSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxhdXRvY29tcGxldGU6e30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sbmFtZTp7fSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWAsYHVwZGF0ZTpvcGVuYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49YShlLHQpO3JldHVybihlLHQpPT4oTigpLEkoYih3aSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdGB9LGIobikpLHtkZWZhdWx0OkIodD0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgLFplKHZlKHQpKSldKSxfOjN9LDE2KSl9fSksWmk9Uih7aW5oZXJpdEF0dHJzOiExLF9fbmFtZTpgU2VsZWN0Q29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb246e2RlZmF1bHQ6YGl0ZW0tYWxpZ25lZGB9LGJvZHlMb2NrOnt0eXBlOkJvb2xlYW59LG1lbW9EZXBlbmRlbmNpZXM6e30sc2lkZTp7fSxzaWRlT2Zmc2V0Ont9LHNpZGVGbGlwOnt0eXBlOkJvb2xlYW59LGFsaWduOntkZWZhdWx0OmBjZW50ZXJgfSxhbGlnbk9mZnNldDp7fSxhbGlnbkZsaXA6e3R5cGU6Qm9vbGVhbn0sYXZvaWRDb2xsaXNpb25zOnt0eXBlOkJvb2xlYW59LGNvbGxpc2lvbkJvdW5kYXJ5Ont9LGNvbGxpc2lvblBhZGRpbmc6e30sYXJyb3dQYWRkaW5nOnt9LGhpZGVTaGlmdGVkQXJyb3c6e3R5cGU6Qm9vbGVhbn0sc3RpY2t5Ont9LGhpZGVXaGVuRGV0YWNoZWQ6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25TdHJhdGVneTp7fSx1cGRhdGVQb3NpdGlvblN0cmF0ZWd5Ont9LGRpc2FibGVVcGRhdGVPbkxheW91dFNoaWZ0Ont0eXBlOkJvb2xlYW59LHByaW9yaXRpemVQb3NpdGlvbjp7dHlwZTpCb29sZWFufSxyZWZlcmVuY2U6e30sZGlyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOnt0eXBlOkJvb2xlYW59LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYGNsb3NlQXV0b0ZvY3VzYCxgZXNjYXBlS2V5RG93bmAsYHBvaW50ZXJEb3duT3V0c2lkZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj10LGk9ZWUobixgY2xhc3NgKSxvPWEoaSxyKTtyZXR1cm4odCxyKT0+KE4oKSxJKGIoVWkpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihJaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1jb250ZW50YCwiZGF0YS1hbGlnbi10cmlnZ2VyIjplLnBvc2l0aW9uPT09YGl0ZW0tYWxpZ25lZGB9LHsuLi50LiRhdHRycywuLi5iKG8pfSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLW9wZW46YW5pbWF0ZS1pbiBkYXRhLWNsb3NlZDphbmltYXRlLW91dCBkYXRhLWNsb3NlZDpmYWRlLW91dC0wIGRhdGEtb3BlbjpmYWRlLWluLTAgZGF0YS1jbG9zZWQ6em9vbS1vdXQtOTUgZGF0YS1vcGVuOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgcmluZy1mb3JlZ3JvdW5kLzEwIG1pbi13LTM2IHJvdW5kZWQtbGcgc2hhZG93LW1kIHJpbmctMSBkdXJhdGlvbi0xMDAgZGF0YS1bc2lkZT1pbmxpbmUtc3RhcnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPWlubGluZS1lbmRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGNuLW1lbnUtdHJhbnNsdWNlbnQgcmVsYXRpdmUgei01MCBtYXgtaC0oLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQpIG9yaWdpbi0oLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byBkYXRhLVthbGlnbi10cmlnZ2VyPXRydWVdOmFuaW1hdGUtbm9uZWAsZS5wb3NpdGlvbj09PWBwb3BwZXJgJiZgZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMWAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bTChiKHRhKSksTChiKFlpKSx7ImRhdGEtcG9zaXRpb24iOmUucG9zaXRpb24sY2xhc3M6dGUoYihwKShgZGF0YS1bcG9zaXRpb249cG9wcGVyXTpoLSgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0KSBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOnctZnVsbCBkYXRhLVtwb3NpdGlvbj1wb3BwZXJdOm1pbi13LSgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpYCkpfSx7ZGVmYXVsdDpCKCgpPT5beih0LiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS1wb3NpdGlvbmAsYGNsYXNzYF0pLEwoYihlYSkpXSksXzozfSwxNixbYGRhdGEtYWxpZ24tdHJpZ2dlcmAsYGNsYXNzYF0pXSksXzozfSkpfX0pLFFpPXtjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSByaWdodC0yIGZsZXggc2l6ZS00IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcmB9LCRpPVIoe19fbmFtZTpgU2VsZWN0SXRlbWAscHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW59LHRleHRWYWx1ZTp7fSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihCaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1pdGVtYH0sYihyKSx7Y2xhc3M6YihwKShgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgbm90LWRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOmZvY3VzOioqOnRleHQtYWNjZW50LWZvcmVncm91bmQgZ2FwLTEuNSByb3VuZGVkLW1kIHB5LTEgcHItOCBwbC0xLjUgdGV4dC1zbSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00ICo6W3NwYW5dOmxhc3Q6ZmxleCAqOltzcGFuXTpsYXN0Oml0ZW1zLWNlbnRlciAqOltzcGFuXTpsYXN0OmdhcC0yIHJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5bSGUoYHNwYW5gLFFpLFtMKGIoVmkpLG51bGwse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGluZGljYXRvci1pY29uYCx7fSwoKT0+W0woYih1ZSkse2ljb246Yih2KSxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTMuNWB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30pXSksTChiKEhpKSxudWxsLHtkZWZhdWx0OkIoKCk9Plt6KGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9KV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksZWE9Uih7X19uYW1lOmBTZWxlY3RTY3JvbGxEb3duQnV0dG9uYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPWVlKHQsYGNsYXNzYCkscj1LZShuKTtyZXR1cm4oZSxuKT0+KE4oKSxJKGIoR2kpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3Qtc2Nyb2xsLWRvd24tYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoTGUpLGNsYXNzOmBzaXplLTRgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLHRhPVIoe19fbmFtZTpgU2VsZWN0U2Nyb2xsVXBCdXR0b25gLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgKSxyPUtlKG4pO3JldHVybihlLG4pPT4oTigpLEkoYihLaSksaih7ImRhdGEtc2xvdCI6YHNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uYH0sYihyKSx7Y2xhc3M6YihwKShgYmctcG9wb3ZlciB6LTEwIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpCKCgpPT5beihlLiRzbG90cyxgZGVmYXVsdGAse30sKCk9PltMKGIodWUpLHtpY29uOmIoXyksY2xhc3M6YHNpemUtNGB9LG51bGwsOCxbYGljb25gXSldKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksbmE9Uih7X19uYW1lOmBTZWxlY3RUcmlnZ2VyYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0scmVmZXJlbmNlOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sc2l6ZTp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49ZWUodCxgY2xhc3NgLGBzaXplYCkscj1LZShuKTtyZXR1cm4obixpKT0+KE4oKSxJKGIocWkpLGooeyJkYXRhLXNsb3QiOmBzZWxlY3QtdHJpZ2dlcmAsImRhdGEtc2l6ZSI6ZS5zaXplfSxiKHIpLHtjbGFzczpiKHApKGBib3JkZXItaW5wdXQgZGF0YS1wbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZS81MCBnYXAtMS41IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB5LTIgcHItMiBwbC0yLjUgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycyBzZWxlY3Qtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGRhdGEtW3NpemU9ZGVmYXVsdF06aC04IGRhdGEtW3NpemU9c21dOmgtNyBkYXRhLVtzaXplPXNtXTpyb3VuZGVkLVttaW4odmFyKC0tcmFkaXVzLW1kKSwxMHB4KV0gKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06Z2FwLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS00IGZsZXggdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB3aGl0ZXNwYWNlLW5vd3JhcCBvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06bGluZS1jbGFtcC0xICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmZsZXggKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06aXRlbXMtY2VudGVyIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx0LmNsYXNzKX0pLHtkZWZhdWx0OkIoKCk9Plt6KG4uJHNsb3RzLGBkZWZhdWx0YCksTChiKExpKSx7ImFzLWNoaWxkIjpgYH0se2RlZmF1bHQ6QigoKT0+W0woYih1ZSkse2ljb246YihMZSksY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBzaXplLTQgcG9pbnRlci1ldmVudHMtbm9uZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9KV0pLF86M30sMTYsW2BkYXRhLXNpemVgLGBjbGFzc2BdKSl9fSkscmE9Uih7X19uYW1lOmBTZWxlY3RWYWx1ZWAscHJvcHM6e3BsYWNlaG9sZGVyOnt9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e319LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihOKCksSShiKEppKSxqKHsiZGF0YS1zbG90Ijpgc2VsZWN0LXZhbHVlYH0sdCkse2RlZmF1bHQ6QigoKT0+W3ooZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sMTYpKX19KTtmdW5jdGlvbiBpYShlKXtyZXR1cm4gZSsuNXwwfXZhciBhYT0oZSx0LG4pPT5NYXRoLm1heChNYXRoLm1pbihlLG4pLHQpO2Z1bmN0aW9uIG9hKGUpe3JldHVybiBhYShpYShlKjIuNTUpLDAsMjU1KX1mdW5jdGlvbiBzYShlKXtyZXR1cm4gYWEoaWEoZSoyNTUpLDAsMjU1KX1mdW5jdGlvbiBjYShlKXtyZXR1cm4gYWEoaWEoZS8yLjU1KS8xMDAsMCwxKX1mdW5jdGlvbiBsYShlKXtyZXR1cm4gYWEoaWEoZSoxMDApLDAsMTAwKX12YXIgdWE9ezA6MCwxOjEsMjoyLDM6Myw0OjQsNTo1LDY6Niw3OjcsODo4LDk6OSxBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNSxhOjEwLGI6MTEsYzoxMixkOjEzLGU6MTQsZjoxNX0sZGE9Wy4uLmAwMTIzNDU2Nzg5QUJDREVGYF0sZmE9ZT0+ZGFbZSYxNV0scGE9ZT0+ZGFbKGUmMjQwKT4+NF0rZGFbZSYxNV0sbWE9ZT0+KGUmMjQwKT4+ND09KGUmMTUpLGhhPWU9Pm1hKGUucikmJm1hKGUuZykmJm1hKGUuYikmJm1hKGUuYSk7ZnVuY3Rpb24gZ2EoZSl7dmFyIHQ9ZS5sZW5ndGgsbjtyZXR1cm4gZVswXT09PWAjYCYmKHQ9PT00fHx0PT09NT9uPXtyOjI1NSZ1YVtlWzFdXSoxNyxnOjI1NSZ1YVtlWzJdXSoxNyxiOjI1NSZ1YVtlWzNdXSoxNyxhOnQ9PT01P3VhW2VbNF1dKjE3OjI1NX06KHQ9PT03fHx0PT09OSkmJihuPXtyOnVhW2VbMV1dPDw0fHVhW2VbMl1dLGc6dWFbZVszXV08PDR8dWFbZVs0XV0sYjp1YVtlWzVdXTw8NHx1YVtlWzZdXSxhOnQ9PT05P3VhW2VbN11dPDw0fHVhW2VbOF1dOjI1NX0pKSxufXZhciBfYT0oZSx0KT0+ZTwyNTU/dChlKTpgYDtmdW5jdGlvbiB2YShlKXt2YXIgdD1oYShlKT9mYTpwYTtyZXR1cm4gZT9gI2ArdChlLnIpK3QoZS5nKSt0KGUuYikrX2EoZS5hLHQpOnZvaWQgMH12YXIgeWE9L14oaHNsYT98aHdifGhzdilcKFxzKihbLSsuZVxkXSspKD86ZGVnKT9bXHMsXSsoWy0rLmVcZF0rKSVbXHMsXSsoWy0rLmVcZF0rKSUoPzpbXHMsXSsoWy0rLmVcZF0rKSglKT8pP1xzKlwpJC87ZnVuY3Rpb24gYmEoZSx0LG4pe2xldCByPXQqTWF0aC5taW4obiwxLW4pLGk9KHQsaT0odCtlLzMwKSUxMik9Pm4tcipNYXRoLm1heChNYXRoLm1pbihpLTMsOS1pLDEpLC0xKTtyZXR1cm5baSgwKSxpKDgpLGkoNCldfWZ1bmN0aW9uIHhhKGUsdCxuKXtsZXQgcj0ocixpPShyK2UvNjApJTYpPT5uLW4qdCpNYXRoLm1heChNYXRoLm1pbihpLDQtaSwxKSwwKTtyZXR1cm5bcig1KSxyKDMpLHIoMSldfWZ1bmN0aW9uIFNhKGUsdCxuKXtsZXQgcj1iYShlLDEsLjUpLGk7Zm9yKHQrbj4xJiYoaT0xLyh0K24pLHQqPWksbio9aSksaT0wO2k8MztpKyspcltpXSo9MS10LW4scltpXSs9dDtyZXR1cm4gcn1mdW5jdGlvbiBDYShlLHQsbixyLGkpe3JldHVybiBlPT09aT8odC1uKS9yKyh0PG4/NjowKTp0PT09aT8obi1lKS9yKzI6KGUtdCkvcis0fWZ1bmN0aW9uIHdhKGUpe2xldCB0PWUuci8yNTUsbj1lLmcvMjU1LHI9ZS5iLzI1NSxpPU1hdGgubWF4KHQsbixyKSxhPU1hdGgubWluKHQsbixyKSxvPShpK2EpLzIscyxjLGw7cmV0dXJuIGkhPT1hJiYobD1pLWEsYz1vPi41P2wvKDItaS1hKTpsLyhpK2EpLHM9Q2EodCxuLHIsbCxpKSxzPXMqNjArLjUpLFtzfDAsY3x8MCxvXX1mdW5jdGlvbiBUYShlLHQsbixyKXtyZXR1cm4oQXJyYXkuaXNBcnJheSh0KT9lKHRbMF0sdFsxXSx0WzJdKTplKHQsbixyKSkubWFwKHNhKX1mdW5jdGlvbiBFYShlLHQsbil7cmV0dXJuIFRhKGJhLGUsdCxuKX1mdW5jdGlvbiBEYShlLHQsbil7cmV0dXJuIFRhKFNhLGUsdCxuKX1mdW5jdGlvbiBPYShlLHQsbil7cmV0dXJuIFRhKHhhLGUsdCxuKX1mdW5jdGlvbiBrYShlKXtyZXR1cm4oZSUzNjArMzYwKSUzNjB9ZnVuY3Rpb24gQWEoZSl7bGV0IHQ9eWEuZXhlYyhlKSxuPTI1NSxyO2lmKCF0KXJldHVybjt0WzVdIT09ciYmKG49dFs2XT9vYSgrdFs1XSk6c2EoK3RbNV0pKTtsZXQgaT1rYSgrdFsyXSksYT10WzNdLzEwMCxvPXRbNF0vMTAwO3JldHVybiByPXRbMV09PT1gaHdiYD9EYShpLGEsbyk6dFsxXT09PWBoc3ZgP09hKGksYSxvKTpFYShpLGEsbykse3I6clswXSxnOnJbMV0sYjpyWzJdLGE6bn19ZnVuY3Rpb24gamEoZSx0KXt2YXIgbj13YShlKTtuWzBdPWthKG5bMF0rdCksbj1FYShuKSxlLnI9blswXSxlLmc9blsxXSxlLmI9blsyXX1mdW5jdGlvbiBNYShlKXtpZighZSlyZXR1cm47bGV0IHQ9d2EoZSksbj10WzBdLHI9bGEodFsxXSksaT1sYSh0WzJdKTtyZXR1cm4gZS5hPDI1NT9gaHNsYSgke259LCAke3J9JSwgJHtpfSUsICR7Y2EoZS5hKX0pYDpgaHNsKCR7bn0sICR7cn0lLCAke2l9JSlgfXZhciBOYT17eDpgZGFya2AsWjpgbGlnaHRgLFk6YHJlYCxYOmBibHVgLFc6YGdyYCxWOmBtZWRpdW1gLFU6YHNsYXRlYCxBOmBlZWAsVDpgb2xgLFM6YG9yYCxCOmByYWAsQzpgbGF0ZWdgLEQ6YGlnaHRzYCxSOmBpbmAsUTpgdHVycXVvaXNgLEU6YGhpYCxQOmByb2AsTzpgYWxgLE46YGxlYCxNOmBkZWAsTDpgeWVsbG9gLEY6YGVuYCxLOmBjaGAsRzpgYXJrc2AsSDpgZWFgLEk6YGlnaHRnYCxKOmB3aGB9LFBhPXtPaWNlWGU6YGYwZjhmZmAsYW50aXF1ZXdFdGU6YGZhZWJkN2AsYXF1YTpgZmZmZmAsYXF1YW1hclJlOmA3ZmZmZDRgLGF6dVk6YGYwZmZmZmAsYmVpZ2U6YGY1ZjVkY2AsYmlzcXVlOmBmZmU0YzRgLGJsYWNrOmAwYCxibGFuS2VkT21vbmQ6YGZmZWJjZGAsWGU6YGZmYCxYZXZpVGV0OmA4YTJiZTJgLGJQd246YGE1MmEyYWAsYnVybHl3b29kOmBkZWI4ODdgLGNhTXRYZTpgNWY5ZWEwYCxLYXJ0WXVzZTpgN2ZmZjAwYCxLb2NUYXRlOmBkMjY5MWVgLGNTTzpgZmY3ZjUwYCxjU25mbG93ZXJYZTpgNjQ5NWVkYCxjU25zaWxrOmBmZmY4ZGNgLGNyaW1zb246YGRjMTQzY2AsY3lhbjpgZmZmZmAseFhlOmA4YmAseGN5YW46YDhiOGJgLHhnVE1uUGQ6YGI4ODYwYmAseFdheTpgYTlhOWE5YCx4Z1lGOmA2NDAwYCx4Z1l5OmBhOWE5YTlgLHhraGFraTpgYmRiNzZiYCx4bWFnRnRhOmA4YjAwOGJgLHhUaXZlZ1lGOmA1NTZiMmZgLHhTYW5nZTpgZmY4YzAwYCx4U2NFZDpgOTkzMmNjYCx4WWQ6YDhiMDAwMGAseHNPbW9uOmBlOTk2N2FgLHhzSGdZRjpgOGZiYzhmYCx4VVhlOmA0ODNkOGJgLHhVV2F5OmAyZjRmNGZgLHhVZ1l5OmAyZjRmNGZgLHhRZTpgY2VkMWAseHZpVGV0OmA5NDAwZDNgLGRBcHBSazpgZmYxNDkzYCxkQXBza3lYZTpgYmZmZmAsZGltV2F5OmA2OTY5NjlgLGRpbWdZeTpgNjk2OTY5YCxkb2RnZXJYZTpgMWU5MGZmYCxmaVlicmljazpgYjIyMjIyYCxmbFNPd0V0ZTpgZmZmYWYwYCxmb1lzdFdBbjpgMjI4YjIyYCxmdUtzaWE6YGZmMDBmZmAsZ2FSc2JTbzpgZGNkY2RjYCxnaG9zdHdFdGU6YGY4ZjhmZmAsZ1RkOmBmZmQ3MDBgLGdUTW5QZDpgZGFhNTIwYCxXYXk6YDgwODA4MGAsZ1lGOmA4MDAwYCxnWUZMdzpgYWRmZjJmYCxnWXk6YDgwODA4MGAsaG9uZXlNdzpgZjBmZmYwYCxob3RwUms6YGZmNjliNGAsUmRpYW5ZZDpgY2Q1YzVjYCxSZGlnbzpgNGIwMDgyYCxpdlN5OmBmZmZmZjBgLGtoYWtpOmBmMGU2OGNgLGxhdkZNcjpgZTZlNmZhYCxsYXZGTXJYc2g6YGZmZjBmNWAsbGF3bmdZRjpgN2NmYzAwYCxObW9uY0VmZm9uOmBmZmZhY2RgLFpYZTpgYWRkOGU2YCxaY1NPOmBmMDgwODBgLFpjeWFuOmBlMGZmZmZgLFpnVE1uUGRMdzpgZmFmYWQyYCxaV2F5OmBkM2QzZDNgLFpnWUY6YDkwZWU5MGAsWmdZeTpgZDNkM2QzYCxacFJrOmBmZmI2YzFgLFpzT21vbjpgZmZhMDdhYCxac0hnWUY6YDIwYjJhYWAsWnNreVhlOmA4N2NlZmFgLFpVV2F5OmA3Nzg4OTlgLFpVZ1l5OmA3Nzg4OTlgLFpzdEFsWGU6YGIwYzRkZWAsWkx3OmBmZmZmZTBgLGxpbWU6YGZmMDBgLGxpbWVnWUY6YDMyY2QzMmAsbFJGOmBmYWYwZTZgLG1hZ0Z0YTpgZmYwMGZmYCxtYVBvbjpgODAwMDAwYCxWYXF1YW1hclJlOmA2NmNkYWFgLFZYZTpgY2RgLFZTY0VkOmBiYTU1ZDNgLFZwdXJwTjpgOTM3MGRiYCxWc0hnWUY6YDNjYjM3MWAsVlVYZTpgN2I2OGVlYCxWc3ByUmdnWUY6YGZhOWFgLFZRZTpgNDhkMWNjYCxWdmlUZXRZZDpgYzcxNTg1YCxtaWRuaWdodFhlOmAxOTE5NzBgLG1SdGNZYW06YGY1ZmZmYWAsbWlzdHlQc2U6YGZmZTRlMWAsbW9jY2FzUjpgZmZlNGI1YCxuYXZham93RXRlOmBmZmRlYWRgLG5hdnk6YDgwYCxUZGxhY2U6YGZkZjVlNmAsVGl2ZTpgODA4MDAwYCxUaXZlZEJiOmA2YjhlMjNgLFNhbmdlOmBmZmE1MDBgLFNhbmdlWWQ6YGZmNDUwMGAsU2NFZDpgZGE3MGQ2YCxwT2VnVE1uUGQ6YGVlZThhYWAscE9lZ1lGOmA5OGZiOThgLHBPZVFlOmBhZmVlZWVgLHBPZXZpVGV0WWQ6YGRiNzA5M2AscGFwYXlhd0VwOmBmZmVmZDVgLHBIS3B1ZmY6YGZmZGFiOWAscGVydTpgY2Q4NTNmYCxwUms6YGZmYzBjYmAscGx1bTpgZGRhMGRkYCxwb3dNclhlOmBiMGUwZTZgLHB1cnBOOmA4MDAwODBgLFliZWNjYXB1cnBOOmA2NjMzOTlgLFlkOmBmZjAwMDBgLFBzeWJyb3duOmBiYzhmOGZgLFB5T1hlOmA0MTY5ZTFgLHNhZGROYlB3bjpgOGI0NTEzYCxzT21vbjpgZmE4MDcyYCxzYW5keWJQd246YGY0YTQ2MGAsc0hnWUY6YDJlOGI1N2Asc0hzaGVsbDpgZmZmNWVlYCxzaUZuYTpgYTA1MjJkYCxzaWx2ZXI6YGMwYzBjMGAsc2t5WGU6YDg3Y2VlYmAsVVhlOmA2YTVhY2RgLFVXYXk6YDcwODA5MGAsVWdZeTpgNzA4MDkwYCxzbm93OmBmZmZhZmFgLHNwclJnZ1lGOmBmZjdmYCxzdEFsWGU6YDQ2ODJiNGAsdGFuOmBkMmI0OGNgLHRlTzpgODA4MGAsdEVzdE46YGQ4YmZkOGAsdG9tYXRvOmBmZjYzNDdgLFFlOmA0MGUwZDBgLHZpVGV0OmBlZTgyZWVgLEpIdDpgZjVkZWIzYCx3RXRlOmBmZmZmZmZgLHdFdGVzbW9rZTpgZjVmNWY1YCxMdzpgZmZmZjAwYCxMd2dZRjpgOWFjZDMyYH07ZnVuY3Rpb24gRmEoKXtsZXQgZT17fSx0PU9iamVjdC5rZXlzKFBhKSxuPU9iamVjdC5rZXlzKE5hKSxyLGksYSxvLHM7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7Zm9yKG89cz10W3JdLGk9MDtpPG4ubGVuZ3RoO2krKylhPW5baV0scz1zLnJlcGxhY2UoYSxOYVthXSk7YT1wYXJzZUludChQYVtvXSwxNiksZVtzXT1bYT4+MTYmMjU1LGE+PjgmMjU1LGEmMjU1XX1yZXR1cm4gZX12YXIgSWE7ZnVuY3Rpb24gTGEoZSl7SWF8fChJYT1GYSgpLElhLnRyYW5zcGFyZW50PVswLDAsMCwwXSk7bGV0IHQ9SWFbZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdCYme3I6dFswXSxnOnRbMV0sYjp0WzJdLGE6dC5sZW5ndGg9PT00P3RbM106MjU1fX12YXIgUmE9L15yZ2JhP1woXHMqKFstKy5cZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT9bXHMsXSsoWy0rLmVcZF0rKSglKT8oPzpbXHMsL10rKFstKy5lXGRdKykoJSk/KT9ccypcKSQvO2Z1bmN0aW9uIHphKGUpe2xldCB0PVJhLmV4ZWMoZSksbj0yNTUscixpLGE7aWYodCl7aWYodFs3XSE9PXIpe2xldCBlPSt0WzddO249dFs4XT9vYShlKTphYShlKjI1NSwwLDI1NSl9cmV0dXJuIHI9K3RbMV0saT0rdFszXSxhPSt0WzVdLHI9MjU1Jih0WzJdP29hKHIpOmFhKHIsMCwyNTUpKSxpPTI1NSYodFs0XT9vYShpKTphYShpLDAsMjU1KSksYT0yNTUmKHRbNl0/b2EoYSk6YWEoYSwwLDI1NSkpLHtyLGc6aSxiOmEsYTpufX19ZnVuY3Rpb24gQmEoZSl7cmV0dXJuIGUmJihlLmE8MjU1P2ByZ2JhKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0sICR7Y2EoZS5hKX0pYDpgcmdiKCR7ZS5yfSwgJHtlLmd9LCAke2UuYn0pYCl9dmFyIFZhPWU9PmU8PS4wMDMxMzA4P2UqMTIuOTI6ZSoqKDEvMi40KSoxLjA1NS0uMDU1LEhhPWU9PmU8PS4wNDA0NT9lLzEyLjkyOigoZSsuMDU1KS8xLjA1NSkqKjIuNDtmdW5jdGlvbiBVYShlLHQsbil7bGV0IHI9SGEoY2EoZS5yKSksaT1IYShjYShlLmcpKSxhPUhhKGNhKGUuYikpO3JldHVybntyOnNhKFZhKHIrbiooSGEoY2EodC5yKSktcikpKSxnOnNhKFZhKGkrbiooSGEoY2EodC5nKSktaSkpKSxiOnNhKFZhKGErbiooSGEoY2EodC5iKSktYSkpKSxhOmUuYStuKih0LmEtZS5hKX19ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUpe2xldCByPXdhKGUpO3JbdF09TWF0aC5tYXgoMCxNYXRoLm1pbihyW3RdK3JbdF0qbix0PT09MD8zNjA6MSkpLHI9RWEociksZS5yPXJbMF0sZS5nPXJbMV0sZS5iPXJbMl19fWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIGUmJk9iamVjdC5hc3NpZ24odHx8e30sZSl9ZnVuY3Rpb24gS2EoZSl7dmFyIHQ9e3I6MCxnOjAsYjowLGE6MjU1fTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aD49MyYmKHQ9e3I6ZVswXSxnOmVbMV0sYjplWzJdLGE6MjU1fSxlLmxlbmd0aD4zJiYodC5hPXNhKGVbM10pKSk6KHQ9R2EoZSx7cjowLGc6MCxiOjAsYToxfSksdC5hPXNhKHQuYSkpLHR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGUuY2hhckF0KDApPT09YHJgP3phKGUpOkFhKGUpfXZhciBKYT1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiB0O2xldCBuPXR5cGVvZiB0LHI7bj09PWBvYmplY3RgP3I9S2EodCk6bj09PWBzdHJpbmdgJiYocj1nYSh0KXx8TGEodCl8fHFhKHQpKSx0aGlzLl9yZ2I9cix0aGlzLl92YWxpZD0hIXJ9Z2V0IHZhbGlkKCl7cmV0dXJuIHRoaXMuX3ZhbGlkfWdldCByZ2IoKXt2YXIgZT1HYSh0aGlzLl9yZ2IpO3JldHVybiBlJiYoZS5hPWNhKGUuYSkpLGV9c2V0IHJnYihlKXt0aGlzLl9yZ2I9S2EoZSl9cmdiU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkP0JhKHRoaXMuX3JnYik6dm9pZCAwfWhleFN0cmluZygpe3JldHVybiB0aGlzLl92YWxpZD92YSh0aGlzLl9yZ2IpOnZvaWQgMH1oc2xTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdmFsaWQ/TWEodGhpcy5fcmdiKTp2b2lkIDB9bWl4KGUsdCl7aWYoZSl7bGV0IG49dGhpcy5yZ2Iscj1lLnJnYixpLGE9dD09PWk/LjU6dCxvPTIqYS0xLHM9bi5hLXIuYSxjPSgobypzPT09LTE/bzoobytzKS8oMStvKnMpKSsxKS8yO2k9MS1jLG4ucj0yNTUmYypuLnIraSpyLnIrLjUsbi5nPTI1NSZjKm4uZytpKnIuZysuNSxuLmI9MjU1JmMqbi5iK2kqci5iKy41LG4uYT1hKm4uYSsoMS1hKSpyLmEsdGhpcy5yZ2I9bn1yZXR1cm4gdGhpc31pbnRlcnBvbGF0ZShlLHQpe3JldHVybiBlJiYodGhpcy5fcmdiPVVhKHRoaXMuX3JnYixlLl9yZ2IsdCkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IGUodGhpcy5yZ2IpfWFscGhhKGUpe3JldHVybiB0aGlzLl9yZ2IuYT1zYShlKSx0aGlzfWNsZWFyZXIoZSl7bGV0IHQ9dGhpcy5fcmdiO3JldHVybiB0LmEqPTEtZSx0aGlzfWdyZXlzY2FsZSgpe2xldCBlPXRoaXMuX3JnYjtyZXR1cm4gZS5yPWUuZz1lLmI9aWEoZS5yKi4zK2UuZyouNTkrZS5iKi4xMSksdGhpc31vcGFxdWVyKGUpe2xldCB0PXRoaXMuX3JnYjtyZXR1cm4gdC5hKj0xK2UsdGhpc31uZWdhdGUoKXtsZXQgZT10aGlzLl9yZ2I7cmV0dXJuIGUucj0yNTUtZS5yLGUuZz0yNTUtZS5nLGUuYj0yNTUtZS5iLHRoaXN9bGlnaHRlbihlKXtyZXR1cm4gV2EodGhpcy5fcmdiLDIsZSksdGhpc31kYXJrZW4oZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwyLC1lKSx0aGlzfXNhdHVyYXRlKGUpe3JldHVybiBXYSh0aGlzLl9yZ2IsMSxlKSx0aGlzfWRlc2F0dXJhdGUoZSl7cmV0dXJuIFdhKHRoaXMuX3JnYiwxLC1lKSx0aGlzfXJvdGF0ZShlKXtyZXR1cm4gamEodGhpcy5fcmdiLGUpLHRoaXN9fTtmdW5jdGlvbiBZYSgpe312YXIgWGE9KCgpPT57bGV0IGU9MDtyZXR1cm4oKT0+ZSsrfSkoKTtmdW5jdGlvbiBVKGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIFcoZSl7aWYoQXJyYXkuaXNBcnJheSYmQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoMCw3KT09PWBbb2JqZWN0YCYmdC5zbGljZSgtNik9PT1gQXJyYXldYH1mdW5jdGlvbiBHKGUpe3JldHVybiBlIT09bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWB9ZnVuY3Rpb24gSyhlKXtyZXR1cm4odHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmaXNGaW5pdGUoK2UpfWZ1bmN0aW9uIFphKGUsdCl7cmV0dXJuIEsoZSk/ZTp0fWZ1bmN0aW9uIHEoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD90OmV9dmFyIFFhPShlLHQpPT50eXBlb2YgZT09YHN0cmluZ2AmJmUuZW5kc1dpdGgoYCVgKT9wYXJzZUZsb2F0KGUpLzEwMCp0OitlO2Z1bmN0aW9uIEooZSx0LG4pe2lmKGUmJnR5cGVvZiBlLmNhbGw9PWBmdW5jdGlvbmApcmV0dXJuIGUuYXBwbHkobix0KX1mdW5jdGlvbiBZKGUsdCxuLHIpe2xldCBpLGEsbztpZihXKGUpKXtpZihhPWUubGVuZ3RoLHIpZm9yKGk9YS0xO2k+PTA7aS0tKXQuY2FsbChuLGVbaV0saSk7ZWxzZSBmb3IoaT0wO2k8YTtpKyspdC5jYWxsKG4sZVtpXSxpKX1lbHNlIGlmKEcoZSkpZm9yKG89T2JqZWN0LmtleXMoZSksYT1vLmxlbmd0aCxpPTA7aTxhO2krKyl0LmNhbGwobixlW29baV1dLG9baV0pfWZ1bmN0aW9uICRhKGUsdCl7bGV0IG4scixpLGE7aWYoIWV8fCF0fHxlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKWlmKGk9ZVtuXSxhPXRbbl0saS5kYXRhc2V0SW5kZXghPT1hLmRhdGFzZXRJbmRleHx8aS5pbmRleCE9PWEuaW5kZXgpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZW8oZSl7aWYoVyhlKSlyZXR1cm4gZS5tYXAoZW8pO2lmKEcoZSkpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksbj1PYmplY3Qua2V5cyhlKSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdFtuW2ldXT1lbyhlW25baV1dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiB0byhlKXtyZXR1cm5bYF9fcHJvdG9fX2AsYHByb3RvdHlwZWAsYGNvbnN0cnVjdG9yYF0uaW5kZXhPZihlKT09PS0xfWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKCF0byhlKSlyZXR1cm47bGV0IGk9dFtlXSxhPW5bZV07RyhpKSYmRyhhKT9ybyhpLGEscik6dFtlXT1lbyhhKX1mdW5jdGlvbiBybyhlLHQsbil7bGV0IHI9Vyh0KT90Olt0XSxpPXIubGVuZ3RoO2lmKCFHKGUpKXJldHVybiBlO258fD17fTtsZXQgYT1uLm1lcmdlcnx8bm8sbztmb3IobGV0IHQ9MDt0PGk7Kyt0KXtpZihvPXJbdF0sIUcobykpY29udGludWU7bGV0IGk9T2JqZWN0LmtleXMobyk7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7Kyt0KWEoaVt0XSxlLG8sbil9cmV0dXJuIGV9ZnVuY3Rpb24gaW8oZSx0KXtyZXR1cm4gcm8oZSx0LHttZXJnZXI6YW99KX1mdW5jdGlvbiBhbyhlLHQsbil7aWYoIXRvKGUpKXJldHVybjtsZXQgcj10W2VdLGk9bltlXTtHKHIpJiZHKGkpP2lvKHIsaSk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl8fCh0W2VdPWVvKGkpKX12YXIgb289eyIiOmU9PmUseDplPT5lLngseTplPT5lLnl9O2Z1bmN0aW9uIHNvKGUpe2xldCB0PWUuc3BsaXQoYC5gKSxuPVtdLHI9YGA7Zm9yKGxldCBlIG9mIHQpcis9ZSxyLmVuZHNXaXRoKGBcXGApP3I9ci5zbGljZSgwLC0xKStgLmA6KG4ucHVzaChyKSxyPWBgKTtyZXR1cm4gbn1mdW5jdGlvbiBjbyhlKXtsZXQgdD1zbyhlKTtyZXR1cm4gZT0+e2ZvcihsZXQgbiBvZiB0KXtpZihuPT09YGApYnJlYWs7ZSYmPWVbbl19cmV0dXJuIGV9fWZ1bmN0aW9uIGxvKGUsdCl7cmV0dXJuKG9vW3RdfHwob29bdF09Y28odCkpKShlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfXZhciBmbz1lPT5lIT09dm9pZCAwLHBvPWU9PnR5cGVvZiBlPT1gZnVuY3Rpb25gLG1vPShlLHQpPT57aWYoZS5zaXplIT09dC5zaXplKXJldHVybiExO2ZvcihsZXQgbiBvZiBlKWlmKCF0LmhhcyhuKSlyZXR1cm4hMTtyZXR1cm4hMH07ZnVuY3Rpb24gaG8oZSl7cmV0dXJuIGUudHlwZT09PWBtb3VzZXVwYHx8ZS50eXBlPT09YGNsaWNrYHx8ZS50eXBlPT09YGNvbnRleHRtZW51YH12YXIgWD1NYXRoLlBJLGdvPTIqWDtnbytYO3ZhciBfbz0xLzAsdm89WC8xODAseW89WC8yLGJvPVgvNCx4bz1YKjIvMyxTbz1NYXRoLmxvZzEwLENvPU1hdGguc2lnbjtmdW5jdGlvbiB3byhlLHQsbil7cmV0dXJuIE1hdGguYWJzKGUtdCk8bn1mdW5jdGlvbiBUbyhlKXtsZXQgdD1NYXRoLnJvdW5kKGUpO2U9d28oZSx0LGUvMWUzKT90OmU7bGV0IG49MTAqKk1hdGguZmxvb3IoU28oZSkpLHI9ZS9uO3JldHVybihyPD0xPzE6cjw9Mj8yOnI8PTU/NToxMCkqbn1mdW5jdGlvbiBFbyhlKXtsZXQgdD1bXSxuPU1hdGguc3FydChlKSxyO2ZvcihyPTE7cjxuO3IrKyllJXI9PT0wJiYodC5wdXNoKHIpLHQucHVzaChlL3IpKTtyZXR1cm4gbj09PShufDApJiZ0LnB1c2gobiksdC5zb3J0KChlLHQpPT5lLXQpLnBvcCgpLHR9ZnVuY3Rpb24gRG8oZSl7cmV0dXJuIHR5cGVvZiBlPT1gc3ltYm9sYHx8dHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJiEoU3ltYm9sLnRvUHJpbWl0aXZlIGluIGV8fGB0b1N0cmluZ2BpbiBlfHxgdmFsdWVPZmBpbiBlKX1mdW5jdGlvbiBPbyhlKXtyZXR1cm4hRG8oZSkmJiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24ga28oZSx0KXtsZXQgbj1NYXRoLnJvdW5kKGUpO3JldHVybiBuLXQ8PWUmJm4rdD49ZX1mdW5jdGlvbiBBbyhlLHQsbil7bGV0IHIsaSxhO2ZvcihyPTAsaT1lLmxlbmd0aDtyPGk7cisrKWE9ZVtyXVtuXSxpc05hTihhKXx8KHQubWluPU1hdGgubWluKHQubWluLGEpLHQubWF4PU1hdGgubWF4KHQubWF4LGEpKX1mdW5jdGlvbiBqbyhlKXtyZXR1cm4gWC8xODAqZX1mdW5jdGlvbiBNbyhlKXtyZXR1cm4gMTgwL1gqZX1mdW5jdGlvbiBObyhlKXtpZighSyhlKSlyZXR1cm47bGV0IHQ9MSxuPTA7Zm9yKDtNYXRoLnJvdW5kKGUqdCkvdCE9PWU7KXQqPTEwLG4rKztyZXR1cm4gbn1mdW5jdGlvbiBQbyhlLHQpe2xldCBuPXQueC1lLngscj10LnktZS55LGk9TWF0aC5zcXJ0KG4qbityKnIpLGE9TWF0aC5hdGFuMihyLG4pO3JldHVybiBhPC0uNSpYJiYoYSs9Z28pLHthbmdsZTphLGRpc3RhbmNlOml9fWZ1bmN0aW9uIEZvKGUsdCl7cmV0dXJuIE1hdGguc3FydCgodC54LWUueCkqKjIrKHQueS1lLnkpKioyKX1mdW5jdGlvbiBJbyhlKXtyZXR1cm4oZSVnbytnbyklZ299ZnVuY3Rpb24gTG8oZSx0LG4scil7bGV0IGk9SW8oZSksYT1Jbyh0KSxvPUlvKG4pLHM9SW8oYS1pKSxjPUlvKG8taSksbD1JbyhpLWEpLHU9SW8oaS1vKTtyZXR1cm4gaT09PWF8fGk9PT1vfHxyJiZhPT09b3x8cz5jJiZsPHV9ZnVuY3Rpb24gUm8oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfWZ1bmN0aW9uIHpvKGUpe3JldHVybiBSbyhlLC0zMjc2OCwzMjc2Nyl9ZnVuY3Rpb24gQm8oZSx0LG4scj0xZS02KXtyZXR1cm4gZT49TWF0aC5taW4odCxuKS1yJiZlPD1NYXRoLm1heCh0LG4pK3J9ZnVuY3Rpb24gVm8oZSx0LG4pe258fD0obj0+ZVtuXTx0KTtsZXQgcj1lLmxlbmd0aC0xLGk9MCxhO2Zvcig7ci1pPjE7KWE9aStyPj4xLG4oYSk/aT1hOnI9YTtyZXR1cm57bG86aSxoaTpyfX12YXIgSG89KGUsdCxuLHIpPT5WbyhlLG4scj9yPT57bGV0IGk9ZVtyXVt0XTtyZXR1cm4gaTxufHxpPT09biYmZVtyKzFdW3RdPT09bn06cj0+ZVtyXVt0XTxuKSxVbz0oZSx0LG4pPT5WbyhlLG4scj0+ZVtyXVt0XT49bik7ZnVuY3Rpb24gV28oZSx0LG4pe2xldCByPTAsaT1lLmxlbmd0aDtmb3IoO3I8aSYmZVtyXTx0OylyKys7Zm9yKDtpPnImJmVbaS0xXT5uOylpLS07cmV0dXJuIHI+MHx8aTxlLmxlbmd0aD9lLnNsaWNlKHIsaSk6ZX12YXIgR289W2BwdXNoYCxgcG9wYCxgc2hpZnRgLGBzcGxpY2VgLGB1bnNoaWZ0YF07ZnVuY3Rpb24gS28oZSx0KXtpZihlLl9jaGFydGpzKXtlLl9jaGFydGpzLmxpc3RlbmVycy5wdXNoKHQpO3JldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX2NoYXJ0anMiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTp7bGlzdGVuZXJzOlt0XX19KSxHby5mb3JFYWNoKHQ9PntsZXQgbj1gX29uRGF0YWArdW8odCkscj1lW3RdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlKC4uLnQpe2xldCBpPXIuYXBwbHkodGhpcyx0KTtyZXR1cm4gZS5fY2hhcnRqcy5saXN0ZW5lcnMuZm9yRWFjaChlPT57dHlwZW9mIGVbbl09PWBmdW5jdGlvbmAmJmVbbl0oLi4udCl9KSxpfX0pfSl9ZnVuY3Rpb24gcW8oZSx0KXtsZXQgbj1lLl9jaGFydGpzO2lmKCFuKXJldHVybjtsZXQgcj1uLmxpc3RlbmVycyxpPXIuaW5kZXhPZih0KTtpIT09LTEmJnIuc3BsaWNlKGksMSksIShyLmxlbmd0aD4wKSYmKEdvLmZvckVhY2godD0+e2RlbGV0ZSBlW3RdfSksZGVsZXRlIGUuX2NoYXJ0anMpfWZ1bmN0aW9uIEpvKGUpe2xldCB0PW5ldyBTZXQoZSk7cmV0dXJuIHQuc2l6ZT09PWUubGVuZ3RoP2U6QXJyYXkuZnJvbSh0KX12YXIgWW89ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz5gdWA/ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX06d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZX0oKTtmdW5jdGlvbiBYbyhlLHQpe2xldCBuPVtdLHI9ITE7cmV0dXJuIGZ1bmN0aW9uKC4uLmkpe249aSxyfHwocj0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3I9ITEsZS5hcHBseSh0LG4pfSkpfX1mdW5jdGlvbiBabyhlLHQpe2xldCBuO3JldHVybiBmdW5jdGlvbiguLi5yKXtyZXR1cm4gdD8oY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChlLHQscikpOmUuYXBwbHkodGhpcyxyKSx0fX12YXIgUW89ZT0+ZT09PWBzdGFydGA/YGxlZnRgOmU9PT1gZW5kYD9gcmlnaHRgOmBjZW50ZXJgLCRvPShlLHQsbik9PmU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246KHQrbikvMixlcz0oZSx0LG4scik9PmU9PT0ocj9gbGVmdGA6YHJpZ2h0YCk/bjplPT09YGNlbnRlcmA/KHQrbikvMjp0LHRzPWU9PmU9PT0wfHxlPT09MSxucz0oZSx0LG4pPT4tKDIqKigxMCotLWUpKk1hdGguc2luKChlLXQpKmdvL24pKSxycz0oZSx0LG4pPT4yKiooLTEwKmUpKk1hdGguc2luKChlLXQpKmdvL24pKzEsaXM9e2xpbmVhcjplPT5lLGVhc2VJblF1YWQ6ZT0+ZSplLGVhc2VPdXRRdWFkOmU9Pi1lKihlLTIpLGVhc2VJbk91dFF1YWQ6ZT0+KGUvPS41KTwxPy41KmUqZTotLjUqKC0tZSooZS0yKS0xKSxlYXNlSW5DdWJpYzplPT5lKmUqZSxlYXNlT3V0Q3ViaWM6ZT0+LS1lKmUqZSsxLGVhc2VJbk91dEN1YmljOmU9PihlLz0uNSk8MT8uNSplKmUqZTouNSooKGUtPTIpKmUqZSsyKSxlYXNlSW5RdWFydDplPT5lKmUqZSplLGVhc2VPdXRRdWFydDplPT4tKC0tZSplKmUqZS0xKSxlYXNlSW5PdXRRdWFydDplPT4oZS89LjUpPDE/LjUqZSplKmUqZTotLjUqKChlLT0yKSplKmUqZS0yKSxlYXNlSW5RdWludDplPT5lKmUqZSplKmUsZWFzZU91dFF1aW50OmU9Pi0tZSplKmUqZSplKzEsZWFzZUluT3V0UXVpbnQ6ZT0+KGUvPS41KTwxPy41KmUqZSplKmUqZTouNSooKGUtPTIpKmUqZSplKmUrMiksZWFzZUluU2luZTplPT4tTWF0aC5jb3MoZSp5bykrMSxlYXNlT3V0U2luZTplPT5NYXRoLnNpbihlKnlvKSxlYXNlSW5PdXRTaW5lOmU9Pi0uNSooTWF0aC5jb3MoWCplKS0xKSxlYXNlSW5FeHBvOmU9PmU9PT0wPzA6MioqKDEwKihlLTEpKSxlYXNlT3V0RXhwbzplPT5lPT09MT8xOi0oMioqKC0xMCplKSkrMSxlYXNlSW5PdXRFeHBvOmU9PnRzKGUpP2U6ZTwuNT8uNSoyKiooMTAqKGUqMi0xKSk6LjUqKC0oMioqKC0xMCooZSoyLTEpKSkrMiksZWFzZUluQ2lyYzplPT5lPj0xP2U6LShNYXRoLnNxcnQoMS1lKmUpLTEpLGVhc2VPdXRDaXJjOmU9Pk1hdGguc3FydCgxLSAtLWUqZSksZWFzZUluT3V0Q2lyYzplPT4oZS89LjUpPDE/LS41KihNYXRoLnNxcnQoMS1lKmUpLTEpOi41KihNYXRoLnNxcnQoMS0oZS09MikqZSkrMSksZWFzZUluRWxhc3RpYzplPT50cyhlKT9lOm5zKGUsLjA3NSwuMyksZWFzZU91dEVsYXN0aWM6ZT0+dHMoZSk/ZTpycyhlLC4wNzUsLjMpLGVhc2VJbk91dEVsYXN0aWMoZSl7bGV0IHQ9LjExMjUsbj0uNDU7cmV0dXJuIHRzKGUpP2U6ZTwuNT8uNSpucyhlKjIsdCxuKTouNSsuNSpycyhlKjItMSx0LG4pfSxlYXNlSW5CYWNrKGUpe3JldHVybiBlKmUqKDIuNzAxNTgqZS0xLjcwMTU4KX0sZWFzZU91dEJhY2soZSl7cmV0dXJuLS1lKmUqKDIuNzAxNTgqZSsxLjcwMTU4KSsxfSxlYXNlSW5PdXRCYWNrKGUpe2xldCB0PTEuNzAxNTg7cmV0dXJuKGUvPS41KTwxPy41KihlKmUqKCgodCo9MS41MjUpKzEpKmUtdCkpOi41KigoZS09MikqZSooKCh0Kj0xLjUyNSkrMSkqZSt0KSsyKX0sZWFzZUluQm91bmNlOmU9PjEtaXMuZWFzZU91dEJvdW5jZSgxLWUpLGVhc2VPdXRCb3VuY2UoZSl7bGV0IHQ9Ny41NjI1LG49Mi43NTtyZXR1cm4gZTwxL24/dCplKmU6ZTwyL24/dCooZS09MS41L24pKmUrLjc1OmU8Mi41L24/dCooZS09Mi4yNS9uKSplKy45Mzc1OnQqKGUtPTIuNjI1L24pKmUrLjk4NDM3NX0sZWFzZUluT3V0Qm91bmNlOmU9PmU8LjU/aXMuZWFzZUluQm91bmNlKGUqMikqLjU6aXMuZWFzZU91dEJvdW5jZShlKjItMSkqLjUrLjV9O2Z1bmN0aW9uIGFzKGUpe2lmKGUmJnR5cGVvZiBlPT1gb2JqZWN0YCl7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PT09YFtvYmplY3QgQ2FudmFzUGF0dGVybl1gfHx0PT09YFtvYmplY3QgQ2FudmFzR3JhZGllbnRdYH1yZXR1cm4hMX1mdW5jdGlvbiBvcyhlKXtyZXR1cm4gYXMoZSk/ZTpuZXcgSmEoZSl9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGFzKGUpP2U6bmV3IEphKGUpLnNhdHVyYXRlKC41KS5kYXJrZW4oLjEpLmhleFN0cmluZygpfXZhciBjcz1bYHhgLGB5YCxgYm9yZGVyV2lkdGhgLGByYWRpdXNgLGB0ZW5zaW9uYF0sbHM9W2Bjb2xvcmAsYGJvcmRlckNvbG9yYCxgYmFja2dyb3VuZENvbG9yYF07ZnVuY3Rpb24gdXMoZSl7ZS5zZXQoYGFuaW1hdGlvbmAse2RlbGF5OnZvaWQgMCxkdXJhdGlvbjoxZTMsZWFzaW5nOmBlYXNlT3V0UXVhcnRgLGZuOnZvaWQgMCxmcm9tOnZvaWQgMCxsb29wOnZvaWQgMCx0bzp2b2lkIDAsdHlwZTp2b2lkIDB9KSxlLmRlc2NyaWJlKGBhbmltYXRpb25gLHtfZmFsbGJhY2s6ITEsX2luZGV4YWJsZTohMSxfc2NyaXB0YWJsZTplPT5lIT09YG9uUHJvZ3Jlc3NgJiZlIT09YG9uQ29tcGxldGVgJiZlIT09YGZuYH0pLGUuc2V0KGBhbmltYXRpb25zYCx7Y29sb3JzOnt0eXBlOmBjb2xvcmAscHJvcGVydGllczpsc30sbnVtYmVyczp7dHlwZTpgbnVtYmVyYCxwcm9wZXJ0aWVzOmNzfX0pLGUuZGVzY3JpYmUoYGFuaW1hdGlvbnNgLHtfZmFsbGJhY2s6YGFuaW1hdGlvbmB9KSxlLnNldChgdHJhbnNpdGlvbnNgLHthY3RpdmU6e2FuaW1hdGlvbjp7ZHVyYXRpb246NDAwfX0scmVzaXplOnthbmltYXRpb246e2R1cmF0aW9uOjB9fSxzaG93OnthbmltYXRpb25zOntjb2xvcnM6e2Zyb206YHRyYW5zcGFyZW50YH0sdmlzaWJsZTp7dHlwZTpgYm9vbGVhbmAsZHVyYXRpb246MH19fSxoaWRlOnthbmltYXRpb25zOntjb2xvcnM6e3RvOmB0cmFuc3BhcmVudGB9LHZpc2libGU6e3R5cGU6YGJvb2xlYW5gLGVhc2luZzpgbGluZWFyYCxmbjplPT5lfDB9fX19KX1mdW5jdGlvbiBkcyhlKXtlLnNldChgbGF5b3V0YCx7YXV0b1BhZGRpbmc6ITAscGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fSl9dmFyIGZzPW5ldyBNYXA7ZnVuY3Rpb24gcHMoZSx0KXt0fHw9e307bGV0IG49ZStKU09OLnN0cmluZ2lmeSh0KSxyPWZzLmdldChuKTtyZXR1cm4gcnx8KHI9bmV3IEludGwuTnVtYmVyRm9ybWF0KGUsdCksZnMuc2V0KG4scikpLHJ9ZnVuY3Rpb24gbXMoZSx0LG4pe3JldHVybiBwcyh0LG4pLmZvcm1hdChlKX12YXIgaHM9e3ZhbHVlcyhlKXtyZXR1cm4gVyhlKT9lOmBgK2V9LG51bWVyaWMoZSx0LG4pe2lmKGU9PT0wKXJldHVybmAwYDtsZXQgcj10aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLGksYT1lO2lmKG4ubGVuZ3RoPjEpe2xldCB0PU1hdGgubWF4KE1hdGguYWJzKG5bMF0udmFsdWUpLE1hdGguYWJzKG5bbi5sZW5ndGgtMV0udmFsdWUpKTsodDwxZS00fHx0PjB4MzhkN2VhNGM2ODAwMCkmJihpPWBzY2llbnRpZmljYCksYT1ncyhlLG4pfWxldCBvPVNvKE1hdGguYWJzKGEpKSxzPWlzTmFOKG8pPzE6TWF0aC5tYXgoTWF0aC5taW4oLTEqTWF0aC5mbG9vcihvKSwyMCksMCksYz17bm90YXRpb246aSxtaW5pbXVtRnJhY3Rpb25EaWdpdHM6cyxtYXhpbXVtRnJhY3Rpb25EaWdpdHM6c307cmV0dXJuIE9iamVjdC5hc3NpZ24oYyx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KSxtcyhlLHIsYyl9LGxvZ2FyaXRobWljKGUsdCxuKXtpZihlPT09MClyZXR1cm5gMGA7bGV0IHI9blt0XS5zaWduaWZpY2FuZHx8ZS8xMCoqTWF0aC5mbG9vcihTbyhlKSk7cmV0dXJuWzEsMiwzLDUsMTAsMTVdLmluY2x1ZGVzKHIpfHx0Pi44Km4ubGVuZ3RoP2hzLm51bWVyaWMuY2FsbCh0aGlzLGUsdCxuKTpgYH19O2Z1bmN0aW9uIGdzKGUsdCl7bGV0IG49dC5sZW5ndGg+Mz90WzJdLnZhbHVlLXRbMV0udmFsdWU6dFsxXS52YWx1ZS10WzBdLnZhbHVlO3JldHVybiBNYXRoLmFicyhuKT49MSYmZSE9PU1hdGguZmxvb3IoZSkmJihuPWUtTWF0aC5mbG9vcihlKSksbn12YXIgX3M9e2Zvcm1hdHRlcnM6aHN9O2Z1bmN0aW9uIHZzKGUpe2Uuc2V0KGBzY2FsZWAse2Rpc3BsYXk6ITAsb2Zmc2V0OiExLHJldmVyc2U6ITEsYmVnaW5BdFplcm86ITEsYm91bmRzOmB0aWNrc2AsY2xpcDohMCxncmFjZTowLGdyaWQ6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsZHJhd09uQ2hhcnRBcmVhOiEwLGRyYXdUaWNrczohMCx0aWNrTGVuZ3RoOjgsdGlja1dpZHRoOihlLHQpPT50LmxpbmVXaWR0aCx0aWNrQ29sb3I6KGUsdCk9PnQuY29sb3Isb2Zmc2V0OiExfSxib3JkZXI6e2Rpc3BsYXk6ITAsZGFzaDpbXSxkYXNoT2Zmc2V0OjAsd2lkdGg6MX0sdGl0bGU6e2Rpc3BsYXk6ITEsdGV4dDpgYCxwYWRkaW5nOnt0b3A6NCxib3R0b206NH19LHRpY2tzOnttaW5Sb3RhdGlvbjowLG1heFJvdGF0aW9uOjUwLG1pcnJvcjohMSx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0U3Ryb2tlQ29sb3I6YGAscGFkZGluZzozLGRpc3BsYXk6ITAsYXV0b1NraXA6ITAsYXV0b1NraXBQYWRkaW5nOjMsbGFiZWxPZmZzZXQ6MCxjYWxsYmFjazpfcy5mb3JtYXR0ZXJzLnZhbHVlcyxtaW5vcjp7fSxtYWpvcjp7fSxhbGlnbjpgY2VudGVyYCxjcm9zc0FsaWduOmBuZWFyYCxzaG93TGFiZWxCYWNrZHJvcDohMSxiYWNrZHJvcENvbG9yOmByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpYCxiYWNrZHJvcFBhZGRpbmc6Mn19KSxlLnJvdXRlKGBzY2FsZS50aWNrc2AsYGNvbG9yYCxgYCxgY29sb3JgKSxlLnJvdXRlKGBzY2FsZS5ncmlkYCxgY29sb3JgLGBgLGBib3JkZXJDb2xvcmApLGUucm91dGUoYHNjYWxlLmJvcmRlcmAsYGNvbG9yYCxgYCxgYm9yZGVyQ29sb3JgKSxlLnJvdXRlKGBzY2FsZS50aXRsZWAsYGNvbG9yYCxgYCxgY29sb3JgKSxlLmRlc2NyaWJlKGBzY2FsZWAse19mYWxsYmFjazohMSxfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBiZWZvcmVgKSYmIWUuc3RhcnRzV2l0aChgYWZ0ZXJgKSYmZSE9PWBjYWxsYmFja2AmJmUhPT1gcGFyc2VyYCxfaW5kZXhhYmxlOmU9PmUhPT1gYm9yZGVyRGFzaGAmJmUhPT1gdGlja0JvcmRlckRhc2hgJiZlIT09YGRhc2hgfSksZS5kZXNjcmliZShgc2NhbGVzYCx7X2ZhbGxiYWNrOmBzY2FsZWB9KSxlLmRlc2NyaWJlKGBzY2FsZS50aWNrc2Ase19zY3JpcHRhYmxlOmU9PmUhPT1gYmFja2Ryb3BQYWRkaW5nYCYmZSE9PWBjYWxsYmFja2AsX2luZGV4YWJsZTplPT5lIT09YGJhY2tkcm9wUGFkZGluZ2B9KX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKSxicz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHhzKGUsdCl7aWYoIXQpcmV0dXJuIGU7bGV0IG49dC5zcGxpdChgLmApO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dDxyOysrdCl7bGV0IHI9blt0XTtlPWVbcl18fChlW3JdPU9iamVjdC5jcmVhdGUobnVsbCkpfXJldHVybiBlfWZ1bmN0aW9uIFNzKGUsdCxuKXtyZXR1cm4gdHlwZW9mIHQ9PWBzdHJpbmdgP3JvKHhzKGUsdCksbik6cm8oeHMoZSxgYCksdCl9dmFyIFo9bmV3IGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5hbmltYXRpb249dm9pZCAwLHRoaXMuYmFja2dyb3VuZENvbG9yPWByZ2JhKDAsMCwwLDAuMSlgLHRoaXMuYm9yZGVyQ29sb3I9YHJnYmEoMCwwLDAsMC4xKWAsdGhpcy5jb2xvcj1gIzY2NmAsdGhpcy5kYXRhc2V0cz17fSx0aGlzLmRldmljZVBpeGVsUmF0aW89ZT0+ZS5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCksdGhpcy5lbGVtZW50cz17fSx0aGlzLmV2ZW50cz1bYG1vdXNlbW92ZWAsYG1vdXNlb3V0YCxgY2xpY2tgLGB0b3VjaHN0YXJ0YCxgdG91Y2htb3ZlYF0sdGhpcy5mb250PXtmYW1pbHk6YCdIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmYCxzaXplOjEyLHN0eWxlOmBub3JtYWxgLGxpbmVIZWlnaHQ6MS4yLHdlaWdodDpudWxsfSx0aGlzLmhvdmVyPXt9LHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3I9KGUsdCk9PnNzKHQuYmFja2dyb3VuZENvbG9yKSx0aGlzLmhvdmVyQm9yZGVyQ29sb3I9KGUsdCk9PnNzKHQuYm9yZGVyQ29sb3IpLHRoaXMuaG92ZXJDb2xvcj0oZSx0KT0+c3ModC5jb2xvciksdGhpcy5pbmRleEF4aXM9YHhgLHRoaXMuaW50ZXJhY3Rpb249e21vZGU6YG5lYXJlc3RgLGludGVyc2VjdDohMCxpbmNsdWRlSW52aXNpYmxlOiExfSx0aGlzLm1haW50YWluQXNwZWN0UmF0aW89ITAsdGhpcy5vbkhvdmVyPW51bGwsdGhpcy5vbkNsaWNrPW51bGwsdGhpcy5wYXJzaW5nPSEwLHRoaXMucGx1Z2lucz17fSx0aGlzLnJlc3BvbnNpdmU9ITAsdGhpcy5zY2FsZT12b2lkIDAsdGhpcy5zY2FsZXM9e30sdGhpcy5zaG93TGluZT0hMCx0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wPSEwLHRoaXMuZGVzY3JpYmUoZSksdGhpcy5hcHBseSh0KX1zZXQoZSx0KXtyZXR1cm4gU3ModGhpcyxlLHQpfWdldChlKXtyZXR1cm4geHModGhpcyxlKX1kZXNjcmliZShlLHQpe3JldHVybiBTcyhicyxlLHQpfW92ZXJyaWRlKGUsdCl7cmV0dXJuIFNzKHlzLGUsdCl9cm91dGUoZSx0LG4scil7bGV0IGk9eHModGhpcyxlKSxhPXhzKHRoaXMsbiksbz1gX2ArdDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLHtbb106e3ZhbHVlOmlbdF0sd3JpdGFibGU6ITB9LFt0XTp7ZW51bWVyYWJsZTohMCxnZXQoKXtsZXQgZT10aGlzW29dLHQ9YVtyXTtyZXR1cm4gRyhlKT9PYmplY3QuYXNzaWduKHt9LHQsZSk6cShlLHQpfSxzZXQoZSl7dGhpc1tvXT1lfX19KX1hcHBseShlKXtlLmZvckVhY2goZT0+ZSh0aGlzKSl9fSh7X3NjcmlwdGFibGU6ZT0+IWUuc3RhcnRzV2l0aChgb25gKSxfaW5kZXhhYmxlOmU9PmUhPT1gZXZlbnRzYCxob3Zlcjp7X2ZhbGxiYWNrOmBpbnRlcmFjdGlvbmB9LGludGVyYWN0aW9uOntfc2NyaXB0YWJsZTohMSxfaW5kZXhhYmxlOiExfX0sW3VzLGRzLHZzXSk7ZnVuY3Rpb24gQ3MoZSl7cmV0dXJuIWV8fFUoZS5zaXplKXx8VShlLmZhbWlseSk/bnVsbDooZS5zdHlsZT9lLnN0eWxlK2AgYDpgYCkrKGUud2VpZ2h0P2Uud2VpZ2h0K2AgYDpgYCkrZS5zaXplK2BweCBgK2UuZmFtaWx5fWZ1bmN0aW9uIHdzKGUsdCxuLHIsaSl7bGV0IGE9dFtpXTtyZXR1cm4gYXx8KGE9dFtpXT1lLm1lYXN1cmVUZXh0KGkpLndpZHRoLG4ucHVzaChpKSksYT5yJiYocj1hKSxyfWZ1bmN0aW9uIFRzKGUsdCxuLHIpe3J8fD17fTtsZXQgaT1yLmRhdGE9ci5kYXRhfHx7fSxhPXIuZ2FyYmFnZUNvbGxlY3Q9ci5nYXJiYWdlQ29sbGVjdHx8W107ci5mb250IT09dCYmKGk9ci5kYXRhPXt9LGE9ci5nYXJiYWdlQ29sbGVjdD1bXSxyLmZvbnQ9dCksZS5zYXZlKCksZS5mb250PXQ7bGV0IG89MCxzPW4ubGVuZ3RoLGMsbCx1LGQsZjtmb3IoYz0wO2M8cztjKyspaWYoZD1uW2NdLGQhPW51bGwmJiFXKGQpKW89d3MoZSxpLGEsbyxkKTtlbHNlIGlmKFcoZCkpZm9yKGw9MCx1PWQubGVuZ3RoO2w8dTtsKyspZj1kW2xdLGYhPW51bGwmJiFXKGYpJiYobz13cyhlLGksYSxvLGYpKTtlLnJlc3RvcmUoKTtsZXQgcD1hLmxlbmd0aC8yO2lmKHA+bi5sZW5ndGgpe2ZvcihjPTA7YzxwO2MrKylkZWxldGUgaVthW2NdXTthLnNwbGljZSgwLHApfXJldHVybiBvfWZ1bmN0aW9uIEVzKGUsdCxuKXtsZXQgcj1lLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvLGk9bj09PTA/MDpNYXRoLm1heChuLzIsLjUpO3JldHVybiBNYXRoLnJvdW5kKCh0LWkpKnIpL3IraX1mdW5jdGlvbiBEcyhlLHQpeyF0JiYhZXx8KHR8fD1lLmdldENvbnRleHQoYDJkYCksdC5zYXZlKCksdC5yZXNldFRyYW5zZm9ybSgpLHQuY2xlYXJSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0LnJlc3RvcmUoKSl9ZnVuY3Rpb24gT3MoZSx0LG4scil7a3MoZSx0LG4scixudWxsKX1mdW5jdGlvbiBrcyhlLHQsbixyLGkpe2xldCBhLG8scyxjLGwsdSxkLGYscD10LnBvaW50U3R5bGUsbT10LnJvdGF0aW9uLGg9dC5yYWRpdXMsZz0obXx8MCkqdm87aWYocCYmdHlwZW9mIHA9PWBvYmplY3RgJiYoYT1wLnRvU3RyaW5nKCksYT09PWBbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdYHx8YT09PWBbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XWApKXtlLnNhdmUoKSxlLnRyYW5zbGF0ZShuLHIpLGUucm90YXRlKGcpLGUuZHJhd0ltYWdlKHAsLXAud2lkdGgvMiwtcC5oZWlnaHQvMixwLndpZHRoLHAuaGVpZ2h0KSxlLnJlc3RvcmUoKTtyZXR1cm59aWYoIShpc05hTihoKXx8aDw9MCkpe3N3aXRjaChlLmJlZ2luUGF0aCgpLHApe2RlZmF1bHQ6aT9lLmVsbGlwc2UobixyLGkvMixoLDAsMCxnbyk6ZS5hcmMobixyLGgsMCxnbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHRyaWFuZ2xlYDp1PWk/aS8yOmgsZS5tb3ZlVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZys9eG8sZS5saW5lVG8obitNYXRoLnNpbihnKSp1LHItTWF0aC5jb3MoZykqaCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RSb3VuZGVkYDpsPWgqLjUxNixjPWgtbCxvPU1hdGguY29zKGcrYm8pKmMsZD1NYXRoLmNvcyhnK2JvKSooaT9pLzItbDpjKSxzPU1hdGguc2luKGcrYm8pKmMsZj1NYXRoLnNpbihnK2JvKSooaT9pLzItbDpjKSxlLmFyYyhuLWQsci1zLGwsZy1YLGcteW8pLGUuYXJjKG4rZixyLW8sbCxnLXlvLGcpLGUuYXJjKG4rZCxyK3MsbCxnLGcreW8pLGUuYXJjKG4tZixyK28sbCxnK3lvLGcrWCksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYHJlY3RgOmlmKCFtKXtjPU1hdGguU1FSVDFfMipoLHU9aT9pLzI6YyxlLnJlY3Qobi11LHItYywyKnUsMipjKTticmVha31nKz1ibztjYXNlYHJlY3RSb3RgOmQ9TWF0aC5jb3MoZykqKGk/aS8yOmgpLG89TWF0aC5jb3MoZykqaCxzPU1hdGguc2luKGcpKmgsZj1NYXRoLnNpbihnKSooaT9pLzI6aCksZS5tb3ZlVG8obi1kLHItcyksZS5saW5lVG8obitmLHItbyksZS5saW5lVG8obitkLHIrcyksZS5saW5lVG8obi1mLHIrbyksZS5jbG9zZVBhdGgoKTticmVhaztjYXNlYGNyb3NzUm90YDpnKz1ibztjYXNlYGNyb3NzYDpkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2Vgc3RhcmA6ZD1NYXRoLmNvcyhnKSooaT9pLzI6aCksbz1NYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxmPU1hdGguc2luKGcpKihpP2kvMjpoKSxlLm1vdmVUbyhuLWQsci1zKSxlLmxpbmVUbyhuK2QscitzKSxlLm1vdmVUbyhuK2Ysci1vKSxlLmxpbmVUbyhuLWYscitvKSxnKz1ibyxkPU1hdGguY29zKGcpKihpP2kvMjpoKSxvPU1hdGguY29zKGcpKmgscz1NYXRoLnNpbihnKSpoLGY9TWF0aC5zaW4oZykqKGk/aS8yOmgpLGUubW92ZVRvKG4tZCxyLXMpLGUubGluZVRvKG4rZCxyK3MpLGUubW92ZVRvKG4rZixyLW8pLGUubGluZVRvKG4tZixyK28pO2JyZWFrO2Nhc2VgbGluZWA6bz1pP2kvMjpNYXRoLmNvcyhnKSpoLHM9TWF0aC5zaW4oZykqaCxlLm1vdmVUbyhuLW8sci1zKSxlLmxpbmVUbyhuK28scitzKTticmVhaztjYXNlYGRhc2hgOmUubW92ZVRvKG4sciksZS5saW5lVG8obitNYXRoLmNvcyhnKSooaT9pLzI6aCkscitNYXRoLnNpbihnKSpoKTticmVhaztjYXNlITE6ZS5jbG9zZVBhdGgoKX1lLmZpbGwoKSx0LmJvcmRlcldpZHRoPjAmJmUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEFzKGUsdCxuKXtyZXR1cm4gbnx8PS41LCF0fHxlJiZlLng+dC5sZWZ0LW4mJmUueDx0LnJpZ2h0K24mJmUueT50LnRvcC1uJiZlLnk8dC5ib3R0b20rbn1mdW5jdGlvbiBqcyhlLHQpe2Uuc2F2ZSgpLGUuYmVnaW5QYXRoKCksZS5yZWN0KHQubGVmdCx0LnRvcCx0LnJpZ2h0LXQubGVmdCx0LmJvdHRvbS10LnRvcCksZS5jbGlwKCl9ZnVuY3Rpb24gTXMoZSl7ZS5yZXN0b3JlKCl9ZnVuY3Rpb24gTnMoZSx0KXt0LnRyYW5zbGF0aW9uJiZlLnRyYW5zbGF0ZSh0LnRyYW5zbGF0aW9uWzBdLHQudHJhbnNsYXRpb25bMV0pLFUodC5yb3RhdGlvbil8fGUucm90YXRlKHQucm90YXRpb24pLHQuY29sb3ImJihlLmZpbGxTdHlsZT10LmNvbG9yKSx0LnRleHRBbGlnbiYmKGUudGV4dEFsaWduPXQudGV4dEFsaWduKSx0LnRleHRCYXNlbGluZSYmKGUudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lKX1mdW5jdGlvbiBQcyhlLHQsbixyLGkpe2lmKGkuc3RyaWtldGhyb3VnaHx8aS51bmRlcmxpbmUpe2xldCBhPWUubWVhc3VyZVRleHQociksbz10LWEuYWN0dWFsQm91bmRpbmdCb3hMZWZ0LHM9dCthLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQsYz1uLWEuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsbD1uK2EuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50LHU9aS5zdHJpa2V0aHJvdWdoPyhjK2wpLzI6bDtlLnN0cm9rZVN0eWxlPWUuZmlsbFN0eWxlLGUuYmVnaW5QYXRoKCksZS5saW5lV2lkdGg9aS5kZWNvcmF0aW9uV2lkdGh8fDIsZS5tb3ZlVG8obyx1KSxlLmxpbmVUbyhzLHUpLGUuc3Ryb2tlKCl9fWZ1bmN0aW9uIEZzKGUsdCl7bGV0IG49ZS5maWxsU3R5bGU7ZS5maWxsU3R5bGU9dC5jb2xvcixlLmZpbGxSZWN0KHQubGVmdCx0LnRvcCx0LndpZHRoLHQuaGVpZ2h0KSxlLmZpbGxTdHlsZT1ufWZ1bmN0aW9uIElzKGUsdCxuLHIsaSxhPXt9KXtsZXQgbz1XKHQpP3Q6W3RdLHM9YS5zdHJva2VXaWR0aD4wJiZhLnN0cm9rZUNvbG9yIT09YGAsYyxsO2ZvcihlLnNhdmUoKSxlLmZvbnQ9aS5zdHJpbmcsTnMoZSxhKSxjPTA7YzxvLmxlbmd0aDsrK2MpbD1vW2NdLGEuYmFja2Ryb3AmJkZzKGUsYS5iYWNrZHJvcCkscyYmKGEuc3Ryb2tlQ29sb3ImJihlLnN0cm9rZVN0eWxlPWEuc3Ryb2tlQ29sb3IpLFUoYS5zdHJva2VXaWR0aCl8fChlLmxpbmVXaWR0aD1hLnN0cm9rZVdpZHRoKSxlLnN0cm9rZVRleHQobCxuLHIsYS5tYXhXaWR0aCkpLGUuZmlsbFRleHQobCxuLHIsYS5tYXhXaWR0aCksUHMoZSxuLHIsbCxhKSxyKz1OdW1iZXIoaS5saW5lSGVpZ2h0KTtlLnJlc3RvcmUoKX1mdW5jdGlvbiBMcyhlLHQpe2xldHt4Om4seTpyLHc6aSxoOmEscmFkaXVzOm99PXQ7ZS5hcmMobitvLnRvcExlZnQscitvLnRvcExlZnQsby50b3BMZWZ0LDEuNSpYLFgsITApLGUubGluZVRvKG4scithLW8uYm90dG9tTGVmdCksZS5hcmMobitvLmJvdHRvbUxlZnQscithLW8uYm90dG9tTGVmdCxvLmJvdHRvbUxlZnQsWCx5bywhMCksZS5saW5lVG8obitpLW8uYm90dG9tUmlnaHQscithKSxlLmFyYyhuK2ktby5ib3R0b21SaWdodCxyK2Etby5ib3R0b21SaWdodCxvLmJvdHRvbVJpZ2h0LHlvLDAsITApLGUubGluZVRvKG4raSxyK28udG9wUmlnaHQpLGUuYXJjKG4raS1vLnRvcFJpZ2h0LHIrby50b3BSaWdodCxvLnRvcFJpZ2h0LDAsLXlvLCEwKSxlLmxpbmVUbyhuK28udG9wTGVmdCxyKX12YXIgUnM9L14obm9ybWFsfChcZCsoPzpcLlxkKyk/KShweHxlbXwlKT8pJC8senM9L14obm9ybWFsfGl0YWxpY3xpbml0aWFsfGluaGVyaXR8dW5zZXR8KG9ibGlxdWUoIC0/WzAtOV0/WzAtOV1kZWcpPykpJC87ZnVuY3Rpb24gQnMoZSx0KXtsZXQgbj0oYGArZSkubWF0Y2goUnMpO2lmKCFufHxuWzFdPT09YG5vcm1hbGApcmV0dXJuIHQqMS4yO3N3aXRjaChlPStuWzJdLG5bM10pe2Nhc2VgcHhgOnJldHVybiBlO2Nhc2VgJWA6ZS89MTAwfXJldHVybiB0KmV9dmFyIFZzPWU9PitlfHwwO2Z1bmN0aW9uIEhzKGUsdCl7bGV0IG49e30scj1HKHQpLGk9cj9PYmplY3Qua2V5cyh0KTp0LGE9RyhlKT9yP249PnEoZVtuXSxlW3Rbbl1dKTp0PT5lW3RdOigpPT5lO2ZvcihsZXQgZSBvZiBpKW5bZV09VnMoYShlKSk7cmV0dXJuIG59ZnVuY3Rpb24gVXMoZSl7cmV0dXJuIEhzKGUse3RvcDpgeWAscmlnaHQ6YHhgLGJvdHRvbTpgeWAsbGVmdDpgeGB9KX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gSHMoZSxbYHRvcExlZnRgLGB0b3BSaWdodGAsYGJvdHRvbUxlZnRgLGBib3R0b21SaWdodGBdKX1mdW5jdGlvbiBRKGUpe2xldCB0PVVzKGUpO3JldHVybiB0LndpZHRoPXQubGVmdCt0LnJpZ2h0LHQuaGVpZ2h0PXQudG9wK3QuYm90dG9tLHR9ZnVuY3Rpb24gJChlLHQpe2V8fD17fSx0fHw9Wi5mb250O2xldCBuPXEoZS5zaXplLHQuc2l6ZSk7dHlwZW9mIG49PWBzdHJpbmdgJiYobj1wYXJzZUludChuLDEwKSk7bGV0IHI9cShlLnN0eWxlLHQuc3R5bGUpO3ImJiEoYGArcikubWF0Y2goenMpJiYoY29uc29sZS53YXJuKGBJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiAiYCtyK2AiYCkscj12b2lkIDApO2xldCBpPXtmYW1pbHk6cShlLmZhbWlseSx0LmZhbWlseSksbGluZUhlaWdodDpCcyhxKGUubGluZUhlaWdodCx0LmxpbmVIZWlnaHQpLG4pLHNpemU6bixzdHlsZTpyLHdlaWdodDpxKGUud2VpZ2h0LHQud2VpZ2h0KSxzdHJpbmc6YGB9O3JldHVybiBpLnN0cmluZz1DcyhpKSxpfWZ1bmN0aW9uIEdzKGUsdCxuLHIpe2xldCBpPSEwLGEsbyxzO2ZvcihhPTAsbz1lLmxlbmd0aDthPG87KythKWlmKHM9ZVthXSxzIT09dm9pZCAwJiYodCE9PXZvaWQgMCYmdHlwZW9mIHM9PWBmdW5jdGlvbmAmJihzPXModCksaT0hMSksbiE9PXZvaWQgMCYmVyhzKSYmKHM9c1tuJXMubGVuZ3RoXSxpPSExKSxzIT09dm9pZCAwKSlyZXR1cm4gciYmIWkmJihyLmNhY2hlYWJsZT0hMSksc31mdW5jdGlvbiBLcyhlLHQsbil7bGV0e21pbjpyLG1heDppfT1lLGE9UWEodCwoaS1yKS8yKSxvPShlLHQpPT5uJiZlPT09MD8wOmUrdDtyZXR1cm57bWluOm8ociwtTWF0aC5hYnMoYSkpLG1heDpvKGksYSl9fWZ1bmN0aW9uIHFzKGUsdCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShlKSx0KX1mdW5jdGlvbiBKcyhlLHQ9W2BgXSxuLHIsaT0oKT0+ZVswXSl7bGV0IGE9bnx8ZTtyZXR1cm4gcj09PXZvaWQgMCYmKHI9dWMoYF9mYWxsYmFja2AsZSkpLG5ldyBQcm94eSh7W1N5bWJvbC50b1N0cmluZ1RhZ106YE9iamVjdGAsX2NhY2hlYWJsZTohMCxfc2NvcGVzOmUsX3Jvb3RTY29wZXM6YSxfZmFsbGJhY2s6cixfZ2V0VGFyZ2V0Omksb3ZlcnJpZGU6bj0+SnMoW24sLi4uZV0sdCxhLHIpfSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIHQuX2tleXMsZGVsZXRlIGVbMF1bbl0sITB9LGdldChuLHIpe3JldHVybiAkcyhuLHIsKCk9PmxjKHIsdCxlLG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuX3Njb3Blc1swXSx0KX0sZ2V0UHJvdG90eXBlT2YoKXtyZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihlWzBdKX0saGFzKGUsdCl7cmV0dXJuIGRjKGUpLmluY2x1ZGVzKHQpfSxvd25LZXlzKGUpe3JldHVybiBkYyhlKX0sc2V0KGUsdCxuKXtsZXQgcj1lLl9zdG9yYWdlfHw9aSgpO3JldHVybiBlW3RdPXJbdF09bixkZWxldGUgZS5fa2V5cywhMH19KX1mdW5jdGlvbiBZcyhlLHQsbixyKXtsZXQgaT17X2NhY2hlYWJsZTohMSxfcHJveHk6ZSxfY29udGV4dDp0LF9zdWJQcm94eTpuLF9zdGFjazpuZXcgU2V0LF9kZXNjcmlwdG9yczpYcyhlLHIpLHNldENvbnRleHQ6dD0+WXMoZSx0LG4sciksb3ZlcnJpZGU6aT0+WXMoZS5vdmVycmlkZShpKSx0LG4scil9O3JldHVybiBuZXcgUHJveHkoaSx7ZGVsZXRlUHJvcGVydHkodCxuKXtyZXR1cm4gZGVsZXRlIHRbbl0sZGVsZXRlIGVbbl0sITB9LGdldChlLHQsbil7cmV0dXJuICRzKGUsdCwoKT0+ZWMoZSx0LG4pKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7cmV0dXJuIHQuX2Rlc2NyaXB0b3JzLmFsbEtleXM/UmVmbGVjdC5oYXMoZSxuKT97ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9OnZvaWQgMDpSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pfSxnZXRQcm90b3R5cGVPZigpe3JldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGUpfSxoYXModCxuKXtyZXR1cm4gUmVmbGVjdC5oYXMoZSxuKX0sb3duS2V5cygpe3JldHVybiBSZWZsZWN0Lm93bktleXMoZSl9LHNldCh0LG4scil7cmV0dXJuIGVbbl09cixkZWxldGUgdFtuXSwhMH19KX1mdW5jdGlvbiBYcyhlLHQ9e3NjcmlwdGFibGU6ITAsaW5kZXhhYmxlOiEwfSl7bGV0e19zY3JpcHRhYmxlOm49dC5zY3JpcHRhYmxlLF9pbmRleGFibGU6cj10LmluZGV4YWJsZSxfYWxsS2V5czppPXQuYWxsS2V5c309ZTtyZXR1cm57YWxsS2V5czppLHNjcmlwdGFibGU6bixpbmRleGFibGU6cixpc1NjcmlwdGFibGU6cG8obik/bjooKT0+bixpc0luZGV4YWJsZTpwbyhyKT9yOigpPT5yfX12YXIgWnM9KGUsdCk9PmU/ZSt1byh0KTp0LFFzPShlLHQpPT5HKHQpJiZlIT09YGFkYXB0ZXJzYCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGx8fHQuY29uc3RydWN0b3I9PT1PYmplY3QpO2Z1bmN0aW9uICRzKGUsdCxuKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KXx8dD09PWBjb25zdHJ1Y3RvcmApcmV0dXJuIGVbdF07bGV0IHI9bigpO3JldHVybiBlW3RdPXIscn1mdW5jdGlvbiBlYyhlLHQsbil7bGV0e19wcm94eTpyLF9jb250ZXh0OmksX3N1YlByb3h5OmEsX2Rlc2NyaXB0b3JzOm99PWUscz1yW3RdO3JldHVybiBwbyhzKSYmby5pc1NjcmlwdGFibGUodCkmJihzPXRjKHQscyxlLG4pKSxXKHMpJiZzLmxlbmd0aCYmKHM9bmModCxzLGUsby5pc0luZGV4YWJsZSkpLFFzKHQscykmJihzPVlzKHMsaSxhJiZhW3RdLG8pKSxzfWZ1bmN0aW9uIHRjKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9zdGFjazpzfT1uO2lmKHMuaGFzKGUpKXRocm93IEVycm9yKGBSZWN1cnNpb24gZGV0ZWN0ZWQ6IGArQXJyYXkuZnJvbShzKS5qb2luKGAtPmApK2AtPmArZSk7cy5hZGQoZSk7bGV0IGM9dChhLG98fHIpO3JldHVybiBzLmRlbGV0ZShlKSxRcyhlLGMpJiYoYz1vYyhpLl9zY29wZXMsaSxlLGMpKSxjfWZ1bmN0aW9uIG5jKGUsdCxuLHIpe2xldHtfcHJveHk6aSxfY29udGV4dDphLF9zdWJQcm94eTpvLF9kZXNjcmlwdG9yczpzfT1uO2lmKGEuaW5kZXghPT12b2lkIDAmJnIoZSkpcmV0dXJuIHRbYS5pbmRleCV0Lmxlbmd0aF07aWYoRyh0WzBdKSl7bGV0IG49dCxyPWkuX3Njb3Blcy5maWx0ZXIoZT0+ZSE9PW4pO3Q9W107Zm9yKGxldCBjIG9mIG4pe2xldCBuPW9jKHIsaSxlLGMpO3QucHVzaChZcyhuLGEsbyYmb1tlXSxzKSl9fXJldHVybiB0fWZ1bmN0aW9uIHJjKGUsdCxuKXtyZXR1cm4gcG8oZSk/ZSh0LG4pOmV9dmFyIGljPShlLHQpPT5lPT09ITA/dDp0eXBlb2YgZT09YHN0cmluZ2A/bG8odCxlKTp2b2lkIDA7ZnVuY3Rpb24gYWMoZSx0LG4scixpKXtmb3IobGV0IGEgb2YgdCl7bGV0IHQ9aWMobixhKTtpZih0KXtlLmFkZCh0KTtsZXQgYT1yYyh0Ll9mYWxsYmFjayxuLGkpO2lmKGEhPT12b2lkIDAmJmEhPT1uJiZhIT09cilyZXR1cm4gYX1lbHNlIGlmKHQ9PT0hMSYmciE9PXZvaWQgMCYmbiE9PXIpcmV0dXJuIG51bGx9cmV0dXJuITF9ZnVuY3Rpb24gb2MoZSx0LG4scil7bGV0IGk9dC5fcm9vdFNjb3BlcyxhPXJjKHQuX2ZhbGxiYWNrLG4sciksbz1bLi4uZSwuLi5pXSxzPW5ldyBTZXQ7cy5hZGQocik7bGV0IGM9c2MocyxvLG4sYXx8bixyKTtyZXR1cm4gYz09PW51bGx8fGEhPT12b2lkIDAmJmEhPT1uJiYoYz1zYyhzLG8sYSxjLHIpLGM9PT1udWxsKT8hMTpKcyhBcnJheS5mcm9tKHMpLFtgYF0saSxhLCgpPT5jYyh0LG4scikpfWZ1bmN0aW9uIHNjKGUsdCxuLHIsaSl7Zm9yKDtuOyluPWFjKGUsdCxuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gY2MoZSx0LG4pe2xldCByPWUuX2dldFRhcmdldCgpO3QgaW4gcnx8KHJbdF09e30pO2xldCBpPXJbdF07cmV0dXJuIFcoaSkmJkcobik/bjppfHx7fX1mdW5jdGlvbiBsYyhlLHQsbixyKXtsZXQgaTtmb3IobGV0IGEgb2YgdClpZihpPXVjKFpzKGEsZSksbiksaSE9PXZvaWQgMClyZXR1cm4gUXMoZSxpKT9vYyhuLHIsZSxpKTppfWZ1bmN0aW9uIHVjKGUsdCl7Zm9yKGxldCBuIG9mIHQpe2lmKCFuKWNvbnRpbnVlO2xldCB0PW5bZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdH19ZnVuY3Rpb24gZGMoZSl7bGV0IHQ9ZS5fa2V5cztyZXR1cm4gdHx8PWUuX2tleXM9ZmMoZS5fc2NvcGVzKSx0fWZ1bmN0aW9uIGZjKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIGUpZm9yKGxldCBlIG9mIE9iamVjdC5rZXlzKG4pLmZpbHRlcihlPT4hZS5zdGFydHNXaXRoKGBfYCkpKXQuYWRkKGUpO3JldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8YHVgJiZ0eXBlb2YgZG9jdW1lbnQ8YHVgfWZ1bmN0aW9uIG1jKGUpe2xldCB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC50b1N0cmluZygpPT09YFtvYmplY3QgU2hhZG93Um9vdF1gJiYodD10Lmhvc3QpLHR9ZnVuY3Rpb24gaGMoZSx0LG4pe2xldCByO3JldHVybiB0eXBlb2YgZT09YHN0cmluZ2A/KHI9cGFyc2VJbnQoZSwxMCksZS5pbmRleE9mKGAlYCkhPT0tMSYmKHI9ci8xMDAqdC5wYXJlbnROb2RlW25dKSk6cj1lLHJ9dmFyIGdjPWU9PmUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCk7ZnVuY3Rpb24gX2MoZSx0KXtyZXR1cm4gZ2MoZSkuZ2V0UHJvcGVydHlWYWx1ZSh0KX12YXIgdmM9W2B0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXTtmdW5jdGlvbiB5YyhlLHQsbil7bGV0IHI9e307bj1uP2AtYCtuOmBgO2ZvcihsZXQgaT0wO2k8NDtpKyspe2xldCBhPXZjW2ldO3JbYV09cGFyc2VGbG9hdChlW3QrYC1gK2Erbl0pfHwwfXJldHVybiByLndpZHRoPXIubGVmdCtyLnJpZ2h0LHIuaGVpZ2h0PXIudG9wK3IuYm90dG9tLHJ9dmFyIGJjPShlLHQsbik9PihlPjB8fHQ+MCkmJighbnx8IW4uc2hhZG93Um9vdCk7ZnVuY3Rpb24geGMoZSx0KXtsZXQgbj1lLnRvdWNoZXMscj1uJiZuLmxlbmd0aD9uWzBdOmUse29mZnNldFg6aSxvZmZzZXRZOmF9PXIsbz0hMSxzLGM7aWYoYmMoaSxhLGUudGFyZ2V0KSlzPWksYz1hO2Vsc2V7bGV0IGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtzPXIuY2xpZW50WC1lLmxlZnQsYz1yLmNsaWVudFktZS50b3Asbz0hMH1yZXR1cm57eDpzLHk6Yyxib3g6b319ZnVuY3Rpb24gU2MoZSx0KXtpZihgbmF0aXZlYGluIGUpcmV0dXJuIGU7bGV0e2NhbnZhczpuLGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvOnJ9PXQsaT1nYyhuKSxhPWkuYm94U2l6aW5nPT09YGJvcmRlci1ib3hgLG89eWMoaSxgcGFkZGluZ2ApLHM9eWMoaSxgYm9yZGVyYCxgd2lkdGhgKSx7eDpjLHk6bCxib3g6dX09eGMoZSxuKSxkPW8ubGVmdCsodSYmcy5sZWZ0KSxmPW8udG9wKyh1JiZzLnRvcCkse3dpZHRoOnAsaGVpZ2h0Om19PXQ7cmV0dXJuIGEmJihwLT1vLndpZHRoK3Mud2lkdGgsbS09by5oZWlnaHQrcy5oZWlnaHQpLHt4Ok1hdGgucm91bmQoKGMtZCkvcCpuLndpZHRoL3IpLHk6TWF0aC5yb3VuZCgobC1mKS9tKm4uaGVpZ2h0L3IpfX1mdW5jdGlvbiBDYyhlLHQsbil7bGV0IHIsaTtpZih0PT09dm9pZCAwfHxuPT09dm9pZCAwKXtsZXQgYT1lJiZtYyhlKTtpZighYSl0PWUuY2xpZW50V2lkdGgsbj1lLmNsaWVudEhlaWdodDtlbHNle2xldCBlPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1nYyhhKSxzPXljKG8sYGJvcmRlcmAsYHdpZHRoYCksYz15YyhvLGBwYWRkaW5nYCk7dD1lLndpZHRoLWMud2lkdGgtcy53aWR0aCxuPWUuaGVpZ2h0LWMuaGVpZ2h0LXMuaGVpZ2h0LHI9aGMoby5tYXhXaWR0aCxhLGBjbGllbnRXaWR0aGApLGk9aGMoby5tYXhIZWlnaHQsYSxgY2xpZW50SGVpZ2h0YCl9fXJldHVybnt3aWR0aDp0LGhlaWdodDpuLG1heFdpZHRoOnJ8fF9vLG1heEhlaWdodDppfHxfb319dmFyIHdjPWU9Pk1hdGgucm91bmQoZSoxMCkvMTA7ZnVuY3Rpb24gVGMoZSx0LG4scil7bGV0IGk9Z2MoZSksYT15YyhpLGBtYXJnaW5gKSxvPWhjKGkubWF4V2lkdGgsZSxgY2xpZW50V2lkdGhgKXx8X28scz1oYyhpLm1heEhlaWdodCxlLGBjbGllbnRIZWlnaHRgKXx8X28sYz1DYyhlLHQsbikse3dpZHRoOmwsaGVpZ2h0OnV9PWM7aWYoaS5ib3hTaXppbmc9PT1gY29udGVudC1ib3hgKXtsZXQgZT15YyhpLGBib3JkZXJgLGB3aWR0aGApLHQ9eWMoaSxgcGFkZGluZ2ApO2wtPXQud2lkdGgrZS53aWR0aCx1LT10LmhlaWdodCtlLmhlaWdodH1yZXR1cm4gbD1NYXRoLm1heCgwLGwtYS53aWR0aCksdT1NYXRoLm1heCgwLHI/bC9yOnUtYS5oZWlnaHQpLGw9d2MoTWF0aC5taW4obCxvLGMubWF4V2lkdGgpKSx1PXdjKE1hdGgubWluKHUscyxjLm1heEhlaWdodCkpLGwmJiF1JiYodT13YyhsLzIpKSwodCE9PXZvaWQgMHx8biE9PXZvaWQgMCkmJnImJmMuaGVpZ2h0JiZ1PmMuaGVpZ2h0JiYodT1jLmhlaWdodCxsPXdjKE1hdGguZmxvb3IodSpyKSkpLHt3aWR0aDpsLGhlaWdodDp1fX1mdW5jdGlvbiBFYyhlLHQsbil7bGV0IHI9dHx8MSxpPXdjKGUuaGVpZ2h0KnIpLGE9d2MoZS53aWR0aCpyKTtlLmhlaWdodD13YyhlLmhlaWdodCksZS53aWR0aD13YyhlLndpZHRoKTtsZXQgbz1lLmNhbnZhcztyZXR1cm4gby5zdHlsZSYmKG58fCFvLnN0eWxlLmhlaWdodCYmIW8uc3R5bGUud2lkdGgpJiYoby5zdHlsZS5oZWlnaHQ9YCR7ZS5oZWlnaHR9cHhgLG8uc3R5bGUud2lkdGg9YCR7ZS53aWR0aH1weGApLGUuY3VycmVudERldmljZVBpeGVsUmF0aW8hPT1yfHxvLmhlaWdodCE9PWl8fG8ud2lkdGghPT1hPyhlLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvPXIsby5oZWlnaHQ9aSxvLndpZHRoPWEsZS5jdHguc2V0VHJhbnNmb3JtKHIsMCwwLHIsMCwwKSwhMCk6ITF9dmFyIERjPWZ1bmN0aW9uKCl7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX07cGMoKSYmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGB0ZXN0YCxudWxsLHQpKX1jYXRjaHt9cmV0dXJuIGV9KCk7ZnVuY3Rpb24gT2MoZSx0KXtsZXQgbj1fYyhlLHQpLHI9biYmbi5tYXRjaCgvXihcZCspKFwuXGQrKT9weCQvKTtyZXR1cm4gcj8rclsxXTp2b2lkIDB9dmFyIGtjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3gobil7cmV0dXJuIGUrZSt0LW59LHNldFdpZHRoKGUpe3Q9ZX0sdGV4dEFsaWduKGUpe3JldHVybiBlPT09YGNlbnRlcmA/ZTplPT09YHJpZ2h0YD9gbGVmdGA6YHJpZ2h0YH0seFBsdXMoZSx0KXtyZXR1cm4gZS10fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGUtdH19fSxBYz1mdW5jdGlvbigpe3JldHVybnt4KGUpe3JldHVybiBlfSxzZXRXaWR0aChlKXt9LHRleHRBbGlnbihlKXtyZXR1cm4gZX0seFBsdXMoZSx0KXtyZXR1cm4gZSt0fSxsZWZ0Rm9yTHRyKGUsdCl7cmV0dXJuIGV9fX07ZnVuY3Rpb24gamMoZSx0LG4pe3JldHVybiBlP2tjKHQsbik6QWMoKX1mdW5jdGlvbiBNYyhlLHQpe2xldCBuLHI7KHQ9PT1gbHRyYHx8dD09PWBydGxgKSYmKG49ZS5jYW52YXMuc3R5bGUscj1bbi5nZXRQcm9wZXJ0eVZhbHVlKGBkaXJlY3Rpb25gKSxuLmdldFByb3BlcnR5UHJpb3JpdHkoYGRpcmVjdGlvbmApXSxuLnNldFByb3BlcnR5KGBkaXJlY3Rpb25gLHQsYGltcG9ydGFudGApLGUucHJldlRleHREaXJlY3Rpb249cil9ZnVuY3Rpb24gTmMoZSx0KXt0IT09dm9pZCAwJiYoZGVsZXRlIGUucHJldlRleHREaXJlY3Rpb24sZS5jYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoYGRpcmVjdGlvbmAsdFswXSx0WzFdKSl9ZnVuY3Rpb24gUGMoZSx0LG4pe3JldHVybiBlLm9wdGlvbnMuY2xpcD9lW25dOnRbbl19ZnVuY3Rpb24gRmMoZSx0KXtsZXR7eFNjYWxlOm4seVNjYWxlOnJ9PWU7cmV0dXJuIG4mJnI/e2xlZnQ6UGMobix0LGBsZWZ0YCkscmlnaHQ6UGMobix0LGByaWdodGApLHRvcDpQYyhyLHQsYHRvcGApLGJvdHRvbTpQYyhyLHQsYGJvdHRvbWApfTp0fWZ1bmN0aW9uIEljKGUsdCl7bGV0IG49dC5fY2xpcDtpZihuLmRpc2FibGVkKXJldHVybiExO2xldCByPUZjKHQsZS5jaGFydEFyZWEpO3JldHVybntsZWZ0Om4ubGVmdD09PSExPzA6ci5sZWZ0LShuLmxlZnQ9PT0hMD8wOm4ubGVmdCkscmlnaHQ6bi5yaWdodD09PSExP2Uud2lkdGg6ci5yaWdodCsobi5yaWdodD09PSEwPzA6bi5yaWdodCksdG9wOm4udG9wPT09ITE/MDpyLnRvcC0obi50b3A9PT0hMD8wOm4udG9wKSxib3R0b206bi5ib3R0b209PT0hMT9lLmhlaWdodDpyLmJvdHRvbSsobi5ib3R0b209PT0hMD8wOm4uYm90dG9tKX19dmFyIExjPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9jaGFydHM9bmV3IE1hcCx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX2xhc3REYXRlPXZvaWQgMH1fbm90aWZ5KGUsdCxuLHIpe2xldCBpPXQubGlzdGVuZXJzW3JdLGE9dC5kdXJhdGlvbjtpLmZvckVhY2gocj0+cih7Y2hhcnQ6ZSxpbml0aWFsOnQuaW5pdGlhbCxudW1TdGVwczphLGN1cnJlbnRTdGVwOk1hdGgubWluKG4tdC5zdGFydCxhKX0pKX1fcmVmcmVzaCgpe3RoaXMuX3JlcXVlc3R8fD0odGhpcy5fcnVubmluZz0hMCxZby5jYWxsKHdpbmRvdywoKT0+e3RoaXMuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZWZyZXNoKCl9KSl9X3VwZGF0ZShlPURhdGUubm93KCkpe2xldCB0PTA7dGhpcy5fY2hhcnRzLmZvckVhY2goKG4scik9PntpZighbi5ydW5uaW5nfHwhbi5pdGVtcy5sZW5ndGgpcmV0dXJuO2xldCBpPW4uaXRlbXMsYT1pLmxlbmd0aC0xLG89ITEscztmb3IoO2E+PTA7LS1hKXM9aVthXSxzLl9hY3RpdmU/KHMuX3RvdGFsPm4uZHVyYXRpb24mJihuLmR1cmF0aW9uPXMuX3RvdGFsKSxzLnRpY2soZSksbz0hMCk6KGlbYV09aVtpLmxlbmd0aC0xXSxpLnBvcCgpKTtvJiYoci5kcmF3KCksdGhpcy5fbm90aWZ5KHIsbixlLGBwcm9ncmVzc2ApKSxpLmxlbmd0aHx8KG4ucnVubmluZz0hMSx0aGlzLl9ub3RpZnkocixuLGUsYGNvbXBsZXRlYCksbi5pbml0aWFsPSExKSx0Kz1pLmxlbmd0aH0pLHRoaXMuX2xhc3REYXRlPWUsdD09PTAmJih0aGlzLl9ydW5uaW5nPSExKX1fZ2V0QW5pbXMoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLG49dC5nZXQoZSk7cmV0dXJuIG58fChuPXtydW5uaW5nOiExLGluaXRpYWw6ITAsaXRlbXM6W10sbGlzdGVuZXJzOntjb21wbGV0ZTpbXSxwcm9ncmVzczpbXX19LHQuc2V0KGUsbikpLG59bGlzdGVuKGUsdCxuKXt0aGlzLl9nZXRBbmltcyhlKS5saXN0ZW5lcnNbdF0ucHVzaChuKX1hZGQoZSx0KXshdHx8IXQubGVuZ3RofHx0aGlzLl9nZXRBbmltcyhlKS5pdGVtcy5wdXNoKC4uLnQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fZ2V0QW5pbXMoZSkuaXRlbXMubGVuZ3RoPjB9c3RhcnQoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTt0JiYodC5ydW5uaW5nPSEwLHQuc3RhcnQ9RGF0ZS5ub3coKSx0LmR1cmF0aW9uPXQuaXRlbXMucmVkdWNlKChlLHQpPT5NYXRoLm1heChlLHQuX2R1cmF0aW9uKSwwKSx0aGlzLl9yZWZyZXNoKCkpfXJ1bm5pbmcoZSl7aWYoIXRoaXMuX3J1bm5pbmcpcmV0dXJuITE7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtyZXR1cm4hKCF0fHwhdC5ydW5uaW5nfHwhdC5pdGVtcy5sZW5ndGgpfXN0b3AoZSl7bGV0IHQ9dGhpcy5fY2hhcnRzLmdldChlKTtpZighdHx8IXQuaXRlbXMubGVuZ3RoKXJldHVybjtsZXQgbj10Lml0ZW1zLHI9bi5sZW5ndGgtMTtmb3IoO3I+PTA7LS1yKW5bcl0uY2FuY2VsKCk7dC5pdGVtcz1bXSx0aGlzLl9ub3RpZnkoZSx0LERhdGUubm93KCksYGNvbXBsZXRlYCl9cmVtb3ZlKGUpe3JldHVybiB0aGlzLl9jaGFydHMuZGVsZXRlKGUpfX0sUmM9YHRyYW5zcGFyZW50YCx6Yz17Ym9vbGVhbihlLHQsbil7cmV0dXJuIG4+LjU/dDplfSxjb2xvcihlLHQsbil7bGV0IHI9b3MoZXx8UmMpLGk9ci52YWxpZCYmb3ModHx8UmMpO3JldHVybiBpJiZpLnZhbGlkP2kubWl4KHIsbikuaGV4U3RyaW5nKCk6dH0sbnVtYmVyKGUsdCxuKXtyZXR1cm4gZSsodC1lKSpufX0sQmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7bGV0IGk9dFtuXTtyPUdzKFtlLnRvLHIsaSxlLmZyb21dKTtsZXQgYT1HcyhbZS5mcm9tLGkscl0pO3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9mbj1lLmZufHx6Y1tlLnR5cGV8fHR5cGVvZiBhXSx0aGlzLl9lYXNpbmc9aXNbZS5lYXNpbmddfHxpcy5saW5lYXIsdGhpcy5fc3RhcnQ9TWF0aC5mbG9vcihEYXRlLm5vdygpKyhlLmRlbGF5fHwwKSksdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWw9TWF0aC5mbG9vcihlLmR1cmF0aW9uKSx0aGlzLl9sb29wPSEhZS5sb29wLHRoaXMuX3RhcmdldD10LHRoaXMuX3Byb3A9bix0aGlzLl9mcm9tPWEsdGhpcy5fdG89cix0aGlzLl9wcm9taXNlcz12b2lkIDB9YWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX11cGRhdGUoZSx0LG4pe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fbm90aWZ5KCExKTtsZXQgcj10aGlzLl90YXJnZXRbdGhpcy5fcHJvcF0saT1uLXRoaXMuX3N0YXJ0LGE9dGhpcy5fZHVyYXRpb24taTt0aGlzLl9zdGFydD1uLHRoaXMuX2R1cmF0aW9uPU1hdGguZmxvb3IoTWF0aC5tYXgoYSxlLmR1cmF0aW9uKSksdGhpcy5fdG90YWwrPWksdGhpcy5fbG9vcD0hIWUubG9vcCx0aGlzLl90bz1HcyhbZS50byx0LHIsZS5mcm9tXSksdGhpcy5fZnJvbT1HcyhbZS5mcm9tLHIsdF0pfX1jYW5jZWwoKXt0aGlzLl9hY3RpdmUmJih0aGlzLnRpY2soRGF0ZS5ub3coKSksdGhpcy5fYWN0aXZlPSExLHRoaXMuX25vdGlmeSghMSkpfXRpY2soZSl7bGV0IHQ9ZS10aGlzLl9zdGFydCxuPXRoaXMuX2R1cmF0aW9uLHI9dGhpcy5fcHJvcCxpPXRoaXMuX2Zyb20sYT10aGlzLl9sb29wLG89dGhpcy5fdG8scztpZih0aGlzLl9hY3RpdmU9aSE9PW8mJihhfHx0PG4pLCF0aGlzLl9hY3RpdmUpe3RoaXMuX3RhcmdldFtyXT1vLHRoaXMuX25vdGlmeSghMCk7cmV0dXJufWlmKHQ8MCl7dGhpcy5fdGFyZ2V0W3JdPWk7cmV0dXJufXM9dC9uJTIscz1hJiZzPjE/Mi1zOnMscz10aGlzLl9lYXNpbmcoTWF0aC5taW4oMSxNYXRoLm1heCgwLHMpKSksdGhpcy5fdGFyZ2V0W3JdPXRoaXMuX2ZuKGksbyxzKX13YWl0KCl7bGV0IGU9dGhpcy5fcHJvbWlzZXN8fD1bXTtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntlLnB1c2goe3Jlczp0LHJlajpufSl9KX1fbm90aWZ5KGUpe2xldCB0PWU/YHJlc2A6YHJlamAsbj10aGlzLl9wcm9taXNlc3x8W107Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspbltlXVt0XSgpfX0sVmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9jaGFydD1lLHRoaXMuX3Byb3BlcnRpZXM9bmV3IE1hcCx0aGlzLmNvbmZpZ3VyZSh0KX1jb25maWd1cmUoZSl7aWYoIUcoZSkpcmV0dXJuO2xldCB0PU9iamVjdC5rZXlzKFouYW5pbWF0aW9uKSxuPXRoaXMuX3Byb3BlcnRpZXM7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuZm9yRWFjaChyPT57bGV0IGk9ZVtyXTtpZighRyhpKSlyZXR1cm47bGV0IGE9e307Zm9yKGxldCBlIG9mIHQpYVtlXT1pW2VdOyhXKGkucHJvcGVydGllcykmJmkucHJvcGVydGllc3x8W3JdKS5mb3JFYWNoKGU9PnsoZT09PXJ8fCFuLmhhcyhlKSkmJm4uc2V0KGUsYSl9KX0pfV9hbmltYXRlT3B0aW9ucyhlLHQpe2xldCBuPXQub3B0aW9ucyxyPVVjKGUsbik7aWYoIXIpcmV0dXJuW107bGV0IGk9dGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhyLG4pO3JldHVybiBuLiRzaGFyZWQmJkhjKGUub3B0aW9ucy4kYW5pbWF0aW9ucyxuKS50aGVuKCgpPT57ZS5vcHRpb25zPW59LCgpPT57fSksaX1fY3JlYXRlQW5pbWF0aW9ucyhlLHQpe2xldCBuPXRoaXMuX3Byb3BlcnRpZXMscj1bXSxpPWUuJGFuaW1hdGlvbnN8fD17fSxhPU9iamVjdC5rZXlzKHQpLG89RGF0ZS5ub3coKSxzO2ZvcihzPWEubGVuZ3RoLTE7cz49MDstLXMpe2xldCBjPWFbc107aWYoYy5jaGFyQXQoMCk9PT1gJGApY29udGludWU7aWYoYz09PWBvcHRpb25zYCl7ci5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKGUsdCkpO2NvbnRpbnVlfWxldCBsPXRbY10sdT1pW2NdLGQ9bi5nZXQoYyk7aWYodSl7aWYoZCYmdS5hY3RpdmUoKSl7dS51cGRhdGUoZCxsLG8pO2NvbnRpbnVlfXUuY2FuY2VsKCl9aWYoIWR8fCFkLmR1cmF0aW9uKXtlW2NdPWw7Y29udGludWV9aVtjXT11PW5ldyBCYyhkLGUsYyxsKSxyLnB1c2godSl9cmV0dXJuIHJ9dXBkYXRlKGUsdCl7aWYodGhpcy5fcHJvcGVydGllcy5zaXplPT09MCl7T2JqZWN0LmFzc2lnbihlLHQpO3JldHVybn1sZXQgbj10aGlzLl9jcmVhdGVBbmltYXRpb25zKGUsdCk7aWYobi5sZW5ndGgpcmV0dXJuIExjLmFkZCh0aGlzLl9jaGFydCxuKSwhMH19O2Z1bmN0aW9uIEhjKGUsdCl7bGV0IG49W10scj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7bGV0IGk9ZVtyW3RdXTtpJiZpLmFjdGl2ZSgpJiZuLnB1c2goaS53YWl0KCkpfXJldHVybiBQcm9taXNlLmFsbChuKX1mdW5jdGlvbiBVYyhlLHQpe2lmKCF0KXJldHVybjtsZXQgbj1lLm9wdGlvbnM7aWYoIW4pe2Uub3B0aW9ucz10O3JldHVybn1yZXR1cm4gbi4kc2hhcmVkJiYoZS5vcHRpb25zPW49T2JqZWN0LmFzc2lnbih7fSxuLHskc2hhcmVkOiExLCRhbmltYXRpb25zOnt9fSkpLG59ZnVuY3Rpb24gV2MoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnN8fHt9LHI9bi5yZXZlcnNlLGk9bi5taW49PT12b2lkIDA/dDowLGE9bi5tYXg9PT12b2lkIDA/dDowO3JldHVybntzdGFydDpyP2E6aSxlbmQ6cj9pOmF9fWZ1bmN0aW9uIEdjKGUsdCxuKXtpZihuPT09ITEpcmV0dXJuITE7bGV0IHI9V2MoZSxuKSxpPVdjKHQsbik7cmV0dXJue3RvcDppLmVuZCxyaWdodDpyLmVuZCxib3R0b206aS5zdGFydCxsZWZ0OnIuc3RhcnR9fWZ1bmN0aW9uIEtjKGUpe2xldCB0LG4scixpO3JldHVybiBHKGUpPyh0PWUudG9wLG49ZS5yaWdodCxyPWUuYm90dG9tLGk9ZS5sZWZ0KTp0PW49cj1pPWUse3RvcDp0LHJpZ2h0Om4sYm90dG9tOnIsbGVmdDppLGRpc2FibGVkOmU9PT0hMX19ZnVuY3Rpb24gcWMoZSx0KXtsZXQgbj1bXSxyPWUuX2dldFNvcnRlZERhdGFzZXRNZXRhcyh0KSxpLGE7Zm9yKGk9MCxhPXIubGVuZ3RoO2k8YTsrK2kpbi5wdXNoKHJbaV0uaW5kZXgpO3JldHVybiBufWZ1bmN0aW9uIEpjKGUsdCxuLHI9e30pe2xldCBpPWUua2V5cyxhPXIubW9kZT09PWBzaW5nbGVgLG8scyxjLGw7aWYodD09PW51bGwpcmV0dXJuO2xldCB1PSExO2ZvcihvPTAscz1pLmxlbmd0aDtvPHM7KytvKXtpZihjPStpW29dLGM9PT1uKXtpZih1PSEwLHIuYWxsKWNvbnRpbnVlO2JyZWFrfWw9ZS52YWx1ZXNbY10sSyhsKSYmKGF8fHQ9PT0wfHxDbyh0KT09PUNvKGwpKSYmKHQrPWwpfXJldHVybiF1JiYhci5hbGw/MDp0fWZ1bmN0aW9uIFljKGUsdCl7bGV0e2lTY2FsZTpuLHZTY2FsZTpyfT10LGk9bi5heGlzPT09YHhgP2B4YDpgeWAsYT1yLmF4aXM9PT1geGA/YHhgOmB5YCxvPU9iamVjdC5rZXlzKGUpLHM9QXJyYXkoby5sZW5ndGgpLGMsbCx1O2ZvcihjPTAsbD1vLmxlbmd0aDtjPGw7KytjKXU9b1tjXSxzW2NdPXtbaV06dSxbYV06ZVt1XX07cmV0dXJuIHN9ZnVuY3Rpb24gWGMoZSx0KXtsZXQgbj1lJiZlLm9wdGlvbnMuc3RhY2tlZDtyZXR1cm4gbnx8bj09PXZvaWQgMCYmdC5zdGFjayE9PXZvaWQgMH1mdW5jdGlvbiBaYyhlLHQsbil7cmV0dXJuYCR7ZS5pZH0uJHt0LmlkfS4ke24uc3RhY2t8fG4udHlwZX1gfWZ1bmN0aW9uIFFjKGUpe2xldHttaW46dCxtYXg6bixtaW5EZWZpbmVkOnIsbWF4RGVmaW5lZDppfT1lLmdldFVzZXJCb3VuZHMoKTtyZXR1cm57bWluOnI/dDotMS8wLG1heDppP246MS8wfX1mdW5jdGlvbiAkYyhlLHQsbil7bGV0IHI9ZVt0XXx8KGVbdF09e30pO3JldHVybiByW25dfHwocltuXT17fSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7Zm9yKGxldCBpIG9mIHQuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMocikucmV2ZXJzZSgpKXtsZXQgdD1lW2kuaW5kZXhdO2lmKG4mJnQ+MHx8IW4mJnQ8MClyZXR1cm4gaS5pbmRleH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0bChlLHQpe2xldHtjaGFydDpuLF9jYWNoZWRNZXRhOnJ9PWUsaT1uLl9zdGFja3N8fD17fSx7aVNjYWxlOmEsdlNjYWxlOm8saW5kZXg6c309cixjPWEuYXhpcyxsPW8uYXhpcyx1PVpjKGEsbyxyKSxkPXQubGVuZ3RoLGY7Zm9yKGxldCBlPTA7ZTxkOysrZSl7bGV0IG49dFtlXSx7W2NdOmEsW2xdOmR9PW4scD1uLl9zdGFja3N8fD17fTtmPXBbbF09JGMoaSx1LGEpLGZbc109ZCxmLl90b3A9ZWwoZixvLCEwLHIudHlwZSksZi5fYm90dG9tPWVsKGYsbywhMSxyLnR5cGUpO2xldCBtPWYuX3Zpc3VhbFZhbHVlc3x8KGYuX3Zpc3VhbFZhbHVlcz17fSk7bVtzXT1kfX1mdW5jdGlvbiBubChlLHQpe2xldCBuPWUuc2NhbGVzO3JldHVybiBPYmplY3Qua2V5cyhuKS5maWx0ZXIoZT0+bltlXS5heGlzPT09dCkuc2hpZnQoKX1mdW5jdGlvbiBybChlLHQpe3JldHVybiBxcyhlLHthY3RpdmU6ITEsZGF0YXNldDp2b2lkIDAsZGF0YXNldEluZGV4OnQsaW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhc2V0YH0pfWZ1bmN0aW9uIGlsKGUsdCxuKXtyZXR1cm4gcXMoZSx7YWN0aXZlOiExLGRhdGFJbmRleDp0LHBhcnNlZDp2b2lkIDAscmF3OnZvaWQgMCxlbGVtZW50Om4saW5kZXg6dCxtb2RlOmBkZWZhdWx0YCx0eXBlOmBkYXRhYH0pfWZ1bmN0aW9uIGFsKGUsdCl7bGV0IG49ZS5jb250cm9sbGVyLmluZGV4LHI9ZS52U2NhbGUmJmUudlNjYWxlLmF4aXM7aWYocil7dHx8PWUuX3BhcnNlZDtmb3IobGV0IGUgb2YgdCl7bGV0IHQ9ZS5fc3RhY2tzO2lmKCF0fHx0W3JdPT09dm9pZCAwfHx0W3JdW25dPT09dm9pZCAwKXJldHVybjtkZWxldGUgdFtyXVtuXSx0W3JdLl92aXN1YWxWYWx1ZXMhPT12b2lkIDAmJnRbcl0uX3Zpc3VhbFZhbHVlc1tuXSE9PXZvaWQgMCYmZGVsZXRlIHRbcl0uX3Zpc3VhbFZhbHVlc1tuXX19fXZhciBvbD1lPT5lPT09YHJlc2V0YHx8ZT09PWBub25lYCxzbD0oZSx0KT0+dD9lOk9iamVjdC5hc3NpZ24oe30sZSksY2w9KGUsdCxuKT0+ZSYmIXQuaGlkZGVuJiZ0Ll9zdGFja2VkJiZ7a2V5czpxYyhuLCEwKSx2YWx1ZXM6bnVsbH0sbGw9Y2xhc3N7c3RhdGljIGRlZmF1bHRzPXt9O3N0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGU9bnVsbDtzdGF0aWMgZGF0YUVsZW1lbnRUeXBlPW51bGw7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoYXJ0PWUsdGhpcy5fY3R4PWUuY3R4LHRoaXMuaW5kZXg9dCx0aGlzLl9jYWNoZWREYXRhT3B0cz17fSx0aGlzLl9jYWNoZWRNZXRhPXRoaXMuZ2V0TWV0YSgpLHRoaXMuX3R5cGU9dGhpcy5fY2FjaGVkTWV0YS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5fcGFyc2luZz0hMSx0aGlzLl9kYXRhPXZvaWQgMCx0aGlzLl9vYmplY3REYXRhPXZvaWQgMCx0aGlzLl9zaGFyZWRPcHRpb25zPXZvaWQgMCx0aGlzLl9kcmF3U3RhcnQ9dm9pZCAwLHRoaXMuX2RyYXdDb3VudD12b2lkIDAsdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSExLHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlLHRoaXMuZGF0YUVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlLHRoaXMuaW5pdGlhbGl6ZSgpfWluaXRpYWxpemUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuY29uZmlndXJlKCksdGhpcy5saW5rU2NhbGVzKCksZS5fc3RhY2tlZD1YYyhlLnZTY2FsZSxlKSx0aGlzLmFkZEVsZW1lbnRzKCksdGhpcy5vcHRpb25zLmZpbGwmJiF0aGlzLmNoYXJ0LmlzUGx1Z2luRW5hYmxlZChgZmlsbGVyYCkmJmNvbnNvbGUud2FybihgVHJpZWQgdG8gdXNlIHRoZSAnZmlsbCcgb3B0aW9uIHdpdGhvdXQgdGhlICdGaWxsZXInIHBsdWdpbiBlbmFibGVkLiBQbGVhc2UgaW1wb3J0IGFuZCByZWdpc3RlciB0aGUgJ0ZpbGxlcicgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGRpc2FibGVkIGluIHRoZSBvcHRpb25zYCl9dXBkYXRlSW5kZXgoZSl7dGhpcy5pbmRleCE9PWUmJmFsKHRoaXMuX2NhY2hlZE1ldGEpLHRoaXMuaW5kZXg9ZX1saW5rU2NhbGVzKCl7bGV0IGU9dGhpcy5jaGFydCx0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPShlLHQsbixyKT0+ZT09PWB4YD90OmU9PT1gcmA/cjpuLGk9dC54QXhpc0lEPXEobi54QXhpc0lELG5sKGUsYHhgKSksYT10LnlBeGlzSUQ9cShuLnlBeGlzSUQsbmwoZSxgeWApKSxvPXQuckF4aXNJRD1xKG4uckF4aXNJRCxubChlLGByYCkpLHM9dC5pbmRleEF4aXMsYz10LmlBeGlzSUQ9cihzLGksYSxvKSxsPXQudkF4aXNJRD1yKHMsYSxpLG8pO3QueFNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChpKSx0LnlTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQoYSksdC5yU2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKG8pLHQuaVNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChjKSx0LnZTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQobCl9Z2V0RGF0YXNldCgpe3JldHVybiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbdGhpcy5pbmRleF19Z2V0TWV0YSgpe3JldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpfWdldFNjYWxlRm9ySWQoZSl7cmV0dXJuIHRoaXMuY2hhcnQuc2NhbGVzW2VdfV9nZXRPdGhlclNjYWxlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7cmV0dXJuIGU9PT10LmlTY2FsZT90LnZTY2FsZTp0LmlTY2FsZX1yZXNldCgpe3RoaXMuX3VwZGF0ZShgcmVzZXRgKX1fZGVzdHJveSgpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5fZGF0YSYmcW8odGhpcy5fZGF0YSx0aGlzKSxlLl9zdGFja2VkJiZhbChlKX1fZGF0YUNoZWNrKCl7bGV0IGU9dGhpcy5nZXREYXRhc2V0KCksdD1lLmRhdGF8fD1bXSxuPXRoaXMuX2RhdGE7aWYoRyh0KSl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLl9kYXRhPVljKHQsZSl9ZWxzZSBpZihuIT09dCl7aWYobil7cW8obix0aGlzKTtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO2FsKGUpLGUuX3BhcnNlZD1bXX10JiZPYmplY3QuaXNFeHRlbnNpYmxlKHQpJiZLbyh0LHRoaXMpLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuX2RhdGE9dH19YWRkRWxlbWVudHMoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMuX2RhdGFDaGVjaygpLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlJiYoZS5kYXRhc2V0PW5ldyB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSl9YnVpbGRPclVwZGF0ZUVsZW1lbnRzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEsbj10aGlzLmdldERhdGFzZXQoKSxyPSExO3RoaXMuX2RhdGFDaGVjaygpO2xldCBpPXQuX3N0YWNrZWQ7dC5fc3RhY2tlZD1YYyh0LnZTY2FsZSx0KSx0LnN0YWNrIT09bi5zdGFjayYmKHI9ITAsYWwodCksdC5zdGFjaz1uLnN0YWNrKSx0aGlzLl9yZXN5bmNFbGVtZW50cyhlKSwocnx8aSE9PXQuX3N0YWNrZWQpJiYodGwodGhpcyx0Ll9wYXJzZWQpLHQuX3N0YWNrZWQ9WGModC52U2NhbGUsdCkpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMuY2hhcnQuY29uZmlnLHQ9ZS5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpLG49ZS5nZXRPcHRpb25TY29wZXModGhpcy5nZXREYXRhc2V0KCksdCwhMCk7dGhpcy5vcHRpb25zPWUuY3JlYXRlUmVzb2x2ZXIobix0aGlzLmdldENvbnRleHQoKSksdGhpcy5fcGFyc2luZz10aGlzLm9wdGlvbnMucGFyc2luZyx0aGlzLl9jYWNoZWREYXRhT3B0cz17fX1wYXJzZShlLHQpe2xldHtfY2FjaGVkTWV0YTpuLF9kYXRhOnJ9PXRoaXMse2lTY2FsZTppLF9zdGFja2VkOmF9PW4sbz1pLmF4aXMscz1lPT09MCYmdD09PXIubGVuZ3RofHxuLl9zb3J0ZWQsYz1lPjAmJm4uX3BhcnNlZFtlLTFdLGwsdSxkO2lmKHRoaXMuX3BhcnNpbmc9PT0hMSluLl9wYXJzZWQ9cixuLl9zb3J0ZWQ9ITAsZD1yO2Vsc2V7ZD1XKHJbZV0pP3RoaXMucGFyc2VBcnJheURhdGEobixyLGUsdCk6RyhyW2VdKT90aGlzLnBhcnNlT2JqZWN0RGF0YShuLHIsZSx0KTp0aGlzLnBhcnNlUHJpbWl0aXZlRGF0YShuLHIsZSx0KTtsZXQgaT0oKT0+dVtvXT09PW51bGx8fGMmJnVbb108Y1tvXTtmb3IobD0wO2w8dDsrK2wpbi5fcGFyc2VkW2wrZV09dT1kW2xdLHMmJihpKCkmJihzPSExKSxjPXUpO24uX3NvcnRlZD1zfWEmJnRsKHRoaXMsZCl9cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSxvPWkuYXhpcyxzPWEuYXhpcyxjPWkuZ2V0TGFiZWxzKCksbD1pPT09YSx1PUFycmF5KHIpLGQsZixwO2ZvcihkPTAsZj1yO2Q8ZjsrK2QpcD1kK24sdVtkXT17W29dOmx8fGkucGFyc2UoY1twXSxwKSxbc106YS5wYXJzZSh0W3BdLHApfTtyZXR1cm4gdX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtsZXR7eFNjYWxlOmkseVNjYWxlOmF9PWUsbz1BcnJheShyKSxzLGMsbCx1O2ZvcihzPTAsYz1yO3M8YzsrK3MpbD1zK24sdT10W2xdLG9bc109e3g6aS5wYXJzZSh1WzBdLGwpLHk6YS5wYXJzZSh1WzFdLGwpfTtyZXR1cm4gb31wYXJzZU9iamVjdERhdGEoZSx0LG4scil7bGV0e3hTY2FsZTppLHlTY2FsZTphfT1lLHt4QXhpc0tleTpvPWB4YCx5QXhpc0tleTpzPWB5YH09dGhpcy5fcGFyc2luZyxjPUFycmF5KHIpLGwsdSxkLGY7Zm9yKGw9MCx1PXI7bDx1OysrbClkPWwrbixmPXRbZF0sY1tsXT17eDppLnBhcnNlKGxvKGYsbyksZCkseTphLnBhcnNlKGxvKGYscyksZCl9O3JldHVybiBjfWdldFBhcnNlZChlKXtyZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2VdfWdldERhdGFFbGVtZW50KGUpe3JldHVybiB0aGlzLl9jYWNoZWRNZXRhLmRhdGFbZV19YXBwbHlTdGFjayhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZE1ldGEsYT10W2UuYXhpc107cmV0dXJuIEpjKHtrZXlzOnFjKHIsITApLHZhbHVlczp0Ll9zdGFja3NbZS5heGlzXS5fdmlzdWFsVmFsdWVzfSxhLGkuaW5kZXgse21vZGU6bn0pfXVwZGF0ZVJhbmdlRnJvbVBhcnNlZChlLHQsbixyKXtsZXQgaT1uW3QuYXhpc10sYT1pPT09bnVsbD9OYU46aSxvPXImJm4uX3N0YWNrc1t0LmF4aXNdO3ImJm8mJihyLnZhbHVlcz1vLGE9SmMocixpLHRoaXMuX2NhY2hlZE1ldGEuaW5kZXgpKSxlLm1pbj1NYXRoLm1pbihlLm1pbixhKSxlLm1heD1NYXRoLm1heChlLm1heCxhKX1nZXRNaW5NYXgoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5fcGFyc2VkLGk9bi5fc29ydGVkJiZlPT09bi5pU2NhbGUsYT1yLmxlbmd0aCxvPXRoaXMuX2dldE90aGVyU2NhbGUoZSkscz1jbCh0LG4sdGhpcy5jaGFydCksYz17bWluOjEvMCxtYXg6LTEvMH0se21pbjpsLG1heDp1fT1RYyhvKSxkLGY7ZnVuY3Rpb24gcCgpe2Y9cltkXTtsZXQgdD1mW28uYXhpc107cmV0dXJuIUsoZltlLmF4aXNdKXx8bD50fHx1PHR9Zm9yKGQ9MDtkPGEmJiEoIXAoKSYmKHRoaXMudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGMsZSxmLHMpLGkpKTsrK2QpO2lmKGkpe2ZvcihkPWEtMTtkPj0wOy0tZClpZighcCgpKXt0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChjLGUsZixzKTticmVha319cmV0dXJuIGN9Z2V0QWxsUGFyc2VkVmFsdWVzKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuX3BhcnNlZCxuPVtdLHIsaSxhO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWE9dFtyXVtlLmF4aXNdLEsoYSkmJm4ucHVzaChhKTtyZXR1cm4gbn1nZXRNYXhPdmVyZmxvdygpe3JldHVybiExfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0IHQ9dGhpcy5fY2FjaGVkTWV0YSxuPXQuaVNjYWxlLHI9dC52U2NhbGUsaT10aGlzLmdldFBhcnNlZChlKTtyZXR1cm57bGFiZWw6bj9gYCtuLmdldExhYmVsRm9yVmFsdWUoaVtuLmF4aXNdKTpgYCx2YWx1ZTpyP2BgK3IuZ2V0TGFiZWxGb3JWYWx1ZShpW3IuYXhpc10pOmBgfX1fdXBkYXRlKGUpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy51cGRhdGUoZXx8YGRlZmF1bHRgKSx0Ll9jbGlwPUtjKHEodGhpcy5vcHRpb25zLmNsaXAsR2ModC54U2NhbGUsdC55U2NhbGUsdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpfXVwZGF0ZShlKXt9ZHJhdygpe2xldCBlPXRoaXMuX2N0eCx0PXRoaXMuY2hhcnQsbj10aGlzLl9jYWNoZWRNZXRhLHI9bi5kYXRhfHxbXSxpPXQuY2hhcnRBcmVhLGE9W10sbz10aGlzLl9kcmF3U3RhcnR8fDAscz10aGlzLl9kcmF3Q291bnR8fHIubGVuZ3RoLW8sYz10aGlzLm9wdGlvbnMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AsbDtmb3Iobi5kYXRhc2V0JiZuLmRhdGFzZXQuZHJhdyhlLGksbyxzKSxsPW87bDxvK3M7KytsKXtsZXQgdD1yW2xdO3QuaGlkZGVufHwodC5hY3RpdmUmJmM/YS5wdXNoKHQpOnQuZHJhdyhlLGkpKX1mb3IobD0wO2w8YS5sZW5ndGg7KytsKWFbbF0uZHJhdyhlLGkpfWdldFN0eWxlKGUsdCl7bGV0IG49dD9gYWN0aXZlYDpgZGVmYXVsdGA7cmV0dXJuIGU9PT12b2lkIDAmJnRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldD90aGlzLnJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMobik6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGV8fDAsbil9Z2V0Q29udGV4dChlLHQsbil7bGV0IHI9dGhpcy5nZXREYXRhc2V0KCksaTtpZihlPj0wJiZlPHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGgpe2xldCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YVtlXTtpPXQuJGNvbnRleHR8fD1pbCh0aGlzLmdldENvbnRleHQoKSxlLHQpLGkucGFyc2VkPXRoaXMuZ2V0UGFyc2VkKGUpLGkucmF3PXIuZGF0YVtlXSxpLmluZGV4PWkuZGF0YUluZGV4PWV9ZWxzZSBpPXRoaXMuJGNvbnRleHR8fD1ybCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLmluZGV4KSxpLmRhdGFzZXQ9cixpLmluZGV4PWkuZGF0YXNldEluZGV4PXRoaXMuaW5kZXg7cmV0dXJuIGkuYWN0aXZlPSEhdCxpLm1vZGU9bixpfXJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCxlKX1yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGUsdCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCx0LGUpfV9yZXNvbHZlRWxlbWVudE9wdGlvbnMoZSx0PWBkZWZhdWx0YCxuKXtsZXQgcj10PT09YGFjdGl2ZWAsaT10aGlzLl9jYWNoZWREYXRhT3B0cyxhPWUrYC1gK3Qsbz1pW2FdLHM9dGhpcy5lbmFibGVPcHRpb25TaGFyaW5nJiZmbyhuKTtpZihvKXJldHVybiBzbChvLHMpO2xldCBjPXRoaXMuY2hhcnQuY29uZmlnLGw9Yy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLGUpLHU9cj9bYCR7ZX1Ib3ZlcmAsYGhvdmVyYCxlLGBgXTpbZSxgYF0sZD1jLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxsKSxmPU9iamVjdC5rZXlzKFouZWxlbWVudHNbZV0pLHA9Yy5yZXNvbHZlTmFtZWRPcHRpb25zKGQsZiwoKT0+dGhpcy5nZXRDb250ZXh0KG4scix0KSx1KTtyZXR1cm4gcC4kc2hhcmVkJiYocC4kc2hhcmVkPXMsaVthXT1PYmplY3QuZnJlZXplKHNsKHAscykpKSxwfV9yZXNvbHZlQW5pbWF0aW9ucyhlLHQsbil7bGV0IHI9dGhpcy5jaGFydCxpPXRoaXMuX2NhY2hlZERhdGFPcHRzLGE9YGFuaW1hdGlvbi0ke3R9YCxvPWlbYV07aWYobylyZXR1cm4gbztsZXQgcztpZihyLm9wdGlvbnMuYW5pbWF0aW9uIT09ITEpe2xldCByPXRoaXMuY2hhcnQuY29uZmlnLGk9ci5kYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKHRoaXMuX3R5cGUsdCksYT1yLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxpKTtzPXIuY3JlYXRlUmVzb2x2ZXIoYSx0aGlzLmdldENvbnRleHQoZSxuLHQpKX1sZXQgYz1uZXcgVmMocixzJiZzLmFuaW1hdGlvbnMpO3JldHVybiBzJiZzLl9jYWNoZWFibGUmJihpW2FdPU9iamVjdC5mcmVlemUoYykpLGN9Z2V0U2hhcmVkT3B0aW9ucyhlKXtpZihlLiRzaGFyZWQpcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnN8fD1PYmplY3QuYXNzaWduKHt9LGUpfWluY2x1ZGVPcHRpb25zKGUsdCl7cmV0dXJuIXR8fG9sKGUpfHx0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWR9X2dldFNoYXJlZE9wdGlvbnMoZSx0KXtsZXQgbj10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZSx0KSxyPXRoaXMuX3NoYXJlZE9wdGlvbnMsaT10aGlzLmdldFNoYXJlZE9wdGlvbnMobiksYT10aGlzLmluY2x1ZGVPcHRpb25zKHQsaSl8fGkhPT1yO3JldHVybiB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoaSx0LG4pLHtzaGFyZWRPcHRpb25zOmksaW5jbHVkZU9wdGlvbnM6YX19dXBkYXRlRWxlbWVudChlLHQsbixyKXtvbChyKT9PYmplY3QuYXNzaWduKGUsbik6dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxyKS51cGRhdGUoZSxuKX11cGRhdGVTaGFyZWRPcHRpb25zKGUsdCxuKXtlJiYhb2wodCkmJnRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCx0KS51cGRhdGUoZSxuKX1fc2V0U3R5bGUoZSx0LG4scil7ZS5hY3RpdmU9cjtsZXQgaT10aGlzLmdldFN0eWxlKHQscik7dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModCxuLHIpLnVwZGF0ZShlLHtvcHRpb25zOiFyJiZ0aGlzLmdldFNoYXJlZE9wdGlvbnMoaSl8fGl9KX1yZW1vdmVIb3ZlclN0eWxlKGUsdCxuKXt0aGlzLl9zZXRTdHlsZShlLG4sYGFjdGl2ZWAsITEpfXNldEhvdmVyU3R5bGUoZSx0LG4pe3RoaXMuX3NldFN0eWxlKGUsbixgYWN0aXZlYCwhMCl9X3JlbW92ZURhdGFzZXRIb3ZlclN0eWxlKCl7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O2UmJnRoaXMuX3NldFN0eWxlKGUsdm9pZCAwLGBhY3RpdmVgLCExKX1fc2V0RGF0YXNldEhvdmVyU3R5bGUoKXtsZXQgZT10aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7ZSYmdGhpcy5fc2V0U3R5bGUoZSx2b2lkIDAsYGFjdGl2ZWAsITApfV9yZXN5bmNFbGVtZW50cyhlKXtsZXQgdD10aGlzLl9kYXRhLG49dGhpcy5fY2FjaGVkTWV0YS5kYXRhO2ZvcihsZXRbZSx0LG5db2YgdGhpcy5fc3luY0xpc3QpdGhpc1tlXSh0LG4pO3RoaXMuX3N5bmNMaXN0PVtdO2xldCByPW4ubGVuZ3RoLGk9dC5sZW5ndGgsYT1NYXRoLm1pbihpLHIpO2EmJnRoaXMucGFyc2UoMCxhKSxpPnI/dGhpcy5faW5zZXJ0RWxlbWVudHMocixpLXIsZSk6aTxyJiZ0aGlzLl9yZW1vdmVFbGVtZW50cyhpLHItaSl9X2luc2VydEVsZW1lbnRzKGUsdCxuPSEwKXtsZXQgcj10aGlzLl9jYWNoZWRNZXRhLGk9ci5kYXRhLGE9ZSt0LG8scz1lPT57Zm9yKGUubGVuZ3RoKz10LG89ZS5sZW5ndGgtMTtvPj1hO28tLSllW29dPWVbby10XX07Zm9yKHMoaSksbz1lO288YTsrK28paVtvXT1uZXcgdGhpcy5kYXRhRWxlbWVudFR5cGU7dGhpcy5fcGFyc2luZyYmcyhyLl9wYXJzZWQpLHRoaXMucGFyc2UoZSx0KSxuJiZ0aGlzLnVwZGF0ZUVsZW1lbnRzKGksZSx0LGByZXNldGApfXVwZGF0ZUVsZW1lbnRzKGUsdCxuLHIpe31fcmVtb3ZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9jYWNoZWRNZXRhO2lmKHRoaXMuX3BhcnNpbmcpe2xldCByPW4uX3BhcnNlZC5zcGxpY2UoZSx0KTtuLl9zdGFja2VkJiZhbChuLHIpfW4uZGF0YS5zcGxpY2UoZSx0KX1fc3luYyhlKXtpZih0aGlzLl9wYXJzaW5nKXRoaXMuX3N5bmNMaXN0LnB1c2goZSk7ZWxzZXtsZXRbdCxuLHJdPWU7dGhpc1t0XShuLHIpfXRoaXMuY2hhcnQuX2RhdGFDaGFuZ2VzLnB1c2goW3RoaXMuaW5kZXgsLi4uZV0pfV9vbkRhdGFQdXNoKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aDt0aGlzLl9zeW5jKFtgX2luc2VydEVsZW1lbnRzYCx0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aC1lLGVdKX1fb25EYXRhUG9wKCl7dGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aC0xLDFdKX1fb25EYXRhU2hpZnQoKXt0aGlzLl9zeW5jKFtgX3JlbW92ZUVsZW1lbnRzYCwwLDFdKX1fb25EYXRhU3BsaWNlKGUsdCl7dCYmdGhpcy5fc3luYyhbYF9yZW1vdmVFbGVtZW50c2AsZSx0XSk7bGV0IG49YXJndW1lbnRzLmxlbmd0aC0yO24mJnRoaXMuX3N5bmMoW2BfaW5zZXJ0RWxlbWVudHNgLGUsbl0pfV9vbkRhdGFVbnNoaWZ0KCl7dGhpcy5fc3luYyhbYF9pbnNlcnRFbGVtZW50c2AsMCxhcmd1bWVudHMubGVuZ3RoXSl9fTtmdW5jdGlvbiB1bChlLHQpe2lmKCFlLl9jYWNoZS4kYmFyKXtsZXQgbj1lLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHQpLHI9W107Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKXI9ci5jb25jYXQoblt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhlKSk7ZS5fY2FjaGUuJGJhcj1KbyhyLnNvcnQoKGUsdCk9PmUtdCkpfXJldHVybiBlLl9jYWNoZS4kYmFyfWZ1bmN0aW9uIGRsKGUpe2xldCB0PWUuaVNjYWxlLG49dWwodCxlLnR5cGUpLHI9dC5fbGVuZ3RoLGksYSxvLHMsYz0oKT0+e28hPT0zMjc2NyYmbyE9PS0zMjc2OCYmKGZvKHMpJiYocj1NYXRoLm1pbihyLE1hdGguYWJzKG8tcyl8fHIpKSxzPW8pfTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhOysraSlvPXQuZ2V0UGl4ZWxGb3JWYWx1ZShuW2ldKSxjKCk7Zm9yKHM9dm9pZCAwLGk9MCxhPXQudGlja3MubGVuZ3RoO2k8YTsrK2kpbz10LmdldFBpeGVsRm9yVGljayhpKSxjKCk7cmV0dXJuIHJ9ZnVuY3Rpb24gZmwoZSx0LG4scil7bGV0IGk9bi5iYXJUaGlja25lc3MsYSxvO3JldHVybiBVKGkpPyhhPXQubWluKm4uY2F0ZWdvcnlQZXJjZW50YWdlLG89bi5iYXJQZXJjZW50YWdlKTooYT1pKnIsbz0xKSx7Y2h1bms6YS9yLHJhdGlvOm8sc3RhcnQ6dC5waXhlbHNbZV0tYS8yfX1mdW5jdGlvbiBwbChlLHQsbixyKXtsZXQgaT10LnBpeGVscyxhPWlbZV0sbz1lPjA/aVtlLTFdOm51bGwscz1lPGkubGVuZ3RoLTE/aVtlKzFdOm51bGwsYz1uLmNhdGVnb3J5UGVyY2VudGFnZTtvPT09bnVsbCYmKG89YS0ocz09PW51bGw/dC5lbmQtdC5zdGFydDpzLWEpKSxzPT09bnVsbCYmKHM9YSthLW8pO2xldCBsPWEtKGEtTWF0aC5taW4obyxzKSkvMipjO3JldHVybntjaHVuazpNYXRoLmFicyhzLW8pLzIqYy9yLHJhdGlvOm4uYmFyUGVyY2VudGFnZSxzdGFydDpsfX1mdW5jdGlvbiBtbChlLHQsbixyKXtsZXQgaT1uLnBhcnNlKGVbMF0sciksYT1uLnBhcnNlKGVbMV0sciksbz1NYXRoLm1pbihpLGEpLHM9TWF0aC5tYXgoaSxhKSxjPW8sbD1zO01hdGguYWJzKG8pPk1hdGguYWJzKHMpJiYoYz1zLGw9byksdFtuLmF4aXNdPWwsdC5fY3VzdG9tPXtiYXJTdGFydDpjLGJhckVuZDpsLHN0YXJ0OmksZW5kOmEsbWluOm8sbWF4OnN9fWZ1bmN0aW9uIGhsKGUsdCxuLHIpe3JldHVybiBXKGUpP21sKGUsdCxuLHIpOnRbbi5heGlzXT1uLnBhcnNlKGUsciksdH1mdW5jdGlvbiBnbChlLHQsbixyKXtsZXQgaT1lLmlTY2FsZSxhPWUudlNjYWxlLG89aS5nZXRMYWJlbHMoKSxzPWk9PT1hLGM9W10sbCx1LGQsZjtmb3IobD1uLHU9bityO2w8dTsrK2wpZj10W2xdLGQ9e30sZFtpLmF4aXNdPXN8fGkucGFyc2Uob1tsXSxsKSxjLnB1c2goaGwoZixkLGEsbCkpO3JldHVybiBjfWZ1bmN0aW9uIF9sKGUpe3JldHVybiBlJiZlLmJhclN0YXJ0IT09dm9pZCAwJiZlLmJhckVuZCE9PXZvaWQgMH1mdW5jdGlvbiB2bChlLHQsbil7cmV0dXJuIGU9PT0wPyh0LmlzSG9yaXpvbnRhbCgpPzE6LTEpKih0Lm1pbj49bj8xOi0xKTpDbyhlKX1mdW5jdGlvbiB5bChlKXtsZXQgdCxuLHIsaSxhO3JldHVybiBlLmhvcml6b250YWw/KHQ9ZS5iYXNlPmUueCxuPWBsZWZ0YCxyPWByaWdodGApOih0PWUuYmFzZTxlLnksbj1gYm90dG9tYCxyPWB0b3BgKSx0PyhpPWBlbmRgLGE9YHN0YXJ0YCk6KGk9YHN0YXJ0YCxhPWBlbmRgKSx7c3RhcnQ6bixlbmQ6cixyZXZlcnNlOnQsdG9wOmksYm90dG9tOmF9fWZ1bmN0aW9uIGJsKGUsdCxuLHIpe2xldCBpPXQuYm9yZGVyU2tpcHBlZCxhPXt9O2lmKCFpKXtlLmJvcmRlclNraXBwZWQ9YTtyZXR1cm59aWYoaT09PSEwKXtlLmJvcmRlclNraXBwZWQ9e3RvcDohMCxyaWdodDohMCxib3R0b206ITAsbGVmdDohMH07cmV0dXJufWxldHtzdGFydDpvLGVuZDpzLHJldmVyc2U6Yyx0b3A6bCxib3R0b206dX09eWwoZSk7aT09PWBtaWRkbGVgJiZuJiYoZS5lbmFibGVCb3JkZXJSYWRpdXM9ITAsKG4uX3RvcHx8MCk9PT1yP2k9bDoobi5fYm90dG9tfHwwKT09PXI/aT11OihhW3hsKHUsbyxzLGMpXT0hMCxpPWwpKSxhW3hsKGksbyxzLGMpXT0hMCxlLmJvcmRlclNraXBwZWQ9YX1mdW5jdGlvbiB4bChlLHQsbixyKXtyZXR1cm4gcj8oZT1TbChlLHQsbiksZT1DbChlLG4sdCkpOmU9Q2woZSx0LG4pLGV9ZnVuY3Rpb24gU2woZSx0LG4pe3JldHVybiBlPT09dD9uOmU9PT1uP3Q6ZX1mdW5jdGlvbiBDbChlLHQsbil7cmV0dXJuIGU9PT1gc3RhcnRgP3Q6ZT09PWBlbmRgP246ZX1mdW5jdGlvbiB3bChlLHtpbmZsYXRlQW1vdW50OnR9LG4pe2UuaW5mbGF0ZUFtb3VudD10PT09YGF1dG9gP249PT0xPy4zMzowOnR9dmFyIFRsPWNsYXNzIGV4dGVuZHMgbGx7c3RhdGljIGlkPWBiYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiExLGRhdGFFbGVtZW50VHlwZTpgYmFyYCxjYXRlZ29yeVBlcmNlbnRhZ2U6LjgsYmFyUGVyY2VudGFnZTouOSxncm91cGVkOiEwLGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgYmFzZWAsYHdpZHRoYCxgaGVpZ2h0YF19fX07c3RhdGljIG92ZXJyaWRlcz17c2NhbGVzOntfaW5kZXhfOnt0eXBlOmBjYXRlZ29yeWAsb2Zmc2V0OiEwLGdyaWQ6e29mZnNldDohMH19LF92YWx1ZV86e3R5cGU6YGxpbmVhcmAsYmVnaW5BdFplcm86ITB9fX07cGFyc2VQcmltaXRpdmVEYXRhKGUsdCxuLHIpe3JldHVybiBnbChlLHQsbixyKX1wYXJzZUFycmF5RGF0YShlLHQsbixyKXtyZXR1cm4gZ2woZSx0LG4scil9cGFyc2VPYmplY3REYXRhKGUsdCxuLHIpe2xldHtpU2NhbGU6aSx2U2NhbGU6YX09ZSx7eEF4aXNLZXk6bz1geGAseUF4aXNLZXk6cz1geWB9PXRoaXMuX3BhcnNpbmcsYz1pLmF4aXM9PT1geGA/bzpzLGw9YS5heGlzPT09YHhgP286cyx1PVtdLGQsZixwLG07Zm9yKGQ9bixmPW4rcjtkPGY7KytkKW09dFtkXSxwPXt9LHBbaS5heGlzXT1pLnBhcnNlKGxvKG0sYyksZCksdS5wdXNoKGhsKGxvKG0sbCkscCxhLGQpKTtyZXR1cm4gdX11cGRhdGVSYW5nZUZyb21QYXJzZWQoZSx0LG4scil7c3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGUsdCxuLHIpO2xldCBpPW4uX2N1c3RvbTtpJiZ0PT09dGhpcy5fY2FjaGVkTWV0YS52U2NhbGUmJihlLm1pbj1NYXRoLm1pbihlLm1pbixpLm1pbiksZS5tYXg9TWF0aC5tYXgoZS5tYXgsaS5tYXgpKX1nZXRNYXhPdmVyZmxvdygpe3JldHVybiAwfWdldExhYmVsQW5kVmFsdWUoZSl7bGV0e2lTY2FsZTp0LHZTY2FsZTpufT10aGlzLl9jYWNoZWRNZXRhLHI9dGhpcy5nZXRQYXJzZWQoZSksaT1yLl9jdXN0b20sYT1fbChpKT9gW2AraS5zdGFydCtgLCBgK2kuZW5kK2BdYDpgYCtuLmdldExhYmVsRm9yVmFsdWUocltuLmF4aXNdKTtyZXR1cm57bGFiZWw6YGArdC5nZXRMYWJlbEZvclZhbHVlKHJbdC5heGlzXSksdmFsdWU6YX19aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCk7bGV0IGU9dGhpcy5fY2FjaGVkTWV0YTtlLnN0YWNrPXRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrfXVwZGF0ZShlKXtsZXQgdD10aGlzLl9jYWNoZWRNZXRhO3RoaXMudXBkYXRlRWxlbWVudHModC5kYXRhLDAsdC5kYXRhLmxlbmd0aCxlKX11cGRhdGVFbGVtZW50cyhlLHQsbixyKXtsZXQgaT1yPT09YHJlc2V0YCx7aW5kZXg6YSxfY2FjaGVkTWV0YTp7dlNjYWxlOm99fT10aGlzLHM9by5nZXRCYXNlUGl4ZWwoKSxjPW8uaXNIb3Jpem9udGFsKCksbD10aGlzLl9nZXRSdWxlcigpLHtzaGFyZWRPcHRpb25zOnUsaW5jbHVkZU9wdGlvbnM6ZH09dGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyh0LHIpO2ZvcihsZXQgZj10O2Y8dCtuO2YrKyl7bGV0IHQ9dGhpcy5nZXRQYXJzZWQoZiksbj1pfHxVKHRbby5heGlzXSk/e2Jhc2U6cyxoZWFkOnN9OnRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGYpLHA9dGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoZixsKSxtPSh0Ll9zdGFja3N8fHt9KVtvLmF4aXNdLGg9e2hvcml6b250YWw6YyxiYXNlOm4uYmFzZSxlbmFibGVCb3JkZXJSYWRpdXM6IW18fF9sKHQuX2N1c3RvbSl8fGE9PT1tLl90b3B8fGE9PT1tLl9ib3R0b20seDpjP24uaGVhZDpwLmNlbnRlcix5OmM/cC5jZW50ZXI6bi5oZWFkLGhlaWdodDpjP3Auc2l6ZTpNYXRoLmFicyhuLnNpemUpLHdpZHRoOmM/TWF0aC5hYnMobi5zaXplKTpwLnNpemV9O2QmJihoLm9wdGlvbnM9dXx8dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGYsZVtmXS5hY3RpdmU/YGFjdGl2ZWA6cikpO2xldCBnPWgub3B0aW9uc3x8ZVtmXS5vcHRpb25zO2JsKGgsZyxtLGEpLHdsKGgsZyxsLnJhdGlvKSx0aGlzLnVwZGF0ZUVsZW1lbnQoZVtmXSxmLGgscil9fV9nZXRTdGFja3MoZSx0KXtsZXR7aVNjYWxlOm59PXRoaXMuX2NhY2hlZE1ldGEscj1uLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHRoaXMuX3R5cGUpLmZpbHRlcihlPT5lLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKSxpPW4ub3B0aW9ucy5zdGFja2VkLGE9W10sbz10aGlzLl9jYWNoZWRNZXRhLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKHQpLHM9byYmb1tuLmF4aXNdLGM9ZT0+e2xldCB0PWUuX3BhcnNlZC5maW5kKGU9PmVbbi5heGlzXT09PXMpLHI9dCYmdFtlLnZTY2FsZS5heGlzXTtpZihVKHIpfHxpc05hTihyKSlyZXR1cm4hMH07Zm9yKGxldCBuIG9mIHIpaWYoISh0IT09dm9pZCAwJiZjKG4pKSYmKChpPT09ITF8fGEuaW5kZXhPZihuLnN0YWNrKT09PS0xfHxpPT09dm9pZCAwJiZuLnN0YWNrPT09dm9pZCAwKSYmYS5wdXNoKG4uc3RhY2spLG4uaW5kZXg9PT1lKSlicmVhaztyZXR1cm4gYS5sZW5ndGh8fGEucHVzaCh2b2lkIDApLGF9X2dldFN0YWNrQ291bnQoZSl7cmV0dXJuIHRoaXMuX2dldFN0YWNrcyh2b2lkIDAsZSkubGVuZ3RofV9nZXRBeGlzQ291bnQoKXtyZXR1cm4gdGhpcy5fZ2V0QXhpcygpLmxlbmd0aH1nZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKXtsZXQgZT10aGlzLmNoYXJ0LnNjYWxlcyx0PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZpbHRlcihuPT5lW25dLmF4aXM9PT10KS5zaGlmdCgpfV9nZXRBeGlzKCl7bGV0IGU9e30sdD10aGlzLmdldEZpcnN0U2NhbGVJZEZvckluZGV4QXhpcygpO2ZvcihsZXQgbiBvZiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpZVtxKHRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/bi54QXhpc0lEOm4ueUF4aXNJRCx0KV09ITA7cmV0dXJuIE9iamVjdC5rZXlzKGUpfV9nZXRTdGFja0luZGV4KGUsdCxuKXtsZXQgcj10aGlzLl9nZXRTdGFja3MoZSxuKSxpPXQ9PT12b2lkIDA/LTE6ci5pbmRleE9mKHQpO3JldHVybiBpPT09LTE/ci5sZW5ndGgtMTppfV9nZXRSdWxlcigpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2NhY2hlZE1ldGEsbj10LmlTY2FsZSxyPVtdLGksYTtmb3IoaT0wLGE9dC5kYXRhLmxlbmd0aDtpPGE7KytpKXIucHVzaChuLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbbi5heGlzXSxpKSk7bGV0IG89ZS5iYXJUaGlja25lc3M7cmV0dXJue21pbjpvfHxkbCh0KSxwaXhlbHM6cixzdGFydDpuLl9zdGFydFBpeGVsLGVuZDpuLl9lbmRQaXhlbCxzdGFja0NvdW50OnRoaXMuX2dldFN0YWNrQ291bnQoKSxzY2FsZTpuLGdyb3VwZWQ6ZS5ncm91cGVkLHJhdGlvOm8/MTplLmNhdGVnb3J5UGVyY2VudGFnZSplLmJhclBlcmNlbnRhZ2V9fV9jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhlKXtsZXR7X2NhY2hlZE1ldGE6e3ZTY2FsZTp0LF9zdGFja2VkOm4saW5kZXg6cn0sb3B0aW9uczp7YmFzZTppLG1pbkJhckxlbmd0aDphfX09dGhpcyxvPWl8fDAscz10aGlzLmdldFBhcnNlZChlKSxjPXMuX2N1c3RvbSxsPV9sKGMpLHU9c1t0LmF4aXNdLGQ9MCxmPW4/dGhpcy5hcHBseVN0YWNrKHQscyxuKTp1LHAsbTtmIT09dSYmKGQ9Zi11LGY9dSksbCYmKHU9Yy5iYXJTdGFydCxmPWMuYmFyRW5kLWMuYmFyU3RhcnQsdSE9PTAmJkNvKHUpIT09Q28oYy5iYXJFbmQpJiYoZD0wKSxkKz11KTtsZXQgaD0hVShpKSYmIWw/aTpkLGc9dC5nZXRQaXhlbEZvclZhbHVlKGgpO2lmKHA9dGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShlKT90LmdldFBpeGVsRm9yVmFsdWUoZCtmKTpnLG09cC1nLE1hdGguYWJzKG0pPGEpe209dmwobSx0LG8pKmEsdT09PW8mJihnLT1tLzIpO2xldCBlPXQuZ2V0UGl4ZWxGb3JEZWNpbWFsKDApLGk9dC5nZXRQaXhlbEZvckRlY2ltYWwoMSk7Zz1NYXRoLm1heChNYXRoLm1pbihnLE1hdGgubWF4KGUsaSkpLE1hdGgubWluKGUsaSkpLHA9ZyttLG4mJiFsJiYocy5fc3RhY2tzW3QuYXhpc10uX3Zpc3VhbFZhbHVlc1tyXT10LmdldFZhbHVlRm9yUGl4ZWwocCktdC5nZXRWYWx1ZUZvclBpeGVsKGcpKX1pZihnPT09dC5nZXRQaXhlbEZvclZhbHVlKG8pKXtsZXQgZT1DbyhtKSp0LmdldExpbmVXaWR0aEZvclZhbHVlKG8pLzI7Zys9ZSxtLT1lfXJldHVybntzaXplOm0sYmFzZTpnLGhlYWQ6cCxjZW50ZXI6cCttLzJ9fV9jYWxjdWxhdGVCYXJJbmRleFBpeGVscyhlLHQpe2xldCBuPXQuc2NhbGUscj10aGlzLm9wdGlvbnMsaT1yLnNraXBOdWxsLGE9cShyLm1heEJhclRoaWNrbmVzcywxLzApLG8scyxjPXRoaXMuX2dldEF4aXNDb3VudCgpO2lmKHQuZ3JvdXBlZCl7bGV0IG49aT90aGlzLl9nZXRTdGFja0NvdW50KGUpOnQuc3RhY2tDb3VudCxsPXIuYmFyVGhpY2tuZXNzPT09YGZsZXhgP3BsKGUsdCxyLG4qYyk6ZmwoZSx0LHIsbipjKSx1PXRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXM9PT1geGA/dGhpcy5nZXREYXRhc2V0KCkueEF4aXNJRDp0aGlzLmdldERhdGFzZXQoKS55QXhpc0lELGQ9dGhpcy5fZ2V0QXhpcygpLmluZGV4T2YocSh1LHRoaXMuZ2V0Rmlyc3RTY2FsZUlkRm9ySW5kZXhBeGlzKCkpKSxmPXRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCx0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLGk/ZTp2b2lkIDApK2Q7bz1sLnN0YXJ0K2wuY2h1bmsqZitsLmNodW5rLzIscz1NYXRoLm1pbihhLGwuY2h1bmsqbC5yYXRpbyl9ZWxzZSBvPW4uZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChlKVtuLmF4aXNdLGUpLHM9TWF0aC5taW4oYSx0Lm1pbip0LnJhdGlvKTtyZXR1cm57YmFzZTpvLXMvMixoZWFkOm8rcy8yLGNlbnRlcjpvLHNpemU6c319ZHJhdygpe2xldCBlPXRoaXMuX2NhY2hlZE1ldGEsdD1lLnZTY2FsZSxuPWUuZGF0YSxyPW4ubGVuZ3RoLGk9MDtmb3IoO2k8cjsrK2kpdGhpcy5nZXRQYXJzZWQoaSlbdC5heGlzXSE9PW51bGwmJiFuW2ldLmhpZGRlbiYmbltpXS5kcmF3KHRoaXMuX2N0eCl9fTtmdW5jdGlvbiBFbCgpe3Rocm93IEVycm9yKGBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuYCl9dmFyIERsPXtfZGF0ZTpjbGFzcyBle3N0YXRpYyBvdmVycmlkZSh0KXtPYmplY3QuYXNzaWduKGUucHJvdG90eXBlLHQpfW9wdGlvbnM7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fHt9fWluaXQoKXt9Zm9ybWF0cygpe3JldHVybiBFbCgpfXBhcnNlKCl7cmV0dXJuIEVsKCl9Zm9ybWF0KCl7cmV0dXJuIEVsKCl9YWRkKCl7cmV0dXJuIEVsKCl9ZGlmZigpe3JldHVybiBFbCgpfXN0YXJ0T2YoKXtyZXR1cm4gRWwoKX1lbmRPZigpe3JldHVybiBFbCgpfX19O2Z1bmN0aW9uIE9sKGUsdCxuLHIpe2xldHtjb250cm9sbGVyOmksZGF0YTphLF9zb3J0ZWQ6b309ZSxzPWkuX2NhY2hlZE1ldGEuaVNjYWxlLGM9ZS5kYXRhc2V0JiZlLmRhdGFzZXQub3B0aW9ucz9lLmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwczpudWxsO2lmKHMmJnQ9PT1zLmF4aXMmJnQhPT1gcmAmJm8mJmEubGVuZ3RoKXtsZXQgbz1zLl9yZXZlcnNlUGl4ZWxzP1VvOkhvO2lmKCFyKXtsZXQgcj1vKGEsdCxuKTtpZihjKXtsZXR7dlNjYWxlOnR9PWkuX2NhY2hlZE1ldGEse19wYXJzZWQ6bn09ZSxhPW4uc2xpY2UoMCxyLmxvKzEpLnJldmVyc2UoKS5maW5kSW5kZXgoZT0+IVUoZVt0LmF4aXNdKSk7ci5sby09TWF0aC5tYXgoMCxhKTtsZXQgbz1uLnNsaWNlKHIuaGkpLmZpbmRJbmRleChlPT4hVShlW3QuYXhpc10pKTtyLmhpKz1NYXRoLm1heCgwLG8pfXJldHVybiByfWlmKGkuX3NoYXJlZE9wdGlvbnMpe2xldCBlPWFbMF0scj10eXBlb2YgZS5nZXRSYW5nZT09YGZ1bmN0aW9uYCYmZS5nZXRSYW5nZSh0KTtpZihyKXtsZXQgZT1vKGEsdCxuLXIpLGk9byhhLHQsbityKTtyZXR1cm57bG86ZS5sbyxoaTppLmhpfX19fXJldHVybntsbzowLGhpOmEubGVuZ3RoLTF9fWZ1bmN0aW9uIGtsKGUsdCxuLHIsaSl7bGV0IGE9ZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCksbz1uW3RdO2ZvcihsZXQgZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7bGV0e2luZGV4Om4sZGF0YTpzfT1hW2VdLHtsbzpjLGhpOmx9PU9sKGFbZV0sdCxvLGkpO2ZvcihsZXQgZT1jO2U8PWw7KytlKXtsZXQgdD1zW2VdO3Quc2tpcHx8cih0LG4sZSl9fX1mdW5jdGlvbiBBbChlKXtsZXQgdD1lLmluZGV4T2YoYHhgKSE9PS0xLG49ZS5pbmRleE9mKGB5YCkhPT0tMTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtsZXQgaT10P01hdGguYWJzKGUueC1yLngpOjAsYT1uP01hdGguYWJzKGUueS1yLnkpOjA7cmV0dXJuIE1hdGguc3FydChpKioyK2EqKjIpfX1mdW5jdGlvbiBqbChlLHQsbixyLGkpe2xldCBhPVtdO3JldHVybiFpJiYhZS5pc1BvaW50SW5BcmVhKHQpfHxrbChlLG4sdCxmdW5jdGlvbihuLG8scyl7IWkmJiFBcyhuLGUuY2hhcnRBcmVhLDApfHxuLmluUmFuZ2UodC54LHQueSxyKSYmYS5wdXNoKHtlbGVtZW50Om4sZGF0YXNldEluZGV4Om8saW5kZXg6c30pfSwhMCksYX1mdW5jdGlvbiBNbChlLHQsbixyKXtsZXQgaT1bXTtmdW5jdGlvbiBhKGUsbixhKXtsZXR7c3RhcnRBbmdsZTpvLGVuZEFuZ2xlOnN9PWUuZ2V0UHJvcHMoW2BzdGFydEFuZ2xlYCxgZW5kQW5nbGVgXSxyKSx7YW5nbGU6Y309UG8oZSx7eDp0LngseTp0Lnl9KTtMbyhjLG8scykmJmkucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpuLGluZGV4OmF9KX1yZXR1cm4ga2woZSxuLHQsYSksaX1mdW5jdGlvbiBObChlLHQsbixyLGksYSl7bGV0IG89W10scz1BbChuKSxjPTEvMDtmdW5jdGlvbiBsKG4sbCx1KXtsZXQgZD1uLmluUmFuZ2UodC54LHQueSxpKTtpZihyJiYhZClyZXR1cm47bGV0IGY9bi5nZXRDZW50ZXJQb2ludChpKTtpZighKGF8fGUuaXNQb2ludEluQXJlYShmKSkmJiFkKXJldHVybjtsZXQgcD1zKHQsZik7cDxjPyhvPVt7ZWxlbWVudDpuLGRhdGFzZXRJbmRleDpsLGluZGV4OnV9XSxjPXApOnA9PT1jJiZvLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6bCxpbmRleDp1fSl9cmV0dXJuIGtsKGUsbix0LGwpLG99ZnVuY3Rpb24gUGwoZSx0LG4scixpLGEpe3JldHVybiFhJiYhZS5pc1BvaW50SW5BcmVhKHQpP1tdOm49PT1gcmAmJiFyP01sKGUsdCxuLGkpOk5sKGUsdCxuLHIsaSxhKX1mdW5jdGlvbiBGbChlLHQsbixyLGkpe2xldCBhPVtdLG89bj09PWB4YD9gaW5YUmFuZ2VgOmBpbllSYW5nZWAscz0hMTtyZXR1cm4ga2woZSxuLHQsKGUscixjKT0+e2Vbb10mJmVbb10odFtuXSxpKSYmKGEucHVzaCh7ZWxlbWVudDplLGRhdGFzZXRJbmRleDpyLGluZGV4OmN9KSxzfHw9ZS5pblJhbmdlKHQueCx0LnksaSkpfSksciYmIXM/W106YX12YXIgSWw9e2V2YWx1YXRlSW50ZXJhY3Rpb25JdGVtczprbCxtb2Rlczp7aW5kZXgoZSx0LG4scil7bGV0IGk9U2ModCxlKSxhPW4uYXhpc3x8YHhgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKSxjPVtdO3JldHVybiBzLmxlbmd0aD8oZS5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkuZm9yRWFjaChlPT57bGV0IHQ9c1swXS5pbmRleCxuPWUuZGF0YVt0XTtuJiYhbi5za2lwJiZjLnB1c2goe2VsZW1lbnQ6bixkYXRhc2V0SW5kZXg6ZS5pbmRleCxpbmRleDp0fSl9KSxjKTpbXX0sZGF0YXNldChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMSxzPW4uaW50ZXJzZWN0P2psKGUsaSxhLHIsbyk6UGwoZSxpLGEsITEscixvKTtpZihzLmxlbmd0aD4wKXtsZXQgdD1zWzBdLmRhdGFzZXRJbmRleCxuPWUuZ2V0RGF0YXNldE1ldGEodCkuZGF0YTtzPVtdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXMucHVzaCh7ZWxlbWVudDpuW2VdLGRhdGFzZXRJbmRleDp0LGluZGV4OmV9KX1yZXR1cm4gc30scG9pbnQoZSx0LG4scil7cmV0dXJuIGpsKGUsU2ModCxlKSxuLmF4aXN8fGB4eWAscixuLmluY2x1ZGVJbnZpc2libGV8fCExKX0sbmVhcmVzdChlLHQsbixyKXtsZXQgaT1TYyh0LGUpLGE9bi5heGlzfHxgeHlgLG89bi5pbmNsdWRlSW52aXNpYmxlfHwhMTtyZXR1cm4gUGwoZSxpLGEsbi5pbnRlcnNlY3QscixvKX0seChlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB4YCxuLmludGVyc2VjdCxyKX0seShlLHQsbixyKXtyZXR1cm4gRmwoZSxTYyh0LGUpLGB5YCxuLmludGVyc2VjdCxyKX19fSxMbD1bYGxlZnRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWBdO2Z1bmN0aW9uIFJsKGUsdCl7cmV0dXJuIGUuZmlsdGVyKGU9PmUucG9zPT09dCl9ZnVuY3Rpb24gemwoZSx0KXtyZXR1cm4gZS5maWx0ZXIoZT0+TGwuaW5kZXhPZihlLnBvcyk9PT0tMSYmZS5ib3guYXhpcz09PXQpfWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIGUuc29ydCgoZSxuKT0+e2xldCByPXQ/bjplLGk9dD9lOm47cmV0dXJuIHIud2VpZ2h0PT09aS53ZWlnaHQ/ci5pbmRleC1pLmluZGV4OnIud2VpZ2h0LWkud2VpZ2h0fSl9ZnVuY3Rpb24gVmwoZSl7bGV0IHQ9W10sbixyLGksYSxvLHM7Zm9yKG49MCxyPShlfHxbXSkubGVuZ3RoO248cjsrK24paT1lW25dLHtwb3NpdGlvbjphLG9wdGlvbnM6e3N0YWNrOm8sc3RhY2tXZWlnaHQ6cz0xfX09aSx0LnB1c2goe2luZGV4Om4sYm94OmkscG9zOmEsaG9yaXpvbnRhbDppLmlzSG9yaXpvbnRhbCgpLHdlaWdodDppLndlaWdodCxzdGFjazpvJiZhK28sc3RhY2tXZWlnaHQ6c30pO3JldHVybiB0fWZ1bmN0aW9uIEhsKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBvZiBlKXtsZXR7c3RhY2s6ZSxwb3M6cixzdGFja1dlaWdodDppfT1uO2lmKCFlfHwhTGwuaW5jbHVkZXMocikpY29udGludWU7bGV0IGE9dFtlXXx8KHRbZV09e2NvdW50OjAscGxhY2VkOjAsd2VpZ2h0OjAsc2l6ZTowfSk7YS5jb3VudCsrLGEud2VpZ2h0Kz1pfXJldHVybiB0fWZ1bmN0aW9uIFVsKGUsdCl7bGV0IG49SGwoZSkse3ZCb3hNYXhXaWR0aDpyLGhCb3hNYXhIZWlnaHQ6aX09dCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7cz1lW2FdO2xldHtmdWxsU2l6ZTpvfT1zLmJveCxjPW5bcy5zdGFja10sbD1jJiZzLnN0YWNrV2VpZ2h0L2Mud2VpZ2h0O3MuaG9yaXpvbnRhbD8ocy53aWR0aD1sP2wqcjpvJiZ0LmF2YWlsYWJsZVdpZHRoLHMuaGVpZ2h0PWkpOihzLndpZHRoPXIscy5oZWlnaHQ9bD9sKmk6byYmdC5hdmFpbGFibGVIZWlnaHQpfXJldHVybiBufWZ1bmN0aW9uIFdsKGUpe2xldCB0PVZsKGUpLG49QmwodC5maWx0ZXIoZT0+ZS5ib3guZnVsbFNpemUpLCEwKSxyPUJsKFJsKHQsYGxlZnRgKSwhMCksaT1CbChSbCh0LGByaWdodGApKSxhPUJsKFJsKHQsYHRvcGApLCEwKSxvPUJsKFJsKHQsYGJvdHRvbWApKSxzPXpsKHQsYHhgKSxjPXpsKHQsYHlgKTtyZXR1cm57ZnVsbFNpemU6bixsZWZ0QW5kVG9wOnIuY29uY2F0KGEpLHJpZ2h0QW5kQm90dG9tOmkuY29uY2F0KGMpLmNvbmNhdChvKS5jb25jYXQocyksY2hhcnRBcmVhOlJsKHQsYGNoYXJ0QXJlYWApLHZlcnRpY2FsOnIuY29uY2F0KGkpLmNvbmNhdChjKSxob3Jpem9udGFsOmEuY29uY2F0KG8pLmNvbmNhdChzKX19ZnVuY3Rpb24gR2woZSx0LG4scil7cmV0dXJuIE1hdGgubWF4KGVbbl0sdFtuXSkrTWF0aC5tYXgoZVtyXSx0W3JdKX1mdW5jdGlvbiBLbChlLHQpe2UudG9wPU1hdGgubWF4KGUudG9wLHQudG9wKSxlLmxlZnQ9TWF0aC5tYXgoZS5sZWZ0LHQubGVmdCksZS5ib3R0b209TWF0aC5tYXgoZS5ib3R0b20sdC5ib3R0b20pLGUucmlnaHQ9TWF0aC5tYXgoZS5yaWdodCx0LnJpZ2h0KX1mdW5jdGlvbiBxbChlLHQsbixyKXtsZXR7cG9zOmksYm94OmF9PW4sbz1lLm1heFBhZGRpbmc7aWYoIUcoaSkpe24uc2l6ZSYmKGVbaV0tPW4uc2l6ZSk7bGV0IHQ9cltuLnN0YWNrXXx8e3NpemU6MCxjb3VudDoxfTt0LnNpemU9TWF0aC5tYXgodC5zaXplLG4uaG9yaXpvbnRhbD9hLmhlaWdodDphLndpZHRoKSxuLnNpemU9dC5zaXplL3QuY291bnQsZVtpXSs9bi5zaXplfWEuZ2V0UGFkZGluZyYmS2wobyxhLmdldFBhZGRpbmcoKSk7bGV0IHM9TWF0aC5tYXgoMCx0Lm91dGVyV2lkdGgtR2wobyxlLGBsZWZ0YCxgcmlnaHRgKSksYz1NYXRoLm1heCgwLHQub3V0ZXJIZWlnaHQtR2wobyxlLGB0b3BgLGBib3R0b21gKSksbD1zIT09ZS53LHU9YyE9PWUuaDtyZXR1cm4gZS53PXMsZS5oPWMsbi5ob3Jpem9udGFsP3tzYW1lOmwsb3RoZXI6dX06e3NhbWU6dSxvdGhlcjpsfX1mdW5jdGlvbiBKbChlKXtsZXQgdD1lLm1heFBhZGRpbmc7ZnVuY3Rpb24gbihuKXtsZXQgcj1NYXRoLm1heCh0W25dLWVbbl0sMCk7cmV0dXJuIGVbbl0rPXIscn1lLnkrPW4oYHRvcGApLGUueCs9bihgbGVmdGApLG4oYHJpZ2h0YCksbihgYm90dG9tYCl9ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj10Lm1heFBhZGRpbmc7ZnVuY3Rpb24gcihlKXtsZXQgcj17bGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9O3JldHVybiBlLmZvckVhY2goZT0+e3JbZV09TWF0aC5tYXgodFtlXSxuW2VdKX0pLHJ9cmV0dXJuIHIoZT9bYGxlZnRgLGByaWdodGBdOltgdG9wYCxgYm90dG9tYF0pfWZ1bmN0aW9uIFhsKGUsdCxuLHIpe2xldCBpPVtdLGEsbyxzLGMsbCx1O2ZvcihhPTAsbz1lLmxlbmd0aCxsPTA7YTxvOysrYSl7cz1lW2FdLGM9cy5ib3gsYy51cGRhdGUocy53aWR0aHx8dC53LHMuaGVpZ2h0fHx0LmgsWWwocy5ob3Jpem9udGFsLHQpKTtsZXR7c2FtZTpvLG90aGVyOmR9PXFsKHQsbixzLHIpO2x8PW8mJmkubGVuZ3RoLHV8fD1kLGMuZnVsbFNpemV8fGkucHVzaChzKX1yZXR1cm4gbCYmWGwoaSx0LG4scil8fHV9ZnVuY3Rpb24gWmwoZSx0LG4scixpKXtlLnRvcD1uLGUubGVmdD10LGUucmlnaHQ9dCtyLGUuYm90dG9tPW4raSxlLndpZHRoPXIsZS5oZWlnaHQ9aX1mdW5jdGlvbiBRbChlLHQsbixyKXtsZXQgaT1uLnBhZGRpbmcse3g6YSx5Om99PXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBlPXMuYm94LGM9cltzLnN0YWNrXXx8e2NvdW50OjEscGxhY2VkOjAsd2VpZ2h0OjF9LGw9cy5zdGFja1dlaWdodC9jLndlaWdodHx8MTtpZihzLmhvcml6b250YWwpe2xldCByPXQudypsLGE9Yy5zaXplfHxlLmhlaWdodDtmbyhjLnN0YXJ0KSYmKG89Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGkubGVmdCxvLG4ub3V0ZXJXaWR0aC1pLnJpZ2h0LWkubGVmdCxhKTpabChlLHQubGVmdCtjLnBsYWNlZCxvLHIsYSksYy5zdGFydD1vLGMucGxhY2VkKz1yLG89ZS5ib3R0b219ZWxzZXtsZXQgcj10LmgqbCxvPWMuc2l6ZXx8ZS53aWR0aDtmbyhjLnN0YXJ0KSYmKGE9Yy5zdGFydCksZS5mdWxsU2l6ZT9abChlLGEsaS50b3AsbyxuLm91dGVySGVpZ2h0LWkuYm90dG9tLWkudG9wKTpabChlLGEsdC50b3ArYy5wbGFjZWQsbyxyKSxjLnN0YXJ0PWEsYy5wbGFjZWQrPXIsYT1lLnJpZ2h0fX10Lng9YSx0Lnk9b312YXIgJGw9e2FkZEJveChlLHQpe2UuYm94ZXN8fD1bXSx0LmZ1bGxTaXplPXQuZnVsbFNpemV8fCExLHQucG9zaXRpb249dC5wb3NpdGlvbnx8YHRvcGAsdC53ZWlnaHQ9dC53ZWlnaHR8fDAsdC5fbGF5ZXJzPXQuX2xheWVyc3x8ZnVuY3Rpb24oKXtyZXR1cm5be3o6MCxkcmF3KGUpe3QuZHJhdyhlKX19XX0sZS5ib3hlcy5wdXNoKHQpfSxyZW1vdmVCb3goZSx0KXtsZXQgbj1lLmJveGVzP2UuYm94ZXMuaW5kZXhPZih0KTotMTtuIT09LTEmJmUuYm94ZXMuc3BsaWNlKG4sMSl9LGNvbmZpZ3VyZShlLHQsbil7dC5mdWxsU2l6ZT1uLmZ1bGxTaXplLHQucG9zaXRpb249bi5wb3NpdGlvbix0LndlaWdodD1uLndlaWdodH0sdXBkYXRlKGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXQgaT1RKGUub3B0aW9ucy5sYXlvdXQucGFkZGluZyksYT1NYXRoLm1heCh0LWkud2lkdGgsMCksbz1NYXRoLm1heChuLWkuaGVpZ2h0LDApLHM9V2woZS5ib3hlcyksYz1zLnZlcnRpY2FsLGw9cy5ob3Jpem9udGFsO1koZS5ib3hlcyxlPT57dHlwZW9mIGUuYmVmb3JlTGF5b3V0PT1gZnVuY3Rpb25gJiZlLmJlZm9yZUxheW91dCgpfSk7bGV0IHU9Yy5yZWR1Y2UoKGUsdCk9PnQuYm94Lm9wdGlvbnMmJnQuYm94Lm9wdGlvbnMuZGlzcGxheT09PSExP2U6ZSsxLDApfHwxLGQ9T2JqZWN0LmZyZWV6ZSh7b3V0ZXJXaWR0aDp0LG91dGVySGVpZ2h0Om4scGFkZGluZzppLGF2YWlsYWJsZVdpZHRoOmEsYXZhaWxhYmxlSGVpZ2h0Om8sdkJveE1heFdpZHRoOmEvMi91LGhCb3hNYXhIZWlnaHQ6by8yfSksZj1PYmplY3QuYXNzaWduKHt9LGkpO0tsKGYsUShyKSk7bGV0IHA9T2JqZWN0LmFzc2lnbih7bWF4UGFkZGluZzpmLHc6YSxoOm8seDppLmxlZnQseTppLnRvcH0saSksbT1VbChjLmNvbmNhdChsKSxkKTtYbChzLmZ1bGxTaXplLHAsZCxtKSxYbChjLHAsZCxtKSxYbChsLHAsZCxtKSYmWGwoYyxwLGQsbSksSmwocCksUWwocy5sZWZ0QW5kVG9wLHAsZCxtKSxwLngrPXAudyxwLnkrPXAuaCxRbChzLnJpZ2h0QW5kQm90dG9tLHAsZCxtKSxlLmNoYXJ0QXJlYT17bGVmdDpwLmxlZnQsdG9wOnAudG9wLHJpZ2h0OnAubGVmdCtwLncsYm90dG9tOnAudG9wK3AuaCxoZWlnaHQ6cC5oLHdpZHRoOnAud30sWShzLmNoYXJ0QXJlYSx0PT57bGV0IG49dC5ib3g7T2JqZWN0LmFzc2lnbihuLGUuY2hhcnRBcmVhKSxuLnVwZGF0ZShwLncscC5oLHtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0pfSl9fSxldT1jbGFzc3thY3F1aXJlQ29udGV4dChlLHQpe31yZWxlYXNlQ29udGV4dChlKXtyZXR1cm4hMX1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt9cmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsbil7fWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gMX1nZXRNYXhpbXVtU2l6ZShlLHQsbixyKXtyZXR1cm4gdD1NYXRoLm1heCgwLHR8fGUud2lkdGgpLG58fD1lLmhlaWdodCx7d2lkdGg6dCxoZWlnaHQ6TWF0aC5tYXgoMCxyP01hdGguZmxvb3IodC9yKTpuKX19aXNBdHRhY2hlZChlKXtyZXR1cm4hMH11cGRhdGVDb25maWcoZSl7fX0sdHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlKXtyZXR1cm4gZSYmZS5nZXRDb250ZXh0JiZlLmdldENvbnRleHQoYDJkYCl8fG51bGx9dXBkYXRlQ29uZmlnKGUpe2Uub3B0aW9ucy5hbmltYXRpb249ITF9fSxudT1gJGNoYXJ0anNgLHJ1PXt0b3VjaHN0YXJ0OmBtb3VzZWRvd25gLHRvdWNobW92ZTpgbW91c2Vtb3ZlYCx0b3VjaGVuZDpgbW91c2V1cGAscG9pbnRlcmVudGVyOmBtb3VzZWVudGVyYCxwb2ludGVyZG93bjpgbW91c2Vkb3duYCxwb2ludGVybW92ZTpgbW91c2Vtb3ZlYCxwb2ludGVydXA6YG1vdXNldXBgLHBvaW50ZXJsZWF2ZTpgbW91c2VvdXRgLHBvaW50ZXJvdXQ6YG1vdXNlb3V0YH0saXU9ZT0+ZT09PW51bGx8fGU9PT1gYDtmdW5jdGlvbiBhdShlLHQpe2xldCBuPWUuc3R5bGUscj1lLmdldEF0dHJpYnV0ZShgaGVpZ2h0YCksaT1lLmdldEF0dHJpYnV0ZShgd2lkdGhgKTtpZihlW251XT17aW5pdGlhbDp7aGVpZ2h0OnIsd2lkdGg6aSxzdHlsZTp7ZGlzcGxheTpuLmRpc3BsYXksaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGh9fX0sbi5kaXNwbGF5PW4uZGlzcGxheXx8YGJsb2NrYCxuLmJveFNpemluZz1uLmJveFNpemluZ3x8YGJvcmRlci1ib3hgLGl1KGkpKXtsZXQgdD1PYyhlLGB3aWR0aGApO3QhPT12b2lkIDAmJihlLndpZHRoPXQpfWlmKGl1KHIpKXtpZihlLnN0eWxlLmhlaWdodD09PWBgKWUuaGVpZ2h0PWUud2lkdGgvKHR8fDIpO2Vsc2V7bGV0IHQ9T2MoZSxgaGVpZ2h0YCk7dCE9PXZvaWQgMCYmKGUuaGVpZ2h0PXQpfX1yZXR1cm4gZX12YXIgb3U9RGM/e3Bhc3NpdmU6ITB9OiExO2Z1bmN0aW9uIHN1KGUsdCxuKXtlJiZlLmFkZEV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBjdShlLHQsbil7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLG91KX1mdW5jdGlvbiBsdShlLHQpe2xldCBuPXJ1W2UudHlwZV18fGUudHlwZSx7eDpyLHk6aX09U2MoZSx0KTtyZXR1cm57dHlwZTpuLGNoYXJ0OnQsbmF0aXZlOmUseDpyPT09dm9pZCAwP251bGw6cix5Omk9PT12b2lkIDA/bnVsbDppfX1mdW5jdGlvbiB1dShlLHQpe2ZvcihsZXQgbiBvZiBlKWlmKG49PT10fHxuLmNvbnRhaW5zKHQpKXJldHVybiEwfWZ1bmN0aW9uIGR1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5hZGRlZE5vZGVzLHIpLHQmJj0hdXUobi5yZW1vdmVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfWZ1bmN0aW9uIGZ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPW5ldyBNdXRhdGlvbk9ic2VydmVyKGU9PntsZXQgdD0hMTtmb3IobGV0IG4gb2YgZSl0fHw9dXUobi5yZW1vdmVkTm9kZXMsciksdCYmPSF1dShuLmFkZGVkTm9kZXMscik7dCYmbigpfSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxpfXZhciBwdT1uZXcgTWFwLG11PTA7ZnVuY3Rpb24gaHUoKXtsZXQgZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztlIT09bXUmJihtdT1lLHB1LmZvckVhY2goKHQsbik9PntuLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIT09ZSYmdCgpfSkpfWZ1bmN0aW9uIGd1KGUsdCl7cHUuc2l6ZXx8d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHJlc2l6ZWAsaHUpLHB1LnNldChlLHQpfWZ1bmN0aW9uIF91KGUpe3B1LmRlbGV0ZShlKSxwdS5zaXplfHx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVzaXplYCxodSl9ZnVuY3Rpb24gdnUoZSx0LG4pe2xldCByPWUuY2FudmFzLGk9ciYmbWMocik7aWYoIWkpcmV0dXJuO2xldCBhPVhvKChlLHQpPT57bGV0IHI9aS5jbGllbnRXaWR0aDtuKGUsdCkscjxpLmNsaWVudFdpZHRoJiZuKCl9LHdpbmRvdyksbz1uZXcgUmVzaXplT2JzZXJ2ZXIoZT0+e2xldCB0PWVbMF0sbj10LmNvbnRlbnRSZWN0LndpZHRoLHI9dC5jb250ZW50UmVjdC5oZWlnaHQ7KG4hPT0wfHxyIT09MCkmJmEobixyKX0pO3JldHVybiBvLm9ic2VydmUoaSksZ3UoZSxhKSxvfWZ1bmN0aW9uIHl1KGUsdCxuKXtuJiZuLmRpc2Nvbm5lY3QoKSx0PT09YHJlc2l6ZWAmJl91KGUpfWZ1bmN0aW9uIGJ1KGUsdCxuKXtsZXQgcj1lLmNhbnZhcyxpPVhvKHQ9PntlLmN0eCE9PW51bGwmJm4obHUodCxlKSl9LGUpO3JldHVybiBzdShyLHQsaSksaX12YXIgeHU9Y2xhc3MgZXh0ZW5kcyBldXthY3F1aXJlQ29udGV4dChlLHQpe2xldCBuPWUmJmUuZ2V0Q29udGV4dCYmZS5nZXRDb250ZXh0KGAyZGApO3JldHVybiBuJiZuLmNhbnZhcz09PWU/KGF1KGUsdCksbik6bnVsbH1yZWxlYXNlQ29udGV4dChlKXtsZXQgdD1lLmNhbnZhcztpZighdFtudV0pcmV0dXJuITE7bGV0IG49dFtudV0uaW5pdGlhbDtbYGhlaWdodGAsYHdpZHRoYF0uZm9yRWFjaChlPT57bGV0IHI9bltlXTtVKHIpP3QucmVtb3ZlQXR0cmlidXRlKGUpOnQuc2V0QXR0cmlidXRlKGUscil9KTtsZXQgcj1uLnN0eWxlfHx7fTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChlPT57dC5zdHlsZVtlXT1yW2VdfSksdC53aWR0aD10LndpZHRoLGRlbGV0ZSB0W251XSwhMH1hZGRFdmVudExpc3RlbmVyKGUsdCxuKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KTtsZXQgcj1lLiRwcm94aWVzfHw9e307clt0XT0oe2F0dGFjaDpkdSxkZXRhY2g6ZnUscmVzaXplOnZ1fVt0XXx8YnUpKGUsdCxuKX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IG49ZS4kcHJveGllc3x8PXt9LHI9blt0XTtyJiYoKHthdHRhY2g6eXUsZGV0YWNoOnl1LHJlc2l6ZTp5dX1bdF18fGN1KShlLHQsciksblt0XT12b2lkIDApfWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW99Z2V0TWF4aW11bVNpemUoZSx0LG4scil7cmV0dXJuIFRjKGUsdCxuLHIpfWlzQXR0YWNoZWQoZSl7bGV0IHQ9ZSYmbWMoZSk7cmV0dXJuISEodCYmdC5pc0Nvbm5lY3RlZCl9fTtmdW5jdGlvbiBTdShlKXtyZXR1cm4hcGMoKXx8dHlwZW9mIE9mZnNjcmVlbkNhbnZhczxgdWAmJmUgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXM/dHU6eHV9dmFyIEN1PWNsYXNze3N0YXRpYyBkZWZhdWx0cz17fTtzdGF0aWMgZGVmYXVsdFJvdXRlcz12b2lkIDA7eDt5O2FjdGl2ZT0hMTtvcHRpb25zOyRhbmltYXRpb25zO3Rvb2x0aXBQb3NpdGlvbihlKXtsZXR7eDp0LHk6bn09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YF0sZSk7cmV0dXJue3g6dCx5Om59fWhhc1ZhbHVlKCl7cmV0dXJuIE9vKHRoaXMueCkmJk9vKHRoaXMueSl9Z2V0UHJvcHMoZSx0KXtsZXQgbj10aGlzLiRhbmltYXRpb25zO2lmKCF0fHwhbilyZXR1cm4gdGhpcztsZXQgcj17fTtyZXR1cm4gZS5mb3JFYWNoKGU9PntyW2VdPW5bZV0mJm5bZV0uYWN0aXZlKCk/bltlXS5fdG86dGhpc1tlXX0pLHJ9fTtmdW5jdGlvbiB3dShlLHQpe2xldCBuPWUub3B0aW9ucy50aWNrcyxyPVR1KGUpLGk9TWF0aC5taW4obi5tYXhUaWNrc0xpbWl0fHxyLHIpLGE9bi5tYWpvci5lbmFibGVkP0R1KHQpOltdLG89YS5sZW5ndGgscz1hWzBdLGM9YVtvLTFdLGw9W107aWYobz5pKXJldHVybiBPdSh0LGwsYSxvL2kpLGw7bGV0IHU9RXUoYSx0LGkpO2lmKG8+MCl7bGV0IGUsbixyPW8+MT9NYXRoLnJvdW5kKChjLXMpLyhvLTEpKTpudWxsO2ZvcihrdSh0LGwsdSxVKHIpPzA6cy1yLHMpLGU9MCxuPW8tMTtlPG47ZSsrKWt1KHQsbCx1LGFbZV0sYVtlKzFdKTtyZXR1cm4ga3UodCxsLHUsYyxVKHIpP3QubGVuZ3RoOmMrciksbH1yZXR1cm4ga3UodCxsLHUpLGx9ZnVuY3Rpb24gVHUoZSl7bGV0IHQ9ZS5vcHRpb25zLm9mZnNldCxuPWUuX3RpY2tTaXplKCkscj1lLl9sZW5ndGgvbisgKyF0LGk9ZS5fbWF4TGVuZ3RoL247cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5taW4ocixpKSl9ZnVuY3Rpb24gRXUoZSx0LG4pe2xldCByPUF1KGUpLGk9dC5sZW5ndGgvbjtpZighcilyZXR1cm4gTWF0aC5tYXgoaSwxKTtsZXQgYT1FbyhyKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoLTE7ZTx0O2UrKyl7bGV0IHQ9YVtlXTtpZih0PmkpcmV0dXJuIHR9cmV0dXJuIE1hdGgubWF4KGksMSl9ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9W10sbixyO2ZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0ubWFqb3ImJnQucHVzaChuKTtyZXR1cm4gdH1mdW5jdGlvbiBPdShlLHQsbixyKXtsZXQgaT0wLGE9blswXSxvO2ZvcihyPU1hdGguY2VpbChyKSxvPTA7bzxlLmxlbmd0aDtvKyspbz09PWEmJih0LnB1c2goZVtvXSksaSsrLGE9bltpKnJdKX1mdW5jdGlvbiBrdShlLHQsbixyLGkpe2xldCBhPXEociwwKSxvPU1hdGgubWluKHEoaSxlLmxlbmd0aCksZS5sZW5ndGgpLHM9MCxjLGwsdTtmb3Iobj1NYXRoLmNlaWwobiksaSYmKGM9aS1yLG49Yy9NYXRoLmZsb29yKGMvbikpLHU9YTt1PDA7KXMrKyx1PU1hdGgucm91bmQoYStzKm4pO2ZvcihsPU1hdGgubWF4KGEsMCk7bDxvO2wrKylsPT09dSYmKHQucHVzaChlW2xdKSxzKyssdT1NYXRoLnJvdW5kKGErcypuKSl9ZnVuY3Rpb24gQXUoZSl7bGV0IHQ9ZS5sZW5ndGgsbixyO2lmKHQ8MilyZXR1cm4hMTtmb3Iocj1lWzBdLG49MTtuPHQ7KytuKWlmKGVbbl0tZVtuLTFdIT09cilyZXR1cm4hMTtyZXR1cm4gcn12YXIganU9ZT0+ZT09PWBsZWZ0YD9gcmlnaHRgOmU9PT1gcmlnaHRgP2BsZWZ0YDplLE11PShlLHQsbik9PnQ9PT1gdG9wYHx8dD09PWBsZWZ0YD9lW3RdK246ZVt0XS1uLE51PShlLHQpPT5NYXRoLm1pbih0fHxlLGUpO2Z1bmN0aW9uIFB1KGUsdCl7bGV0IG49W10scj1lLmxlbmd0aC90LGk9ZS5sZW5ndGgsYT0wO2Zvcig7YTxpO2ErPXIpbi5wdXNoKGVbTWF0aC5mbG9vcihhKV0pO3JldHVybiBufWZ1bmN0aW9uIEZ1KGUsdCxuKXtsZXQgcj1lLnRpY2tzLmxlbmd0aCxpPU1hdGgubWluKHQsci0xKSxhPWUuX3N0YXJ0UGl4ZWwsbz1lLl9lbmRQaXhlbCxzPTFlLTYsYz1lLmdldFBpeGVsRm9yVGljayhpKSxsO2lmKCEobiYmKGw9cj09PTE/TWF0aC5tYXgoYy1hLG8tYyk6dD09PTA/KGUuZ2V0UGl4ZWxGb3JUaWNrKDEpLWMpLzI6KGMtZS5nZXRQaXhlbEZvclRpY2soaS0xKSkvMixjKz1pPHQ/bDotbCxjPGEtc3x8Yz5vK3MpKSlyZXR1cm4gY31mdW5jdGlvbiBJdShlLHQpe1koZSxlPT57bGV0IG49ZS5nYyxyPW4ubGVuZ3RoLzIsaTtpZihyPnQpe2ZvcihpPTA7aTxyOysraSlkZWxldGUgZS5kYXRhW25baV1dO24uc3BsaWNlKDAscil9fSl9ZnVuY3Rpb24gTHUoZSl7cmV0dXJuIGUuZHJhd1RpY2tzP2UudGlja0xlbmd0aDowfWZ1bmN0aW9uIFJ1KGUsdCl7aWYoIWUuZGlzcGxheSlyZXR1cm4gMDtsZXQgbj0kKGUuZm9udCx0KSxyPVEoZS5wYWRkaW5nKTtyZXR1cm4oVyhlLnRleHQpP2UudGV4dC5sZW5ndGg6MSkqbi5saW5lSGVpZ2h0K3IuaGVpZ2h0fWZ1bmN0aW9uIHp1KGUsdCl7cmV0dXJuIHFzKGUse3NjYWxlOnQsdHlwZTpgc2NhbGVgfSl9ZnVuY3Rpb24gQnUoZSx0LG4pe3JldHVybiBxcyhlLHt0aWNrOm4saW5kZXg6dCx0eXBlOmB0aWNrYH0pfWZ1bmN0aW9uIFZ1KGUsdCxuKXtsZXQgcj1RbyhlKTtyZXR1cm4obiYmdCE9PWByaWdodGB8fCFuJiZ0PT09YHJpZ2h0YCkmJihyPWp1KHIpKSxyfWZ1bmN0aW9uIEh1KGUsdCxuLHIpe2xldHt0b3A6aSxsZWZ0OmEsYm90dG9tOm8scmlnaHQ6cyxjaGFydDpjfT1lLHtjaGFydEFyZWE6bCxzY2FsZXM6dX09YyxkPTAsZixwLG0saD1vLWksZz1zLWE7aWYoZS5pc0hvcml6b250YWwoKSl7aWYocD0kbyhyLGEscyksRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO209dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpK2gtdH1lbHNlIG09bj09PWBjZW50ZXJgPyhsLmJvdHRvbStsLnRvcCkvMitoLXQ6TXUoZSxuLHQpO2Y9cy1hfWVsc2V7aWYoRyhuKSl7bGV0IGU9T2JqZWN0LmtleXMobilbMF0scj1uW2VdO3A9dVtlXS5nZXRQaXhlbEZvclZhbHVlKHIpLWcrdH1lbHNlIHA9bj09PWBjZW50ZXJgPyhsLmxlZnQrbC5yaWdodCkvMi1nK3Q6TXUoZSxuLHQpO209JG8ocixvLGkpLGQ9bj09PWBsZWZ0YD8teW86eW99cmV0dXJue3RpdGxlWDpwLHRpdGxlWTptLG1heFdpZHRoOmYscm90YXRpb246ZH19dmFyIFV1PWNsYXNzIGUgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaWQ9ZS5pZCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5jdHg9ZS5jdHgsdGhpcy5jaGFydD1lLmNoYXJ0LHRoaXMudG9wPXZvaWQgMCx0aGlzLmJvdHRvbT12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5fbWFyZ2lucz17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9LHRoaXMubWF4V2lkdGg9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLnBhZGRpbmdUb3A9dm9pZCAwLHRoaXMucGFkZGluZ0JvdHRvbT12b2lkIDAsdGhpcy5wYWRkaW5nTGVmdD12b2lkIDAsdGhpcy5wYWRkaW5nUmlnaHQ9dm9pZCAwLHRoaXMuYXhpcz12b2lkIDAsdGhpcy5sYWJlbFJvdGF0aW9uPXZvaWQgMCx0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwLHRoaXMuX3JhbmdlPXZvaWQgMCx0aGlzLnRpY2tzPVtdLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2xlbmd0aD0wLHRoaXMuX21heExlbmd0aD0wLHRoaXMuX2xvbmdlc3RUZXh0Q2FjaGU9e30sdGhpcy5fc3RhcnRQaXhlbD12b2lkIDAsdGhpcy5fZW5kUGl4ZWw9dm9pZCAwLHRoaXMuX3JldmVyc2VQaXhlbHM9ITEsdGhpcy5fdXNlck1heD12b2lkIDAsdGhpcy5fdXNlck1pbj12b2lkIDAsdGhpcy5fc3VnZ2VzdGVkTWF4PXZvaWQgMCx0aGlzLl9zdWdnZXN0ZWRNaW49dm9pZCAwLHRoaXMuX3RpY2tzTGVuZ3RoPTAsdGhpcy5fYm9yZGVyVmFsdWU9MCx0aGlzLl9jYWNoZT17fSx0aGlzLl9kYXRhTGltaXRzQ2FjaGVkPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwfWluaXQoZSl7dGhpcy5vcHRpb25zPWUuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksdGhpcy5heGlzPWUuYXhpcyx0aGlzLl91c2VyTWluPXRoaXMucGFyc2UoZS5taW4pLHRoaXMuX3VzZXJNYXg9dGhpcy5wYXJzZShlLm1heCksdGhpcy5fc3VnZ2VzdGVkTWluPXRoaXMucGFyc2UoZS5zdWdnZXN0ZWRNaW4pLHRoaXMuX3N1Z2dlc3RlZE1heD10aGlzLnBhcnNlKGUuc3VnZ2VzdGVkTWF4KX1wYXJzZShlLHQpe3JldHVybiBlfWdldFVzZXJCb3VuZHMoKXtsZXR7X3VzZXJNaW46ZSxfdXNlck1heDp0LF9zdWdnZXN0ZWRNaW46bixfc3VnZ2VzdGVkTWF4OnJ9PXRoaXM7cmV0dXJuIGU9WmEoZSwxLzApLHQ9WmEodCwtMS8wKSxuPVphKG4sMS8wKSxyPVphKHIsLTEvMCkse21pbjpaYShlLG4pLG1heDpaYSh0LHIpLG1pbkRlZmluZWQ6SyhlKSxtYXhEZWZpbmVkOksodCl9fWdldE1pbk1heChlKXtsZXR7bWluOnQsbWF4Om4sbWluRGVmaW5lZDpyLG1heERlZmluZWQ6aX09dGhpcy5nZXRVc2VyQm91bmRzKCksYTtpZihyJiZpKXJldHVybnttaW46dCxtYXg6bn07bGV0IG89dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO2ZvcihsZXQgcz0wLGM9by5sZW5ndGg7czxjOysrcylhPW9bc10uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcyxlKSxyfHwodD1NYXRoLm1pbih0LGEubWluKSksaXx8KG49TWF0aC5tYXgobixhLm1heCkpO3JldHVybiB0PWkmJnQ+bj9uOnQsbj1yJiZ0Pm4/dDpuLHttaW46WmEodCxaYShuLHQpKSxtYXg6WmEobixaYSh0LG4pKX19Z2V0UGFkZGluZygpe3JldHVybntsZWZ0OnRoaXMucGFkZGluZ0xlZnR8fDAsdG9wOnRoaXMucGFkZGluZ1RvcHx8MCxyaWdodDp0aGlzLnBhZGRpbmdSaWdodHx8MCxib3R0b206dGhpcy5wYWRkaW5nQm90dG9tfHwwfX1nZXRUaWNrcygpe3JldHVybiB0aGlzLnRpY2tzfWdldExhYmVscygpe2xldCBlPXRoaXMuY2hhcnQuZGF0YTtyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsc3x8KHRoaXMuaXNIb3Jpem9udGFsKCk/ZS54TGFiZWxzOmUueUxhYmVscyl8fGUubGFiZWxzfHxbXX1nZXRMYWJlbEl0ZW1zKGU9dGhpcy5jaGFydC5jaGFydEFyZWEpe3JldHVybiB0aGlzLl9sYWJlbEl0ZW1zfHw9dGhpcy5fY29tcHV0ZUxhYmVsSXRlbXMoZSl9YmVmb3JlTGF5b3V0KCl7dGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMX1iZWZvcmVVcGRhdGUoKXtKKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsW3RoaXNdKX11cGRhdGUoZSx0LG4pe2xldHtiZWdpbkF0WmVybzpyLGdyYWNlOmksdGlja3M6YX09dGhpcy5vcHRpb25zLG89YS5zYW1wbGVTaXplO3RoaXMuYmVmb3JlVXBkYXRlKCksdGhpcy5tYXhXaWR0aD1lLHRoaXMubWF4SGVpZ2h0PXQsdGhpcy5fbWFyZ2lucz1uPU9iamVjdC5hc3NpZ24oe2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfSxuKSx0aGlzLnRpY2tzPW51bGwsdGhpcy5fbGFiZWxTaXplcz1udWxsLHRoaXMuX2dyaWRMaW5lSXRlbXM9bnVsbCx0aGlzLl9sYWJlbEl0ZW1zPW51bGwsdGhpcy5iZWZvcmVTZXREaW1lbnNpb25zKCksdGhpcy5zZXREaW1lbnNpb25zKCksdGhpcy5hZnRlclNldERpbWVuc2lvbnMoKSx0aGlzLl9tYXhMZW5ndGg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLndpZHRoK24ubGVmdCtuLnJpZ2h0OnRoaXMuaGVpZ2h0K24udG9wK24uYm90dG9tLHRoaXMuX2RhdGFMaW1pdHNDYWNoZWR8fD0odGhpcy5iZWZvcmVEYXRhTGltaXRzKCksdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCksdGhpcy5hZnRlckRhdGFMaW1pdHMoKSx0aGlzLl9yYW5nZT1Lcyh0aGlzLGksciksITApLHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpLHRoaXMudGlja3M9dGhpcy5idWlsZFRpY2tzKCl8fFtdLHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7bGV0IHM9bzx0aGlzLnRpY2tzLmxlbmd0aDt0aGlzLl9jb252ZXJ0VGlja3NUb0xhYmVscyhzP1B1KHRoaXMudGlja3Msbyk6dGhpcy50aWNrcyksdGhpcy5jb25maWd1cmUoKSx0aGlzLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSx0aGlzLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLGEuZGlzcGxheSYmKGEuYXV0b1NraXB8fGEuc291cmNlPT09YGF1dG9gKSYmKHRoaXMudGlja3M9d3UodGhpcyx0aGlzLnRpY2tzKSx0aGlzLl9sYWJlbFNpemVzPW51bGwsdGhpcy5hZnRlckF1dG9Ta2lwKCkpLHMmJnRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRoaXMudGlja3MpLHRoaXMuYmVmb3JlRml0KCksdGhpcy5maXQoKSx0aGlzLmFmdGVyRml0KCksdGhpcy5hZnRlclVwZGF0ZSgpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMub3B0aW9ucy5yZXZlcnNlLHQsbjt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0PXRoaXMubGVmdCxuPXRoaXMucmlnaHQpOih0PXRoaXMudG9wLG49dGhpcy5ib3R0b20sZT0hZSksdGhpcy5fc3RhcnRQaXhlbD10LHRoaXMuX2VuZFBpeGVsPW4sdGhpcy5fcmV2ZXJzZVBpeGVscz1lLHRoaXMuX2xlbmd0aD1uLXQsdGhpcy5fYWxpZ25Ub1BpeGVscz10aGlzLm9wdGlvbnMuYWxpZ25Ub1BpeGVsc31hZnRlclVwZGF0ZSgpe0oodGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlLFt0aGlzXSl9YmVmb3JlU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsW3RoaXNdKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD0wLHRoaXMucmlnaHQ9dGhpcy53aWR0aCk6KHRoaXMuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LHRoaXMudG9wPTAsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdUb3A9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wfWFmdGVyU2V0RGltZW5zaW9ucygpe0oodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucyxbdGhpc10pfV9jYWxsSG9va3MoZSl7dGhpcy5jaGFydC5ub3RpZnlQbHVnaW5zKGUsdGhpcy5nZXRDb250ZXh0KCkpLEoodGhpcy5vcHRpb25zW2VdLFt0aGlzXSl9YmVmb3JlRGF0YUxpbWl0cygpe3RoaXMuX2NhbGxIb29rcyhgYmVmb3JlRGF0YUxpbWl0c2ApfWRldGVybWluZURhdGFMaW1pdHMoKXt9YWZ0ZXJEYXRhTGltaXRzKCl7dGhpcy5fY2FsbEhvb2tzKGBhZnRlckRhdGFMaW1pdHNgKX1iZWZvcmVCdWlsZFRpY2tzKCl7dGhpcy5fY2FsbEhvb2tzKGBiZWZvcmVCdWlsZFRpY2tzYCl9YnVpbGRUaWNrcygpe3JldHVybltdfWFmdGVyQnVpbGRUaWNrcygpe3RoaXMuX2NhbGxIb29rcyhgYWZ0ZXJCdWlsZFRpY2tzYCl9YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCl7Sih0aGlzLm9wdGlvbnMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9Z2VuZXJhdGVUaWNrTGFiZWxzKGUpe2xldCB0PXRoaXMub3B0aW9ucy50aWNrcyxuLHIsaTtmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpPWVbbl0saS5sYWJlbD1KKHQuY2FsbGJhY2ssW2kudmFsdWUsbixlXSx0aGlzKX1hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpe0oodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLFt0aGlzXSl9YmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpe0oodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1jYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPU51KHRoaXMudGlja3MubGVuZ3RoLGUudGlja3MubWF4VGlja3NMaW1pdCkscj10Lm1pblJvdGF0aW9ufHwwLGk9dC5tYXhSb3RhdGlvbixhPXIsbyxzLGM7aWYoIXRoaXMuX2lzVmlzaWJsZSgpfHwhdC5kaXNwbGF5fHxyPj1pfHxuPD0xfHwhdGhpcy5pc0hvcml6b250YWwoKSl7dGhpcy5sYWJlbFJvdGF0aW9uPXI7cmV0dXJufWxldCBsPXRoaXMuX2dldExhYmVsU2l6ZXMoKSx1PWwud2lkZXN0LndpZHRoLGQ9bC5oaWdoZXN0LmhlaWdodCxmPVJvKHRoaXMuY2hhcnQud2lkdGgtdSwwLHRoaXMubWF4V2lkdGgpO289ZS5vZmZzZXQ/dGhpcy5tYXhXaWR0aC9uOmYvKG4tMSksdSs2Pm8mJihvPWYvKG4tKGUub2Zmc2V0Py41OjEpKSxzPXRoaXMubWF4SGVpZ2h0LUx1KGUuZ3JpZCktdC5wYWRkaW5nLVJ1KGUudGl0bGUsdGhpcy5jaGFydC5vcHRpb25zLmZvbnQpLGM9TWF0aC5zcXJ0KHUqdStkKmQpLGE9TW8oTWF0aC5taW4oTWF0aC5hc2luKFJvKChsLmhpZ2hlc3QuaGVpZ2h0KzYpL28sLTEsMSkpLE1hdGguYXNpbihSbyhzL2MsLTEsMSkpLU1hdGguYXNpbihSbyhkL2MsLTEsMSkpKSksYT1NYXRoLm1heChyLE1hdGgubWluKGksYSkpKSx0aGlzLmxhYmVsUm90YXRpb249YX1hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKXtKKHRoaXMub3B0aW9ucy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24sW3RoaXNdKX1hZnRlckF1dG9Ta2lwKCl7fWJlZm9yZUZpdCgpe0oodGhpcy5vcHRpb25zLmJlZm9yZUZpdCxbdGhpc10pfWZpdCgpe2xldCBlPXt3aWR0aDowLGhlaWdodDowfSx7Y2hhcnQ6dCxvcHRpb25zOnt0aWNrczpuLHRpdGxlOnIsZ3JpZDppfX09dGhpcyxhPXRoaXMuX2lzVmlzaWJsZSgpLG89dGhpcy5pc0hvcml6b250YWwoKTtpZihhKXtsZXQgYT1SdShyLHQub3B0aW9ucy5mb250KTtpZihvPyhlLndpZHRoPXRoaXMubWF4V2lkdGgsZS5oZWlnaHQ9THUoaSkrYSk6KGUuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LGUud2lkdGg9THUoaSkrYSksbi5kaXNwbGF5JiZ0aGlzLnRpY2tzLmxlbmd0aCl7bGV0e2ZpcnN0OnQsbGFzdDpyLHdpZGVzdDppLGhpZ2hlc3Q6YX09dGhpcy5fZ2V0TGFiZWxTaXplcygpLHM9bi5wYWRkaW5nKjIsYz1qbyh0aGlzLmxhYmVsUm90YXRpb24pLGw9TWF0aC5jb3MoYyksdT1NYXRoLnNpbihjKTtpZihvKXtsZXQgdD1uLm1pcnJvcj8wOnUqaS53aWR0aCtsKmEuaGVpZ2h0O2UuaGVpZ2h0PU1hdGgubWluKHRoaXMubWF4SGVpZ2h0LGUuaGVpZ2h0K3Qrcyl9ZWxzZXtsZXQgdD1uLm1pcnJvcj8wOmwqaS53aWR0aCt1KmEuaGVpZ2h0O2Uud2lkdGg9TWF0aC5taW4odGhpcy5tYXhXaWR0aCxlLndpZHRoK3Qrcyl9dGhpcy5fY2FsY3VsYXRlUGFkZGluZyh0LHIsdSxsKX19dGhpcy5faGFuZGxlTWFyZ2lucygpLG8/KHRoaXMud2lkdGg9dGhpcy5fbGVuZ3RoPXQud2lkdGgtdGhpcy5fbWFyZ2lucy5sZWZ0LXRoaXMuX21hcmdpbnMucmlnaHQsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQpOih0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5fbGVuZ3RoPXQuaGVpZ2h0LXRoaXMuX21hcmdpbnMudG9wLXRoaXMuX21hcmdpbnMuYm90dG9tKX1fY2FsY3VsYXRlUGFkZGluZyhlLHQsbixyKXtsZXR7dGlja3M6e2FsaWduOmkscGFkZGluZzphfSxwb3NpdGlvbjpvfT10aGlzLm9wdGlvbnMscz10aGlzLmxhYmVsUm90YXRpb24hPT0wLGM9byE9PWB0b3BgJiZ0aGlzLmF4aXM9PT1geGA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7bGV0IG89dGhpcy5nZXRQaXhlbEZvclRpY2soMCktdGhpcy5sZWZ0LGw9dGhpcy5yaWdodC10aGlzLmdldFBpeGVsRm9yVGljayh0aGlzLnRpY2tzLmxlbmd0aC0xKSx1PTAsZD0wO3M/Yz8odT1yKmUud2lkdGgsZD1uKnQuaGVpZ2h0KToodT1uKmUuaGVpZ2h0LGQ9cip0LndpZHRoKTppPT09YHN0YXJ0YD9kPXQud2lkdGg6aT09PWBlbmRgP3U9ZS53aWR0aDppIT09YGlubmVyYCYmKHU9ZS53aWR0aC8yLGQ9dC53aWR0aC8yKSx0aGlzLnBhZGRpbmdMZWZ0PU1hdGgubWF4KCh1LW8rYSkqdGhpcy53aWR0aC8odGhpcy53aWR0aC1vKSwwKSx0aGlzLnBhZGRpbmdSaWdodD1NYXRoLm1heCgoZC1sK2EpKnRoaXMud2lkdGgvKHRoaXMud2lkdGgtbCksMCl9ZWxzZXtsZXQgbj10LmhlaWdodC8yLHI9ZS5oZWlnaHQvMjtpPT09YHN0YXJ0YD8obj0wLHI9ZS5oZWlnaHQpOmk9PT1gZW5kYCYmKG49dC5oZWlnaHQscj0wKSx0aGlzLnBhZGRpbmdUb3A9bithLHRoaXMucGFkZGluZ0JvdHRvbT1yK2F9fV9oYW5kbGVNYXJnaW5zKCl7dGhpcy5fbWFyZ2lucyYmKHRoaXMuX21hcmdpbnMubGVmdD1NYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMuX21hcmdpbnMubGVmdCksdGhpcy5fbWFyZ2lucy50b3A9TWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLHRoaXMuX21hcmdpbnMudG9wKSx0aGlzLl9tYXJnaW5zLnJpZ2h0PU1hdGgubWF4KHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMuX21hcmdpbnMucmlnaHQpLHRoaXMuX21hcmdpbnMuYm90dG9tPU1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLl9tYXJnaW5zLmJvdHRvbSkpfWFmdGVyRml0KCl7Sih0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsW3RoaXNdKX1pc0hvcml6b250YWwoKXtsZXR7YXhpczplLHBvc2l0aW9uOnR9PXRoaXMub3B0aW9ucztyZXR1cm4gdD09PWB0b3BgfHx0PT09YGJvdHRvbWB8fGU9PT1geGB9aXNGdWxsU2l6ZSgpe3JldHVybiB0aGlzLm9wdGlvbnMuZnVsbFNpemV9X2NvbnZlcnRUaWNrc1RvTGFiZWxzKGUpe3RoaXMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCksdGhpcy5nZW5lcmF0ZVRpY2tMYWJlbHMoZSk7bGV0IHQsbjtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKylVKGVbdF0ubGFiZWwpJiYoZS5zcGxpY2UodCwxKSxuLS0sdC0tKTt0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCl9X2dldExhYmVsU2l6ZXMoKXtsZXQgZT10aGlzLl9sYWJlbFNpemVzO2lmKCFlKXtsZXQgdD10aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZSxuPXRoaXMudGlja3M7dDxuLmxlbmd0aCYmKG49UHUobix0KSksdGhpcy5fbGFiZWxTaXplcz1lPXRoaXMuX2NvbXB1dGVMYWJlbFNpemVzKG4sbi5sZW5ndGgsdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpfXJldHVybiBlfV9jb21wdXRlTGFiZWxTaXplcyhlLHQsbil7bGV0e2N0eDpyLF9sb25nZXN0VGV4dENhY2hlOml9PXRoaXMsYT1bXSxvPVtdLHM9TWF0aC5mbG9vcih0L051KHQsbikpLGM9MCxsPTAsdSxkLGYscCxtLGgsZyxfLHYseSxiO2Zvcih1PTA7dTx0O3UrPXMpe2lmKHA9ZVt1XS5sYWJlbCxtPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnModSksci5mb250PWg9bS5zdHJpbmcsZz1pW2hdPWlbaF18fHtkYXRhOnt9LGdjOltdfSxfPW0ubGluZUhlaWdodCx2PXk9MCwhVShwKSYmIVcocCkpdj13cyhyLGcuZGF0YSxnLmdjLHYscCkseT1fO2Vsc2UgaWYoVyhwKSlmb3IoZD0wLGY9cC5sZW5ndGg7ZDxmOysrZCliPXBbZF0sIVUoYikmJiFXKGIpJiYodj13cyhyLGcuZGF0YSxnLmdjLHYsYikseSs9Xyk7YS5wdXNoKHYpLG8ucHVzaCh5KSxjPU1hdGgubWF4KHYsYyksbD1NYXRoLm1heCh5LGwpfUl1KGksdCk7bGV0IHg9YS5pbmRleE9mKGMpLFM9by5pbmRleE9mKGwpLEM9ZT0+KHt3aWR0aDphW2VdfHwwLGhlaWdodDpvW2VdfHwwfSk7cmV0dXJue2ZpcnN0OkMoMCksbGFzdDpDKHQtMSksd2lkZXN0OkMoeCksaGlnaGVzdDpDKFMpLHdpZHRoczphLGhlaWdodHM6b319Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZX1nZXRQaXhlbEZvclZhbHVlKGUsdCl7cmV0dXJuIE5hTn1nZXRWYWx1ZUZvclBpeGVsKGUpe31nZXRQaXhlbEZvclRpY2soZSl7bGV0IHQ9dGhpcy50aWNrcztyZXR1cm4gZTwwfHxlPnQubGVuZ3RoLTE/bnVsbDp0aGlzLmdldFBpeGVsRm9yVmFsdWUodFtlXS52YWx1ZSl9Z2V0UGl4ZWxGb3JEZWNpbWFsKGUpe3RoaXMuX3JldmVyc2VQaXhlbHMmJihlPTEtZSk7bGV0IHQ9dGhpcy5fc3RhcnRQaXhlbCtlKnRoaXMuX2xlbmd0aDtyZXR1cm4gem8odGhpcy5fYWxpZ25Ub1BpeGVscz9Fcyh0aGlzLmNoYXJ0LHQsMCk6dCl9Z2V0RGVjaW1hbEZvclBpeGVsKGUpe2xldCB0PShlLXRoaXMuX3N0YXJ0UGl4ZWwpL3RoaXMuX2xlbmd0aDtyZXR1cm4gdGhpcy5fcmV2ZXJzZVBpeGVscz8xLXQ6dH1nZXRCYXNlUGl4ZWwoKXtyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldEJhc2VWYWx1ZSgpe2xldHttaW46ZSxtYXg6dH09dGhpcztyZXR1cm4gZTwwJiZ0PDA/dDplPjAmJnQ+MD9lOjB9Z2V0Q29udGV4dChlKXtsZXQgdD10aGlzLnRpY2tzfHxbXTtpZihlPj0wJiZlPHQubGVuZ3RoKXtsZXQgbj10W2VdO3JldHVybiBuLiRjb250ZXh0fHw9QnUodGhpcy5nZXRDb250ZXh0KCksZSxuKX1yZXR1cm4gdGhpcy4kY29udGV4dHx8PXp1KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHRoaXMpfV90aWNrU2l6ZSgpe2xldCBlPXRoaXMub3B0aW9ucy50aWNrcyx0PWpvKHRoaXMubGFiZWxSb3RhdGlvbiksbj1NYXRoLmFicyhNYXRoLmNvcyh0KSkscj1NYXRoLmFicyhNYXRoLnNpbih0KSksaT10aGlzLl9nZXRMYWJlbFNpemVzKCksYT1lLmF1dG9Ta2lwUGFkZGluZ3x8MCxvPWk/aS53aWRlc3Qud2lkdGgrYTowLHM9aT9pLmhpZ2hlc3QuaGVpZ2h0K2E6MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT9zKm4+bypyP28vbjpzL3I6cypyPG8qbj9zL246by9yfV9pc1Zpc2libGUoKXtsZXQgZT10aGlzLm9wdGlvbnMuZGlzcGxheTtyZXR1cm4gZT09PWBhdXRvYD90aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCkubGVuZ3RoPjA6ISFlfV9jb21wdXRlR3JpZExpbmVJdGVtcyhlKXtsZXQgdD10aGlzLmF4aXMsbj10aGlzLmNoYXJ0LHI9dGhpcy5vcHRpb25zLHtncmlkOmkscG9zaXRpb246YSxib3JkZXI6b309cixzPWkub2Zmc2V0LGM9dGhpcy5pc0hvcml6b250YWwoKSxsPXRoaXMudGlja3MubGVuZ3RoKyArISFzLHU9THUoaSksZD1bXSxmPW8uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscD1mLmRpc3BsYXk/Zi53aWR0aDowLG09cC8yLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIEVzKG4sZSxwKX0sZyxfLHYseSxiLHgsUyxDLHcsVCxFLEQ7aWYoYT09PWB0b3BgKWc9aCh0aGlzLmJvdHRvbSkseD10aGlzLmJvdHRvbS11LEM9Zy1tLFQ9aChlLnRvcCkrbSxEPWUuYm90dG9tO2Vsc2UgaWYoYT09PWBib3R0b21gKWc9aCh0aGlzLnRvcCksVD1lLnRvcCxEPWgoZS5ib3R0b20pLW0seD1nK20sQz10aGlzLnRvcCt1O2Vsc2UgaWYoYT09PWBsZWZ0YClnPWgodGhpcy5yaWdodCksYj10aGlzLnJpZ2h0LXUsUz1nLW0sdz1oKGUubGVmdCkrbSxFPWUucmlnaHQ7ZWxzZSBpZihhPT09YHJpZ2h0YClnPWgodGhpcy5sZWZ0KSx3PWUubGVmdCxFPWgoZS5yaWdodCktbSxiPWcrbSxTPXRoaXMubGVmdCt1O2Vsc2UgaWYodD09PWB4YCl7aWYoYT09PWBjZW50ZXJgKWc9aCgoZS50b3ArZS5ib3R0b20pLzIrLjUpO2Vsc2UgaWYoRyhhKSl7bGV0IGU9T2JqZWN0LmtleXMoYSlbMF0sdD1hW2VdO2c9aCh0aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpKX1UPWUudG9wLEQ9ZS5ib3R0b20seD1nK20sQz14K3V9ZWxzZSBpZih0PT09YHlgKXtpZihhPT09YGNlbnRlcmApZz1oKChlLmxlZnQrZS5yaWdodCkvMik7ZWxzZSBpZihHKGEpKXtsZXQgZT1PYmplY3Qua2V5cyhhKVswXSx0PWFbZV07Zz1oKHRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCkpfWI9Zy1tLFM9Yi11LHc9ZS5sZWZ0LEU9ZS5yaWdodH1sZXQgTz1xKHIudGlja3MubWF4VGlja3NMaW1pdCxsKSxrPU1hdGgubWF4KDEsTWF0aC5jZWlsKGwvTykpO2ZvcihfPTA7XzxsO18rPWspe2xldCBlPXRoaXMuZ2V0Q29udGV4dChfKSx0PWkuc2V0Q29udGV4dChlKSxyPW8uc2V0Q29udGV4dChlKSxhPXQubGluZVdpZHRoLGw9dC5jb2xvcix1PXIuZGFzaHx8W10sZj1yLmRhc2hPZmZzZXQscD10LnRpY2tXaWR0aCxtPXQudGlja0NvbG9yLGg9dC50aWNrQm9yZGVyRGFzaHx8W10sZz10LnRpY2tCb3JkZXJEYXNoT2Zmc2V0O3Y9RnUodGhpcyxfLHMpLHYhPT12b2lkIDAmJih5PUVzKG4sdixhKSxjP2I9Uz13PUU9eTp4PUM9VD1EPXksZC5wdXNoKHt0eDE6Yix0eTE6eCx0eDI6Uyx0eTI6Qyx4MTp3LHkxOlQseDI6RSx5MjpELHdpZHRoOmEsY29sb3I6bCxib3JkZXJEYXNoOnUsYm9yZGVyRGFzaE9mZnNldDpmLHRpY2tXaWR0aDpwLHRpY2tDb2xvcjptLHRpY2tCb3JkZXJEYXNoOmgsdGlja0JvcmRlckRhc2hPZmZzZXQ6Z30pKX1yZXR1cm4gdGhpcy5fdGlja3NMZW5ndGg9bCx0aGlzLl9ib3JkZXJWYWx1ZT1nLGR9X2NvbXB1dGVMYWJlbEl0ZW1zKGUpe2xldCB0PXRoaXMuYXhpcyxuPXRoaXMub3B0aW9ucyx7cG9zaXRpb246cix0aWNrczppfT1uLGE9dGhpcy5pc0hvcml6b250YWwoKSxvPXRoaXMudGlja3Mse2FsaWduOnMsY3Jvc3NBbGlnbjpjLHBhZGRpbmc6bCxtaXJyb3I6dX09aSxkPUx1KG4uZ3JpZCksZj1kK2wscD11Py1sOmYsbT0tam8odGhpcy5sYWJlbFJvdGF0aW9uKSxoPVtdLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE89YG1pZGRsZWA7aWYocj09PWB0b3BgKXg9dGhpcy5ib3R0b20tcCxTPXRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtlbHNlIGlmKHI9PT1gYm90dG9tYCl4PXRoaXMudG9wK3AsUz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7ZWxzZSBpZihyPT09YGxlZnRgKXtsZXQgZT10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpO1M9ZS50ZXh0QWxpZ24sYj1lLnh9ZWxzZSBpZihyPT09YHJpZ2h0YCl7bGV0IGU9dGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudChkKTtTPWUudGV4dEFsaWduLGI9ZS54fWVsc2UgaWYodD09PWB4YCl7aWYocj09PWBjZW50ZXJgKXg9KGUudG9wK2UuYm90dG9tKS8yK2Y7ZWxzZSBpZihHKHIpKXtsZXQgZT1PYmplY3Qua2V5cyhyKVswXSx0PXJbZV07eD10aGlzLmNoYXJ0LnNjYWxlc1tlXS5nZXRQaXhlbEZvclZhbHVlKHQpK2Z9Uz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl9ZWxzZSBpZih0PT09YHlgKXtpZihyPT09YGNlbnRlcmApYj0oZS5sZWZ0K2UucmlnaHQpLzItZjtlbHNlIGlmKEcocikpe2xldCBlPU9iamVjdC5rZXlzKHIpWzBdLHQ9cltlXTtiPXRoaXMuY2hhcnQuc2NhbGVzW2VdLmdldFBpeGVsRm9yVmFsdWUodCl9Uz10aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KGQpLnRleHRBbGlnbn10PT09YHlgJiYocz09PWBzdGFydGA/Tz1gdG9wYDpzPT09YGVuZGAmJihPPWBib3R0b21gKSk7bGV0IGs9dGhpcy5fZ2V0TGFiZWxTaXplcygpO2ZvcihnPTAsXz1vLmxlbmd0aDtnPF87KytnKXt2PW9bZ10seT12LmxhYmVsO2xldCBlPWkuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoZykpO0M9dGhpcy5nZXRQaXhlbEZvclRpY2soZykraS5sYWJlbE9mZnNldCx3PXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZyksVD13LmxpbmVIZWlnaHQsRT1XKHkpP3kubGVuZ3RoOjE7bGV0IHQ9RS8yLG49ZS5jb2xvcixzPWUudGV4dFN0cm9rZUNvbG9yLGw9ZS50ZXh0U3Ryb2tlV2lkdGgsZD1TO2E/KGI9QyxTPT09YGlubmVyYCYmKGQ9Zz09PV8tMT90aGlzLm9wdGlvbnMucmV2ZXJzZT9gbGVmdGA6YHJpZ2h0YDpnPT09MD90aGlzLm9wdGlvbnMucmV2ZXJzZT9gcmlnaHRgOmBsZWZ0YDpgY2VudGVyYCksRD1yPT09YHRvcGA/Yz09PWBuZWFyYHx8bSE9PTA/LUUqVCtULzI6Yz09PWBjZW50ZXJgPy1rLmhpZ2hlc3QuaGVpZ2h0LzItdCpUK1Q6LWsuaGlnaGVzdC5oZWlnaHQrVC8yOmM9PT1gbmVhcmB8fG0hPT0wP1QvMjpjPT09YGNlbnRlcmA/ay5oaWdoZXN0LmhlaWdodC8yLXQqVDprLmhpZ2hlc3QuaGVpZ2h0LUUqVCx1JiYoRCo9LTEpLG0hPT0wJiYhZS5zaG93TGFiZWxCYWNrZHJvcCYmKGIrPVQvMipNYXRoLnNpbihtKSkpOih4PUMsRD0oMS1FKSpULzIpO2xldCBmO2lmKGUuc2hvd0xhYmVsQmFja2Ryb3Ape2xldCB0PVEoZS5iYWNrZHJvcFBhZGRpbmcpLG49ay5oZWlnaHRzW2ddLHI9ay53aWR0aHNbZ10saT1ELXQudG9wLGE9MC10LmxlZnQ7c3dpdGNoKE8pe2Nhc2VgbWlkZGxlYDppLT1uLzI7YnJlYWs7Y2FzZWBib3R0b21gOmktPW59c3dpdGNoKFMpe2Nhc2VgY2VudGVyYDphLT1yLzI7YnJlYWs7Y2FzZWByaWdodGA6YS09cjticmVhaztjYXNlYGlubmVyYDpnPT09Xy0xP2EtPXI6Zz4wJiYoYS09ci8yKX1mPXtsZWZ0OmEsdG9wOmksd2lkdGg6cit0LndpZHRoLGhlaWdodDpuK3QuaGVpZ2h0LGNvbG9yOmUuYmFja2Ryb3BDb2xvcn19aC5wdXNoKHtsYWJlbDp5LGZvbnQ6dyx0ZXh0T2Zmc2V0OkQsb3B0aW9uczp7cm90YXRpb246bSxjb2xvcjpuLHN0cm9rZUNvbG9yOnMsc3Ryb2tlV2lkdGg6bCx0ZXh0QWxpZ246ZCx0ZXh0QmFzZWxpbmU6Tyx0cmFuc2xhdGlvbjpbYix4XSxiYWNrZHJvcDpmfX0pfXJldHVybiBofV9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl7bGV0e3Bvc2l0aW9uOmUsdGlja3M6dH09dGhpcy5vcHRpb25zO2lmKC1qbyh0aGlzLmxhYmVsUm90YXRpb24pKXJldHVybiBlPT09YHRvcGA/YGxlZnRgOmByaWdodGA7bGV0IG49YGNlbnRlcmA7cmV0dXJuIHQuYWxpZ249PT1gc3RhcnRgP249YGxlZnRgOnQuYWxpZ249PT1gZW5kYD9uPWByaWdodGA6dC5hbGlnbj09PWBpbm5lcmAmJihuPWBpbm5lcmApLG59X2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZSl7bGV0e3Bvc2l0aW9uOnQsdGlja3M6e2Nyb3NzQWxpZ246bixtaXJyb3I6cixwYWRkaW5nOml9fT10aGlzLm9wdGlvbnMsYT10aGlzLl9nZXRMYWJlbFNpemVzKCksbz1lK2kscz1hLndpZGVzdC53aWR0aCxjLGw7cmV0dXJuIHQ9PT1gbGVmdGA/cj8obD10aGlzLnJpZ2h0K2ksbj09PWBuZWFyYD9jPWBsZWZ0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbCs9cy8yKTooYz1gcmlnaHRgLGwrPXMpKToobD10aGlzLnJpZ2h0LW8sbj09PWBuZWFyYD9jPWByaWdodGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwtPXMvMik6KGM9YGxlZnRgLGw9dGhpcy5sZWZ0KSk6dD09PWByaWdodGA/cj8obD10aGlzLmxlZnQraSxuPT09YG5lYXJgP2M9YHJpZ2h0YDpuPT09YGNlbnRlcmA/KGM9YGNlbnRlcmAsbC09cy8yKTooYz1gbGVmdGAsbC09cykpOihsPXRoaXMubGVmdCtvLG49PT1gbmVhcmA/Yz1gbGVmdGA6bj09PWBjZW50ZXJgPyhjPWBjZW50ZXJgLGwrPXMvMik6KGM9YHJpZ2h0YCxsPXRoaXMucmlnaHQpKTpjPWByaWdodGAse3RleHRBbGlnbjpjLHg6bH19X2NvbXB1dGVMYWJlbEFyZWEoKXtpZih0aGlzLm9wdGlvbnMudGlja3MubWlycm9yKXJldHVybjtsZXQgZT10aGlzLmNoYXJ0LHQ9dGhpcy5vcHRpb25zLnBvc2l0aW9uO2lmKHQ9PT1gbGVmdGB8fHQ9PT1gcmlnaHRgKXJldHVybnt0b3A6MCxsZWZ0OnRoaXMubGVmdCxib3R0b206ZS5oZWlnaHQscmlnaHQ6dGhpcy5yaWdodH07aWYodD09PWB0b3BgfHx0PT09YGJvdHRvbWApcmV0dXJue3RvcDp0aGlzLnRvcCxsZWZ0OjAsYm90dG9tOnRoaXMuYm90dG9tLHJpZ2h0OmUud2lkdGh9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2N0eDplLG9wdGlvbnM6e2JhY2tncm91bmRDb2xvcjp0fSxsZWZ0Om4sdG9wOnIsd2lkdGg6aSxoZWlnaHQ6YX09dGhpczt0JiYoZS5zYXZlKCksZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KG4scixpLGEpLGUucmVzdG9yZSgpKX1nZXRMaW5lV2lkdGhGb3JWYWx1ZShlKXtsZXQgdD10aGlzLm9wdGlvbnMuZ3JpZDtpZighdGhpcy5faXNWaXNpYmxlKCl8fCF0LmRpc3BsYXkpcmV0dXJuIDA7bGV0IG49dGhpcy50aWNrcy5maW5kSW5kZXgodD0+dC52YWx1ZT09PWUpO3JldHVybiBuPj0wP3Quc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobikpLmxpbmVXaWR0aDowfWRyYXdHcmlkKGUpe2xldCB0PXRoaXMub3B0aW9ucy5ncmlkLG49dGhpcy5jdHgscj10aGlzLl9ncmlkTGluZUl0ZW1zfHw9dGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXMoZSksaSxhLG89KGUsdCxyKT0+eyFyLndpZHRofHwhci5jb2xvcnx8KG4uc2F2ZSgpLG4ubGluZVdpZHRoPXIud2lkdGgsbi5zdHJva2VTdHlsZT1yLmNvbG9yLG4uc2V0TGluZURhc2goci5ib3JkZXJEYXNofHxbXSksbi5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQsbi5iZWdpblBhdGgoKSxuLm1vdmVUbyhlLngsZS55KSxuLmxpbmVUbyh0LngsdC55KSxuLnN0cm9rZSgpLG4ucmVzdG9yZSgpKX07aWYodC5kaXNwbGF5KWZvcihpPTAsYT1yLmxlbmd0aDtpPGE7KytpKXtsZXQgZT1yW2ldO3QuZHJhd09uQ2hhcnRBcmVhJiZvKHt4OmUueDEseTplLnkxfSx7eDplLngyLHk6ZS55Mn0sZSksdC5kcmF3VGlja3MmJm8oe3g6ZS50eDEseTplLnR5MX0se3g6ZS50eDIseTplLnR5Mn0se2NvbG9yOmUudGlja0NvbG9yLHdpZHRoOmUudGlja1dpZHRoLGJvcmRlckRhc2g6ZS50aWNrQm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OmUudGlja0JvcmRlckRhc2hPZmZzZXR9KX19ZHJhd0JvcmRlcigpe2xldHtjaGFydDplLGN0eDp0LG9wdGlvbnM6e2JvcmRlcjpuLGdyaWQ6cn19PXRoaXMsaT1uLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLGE9bi5kaXNwbGF5P2kud2lkdGg6MDtpZighYSlyZXR1cm47bGV0IG89ci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoLHM9dGhpcy5fYm9yZGVyVmFsdWUsYyxsLHUsZDt0aGlzLmlzSG9yaXpvbnRhbCgpPyhjPUVzKGUsdGhpcy5sZWZ0LGEpLWEvMixsPUVzKGUsdGhpcy5yaWdodCxvKStvLzIsdT1kPXMpOih1PUVzKGUsdGhpcy50b3AsYSktYS8yLGQ9RXMoZSx0aGlzLmJvdHRvbSxvKStvLzIsYz1sPXMpLHQuc2F2ZSgpLHQubGluZVdpZHRoPWkud2lkdGgsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oYyx1KSx0LmxpbmVUbyhsLGQpLHQuc3Ryb2tlKCksdC5yZXN0b3JlKCl9ZHJhd0xhYmVscyhlKXtpZighdGhpcy5vcHRpb25zLnRpY2tzLmRpc3BsYXkpcmV0dXJuO2xldCB0PXRoaXMuY3R4LG49dGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO24mJmpzKHQsbik7bGV0IHI9dGhpcy5nZXRMYWJlbEl0ZW1zKGUpO2ZvcihsZXQgZSBvZiByKXtsZXQgbj1lLm9wdGlvbnMscj1lLmZvbnQsaT1lLmxhYmVsLGE9ZS50ZXh0T2Zmc2V0O0lzKHQsaSwwLGEscixuKX1uJiZNcyh0KX1kcmF3VGl0bGUoKXtsZXR7Y3R4OmUsb3B0aW9uczp7cG9zaXRpb246dCx0aXRsZTpuLHJldmVyc2U6cn19PXRoaXM7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IGk9JChuLmZvbnQpLGE9UShuLnBhZGRpbmcpLG89bi5hbGlnbixzPWkubGluZUhlaWdodC8yO3Q9PT1gYm90dG9tYHx8dD09PWBjZW50ZXJgfHxHKHQpPyhzKz1hLmJvdHRvbSxXKG4udGV4dCkmJihzKz1pLmxpbmVIZWlnaHQqKG4udGV4dC5sZW5ndGgtMSkpKTpzKz1hLnRvcDtsZXR7dGl0bGVYOmMsdGl0bGVZOmwsbWF4V2lkdGg6dSxyb3RhdGlvbjpkfT1IdSh0aGlzLHMsdCxvKTtJcyhlLG4udGV4dCwwLDAsaSx7Y29sb3I6bi5jb2xvcixtYXhXaWR0aDp1LHJvdGF0aW9uOmQsdGV4dEFsaWduOlZ1KG8sdCxyKSx0ZXh0QmFzZWxpbmU6YG1pZGRsZWAsdHJhbnNsYXRpb246W2MsbF19KX1kcmF3KGUpe3RoaXMuX2lzVmlzaWJsZSgpJiYodGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQoZSksdGhpcy5kcmF3Qm9yZGVyKCksdGhpcy5kcmF3VGl0bGUoKSx0aGlzLmRyYXdMYWJlbHMoZSkpfV9sYXllcnMoKXtsZXQgdD10aGlzLm9wdGlvbnMsbj10LnRpY2tzJiZ0LnRpY2tzLnp8fDAscj1xKHQuZ3JpZCYmdC5ncmlkLnosLTEpLGk9cSh0LmJvcmRlciYmdC5ib3JkZXIueiwwKTtyZXR1cm4hdGhpcy5faXNWaXNpYmxlKCl8fHRoaXMuZHJhdyE9PWUucHJvdG90eXBlLmRyYXc/W3t6Om4sZHJhdzplPT57dGhpcy5kcmF3KGUpfX1dOlt7ejpyLGRyYXc6ZT0+e3RoaXMuZHJhd0JhY2tncm91bmQoKSx0aGlzLmRyYXdHcmlkKGUpLHRoaXMuZHJhd1RpdGxlKCl9fSx7ejppLGRyYXc6KCk9Pnt0aGlzLmRyYXdCb3JkZXIoKX19LHt6Om4sZHJhdzplPT57dGhpcy5kcmF3TGFiZWxzKGUpfX1dfWdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKGUpe2xldCB0PXRoaXMuY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLG49dGhpcy5heGlzK2BBeGlzSURgLHI9W10saSxhO2ZvcihpPTAsYT10Lmxlbmd0aDtpPGE7KytpKXtsZXQgYT10W2ldO2Fbbl09PT10aGlzLmlkJiYoIWV8fGEudHlwZT09PWUpJiZyLnB1c2goYSl9cmV0dXJuIHJ9X3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoZSl7cmV0dXJuICQodGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGUpKS5mb250KX1fbWF4RGlnaXRzKCl7bGV0IGU9dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5saW5lSGVpZ2h0O3JldHVybih0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGg6dGhpcy5oZWlnaHQpL2V9fSxXdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5zY29wZT10LHRoaXMub3ZlcnJpZGU9bix0aGlzLml0ZW1zPU9iamVjdC5jcmVhdGUobnVsbCl9aXNGb3JUeXBlKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbCh0aGlzLnR5cGUucHJvdG90eXBlLGUucHJvdG90eXBlKX1yZWdpc3RlcihlKXtsZXQgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSksbjtxdSh0KSYmKG49dGhpcy5yZWdpc3Rlcih0KSk7bGV0IHI9dGhpcy5pdGVtcyxpPWUuaWQsYT10aGlzLnNjb3BlK2AuYCtpO2lmKCFpKXRocm93IEVycm9yKGBjbGFzcyBkb2VzIG5vdCBoYXZlIGlkOiBgK2UpO3JldHVybiBpIGluIHI/YToocltpXT1lLEd1KGUsYSxuKSx0aGlzLm92ZXJyaWRlJiZaLm92ZXJyaWRlKGUuaWQsZS5vdmVycmlkZXMpLGEpfWdldChlKXtyZXR1cm4gdGhpcy5pdGVtc1tlXX11bnJlZ2lzdGVyKGUpe2xldCB0PXRoaXMuaXRlbXMsbj1lLmlkLHI9dGhpcy5zY29wZTtuIGluIHQmJmRlbGV0ZSB0W25dLHImJm4gaW4gWltyXSYmKGRlbGV0ZSBaW3JdW25dLHRoaXMub3ZlcnJpZGUmJmRlbGV0ZSB5c1tuXSl9fTtmdW5jdGlvbiBHdShlLHQsbil7bGV0IHI9cm8oT2JqZWN0LmNyZWF0ZShudWxsKSxbbj9aLmdldChuKTp7fSxaLmdldCh0KSxlLmRlZmF1bHRzXSk7Wi5zZXQodCxyKSxlLmRlZmF1bHRSb3V0ZXMmJkt1KHQsZS5kZWZhdWx0Um91dGVzKSxlLmRlc2NyaXB0b3JzJiZaLmRlc2NyaWJlKHQsZS5kZXNjcmlwdG9ycyl9ZnVuY3Rpb24gS3UoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49PntsZXQgcj1uLnNwbGl0KGAuYCksaT1yLnBvcCgpLGE9W2VdLmNvbmNhdChyKS5qb2luKGAuYCksbz10W25dLnNwbGl0KGAuYCkscz1vLnBvcCgpLGM9by5qb2luKGAuYCk7Wi5yb3V0ZShhLGksYyxzKX0pfWZ1bmN0aW9uIHF1KGUpe3JldHVybmBpZGBpbiBlJiZgZGVmYXVsdHNgaW4gZX12YXIgSnU9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jb250cm9sbGVycz1uZXcgV3UobGwsYGRhdGFzZXRzYCwhMCksdGhpcy5lbGVtZW50cz1uZXcgV3UoQ3UsYGVsZW1lbnRzYCksdGhpcy5wbHVnaW5zPW5ldyBXdShPYmplY3QsYHBsdWdpbnNgKSx0aGlzLnNjYWxlcz1uZXcgV3UoVXUsYHNjYWxlc2ApLHRoaXMuX3R5cGVkUmVnaXN0cmllcz1bdGhpcy5jb250cm9sbGVycyx0aGlzLnNjYWxlcyx0aGlzLmVsZW1lbnRzXX1hZGQoLi4uZSl7dGhpcy5fZWFjaChgcmVnaXN0ZXJgLGUpfXJlbW92ZSguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlKX1hZGRDb250cm9sbGVycyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1hZGRFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGByZWdpc3RlcmAsZSx0aGlzLmVsZW1lbnRzKX1hZGRQbHVnaW5zKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMucGx1Z2lucyl9YWRkU2NhbGVzKC4uLmUpe3RoaXMuX2VhY2goYHJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1nZXRDb250cm9sbGVyKGUpe3JldHVybiB0aGlzLl9nZXQoZSx0aGlzLmNvbnRyb2xsZXJzLGBjb250cm9sbGVyYCl9Z2V0RWxlbWVudChlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5lbGVtZW50cyxgZWxlbWVudGApfWdldFBsdWdpbihlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5wbHVnaW5zLGBwbHVnaW5gKX1nZXRTY2FsZShlKXtyZXR1cm4gdGhpcy5fZ2V0KGUsdGhpcy5zY2FsZXMsYHNjYWxlYCl9cmVtb3ZlQ29udHJvbGxlcnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLmNvbnRyb2xsZXJzKX1yZW1vdmVFbGVtZW50cyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuZWxlbWVudHMpfXJlbW92ZVBsdWdpbnMoLi4uZSl7dGhpcy5fZWFjaChgdW5yZWdpc3RlcmAsZSx0aGlzLnBsdWdpbnMpfXJlbW92ZVNjYWxlcyguLi5lKXt0aGlzLl9lYWNoKGB1bnJlZ2lzdGVyYCxlLHRoaXMuc2NhbGVzKX1fZWFjaChlLHQsbil7Wy4uLnRdLmZvckVhY2godD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTtufHxyLmlzRm9yVHlwZSh0KXx8cj09PXRoaXMucGx1Z2lucyYmdC5pZD90aGlzLl9leGVjKGUscix0KTpZKHQsdD0+e2xldCByPW58fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0KTt0aGlzLl9leGVjKGUscix0KX0pfSl9X2V4ZWMoZSx0LG4pe2xldCByPXVvKGUpO0oobltgYmVmb3JlYCtyXSxbXSxuKSx0W2VdKG4pLEoobltgYWZ0ZXJgK3JdLFtdLG4pfV9nZXRSZWdpc3RyeUZvclR5cGUoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLl90eXBlZFJlZ2lzdHJpZXMubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5fdHlwZWRSZWdpc3RyaWVzW3RdO2lmKG4uaXNGb3JUeXBlKGUpKXJldHVybiBufXJldHVybiB0aGlzLnBsdWdpbnN9X2dldChlLHQsbil7bGV0IHI9dC5nZXQoZSk7aWYocj09PXZvaWQgMCl0aHJvdyBFcnJvcihgImArZStgIiBpcyBub3QgYSByZWdpc3RlcmVkIGArbitgLmApO3JldHVybiByfX0sWXU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9pbml0PXZvaWQgMH1ub3RpZnkoZSx0LG4scil7aWYodD09PWBiZWZvcmVJbml0YCYmKHRoaXMuX2luaXQ9dGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoZSwhMCksdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsZSxgaW5zdGFsbGApKSx0aGlzLl9pbml0PT09dm9pZCAwKXJldHVybjtsZXQgaT1yP3RoaXMuX2Rlc2NyaXB0b3JzKGUpLmZpbHRlcihyKTp0aGlzLl9kZXNjcmlwdG9ycyhlKSxhPXRoaXMuX25vdGlmeShpLGUsdCxuKTtyZXR1cm4gdD09PWBhZnRlckRlc3Ryb3lgJiYodGhpcy5fbm90aWZ5KGksZSxgc3RvcGApLHRoaXMuX25vdGlmeSh0aGlzLl9pbml0LGUsYHVuaW5zdGFsbGApLHRoaXMuX2luaXQ9dm9pZCAwKSxhfV9ub3RpZnkoZSx0LG4scil7cnx8PXt9O2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1pLnBsdWdpbixhPWVbbl07aWYoSihhLFt0LHIsaS5vcHRpb25zXSxlKT09PSExJiZyLmNhbmNlbGFibGUpcmV0dXJuITF9cmV0dXJuITB9aW52YWxpZGF0ZSgpe1UodGhpcy5fY2FjaGUpfHwodGhpcy5fb2xkQ2FjaGU9dGhpcy5fY2FjaGUsdGhpcy5fY2FjaGU9dm9pZCAwKX1fZGVzY3JpcHRvcnMoZSl7aWYodGhpcy5fY2FjaGUpcmV0dXJuIHRoaXMuX2NhY2hlO2xldCB0PXRoaXMuX2NhY2hlPXRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGUpO3JldHVybiB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXMoZSksdH1fY3JlYXRlRGVzY3JpcHRvcnMoZSx0KXtsZXQgbj1lJiZlLmNvbmZpZyxyPXEobi5vcHRpb25zJiZuLm9wdGlvbnMucGx1Z2lucyx7fSksaT1YdShuKTtyZXR1cm4gcj09PSExJiYhdD9bXTpRdShlLGkscix0KX1fbm90aWZ5U3RhdGVDaGFuZ2VzKGUpe2xldCB0PXRoaXMuX29sZENhY2hlfHxbXSxuPXRoaXMuX2NhY2hlLHI9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5wbHVnaW4uaWQ9PT10LnBsdWdpbi5pZCkpO3RoaXMuX25vdGlmeShyKHQsbiksZSxgc3RvcGApLHRoaXMuX25vdGlmeShyKG4sdCksZSxgc3RhcnRgKX19O2Z1bmN0aW9uIFh1KGUpe2xldCB0PXt9LG49W10scj1PYmplY3Qua2V5cyhKdS5wbHVnaW5zLml0ZW1zKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKyluLnB1c2goSnUuZ2V0UGx1Z2luKHJbZV0pKTtsZXQgaT1lLnBsdWdpbnN8fFtdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgcj1pW2VdO24uaW5kZXhPZihyKT09PS0xJiYobi5wdXNoKHIpLHRbci5pZF09ITApfXJldHVybntwbHVnaW5zOm4sbG9jYWxJZHM6dH19ZnVuY3Rpb24gWnUoZSx0KXtyZXR1cm4hdCYmZT09PSExP251bGw6ZT09PSEwP3t9OmV9ZnVuY3Rpb24gUXUoZSx7cGx1Z2luczp0LGxvY2FsSWRzOm59LHIsaSl7bGV0IGE9W10sbz1lLmdldENvbnRleHQoKTtmb3IobGV0IHMgb2YgdCl7bGV0IHQ9cy5pZCxjPVp1KHJbdF0saSk7YyE9PW51bGwmJmEucHVzaCh7cGx1Z2luOnMsb3B0aW9uczokdShlLmNvbmZpZyx7cGx1Z2luOnMsbG9jYWw6blt0XX0sYyxvKX0pfXJldHVybiBhfWZ1bmN0aW9uICR1KGUse3BsdWdpbjp0LGxvY2FsOm59LHIsaSl7bGV0IGE9ZS5wbHVnaW5TY29wZUtleXModCksbz1lLmdldE9wdGlvblNjb3BlcyhyLGEpO3JldHVybiBuJiZ0LmRlZmF1bHRzJiZvLnB1c2godC5kZWZhdWx0cyksZS5jcmVhdGVSZXNvbHZlcihvLGksW2BgXSx7c2NyaXB0YWJsZTohMSxpbmRleGFibGU6ITEsYWxsS2V5czohMH0pfWZ1bmN0aW9uIGVkKGUsdCl7bGV0IG49Wi5kYXRhc2V0c1tlXXx8e307cmV0dXJuKCh0LmRhdGFzZXRzfHx7fSlbZV18fHt9KS5pbmRleEF4aXN8fHQuaW5kZXhBeGlzfHxuLmluZGV4QXhpc3x8YHhgfWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZTtyZXR1cm4gZT09PWBfaW5kZXhfYD9uPXQ6ZT09PWBfdmFsdWVfYCYmKG49dD09PWB4YD9geWA6YHhgKSxufWZ1bmN0aW9uIG5kKGUsdCl7cmV0dXJuIGU9PT10P2BfaW5kZXhfYDpgX3ZhbHVlX2B9ZnVuY3Rpb24gcmQoZSl7aWYoZT09PWB4YHx8ZT09PWB5YHx8ZT09PWByYClyZXR1cm4gZX1mdW5jdGlvbiBpZChlKXtpZihlPT09YHRvcGB8fGU9PT1gYm90dG9tYClyZXR1cm5geGA7aWYoZT09PWBsZWZ0YHx8ZT09PWByaWdodGApcmV0dXJuYHlgfWZ1bmN0aW9uIGFkKGUsLi4udCl7aWYocmQoZSkpcmV0dXJuIGU7Zm9yKGxldCBuIG9mIHQpe2xldCB0PW4uYXhpc3x8aWQobi5wb3NpdGlvbil8fGUubGVuZ3RoPjEmJnJkKGVbMF0udG9Mb3dlckNhc2UoKSk7aWYodClyZXR1cm4gdH10aHJvdyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke2V9JyBheGlzLiBQbGVhc2UgcHJvdmlkZSAnYXhpcycgb3IgJ3Bvc2l0aW9uJyBvcHRpb24uYCl9ZnVuY3Rpb24gb2QoZSx0LG4pe2lmKG5bdCtgQXhpc0lEYF09PT1lKXJldHVybntheGlzOnR9fWZ1bmN0aW9uIHNkKGUsdCl7aWYodC5kYXRhJiZ0LmRhdGEuZGF0YXNldHMpe2xldCBuPXQuZGF0YS5kYXRhc2V0cy5maWx0ZXIodD0+dC54QXhpc0lEPT09ZXx8dC55QXhpc0lEPT09ZSk7aWYobi5sZW5ndGgpcmV0dXJuIG9kKGUsYHhgLG5bMF0pfHxvZChlLGB5YCxuWzBdKX1yZXR1cm57fX1mdW5jdGlvbiBjZChlLHQpe2xldCBuPXlzW2UudHlwZV18fHtzY2FsZXM6e319LHI9dC5zY2FsZXN8fHt9LGk9ZWQoZS50eXBlLHQpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCh0PT57bGV0IG89clt0XTtpZighRyhvKSlyZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHt0fWApO2lmKG8uX3Byb3h5KXJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHt0fWApO2xldCBzPWFkKHQsbyxzZCh0LGUpLFouc2NhbGVzW28udHlwZV0pLGM9bmQocyxpKSxsPW4uc2NhbGVzfHx7fTthW3RdPWlvKE9iamVjdC5jcmVhdGUobnVsbCksW3theGlzOnN9LG8sbFtzXSxsW2NdXSl9KSxlLmRhdGEuZGF0YXNldHMuZm9yRWFjaChuPT57bGV0IGk9bi50eXBlfHxlLnR5cGUsbz1uLmluZGV4QXhpc3x8ZWQoaSx0KSxzPSh5c1tpXXx8e30pLnNjYWxlc3x8e307T2JqZWN0LmtleXMocykuZm9yRWFjaChlPT57bGV0IHQ9dGQoZSxvKSxpPW5bdCtgQXhpc0lEYF18fHQ7YVtpXT1hW2ldfHxPYmplY3QuY3JlYXRlKG51bGwpLGlvKGFbaV0sW3theGlzOnR9LHJbaV0sc1tlXV0pfSl9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGU9PntsZXQgdD1hW2VdO2lvKHQsW1ouc2NhbGVzW3QudHlwZV0sWi5zY2FsZV0pfSksYX1mdW5jdGlvbiBsZChlKXtsZXQgdD1lLm9wdGlvbnN8fD17fTt0LnBsdWdpbnM9cSh0LnBsdWdpbnMse30pLHQuc2NhbGVzPWNkKGUsdCl9ZnVuY3Rpb24gdWQoZSl7cmV0dXJuIGV8fD17fSxlLmRhdGFzZXRzPWUuZGF0YXNldHN8fFtdLGUubGFiZWxzPWUubGFiZWxzfHxbXSxlfWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlfHw9e30sZS5kYXRhPXVkKGUuZGF0YSksbGQoZSksZX12YXIgZmQ9bmV3IE1hcCxwZD1uZXcgU2V0O2Z1bmN0aW9uIG1kKGUsdCl7bGV0IG49ZmQuZ2V0KGUpO3JldHVybiBufHwobj10KCksZmQuc2V0KGUsbikscGQuYWRkKG4pKSxufXZhciBoZD0oZSx0LG4pPT57bGV0IHI9bG8odCxuKTtyIT09dm9pZCAwJiZlLmFkZChyKX0sZ2Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fY29uZmlnPWRkKGUpLHRoaXMuX3Njb3BlQ2FjaGU9bmV3IE1hcCx0aGlzLl9yZXNvbHZlckNhY2hlPW5ldyBNYXB9Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5wbGF0Zm9ybX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl9jb25maWcudHlwZX1zZXQgdHlwZShlKXt0aGlzLl9jb25maWcudHlwZT1lfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuX2NvbmZpZy5kYXRhPXVkKGUpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuX2NvbmZpZy5vcHRpb25zPWV9Z2V0IHBsdWdpbnMoKXtyZXR1cm4gdGhpcy5fY29uZmlnLnBsdWdpbnN9dXBkYXRlKCl7bGV0IGU9dGhpcy5fY29uZmlnO3RoaXMuY2xlYXJDYWNoZSgpLGxkKGUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9zY29wZUNhY2hlLmNsZWFyKCksdGhpcy5fcmVzb2x2ZXJDYWNoZS5jbGVhcigpfWRhdGFzZXRTY29wZUtleXMoZSl7cmV0dXJuIG1kKGUsKCk9PltbYGRhdGFzZXRzLiR7ZX1gLGBgXV0pfWRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0udHJhbnNpdGlvbi4ke3R9YCwoKT0+W1tgZGF0YXNldHMuJHtlfS50cmFuc2l0aW9ucy4ke3R9YCxgdHJhbnNpdGlvbnMuJHt0fWBdLFtgZGF0YXNldHMuJHtlfWAsYGBdXSl9ZGF0YXNldEVsZW1lbnRTY29wZUtleXMoZSx0KXtyZXR1cm4gbWQoYCR7ZX0tJHt0fWAsKCk9PltbYGRhdGFzZXRzLiR7ZX0uZWxlbWVudHMuJHt0fWAsYGRhdGFzZXRzLiR7ZX1gLGBlbGVtZW50cy4ke3R9YCxgYF1dKX1wbHVnaW5TY29wZUtleXMoZSl7bGV0IHQ9ZS5pZCxuPXRoaXMudHlwZTtyZXR1cm4gbWQoYCR7bn0tcGx1Z2luLSR7dH1gLCgpPT5bW2BwbHVnaW5zLiR7dH1gLC4uLmUuYWRkaXRpb25hbE9wdGlvblNjb3Blc3x8W11dXSl9X2NhY2hlZFNjb3BlcyhlLHQpe2xldCBuPXRoaXMuX3Njb3BlQ2FjaGUscj1uLmdldChlKTtyZXR1cm4oIXJ8fHQpJiYocj1uZXcgTWFwLG4uc2V0KGUscikpLHJ9Z2V0T3B0aW9uU2NvcGVzKGUsdCxuKXtsZXR7b3B0aW9uczpyLHR5cGU6aX09dGhpcyxhPXRoaXMuX2NhY2hlZFNjb3BlcyhlLG4pLG89YS5nZXQodCk7aWYobylyZXR1cm4gbztsZXQgcz1uZXcgU2V0O3QuZm9yRWFjaCh0PT57ZSYmKHMuYWRkKGUpLHQuZm9yRWFjaCh0PT5oZChzLGUsdCkpKSx0LmZvckVhY2goZT0+aGQocyxyLGUpKSx0LmZvckVhY2goZT0+aGQocyx5c1tpXXx8e30sZSkpLHQuZm9yRWFjaChlPT5oZChzLFosZSkpLHQuZm9yRWFjaChlPT5oZChzLGJzLGUpKX0pO2xldCBjPUFycmF5LmZyb20ocyk7cmV0dXJuIGMubGVuZ3RoPT09MCYmYy5wdXNoKE9iamVjdC5jcmVhdGUobnVsbCkpLHBkLmhhcyh0KSYmYS5zZXQodCxjKSxjfWNoYXJ0T3B0aW9uU2NvcGVzKCl7bGV0e29wdGlvbnM6ZSx0eXBlOnR9PXRoaXM7cmV0dXJuW2UseXNbdF18fHt9LFouZGF0YXNldHNbdF18fHt9LHt0eXBlOnR9LFosYnNdfXJlc29sdmVOYW1lZE9wdGlvbnMoZSx0LG4scj1bYGBdKXtsZXQgaT17JHNoYXJlZDohMH0se3Jlc29sdmVyOmEsc3ViUHJlZml4ZXM6b309X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLHIpLHM9YTtpZih5ZChhLHQpKXtpLiRzaGFyZWQ9ITEsbj1wbyhuKT9uKCk6bjtsZXQgdD10aGlzLmNyZWF0ZVJlc29sdmVyKGUsbixvKTtzPVlzKGEsbix0KX1mb3IobGV0IGUgb2YgdClpW2VdPXNbZV07cmV0dXJuIGl9Y3JlYXRlUmVzb2x2ZXIoZSx0LG49W2BgXSxyKXtsZXR7cmVzb2x2ZXI6aX09X2QodGhpcy5fcmVzb2x2ZXJDYWNoZSxlLG4pO3JldHVybiBHKHQpP1lzKGksdCx2b2lkIDAscik6aX19O2Z1bmN0aW9uIF9kKGUsdCxuKXtsZXQgcj1lLmdldCh0KTtyfHwocj1uZXcgTWFwLGUuc2V0KHQscikpO2xldCBpPW4uam9pbigpLGE9ci5nZXQoaSk7cmV0dXJuIGF8fChhPXtyZXNvbHZlcjpKcyh0LG4pLHN1YlByZWZpeGVzOm4uZmlsdGVyKGU9PiFlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYGhvdmVyYCkpfSxyLnNldChpLGEpKSxhfXZhciB2ZD1lPT5HKGUpJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5zb21lKHQ9PnBvKGVbdF0pKTtmdW5jdGlvbiB5ZChlLHQpe2xldHtpc1NjcmlwdGFibGU6bixpc0luZGV4YWJsZTpyfT1YcyhlKTtmb3IobGV0IGkgb2YgdCl7bGV0IHQ9bihpKSxhPXIoaSksbz0oYXx8dCkmJmVbaV07aWYodCYmKHBvKG8pfHx2ZChvKSl8fGEmJlcobykpcmV0dXJuITB9cmV0dXJuITF9dmFyIGJkPWA0LjUuMWAseGQ9W2B0b3BgLGBib3R0b21gLGBsZWZ0YCxgcmlnaHRgLGBjaGFydEFyZWFgXTtmdW5jdGlvbiBTZChlLHQpe3JldHVybiBlPT09YHRvcGB8fGU9PT1gYm90dG9tYHx8eGQuaW5kZXhPZihlKT09PS0xJiZ0PT09YHhgfWZ1bmN0aW9uIENkKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bZV09PT1yW2VdP25bdF0tclt0XTpuW2VdLXJbZV19fWZ1bmN0aW9uIHdkKGUpe2xldCB0PWUuY2hhcnQsbj10Lm9wdGlvbnMuYW5pbWF0aW9uO3Qubm90aWZ5UGx1Z2lucyhgYWZ0ZXJSZW5kZXJgKSxKKG4mJm4ub25Db21wbGV0ZSxbZV0sdCl9ZnVuY3Rpb24gVGQoZSl7bGV0IHQ9ZS5jaGFydCxuPXQub3B0aW9ucy5hbmltYXRpb247SihuJiZuLm9uUHJvZ3Jlc3MsW2VdLHQpfWZ1bmN0aW9uIEVkKGUpe3JldHVybiBwYygpJiZ0eXBlb2YgZT09YHN0cmluZ2A/ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplJiZlLmxlbmd0aCYmKGU9ZVswXSksZSYmZS5jYW52YXMmJihlPWUuY2FudmFzKSxlfXZhciBEZD17fSxPZD1lPT57bGV0IHQ9RWQoZSk7cmV0dXJuIE9iamVjdC52YWx1ZXMoRGQpLmZpbHRlcihlPT5lLmNhbnZhcz09PXQpLnBvcCgpfTtmdW5jdGlvbiBrZChlLHQsbil7bGV0IHI9T2JqZWN0LmtleXMoZSk7Zm9yKGxldCBpIG9mIHIpe2xldCByPStpO2lmKHI+PXQpe2xldCBhPWVbaV07ZGVsZXRlIGVbaV0sKG4+MHx8cj50KSYmKGVbcituXT1hKX19fWZ1bmN0aW9uIEFkKGUsdCxuLHIpe3JldHVybiFufHxlLnR5cGU9PT1gbW91c2VvdXRgP251bGw6cj90OmV9dmFyIGpkPWNsYXNze3N0YXRpYyBkZWZhdWx0cz1aO3N0YXRpYyBpbnN0YW5jZXM9RGQ7c3RhdGljIG92ZXJyaWRlcz15cztzdGF0aWMgcmVnaXN0cnk9SnU7c3RhdGljIHZlcnNpb249YmQ7c3RhdGljIGdldENoYXJ0PU9kO3N0YXRpYyByZWdpc3RlciguLi5lKXtKdS5hZGQoLi4uZSksTWQoKX1zdGF0aWMgdW5yZWdpc3RlciguLi5lKXtKdS5yZW1vdmUoLi4uZSksTWQoKX1jb25zdHJ1Y3RvcihlLHQpe2xldCBuPXRoaXMuY29uZmlnPW5ldyBnZCh0KSxyPUVkKGUpLGk9T2Qocik7aWYoaSl0aHJvdyBFcnJvcihgQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEICdgK2kuaWQrYCcgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjYW52YXMgd2l0aCBJRCAnYCtpLmNhbnZhcy5pZCtgJyBjYW4gYmUgcmV1c2VkLmApO2xldCBhPW4uY3JlYXRlUmVzb2x2ZXIobi5jaGFydE9wdGlvblNjb3BlcygpLHRoaXMuZ2V0Q29udGV4dCgpKTt0aGlzLnBsYXRmb3JtPW5ldyhuLnBsYXRmb3JtfHwoU3UocikpKSx0aGlzLnBsYXRmb3JtLnVwZGF0ZUNvbmZpZyhuKTtsZXQgbz10aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KHIsYS5hc3BlY3RSYXRpbykscz1vJiZvLmNhbnZhcyxjPXMmJnMuaGVpZ2h0LGw9cyYmcy53aWR0aDtpZih0aGlzLmlkPVhhKCksdGhpcy5jdHg9byx0aGlzLmNhbnZhcz1zLHRoaXMud2lkdGg9bCx0aGlzLmhlaWdodD1jLHRoaXMuX29wdGlvbnM9YSx0aGlzLl9hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHRoaXMuX2xheWVycz1bXSx0aGlzLl9tZXRhc2V0cz1bXSx0aGlzLl9zdGFja3M9dm9pZCAwLHRoaXMuYm94ZXM9W10sdGhpcy5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz12b2lkIDAsdGhpcy5jaGFydEFyZWE9dm9pZCAwLHRoaXMuX2FjdGl2ZT1bXSx0aGlzLl9sYXN0RXZlbnQ9dm9pZCAwLHRoaXMuX2xpc3RlbmVycz17fSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zb3J0ZWRNZXRhc2V0cz1bXSx0aGlzLnNjYWxlcz17fSx0aGlzLl9wbHVnaW5zPW5ldyBZdSx0aGlzLiRwcm94aWVzPXt9LHRoaXMuX2hpZGRlbkluZGljZXM9e30sdGhpcy5hdHRhY2hlZD0hMSx0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQ9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX2RvUmVzaXplPVpvKGU9PnRoaXMudXBkYXRlKGUpLGEucmVzaXplRGVsYXl8fDApLHRoaXMuX2RhdGFDaGFuZ2VzPVtdLERkW3RoaXMuaWRdPXRoaXMsIW98fCFzKXtjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNoYXJ0OiBjYW4ndCBhY3F1aXJlIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gaXRlbWApO3JldHVybn1MYy5saXN0ZW4odGhpcyxgY29tcGxldGVgLHdkKSxMYy5saXN0ZW4odGhpcyxgcHJvZ3Jlc3NgLFRkKSx0aGlzLl9pbml0aWFsaXplKCksdGhpcy5hdHRhY2hlZCYmdGhpcy51cGRhdGUoKX1nZXQgYXNwZWN0UmF0aW8oKXtsZXR7b3B0aW9uczp7YXNwZWN0UmF0aW86ZSxtYWludGFpbkFzcGVjdFJhdGlvOnR9LHdpZHRoOm4saGVpZ2h0OnIsX2FzcGVjdFJhdGlvOml9PXRoaXM7cmV0dXJuIFUoZSk/dCYmaT9pOnI/bi9yOm51bGw6ZX1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmNvbmZpZy5kYXRhfXNldCBkYXRhKGUpe3RoaXMuY29uZmlnLmRhdGE9ZX1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9vcHRpb25zfXNldCBvcHRpb25zKGUpe3RoaXMuY29uZmlnLm9wdGlvbnM9ZX1nZXQgcmVnaXN0cnkoKXtyZXR1cm4gSnV9X2luaXRpYWxpemUoKXtyZXR1cm4gdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVJbml0YCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5yZXNpemUoKTpFYyh0aGlzLHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmJpbmRFdmVudHMoKSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVySW5pdGApLHRoaXN9Y2xlYXIoKXtyZXR1cm4gRHModGhpcy5jYW52YXMsdGhpcy5jdHgpLHRoaXN9c3RvcCgpe3JldHVybiBMYy5zdG9wKHRoaXMpLHRoaXN9cmVzaXplKGUsdCl7TGMucnVubmluZyh0aGlzKT90aGlzLl9yZXNpemVCZWZvcmVEcmF3PXt3aWR0aDplLGhlaWdodDp0fTp0aGlzLl9yZXNpemUoZSx0KX1fcmVzaXplKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLHI9dGhpcy5jYW52YXMsaT1uLm1haW50YWluQXNwZWN0UmF0aW8mJnRoaXMuYXNwZWN0UmF0aW8sYT10aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKHIsZSx0LGkpLG89bi5kZXZpY2VQaXhlbFJhdGlvfHx0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKSxzPXRoaXMud2lkdGg/YHJlc2l6ZWA6YGF0dGFjaGA7dGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuX2FzcGVjdFJhdGlvPXRoaXMuYXNwZWN0UmF0aW8sRWModGhpcyxvLCEwKSYmKHRoaXMubm90aWZ5UGx1Z2lucyhgcmVzaXplYCx7c2l6ZTphfSksSihuLm9uUmVzaXplLFt0aGlzLGFdLHRoaXMpLHRoaXMuYXR0YWNoZWQmJnRoaXMuX2RvUmVzaXplKHMpJiZ0aGlzLnJlbmRlcigpKX1lbnN1cmVTY2FsZXNIYXZlSURzKCl7WSh0aGlzLm9wdGlvbnMuc2NhbGVzfHx7fSwoZSx0KT0+e2UuaWQ9dH0pfWJ1aWxkT3JVcGRhdGVTY2FsZXMoKXtsZXQgZT10aGlzLm9wdGlvbnMsdD1lLnNjYWxlcyxuPXRoaXMuc2NhbGVzLHI9T2JqZWN0LmtleXMobikucmVkdWNlKChlLHQpPT4oZVt0XT0hMSxlKSx7fSksaT1bXTt0JiYoaT1pLmNvbmNhdChPYmplY3Qua2V5cyh0KS5tYXAoZT0+e2xldCBuPXRbZV0scj1hZChlLG4pLGk9cj09PWByYCxhPXI9PT1geGA7cmV0dXJue29wdGlvbnM6bixkcG9zaXRpb246aT9gY2hhcnRBcmVhYDphP2Bib3R0b21gOmBsZWZ0YCxkdHlwZTppP2ByYWRpYWxMaW5lYXJgOmE/YGNhdGVnb3J5YDpgbGluZWFyYH19KSkpLFkoaSx0PT57bGV0IGk9dC5vcHRpb25zLGE9aS5pZCxvPWFkKGEsaSkscz1xKGkudHlwZSx0LmR0eXBlKTsoaS5wb3NpdGlvbj09PXZvaWQgMHx8U2QoaS5wb3NpdGlvbixvKSE9PVNkKHQuZHBvc2l0aW9uKSkmJihpLnBvc2l0aW9uPXQuZHBvc2l0aW9uKSxyW2FdPSEwO2xldCBjPW51bGw7YSBpbiBuJiZuW2FdLnR5cGU9PT1zP2M9blthXTooYz1uZXcoSnUuZ2V0U2NhbGUocykpKHtpZDphLHR5cGU6cyxjdHg6dGhpcy5jdHgsY2hhcnQ6dGhpc30pLG5bYy5pZF09YyksYy5pbml0KGksZSl9KSxZKHIsKGUsdCk9PntlfHxkZWxldGUgblt0XX0pLFkobixlPT57JGwuY29uZmlndXJlKHRoaXMsZSxlLm9wdGlvbnMpLCRsLmFkZEJveCh0aGlzLGUpfSl9X3VwZGF0ZU1ldGFzZXRzKCl7bGV0IGU9dGhpcy5fbWV0YXNldHMsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49ZS5sZW5ndGg7aWYoZS5zb3J0KChlLHQpPT5lLmluZGV4LXQuaW5kZXgpLG4+dCl7Zm9yKGxldCBlPXQ7ZTxuOysrZSl0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoZSk7ZS5zcGxpY2UodCxuLXQpfXRoaXMuX3NvcnRlZE1ldGFzZXRzPWUuc2xpY2UoMCkuc29ydChDZChgb3JkZXJgLGBpbmRleGApKX1fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKXtsZXR7X21ldGFzZXRzOmUsZGF0YTp7ZGF0YXNldHM6dH19PXRoaXM7ZS5sZW5ndGg+dC5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9zdGFja3MsZS5mb3JFYWNoKChlLG4pPT57dC5maWx0ZXIodD0+dD09PWUuX2RhdGFzZXQpLmxlbmd0aD09PTAmJnRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShuKX0pfWJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpe2xldCBlPVtdLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLG4scjtmb3IodGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtsZXQgcj10W25dLGk9dGhpcy5nZXREYXRhc2V0TWV0YShuKSxhPXIudHlwZXx8dGhpcy5jb25maWcudHlwZTtpZihpLnR5cGUmJmkudHlwZSE9PWEmJih0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEobiksaT10aGlzLmdldERhdGFzZXRNZXRhKG4pKSxpLnR5cGU9YSxpLmluZGV4QXhpcz1yLmluZGV4QXhpc3x8ZWQoYSx0aGlzLm9wdGlvbnMpLGkub3JkZXI9ci5vcmRlcnx8MCxpLmluZGV4PW4saS5sYWJlbD1gYCtyLmxhYmVsLGkudmlzaWJsZT10aGlzLmlzRGF0YXNldFZpc2libGUobiksaS5jb250cm9sbGVyKWkuY29udHJvbGxlci51cGRhdGVJbmRleChuKSxpLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO2Vsc2V7bGV0IHQ9SnUuZ2V0Q29udHJvbGxlcihhKSx7ZGF0YXNldEVsZW1lbnRUeXBlOnIsZGF0YUVsZW1lbnRUeXBlOm99PVouZGF0YXNldHNbYV07T2JqZWN0LmFzc2lnbih0LHtkYXRhRWxlbWVudFR5cGU6SnUuZ2V0RWxlbWVudChvKSxkYXRhc2V0RWxlbWVudFR5cGU6ciYmSnUuZ2V0RWxlbWVudChyKX0pLGkuY29udHJvbGxlcj1uZXcgdCh0aGlzLG4pLGUucHVzaChpLmNvbnRyb2xsZXIpfX1yZXR1cm4gdGhpcy5fdXBkYXRlTWV0YXNldHMoKSxlfV9yZXNldEVsZW1lbnRzKCl7WSh0aGlzLmRhdGEuZGF0YXNldHMsKGUsdCk9Pnt0aGlzLmdldERhdGFzZXRNZXRhKHQpLmNvbnRyb2xsZXIucmVzZXQoKX0sdGhpcyl9cmVzZXQoKXt0aGlzLl9yZXNldEVsZW1lbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKGByZXNldGApfXVwZGF0ZShlKXtsZXQgdD10aGlzLmNvbmZpZzt0LnVwZGF0ZSgpO2xldCBuPXRoaXMuX29wdGlvbnM9dC5jcmVhdGVSZXNvbHZlcih0LmNoYXJ0T3B0aW9uU2NvcGVzKCksdGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSFuLmFuaW1hdGlvbjtpZih0aGlzLl91cGRhdGVTY2FsZXMoKSx0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKSx0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCksdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCksdGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVVcGRhdGVgLHttb2RlOmUsY2FuY2VsYWJsZTohMH0pPT09ITEpcmV0dXJuO2xldCBpPXRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVFbGVtZW50c1VwZGF0ZWApO2xldCBhPTA7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDtlKyspe2xldHtjb250cm9sbGVyOnR9PXRoaXMuZ2V0RGF0YXNldE1ldGEoZSksbj0hciYmaS5pbmRleE9mKHQpPT09LTE7dC5idWlsZE9yVXBkYXRlRWxlbWVudHMobiksYT1NYXRoLm1heCgrdC5nZXRNYXhPdmVyZmxvdygpLGEpfWE9dGhpcy5fbWluUGFkZGluZz1uLmxheW91dC5hdXRvUGFkZGluZz9hOjAsdGhpcy5fdXBkYXRlTGF5b3V0KGEpLHJ8fFkoaSxlPT57ZS5yZXNldCgpfSksdGhpcy5fdXBkYXRlRGF0YXNldHMoZSksdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlclVwZGF0ZWAse21vZGU6ZX0pLHRoaXMuX2xheWVycy5zb3J0KENkKGB6YCxgX2lkeGApKTtsZXR7X2FjdGl2ZTpvLF9sYXN0RXZlbnQ6c309dGhpcztzP3RoaXMuX2V2ZW50SGFuZGxlcihzLCEwKTpvLmxlbmd0aCYmdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMobyxvLCEwKSx0aGlzLnJlbmRlcigpfV91cGRhdGVTY2FsZXMoKXtZKHRoaXMuc2NhbGVzLGU9PnskbC5yZW1vdmVCb3godGhpcyxlKX0pLHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpLHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpfV9jaGVja0V2ZW50QmluZGluZ3MoKXtsZXQgZT10aGlzLm9wdGlvbnM7KCFtbyhuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpLG5ldyBTZXQoZS5ldmVudHMpKXx8ISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzIT09ZS5yZXNwb25zaXZlKSYmKHRoaXMudW5iaW5kRXZlbnRzKCksdGhpcy5iaW5kRXZlbnRzKCkpfV91cGRhdGVIaWRkZW5JbmRpY2VzKCl7bGV0e19oaWRkZW5JbmRpY2VzOmV9PXRoaXMsdD10aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXx8W107Zm9yKGxldHttZXRob2Q6bixzdGFydDpyLGNvdW50Oml9b2YgdClrZChlLHIsbj09PWBfcmVtb3ZlRWxlbWVudHNgPy1pOmkpfV9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXtsZXQgZT10aGlzLl9kYXRhQ2hhbmdlcztpZighZXx8IWUubGVuZ3RoKXJldHVybjt0aGlzLl9kYXRhQ2hhbmdlcz1bXTtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLG49dD0+bmV3IFNldChlLmZpbHRlcihlPT5lWzBdPT09dCkubWFwKChlLHQpPT50K2AsYCtlLnNwbGljZSgxKS5qb2luKGAsYCkpKSxyPW4oMCk7Zm9yKGxldCBlPTE7ZTx0O2UrKylpZighbW8ocixuKGUpKSlyZXR1cm47cmV0dXJuIEFycmF5LmZyb20ocikubWFwKGU9PmUuc3BsaXQoYCxgKSkubWFwKGU9Pih7bWV0aG9kOmVbMV0sc3RhcnQ6K2VbMl0sY291bnQ6K2VbM119KSl9X3VwZGF0ZUxheW91dChlKXtpZih0aGlzLm5vdGlmeVBsdWdpbnMoYGJlZm9yZUxheW91dGAse2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjskbC51cGRhdGUodGhpcyx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LGUpO2xldCB0PXRoaXMuY2hhcnRBcmVhLG49dC53aWR0aDw9MHx8dC5oZWlnaHQ8PTA7dGhpcy5fbGF5ZXJzPVtdLFkodGhpcy5ib3hlcyxlPT57biYmZS5wb3NpdGlvbj09PWBjaGFydEFyZWFgfHwoZS5jb25maWd1cmUmJmUuY29uZmlndXJlKCksdGhpcy5fbGF5ZXJzLnB1c2goLi4uZS5fbGF5ZXJzKCkpKX0sdGhpcyksdGhpcy5fbGF5ZXJzLmZvckVhY2goKGUsdCk9PntlLl9pZHg9dH0pLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJMYXlvdXRgKX1fdXBkYXRlRGF0YXNldHMoZSl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZSxjYW5jZWxhYmxlOiEwfSkhPT0hMSl7Zm9yKGxldCBlPTAsdD10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO2U8dDsrK2UpdGhpcy5nZXREYXRhc2V0TWV0YShlKS5jb250cm9sbGVyLmNvbmZpZ3VyZSgpO2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDt0PG47Kyt0KXRoaXMuX3VwZGF0ZURhdGFzZXQodCxwbyhlKT9lKHtkYXRhc2V0SW5kZXg6dH0pOmUpO3RoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAse21vZGU6ZX0pfX1fdXBkYXRlRGF0YXNldChlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSkscj17bWV0YTpuLGluZGV4OmUsbW9kZTp0LGNhbmNlbGFibGU6ITB9O3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRGF0YXNldFVwZGF0ZWAscikhPT0hMSYmKG4uY29udHJvbGxlci5fdXBkYXRlKHQpLHIuY2FuY2VsYWJsZT0hMSx0aGlzLm5vdGlmeVBsdWdpbnMoYGFmdGVyRGF0YXNldFVwZGF0ZWAscikpfXJlbmRlcigpe3RoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlUmVuZGVyYCx7Y2FuY2VsYWJsZTohMH0pIT09ITEmJihMYy5oYXModGhpcyk/dGhpcy5hdHRhY2hlZCYmIUxjLnJ1bm5pbmcodGhpcykmJkxjLnN0YXJ0KHRoaXMpOih0aGlzLmRyYXcoKSx3ZCh7Y2hhcnQ6dGhpc30pKSl9ZHJhdygpe2xldCBlO2lmKHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcpe2xldHt3aWR0aDplLGhlaWdodDp0fT10aGlzLl9yZXNpemVCZWZvcmVEcmF3O3RoaXMuX3Jlc2l6ZUJlZm9yZURyYXc9bnVsbCx0aGlzLl9yZXNpemUoZSx0KX1pZih0aGlzLmNsZWFyKCksdGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTB8fHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRHJhd2Ase2NhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjtsZXQgdD10aGlzLl9sYXllcnM7Zm9yKGU9MDtlPHQubGVuZ3RoJiZ0W2VdLno8PTA7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7Zm9yKHRoaXMuX2RyYXdEYXRhc2V0cygpO2U8dC5sZW5ndGg7KytlKXRbZV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRyYXdgKX1fZ2V0U29ydGVkRGF0YXNldE1ldGFzKGUpe2xldCB0PXRoaXMuX3NvcnRlZE1ldGFzZXRzLG49W10scixpO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7KytyKXtsZXQgaT10W3JdOyghZXx8aS52aXNpYmxlKSYmbi5wdXNoKGkpfXJldHVybiBufWdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKXtyZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCEwKX1fZHJhd0RhdGFzZXRzKCl7aWYodGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0c0RyYXdgLHtjYW5jZWxhYmxlOiEwfSk9PT0hMSlyZXR1cm47bGV0IGU9dGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5fZHJhd0RhdGFzZXQoZVt0XSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXRzRHJhd2ApfV9kcmF3RGF0YXNldChlKXtsZXQgdD10aGlzLmN0eCxuPXttZXRhOmUsaW5kZXg6ZS5pbmRleCxjYW5jZWxhYmxlOiEwfSxyPUljKHRoaXMsZSk7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEYXRhc2V0RHJhd2AsbikhPT0hMSYmKHImJmpzKHQsciksZS5jb250cm9sbGVyLmRyYXcoKSxyJiZNcyh0KSxuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckRhdGFzZXREcmF3YCxuKSl9aXNQb2ludEluQXJlYShlKXtyZXR1cm4gQXMoZSx0aGlzLmNoYXJ0QXJlYSx0aGlzLl9taW5QYWRkaW5nKX1nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsdCxuLHIpe2xldCBpPUlsLm1vZGVzW3RdO3JldHVybiB0eXBlb2YgaT09YGZ1bmN0aW9uYD9pKHRoaXMsZSxuLHIpOltdfWdldERhdGFzZXRNZXRhKGUpe2xldCB0PXRoaXMuZGF0YS5kYXRhc2V0c1tlXSxuPXRoaXMuX21ldGFzZXRzLHI9bi5maWx0ZXIoZT0+ZSYmZS5fZGF0YXNldD09PXQpLnBvcCgpO3JldHVybiByfHwocj17dHlwZTpudWxsLGRhdGE6W10sZGF0YXNldDpudWxsLGNvbnRyb2xsZXI6bnVsbCxoaWRkZW46bnVsbCx4QXhpc0lEOm51bGwseUF4aXNJRDpudWxsLG9yZGVyOnQmJnQub3JkZXJ8fDAsaW5kZXg6ZSxfZGF0YXNldDp0LF9wYXJzZWQ6W10sX3NvcnRlZDohMX0sbi5wdXNoKHIpKSxyfWdldENvbnRleHQoKXtyZXR1cm4gdGhpcy4kY29udGV4dHx8PXFzKG51bGwse2NoYXJ0OnRoaXMsdHlwZTpgY2hhcnRgfSl9Z2V0VmlzaWJsZURhdGFzZXRDb3VudCgpe3JldHVybiB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5sZW5ndGh9aXNEYXRhc2V0VmlzaWJsZShlKXtsZXQgdD10aGlzLmRhdGEuZGF0YXNldHNbZV07aWYoIXQpcmV0dXJuITE7bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtyZXR1cm4gdHlwZW9mIG4uaGlkZGVuPT1gYm9vbGVhbmA/IW4uaGlkZGVuOiF0LmhpZGRlbn1zZXREYXRhc2V0VmlzaWJpbGl0eShlLHQpe2xldCBuPXRoaXMuZ2V0RGF0YXNldE1ldGEoZSk7bi5oaWRkZW49IXR9dG9nZ2xlRGF0YVZpc2liaWxpdHkoZSl7dGhpcy5faGlkZGVuSW5kaWNlc1tlXT0hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1nZXREYXRhVmlzaWJpbGl0eShlKXtyZXR1cm4hdGhpcy5faGlkZGVuSW5kaWNlc1tlXX1fdXBkYXRlVmlzaWJpbGl0eShlLHQsbil7bGV0IHI9bj9gc2hvd2A6YGhpZGVgLGk9dGhpcy5nZXREYXRhc2V0TWV0YShlKSxhPWkuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModm9pZCAwLHIpO2ZvKHQpPyhpLmRhdGFbdF0uaGlkZGVuPSFuLHRoaXMudXBkYXRlKCkpOih0aGlzLnNldERhdGFzZXRWaXNpYmlsaXR5KGUsbiksYS51cGRhdGUoaSx7dmlzaWJsZTpufSksdGhpcy51cGRhdGUodD0+dC5kYXRhc2V0SW5kZXg9PT1lP3I6dm9pZCAwKSl9aGlkZShlLHQpe3RoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZSx0LCExKX1zaG93KGUsdCl7dGhpcy5fdXBkYXRlVmlzaWJpbGl0eShlLHQsITApfV9kZXN0cm95RGF0YXNldE1ldGEoZSl7bGV0IHQ9dGhpcy5fbWV0YXNldHNbZV07dCYmdC5jb250cm9sbGVyJiZ0LmNvbnRyb2xsZXIuX2Rlc3Ryb3koKSxkZWxldGUgdGhpcy5fbWV0YXNldHNbZV19X3N0b3AoKXtsZXQgZSx0O2Zvcih0aGlzLnN0b3AoKSxMYy5yZW1vdmUodGhpcyksZT0wLHQ9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtlPHQ7KytlKXRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShlKX1kZXN0cm95KCl7dGhpcy5ub3RpZnlQbHVnaW5zKGBiZWZvcmVEZXN0cm95YCk7bGV0e2NhbnZhczplLGN0eDp0fT10aGlzO3RoaXMuX3N0b3AoKSx0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCksZSYmKHRoaXMudW5iaW5kRXZlbnRzKCksRHMoZSx0KSx0aGlzLnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0KHQpLHRoaXMuY2FudmFzPW51bGwsdGhpcy5jdHg9bnVsbCksZGVsZXRlIERkW3RoaXMuaWRdLHRoaXMubm90aWZ5UGx1Z2lucyhgYWZ0ZXJEZXN0cm95YCl9dG9CYXNlNjRJbWFnZSguLi5lKXtyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmUpfWJpbmRFdmVudHMoKXt0aGlzLmJpbmRVc2VyRXZlbnRzKCksdGhpcy5vcHRpb25zLnJlc3BvbnNpdmU/dGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpOnRoaXMuYXR0YWNoZWQ9ITB9YmluZFVzZXJFdmVudHMoKXtsZXQgZT10aGlzLl9saXN0ZW5lcnMsdD10aGlzLnBsYXRmb3JtLG49KG4scik9Pnt0LmFkZEV2ZW50TGlzdGVuZXIodGhpcyxuLHIpLGVbbl09cn0scj0oZSx0LG4pPT57ZS5vZmZzZXRYPXQsZS5vZmZzZXRZPW4sdGhpcy5fZXZlbnRIYW5kbGVyKGUpfTtZKHRoaXMub3B0aW9ucy5ldmVudHMsZT0+bihlLHIpKX1iaW5kUmVzcG9uc2l2ZUV2ZW50cygpe3RoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnN8fD17fTtsZXQgZT10aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLHQ9dGhpcy5wbGF0Zm9ybSxuPShuLHIpPT57dC5hZGRFdmVudExpc3RlbmVyKHRoaXMsbixyKSxlW25dPXJ9LHI9KG4scik9PntlW25dJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsbixyKSxkZWxldGUgZVtuXSl9LGk9KGUsdCk9Pnt0aGlzLmNhbnZhcyYmdGhpcy5yZXNpemUoZSx0KX0sYSxvPSgpPT57cihgYXR0YWNoYCxvKSx0aGlzLmF0dGFjaGVkPSEwLHRoaXMucmVzaXplKCksbihgcmVzaXplYCxpKSxuKGBkZXRhY2hgLGEpfTthPSgpPT57dGhpcy5hdHRhY2hlZD0hMSxyKGByZXNpemVgLGkpLHRoaXMuX3N0b3AoKSx0aGlzLl9yZXNpemUoMCwwKSxuKGBhdHRhY2hgLG8pfSx0LmlzQXR0YWNoZWQodGhpcy5jYW52YXMpP28oKTphKCl9dW5iaW5kRXZlbnRzKCl7WSh0aGlzLl9saXN0ZW5lcnMsKGUsdCk9Pnt0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyx0LGUpfSksdGhpcy5fbGlzdGVuZXJzPXt9LFkodGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycywoZSx0KT0+e3RoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLHQsZSl9KSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMH11cGRhdGVIb3ZlclN0eWxlKGUsdCxuKXtsZXQgcj1uP2BzZXRgOmByZW1vdmVgLGksYSxvLHM7Zm9yKHQ9PT1gZGF0YXNldGAmJihpPXRoaXMuZ2V0RGF0YXNldE1ldGEoZVswXS5kYXRhc2V0SW5kZXgpLGkuY29udHJvbGxlcltgX2ArcitgRGF0YXNldEhvdmVyU3R5bGVgXSgpKSxvPTAscz1lLmxlbmd0aDtvPHM7KytvKXthPWVbb107bGV0IHQ9YSYmdGhpcy5nZXREYXRhc2V0TWV0YShhLmRhdGFzZXRJbmRleCkuY29udHJvbGxlcjt0JiZ0W3IrYEhvdmVyU3R5bGVgXShhLmVsZW1lbnQsYS5kYXRhc2V0SW5kZXgsYS5pbmRleCl9fWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSl7bGV0IHQ9dGhpcy5fYWN0aXZlfHxbXSxuPWUubWFwKCh7ZGF0YXNldEluZGV4OmUsaW5kZXg6dH0pPT57bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShlKTtpZighbil0aHJvdyBFcnJvcihgTm8gZGF0YXNldCBmb3VuZCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pOyRhKG4sdCl8fCh0aGlzLl9hY3RpdmU9bix0aGlzLl9sYXN0RXZlbnQ9bnVsbCx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhuLHQpKX1ub3RpZnlQbHVnaW5zKGUsdCxuKXtyZXR1cm4gdGhpcy5fcGx1Z2lucy5ub3RpZnkodGhpcyxlLHQsbil9aXNQbHVnaW5FbmFibGVkKGUpe3JldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIodD0+dC5wbHVnaW4uaWQ9PT1lKS5sZW5ndGg9PT0xfV91cGRhdGVIb3ZlclN0eWxlcyhlLHQsbil7bGV0IHI9dGhpcy5vcHRpb25zLmhvdmVyLGk9KGUsdCk9PmUuZmlsdGVyKGU9PiF0LnNvbWUodD0+ZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgpKSxhPWkodCxlKSxvPW4/ZTppKGUsdCk7YS5sZW5ndGgmJnRoaXMudXBkYXRlSG92ZXJTdHlsZShhLHIubW9kZSwhMSksby5sZW5ndGgmJnIubW9kZSYmdGhpcy51cGRhdGVIb3ZlclN0eWxlKG8sci5tb2RlLCEwKX1fZXZlbnRIYW5kbGVyKGUsdCl7bGV0IG49e2V2ZW50OmUscmVwbGF5OnQsY2FuY2VsYWJsZTohMCxpbkNoYXJ0QXJlYTp0aGlzLmlzUG9pbnRJbkFyZWEoZSl9LHI9dD0+KHQub3B0aW9ucy5ldmVudHN8fHRoaXMub3B0aW9ucy5ldmVudHMpLmluY2x1ZGVzKGUubmF0aXZlLnR5cGUpO2lmKHRoaXMubm90aWZ5UGx1Z2lucyhgYmVmb3JlRXZlbnRgLG4scik9PT0hMSlyZXR1cm47bGV0IGk9dGhpcy5faGFuZGxlRXZlbnQoZSx0LG4uaW5DaGFydEFyZWEpO3JldHVybiBuLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKGBhZnRlckV2ZW50YCxuLHIpLChpfHxuLmNoYW5nZWQpJiZ0aGlzLnJlbmRlcigpLHRoaXN9X2hhbmRsZUV2ZW50KGUsdCxuKXtsZXR7X2FjdGl2ZTpyPVtdLG9wdGlvbnM6aX09dGhpcyxhPXQsbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLHIsbixhKSxzPWhvKGUpLGM9QWQoZSx0aGlzLl9sYXN0RXZlbnQsbixzKTtuJiYodGhpcy5fbGFzdEV2ZW50PW51bGwsSihpLm9uSG92ZXIsW2Usbyx0aGlzXSx0aGlzKSxzJiZKKGkub25DbGljayxbZSxvLHRoaXNdLHRoaXMpKTtsZXQgbD0hJGEobyxyKTtyZXR1cm4obHx8dCkmJih0aGlzLl9hY3RpdmU9byx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhvLHIsdCkpLHRoaXMuX2xhc3RFdmVudD1jLGx9X2dldEFjdGl2ZUVsZW1lbnRzKGUsdCxuLHIpe2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIW4pcmV0dXJuIHQ7bGV0IGk9dGhpcy5vcHRpb25zLmhvdmVyO3JldHVybiB0aGlzLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxyKX19O2Z1bmN0aW9uIE1kKCl7cmV0dXJuIFkoamQuaW5zdGFuY2VzLGU9PmUuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKX1mdW5jdGlvbiBOZChlLHQpe2xldHt4Om4seTpyLGJhc2U6aSx3aWR0aDphLGhlaWdodDpvfT1lLmdldFByb3BzKFtgeGAsYHlgLGBiYXNlYCxgd2lkdGhgLGBoZWlnaHRgXSx0KSxzLGMsbCx1LGQ7cmV0dXJuIGUuaG9yaXpvbnRhbD8oZD1vLzIscz1NYXRoLm1pbihuLGkpLGM9TWF0aC5tYXgobixpKSxsPXItZCx1PXIrZCk6KGQ9YS8yLHM9bi1kLGM9bitkLGw9TWF0aC5taW4ocixpKSx1PU1hdGgubWF4KHIsaSkpLHtsZWZ0OnMsdG9wOmwscmlnaHQ6Yyxib3R0b206dX19ZnVuY3Rpb24gUGQoZSx0LG4scil7cmV0dXJuIGU/MDpSbyh0LG4scil9ZnVuY3Rpb24gRmQoZSx0LG4pe2xldCByPWUub3B0aW9ucy5ib3JkZXJXaWR0aCxpPWUuYm9yZGVyU2tpcHBlZCxhPVVzKHIpO3JldHVybnt0OlBkKGkudG9wLGEudG9wLDAsbikscjpQZChpLnJpZ2h0LGEucmlnaHQsMCx0KSxiOlBkKGkuYm90dG9tLGEuYm90dG9tLDAsbiksbDpQZChpLmxlZnQsYS5sZWZ0LDAsdCl9fWZ1bmN0aW9uIElkKGUsdCxuKXtsZXR7ZW5hYmxlQm9yZGVyUmFkaXVzOnJ9PWUuZ2V0UHJvcHMoW2BlbmFibGVCb3JkZXJSYWRpdXNgXSksaT1lLm9wdGlvbnMuYm9yZGVyUmFkaXVzLGE9V3MoaSksbz1NYXRoLm1pbih0LG4pLHM9ZS5ib3JkZXJTa2lwcGVkLGM9cnx8RyhpKTtyZXR1cm57dG9wTGVmdDpQZCghY3x8cy50b3B8fHMubGVmdCxhLnRvcExlZnQsMCxvKSx0b3BSaWdodDpQZCghY3x8cy50b3B8fHMucmlnaHQsYS50b3BSaWdodCwwLG8pLGJvdHRvbUxlZnQ6UGQoIWN8fHMuYm90dG9tfHxzLmxlZnQsYS5ib3R0b21MZWZ0LDAsbyksYm90dG9tUmlnaHQ6UGQoIWN8fHMuYm90dG9tfHxzLnJpZ2h0LGEuYm90dG9tUmlnaHQsMCxvKX19ZnVuY3Rpb24gTGQoZSl7bGV0IHQ9TmQoZSksbj10LnJpZ2h0LXQubGVmdCxyPXQuYm90dG9tLXQudG9wLGk9RmQoZSxuLzIsci8yKSxhPUlkKGUsbi8yLHIvMik7cmV0dXJue291dGVyOnt4OnQubGVmdCx5OnQudG9wLHc6bixoOnIscmFkaXVzOmF9LGlubmVyOnt4OnQubGVmdCtpLmwseTp0LnRvcCtpLnQsdzpuLWkubC1pLnIsaDpyLWkudC1pLmIscmFkaXVzOnt0b3BMZWZ0Ok1hdGgubWF4KDAsYS50b3BMZWZ0LU1hdGgubWF4KGkudCxpLmwpKSx0b3BSaWdodDpNYXRoLm1heCgwLGEudG9wUmlnaHQtTWF0aC5tYXgoaS50LGkucikpLGJvdHRvbUxlZnQ6TWF0aC5tYXgoMCxhLmJvdHRvbUxlZnQtTWF0aC5tYXgoaS5iLGkubCkpLGJvdHRvbVJpZ2h0Ok1hdGgubWF4KDAsYS5ib3R0b21SaWdodC1NYXRoLm1heChpLmIsaS5yKSl9fX19ZnVuY3Rpb24gUmQoZSx0LG4scil7bGV0IGk9dD09PW51bGwsYT1uPT09bnVsbCxvPWUmJiEoaSYmYSkmJk5kKGUscik7cmV0dXJuIG8mJihpfHxCbyh0LG8ubGVmdCxvLnJpZ2h0KSkmJihhfHxCbyhuLG8udG9wLG8uYm90dG9tKSl9ZnVuY3Rpb24gemQoZSl7cmV0dXJuIGUudG9wTGVmdHx8ZS50b3BSaWdodHx8ZS5ib3R0b21MZWZ0fHxlLmJvdHRvbVJpZ2h0fWZ1bmN0aW9uIEJkKGUsdCl7ZS5yZWN0KHQueCx0LnksdC53LHQuaCl9ZnVuY3Rpb24gVmQoZSx0LG49e30pe2xldCByPWUueD09PW4ueD8wOi10LGk9ZS55PT09bi55PzA6LXQsYT0oZS54K2Uudz09PW4ueCtuLnc/MDp0KS1yLG89KGUueStlLmg9PT1uLnkrbi5oPzA6dCktaTtyZXR1cm57eDplLngrcix5OmUueStpLHc6ZS53K2EsaDplLmgrbyxyYWRpdXM6ZS5yYWRpdXN9fXZhciBIZD1jbGFzcyBleHRlbmRzIEN1e3N0YXRpYyBpZD1gYmFyYDtzdGF0aWMgZGVmYXVsdHM9e2JvcmRlclNraXBwZWQ6YHN0YXJ0YCxib3JkZXJXaWR0aDowLGJvcmRlclJhZGl1czowLGluZmxhdGVBbW91bnQ6YGF1dG9gLHBvaW50U3R5bGU6dm9pZCAwfTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17YmFja2dyb3VuZENvbG9yOmBiYWNrZ3JvdW5kQ29sb3JgLGJvcmRlckNvbG9yOmBib3JkZXJDb2xvcmB9O2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLmhvcml6b250YWw9dm9pZCAwLHRoaXMuYmFzZT12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMuaW5mbGF0ZUFtb3VudD12b2lkIDAsZSYmT2JqZWN0LmFzc2lnbih0aGlzLGUpfWRyYXcoZSl7bGV0e2luZmxhdGVBbW91bnQ6dCxvcHRpb25zOntib3JkZXJDb2xvcjpuLGJhY2tncm91bmRDb2xvcjpyfX09dGhpcyx7aW5uZXI6aSxvdXRlcjphfT1MZCh0aGlzKSxvPXpkKGEucmFkaXVzKT9MczpCZDtlLnNhdmUoKSwoYS53IT09aS53fHxhLmghPT1pLmgpJiYoZS5iZWdpblBhdGgoKSxvKGUsVmQoYSx0LGkpKSxlLmNsaXAoKSxvKGUsVmQoaSwtdCxhKSksZS5maWxsU3R5bGU9bixlLmZpbGwoYGV2ZW5vZGRgKSksZS5iZWdpblBhdGgoKSxvKGUsVmQoaSx0KSksZS5maWxsU3R5bGU9cixlLmZpbGwoKSxlLnJlc3RvcmUoKX1pblJhbmdlKGUsdCxuKXtyZXR1cm4gUmQodGhpcyxlLHQsbil9aW5YUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxlLG51bGwsdCl9aW5ZUmFuZ2UoZSx0KXtyZXR1cm4gUmQodGhpcyxudWxsLGUsdCl9Z2V0Q2VudGVyUG9pbnQoZSl7bGV0e3g6dCx5Om4sYmFzZTpyLGhvcml6b250YWw6aX09dGhpcy5nZXRQcm9wcyhbYHhgLGB5YCxgYmFzZWAsYGhvcml6b250YWxgXSxlKTtyZXR1cm57eDppPyh0K3IpLzI6dCx5Omk/bjoobityKS8yfX1nZXRSYW5nZShlKXtyZXR1cm4gZT09PWB4YD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMn19LFVkPShlLHQpPT57bGV0e2JveEhlaWdodDpuPXQsYm94V2lkdGg6cj10fT1lO3JldHVybiBlLnVzZVBvaW50U3R5bGUmJihuPU1hdGgubWluKG4sdCkscj1lLnBvaW50U3R5bGVXaWR0aHx8TWF0aC5taW4ocix0KSkse2JveFdpZHRoOnIsYm94SGVpZ2h0Om4saXRlbUhlaWdodDpNYXRoLm1heCh0LG4pfX0sV2Q9KGUsdCk9PmUhPT1udWxsJiZ0IT09bnVsbCYmZS5kYXRhc2V0SW5kZXg9PT10LmRhdGFzZXRJbmRleCYmZS5pbmRleD09PXQuaW5kZXgsR2Q9Y2xhc3MgZXh0ZW5kcyBDdXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2FkZGVkPSExLHRoaXMubGVnZW5kSGl0Qm94ZXM9W10sdGhpcy5faG92ZXJlZEl0ZW09bnVsbCx0aGlzLmRvdWdobnV0TW9kZT0hMSx0aGlzLmNoYXJ0PWUuY2hhcnQsdGhpcy5vcHRpb25zPWUub3B0aW9ucyx0aGlzLmN0eD1lLmN0eCx0aGlzLmxlZ2VuZEl0ZW1zPXZvaWQgMCx0aGlzLmNvbHVtblNpemVzPXZvaWQgMCx0aGlzLmxpbmVXaWR0aHM9dm9pZCAwLHRoaXMubWF4SGVpZ2h0PXZvaWQgMCx0aGlzLm1heFdpZHRoPXZvaWQgMCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuX21hcmdpbnM9dm9pZCAwLHRoaXMucG9zaXRpb249dm9pZCAwLHRoaXMud2VpZ2h0PXZvaWQgMCx0aGlzLmZ1bGxTaXplPXZvaWQgMH11cGRhdGUoZSx0LG4pe3RoaXMubWF4V2lkdGg9ZSx0aGlzLm1heEhlaWdodD10LHRoaXMuX21hcmdpbnM9bix0aGlzLnNldERpbWVuc2lvbnMoKSx0aGlzLmJ1aWxkTGFiZWxzKCksdGhpcy5maXQoKX1zZXREaW1lbnNpb25zKCl7dGhpcy5pc0hvcml6b250YWwoKT8odGhpcy53aWR0aD10aGlzLm1heFdpZHRoLHRoaXMubGVmdD10aGlzLl9tYXJnaW5zLmxlZnQsdGhpcy5yaWdodD10aGlzLndpZHRoKToodGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdGhpcy50b3A9dGhpcy5fbWFyZ2lucy50b3AsdGhpcy5ib3R0b209dGhpcy5oZWlnaHQpfWJ1aWxkTGFiZWxzKCl7bGV0IGU9dGhpcy5vcHRpb25zLmxhYmVsc3x8e30sdD1KKGUuZ2VuZXJhdGVMYWJlbHMsW3RoaXMuY2hhcnRdLHRoaXMpfHxbXTtlLmZpbHRlciYmKHQ9dC5maWx0ZXIodD0+ZS5maWx0ZXIodCx0aGlzLmNoYXJ0LmRhdGEpKSksZS5zb3J0JiYodD10LnNvcnQoKHQsbik9PmUuc29ydCh0LG4sdGhpcy5jaGFydC5kYXRhKSkpLHRoaXMub3B0aW9ucy5yZXZlcnNlJiZ0LnJldmVyc2UoKSx0aGlzLmxlZ2VuZEl0ZW1zPXR9Zml0KCl7bGV0e29wdGlvbnM6ZSxjdHg6dH09dGhpcztpZighZS5kaXNwbGF5KXt0aGlzLndpZHRoPXRoaXMuaGVpZ2h0PTA7cmV0dXJufWxldCBuPWUubGFiZWxzLHI9JChuLmZvbnQpLGk9ci5zaXplLGE9dGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCkse2JveFdpZHRoOm8saXRlbUhlaWdodDpzfT1VZChuLGkpLGMsbDt0LmZvbnQ9ci5zdHJpbmcsdGhpcy5pc0hvcml6b250YWwoKT8oYz10aGlzLm1heFdpZHRoLGw9dGhpcy5fZml0Um93cyhhLGksbyxzKSsxMCk6KGw9dGhpcy5tYXhIZWlnaHQsYz10aGlzLl9maXRDb2xzKGEscixvLHMpKzEwKSx0aGlzLndpZHRoPU1hdGgubWluKGMsZS5tYXhXaWR0aHx8dGhpcy5tYXhXaWR0aCksdGhpcy5oZWlnaHQ9TWF0aC5taW4obCxlLm1heEhlaWdodHx8dGhpcy5tYXhIZWlnaHQpfV9maXRSb3dzKGUsdCxuLHIpe2xldHtjdHg6aSxtYXhXaWR0aDphLG9wdGlvbnM6e2xhYmVsczp7cGFkZGluZzpvfX19PXRoaXMscz10aGlzLmxlZ2VuZEhpdEJveGVzPVtdLGM9dGhpcy5saW5lV2lkdGhzPVswXSxsPXIrbyx1PWU7aS50ZXh0QWxpZ249YGxlZnRgLGkudGV4dEJhc2VsaW5lPWBtaWRkbGVgO2xldCBkPS0xLGY9LWw7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxwKT0+e2xldCBtPW4rdC8yK2kubWVhc3VyZVRleHQoZS50ZXh0KS53aWR0aDsocD09PTB8fGNbYy5sZW5ndGgtMV0rbSsyKm8+YSkmJih1Kz1sLGNbYy5sZW5ndGgtKHA+MD8wOjEpXT0wLGYrPWwsZCsrKSxzW3BdPXtsZWZ0OjAsdG9wOmYscm93OmQsd2lkdGg6bSxoZWlnaHQ6cn0sY1tjLmxlbmd0aC0xXSs9bStvfSksdX1fZml0Q29scyhlLHQsbixyKXtsZXR7Y3R4OmksbWF4SGVpZ2h0OmEsb3B0aW9uczp7bGFiZWxzOntwYWRkaW5nOm99fX09dGhpcyxzPXRoaXMubGVnZW5kSGl0Qm94ZXM9W10sYz10aGlzLmNvbHVtblNpemVzPVtdLGw9YS1lLHU9byxkPTAsZj0wLHA9MCxtPTA7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoZSxhKT0+e2xldHtpdGVtV2lkdGg6aCxpdGVtSGVpZ2h0Omd9PUtkKG4sdCxpLGUscik7YT4wJiZmK2crMipvPmwmJih1Kz1kK28sYy5wdXNoKHt3aWR0aDpkLGhlaWdodDpmfSkscCs9ZCtvLG0rKyxkPWY9MCksc1thXT17bGVmdDpwLHRvcDpmLGNvbDptLHdpZHRoOmgsaGVpZ2h0Omd9LGQ9TWF0aC5tYXgoZCxoKSxmKz1nK299KSx1Kz1kLGMucHVzaCh7d2lkdGg6ZCxoZWlnaHQ6Zn0pLHV9YWRqdXN0SGl0Qm94ZXMoKXtpZighdGhpcy5vcHRpb25zLmRpc3BsYXkpcmV0dXJuO2xldCBlPXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpLHtsZWdlbmRIaXRCb3hlczp0LG9wdGlvbnM6e2FsaWduOm4sbGFiZWxzOntwYWRkaW5nOnJ9LHJ0bDppfX09dGhpcyxhPWpjKGksdGhpcy5sZWZ0LHRoaXMud2lkdGgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2xldCBpPTAsbz0kbyhuLHRoaXMubGVmdCtyLHRoaXMucmlnaHQtdGhpcy5saW5lV2lkdGhzW2ldKTtmb3IobGV0IHMgb2YgdClpIT09cy5yb3cmJihpPXMucm93LG89JG8obix0aGlzLmxlZnQrcix0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tpXSkpLHMudG9wKz10aGlzLnRvcCtlK3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngobykscy53aWR0aCksbys9cy53aWR0aCtyfWVsc2V7bGV0IGk9MCxvPSRvKG4sdGhpcy50b3ArZStyLHRoaXMuYm90dG9tLXRoaXMuY29sdW1uU2l6ZXNbaV0uaGVpZ2h0KTtmb3IobGV0IHMgb2YgdClzLmNvbCE9PWkmJihpPXMuY29sLG89JG8obix0aGlzLnRvcCtlK3IsdGhpcy5ib3R0b20tdGhpcy5jb2x1bW5TaXplc1tpXS5oZWlnaHQpKSxzLnRvcD1vLHMubGVmdCs9dGhpcy5sZWZ0K3Iscy5sZWZ0PWEubGVmdEZvckx0cihhLngocy5sZWZ0KSxzLndpZHRoKSxvKz1zLmhlaWdodCtyfX1pc0hvcml6b250YWwoKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uPT09YHRvcGB8fHRoaXMub3B0aW9ucy5wb3NpdGlvbj09PWBib3R0b21gfWRyYXcoKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSl7bGV0IGU9dGhpcy5jdHg7anMoZSx0aGlzKSx0aGlzLl9kcmF3KCksTXMoZSl9fV9kcmF3KCl7bGV0e29wdGlvbnM6ZSxjb2x1bW5TaXplczp0LGxpbmVXaWR0aHM6bixjdHg6cn09dGhpcyx7YWxpZ246aSxsYWJlbHM6YX09ZSxvPVouY29sb3Iscz1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYz0kKGEuZm9udCkse3BhZGRpbmc6bH09YSx1PWMuc2l6ZSxkPXUvMixmO3RoaXMuZHJhd1RpdGxlKCksci50ZXh0QWxpZ249cy50ZXh0QWxpZ24oYGxlZnRgKSxyLnRleHRCYXNlbGluZT1gbWlkZGxlYCxyLmxpbmVXaWR0aD0uNSxyLmZvbnQ9Yy5zdHJpbmc7bGV0e2JveFdpZHRoOnAsYm94SGVpZ2h0Om0saXRlbUhlaWdodDpofT1VZChhLHUpLGc9ZnVuY3Rpb24oZSx0LG4pe2lmKGlzTmFOKHApfHxwPD0wfHxpc05hTihtKXx8bTwwKXJldHVybjtyLnNhdmUoKTtsZXQgaT1xKG4ubGluZVdpZHRoLDEpO2lmKHIuZmlsbFN0eWxlPXEobi5maWxsU3R5bGUsbyksci5saW5lQ2FwPXEobi5saW5lQ2FwLGBidXR0YCksci5saW5lRGFzaE9mZnNldD1xKG4ubGluZURhc2hPZmZzZXQsMCksci5saW5lSm9pbj1xKG4ubGluZUpvaW4sYG1pdGVyYCksci5saW5lV2lkdGg9aSxyLnN0cm9rZVN0eWxlPXEobi5zdHJva2VTdHlsZSxvKSxyLnNldExpbmVEYXNoKHEobi5saW5lRGFzaCxbXSkpLGEudXNlUG9pbnRTdHlsZSl7bGV0IG89e3JhZGl1czptKk1hdGguU1FSVDIvMixwb2ludFN0eWxlOm4ucG9pbnRTdHlsZSxyb3RhdGlvbjpuLnJvdGF0aW9uLGJvcmRlcldpZHRoOml9LGM9cy54UGx1cyhlLHAvMiksbD10K2Q7a3MocixvLGMsbCxhLnBvaW50U3R5bGVXaWR0aCYmcCl9ZWxzZXtsZXQgYT10K01hdGgubWF4KCh1LW0pLzIsMCksbz1zLmxlZnRGb3JMdHIoZSxwKSxjPVdzKG4uYm9yZGVyUmFkaXVzKTtyLmJlZ2luUGF0aCgpLE9iamVjdC52YWx1ZXMoYykuc29tZShlPT5lIT09MCk/THMocix7eDpvLHk6YSx3OnAsaDptLHJhZGl1czpjfSk6ci5yZWN0KG8sYSxwLG0pLHIuZmlsbCgpLGkhPT0wJiZyLnN0cm9rZSgpfXIucmVzdG9yZSgpfSxfPWZ1bmN0aW9uKGUsdCxuKXtJcyhyLG4udGV4dCxlLHQraC8yLGMse3N0cmlrZXRocm91Z2g6bi5oaWRkZW4sdGV4dEFsaWduOnMudGV4dEFsaWduKG4udGV4dEFsaWduKX0pfSx2PXRoaXMuaXNIb3Jpem9udGFsKCkseT10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtmPXY/e3g6JG8oaSx0aGlzLmxlZnQrbCx0aGlzLnJpZ2h0LW5bMF0pLHk6dGhpcy50b3ArbCt5LGxpbmU6MH06e3g6dGhpcy5sZWZ0K2wseTokbyhpLHRoaXMudG9wK3krbCx0aGlzLmJvdHRvbS10WzBdLmhlaWdodCksbGluZTowfSxNYyh0aGlzLmN0eCxlLnRleHREaXJlY3Rpb24pO2xldCBiPWgrbDt0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKG8sdSk9PntyLnN0cm9rZVN0eWxlPW8uZm9udENvbG9yLHIuZmlsbFN0eWxlPW8uZm9udENvbG9yO2xldCBtPXIubWVhc3VyZVRleHQoby50ZXh0KS53aWR0aCxoPXMudGV4dEFsaWduKG8udGV4dEFsaWdufHw9YS50ZXh0QWxpZ24pLHg9cCtkK20sUz1mLngsQz1mLnk7cy5zZXRXaWR0aCh0aGlzLndpZHRoKSx2P3U+MCYmUyt4K2w+dGhpcy5yaWdodCYmKEM9Zi55Kz1iLGYubGluZSsrLFM9Zi54PSRvKGksdGhpcy5sZWZ0K2wsdGhpcy5yaWdodC1uW2YubGluZV0pKTp1PjAmJkMrYj50aGlzLmJvdHRvbSYmKFM9Zi54PVMrdFtmLmxpbmVdLndpZHRoK2wsZi5saW5lKyssQz1mLnk9JG8oaSx0aGlzLnRvcCt5K2wsdGhpcy5ib3R0b20tdFtmLmxpbmVdLmhlaWdodCkpO2xldCB3PXMueChTKTtpZihnKHcsQyxvKSxTPWVzKGgsUytwK2Qsdj9TK3g6dGhpcy5yaWdodCxlLnJ0bCksXyhzLngoUyksQyxvKSx2KWYueCs9eCtsO2Vsc2UgaWYodHlwZW9mIG8udGV4dCE9YHN0cmluZ2Ape2xldCBlPWMubGluZUhlaWdodDtmLnkrPVlkKG8sZSkrbH1lbHNlIGYueSs9Yn0pLE5jKHRoaXMuY3R4LGUudGV4dERpcmVjdGlvbil9ZHJhd1RpdGxlKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aXRsZSxuPSQodC5mb250KSxyPVEodC5wYWRkaW5nKTtpZighdC5kaXNwbGF5KXJldHVybjtsZXQgaT1qYyhlLnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksYT10aGlzLmN0eCxvPXQucG9zaXRpb24scz1uLnNpemUvMixjPXIudG9wK3MsbCx1PXRoaXMubGVmdCxkPXRoaXMud2lkdGg7aWYodGhpcy5pc0hvcml6b250YWwoKSlkPU1hdGgubWF4KC4uLnRoaXMubGluZVdpZHRocyksbD10aGlzLnRvcCtjLHU9JG8oZS5hbGlnbix1LHRoaXMucmlnaHQtZCk7ZWxzZXtsZXQgdD10aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoZSx0KT0+TWF0aC5tYXgoZSx0LmhlaWdodCksMCk7bD1jKyRvKGUuYWxpZ24sdGhpcy50b3AsdGhpcy5ib3R0b20tdC1lLmxhYmVscy5wYWRkaW5nLXRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKX1sZXQgZj0kbyhvLHUsdStkKTthLnRleHRBbGlnbj1pLnRleHRBbGlnbihRbyhvKSksYS50ZXh0QmFzZWxpbmU9YG1pZGRsZWAsYS5zdHJva2VTdHlsZT10LmNvbG9yLGEuZmlsbFN0eWxlPXQuY29sb3IsYS5mb250PW4uc3RyaW5nLElzKGEsdC50ZXh0LGYsbCxuKX1fY29tcHV0ZVRpdGxlSGVpZ2h0KCl7bGV0IGU9dGhpcy5vcHRpb25zLnRpdGxlLHQ9JChlLmZvbnQpLG49UShlLnBhZGRpbmcpO3JldHVybiBlLmRpc3BsYXk/dC5saW5lSGVpZ2h0K24uaGVpZ2h0OjB9X2dldExlZ2VuZEl0ZW1BdChlLHQpe2xldCBuLHIsaTtpZihCbyhlLHRoaXMubGVmdCx0aGlzLnJpZ2h0KSYmQm8odCx0aGlzLnRvcCx0aGlzLmJvdHRvbSkpe2ZvcihpPXRoaXMubGVnZW5kSGl0Qm94ZXMsbj0wO248aS5sZW5ndGg7KytuKWlmKHI9aVtuXSxCbyhlLHIubGVmdCxyLmxlZnQrci53aWR0aCkmJkJvKHQsci50b3Asci50b3Arci5oZWlnaHQpKXJldHVybiB0aGlzLmxlZ2VuZEl0ZW1zW25dfXJldHVybiBudWxsfWhhbmRsZUV2ZW50KGUpe2xldCB0PXRoaXMub3B0aW9ucztpZighWGQoZS50eXBlLHQpKXJldHVybjtsZXQgbj10aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LGUueSk7aWYoZS50eXBlPT09YG1vdXNlbW92ZWB8fGUudHlwZT09PWBtb3VzZW91dGApe2xldCByPXRoaXMuX2hvdmVyZWRJdGVtLGk9V2QocixuKTtyJiYhaSYmSih0Lm9uTGVhdmUsW2Uscix0aGlzXSx0aGlzKSx0aGlzLl9ob3ZlcmVkSXRlbT1uLG4mJiFpJiZKKHQub25Ib3ZlcixbZSxuLHRoaXNdLHRoaXMpfWVsc2UgbiYmSih0Lm9uQ2xpY2ssW2Usbix0aGlzXSx0aGlzKX19O2Z1bmN0aW9uIEtkKGUsdCxuLHIsaSl7cmV0dXJue2l0ZW1XaWR0aDpxZChyLGUsdCxuKSxpdGVtSGVpZ2h0OkpkKGkscix0LmxpbmVIZWlnaHQpfX1mdW5jdGlvbiBxZChlLHQsbixyKXtsZXQgaT1lLnRleHQ7cmV0dXJuIGkmJnR5cGVvZiBpIT1gc3RyaW5nYCYmKGk9aS5yZWR1Y2UoKGUsdCk9PmUubGVuZ3RoPnQubGVuZ3RoP2U6dCkpLHQrbi5zaXplLzIrci5tZWFzdXJlVGV4dChpKS53aWR0aH1mdW5jdGlvbiBKZChlLHQsbil7bGV0IHI9ZTtyZXR1cm4gdHlwZW9mIHQudGV4dCE9YHN0cmluZ2AmJihyPVlkKHQsbikpLHJ9ZnVuY3Rpb24gWWQoZSx0KXtyZXR1cm4gdCooZS50ZXh0P2UudGV4dC5sZW5ndGg6MCl9ZnVuY3Rpb24gWGQoZSx0KXtyZXR1cm4hISgoZT09PWBtb3VzZW1vdmVgfHxlPT09YG1vdXNlb3V0YCkmJih0Lm9uSG92ZXJ8fHQub25MZWF2ZSl8fHQub25DbGljayYmKGU9PT1gY2xpY2tgfHxlPT09YG1vdXNldXBgKSl9dmFyIFpkPXtpZDpgbGVnZW5kYCxfZWxlbWVudDpHZCxzdGFydChlLHQsbil7bGV0IHI9ZS5sZWdlbmQ9bmV3IEdkKHtjdHg6ZS5jdHgsb3B0aW9uczpuLGNoYXJ0OmV9KTskbC5jb25maWd1cmUoZSxyLG4pLCRsLmFkZEJveChlLHIpfSxzdG9wKGUpeyRsLnJlbW92ZUJveChlLGUubGVnZW5kKSxkZWxldGUgZS5sZWdlbmR9LGJlZm9yZVVwZGF0ZShlLHQsbil7bGV0IHI9ZS5sZWdlbmQ7JGwuY29uZmlndXJlKGUscixuKSxyLm9wdGlvbnM9bn0sYWZ0ZXJVcGRhdGUoZSl7bGV0IHQ9ZS5sZWdlbmQ7dC5idWlsZExhYmVscygpLHQuYWRqdXN0SGl0Qm94ZXMoKX0sYWZ0ZXJFdmVudChlLHQpe3QucmVwbGF5fHxlLmxlZ2VuZC5oYW5kbGVFdmVudCh0LmV2ZW50KX0sZGVmYXVsdHM6e2Rpc3BsYXk6ITAscG9zaXRpb246YHRvcGAsYWxpZ246YGNlbnRlcmAsZnVsbFNpemU6ITAscmV2ZXJzZTohMSx3ZWlnaHQ6MWUzLG9uQ2xpY2soZSx0LG4pe2xldCByPXQuZGF0YXNldEluZGV4LGk9bi5jaGFydDtpLmlzRGF0YXNldFZpc2libGUocik/KGkuaGlkZShyKSx0LmhpZGRlbj0hMCk6KGkuc2hvdyhyKSx0LmhpZGRlbj0hMSl9LG9uSG92ZXI6bnVsbCxvbkxlYXZlOm51bGwsbGFiZWxzOntjb2xvcjplPT5lLmNoYXJ0Lm9wdGlvbnMuY29sb3IsYm94V2lkdGg6NDAscGFkZGluZzoxMCxnZW5lcmF0ZUxhYmVscyhlKXtsZXQgdD1lLmRhdGEuZGF0YXNldHMse2xhYmVsczp7dXNlUG9pbnRTdHlsZTpuLHBvaW50U3R5bGU6cix0ZXh0QWxpZ246aSxjb2xvcjphLHVzZUJvcmRlclJhZGl1czpvLGJvcmRlclJhZGl1czpzfX09ZS5sZWdlbmQub3B0aW9ucztyZXR1cm4gZS5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCkubWFwKGU9PntsZXQgYz1lLmNvbnRyb2xsZXIuZ2V0U3R5bGUobj8wOnZvaWQgMCksbD1RKGMuYm9yZGVyV2lkdGgpO3JldHVybnt0ZXh0OnRbZS5pbmRleF0ubGFiZWwsZmlsbFN0eWxlOmMuYmFja2dyb3VuZENvbG9yLGZvbnRDb2xvcjphLGhpZGRlbjohZS52aXNpYmxlLGxpbmVDYXA6Yy5ib3JkZXJDYXBTdHlsZSxsaW5lRGFzaDpjLmJvcmRlckRhc2gsbGluZURhc2hPZmZzZXQ6Yy5ib3JkZXJEYXNoT2Zmc2V0LGxpbmVKb2luOmMuYm9yZGVySm9pblN0eWxlLGxpbmVXaWR0aDoobC53aWR0aCtsLmhlaWdodCkvNCxzdHJva2VTdHlsZTpjLmJvcmRlckNvbG9yLHBvaW50U3R5bGU6cnx8Yy5wb2ludFN0eWxlLHJvdGF0aW9uOmMucm90YXRpb24sdGV4dEFsaWduOml8fGMudGV4dEFsaWduLGJvcmRlclJhZGl1czpvJiYoc3x8Yy5ib3JkZXJSYWRpdXMpLGRhdGFzZXRJbmRleDplLmluZGV4fX0sdGhpcyl9fSx0aXRsZTp7Y29sb3I6ZT0+ZS5jaGFydC5vcHRpb25zLmNvbG9yLGRpc3BsYXk6ITEscG9zaXRpb246YGNlbnRlcmAsdGV4dDpgYH19LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT4hZS5zdGFydHNXaXRoKGBvbmApLGxhYmVsczp7X3NjcmlwdGFibGU6ZT0+IVtgZ2VuZXJhdGVMYWJlbHNgLGBmaWx0ZXJgLGBzb3J0YF0uaW5jbHVkZXMoZSl9fX0sUWQ9e2F2ZXJhZ2UoZSl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCB0LG4scj1uZXcgU2V0LGk9MCxhPTA7Zm9yKHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3Qpe2xldCBuPWVbdF0uZWxlbWVudDtpZihuJiZuLmhhc1ZhbHVlKCkpe2xldCBlPW4udG9vbHRpcFBvc2l0aW9uKCk7ci5hZGQoZS54KSxpKz1lLnksKythfX1yZXR1cm4gYT09PTB8fHIuc2l6ZT09PTA/ITE6e3g6Wy4uLnJdLnJlZHVjZSgoZSx0KT0+ZSt0KS9yLnNpemUseTppL2F9fSxuZWFyZXN0KGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiExO2xldCBuPXQueCxyPXQueSxpPTEvMCxhLG8scztmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSl7bGV0IG49ZVthXS5lbGVtZW50O2lmKG4mJm4uaGFzVmFsdWUoKSl7bGV0IGU9Rm8odCxuLmdldENlbnRlclBvaW50KCkpO2U8aSYmKGk9ZSxzPW4pfX1pZihzKXtsZXQgZT1zLnRvb2x0aXBQb3NpdGlvbigpO249ZS54LHI9ZS55fXJldHVybnt4Om4seTpyfX19O2Z1bmN0aW9uICRkKGUsdCl7cmV0dXJuIHQmJihXKHQpP0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsdCk6ZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGVmKGUpe3JldHVybih0eXBlb2YgZT09YHN0cmluZ2B8fGUgaW5zdGFuY2VvZiBTdHJpbmcpJiZlLmluZGV4T2YoYApgKT4tMT9lLnNwbGl0KGAKYCk6ZX1mdW5jdGlvbiB0ZihlLHQpe2xldHtlbGVtZW50Om4sZGF0YXNldEluZGV4OnIsaW5kZXg6aX09dCxhPWUuZ2V0RGF0YXNldE1ldGEocikuY29udHJvbGxlcix7bGFiZWw6byx2YWx1ZTpzfT1hLmdldExhYmVsQW5kVmFsdWUoaSk7cmV0dXJue2NoYXJ0OmUsbGFiZWw6byxwYXJzZWQ6YS5nZXRQYXJzZWQoaSkscmF3OmUuZGF0YS5kYXRhc2V0c1tyXS5kYXRhW2ldLGZvcm1hdHRlZFZhbHVlOnMsZGF0YXNldDphLmdldERhdGFzZXQoKSxkYXRhSW5kZXg6aSxkYXRhc2V0SW5kZXg6cixlbGVtZW50Om59fWZ1bmN0aW9uIG5mKGUsdCl7bGV0IG49ZS5jaGFydC5jdHgse2JvZHk6cixmb290ZXI6aSx0aXRsZTphfT1lLHtib3hXaWR0aDpvLGJveEhlaWdodDpzfT10LGM9JCh0LmJvZHlGb250KSxsPSQodC50aXRsZUZvbnQpLHU9JCh0LmZvb3RlckZvbnQpLGQ9YS5sZW5ndGgsZj1pLmxlbmd0aCxwPXIubGVuZ3RoLG09USh0LnBhZGRpbmcpLGg9bS5oZWlnaHQsZz0wLF89ci5yZWR1Y2UoKGUsdCk9PmUrdC5iZWZvcmUubGVuZ3RoK3QubGluZXMubGVuZ3RoK3QuYWZ0ZXIubGVuZ3RoLDApO2lmKF8rPWUuYmVmb3JlQm9keS5sZW5ndGgrZS5hZnRlckJvZHkubGVuZ3RoLGQmJihoKz1kKmwubGluZUhlaWdodCsoZC0xKSp0LnRpdGxlU3BhY2luZyt0LnRpdGxlTWFyZ2luQm90dG9tKSxfKXtsZXQgZT10LmRpc3BsYXlDb2xvcnM/TWF0aC5tYXgocyxjLmxpbmVIZWlnaHQpOmMubGluZUhlaWdodDtoKz1wKmUrKF8tcCkqYy5saW5lSGVpZ2h0KyhfLTEpKnQuYm9keVNwYWNpbmd9ZiYmKGgrPXQuZm9vdGVyTWFyZ2luVG9wK2YqdS5saW5lSGVpZ2h0KyhmLTEpKnQuZm9vdGVyU3BhY2luZyk7bGV0IHY9MCx5PWZ1bmN0aW9uKGUpe2c9TWF0aC5tYXgoZyxuLm1lYXN1cmVUZXh0KGUpLndpZHRoK3YpfTtyZXR1cm4gbi5zYXZlKCksbi5mb250PWwuc3RyaW5nLFkoZS50aXRsZSx5KSxuLmZvbnQ9Yy5zdHJpbmcsWShlLmJlZm9yZUJvZHkuY29uY2F0KGUuYWZ0ZXJCb2R5KSx5KSx2PXQuZGlzcGxheUNvbG9ycz9vKzIrdC5ib3hQYWRkaW5nOjAsWShyLGU9PntZKGUuYmVmb3JlLHkpLFkoZS5saW5lcyx5KSxZKGUuYWZ0ZXIseSl9KSx2PTAsbi5mb250PXUuc3RyaW5nLFkoZS5mb290ZXIseSksbi5yZXN0b3JlKCksZys9bS53aWR0aCx7d2lkdGg6ZyxoZWlnaHQ6aH19ZnVuY3Rpb24gcmYoZSx0KXtsZXR7eTpuLGhlaWdodDpyfT10O3JldHVybiBuPHIvMj9gdG9wYDpuPmUuaGVpZ2h0LXIvMj9gYm90dG9tYDpgY2VudGVyYH1mdW5jdGlvbiBhZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PXIsbz1uLmNhcmV0U2l6ZStuLmNhcmV0UGFkZGluZztpZihlPT09YGxlZnRgJiZpK2Erbz50LndpZHRofHxlPT09YHJpZ2h0YCYmaS1hLW88MClyZXR1cm4hMH1mdW5jdGlvbiBvZihlLHQsbixyKXtsZXR7eDppLHdpZHRoOmF9PW4se3dpZHRoOm8sY2hhcnRBcmVhOntsZWZ0OnMscmlnaHQ6Y319PWUsbD1gY2VudGVyYDtyZXR1cm4gcj09PWBjZW50ZXJgP2w9aTw9KHMrYykvMj9gbGVmdGA6YHJpZ2h0YDppPD1hLzI/bD1gbGVmdGA6aT49by1hLzImJihsPWByaWdodGApLGFmKGwsZSx0LG4pJiYobD1gY2VudGVyYCksbH1mdW5jdGlvbiBzZihlLHQsbil7bGV0IHI9bi55QWxpZ258fHQueUFsaWdufHxyZihlLG4pO3JldHVybnt4QWxpZ246bi54QWxpZ258fHQueEFsaWdufHxvZihlLHQsbixyKSx5QWxpZ246cn19ZnVuY3Rpb24gY2YoZSx0KXtsZXR7eDpuLHdpZHRoOnJ9PWU7cmV0dXJuIHQ9PT1gcmlnaHRgP24tPXI6dD09PWBjZW50ZXJgJiYobi09ci8yKSxufWZ1bmN0aW9uIGxmKGUsdCxuKXtsZXR7eTpyLGhlaWdodDppfT1lO3JldHVybiB0PT09YHRvcGA/cis9bjpyLT10PT09YGJvdHRvbWA/aStuOmkvMixyfWZ1bmN0aW9uIHVmKGUsdCxuLHIpe2xldHtjYXJldFNpemU6aSxjYXJldFBhZGRpbmc6YSxjb3JuZXJSYWRpdXM6b309ZSx7eEFsaWduOnMseUFsaWduOmN9PW4sbD1pK2Ese3RvcExlZnQ6dSx0b3BSaWdodDpkLGJvdHRvbUxlZnQ6Zixib3R0b21SaWdodDpwfT1XcyhvKSxtPWNmKHQscyksaD1sZih0LGMsbCk7cmV0dXJuIGM9PT1gY2VudGVyYD9zPT09YGxlZnRgP20rPWw6cz09PWByaWdodGAmJihtLT1sKTpzPT09YGxlZnRgP20tPU1hdGgubWF4KHUsZikraTpzPT09YHJpZ2h0YCYmKG0rPU1hdGgubWF4KGQscCkraSkse3g6Um8obSwwLHIud2lkdGgtdC53aWR0aCkseTpSbyhoLDAsci5oZWlnaHQtdC5oZWlnaHQpfX1mdW5jdGlvbiBkZihlLHQsbil7bGV0IHI9UShuLnBhZGRpbmcpO3JldHVybiB0PT09YGNlbnRlcmA/ZS54K2Uud2lkdGgvMjp0PT09YHJpZ2h0YD9lLngrZS53aWR0aC1yLnJpZ2h0OmUueCtyLmxlZnR9ZnVuY3Rpb24gZmYoZSl7cmV0dXJuICRkKFtdLGVmKGUpKX1mdW5jdGlvbiBwZihlLHQsbil7cmV0dXJuIHFzKGUse3Rvb2x0aXA6dCx0b29sdGlwSXRlbXM6bix0eXBlOmB0b29sdGlwYH0pfWZ1bmN0aW9uIG1mKGUsdCl7bGV0IG49dCYmdC5kYXRhc2V0JiZ0LmRhdGFzZXQudG9vbHRpcCYmdC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO3JldHVybiBuP2Uub3ZlcnJpZGUobik6ZX12YXIgaGY9e2JlZm9yZVRpdGxlOllhLHRpdGxlKGUpe2lmKGUubGVuZ3RoPjApe2xldCB0PWVbMF0sbj10LmNoYXJ0LmRhdGEubGFiZWxzLHI9bj9uLmxlbmd0aDowO2lmKHRoaXMmJnRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm1vZGU9PT1gZGF0YXNldGApcmV0dXJuIHQuZGF0YXNldC5sYWJlbHx8YGA7aWYodC5sYWJlbClyZXR1cm4gdC5sYWJlbDtpZihyPjAmJnQuZGF0YUluZGV4PHIpcmV0dXJuIG5bdC5kYXRhSW5kZXhdfXJldHVybmBgfSxhZnRlclRpdGxlOllhLGJlZm9yZUJvZHk6WWEsYmVmb3JlTGFiZWw6WWEsbGFiZWwoZSl7aWYodGhpcyYmdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubW9kZT09PWBkYXRhc2V0YClyZXR1cm4gZS5sYWJlbCtgOiBgK2UuZm9ybWF0dGVkVmFsdWV8fGUuZm9ybWF0dGVkVmFsdWU7bGV0IHQ9ZS5kYXRhc2V0LmxhYmVsfHxgYDt0JiYodCs9YDogYCk7bGV0IG49ZS5mb3JtYXR0ZWRWYWx1ZTtyZXR1cm4gVShuKXx8KHQrPW4pLHR9LGxhYmVsQ29sb3IoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue2JvcmRlckNvbG9yOnQuYm9yZGVyQ29sb3IsYmFja2dyb3VuZENvbG9yOnQuYmFja2dyb3VuZENvbG9yLGJvcmRlcldpZHRoOnQuYm9yZGVyV2lkdGgsYm9yZGVyRGFzaDp0LmJvcmRlckRhc2gsYm9yZGVyRGFzaE9mZnNldDp0LmJvcmRlckRhc2hPZmZzZXQsYm9yZGVyUmFkaXVzOjB9fSxsYWJlbFRleHRDb2xvcigpe3JldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yfSxsYWJlbFBvaW50U3R5bGUoZSl7bGV0IHQ9ZS5jaGFydC5nZXREYXRhc2V0TWV0YShlLmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRTdHlsZShlLmRhdGFJbmRleCk7cmV0dXJue3BvaW50U3R5bGU6dC5wb2ludFN0eWxlLHJvdGF0aW9uOnQucm90YXRpb259fSxhZnRlckxhYmVsOllhLGFmdGVyQm9keTpZYSxiZWZvcmVGb290ZXI6WWEsZm9vdGVyOllhLGFmdGVyRm9vdGVyOllhfTtmdW5jdGlvbiBnZihlLHQsbixyKXtsZXQgaT1lW3RdLmNhbGwobixyKTtyZXR1cm4gaT09PXZvaWQgMD9oZlt0XS5jYWxsKG4scik6aX12YXIgX2Y9Y2xhc3MgZXh0ZW5kcyBDdXtzdGF0aWMgcG9zaXRpb25lcnM9UWQ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLm9wYWNpdHk9MCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fZXZlbnRQb3NpdGlvbj12b2lkIDAsdGhpcy5fc2l6ZT12b2lkIDAsdGhpcy5fY2FjaGVkQW5pbWF0aW9ucz12b2lkIDAsdGhpcy5fdG9vbHRpcEl0ZW1zPVtdLHRoaXMuJGFuaW1hdGlvbnM9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuY2hhcnQ9ZS5jaGFydCx0aGlzLm9wdGlvbnM9ZS5vcHRpb25zLHRoaXMuZGF0YVBvaW50cz12b2lkIDAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5iZWZvcmVCb2R5PXZvaWQgMCx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuYWZ0ZXJCb2R5PXZvaWQgMCx0aGlzLmZvb3Rlcj12b2lkIDAsdGhpcy54QWxpZ249dm9pZCAwLHRoaXMueUFsaWduPXZvaWQgMCx0aGlzLng9dm9pZCAwLHRoaXMueT12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuY2FyZXRYPXZvaWQgMCx0aGlzLmNhcmV0WT12b2lkIDAsdGhpcy5sYWJlbENvbG9ycz12b2lkIDAsdGhpcy5sYWJlbFBvaW50U3R5bGVzPXZvaWQgMCx0aGlzLmxhYmVsVGV4dENvbG9ycz12b2lkIDB9aW5pdGlhbGl6ZShlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLl9jYWNoZWRBbmltYXRpb25zPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMH1fcmVzb2x2ZUFuaW1hdGlvbnMoKXtsZXQgZT10aGlzLl9jYWNoZWRBbmltYXRpb25zO2lmKGUpcmV0dXJuIGU7bGV0IHQ9dGhpcy5jaGFydCxuPXRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKSxyPW4uZW5hYmxlZCYmdC5vcHRpb25zLmFuaW1hdGlvbiYmbi5hbmltYXRpb25zLGk9bmV3IFZjKHRoaXMuY2hhcnQscik7cmV0dXJuIHIuX2NhY2hlYWJsZSYmKHRoaXMuX2NhY2hlZEFuaW1hdGlvbnM9T2JqZWN0LmZyZWV6ZShpKSksaX1nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuJGNvbnRleHR8fD1wZih0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx0aGlzLHRoaXMuX3Rvb2x0aXBJdGVtcyl9Z2V0VGl0bGUoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVUaXRsZWAsdGhpcyxlKSxpPWdmKG4sYHRpdGxlYCx0aGlzLGUpLGE9Z2YobixgYWZ0ZXJUaXRsZWAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfWdldEJlZm9yZUJvZHkoZSx0KXtyZXR1cm4gZmYoZ2YodC5jYWxsYmFja3MsYGJlZm9yZUJvZHlgLHRoaXMsZSkpfWdldEJvZHkoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1bXTtyZXR1cm4gWShlLGU9PntsZXQgdD17YmVmb3JlOltdLGxpbmVzOltdLGFmdGVyOltdfSxpPW1mKG4sZSk7JGQodC5iZWZvcmUsZWYoZ2YoaSxgYmVmb3JlTGFiZWxgLHRoaXMsZSkpKSwkZCh0LmxpbmVzLGdmKGksYGxhYmVsYCx0aGlzLGUpKSwkZCh0LmFmdGVyLGVmKGdmKGksYGFmdGVyTGFiZWxgLHRoaXMsZSkpKSxyLnB1c2godCl9KSxyfWdldEFmdGVyQm9keShlLHQpe3JldHVybiBmZihnZih0LmNhbGxiYWNrcyxgYWZ0ZXJCb2R5YCx0aGlzLGUpKX1nZXRGb290ZXIoZSx0KXtsZXR7Y2FsbGJhY2tzOm59PXQscj1nZihuLGBiZWZvcmVGb290ZXJgLHRoaXMsZSksaT1nZihuLGBmb290ZXJgLHRoaXMsZSksYT1nZihuLGBhZnRlckZvb3RlcmAsdGhpcyxlKSxvPVtdO3JldHVybiBvPSRkKG8sZWYocikpLG89JGQobyxlZihpKSksbz0kZChvLGVmKGEpKSxvfV9jcmVhdGVJdGVtcyhlKXtsZXQgdD10aGlzLl9hY3RpdmUsbj10aGlzLmNoYXJ0LmRhdGEscj1bXSxpPVtdLGE9W10sbz1bXSxzLGM7Zm9yKHM9MCxjPXQubGVuZ3RoO3M8YzsrK3Mpby5wdXNoKHRmKHRoaXMuY2hhcnQsdFtzXSkpO3JldHVybiBlLmZpbHRlciYmKG89by5maWx0ZXIoKHQscixpKT0+ZS5maWx0ZXIodCxyLGksbikpKSxlLml0ZW1Tb3J0JiYobz1vLnNvcnQoKHQscik9PmUuaXRlbVNvcnQodCxyLG4pKSksWShvLHQ9PntsZXQgbj1tZihlLmNhbGxiYWNrcyx0KTtyLnB1c2goZ2YobixgbGFiZWxDb2xvcmAsdGhpcyx0KSksaS5wdXNoKGdmKG4sYGxhYmVsUG9pbnRTdHlsZWAsdGhpcyx0KSksYS5wdXNoKGdmKG4sYGxhYmVsVGV4dENvbG9yYCx0aGlzLHQpKX0pLHRoaXMubGFiZWxDb2xvcnM9cix0aGlzLmxhYmVsUG9pbnRTdHlsZXM9aSx0aGlzLmxhYmVsVGV4dENvbG9ycz1hLHRoaXMuZGF0YVBvaW50cz1vLG99dXBkYXRlKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHI9dGhpcy5fYWN0aXZlLGksYT1bXTtpZighci5sZW5ndGgpdGhpcy5vcGFjaXR5IT09MCYmKGk9e29wYWNpdHk6MH0pO2Vsc2V7bGV0IGU9UWRbbi5wb3NpdGlvbl0uY2FsbCh0aGlzLHIsdGhpcy5fZXZlbnRQb3NpdGlvbik7YT10aGlzLl9jcmVhdGVJdGVtcyhuKSx0aGlzLnRpdGxlPXRoaXMuZ2V0VGl0bGUoYSxuKSx0aGlzLmJlZm9yZUJvZHk9dGhpcy5nZXRCZWZvcmVCb2R5KGEsbiksdGhpcy5ib2R5PXRoaXMuZ2V0Qm9keShhLG4pLHRoaXMuYWZ0ZXJCb2R5PXRoaXMuZ2V0QWZ0ZXJCb2R5KGEsbiksdGhpcy5mb290ZXI9dGhpcy5nZXRGb290ZXIoYSxuKTtsZXQgdD10aGlzLl9zaXplPW5mKHRoaXMsbiksbz1PYmplY3QuYXNzaWduKHt9LGUsdCkscz1zZih0aGlzLmNoYXJ0LG4sbyksYz11ZihuLG8scyx0aGlzLmNoYXJ0KTt0aGlzLnhBbGlnbj1zLnhBbGlnbix0aGlzLnlBbGlnbj1zLnlBbGlnbixpPXtvcGFjaXR5OjEseDpjLngseTpjLnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsY2FyZXRYOmUueCxjYXJldFk6ZS55fX10aGlzLl90b29sdGlwSXRlbXM9YSx0aGlzLiRjb250ZXh0PXZvaWQgMCxpJiZ0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLGkpLGUmJm4uZXh0ZXJuYWwmJm4uZXh0ZXJuYWwuY2FsbCh0aGlzLHtjaGFydDp0aGlzLmNoYXJ0LHRvb2x0aXA6dGhpcyxyZXBsYXk6dH0pfWRyYXdDYXJldChlLHQsbixyKXtsZXQgaT10aGlzLmdldENhcmV0UG9zaXRpb24oZSxuLHIpO3QubGluZVRvKGkueDEsaS55MSksdC5saW5lVG8oaS54MixpLnkyKSx0LmxpbmVUbyhpLngzLGkueTMpfWdldENhcmV0UG9zaXRpb24oZSx0LG4pe2xldHt4QWxpZ246cix5QWxpZ246aX09dGhpcyx7Y2FyZXRTaXplOmEsY29ybmVyUmFkaXVzOm99PW4se3RvcExlZnQ6cyx0b3BSaWdodDpjLGJvdHRvbUxlZnQ6bCxib3R0b21SaWdodDp1fT1XcyhvKSx7eDpkLHk6Zn09ZSx7d2lkdGg6cCxoZWlnaHQ6bX09dCxoLGcsXyx2LHksYjtyZXR1cm4gaT09PWBjZW50ZXJgPyh5PWYrbS8yLHI9PT1gbGVmdGA/KGg9ZCxnPWgtYSx2PXkrYSxiPXktYSk6KGg9ZCtwLGc9aCthLHY9eS1hLGI9eSthKSxfPWgpOihnPXI9PT1gbGVmdGA/ZCtNYXRoLm1heChzLGwpK2E6cj09PWByaWdodGA/ZCtwLU1hdGgubWF4KGMsdSktYTp0aGlzLmNhcmV0WCxpPT09YHRvcGA/KHY9Zix5PXYtYSxoPWctYSxfPWcrYSk6KHY9ZittLHk9dithLGg9ZythLF89Zy1hKSxiPXYpLHt4MTpoLHgyOmcseDM6Xyx5MTp2LHkyOnkseTM6Yn19ZHJhd1RpdGxlKGUsdCxuKXtsZXQgcj10aGlzLnRpdGxlLGk9ci5sZW5ndGgsYSxvLHM7aWYoaSl7bGV0IGM9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpO2ZvcihlLng9ZGYodGhpcyxuLnRpdGxlQWxpZ24sbiksdC50ZXh0QWxpZ249Yy50ZXh0QWxpZ24obi50aXRsZUFsaWduKSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCxhPSQobi50aXRsZUZvbnQpLG89bi50aXRsZVNwYWNpbmcsdC5maWxsU3R5bGU9bi50aXRsZUNvbG9yLHQuZm9udD1hLnN0cmluZyxzPTA7czxpOysrcyl0LmZpbGxUZXh0KHJbc10sYy54KGUueCksZS55K2EubGluZUhlaWdodC8yKSxlLnkrPWEubGluZUhlaWdodCtvLHMrMT09PWkmJihlLnkrPW4udGl0bGVNYXJnaW5Cb3R0b20tbyl9fV9kcmF3Q29sb3JCb3goZSx0LG4scixpKXtsZXQgYT10aGlzLmxhYmVsQ29sb3JzW25dLG89dGhpcy5sYWJlbFBvaW50U3R5bGVzW25dLHtib3hIZWlnaHQ6cyxib3hXaWR0aDpjfT1pLGw9JChpLmJvZHlGb250KSx1PWRmKHRoaXMsYGxlZnRgLGkpLGQ9ci54KHUpLGY9czxsLmxpbmVIZWlnaHQ/KGwubGluZUhlaWdodC1zKS8yOjAscD10LnkrZjtpZihpLnVzZVBvaW50U3R5bGUpe2xldCB0PXtyYWRpdXM6TWF0aC5taW4oYyxzKS8yLHBvaW50U3R5bGU6by5wb2ludFN0eWxlLHJvdGF0aW9uOm8ucm90YXRpb24sYm9yZGVyV2lkdGg6MX0sbj1yLmxlZnRGb3JMdHIoZCxjKStjLzIsbD1wK3MvMjtlLnN0cm9rZVN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLE9zKGUsdCxuLGwpLGUuc3Ryb2tlU3R5bGU9YS5ib3JkZXJDb2xvcixlLmZpbGxTdHlsZT1hLmJhY2tncm91bmRDb2xvcixPcyhlLHQsbixsKX1lbHNle2UubGluZVdpZHRoPUcoYS5ib3JkZXJXaWR0aCk/TWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhhLmJvcmRlcldpZHRoKSk6YS5ib3JkZXJXaWR0aHx8MSxlLnN0cm9rZVN0eWxlPWEuYm9yZGVyQ29sb3IsZS5zZXRMaW5lRGFzaChhLmJvcmRlckRhc2h8fFtdKSxlLmxpbmVEYXNoT2Zmc2V0PWEuYm9yZGVyRGFzaE9mZnNldHx8MDtsZXQgdD1yLmxlZnRGb3JMdHIoZCxjKSxuPXIubGVmdEZvckx0cihyLnhQbHVzKGQsMSksYy0yKSxvPVdzKGEuYm9yZGVyUmFkaXVzKTtPYmplY3QudmFsdWVzKG8pLnNvbWUoZT0+ZSE9PTApPyhlLmJlZ2luUGF0aCgpLGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLExzKGUse3g6dCx5OnAsdzpjLGg6cyxyYWRpdXM6b30pLGUuZmlsbCgpLGUuc3Ryb2tlKCksZS5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsZS5iZWdpblBhdGgoKSxMcyhlLHt4Om4seTpwKzEsdzpjLTIsaDpzLTIscmFkaXVzOm99KSxlLmZpbGwoKSk6KGUuZmlsbFN0eWxlPWkubXVsdGlLZXlCYWNrZ3JvdW5kLGUuZmlsbFJlY3QodCxwLGMscyksZS5zdHJva2VSZWN0KHQscCxjLHMpLGUuZmlsbFN0eWxlPWEuYmFja2dyb3VuZENvbG9yLGUuZmlsbFJlY3QobixwKzEsYy0yLHMtMikpfWUuZmlsbFN0eWxlPXRoaXMubGFiZWxUZXh0Q29sb3JzW25dfWRyYXdCb2R5KGUsdCxuKXtsZXR7Ym9keTpyfT10aGlzLHtib2R5U3BhY2luZzppLGJvZHlBbGlnbjphLGRpc3BsYXlDb2xvcnM6byxib3hIZWlnaHQ6cyxib3hXaWR0aDpjLGJveFBhZGRpbmc6bH09bix1PSQobi5ib2R5Rm9udCksZD11LmxpbmVIZWlnaHQsZj0wLHA9amMobi5ydGwsdGhpcy54LHRoaXMud2lkdGgpLG09ZnVuY3Rpb24obil7dC5maWxsVGV4dChuLHAueChlLngrZiksZS55K2QvMiksZS55Kz1kK2l9LGg9cC50ZXh0QWxpZ24oYSksZyxfLHYseSxiLHgsUztmb3IodC50ZXh0QWxpZ249YSx0LnRleHRCYXNlbGluZT1gbWlkZGxlYCx0LmZvbnQ9dS5zdHJpbmcsZS54PWRmKHRoaXMsaCxuKSx0LmZpbGxTdHlsZT1uLmJvZHlDb2xvcixZKHRoaXMuYmVmb3JlQm9keSxtKSxmPW8mJmghPT1gcmlnaHRgP2E9PT1gY2VudGVyYD9jLzIrbDpjKzIrbDowLHk9MCx4PXIubGVuZ3RoO3k8eDsrK3kpe2ZvcihnPXJbeV0sXz10aGlzLmxhYmVsVGV4dENvbG9yc1t5XSx0LmZpbGxTdHlsZT1fLFkoZy5iZWZvcmUsbSksdj1nLmxpbmVzLG8mJnYubGVuZ3RoJiYodGhpcy5fZHJhd0NvbG9yQm94KHQsZSx5LHAsbiksZD1NYXRoLm1heCh1LmxpbmVIZWlnaHQscykpLGI9MCxTPXYubGVuZ3RoO2I8UzsrK2IpbSh2W2JdKSxkPXUubGluZUhlaWdodDtZKGcuYWZ0ZXIsbSl9Zj0wLGQ9dS5saW5lSGVpZ2h0LFkodGhpcy5hZnRlckJvZHksbSksZS55LT1pfWRyYXdGb290ZXIoZSx0LG4pe2xldCByPXRoaXMuZm9vdGVyLGk9ci5sZW5ndGgsYSxvO2lmKGkpe2xldCBzPWpjKG4ucnRsLHRoaXMueCx0aGlzLndpZHRoKTtmb3IoZS54PWRmKHRoaXMsbi5mb290ZXJBbGlnbixuKSxlLnkrPW4uZm9vdGVyTWFyZ2luVG9wLHQudGV4dEFsaWduPXMudGV4dEFsaWduKG4uZm9vdGVyQWxpZ24pLHQudGV4dEJhc2VsaW5lPWBtaWRkbGVgLGE9JChuLmZvb3RlckZvbnQpLHQuZmlsbFN0eWxlPW4uZm9vdGVyQ29sb3IsdC5mb250PWEuc3RyaW5nLG89MDtvPGk7KytvKXQuZmlsbFRleHQocltvXSxzLngoZS54KSxlLnkrYS5saW5lSGVpZ2h0LzIpLGUueSs9YS5saW5lSGVpZ2h0K24uZm9vdGVyU3BhY2luZ319ZHJhd0JhY2tncm91bmQoZSx0LG4scil7bGV0e3hBbGlnbjppLHlBbGlnbjphfT10aGlzLHt4Om8seTpzfT1lLHt3aWR0aDpjLGhlaWdodDpsfT1uLHt0b3BMZWZ0OnUsdG9wUmlnaHQ6ZCxib3R0b21MZWZ0OmYsYm90dG9tUmlnaHQ6cH09V3Moci5jb3JuZXJSYWRpdXMpO3QuZmlsbFN0eWxlPXIuYmFja2dyb3VuZENvbG9yLHQuc3Ryb2tlU3R5bGU9ci5ib3JkZXJDb2xvcix0LmxpbmVXaWR0aD1yLmJvcmRlcldpZHRoLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8obyt1LHMpLGE9PT1gdG9wYCYmdGhpcy5kcmF3Q2FyZXQoZSx0LG4sciksdC5saW5lVG8obytjLWQscyksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzLG8rYyxzK2QpLGE9PT1gY2VudGVyYCYmaT09PWByaWdodGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rYyxzK2wtcCksdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rYyxzK2wsbytjLXAscytsKSxhPT09YGJvdHRvbWAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8rZixzK2wpLHQucXVhZHJhdGljQ3VydmVUbyhvLHMrbCxvLHMrbC1mKSxhPT09YGNlbnRlcmAmJmk9PT1gbGVmdGAmJnRoaXMuZHJhd0NhcmV0KGUsdCxuLHIpLHQubGluZVRvKG8scyt1KSx0LnF1YWRyYXRpY0N1cnZlVG8obyxzLG8rdSxzKSx0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHIuYm9yZGVyV2lkdGg+MCYmdC5zdHJva2UoKX1fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KGUpe2xldCB0PXRoaXMuY2hhcnQsbj10aGlzLiRhbmltYXRpb25zLHI9biYmbi54LGk9biYmbi55O2lmKHJ8fGkpe2xldCBuPVFkW2UucG9zaXRpb25dLmNhbGwodGhpcyx0aGlzLl9hY3RpdmUsdGhpcy5fZXZlbnRQb3NpdGlvbik7aWYoIW4pcmV0dXJuO2xldCBhPXRoaXMuX3NpemU9bmYodGhpcyxlKSxvPU9iamVjdC5hc3NpZ24oe30sbix0aGlzLl9zaXplKSxzPXNmKHQsZSxvKSxjPXVmKGUsbyxzLHQpOyhyLl90byE9PWMueHx8aS5fdG8hPT1jLnkpJiYodGhpcy54QWxpZ249cy54QWxpZ24sdGhpcy55QWxpZ249cy55QWxpZ24sdGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuY2FyZXRYPW4ueCx0aGlzLmNhcmV0WT1uLnksdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcyxjKSl9fV93aWxsUmVuZGVyKCl7cmV0dXJuISF0aGlzLm9wYWNpdHl9ZHJhdyhlKXtsZXQgdD10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSksbj10aGlzLm9wYWNpdHk7aWYoIW4pcmV0dXJuO3RoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldCh0KTtsZXQgcj17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9LGk9e3g6dGhpcy54LHk6dGhpcy55fTtuPU1hdGguYWJzKG4pPC4wMDE/MDpuO2xldCBhPVEodC5wYWRkaW5nKSxvPXRoaXMudGl0bGUubGVuZ3RofHx0aGlzLmJlZm9yZUJvZHkubGVuZ3RofHx0aGlzLmJvZHkubGVuZ3RofHx0aGlzLmFmdGVyQm9keS5sZW5ndGh8fHRoaXMuZm9vdGVyLmxlbmd0aDt0LmVuYWJsZWQmJm8mJihlLnNhdmUoKSxlLmdsb2JhbEFscGhhPW4sdGhpcy5kcmF3QmFja2dyb3VuZChpLGUscix0KSxNYyhlLHQudGV4dERpcmVjdGlvbiksaS55Kz1hLnRvcCx0aGlzLmRyYXdUaXRsZShpLGUsdCksdGhpcy5kcmF3Qm9keShpLGUsdCksdGhpcy5kcmF3Rm9vdGVyKGksZSx0KSxOYyhlLHQudGV4dERpcmVjdGlvbiksZS5yZXN0b3JlKCkpfWdldEFjdGl2ZUVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZXx8W119c2V0QWN0aXZlRWxlbWVudHMoZSx0KXtsZXQgbj10aGlzLl9hY3RpdmUscj1lLm1hcCgoe2RhdGFzZXRJbmRleDplLGluZGV4OnR9KT0+e2xldCBuPXRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCBgK2UpO3JldHVybntkYXRhc2V0SW5kZXg6ZSxlbGVtZW50Om4uZGF0YVt0XSxpbmRleDp0fX0pLGk9ISRhKG4sciksYT10aGlzLl9wb3NpdGlvbkNoYW5nZWQocix0KTsoaXx8YSkmJih0aGlzLl9hY3RpdmU9cix0aGlzLl9ldmVudFBvc2l0aW9uPXQsdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzPSEwLHRoaXMudXBkYXRlKCEwKSl9aGFuZGxlRXZlbnQoZSx0LG49ITApe2lmKHQmJnRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cylyZXR1cm4hMTt0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHM9ITE7bGV0IHI9dGhpcy5vcHRpb25zLGk9dGhpcy5fYWN0aXZlfHxbXSxhPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsaSx0LG4pLG89dGhpcy5fcG9zaXRpb25DaGFuZ2VkKGEsZSkscz10fHwhJGEoYSxpKXx8bztyZXR1cm4gcyYmKHRoaXMuX2FjdGl2ZT1hLChyLmVuYWJsZWR8fHIuZXh0ZXJuYWwpJiYodGhpcy5fZXZlbnRQb3NpdGlvbj17eDplLngseTplLnl9LHRoaXMudXBkYXRlKCEwLHQpKSksc31fZ2V0QWN0aXZlRWxlbWVudHMoZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zO2lmKGUudHlwZT09PWBtb3VzZW91dGApcmV0dXJuW107aWYoIXIpcmV0dXJuIHQuZmlsdGVyKGU9PnRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tlLmRhdGFzZXRJbmRleF0mJnRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoZS5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKGUuaW5kZXgpIT09dm9pZCAwKTtsZXQgYT10aGlzLmNoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSxpLm1vZGUsaSxuKTtyZXR1cm4gaS5yZXZlcnNlJiZhLnJldmVyc2UoKSxhfV9wb3NpdGlvbkNoYW5nZWQoZSx0KXtsZXR7Y2FyZXRYOm4sY2FyZXRZOnIsb3B0aW9uczppfT10aGlzLGE9UWRbaS5wb3NpdGlvbl0uY2FsbCh0aGlzLGUsdCk7cmV0dXJuIGEhPT0hMSYmKG4hPT1hLnh8fHIhPT1hLnkpfX0sdmY9e2lkOmB0b29sdGlwYCxfZWxlbWVudDpfZixwb3NpdGlvbmVyczpRZCxhZnRlckluaXQoZSx0LG4pe24mJihlLnRvb2x0aXA9bmV3IF9mKHtjaGFydDplLG9wdGlvbnM6bn0pKX0sYmVmb3JlVXBkYXRlKGUsdCxuKXtlLnRvb2x0aXAmJmUudG9vbHRpcC5pbml0aWFsaXplKG4pfSxyZXNldChlLHQsbil7ZS50b29sdGlwJiZlLnRvb2x0aXAuaW5pdGlhbGl6ZShuKX0sYWZ0ZXJEcmF3KGUpe2xldCB0PWUudG9vbHRpcDtpZih0JiZ0Ll93aWxsUmVuZGVyKCkpe2xldCBuPXt0b29sdGlwOnR9O2lmKGUubm90aWZ5UGx1Z2lucyhgYmVmb3JlVG9vbHRpcERyYXdgLHsuLi5uLGNhbmNlbGFibGU6ITB9KT09PSExKXJldHVybjt0LmRyYXcoZS5jdHgpLGUubm90aWZ5UGx1Z2lucyhgYWZ0ZXJUb29sdGlwRHJhd2Asbil9fSxhZnRlckV2ZW50KGUsdCl7aWYoZS50b29sdGlwKXtsZXQgbj10LnJlcGxheTtlLnRvb2x0aXAuaGFuZGxlRXZlbnQodC5ldmVudCxuLHQuaW5DaGFydEFyZWEpJiYodC5jaGFuZ2VkPSEwKX19LGRlZmF1bHRzOntlbmFibGVkOiEwLGV4dGVybmFsOm51bGwscG9zaXRpb246YGF2ZXJhZ2VgLGJhY2tncm91bmRDb2xvcjpgcmdiYSgwLDAsMCwwLjgpYCx0aXRsZUNvbG9yOmAjZmZmYCx0aXRsZUZvbnQ6e3dlaWdodDpgYm9sZGB9LHRpdGxlU3BhY2luZzoyLHRpdGxlTWFyZ2luQm90dG9tOjYsdGl0bGVBbGlnbjpgbGVmdGAsYm9keUNvbG9yOmAjZmZmYCxib2R5U3BhY2luZzoyLGJvZHlGb250Ont9LGJvZHlBbGlnbjpgbGVmdGAsZm9vdGVyQ29sb3I6YCNmZmZgLGZvb3RlclNwYWNpbmc6Mixmb290ZXJNYXJnaW5Ub3A6Nixmb290ZXJGb250Ont3ZWlnaHQ6YGJvbGRgfSxmb290ZXJBbGlnbjpgbGVmdGAscGFkZGluZzo2LGNhcmV0UGFkZGluZzoyLGNhcmV0U2l6ZTo1LGNvcm5lclJhZGl1czo2LGJveEhlaWdodDooZSx0KT0+dC5ib2R5Rm9udC5zaXplLGJveFdpZHRoOihlLHQpPT50LmJvZHlGb250LnNpemUsbXVsdGlLZXlCYWNrZ3JvdW5kOmAjZmZmYCxkaXNwbGF5Q29sb3JzOiEwLGJveFBhZGRpbmc6MCxib3JkZXJDb2xvcjpgcmdiYSgwLDAsMCwwKWAsYm9yZGVyV2lkdGg6MCxhbmltYXRpb246e2R1cmF0aW9uOjQwMCxlYXNpbmc6YGVhc2VPdXRRdWFydGB9LGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6YG51bWJlcmAscHJvcGVydGllczpbYHhgLGB5YCxgd2lkdGhgLGBoZWlnaHRgLGBjYXJldFhgLGBjYXJldFlgXX0sb3BhY2l0eTp7ZWFzaW5nOmBsaW5lYXJgLGR1cmF0aW9uOjIwMH19LGNhbGxiYWNrczpoZn0sZGVmYXVsdFJvdXRlczp7Ym9keUZvbnQ6YGZvbnRgLGZvb3RlckZvbnQ6YGZvbnRgLHRpdGxlRm9udDpgZm9udGB9LGRlc2NyaXB0b3JzOntfc2NyaXB0YWJsZTplPT5lIT09YGZpbHRlcmAmJmUhPT1gaXRlbVNvcnRgJiZlIT09YGV4dGVybmFsYCxfaW5kZXhhYmxlOiExLGNhbGxiYWNrczp7X3NjcmlwdGFibGU6ITEsX2luZGV4YWJsZTohMX0sYW5pbWF0aW9uOntfZmFsbGJhY2s6ITF9LGFuaW1hdGlvbnM6e19mYWxsYmFjazpgYW5pbWF0aW9uYH19LGFkZGl0aW9uYWxPcHRpb25TY29wZXM6W2BpbnRlcmFjdGlvbmBdfSx5Zj0oZSx0LG4scik9Pih0eXBlb2YgdD09YHN0cmluZ2A/KG49ZS5wdXNoKHQpLTEsci51bnNoaWZ0KHtpbmRleDpuLGxhYmVsOnR9KSk6aXNOYU4odCkmJihuPW51bGwpLG4pO2Z1bmN0aW9uIGJmKGUsdCxuLHIpe2xldCBpPWUuaW5kZXhPZih0KTtyZXR1cm4gaT09PS0xP3lmKGUsdCxuLHIpOmk9PT1lLmxhc3RJbmRleE9mKHQpP2k6bn12YXIgeGY9KGUsdCk9PmU9PT1udWxsP251bGw6Um8oTWF0aC5yb3VuZChlKSwwLHQpO2Z1bmN0aW9uIFNmKGUpe2xldCB0PXRoaXMuZ2V0TGFiZWxzKCk7cmV0dXJuIGU+PTAmJmU8dC5sZW5ndGg/dFtlXTplfXZhciBDZj1jbGFzcyBleHRlbmRzIFV1e3N0YXRpYyBpZD1gY2F0ZWdvcnlgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOlNmfX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wLHRoaXMuX2FkZGVkTGFiZWxzPVtdfWluaXQoZSl7bGV0IHQ9dGhpcy5fYWRkZWRMYWJlbHM7aWYodC5sZW5ndGgpe2xldCBlPXRoaXMuZ2V0TGFiZWxzKCk7Zm9yKGxldHtpbmRleDpuLGxhYmVsOnJ9b2YgdCllW25dPT09ciYmZS5zcGxpY2UobiwxKTt0aGlzLl9hZGRlZExhYmVscz1bXX1zdXBlci5pbml0KGUpfXBhcnNlKGUsdCl7aWYoVShlKSlyZXR1cm4gbnVsbDtsZXQgbj10aGlzLmdldExhYmVscygpO3JldHVybiB0PWlzRmluaXRlKHQpJiZuW3RdPT09ZT90OmJmKG4sZSxxKHQsZSksdGhpcy5fYWRkZWRMYWJlbHMpLHhmKHQsbi5sZW5ndGgtMSl9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOm4sbWF4OnJ9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm9wdGlvbnMuYm91bmRzPT09YHRpY2tzYCYmKGV8fChuPTApLHR8fChyPXRoaXMuZ2V0TGFiZWxzKCkubGVuZ3RoLTEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMubWluLHQ9dGhpcy5tYXgsbj10aGlzLm9wdGlvbnMub2Zmc2V0LHI9W10saT10aGlzLmdldExhYmVscygpO2k9ZT09PTAmJnQ9PT1pLmxlbmd0aC0xP2k6aS5zbGljZShlLHQrMSksdGhpcy5fdmFsdWVSYW5nZT1NYXRoLm1heChpLmxlbmd0aC0rIW4sMSksdGhpcy5fc3RhcnRWYWx1ZT10aGlzLm1pbi0obj8uNTowKTtmb3IobGV0IG49ZTtuPD10O24rKylyLnB1c2goe3ZhbHVlOm59KTtyZXR1cm4gcn1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBTZi5jYWxsKHRoaXMsZSl9Y29uZmlndXJlKCl7c3VwZXIuY29uZmlndXJlKCksdGhpcy5pc0hvcml6b250YWwoKXx8KHRoaXMuX3JldmVyc2VQaXhlbHM9IXRoaXMuX3JldmVyc2VQaXhlbHMpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIHR5cGVvZiBlIT1gbnVtYmVyYCYmKGU9dGhpcy5wYXJzZShlKSksZT09PW51bGw/TmFOOnRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKChlLXRoaXMuX3N0YXJ0VmFsdWUpL3RoaXMuX3ZhbHVlUmFuZ2UpfWdldFBpeGVsRm9yVGljayhlKXtsZXQgdD10aGlzLnRpY2tzO3JldHVybiBlPDB8fGU+dC5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0W2VdLnZhbHVlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUrdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwoZSkqdGhpcy5fdmFsdWVSYW5nZSl9Z2V0QmFzZVBpeGVsKCl7cmV0dXJuIHRoaXMuYm90dG9tfX07ZnVuY3Rpb24gd2YoZSx0KXtsZXQgbj1bXSx7Ym91bmRzOnIsc3RlcDppLG1pbjphLG1heDpvLHByZWNpc2lvbjpzLGNvdW50OmMsbWF4VGlja3M6bCxtYXhEaWdpdHM6dSxpbmNsdWRlQm91bmRzOmR9PWUsZj1pfHwxLHA9bC0xLHttaW46bSxtYXg6aH09dCxnPSFVKGEpLF89IVUobyksdj0hVShjKSx5PShoLW0pLyh1KzEpLGI9VG8oKGgtbSkvcC9mKSpmLHgsUyxDLHc7aWYoYjwxZS0xNCYmIWcmJiFfKXJldHVyblt7dmFsdWU6bX0se3ZhbHVlOmh9XTt3PU1hdGguY2VpbChoL2IpLU1hdGguZmxvb3IobS9iKSx3PnAmJihiPVRvKHcqYi9wL2YpKmYpLFUocyl8fCh4PTEwKipzLGI9TWF0aC5jZWlsKGIqeCkveCkscj09PWB0aWNrc2A/KFM9TWF0aC5mbG9vcihtL2IpKmIsQz1NYXRoLmNlaWwoaC9iKSpiKTooUz1tLEM9aCksZyYmXyYmaSYma28oKG8tYSkvaSxiLzFlMyk/KHc9TWF0aC5yb3VuZChNYXRoLm1pbigoby1hKS9iLGwpKSxiPShvLWEpL3csUz1hLEM9byk6dj8oUz1nP2E6UyxDPV8/bzpDLHc9Yy0xLGI9KEMtUykvdyk6KHc9KEMtUykvYix3PXdvKHcsTWF0aC5yb3VuZCh3KSxiLzFlMyk/TWF0aC5yb3VuZCh3KTpNYXRoLmNlaWwodykpO2xldCBUPU1hdGgubWF4KE5vKGIpLE5vKFMpKTt4PTEwKiooVShzKT9UOnMpLFM9TWF0aC5yb3VuZChTKngpL3gsQz1NYXRoLnJvdW5kKEMqeCkveDtsZXQgRT0wO2ZvcihnJiYoZCYmUyE9PWE/KG4ucHVzaCh7dmFsdWU6YX0pLFM8YSYmRSsrLHdvKE1hdGgucm91bmQoKFMrRSpiKSp4KS94LGEsVGYoYSx5LGUpKSYmRSsrKTpTPGEmJkUrKyk7RTx3OysrRSl7bGV0IGU9TWF0aC5yb3VuZCgoUytFKmIpKngpL3g7aWYoXyYmZT5vKWJyZWFrO24ucHVzaCh7dmFsdWU6ZX0pfXJldHVybiBfJiZkJiZDIT09bz9uLmxlbmd0aCYmd28obltuLmxlbmd0aC0xXS52YWx1ZSxvLFRmKG8seSxlKSk/bltuLmxlbmd0aC0xXS52YWx1ZT1vOm4ucHVzaCh7dmFsdWU6b30pOighX3x8Qz09PW8pJiZuLnB1c2goe3ZhbHVlOkN9KSxufWZ1bmN0aW9uIFRmKGUsdCx7aG9yaXpvbnRhbDpuLG1pblJvdGF0aW9uOnJ9KXtsZXQgaT1qbyhyKSxhPShuP01hdGguc2luKGkpOk1hdGguY29zKGkpKXx8LjAwMSxvPS43NSp0KihgYCtlKS5sZW5ndGg7cmV0dXJuIE1hdGgubWluKHQvYSxvKX12YXIgRWY9Y2xhc3MgZXh0ZW5kcyBVdXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fZW5kVmFsdWU9dm9pZCAwLHRoaXMuX3ZhbHVlUmFuZ2U9MH1wYXJzZShlLHQpe3JldHVybiBVKGUpfHwodHlwZW9mIGU9PWBudW1iZXJgfHxlIGluc3RhbmNlb2YgTnVtYmVyKSYmIWlzRmluaXRlKCtlKT9udWxsOitlfWhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKXtsZXR7YmVnaW5BdFplcm86ZX09dGhpcy5vcHRpb25zLHttaW5EZWZpbmVkOnQsbWF4RGVmaW5lZDpufT10aGlzLmdldFVzZXJCb3VuZHMoKSx7bWluOnIsbWF4Oml9PXRoaXMsYT1lPT5yPXQ/cjplLG89ZT0+aT1uP2k6ZTtpZihlKXtsZXQgZT1DbyhyKSx0PUNvKGkpO2U8MCYmdDwwP28oMCk6ZT4wJiZ0PjAmJmEoMCl9aWYocj09PWkpe2xldCB0PWk9PT0wPzE6TWF0aC5hYnMoaSouMDUpO28oaSt0KSxlfHxhKHItdCl9dGhpcy5taW49cix0aGlzLm1heD1pfWdldFRpY2tMaW1pdCgpe2xldHttYXhUaWNrc0xpbWl0OmUsc3RlcFNpemU6dH09dGhpcy5vcHRpb25zLnRpY2tzLG47cmV0dXJuIHQ/KG49TWF0aC5jZWlsKHRoaXMubWF4L3QpLU1hdGguZmxvb3IodGhpcy5taW4vdCkrMSxuPjFlMyYmKGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7dH0gd291bGQgcmVzdWx0IGdlbmVyYXRpbmcgdXAgdG8gJHtufSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKSxuPTFlMykpOihuPXRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpLGV8fD0xMSksZSYmKG49TWF0aC5taW4oZSxuKSksbn1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIDEvMH1idWlsZFRpY2tzKCl7bGV0IGU9dGhpcy5vcHRpb25zLHQ9ZS50aWNrcyxuPXRoaXMuZ2V0VGlja0xpbWl0KCk7bj1NYXRoLm1heCgyLG4pO2xldCByPXdmKHttYXhUaWNrczpuLGJvdW5kczplLmJvdW5kcyxtaW46ZS5taW4sbWF4OmUubWF4LHByZWNpc2lvbjp0LnByZWNpc2lvbixzdGVwOnQuc3RlcFNpemUsY291bnQ6dC5jb3VudCxtYXhEaWdpdHM6dGhpcy5fbWF4RGlnaXRzKCksaG9yaXpvbnRhbDp0aGlzLmlzSG9yaXpvbnRhbCgpLG1pblJvdGF0aW9uOnQubWluUm90YXRpb258fDAsaW5jbHVkZUJvdW5kczp0LmluY2x1ZGVCb3VuZHMhPT0hMX0sdGhpcy5fcmFuZ2V8fHRoaXMpO3JldHVybiBlLmJvdW5kcz09PWB0aWNrc2AmJkFvKHIsdGhpcyxgdmFsdWVgKSxlLnJldmVyc2U/KHIucmV2ZXJzZSgpLHRoaXMuc3RhcnQ9dGhpcy5tYXgsdGhpcy5lbmQ9dGhpcy5taW4pOih0aGlzLnN0YXJ0PXRoaXMubWluLHRoaXMuZW5kPXRoaXMubWF4KSxyfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMudGlja3MsdD10aGlzLm1pbixuPXRoaXMubWF4O2lmKHN1cGVyLmNvbmZpZ3VyZSgpLHRoaXMub3B0aW9ucy5vZmZzZXQmJmUubGVuZ3RoKXtsZXQgcj0obi10KS9NYXRoLm1heChlLmxlbmd0aC0xLDEpLzI7dC09cixuKz1yfXRoaXMuX3N0YXJ0VmFsdWU9dCx0aGlzLl9lbmRWYWx1ZT1uLHRoaXMuX3ZhbHVlUmFuZ2U9bi10fWdldExhYmVsRm9yVmFsdWUoZSl7cmV0dXJuIG1zKGUsdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KX19LERmPWNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWBsaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY319O2RldGVybWluZURhdGFMaW1pdHMoKXtsZXR7bWluOmUsbWF4OnR9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1LKGUpP2U6MCx0aGlzLm1heD1LKHQpP3Q6MSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7bGV0IGU9dGhpcy5pc0hvcml6b250YWwoKSx0PWU/dGhpcy53aWR0aDp0aGlzLmhlaWdodCxuPWpvKHRoaXMub3B0aW9ucy50aWNrcy5taW5Sb3RhdGlvbikscj0oZT9NYXRoLnNpbihuKTpNYXRoLmNvcyhuKSl8fC4wMDEsaT10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApO3JldHVybiBNYXRoLmNlaWwodC9NYXRoLm1pbig0MCxpLmxpbmVIZWlnaHQvcikpfWdldFBpeGVsRm9yVmFsdWUoZSl7cmV0dXJuIGU9PT1udWxsP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgoZS10aGlzLl9zdGFydFZhbHVlKS90aGlzLl92YWx1ZVJhbmdlKX1nZXRWYWx1ZUZvclBpeGVsKGUpe3JldHVybiB0aGlzLl9zdGFydFZhbHVlK3RoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpKnRoaXMuX3ZhbHVlUmFuZ2V9fSxPZj1lPT5NYXRoLmZsb29yKFNvKGUpKSxrZj0oZSx0KT0+MTAqKihPZihlKSt0KTtmdW5jdGlvbiBBZihlKXtyZXR1cm4gZS8xMCoqT2YoZSk9PTF9ZnVuY3Rpb24gamYoZSx0LG4pe2xldCByPTEwKipuLGk9TWF0aC5mbG9vcihlL3IpO3JldHVybiBNYXRoLmNlaWwodC9yKS1pfWZ1bmN0aW9uIE1mKGUsdCl7bGV0IG49T2YodC1lKTtmb3IoO2pmKGUsdCxuKT4xMDspbisrO2Zvcig7amYoZSx0LG4pPDEwOyluLS07cmV0dXJuIE1hdGgubWluKG4sT2YoZSkpfWZ1bmN0aW9uIE5mKGUse21pbjp0LG1heDpufSl7dD1aYShlLm1pbix0KTtsZXQgcj1bXSxpPU9mKHQpLGE9TWYodCxuKSxvPWE8MD8xMCoqTWF0aC5hYnMoYSk6MSxzPTEwKiphLGM9aT5hPzEwKippOjAsbD1NYXRoLnJvdW5kKCh0LWMpKm8pL28sdT1NYXRoLmZsb29yKCh0LWMpL3MvMTApKnMqMTAsZD1NYXRoLmZsb29yKChsLXUpLzEwKiphKSxmPVphKGUubWluLE1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vKTtmb3IoO2Y8bjspci5wdXNoKHt2YWx1ZTpmLG1ham9yOkFmKGYpLHNpZ25pZmljYW5kOmR9KSxkPj0xMD9kPWQ8MTU/MTU6MjA6ZCsrLGQ+PTIwJiYoYSsrLGQ9MixvPWE+PTA/MTpvKSxmPU1hdGgucm91bmQoKGMrdStkKjEwKiphKSpvKS9vO2xldCBwPVphKGUubWF4LGYpO3JldHVybiByLnB1c2goe3ZhbHVlOnAsbWFqb3I6QWYocCksc2lnbmlmaWNhbmQ6ZH0pLHJ9KGNsYXNzIGV4dGVuZHMgVXV7c3RhdGljIGlkPWBsb2dhcml0aG1pY2A7c3RhdGljIGRlZmF1bHRzPXt0aWNrczp7Y2FsbGJhY2s6X3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxtYWpvcjp7ZW5hYmxlZDohMH19fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKGUsdCl7bGV0IG49RWYucHJvdG90eXBlLnBhcnNlLmFwcGx5KHRoaXMsW2UsdF0pO2lmKG49PT0wKXt0aGlzLl96ZXJvPSEwO3JldHVybn1yZXR1cm4gSyhuKSYmbj4wP246bnVsbH1kZXRlcm1pbmVEYXRhTGltaXRzKCl7bGV0e21pbjplLG1heDp0fT10aGlzLmdldE1pbk1heCghMCk7dGhpcy5taW49SyhlKT9NYXRoLm1heCgwLGUpOm51bGwsdGhpcy5tYXg9Syh0KT9NYXRoLm1heCgwLHQpOm51bGwsdGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvJiYodGhpcy5femVybz0hMCksdGhpcy5femVybyYmdGhpcy5taW4hPT10aGlzLl9zdWdnZXN0ZWRNaW4mJiFLKHRoaXMuX3VzZXJNaW4pJiYodGhpcy5taW49ZT09PWtmKHRoaXMubWluLDApP2tmKHRoaXMubWluLC0xKTprZih0aGlzLm1pbiwwKSksdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCl9aGFuZGxlVGlja1JhbmdlT3B0aW9ucygpe2xldHttaW5EZWZpbmVkOmUsbWF4RGVmaW5lZDp0fT10aGlzLmdldFVzZXJCb3VuZHMoKSxuPXRoaXMubWluLHI9dGhpcy5tYXgsaT10PT5uPWU/bjp0LGE9ZT0+cj10P3I6ZTtuPT09ciYmKG48PTA/KGkoMSksYSgxMCkpOihpKGtmKG4sLTEpKSxhKGtmKHIsMSkpKSksbjw9MCYmaShrZihyLC0xKSkscjw9MCYmYShrZihuLDEpKSx0aGlzLm1pbj1uLHRoaXMubWF4PXJ9YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PU5mKHttaW46dGhpcy5fdXNlck1pbixtYXg6dGhpcy5fdXNlck1heH0sdGhpcyk7cmV0dXJuIGUuYm91bmRzPT09YHRpY2tzYCYmQW8odCx0aGlzLGB2YWx1ZWApLGUucmV2ZXJzZT8odC5yZXZlcnNlKCksdGhpcy5zdGFydD10aGlzLm1heCx0aGlzLmVuZD10aGlzLm1pbik6KHRoaXMuc3RhcnQ9dGhpcy5taW4sdGhpcy5lbmQ9dGhpcy5tYXgpLHR9Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZT09PXZvaWQgMD9gMGA6bXMoZSx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfWNvbmZpZ3VyZSgpe2xldCBlPXRoaXMubWluO3N1cGVyLmNvbmZpZ3VyZSgpLHRoaXMuX3N0YXJ0VmFsdWU9U28oZSksdGhpcy5fdmFsdWVSYW5nZT1Tbyh0aGlzLm1heCktU28oZSl9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtyZXR1cm4oZT09PXZvaWQgMHx8ZT09PTApJiYoZT10aGlzLm1pbiksZT09PW51bGx8fGlzTmFOKGUpP05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbChlPT09dGhpcy5taW4/MDooU28oZSktdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbChlKXtsZXQgdD10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKTtyZXR1cm4gMTAqKih0aGlzLl9zdGFydFZhbHVlK3QqdGhpcy5fdmFsdWVSYW5nZSl9fSk7ZnVuY3Rpb24gUGYoZSl7bGV0IHQ9ZS50aWNrcztpZih0LmRpc3BsYXkmJmUuZGlzcGxheSl7bGV0IGU9USh0LmJhY2tkcm9wUGFkZGluZyk7cmV0dXJuIHEodC5mb250JiZ0LmZvbnQuc2l6ZSxaLmZvbnQuc2l6ZSkrZS5oZWlnaHR9cmV0dXJuIDB9ZnVuY3Rpb24gRmYoZSx0LG4pe3JldHVybiBuPVcobik/bjpbbl0se3c6VHMoZSx0LnN0cmluZyxuKSxoOm4ubGVuZ3RoKnQubGluZUhlaWdodH19ZnVuY3Rpb24gSWYoZSx0LG4scixpKXtyZXR1cm4gZT09PXJ8fGU9PT1pP3tzdGFydDp0LW4vMixlbmQ6dCtuLzJ9OmU8cnx8ZT5pP3tzdGFydDp0LW4sZW5kOnR9OntzdGFydDp0LGVuZDp0K259fWZ1bmN0aW9uIExmKGUpe2xldCB0PXtsOmUubGVmdCtlLl9wYWRkaW5nLmxlZnQscjplLnJpZ2h0LWUuX3BhZGRpbmcucmlnaHQsdDplLnRvcCtlLl9wYWRkaW5nLnRvcCxiOmUuYm90dG9tLWUuX3BhZGRpbmcuYm90dG9tfSxuPU9iamVjdC5hc3NpZ24oe30sdCkscj1bXSxpPVtdLGE9ZS5fcG9pbnRMYWJlbHMubGVuZ3RoLG89ZS5vcHRpb25zLnBvaW50TGFiZWxzLHM9by5jZW50ZXJQb2ludExhYmVscz9YL2E6MDtmb3IobGV0IGM9MDtjPGE7YysrKXtsZXQgYT1vLnNldENvbnRleHQoZS5nZXRQb2ludExhYmVsQ29udGV4dChjKSk7aVtjXT1hLnBhZGRpbmc7bGV0IGw9ZS5nZXRQb2ludFBvc2l0aW9uKGMsZS5kcmF3aW5nQXJlYStpW2NdLHMpLHU9JChhLmZvbnQpLGQ9RmYoZS5jdHgsdSxlLl9wb2ludExhYmVsc1tjXSk7cltjXT1kO2xldCBmPUlvKGUuZ2V0SW5kZXhBbmdsZShjKStzKSxwPU1hdGgucm91bmQoTW8oZikpO1JmKG4sdCxmLElmKHAsbC54LGQudywwLDE4MCksSWYocCxsLnksZC5oLDkwLDI3MCkpfWUuc2V0Q2VudGVyUG9pbnQodC5sLW4ubCxuLnItdC5yLHQudC1uLnQsbi5iLXQuYiksZS5fcG9pbnRMYWJlbEl0ZW1zPVZmKGUscixpKX1mdW5jdGlvbiBSZihlLHQsbixyLGkpe2xldCBhPU1hdGguYWJzKE1hdGguc2luKG4pKSxvPU1hdGguYWJzKE1hdGguY29zKG4pKSxzPTAsYz0wO3Iuc3RhcnQ8dC5sPyhzPSh0Lmwtci5zdGFydCkvYSxlLmw9TWF0aC5taW4oZS5sLHQubC1zKSk6ci5lbmQ+dC5yJiYocz0oci5lbmQtdC5yKS9hLGUucj1NYXRoLm1heChlLnIsdC5yK3MpKSxpLnN0YXJ0PHQudD8oYz0odC50LWkuc3RhcnQpL28sZS50PU1hdGgubWluKGUudCx0LnQtYykpOmkuZW5kPnQuYiYmKGM9KGkuZW5kLXQuYikvbyxlLmI9TWF0aC5tYXgoZS5iLHQuYitjKSl9ZnVuY3Rpb24gemYoZSx0LG4pe2xldCByPWUuZHJhd2luZ0FyZWEse2V4dHJhOmksYWRkaXRpb25hbEFuZ2xlOmEscGFkZGluZzpvLHNpemU6c309bixjPWUuZ2V0UG9pbnRQb3NpdGlvbih0LHIraStvLGEpLGw9TWF0aC5yb3VuZChNbyhJbyhjLmFuZ2xlK3lvKSkpLHU9V2YoYy55LHMuaCxsKSxkPUhmKGwpLGY9VWYoYy54LHMudyxkKTtyZXR1cm57dmlzaWJsZTohMCx4OmMueCx5OnUsdGV4dEFsaWduOmQsbGVmdDpmLHRvcDp1LHJpZ2h0OmYrcy53LGJvdHRvbTp1K3MuaH19ZnVuY3Rpb24gQmYoZSx0KXtpZighdClyZXR1cm4hMDtsZXR7bGVmdDpuLHRvcDpyLHJpZ2h0OmksYm90dG9tOmF9PWU7cmV0dXJuIShBcyh7eDpuLHk6cn0sdCl8fEFzKHt4Om4seTphfSx0KXx8QXMoe3g6aSx5OnJ9LHQpfHxBcyh7eDppLHk6YX0sdCkpfWZ1bmN0aW9uIFZmKGUsdCxuKXtsZXQgcj1bXSxpPWUuX3BvaW50TGFiZWxzLmxlbmd0aCxhPWUub3B0aW9ucyx7Y2VudGVyUG9pbnRMYWJlbHM6byxkaXNwbGF5OnN9PWEucG9pbnRMYWJlbHMsYz17ZXh0cmE6UGYoYSkvMixhZGRpdGlvbmFsQW5nbGU6bz9YL2k6MH0sbDtmb3IobGV0IGE9MDthPGk7YSsrKXtjLnBhZGRpbmc9blthXSxjLnNpemU9dFthXTtsZXQgaT16ZihlLGEsYyk7ci5wdXNoKGkpLHM9PT1gYXV0b2AmJihpLnZpc2libGU9QmYoaSxsKSxpLnZpc2libGUmJihsPWkpKX1yZXR1cm4gcn1mdW5jdGlvbiBIZihlKXtyZXR1cm4gZT09PTB8fGU9PT0xODA/YGNlbnRlcmA6ZTwxODA/YGxlZnRgOmByaWdodGB9ZnVuY3Rpb24gVWYoZSx0LG4pe3JldHVybiBuPT09YHJpZ2h0YD9lLT10Om49PT1gY2VudGVyYCYmKGUtPXQvMiksZX1mdW5jdGlvbiBXZihlLHQsbil7cmV0dXJuIG49PT05MHx8bj09PTI3MD9lLT10LzI6KG4+MjcwfHxuPDkwKSYmKGUtPXQpLGV9ZnVuY3Rpb24gR2YoZSx0LG4pe2xldHtsZWZ0OnIsdG9wOmkscmlnaHQ6YSxib3R0b206b309bix7YmFja2Ryb3BDb2xvcjpzfT10O2lmKCFVKHMpKXtsZXQgbj1Xcyh0LmJvcmRlclJhZGl1cyksYz1RKHQuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxTdHlsZT1zO2xldCBsPXItYy5sZWZ0LHU9aS1jLnRvcCxkPWEtcitjLndpZHRoLGY9by1pK2MuaGVpZ2h0O09iamVjdC52YWx1ZXMobikuc29tZShlPT5lIT09MCk/KGUuYmVnaW5QYXRoKCksTHMoZSx7eDpsLHk6dSx3OmQsaDpmLHJhZGl1czpufSksZS5maWxsKCkpOmUuZmlsbFJlY3QobCx1LGQsZil9fWZ1bmN0aW9uIEtmKGUsdCl7bGV0e2N0eDpuLG9wdGlvbnM6e3BvaW50TGFiZWxzOnJ9fT1lO2ZvcihsZXQgaT10LTE7aT49MDtpLS0pe2xldCB0PWUuX3BvaW50TGFiZWxJdGVtc1tpXTtpZighdC52aXNpYmxlKWNvbnRpbnVlO2xldCBhPXIuc2V0Q29udGV4dChlLmdldFBvaW50TGFiZWxDb250ZXh0KGkpKTtHZihuLGEsdCk7bGV0IG89JChhLmZvbnQpLHt4OnMseTpjLHRleHRBbGlnbjpsfT10O0lzKG4sZS5fcG9pbnRMYWJlbHNbaV0scyxjK28ubGluZUhlaWdodC8yLG8se2NvbG9yOmEuY29sb3IsdGV4dEFsaWduOmwsdGV4dEJhc2VsaW5lOmBtaWRkbGVgfSl9fWZ1bmN0aW9uIHFmKGUsdCxuLHIpe2xldHtjdHg6aX09ZTtpZihuKWkuYXJjKGUueENlbnRlcixlLnlDZW50ZXIsdCwwLGdvKTtlbHNle2xldCBuPWUuZ2V0UG9pbnRQb3NpdGlvbigwLHQpO2kubW92ZVRvKG4ueCxuLnkpO2ZvcihsZXQgYT0xO2E8cjthKyspbj1lLmdldFBvaW50UG9zaXRpb24oYSx0KSxpLmxpbmVUbyhuLngsbi55KX19ZnVuY3Rpb24gSmYoZSx0LG4scixpKXtsZXQgYT1lLmN0eCxvPXQuY2lyY3VsYXIse2NvbG9yOnMsbGluZVdpZHRoOmN9PXQ7IW8mJiFyfHwhc3x8IWN8fG48MHx8KGEuc2F2ZSgpLGEuc3Ryb2tlU3R5bGU9cyxhLmxpbmVXaWR0aD1jLGEuc2V0TGluZURhc2goaS5kYXNofHxbXSksYS5saW5lRGFzaE9mZnNldD1pLmRhc2hPZmZzZXQsYS5iZWdpblBhdGgoKSxxZihlLG4sbyxyKSxhLmNsb3NlUGF0aCgpLGEuc3Ryb2tlKCksYS5yZXN0b3JlKCkpfWZ1bmN0aW9uIFlmKGUsdCxuKXtyZXR1cm4gcXMoZSx7bGFiZWw6bixpbmRleDp0LHR5cGU6YHBvaW50TGFiZWxgfSl9KGNsYXNzIGV4dGVuZHMgRWZ7c3RhdGljIGlkPWByYWRpYWxMaW5lYXJgO3N0YXRpYyBkZWZhdWx0cz17ZGlzcGxheTohMCxhbmltYXRlOiEwLHBvc2l0aW9uOmBjaGFydEFyZWFgLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjB9LGdyaWQ6e2NpcmN1bGFyOiExfSxzdGFydEFuZ2xlOjAsdGlja3M6e3Nob3dMYWJlbEJhY2tkcm9wOiEwLGNhbGxiYWNrOl9zLmZvcm1hdHRlcnMubnVtZXJpY30scG9pbnRMYWJlbHM6e2JhY2tkcm9wQ29sb3I6dm9pZCAwLGJhY2tkcm9wUGFkZGluZzoyLGRpc3BsYXk6ITAsZm9udDp7c2l6ZToxMH0sY2FsbGJhY2soZSl7cmV0dXJuIGV9LHBhZGRpbmc6NSxjZW50ZXJQb2ludExhYmVsczohMX19O3N0YXRpYyBkZWZhdWx0Um91dGVzPXsiYW5nbGVMaW5lcy5jb2xvciI6YGJvcmRlckNvbG9yYCwicG9pbnRMYWJlbHMuY29sb3IiOmBjb2xvcmAsInRpY2tzLmNvbG9yIjpgY29sb3JgfTtzdGF0aWMgZGVzY3JpcHRvcnM9e2FuZ2xlTGluZXM6e19mYWxsYmFjazpgZ3JpZGB9fTtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnhDZW50ZXI9dm9pZCAwLHRoaXMueUNlbnRlcj12b2lkIDAsdGhpcy5kcmF3aW5nQXJlYT12b2lkIDAsdGhpcy5fcG9pbnRMYWJlbHM9W10sdGhpcy5fcG9pbnRMYWJlbEl0ZW1zPVtdfXNldERpbWVuc2lvbnMoKXtsZXQgZT10aGlzLl9wYWRkaW5nPVEoUGYodGhpcy5vcHRpb25zKS8yKSx0PXRoaXMud2lkdGg9dGhpcy5tYXhXaWR0aC1lLndpZHRoLG49dGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQtZS5oZWlnaHQ7dGhpcy54Q2VudGVyPU1hdGguZmxvb3IodGhpcy5sZWZ0K3QvMitlLmxlZnQpLHRoaXMueUNlbnRlcj1NYXRoLmZsb29yKHRoaXMudG9wK24vMitlLnRvcCksdGhpcy5kcmF3aW5nQXJlYT1NYXRoLmZsb29yKE1hdGgubWluKHQsbikvMil9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldHttaW46ZSxtYXg6dH09dGhpcy5nZXRNaW5NYXgoITEpO3RoaXMubWluPUsoZSkmJiFpc05hTihlKT9lOjAsdGhpcy5tYXg9Syh0KSYmIWlzTmFOKHQpP3Q6MCx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhL1BmKHRoaXMub3B0aW9ucykpfWdlbmVyYXRlVGlja0xhYmVscyhlKXtFZi5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcyxlKSx0aGlzLl9wb2ludExhYmVscz10aGlzLmdldExhYmVscygpLm1hcCgoZSx0KT0+e2xldCBuPUoodGhpcy5vcHRpb25zLnBvaW50TGFiZWxzLmNhbGxiYWNrLFtlLHRdLHRoaXMpO3JldHVybiBufHxuPT09MD9uOmBgfSkuZmlsdGVyKChlLHQpPT50aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KHQpKX1maXQoKXtsZXQgZT10aGlzLm9wdGlvbnM7ZS5kaXNwbGF5JiZlLnBvaW50TGFiZWxzLmRpc3BsYXk/TGYodGhpcyk6dGhpcy5zZXRDZW50ZXJQb2ludCgwLDAsMCwwKX1zZXRDZW50ZXJQb2ludChlLHQsbixyKXt0aGlzLnhDZW50ZXIrPU1hdGguZmxvb3IoKGUtdCkvMiksdGhpcy55Q2VudGVyKz1NYXRoLmZsb29yKChuLXIpLzIpLHRoaXMuZHJhd2luZ0FyZWEtPU1hdGgubWluKHRoaXMuZHJhd2luZ0FyZWEvMixNYXRoLm1heChlLHQsbixyKSl9Z2V0SW5kZXhBbmdsZShlKXtsZXQgdD1nby8odGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RofHwxKSxuPXRoaXMub3B0aW9ucy5zdGFydEFuZ2xlfHwwO3JldHVybiBJbyhlKnQram8obikpfWdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbik7cmV0dXJuIHRoaXMub3B0aW9ucy5yZXZlcnNlPyh0aGlzLm1heC1lKSp0OihlLXRoaXMubWluKSp0fWdldFZhbHVlRm9yRGlzdGFuY2VGcm9tQ2VudGVyKGUpe2lmKFUoZSkpcmV0dXJuIE5hTjtsZXQgdD1lLyh0aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbikpO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT90aGlzLm1heC10OnRoaXMubWluK3R9Z2V0UG9pbnRMYWJlbENvbnRleHQoZSl7bGV0IHQ9dGhpcy5fcG9pbnRMYWJlbHN8fFtdO2lmKGU+PTAmJmU8dC5sZW5ndGgpe2xldCBuPXRbZV07cmV0dXJuIFlmKHRoaXMuZ2V0Q29udGV4dCgpLGUsbil9fWdldFBvaW50UG9zaXRpb24oZSx0LG49MCl7bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKGUpLXlvK247cmV0dXJue3g6TWF0aC5jb3MocikqdCt0aGlzLnhDZW50ZXIseTpNYXRoLnNpbihyKSp0K3RoaXMueUNlbnRlcixhbmdsZTpyfX1nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGUsdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0KSl9Z2V0QmFzZVBvc2l0aW9uKGUpe3JldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShlfHwwLHRoaXMuZ2V0QmFzZVZhbHVlKCkpfWdldFBvaW50TGFiZWxQb3NpdGlvbihlKXtsZXR7bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9PXRoaXMuX3BvaW50TGFiZWxJdGVtc1tlXTtyZXR1cm57bGVmdDp0LHRvcDpuLHJpZ2h0OnIsYm90dG9tOml9fWRyYXdCYWNrZ3JvdW5kKCl7bGV0e2JhY2tncm91bmRDb2xvcjplLGdyaWQ6e2NpcmN1bGFyOnR9fT10aGlzLm9wdGlvbnM7aWYoZSl7bGV0IG49dGhpcy5jdHg7bi5zYXZlKCksbi5iZWdpblBhdGgoKSxxZih0aGlzLHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5fZW5kVmFsdWUpLHQsdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoKSxuLmNsb3NlUGF0aCgpLG4uZmlsbFN0eWxlPWUsbi5maWxsKCksbi5yZXN0b3JlKCl9fWRyYXdHcmlkKCl7bGV0IGU9dGhpcy5jdHgsdD10aGlzLm9wdGlvbnMse2FuZ2xlTGluZXM6bixncmlkOnIsYm9yZGVyOml9PXQsYT10aGlzLl9wb2ludExhYmVscy5sZW5ndGgsbyxzLGM7aWYodC5wb2ludExhYmVscy5kaXNwbGF5JiZLZih0aGlzLGEpLHIuZGlzcGxheSYmdGhpcy50aWNrcy5mb3JFYWNoKChlLHQpPT57aWYodCE9PTB8fHQ9PT0wJiZ0aGlzLm1pbjwwKXtzPXRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZS52YWx1ZSk7bGV0IG49dGhpcy5nZXRDb250ZXh0KHQpLG89ci5zZXRDb250ZXh0KG4pLGM9aS5zZXRDb250ZXh0KG4pO0pmKHRoaXMsbyxzLGEsYyl9fSksbi5kaXNwbGF5KXtmb3IoZS5zYXZlKCksbz1hLTE7bz49MDtvLS0pe2xldCByPW4uc2V0Q29udGV4dCh0aGlzLmdldFBvaW50TGFiZWxDb250ZXh0KG8pKSx7Y29sb3I6aSxsaW5lV2lkdGg6YX09cjshYXx8IWl8fChlLmxpbmVXaWR0aD1hLGUuc3Ryb2tlU3R5bGU9aSxlLnNldExpbmVEYXNoKHIuYm9yZGVyRGFzaCksZS5saW5lRGFzaE9mZnNldD1yLmJvcmRlckRhc2hPZmZzZXQscz10aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHQucmV2ZXJzZT90aGlzLm1pbjp0aGlzLm1heCksYz10aGlzLmdldFBvaW50UG9zaXRpb24obyxzKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHRoaXMueENlbnRlcix0aGlzLnlDZW50ZXIpLGUubGluZVRvKGMueCxjLnkpLGUuc3Ryb2tlKCkpfWUucmVzdG9yZSgpfX1kcmF3Qm9yZGVyKCl7fWRyYXdMYWJlbHMoKXtsZXQgZT10aGlzLmN0eCx0PXRoaXMub3B0aW9ucyxuPXQudGlja3M7aWYoIW4uZGlzcGxheSlyZXR1cm47bGV0IHI9dGhpcy5nZXRJbmRleEFuZ2xlKDApLGksYTtlLnNhdmUoKSxlLnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSxlLnJvdGF0ZShyKSxlLnRleHRBbGlnbj1gY2VudGVyYCxlLnRleHRCYXNlbGluZT1gbWlkZGxlYCx0aGlzLnRpY2tzLmZvckVhY2goKHIsbyk9PntpZihvPT09MCYmdGhpcy5taW4+PTAmJiF0LnJldmVyc2UpcmV0dXJuO2xldCBzPW4uc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQobykpLGM9JChzLmZvbnQpO2lmKGk9dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW29dLnZhbHVlKSxzLnNob3dMYWJlbEJhY2tkcm9wKXtlLmZvbnQ9Yy5zdHJpbmcsYT1lLm1lYXN1cmVUZXh0KHIubGFiZWwpLndpZHRoLGUuZmlsbFN0eWxlPXMuYmFja2Ryb3BDb2xvcjtsZXQgdD1RKHMuYmFja2Ryb3BQYWRkaW5nKTtlLmZpbGxSZWN0KC1hLzItdC5sZWZ0LC1pLWMuc2l6ZS8yLXQudG9wLGErdC53aWR0aCxjLnNpemUrdC5oZWlnaHQpfUlzKGUsci5sYWJlbCwwLC1pLGMse2NvbG9yOnMuY29sb3Isc3Ryb2tlQ29sb3I6cy50ZXh0U3Ryb2tlQ29sb3Isc3Ryb2tlV2lkdGg6cy50ZXh0U3Ryb2tlV2lkdGh9KX0pLGUucmVzdG9yZSgpfWRyYXdUaXRsZSgpe319KTt2YXIgWGY9e21pbGxpc2Vjb25kOntjb21tb246ITAsc2l6ZToxLHN0ZXBzOjFlM30sc2Vjb25kOntjb21tb246ITAsc2l6ZToxZTMsc3RlcHM6NjB9LG1pbnV0ZTp7Y29tbW9uOiEwLHNpemU6NmU0LHN0ZXBzOjYwfSxob3VyOntjb21tb246ITAsc2l6ZTozNmU1LHN0ZXBzOjI0fSxkYXk6e2NvbW1vbjohMCxzaXplOjg2NGU1LHN0ZXBzOjMwfSx3ZWVrOntjb21tb246ITEsc2l6ZTo2MDQ4ZTUsc3RlcHM6NH0sbW9udGg6e2NvbW1vbjohMCxzaXplOjI2MjhlNixzdGVwczoxMn0scXVhcnRlcjp7Y29tbW9uOiExLHNpemU6Nzg4NGU2LHN0ZXBzOjR9LHllYXI6e2NvbW1vbjohMCxzaXplOjMxNTRlN319LFpmPU9iamVjdC5rZXlzKFhmKTtmdW5jdGlvbiBRZihlLHQpe3JldHVybiBlLXR9ZnVuY3Rpb24gJGYoZSx0KXtpZihVKHQpKXJldHVybiBudWxsO2xldCBuPWUuX2FkYXB0ZXIse3BhcnNlcjpyLHJvdW5kOmksaXNvV2Vla2RheTphfT1lLl9wYXJzZU9wdHMsbz10O3JldHVybiB0eXBlb2Ygcj09YGZ1bmN0aW9uYCYmKG89cihvKSksSyhvKXx8KG89dHlwZW9mIHI9PWBzdHJpbmdgP24ucGFyc2UobyxyKTpuLnBhcnNlKG8pKSxvPT09bnVsbD9udWxsOihpJiYobz1pPT09YHdlZWtgJiYoT28oYSl8fGE9PT0hMCk/bi5zdGFydE9mKG8sYGlzb1dlZWtgLGEpOm4uc3RhcnRPZihvLGkpKSwrbyl9ZnVuY3Rpb24gZXAoZSx0LG4scil7bGV0IGk9WmYubGVuZ3RoO2ZvcihsZXQgYT1aZi5pbmRleE9mKGUpO2E8aS0xOysrYSl7bGV0IGU9WGZbWmZbYV1dLGk9ZS5zdGVwcz9lLnN0ZXBzOjIqKjUzLTE7aWYoZS5jb21tb24mJk1hdGguY2VpbCgobi10KS8oaSplLnNpemUpKTw9cilyZXR1cm4gWmZbYV19cmV0dXJuIFpmW2ktMV19ZnVuY3Rpb24gdHAoZSx0LG4scixpKXtmb3IobGV0IGE9WmYubGVuZ3RoLTE7YT49WmYuaW5kZXhPZihuKTthLS0pe2xldCBuPVpmW2FdO2lmKFhmW25dLmNvbW1vbiYmZS5fYWRhcHRlci5kaWZmKGkscixuKT49dC0xKXJldHVybiBufXJldHVybiBaZltuP1pmLmluZGV4T2Yobik6MF19ZnVuY3Rpb24gbnAoZSl7Zm9yKGxldCB0PVpmLmluZGV4T2YoZSkrMSxuPVpmLmxlbmd0aDt0PG47Kyt0KWlmKFhmW1pmW3RdXS5jb21tb24pcmV0dXJuIFpmW3RdfWZ1bmN0aW9uIHJwKGUsdCxuKXtpZighbillW3RdPSEwO2Vsc2UgaWYobi5sZW5ndGgpe2xldHtsbzpyLGhpOml9PVZvKG4sdCksYT1uW3JdPj10P25bcl06bltpXTtlW2FdPSEwfX1mdW5jdGlvbiBpcChlLHQsbixyKXtsZXQgaT1lLl9hZGFwdGVyLGE9K2kuc3RhcnRPZih0WzBdLnZhbHVlLHIpLG89dFt0Lmxlbmd0aC0xXS52YWx1ZSxzLGM7Zm9yKHM9YTtzPD1vO3M9K2kuYWRkKHMsMSxyKSljPW5bc10sYz49MCYmKHRbY10ubWFqb3I9ITApO3JldHVybiB0fWZ1bmN0aW9uIGFwKGUsdCxuKXtsZXQgcj1bXSxpPXt9LGE9dC5sZW5ndGgsbyxzO2ZvcihvPTA7bzxhOysrbylzPXRbb10saVtzXT1vLHIucHVzaCh7dmFsdWU6cyxtYWpvcjohMX0pO3JldHVybiBhPT09MHx8IW4/cjppcChlLHIsaSxuKX12YXIgb3A9Y2xhc3MgZXh0ZW5kcyBVdXtzdGF0aWMgaWQ9YHRpbWVgO3N0YXRpYyBkZWZhdWx0cz17Ym91bmRzOmBkYXRhYCxhZGFwdGVyczp7fSx0aW1lOntwYXJzZXI6ITEsdW5pdDohMSxyb3VuZDohMSxpc29XZWVrZGF5OiExLG1pblVuaXQ6YG1pbGxpc2Vjb25kYCxkaXNwbGF5Rm9ybWF0czp7fX0sdGlja3M6e3NvdXJjZTpgYXV0b2AsY2FsbGJhY2s6ITEsbWFqb3I6e2VuYWJsZWQ6ITF9fX07Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX0sdGhpcy5fdW5pdD1gZGF5YCx0aGlzLl9tYWpvclVuaXQ9dm9pZCAwLHRoaXMuX29mZnNldHM9e30sdGhpcy5fbm9ybWFsaXplZD0hMSx0aGlzLl9wYXJzZU9wdHM9dm9pZCAwfWluaXQoZSx0PXt9KXtsZXQgbj1lLnRpbWV8fD17fSxyPXRoaXMuX2FkYXB0ZXI9bmV3IERsLl9kYXRlKGUuYWRhcHRlcnMuZGF0ZSk7ci5pbml0KHQpLGlvKG4uZGlzcGxheUZvcm1hdHMsci5mb3JtYXRzKCkpLHRoaXMuX3BhcnNlT3B0cz17cGFyc2VyOm4ucGFyc2VyLHJvdW5kOm4ucm91bmQsaXNvV2Vla2RheTpuLmlzb1dlZWtkYXl9LHN1cGVyLmluaXQoZSksdGhpcy5fbm9ybWFsaXplZD10Lm5vcm1hbGl6ZWR9cGFyc2UoZSx0KXtyZXR1cm4gZT09PXZvaWQgMD9udWxsOiRmKHRoaXMsZSl9YmVmb3JlTGF5b3V0KCl7c3VwZXIuYmVmb3JlTGF5b3V0KCksdGhpcy5fY2FjaGU9e2RhdGE6W10sbGFiZWxzOltdLGFsbDpbXX19ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe2xldCBlPXRoaXMub3B0aW9ucyx0PXRoaXMuX2FkYXB0ZXIsbj1lLnRpbWUudW5pdHx8YGRheWAse21pbjpyLG1heDppLG1pbkRlZmluZWQ6YSxtYXhEZWZpbmVkOm99PXRoaXMuZ2V0VXNlckJvdW5kcygpO2Z1bmN0aW9uIHMoZSl7IWEmJiFpc05hTihlLm1pbikmJihyPU1hdGgubWluKHIsZS5taW4pKSwhbyYmIWlzTmFOKGUubWF4KSYmKGk9TWF0aC5tYXgoaSxlLm1heCkpfSghYXx8IW8pJiYocyh0aGlzLl9nZXRMYWJlbEJvdW5kcygpKSwoZS5ib3VuZHMhPT1gdGlja3NgfHxlLnRpY2tzLnNvdXJjZSE9PWBsYWJlbHNgKSYmcyh0aGlzLmdldE1pbk1heCghMSkpKSxyPUsocikmJiFpc05hTihyKT9yOit0LnN0YXJ0T2YoRGF0ZS5ub3coKSxuKSxpPUsoaSkmJiFpc05hTihpKT9pOit0LmVuZE9mKERhdGUubm93KCksbikrMSx0aGlzLm1pbj1NYXRoLm1pbihyLGktMSksdGhpcy5tYXg9TWF0aC5tYXgocisxLGkpfV9nZXRMYWJlbEJvdW5kcygpe2xldCBlPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCksdD0xLzAsbj0tMS8wO3JldHVybiBlLmxlbmd0aCYmKHQ9ZVswXSxuPWVbZS5sZW5ndGgtMV0pLHttaW46dCxtYXg6bn19YnVpbGRUaWNrcygpe2xldCBlPXRoaXMub3B0aW9ucyx0PWUudGltZSxuPWUudGlja3Mscj1uLnNvdXJjZT09PWBsYWJlbHNgP3RoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk6dGhpcy5fZ2VuZXJhdGUoKTtlLmJvdW5kcz09PWB0aWNrc2AmJnIubGVuZ3RoJiYodGhpcy5taW49dGhpcy5fdXNlck1pbnx8clswXSx0aGlzLm1heD10aGlzLl91c2VyTWF4fHxyW3IubGVuZ3RoLTFdKTtsZXQgaT10aGlzLm1pbixhPXRoaXMubWF4LG89V28ocixpLGEpO3JldHVybiB0aGlzLl91bml0PXQudW5pdHx8KG4uYXV0b1NraXA/ZXAodC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4LHRoaXMuX2dldExhYmVsQ2FwYWNpdHkoaSkpOnRwKHRoaXMsby5sZW5ndGgsdC5taW5Vbml0LHRoaXMubWluLHRoaXMubWF4KSksdGhpcy5fbWFqb3JVbml0PSFuLm1ham9yLmVuYWJsZWR8fHRoaXMuX3VuaXQ9PT1geWVhcmA/dm9pZCAwOm5wKHRoaXMuX3VuaXQpLHRoaXMuaW5pdE9mZnNldHMociksZS5yZXZlcnNlJiZvLnJldmVyc2UoKSxhcCh0aGlzLG8sdGhpcy5fbWFqb3JVbml0KX1hZnRlckF1dG9Ta2lwKCl7dGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXAmJnRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAoZT0+K2UudmFsdWUpKX1pbml0T2Zmc2V0cyhlPVtdKXtsZXQgdD0wLG49MCxyLGk7dGhpcy5vcHRpb25zLm9mZnNldCYmZS5sZW5ndGgmJihyPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbMF0pLHQ9ZS5sZW5ndGg9PT0xPzEtcjoodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVsxXSktcikvMixpPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKGVbZS5sZW5ndGgtMV0pLG49ZS5sZW5ndGg9PT0xP2k6KGktdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZVtlLmxlbmd0aC0yXSkpLzIpO2xldCBhPWUubGVuZ3RoPDM/LjU6LjI1O3Q9Um8odCwwLGEpLG49Um8obiwwLGEpLHRoaXMuX29mZnNldHM9e3N0YXJ0OnQsZW5kOm4sZmFjdG9yOjEvKHQrMStuKX19X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5fYWRhcHRlcix0PXRoaXMubWluLG49dGhpcy5tYXgscj10aGlzLm9wdGlvbnMsaT1yLnRpbWUsYT1pLnVuaXR8fGVwKGkubWluVW5pdCx0LG4sdGhpcy5fZ2V0TGFiZWxDYXBhY2l0eSh0KSksbz1xKHIudGlja3Muc3RlcFNpemUsMSkscz1hPT09YHdlZWtgJiZpLmlzb1dlZWtkYXksYz1PbyhzKXx8cz09PSEwLGw9e30sdT10LGQsZjtpZihjJiYodT0rZS5zdGFydE9mKHUsYGlzb1dlZWtgLHMpKSx1PStlLnN0YXJ0T2YodSxjP2BkYXlgOmEpLGUuZGlmZihuLHQsYSk+MWU1Km8pdGhyb3cgRXJyb3IodCtgIGFuZCBgK24rYCBhcmUgdG9vIGZhciBhcGFydCB3aXRoIHN0ZXBTaXplIG9mIGArbytgIGArYSk7bGV0IHA9ci50aWNrcy5zb3VyY2U9PT1gZGF0YWAmJnRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtmb3IoZD11LGY9MDtkPG47ZD0rZS5hZGQoZCxvLGEpLGYrKylycChsLGQscCk7cmV0dXJuKGQ9PT1ufHxyLmJvdW5kcz09PWB0aWNrc2B8fGY9PT0xKSYmcnAobCxkLHApLE9iamVjdC5rZXlzKGwpLnNvcnQoUWYpLm1hcChlPT4rZSl9Z2V0TGFiZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9hZGFwdGVyLG49dGhpcy5vcHRpb25zLnRpbWU7cmV0dXJuIG4udG9vbHRpcEZvcm1hdD90LmZvcm1hdChlLG4udG9vbHRpcEZvcm1hdCk6dC5mb3JtYXQoZSxuLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKX1mb3JtYXQoZSx0KXtsZXQgbj10aGlzLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cyxyPXRoaXMuX3VuaXQsaT10fHxuW3JdO3JldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdChlLGkpfV90aWNrRm9ybWF0RnVuY3Rpb24oZSx0LG4scil7bGV0IGk9dGhpcy5vcHRpb25zLGE9aS50aWNrcy5jYWxsYmFjaztpZihhKXJldHVybiBKKGEsW2UsdCxuXSx0aGlzKTtsZXQgbz1pLnRpbWUuZGlzcGxheUZvcm1hdHMscz10aGlzLl91bml0LGM9dGhpcy5fbWFqb3JVbml0LGw9cyYmb1tzXSx1PWMmJm9bY10sZD1uW3RdLGY9YyYmdSYmZCYmZC5tYWpvcjtyZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQoZSxyfHwoZj91OmwpKX1nZW5lcmF0ZVRpY2tMYWJlbHMoZSl7bGV0IHQsbixyO2Zvcih0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXI9ZVt0XSxyLmxhYmVsPXRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihyLnZhbHVlLHQsZSl9Z2V0RGVjaW1hbEZvclZhbHVlKGUpe3JldHVybiBlPT09bnVsbD9OYU46KGUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9Z2V0UGl4ZWxGb3JWYWx1ZShlKXtsZXQgdD10aGlzLl9vZmZzZXRzLG49dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUoZSk7cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh0LnN0YXJ0K24pKnQuZmFjdG9yKX1nZXRWYWx1ZUZvclBpeGVsKGUpe2xldCB0PXRoaXMuX29mZnNldHMsbj10aGlzLmdldERlY2ltYWxGb3JQaXhlbChlKS90LmZhY3Rvci10LmVuZDtyZXR1cm4gdGhpcy5taW4rbioodGhpcy5tYXgtdGhpcy5taW4pfV9nZXRMYWJlbFNpemUoZSl7bGV0IHQ9dGhpcy5vcHRpb25zLnRpY2tzLG49dGhpcy5jdHgubWVhc3VyZVRleHQoZSkud2lkdGgscj1qbyh0aGlzLmlzSG9yaXpvbnRhbCgpP3QubWF4Um90YXRpb246dC5taW5Sb3RhdGlvbiksaT1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLG89dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5zaXplO3JldHVybnt3Om4qaStvKmEsaDpuKmErbyppfX1fZ2V0TGFiZWxDYXBhY2l0eShlKXtsZXQgdD10aGlzLm9wdGlvbnMudGltZSxuPXQuZGlzcGxheUZvcm1hdHMscj1uW3QudW5pdF18fG4ubWlsbGlzZWNvbmQsaT10aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24oZSwwLGFwKHRoaXMsW2VdLHRoaXMuX21ham9yVW5pdCksciksYT10aGlzLl9nZXRMYWJlbFNpemUoaSksbz1NYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aC9hLnc6dGhpcy5oZWlnaHQvYS5oKS0xO3JldHVybiBvPjA/bzoxfWdldERhdGFUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUuZGF0YXx8W10sdCxuO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCByPXRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKTtpZih0aGlzLl9ub3JtYWxpemVkJiZyLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FjaGUuZGF0YT1yWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpO2Zvcih0PTAsbj1yLmxlbmd0aDt0PG47Kyt0KWU9ZS5jb25jYXQoclt0XS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmRhdGE9dGhpcy5ub3JtYWxpemUoZSl9Z2V0TGFiZWxUaW1lc3RhbXBzKCl7bGV0IGU9dGhpcy5fY2FjaGUubGFiZWxzfHxbXSx0LG47aWYoZS5sZW5ndGgpcmV0dXJuIGU7bGV0IHI9dGhpcy5nZXRMYWJlbHMoKTtmb3IodD0wLG49ci5sZW5ndGg7dDxuOysrdCllLnB1c2goJGYodGhpcyxyW3RdKSk7cmV0dXJuIHRoaXMuX2NhY2hlLmxhYmVscz10aGlzLl9ub3JtYWxpemVkP2U6dGhpcy5ub3JtYWxpemUoZSl9bm9ybWFsaXplKGUpe3JldHVybiBKbyhlLnNvcnQoUWYpKX19O2Z1bmN0aW9uIHNwKGUsdCxuKXtsZXQgcj0wLGk9ZS5sZW5ndGgtMSxhLG8scyxjO24/KHQ+PWVbcl0ucG9zJiZ0PD1lW2ldLnBvcyYmKHtsbzpyLGhpOml9PUhvKGUsYHBvc2AsdCkpLHtwb3M6YSx0aW1lOnN9PWVbcl0se3BvczpvLHRpbWU6Y309ZVtpXSk6KHQ+PWVbcl0udGltZSYmdDw9ZVtpXS50aW1lJiYoe2xvOnIsaGk6aX09SG8oZSxgdGltZWAsdCkpLHt0aW1lOmEscG9zOnN9PWVbcl0se3RpbWU6byxwb3M6Y309ZVtpXSk7bGV0IGw9by1hO3JldHVybiBsP3MrKGMtcykqKHQtYSkvbDpzfShjbGFzcyBleHRlbmRzIG9we3N0YXRpYyBpZD1gdGltZXNlcmllc2A7c3RhdGljIGRlZmF1bHRzPW9wLmRlZmF1bHRzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuX3RhYmxlPVtdLHRoaXMuX21pblBvcz12b2lkIDAsdGhpcy5fdGFibGVSYW5nZT12b2lkIDB9aW5pdE9mZnNldHMoKXtsZXQgZT10aGlzLl9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKSx0PXRoaXMuX3RhYmxlPXRoaXMuYnVpbGRMb29rdXBUYWJsZShlKTt0aGlzLl9taW5Qb3M9c3AodCx0aGlzLm1pbiksdGhpcy5fdGFibGVSYW5nZT1zcCh0LHRoaXMubWF4KS10aGlzLl9taW5Qb3Msc3VwZXIuaW5pdE9mZnNldHMoZSl9YnVpbGRMb29rdXBUYWJsZShlKXtsZXR7bWluOnQsbWF4Om59PXRoaXMscj1bXSxpPVtdLGEsbyxzLGMsbDtmb3IoYT0wLG89ZS5sZW5ndGg7YTxvOysrYSljPWVbYV0sYz49dCYmYzw9biYmci5wdXNoKGMpO2lmKHIubGVuZ3RoPDIpcmV0dXJuW3t0aW1lOnQscG9zOjB9LHt0aW1lOm4scG9zOjF9XTtmb3IoYT0wLG89ci5sZW5ndGg7YTxvOysrYSlsPXJbYSsxXSxzPXJbYS0xXSxjPXJbYV0sTWF0aC5yb3VuZCgobCtzKS8yKSE9PWMmJmkucHVzaCh7dGltZTpjLHBvczphLyhvLTEpfSk7cmV0dXJuIGl9X2dlbmVyYXRlKCl7bGV0IGU9dGhpcy5taW4sdD10aGlzLm1heCxuPXN1cGVyLmdldERhdGFUaW1lc3RhbXBzKCk7cmV0dXJuKCFuLmluY2x1ZGVzKGUpfHwhbi5sZW5ndGgpJiZuLnNwbGljZSgwLDAsZSksKCFuLmluY2x1ZGVzKHQpfHxuLmxlbmd0aD09PTEpJiZuLnB1c2godCksbi5zb3J0KChlLHQpPT5lLXQpfV9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKXtsZXQgZT10aGlzLl9jYWNoZS5hbGx8fFtdO2lmKGUubGVuZ3RoKXJldHVybiBlO2xldCB0PXRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKSxuPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7cmV0dXJuIGU9dC5sZW5ndGgmJm4ubGVuZ3RoP3RoaXMubm9ybWFsaXplKHQuY29uY2F0KG4pKTp0Lmxlbmd0aD90Om4sZT10aGlzLl9jYWNoZS5hbGw9ZSxlfWdldERlY2ltYWxGb3JWYWx1ZShlKXtyZXR1cm4oc3AodGhpcy5fdGFibGUsZSktdGhpcy5fbWluUG9zKS90aGlzLl90YWJsZVJhbmdlfWdldFZhbHVlRm9yUGl4ZWwoZSl7bGV0IHQ9dGhpcy5fb2Zmc2V0cyxuPXRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKGUpL3QuZmFjdG9yLXQuZW5kO3JldHVybiBzcCh0aGlzLl90YWJsZSxuKnRoaXMuX3RhYmxlUmFuZ2UrdGhpcy5fbWluUG9zLCEwKX19KTt2YXIgY3A9e2RhdGE6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiEwfSxvcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OigpPT4oe30pfSxwbHVnaW5zOnt0eXBlOkFycmF5LGRlZmF1bHQ6KCk9PltdfSxkYXRhc2V0SWRLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6YGxhYmVsYH0sdXBkYXRlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp2b2lkIDB9fSxscD17YXJpYUxhYmVsOnt0eXBlOlN0cmluZ30sYXJpYURlc2NyaWJlZGJ5Ont0eXBlOlN0cmluZ319LHVwPXt0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzdHJveURlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LC4uLmNwLC4uLmxwfSxkcD0oZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQpO2Z1bmN0aW9uIGZwKGUpe3JldHVybiBjKGUpP08oZSk6ZX1mdW5jdGlvbiBwcChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZTtyZXR1cm4gYyh0KT9uZXcgUHJveHkoZSx7fSk6ZX1mdW5jdGlvbiBtcChlLHQpe2xldCBuPWUub3B0aW9ucztuJiZ0JiZPYmplY3QuYXNzaWduKG4sdCl9ZnVuY3Rpb24gaHAoZSx0KXtlLmxhYmVscz10fWZ1bmN0aW9uIGdwKGUsdCxuKXtsZXQgcj1bXTtlLmRhdGFzZXRzPXQubWFwKHQ9PntsZXQgaT1lLmRhdGFzZXRzLmZpbmQoZT0+ZVtuXT09PXRbbl0pO3JldHVybiFpfHwhdC5kYXRhfHxyLmluY2x1ZGVzKGkpP3suLi50fTooci5wdXNoKGkpLE9iamVjdC5hc3NpZ24oaSx0KSxpKX0pfWZ1bmN0aW9uIF9wKGUsdCl7bGV0IG49e2xhYmVsczpbXSxkYXRhc2V0czpbXX07cmV0dXJuIGhwKG4sZS5sYWJlbHMpLGdwKG4sZS5kYXRhc2V0cyx0KSxufXZhciB2cD1SKHtwcm9wczp1cCxzZXR1cChlLHQpe2xldHtleHBvc2U6bixzbG90czpyfT10LGk9RihudWxsKSxhPXcobnVsbCk7bih7Y2hhcnQ6YX0pO2xldCBvPSgpPT57aWYoIWkudmFsdWUpcmV0dXJuO2xldHt0eXBlOnQsZGF0YTpuLG9wdGlvbnM6cixwbHVnaW5zOm8sZGF0YXNldElkS2V5OnN9PWUsYz1wcChfcChuLHMpLG4pO2EudmFsdWU9bmV3IGpkKGkudmFsdWUse3R5cGU6dCxkYXRhOmMsb3B0aW9uczp7Li4ucn0scGx1Z2luczpvfSl9LHM9KCk9PntsZXQgdD1PKGEudmFsdWUpO3QmJihlLmRlc3Ryb3lEZWxheT4wP3NldFRpbWVvdXQoKCk9Pnt0LmRlc3Ryb3koKSxhLnZhbHVlPW51bGx9LGUuZGVzdHJveURlbGF5KToodC5kZXN0cm95KCksYS52YWx1ZT1udWxsKSl9LGM9dD0+e3QudXBkYXRlKGUudXBkYXRlTW9kZSl9O3JldHVybiBNZShvKSx3ZShzKSxWKFsoKT0+ZS5vcHRpb25zLCgpPT5lLmRhdGFdLCh0LG4pPT57bGV0W3IsaV09dCxbbyxzXT1uLGw9TyhhLnZhbHVlKTtpZighbClyZXR1cm47bGV0IHU9ITE7aWYocil7bGV0IGU9ZnAociksdD1mcChvKTtlJiZlIT09dCYmKG1wKGwsZSksdT0hMCl9aWYoaSl7bGV0IHQ9ZnAoaS5sYWJlbHMpLG49ZnAocy5sYWJlbHMpLHI9ZnAoaS5kYXRhc2V0cyksYT1mcChzLmRhdGFzZXRzKTt0IT09biYmKGhwKGwuY29uZmlnLmRhdGEsdCksdT0hMCksciYmciE9PWEmJihncChsLmNvbmZpZy5kYXRhLHIsZS5kYXRhc2V0SWRLZXkpLHU9ITApfXUmJnhlKCgpPT57YyhsKX0pfSx7ZGVlcDohMH0pLCgpPT5BZShgY2FudmFzYCx7cm9sZTpgaW1nYCwiYXJpYS1sYWJlbCI6ZS5hcmlhTGFiZWwsImFyaWEtZGVzY3JpYmVkYnkiOmUuYXJpYURlc2NyaWJlZGJ5LHJlZjppfSxbQWUoYHBgLHt9LFtyLmRlZmF1bHQ/ci5kZWZhdWx0KCk6YGBdKV0pfX0pO2Z1bmN0aW9uIHlwKGUsdCl7cmV0dXJuIGpkLnJlZ2lzdGVyKHQpLFIoe3Byb3BzOmNwLHNldHVwKHQsbil7bGV0e2V4cG9zZTpyfT1uLGk9dyhudWxsKSxhPXcobnVsbCk7VigoKT0+YS52YWx1ZT8uY2hhcnQ/P251bGwsZT0+e2kudmFsdWU9ZX0se2ZsdXNoOmBzeW5jYH0pLHIoe2NoYXJ0Oml9KTtsZXQgbz1lPT57YS52YWx1ZT1lfTtyZXR1cm4oKT0+QWUodnAsZHAoe3JlZjpvfSx7dHlwZTplLC4uLnR9KSl9fSl9dmFyIGJwPXlwKGBiYXJgLFRsKTtqZC5yZWdpc3RlcihUbCxIZCxDZixEZixaZCx2Zik7ZnVuY3Rpb24geHAoKXtsZXQgZT1GKGBgKSx0PUYoYGApLG49RihgYCk7ZnVuY3Rpb24gcigpe2xldCByPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtlLnZhbHVlPXIuZ2V0UHJvcGVydHlWYWx1ZShgLS1mb3JlZ3JvdW5kYCkudHJpbSgpLHQudmFsdWU9ci5nZXRQcm9wZXJ0eVZhbHVlKGAtLW11dGVkLWZvcmVncm91bmRgKS50cmltKCksbi52YWx1ZT1yLmdldFByb3BlcnR5VmFsdWUoYC0tYm9yZGVyYCkudHJpbSgpfWxldCBpO3JldHVybiBNZSgoKT0+e3IoKSxpPXdpbmRvdy5tYXRjaE1lZGlhKGAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspYCksaS5hZGRFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSksSWUoKCk9PntpPy5yZW1vdmVFdmVudExpc3RlbmVyKGBjaGFuZ2VgLHIpfSkse2ZvcmVncm91bmQ6ZSxtdXRlZEZvcmVncm91bmQ6dCxib3JkZXI6bn19dmFyIFNwPXtjb3N0OmBDb3N0YCxyZXE6YFJlcXVlc3RzYCx0b2tpbjpgVG9rZW5zIGluYCx0b2tvdXQ6YFRva2VucyBvdXRgfSxDcD0yMCx3cD0xMDAsVHA9M2U0LEVwPXtob3VyOjI0LGRheTozMCxtb250aDoxMn0sRHA9e2hvdXI6YDI0aGAsZGF5OmAzMGRgLG1vbnRoOmAxMm1vYH07ZnVuY3Rpb24gT3AoZSl7c3dpdGNoKGUpe2Nhc2VgcmVxdWVzdHNgOnJldHVybltgcmVxYF07Y2FzZWB0b2tlbnNgOnJldHVybltgdG9raW5gLGB0b2tvdXRgXTtjYXNlYGNvc3RgOnJldHVybltgY29zdGBdO2Nhc2VgbW9kZWxzYDpyZXR1cm5bXX19dmFyIGtwPWRlKGBoaXN0b3J5YCx7c3RhdGU6KCk9Pih7c2NvcGU6YHRvdGFsYCx3aW5kb3c6YGhvdXJgLHRhYjpgcmVxdWVzdHNgLG1vZGVsTWV0cmljOmBjb3N0YCxzZXJpZXNCeU1ldHJpYzp7fSxtb2RlbFJhbmtpbmc6W10sbW9kZWxPcHRpb25zOltdLGxvYWRpbmc6ITEsZXJyb3I6YGAsdGltZXI6dm9pZCAwfSksYWN0aW9uczp7c2V0U2NvcGUoZSl7ZSE9PXRoaXMuc2NvcGUmJih0aGlzLnNjb3BlPWUsdGhpcy5yZWZyZXNoKCkpfSxzZXRXaW5kb3coZSl7ZSE9PXRoaXMud2luZG93JiYodGhpcy53aW5kb3c9ZSx0aGlzLnJlZnJlc2goKSl9LHNldFRhYihlKXtlIT09dGhpcy50YWImJih0aGlzLnRhYj1lLHRoaXMucmVmcmVzaCgpKX0sc2V0TW9kZWxNZXRyaWMoZSl7ZSE9PXRoaXMubW9kZWxNZXRyaWMmJih0aGlzLm1vZGVsTWV0cmljPWUsdGhpcy5yZWZyZXNoKCkpfSxhc3luYyByZWZyZXNoKCl7YXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMudGFiPT09YG1vZGVsc2A/dGhpcy5mZXRjaE1vZGVsUmFua2luZygpOnRoaXMuZmV0Y2hTZXJpZXMoKSx0aGlzLmZldGNoTW9kZWxPcHRpb25zKCldKX0sYXN5bmMgZmV0Y2hTZXJpZXMoKXtpZihqZSgpLmlzQXV0aGVudGljYXRlZCl7dGhpcy5sb2FkaW5nPSEwO3RyeXtsZXQgZT1FcFt0aGlzLndpbmRvd10sdD1PcCh0aGlzLnRhYiksbj1hd2FpdCBQcm9taXNlLmFsbCh0Lm1hcCh0PT5GZShgL2FkbWluL2FwaS91c2FnZS9oaXN0b3J5P3Njb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2NvcGUpfSZtZXRyaWM9JHt0fSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mc3Bhbj0ke2V9YCkpKSxyPXt9O3QuZm9yRWFjaCgoZSx0KT0+e3JbZV09blt0XS5wb2ludHN9KSx0aGlzLnNlcmllc0J5TWV0cmljPXIsdGhpcy5lcnJvcj1gYH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgYmUmJihlLnN0YXR1cz09PTQwMXx8ZS5zdGF0dXM9PT00MDMpKXJldHVybjt0aGlzLmVycm9yPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWZpbmFsbHl7dGhpcy5sb2FkaW5nPSExfX19LGFzeW5jIGZldGNoTW9kZWxSYW5raW5nKCl7aWYoamUoKS5pc0F1dGhlbnRpY2F0ZWQpe3RoaXMubG9hZGluZz0hMDt0cnl7bGV0IGU9YXdhaXQgRmUoYC9hZG1pbi9hcGkvdXNhZ2UvbW9kZWxzP21ldHJpYz0ke3RoaXMubW9kZWxNZXRyaWN9JndpbmRvdz0ke3RoaXMud2luZG93fSZsaW1pdD0ke0NwfWApO3RoaXMubW9kZWxSYW5raW5nPWUubW9kZWxzLHRoaXMuZXJyb3I9YGB9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGJlJiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSlyZXR1cm47dGhpcy5lcnJvcj1lIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1maW5hbGx5e3RoaXMubG9hZGluZz0hMX19fSxhc3luYyBmZXRjaE1vZGVsT3B0aW9ucygpe2lmKGplKCkuaXNBdXRoZW50aWNhdGVkKXRyeXtsZXQgZT1hd2FpdCBGZShgL2FkbWluL2FwaS91c2FnZS9tb2RlbHM/bWV0cmljPXJlcSZ3aW5kb3c9JHt0aGlzLndpbmRvd30mbGltaXQ9JHt3cH1gKTt0aGlzLm1vZGVsT3B0aW9ucz1lLm1vZGVsc31jYXRjaHt9fSxzdGFydEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lcj09PXZvaWQgMCYmKHRoaXMudGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgdGhpcy5yZWZyZXNoKCksVHApKX0sc3RvcEF1dG9SZWZyZXNoKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxBcD17a2V5OjAsY2xhc3M6YHB5LTggdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxqcD1SKHtfX25hbWU6YE1vZGVsVXNhZ2VDaGFydGAscHJvcHM6e21ldHJpYzp7fSxtb2RlbHM6e319LHNldHVwKGUpe2xldCB0PWUse2ZvcmVncm91bmQ6bixtdXRlZEZvcmVncm91bmQ6cixib3JkZXI6YX09eHAoKSxvPXtyZXE6YC0tY2hhcnQtcmVxdWVzdHNgLHRva2luOmAtLWNoYXJ0LXRva2Vucy1pbmAsdG9rb3V0OmAtLWNoYXJ0LXRva2Vucy1vdXRgLGNvc3Q6YC0tY2hhcnQtY29zdGB9O2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZT09PWBjb3N0YD90LzFlNjp0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGUpLnRyaW0oKX1sZXQgbD1NKCgpPT4obi52YWx1ZSx7bGFiZWxzOnQubW9kZWxzLm1hcChlPT5lLmlkKSxkYXRhc2V0czpbe2xhYmVsOlNwW3QubWV0cmljXSxiYWNrZ3JvdW5kQ29sb3I6YyhvW3QubWV0cmljXSksZGF0YTp0Lm1vZGVscy5tYXAoZT0+cyh0Lm1ldHJpYyxlLnZhbHVlKSl9XX0pKSx1PU0oKCk9PmAke01hdGgubWF4KDE4MCx0Lm1vZGVscy5sZW5ndGgqMjgrNjApfXB4YCksZD1NKCgpPT4oe2luZGV4QXhpczpgeWAscmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e2JlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmEudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQubWV0cmljPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19LHk6e2dyaWQ6e2Rpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGF1dG9Ta2lwOiExfX19LHBsdWdpbnM6e2xlZ2VuZDp7ZGlzcGxheTohMX0sdG9vbHRpcDp7Y2FsbGJhY2tzOntsYWJlbDplPT57bGV0IG49ZS5wYXJzZWQueD8/MDtyZXR1cm4gdC5tZXRyaWM9PT1gY29zdGA/YCR7U3BbdC5tZXRyaWNdfTogJCR7bi50b0ZpeGVkKDQpfWA6YCR7U3BbdC5tZXRyaWNdfTogJHtrZShuKX0gKCR7VWUobil9KWB9fX19fSkpO3JldHVybih0LG4pPT5lLm1vZGVscy5sZW5ndGg9PT0wPyhOKCksUChgcGAsQXAsYCBObyBtb2RlbCByZWNvcmRlZCBhbnkgdXNhZ2UgaW4gdGhpcyB3aW5kb3cuIGApKTooTigpLFAoYGRpdmAse2tleToxLGNsYXNzOmB3LWZ1bGxgLHN0eWxlOmkoe2hlaWdodDp1LnZhbHVlfSl9LFtMKGIoYnApLHtkYXRhOmwudmFsdWUsb3B0aW9uczpkLnZhbHVlfSxudWxsLDgsW2BkYXRhYCxgb3B0aW9uc2BdKV0sNCkpfX0pLE1wPXtjbGFzczpgaC03MiB3LWZ1bGxgfSxOcD1SKHtfX25hbWU6YFVzYWdlQ2hhcnRgLHByb3BzOnt0YWI6e30sd2luZG93Ont9LHNlcmllc0J5TWV0cmljOnt9fSxzZXR1cChlKXtsZXQgdD1lLHtmb3JlZ3JvdW5kOm4sbXV0ZWRGb3JlZ3JvdW5kOnIsYm9yZGVyOml9PXhwKCksYT17cmVxdWVzdHM6W3ttZXRyaWM6YHJlcWAsbGFiZWw6YFJlcXVlc3RzYCxjb2xvcjpgLS1jaGFydC1yZXF1ZXN0c2B9XSx0b2tlbnM6W3ttZXRyaWM6YHRva2luYCxsYWJlbDpgVG9rZW5zIGluYCxjb2xvcjpgLS1jaGFydC10b2tlbnMtaW5gfSx7bWV0cmljOmB0b2tvdXRgLGxhYmVsOmBUb2tlbnMgb3V0YCxjb2xvcjpgLS1jaGFydC10b2tlbnMtb3V0YH1dLGNvc3Q6W3ttZXRyaWM6YGNvc3RgLGxhYmVsOmBDb3N0IChVU0QpYCxjb2xvcjpgLS1jaGFydC1jb3N0YH1dfTtmdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGU9PT1gY29zdGA/dC8xZTY6dH1sZXQgcz1NKCgpPT57bGV0IGU9YVt0LnRhYl0sbj1uZXcgU2V0O2ZvcihsZXQgciBvZiBlKWZvcihsZXQgZSBvZiB0LnNlcmllc0J5TWV0cmljW3IubWV0cmljXT8/W10pbi5hZGQoZS5idWNrZXQpO3JldHVybiBBcnJheS5mcm9tKG4pLnNvcnQoKX0pLGM9TSgoKT0+cy52YWx1ZS5tYXAoZT0+X2UoZSx0LndpbmRvdykpKTtmdW5jdGlvbiBsKGUpe3JldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShlKS50cmltKCl9bGV0IHU9TSgoKT0+e24udmFsdWU7bGV0IGU9cy52YWx1ZTtyZXR1cm57bGFiZWxzOmMudmFsdWUsZGF0YXNldHM6YVt0LnRhYl0ubWFwKG49PntsZXQgcj1uZXcgTWFwKCh0LnNlcmllc0J5TWV0cmljW24ubWV0cmljXT8/W10pLm1hcChlPT5bZS5idWNrZXQsZS52YWx1ZV0pKTtyZXR1cm57bGFiZWw6bi5sYWJlbCxiYWNrZ3JvdW5kQ29sb3I6bChuLmNvbG9yKSxkYXRhOmUubWFwKGU9Pm8obi5tZXRyaWMsci5nZXQoZSk/PzApKX19KX19KSxkPU0oKCk9PmFbdC50YWJdLmxlbmd0aD4xKSxmPU0oKCk9Pih7cmVzcG9uc2l2ZTohMCxtYWludGFpbkFzcGVjdFJhdGlvOiExLGFuaW1hdGlvbjohMSxzY2FsZXM6e3g6e3N0YWNrZWQ6ZC52YWx1ZSxncmlkOntjb2xvcjppLnZhbHVlLGRpc3BsYXk6ITF9LHRpY2tzOntjb2xvcjpyLnZhbHVlfX0seTp7c3RhY2tlZDpkLnZhbHVlLGJlZ2luQXRaZXJvOiEwLGdyaWQ6e2NvbG9yOmkudmFsdWV9LHRpY2tzOntjb2xvcjpyLnZhbHVlLGNhbGxiYWNrOmU9PnQudGFiPT09YGNvc3RgP2AkJHtlfWA6a2UoTnVtYmVyKGUpKX19fSxwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZC52YWx1ZSxsYWJlbHM6e2NvbG9yOm4udmFsdWV9fSx0b29sdGlwOntjYWxsYmFja3M6e2xhYmVsOmU9PntsZXQgbj1lLnBhcnNlZC55Pz8wO3JldHVybiB0LnRhYj09PWBjb3N0YD9gJHtlLmRhdGFzZXQubGFiZWx9OiAkJHtuLnRvRml4ZWQoNCl9YDpgJHtlLmRhdGFzZXQubGFiZWx9OiAke2tlKG4pfSAoJHtVZShuKX0pYH19fX19KSk7cmV0dXJuKGUsdCk9PihOKCksUChgZGl2YCxNcCxbTChiKGJwKSx7ZGF0YTp1LnZhbHVlLG9wdGlvbnM6Zi52YWx1ZX0sbnVsbCw4LFtgZGF0YWAsYG9wdGlvbnNgXSldKSl9fSksUHA9e2NsYXNzOmBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNgfSxGcD17a2V5OjAsY2xhc3M6YHRleHQtc20gdGV4dC1kZXN0cnVjdGl2ZWB9LElwPXtjbGFzczpgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxMcD1SKHtfX25hbWU6YENoYXJ0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXllKCksbj1rcCgpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT1QZSgpLG89TSgoKT0+e2xldCBlPXQudXNhZ2U/LnVzZXJzPz9bXSxyPXQudXNhZ2U/Lmdyb3Vwcz8/W10sbz1lLmZpbHRlcihlPT4hYS52YWx1ZXx8TmUoZSxpLnZhbHVlKXx8YHVzZXI6JHtlLmlkfWA9PT1uLnNjb3BlKS5tYXAoZT0+KHt2YWx1ZTpgdXNlcjoke2UuaWR9YCxsYWJlbDplLmlkfSkpLHM9ci5maWx0ZXIodD0+IWEudmFsdWV8fFZlKHQsZSxpLnZhbHVlKXx8YGdyb3VwOiR7dC5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YGdyb3VwOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSksYz0obi5tb2RlbE9wdGlvbnM/P1tdKS5maWx0ZXIoZT0+IWEudmFsdWV8fGUuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpLnZhbHVlKXx8YG1vZGVsOiR7ZS5pZH1gPT09bi5zY29wZSkubWFwKGU9Pih7dmFsdWU6YG1vZGVsOiR7ZS5pZH1gLGxhYmVsOmUuaWR9KSk7cmV0dXJuIG4uc2NvcGUuc3RhcnRzV2l0aChgbW9kZWw6YCkmJiFjLnNvbWUoZT0+ZS52YWx1ZT09PW4uc2NvcGUpJiZjLnB1c2goe3ZhbHVlOm4uc2NvcGUsbGFiZWw6bi5zY29wZS5zbGljZSg2KX0pLFt7dmFsdWU6YHRvdGFsYCxsYWJlbDpgVG90YWwgKGFsbCB0cmFmZmljKWB9LC4uLnMsLi4ubywuLi5jXX0pLHM9W2Bob3VyYCxgZGF5YCxgbW9udGhgXSxjPVtgY29zdGAsYHJlcWAsYHRva2luYCxgdG9rb3V0YF0sbD1NKCgpPT5uLnRhYj09PWBtb2RlbHNgP2ByZXF1ZXN0c2A6bi50YWIpO2Z1bmN0aW9uIHUoZSl7bi5zZXRUYWIoZSl9ZnVuY3Rpb24gZChlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0U2NvcGUoZSl9ZnVuY3Rpb24gZihlKXt0eXBlb2YgZT09YHN0cmluZ2AmJm4uc2V0TW9kZWxNZXRyaWMoZSl9cmV0dXJuIE1lKCgpPT57bi5yZWZyZXNoKCksbi5zdGFydEF1dG9SZWZyZXNoKCl9KSx3ZSgoKT0+e24uc3RvcEF1dG9SZWZyZXNoKCl9KSxWKG8sZT0+e2Uuc29tZShlPT5lLnZhbHVlPT09bi5zY29wZSl8fG4uc2V0U2NvcGUoYHRvdGFsYCl9KSwoZSx0KT0+KE4oKSxJKGIoR2UpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihTZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5gfSx7ZGVmYXVsdDpCKCgpPT5bTChiKENlKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsuLi50WzJdfHw9W2dlKGBVc2FnZSBjaGFydHNgLC0xKV1dKSxfOjF9KSxIZShgZGl2YCxQcCxbTChCZSx7bW9kZWxWYWx1ZTpiKHIpLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+RShyKT9yLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzLCBncm91cHMgb3IgbW9kZWxzYCxjbGFzczpgdy01NmB9LG51bGwsOCxbYG1vZGVsVmFsdWVgXSksYihuKS50YWI9PT1gbW9kZWxzYD8oTigpLEkoYihYaSkse2tleTowLCJtb2RlbC12YWx1ZSI6YihuKS5tb2RlbE1ldHJpYywib25VcGRhdGU6bW9kZWxWYWx1ZSI6Zn0se2RlZmF1bHQ6QigoKT0+W0woYihuYSkse2NsYXNzOmB3LTQwYCwiYXJpYS1sYWJlbCI6YFJhbmsgbW9kZWxzIGJ5YH0se2RlZmF1bHQ6QigoKT0+W0woYihyYSkse3BsYWNlaG9sZGVyOmBSYW5rIGJ5YH0pXSksXzoxfSksTChiKFppKSxudWxsLHtkZWZhdWx0OkIoKCk9PlsoTigpLFAoayxudWxsLG1lKGMsZT0+TChiKCRpKSx7a2V5OmUsdmFsdWU6ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGIoU3ApW2VdKSwxKV0pLF86Mn0sMTAzMixbYHZhbHVlYF0pKSw2NCkpXSksXzoxfSldKSxfOjF9LDgsW2Btb2RlbC12YWx1ZWBdKSk6KE4oKSxJKGIoWGkpLHtrZXk6MSwibW9kZWwtdmFsdWUiOmIobikuc2NvcGUsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmR9LHtkZWZhdWx0OkIoKCk9PltMKGIobmEpLHtjbGFzczpgdy01NmB9LHtkZWZhdWx0OkIoKCk9PltMKGIocmEpLHtwbGFjZWhvbGRlcjpgU2NvcGVgfSldKSxfOjF9KSxMKGIoWmkpLG51bGwse2RlZmF1bHQ6QigoKT0+WyhOKCEwKSxQKGssbnVsbCxtZShvLnZhbHVlLGU9PihOKCksSShiKCRpKSx7a2V5OmUudmFsdWUsdmFsdWU6ZS52YWx1ZX0se2RlZmF1bHQ6QigoKT0+W2dlKGNlKGUubGFiZWwpLDEpXSksXzoyfSwxMDMyLFtgdmFsdWVgXSkpKSwxMjgpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSkpLEwoYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS53aW5kb3csIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMV18fD1lPT5iKG4pLnNldFdpbmRvdyhlKX0se2RlZmF1bHQ6QigoKT0+W0woYihUZSksbnVsbCx7ZGVmYXVsdDpCKCgpPT5bKE4oKSxQKGssbnVsbCxtZShzLGU9PkwoYihSZSkse2tleTplLHZhbHVlOmV9LHtkZWZhdWx0OkIoKCk9PltnZShjZShiKERwKVtlXSksMSldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSksNjQpKV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWwtdmFsdWVgXSldKV0pLF86MX0pLEwoYihwZSkse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC00YH0se2RlZmF1bHQ6QigoKT0+W0woYihoZSkseyJtb2RlbC12YWx1ZSI6YihuKS50YWIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnV9LHtkZWZhdWx0OkIoKCk9PltMKGIoVGUpLG51bGwse2RlZmF1bHQ6QigoKT0+W0woYihSZSkse3ZhbHVlOmByZXF1ZXN0c2B9LHtkZWZhdWx0OkIoKCk9PlsuLi50WzNdfHw9W2dlKGBSZXF1ZXN0c2AsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmB0b2tlbnNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs0XXx8PVtnZShgVG9rZW5zYCwtMSldXSksXzoxfSksTChiKFJlKSx7dmFsdWU6YGNvc3RgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs1XXx8PVtnZShgQ29zdGAsLTEpXV0pLF86MX0pLEwoYihSZSkse3ZhbHVlOmBtb2RlbHNgfSx7ZGVmYXVsdDpCKCgpPT5bLi4udFs2XXx8PVtnZShgTW9kZWxzYCwtMSldXSksXzoxfSldKSxfOjF9KV0pLF86MX0sOCxbYG1vZGVsLXZhbHVlYF0pLGIobikuZXJyb3I/KE4oKSxQKGBwYCxGcCxjZShiKG4pLmVycm9yKSwxKSk6emUoYGAsITApLGIobikudGFiPT09YG1vZGVsc2A/KE4oKSxQKGsse2tleToxfSxbSGUoYHBgLElwLGAgTW9kZWxzIHdpdGggdXNhZ2UgaW4gdGhlIHNlbGVjdGVkIHdpbmRvdywgcmFua2VkIGJ5IGArY2UoYihTcClbYihuKS5tb2RlbE1ldHJpY10udG9Mb3dlckNhc2UoKSkrYC4gRWFjaCByb3cgaXMgdGhlIHByb3ZpZGVyIHRoYXQgc2VydmVkIHRoZSB0cmFmZmljLCBzbyBhIG1vZGVsIHJlYWNoZWQgdGhyb3VnaCBtb3JlIHRoYW4gb25lIHByb3ZpZGVyIGFwcGVhcnMgb25jZSBwZXIgcHJvdmlkZXIuIGAsMSksTChqcCx7bWV0cmljOmIobikubW9kZWxNZXRyaWMsbW9kZWxzOmIobikubW9kZWxSYW5raW5nfSxudWxsLDgsW2BtZXRyaWNgLGBtb2RlbHNgXSldLDY0KSk6KE4oKSxJKE5wLHtrZXk6Mix0YWI6bC52YWx1ZSx3aW5kb3c6YihuKS53aW5kb3csInNlcmllcy1ieS1tZXRyaWMiOmIobikuc2VyaWVzQnlNZXRyaWN9LG51bGwsOCxbYHRhYmAsYHdpbmRvd2AsYHNlcmllcy1ieS1tZXRyaWNgXSkpXSksXzoxfSldKSxfOjF9KSl9fSk7ZXhwb3J0e0xwIGFzIGRlZmF1bHR9Ow==", ), }, "index-CSkIItro.css": { @@ -52,10 +52,10 @@ var adminAssets = map[string]adminAsset{ "QGtleWZyYW1lcyBhdXRoZ2F0ZS1zaGFrZS00YmU2YmMwOXsxMCUsOTAle3RyYW5zZm9ybTp0cmFuc2xhdGUoLTFweCl9MjAlLDgwJXt0cmFuc2Zvcm06dHJhbnNsYXRlKDJweCl9MzAlLDUwJSw3MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNHB4KX00MCUsNjAle3RyYW5zZm9ybTp0cmFuc2xhdGUoNHB4KX19QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOm5vLXByZWZlcmVuY2Upey5hdXRoZ2F0ZS1zaGFrZVtkYXRhLXYtNGJlNmJjMDlde2FuaW1hdGlvbjouNHMgZWFzZS1pbi1vdXQgYXV0aGdhdGUtc2hha2UtNGJlNmJjMDl9fUBsYXllciBwcm9wZXJ0aWVze0BzdXBwb3J0cyAoKCgtd2Via2l0LWh5cGhlbnM6bm9uZSkpIGFuZCAobm90IChtYXJnaW4tdHJpbTppbmxpbmUpKSkgb3IgKCgtbW96LW9yaWVudDppbmxpbmUpIGFuZCAobm90IChjb2xvcjpyZ2IoZnJvbSByZWQgciBnIGIpKSkpezpyb290LDpob3N0ey0tc2hpbW1lci1hbmdsZToyMGRlZ30qLDpiZWZvcmUsOmFmdGVyLDo6YmFja2Ryb3B7LS10dy10cmFuc2xhdGUteDowOy0tdHctdHJhbnNsYXRlLXk6MDstLXR3LXRyYW5zbGF0ZS16OjA7LS10dy1yb3RhdGUteDppbml0aWFsOy0tdHctcm90YXRlLXk6aW5pdGlhbDstLXR3LXJvdGF0ZS16OmluaXRpYWw7LS10dy1za2V3LXg6aW5pdGlhbDstLXR3LXNrZXcteTppbml0aWFsOy0tdHctYm9yZGVyLXN0eWxlOnNvbGlkOy0tdHctbGVhZGluZzppbml0aWFsOy0tdHctZm9udC13ZWlnaHQ6aW5pdGlhbDstLXR3LXRyYWNraW5nOmluaXRpYWw7LS10dy1vcmRpbmFsOmluaXRpYWw7LS10dy1zbGFzaGVkLXplcm86aW5pdGlhbDstLXR3LW51bWVyaWMtZmlndXJlOmluaXRpYWw7LS10dy1udW1lcmljLXNwYWNpbmc6aW5pdGlhbDstLXR3LW51bWVyaWMtZnJhY3Rpb246aW5pdGlhbDstLXR3LXNoYWRvdzowIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3I6aW5pdGlhbDstLXR3LXNoYWRvdy1hbHBoYToxMDAlOy0tdHctaW5zZXQtc2hhZG93OjAgMCAjMDAwMDstLXR3LWluc2V0LXNoYWRvdy1jb2xvcjppbml0aWFsOy0tdHctaW5zZXQtc2hhZG93LWFscGhhOjEwMCU7LS10dy1yaW5nLWNvbG9yOmluaXRpYWw7LS10dy1yaW5nLXNoYWRvdzowIDAgIzAwMDA7LS10dy1pbnNldC1yaW5nLWNvbG9yOmluaXRpYWw7LS10dy1pbnNldC1yaW5nLXNoYWRvdzowIDAgIzAwMDA7LS10dy1yaW5nLWluc2V0OmluaXRpYWw7LS10dy1yaW5nLW9mZnNldC13aWR0aDowcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjojZmZmOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OjAgMCAjMDAwMDstLXR3LW91dGxpbmUtc3R5bGU6c29saWQ7LS10dy1ibHVyOmluaXRpYWw7LS10dy1icmlnaHRuZXNzOmluaXRpYWw7LS10dy1jb250cmFzdDppbml0aWFsOy0tdHctZ3JheXNjYWxlOmluaXRpYWw7LS10dy1odWUtcm90YXRlOmluaXRpYWw7LS10dy1pbnZlcnQ6aW5pdGlhbDstLXR3LW9wYWNpdHk6aW5pdGlhbDstLXR3LXNhdHVyYXRlOmluaXRpYWw7LS10dy1zZXBpYTppbml0aWFsOy0tdHctZHJvcC1zaGFkb3c6aW5pdGlhbDstLXR3LWRyb3Atc2hhZG93LWNvbG9yOmluaXRpYWw7LS10dy1kcm9wLXNoYWRvdy1hbHBoYToxMDAlOy0tdHctZHJvcC1zaGFkb3ctc2l6ZTppbml0aWFsOy0tdHctZHVyYXRpb246aW5pdGlhbDstLXR3LWNvbnRlbnQ6IiI7LS10dy1hbmltYXRpb24tZGVsYXk6MHM7LS10dy1hbmltYXRpb24tZGlyZWN0aW9uOm5vcm1hbDstLXR3LWFuaW1hdGlvbi1kdXJhdGlvbjppbml0aWFsOy0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZTpub25lOy0tdHctYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOy0tdHctZW50ZXItYmx1cjowOy0tdHctZW50ZXItb3BhY2l0eToxOy0tdHctZW50ZXItcm90YXRlOjA7LS10dy1lbnRlci1zY2FsZToxOy0tdHctZW50ZXItdHJhbnNsYXRlLXg6MDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OjA7LS10dy1leGl0LWJsdXI6MDstLXR3LWV4aXQtb3BhY2l0eToxOy0tdHctZXhpdC1yb3RhdGU6MDstLXR3LWV4aXQtc2NhbGU6MTstLXR3LWV4aXQtdHJhbnNsYXRlLXg6MDstLXR3LWV4aXQtdHJhbnNsYXRlLXk6MDstLXNjcm9sbC1mYWRlLXQ6MDstLXNjcm9sbC1mYWRlLWI6MDstLXNjcm9sbC1mYWRlLXM6MDstLXNjcm9sbC1mYWRlLWU6MDstLXNjcm9sbC1mYWRlLW1hc2s6aW5pdGlhbDstLXNoaW1tZXItaW1hZ2U6aW5pdGlhbDstLXNoaW1tZXItdGV4dC1maWxsOmluaXRpYWx9fX1AbGF5ZXIgdGhlbWV7OnJvb3QsOmhvc3R7LS1mb250LXNhbnM6dWktc2Fucy1zZXJpZiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCAiU2Vnb2UgVUkiLCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIEFyaWFsLCBzYW5zLXNlcmlmOy0tc3BhY2luZzouMjVyZW07LS1jb250YWluZXIteHM6MjByZW07LS1jb250YWluZXItc206MjRyZW07LS1jb250YWluZXItbWQ6MjhyZW07LS10ZXh0LXhzOi43NXJlbTstLXRleHQteHMtLWxpbmUtaGVpZ2h0OmNhbGMoMSAvIC43NSk7LS10ZXh0LXNtOi44NzVyZW07LS10ZXh0LXNtLS1saW5lLWhlaWdodDpjYWxjKDEuMjUgLyAuODc1KTstLXRleHQtYmFzZToxcmVtOy0tdGV4dC1iYXNlLS1saW5lLWhlaWdodDpjYWxjKDEuNSAvIDEpOy0tdGV4dC1sZzoxLjEyNXJlbTstLXRleHQtbGctLWxpbmUtaGVpZ2h0OmNhbGMoMS43NSAvIDEuMTI1KTstLXRleHQteGw6MS4yNXJlbTstLXRleHQteGwtLWxpbmUtaGVpZ2h0OmNhbGMoMS43NSAvIDEuMjUpOy0tZm9udC13ZWlnaHQtbm9ybWFsOjQwMDstLWZvbnQtd2VpZ2h0LW1lZGl1bTo1MDA7LS1mb250LXdlaWdodC1zZW1pYm9sZDo2MDA7LS10cmFja2luZy10aWdodDotLjAyNWVtOy0tbGVhZGluZy1zbnVnOjEuMzc1Oy0tcmFkaXVzLW1kOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCk7LS1yYWRpdXMtNHhsOjJyZW07LS1kZWZhdWx0LXRyYW5zaXRpb24tZHVyYXRpb246LjE1czstLWRlZmF1bHQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LCAwLCAuMiwgMSk7LS1kZWZhdWx0LWZvbnQtZmFtaWx5OnVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgIlNlZ29lIFVJIiwgUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBBcmlhbCwgc2Fucy1zZXJpZjstLWRlZmF1bHQtbW9uby1mb250LWZhbWlseTp1aS1tb25vc3BhY2UsICJTRiBNb25vIiwgIkNhc2NhZGlhIENvZGUiLCAiUm9ib3RvIE1vbm8iLCBDb25zb2xhcywgbW9ub3NwYWNlfX1AbGF5ZXIgYmFzZXsqLDphZnRlciw6YmVmb3JlLDo6YmFja2Ryb3B7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlcjowIHNvbGlkO21hcmdpbjowO3BhZGRpbmc6MH06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXI6MCBzb2xpZDttYXJnaW46MDtwYWRkaW5nOjB9aHRtbCw6aG9zdHstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTt0YWItc2l6ZTo0O2xpbmUtaGVpZ2h0OjEuNTtmb250LWZhbWlseTp2YXIoLS1kZWZhdWx0LWZvbnQtZmFtaWx5LC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCAiTm90byBTYW5zIiwgQXJpYWwsIHNhbnMtc2VyaWYsICJBcHBsZSBDb2xvciBFbW9qaSIsICJTZWdvZSBVSSBFbW9qaSIsICJTZWdvZSBVSSBTeW1ib2wiLCAiTm90byBDb2xvciBFbW9qaSIpO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczp2YXIoLS1kZWZhdWx0LWZvbnQtZmVhdHVyZS1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOnZhcigtLWRlZmF1bHQtZm9udC12YXJpYXRpb24tc2V0dGluZ3Msbm9ybWFsKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246aW5oZXJpdDstd2Via2l0LXRleHQtZGVjb3JhdGlvbjppbmhlcml0Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcCxwcmV7Zm9udC1mYW1pbHk6dmFyKC0tZGVmYXVsdC1tb25vLWZvbnQtZmFtaWx5LHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlKTtmb250LWZlYXR1cmUtc2V0dGluZ3M6dmFyKC0tZGVmYXVsdC1tb25vLWZvbnQtZmVhdHVyZS1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOnZhcigtLWRlZmF1bHQtbW9uby1mb250LXZhcmlhdGlvbi1zZXR0aW5ncyxub3JtYWwpO2ZvbnQtc2l6ZToxZW19c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZX1zdWJ7Ym90dG9tOi0uMjVlbX1zdXB7dG9wOi0uNWVtfXRhYmxle3RleHQtaW5kZW50OjA7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfTotbW96LWZvY3VzcmluZzp3aGVyZSg6bm90KGlmcmFtZSkpe291dGxpbmU6YXV0b31wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lfWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7dmVydGljYWwtYWxpZ246bWlkZGxlO2Rpc3BsYXk6YmxvY2t9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfWJ1dHRvbixpbnB1dCxzZWxlY3Qsb3B0Z3JvdXAsdGV4dGFyZWF7Zm9udDppbmhlcml0O2ZvbnQtZmVhdHVyZS1zZXR0aW5nczppbmhlcml0O2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOmluaGVyaXQ7bGV0dGVyLXNwYWNpbmc6aW5oZXJpdDtjb2xvcjppbmhlcml0O29wYWNpdHk6MTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwO2JvcmRlci1yYWRpdXM6MH06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQ6aW5oZXJpdDtmb250LWZlYXR1cmUtc2V0dGluZ3M6aW5oZXJpdDtmb250LXZhcmlhdGlvbi1zZXR0aW5nczppbmhlcml0O2xldHRlci1zcGFjaW5nOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtvcGFjaXR5OjE7YmFja2dyb3VuZC1jb2xvcjojMDAwMDtib3JkZXItcmFkaXVzOjB9OndoZXJlKHNlbGVjdDppcyhbbXVsdGlwbGVdLFtzaXplXSkpIG9wdGdyb3Vwe2ZvbnQtd2VpZ2h0OmJvbGRlcn06d2hlcmUoc2VsZWN0OmlzKFttdWx0aXBsZV0sW3NpemVdKSkgb3B0Z3JvdXAgb3B0aW9ue3BhZGRpbmctaW5saW5lLXN0YXJ0OjIwcHh9OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbnttYXJnaW4taW5saW5lLWVuZDo0cHh9OjpwbGFjZWhvbGRlcntvcGFjaXR5OjF9QHN1cHBvcnRzIChub3QgKCgtd2Via2l0LWFwcGVhcmFuY2U6LWFwcGxlLXBheS1idXR0b24pKSkgb3IgKGNvbnRhaW4taW50cmluc2ljLXNpemU6MXB4KXs6OnBsYWNlaG9sZGVye2NvbG9yOmN1cnJlbnRDb2xvcn1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7OjpwbGFjZWhvbGRlcntjb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIGN1cnJlbnRjb2xvciA1MCUsIHRyYW5zcGFyZW50KX19fXRleHRhcmVhe3Jlc2l6ZTp2ZXJ0aWNhbH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWRhdGUtYW5kLXRpbWUtdmFsdWV7bWluLWhlaWdodDoxbGg7dGV4dC1hbGlnbjppbmhlcml0fTo6LXdlYmtpdC1kYXRldGltZS1lZGl0e2Rpc3BsYXk6aW5saW5lLWZsZXh9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtZmllbGRzLXdyYXBwZXJ7cGFkZGluZzowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0e3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC15ZWFyLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1tb250aC1maWVsZHtwYWRkaW5nLWJsb2NrOjB9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtZGF5LWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1ob3VyLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1taW51dGUtZmllbGR7cGFkZGluZy1ibG9jazowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0LXNlY29uZC1maWVsZHtwYWRkaW5nLWJsb2NrOjB9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtbWlsbGlzZWNvbmQtZmllbGR7cGFkZGluZy1ibG9jazowfTo6LXdlYmtpdC1kYXRldGltZS1lZGl0LW1lcmlkaWVtLWZpZWxke3BhZGRpbmctYmxvY2s6MH06Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcntsaW5lLWhlaWdodDoxfTotbW96LXVpLWludmFsaWR7Ym94LXNoYWRvdzpub25lfWJ1dHRvbixpbnB1dDp3aGVyZShbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdKXthcHBlYXJhbmNlOmJ1dHRvbn06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2FwcGVhcmFuY2U6YnV0dG9ufTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b306Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W2hpZGRlbl06d2hlcmUoOm5vdChbaGlkZGVuPXVudGlsLWZvdW5kXSkpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9Kntib3JkZXItY29sb3I6dmFyKC0tYm9yZGVyKTtvdXRsaW5lLWNvbG9yOnZhcigtLXJpbmcpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsqe291dGxpbmUtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1yaW5nKSA1MCUsIHRyYW5zcGFyZW50KX19Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhY2tncm91bmQpO2NvbG9yOnZhcigtLWZvcmVncm91bmQpO2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtcztmb250LWZhbWlseTp1aS1zYW5zLXNlcmlmLHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxIZWx2ZXRpY2EgTmV1ZSxBcmlhbCxzYW5zLXNlcmlmfX1AbGF5ZXIgY29tcG9uZW50cztAbGF5ZXIgdXRpbGl0aWVzey5cQGNvbnRhaW5lclwvY2FyZC1oZWFkZXJ7Y29udGFpbmVyOmNhcmQtaGVhZGVyL2lubGluZS1zaXplfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmNvbGxhcHNle3Zpc2liaWxpdHk6Y29sbGFwc2V9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LnNyLW9ubHl7Y2xpcC1wYXRoOmluc2V0KDUwJSk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW59LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5maXhlZHtwb3NpdGlvbjpmaXhlZH0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LnRvcC0xXC8ye3RvcDo1MCV9LnRvcC0ye3RvcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9LnJpZ2h0LTF7cmlnaHQ6dmFyKC0tc3BhY2luZyl9LnJpZ2h0LTFcLjV7cmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEuNSl9LnJpZ2h0LTJ7cmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5sZWZ0LTJcLjV7bGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0uei0xMHt6LWluZGV4OjEwfS56LTUwe3otaW5kZXg6NTB9LmNvbC1zdGFydC0ye2dyaWQtY29sdW1uLXN0YXJ0OjJ9LnJvdy1zcGFuLTJ7Z3JpZC1yb3c6c3BhbiAyL3NwYW4gMn0ucm93LXN0YXJ0LTF7Z3JpZC1yb3ctc3RhcnQ6MX0uLW14LTF7bWFyZ2luLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpfS4tbXgtMVwuNXttYXJnaW4taW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAtMS41KX0ubXgtYXV0b3ttYXJnaW4taW5saW5lOmF1dG99Lm15LTF7bWFyZ2luLWJsb2NrOnZhcigtLXNwYWNpbmcpfS5tdC0wXC41e21hcmdpbi10b3A6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KX0ubXQtMnttYXJnaW4tdG9wOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ubXQtNHttYXJnaW4tdG9wOmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0ubWItMVwuNXttYXJnaW4tYm90dG9tOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5tYi0ze21hcmdpbi1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mbGV4e2Rpc3BsYXk6ZmxleH0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0udGFibGUtY2FwdGlvbntkaXNwbGF5OnRhYmxlLWNhcHRpb259LnRhYmxlLWNlbGx7ZGlzcGxheTp0YWJsZS1jZWxsfS50YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3d9LnNpemUtMlwuNXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnNpemUtM3t3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMyk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAzKX0uc2l6ZS0zXC41e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAzLjUpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMy41KX0uc2l6ZS00e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA0KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5zaXplLTV7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDUpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNSl9LnNpemUtNnt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNik7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA2KX0uc2l6ZS03e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA3KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5zaXplLTh7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LnNpemUtOXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogOSk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA5KX0uc2l6ZS0xMnt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMTIpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMTIpfS5oLTV7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA1KX0uaC02e2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNil9LmgtN3toZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5oLTh7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA4KX0uaC05e2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOSl9LmgtMTB7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxMCl9LmgtNzJ7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA3Mil9LmgtXFtjYWxjXCgxMDBcJS0xcHhcKVxde2hlaWdodDpjYWxjKDEwMCUgLSAxcHgpfS5oLXB4e2hlaWdodDoxcHh9Lm1heC1oLVwoLS1yZWthLXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHRcKXttYXgtaGVpZ2h0OnZhcigtLXJla2Etc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCl9Lm1pbi1oLVxbNzB2aFxde21pbi1oZWlnaHQ6NzB2aH0udy00MHt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNDApfS53LTU2e3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiA1Nil9LnctZml0e3dpZHRoOmZpdC1jb250ZW50fS53LWZ1bGx7d2lkdGg6MTAwJX0ubWF4LXctbWR7bWF4LXdpZHRoOnZhcigtLWNvbnRhaW5lci1tZCl9Lm1heC13LXNte21heC13aWR0aDp2YXIoLS1jb250YWluZXItc20pfS5tYXgtdy14c3ttYXgtd2lkdGg6dmFyKC0tY29udGFpbmVyLXhzKX0ubWluLXctMHttaW4td2lkdGg6MH0ubWluLXctMzZ7bWluLXdpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAzNil9LmZsZXgtMXtmbGV4OjF9LnNocmluay0we2ZsZXgtc2hyaW5rOjB9Lmdyb3d7ZmxleC1ncm93OjF9LmNhcHRpb24tYm90dG9te2NhcHRpb24tc2lkZTpib3R0b219Lm9yaWdpbi1cKC0tcmVrYS1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luXCl7dHJhbnNmb3JtLW9yaWdpbjp2YXIoLS1yZWthLXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pfS4tdHJhbnNsYXRlLXktMVwvMnstLXR3LXRyYW5zbGF0ZS15OmNhbGMoY2FsYygxIC8gMiAqIDEwMCUpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnZhcigtLXR3LXJvdGF0ZS14LCkgdmFyKC0tdHctcm90YXRlLXksKSB2YXIoLS10dy1yb3RhdGUteiwpIHZhcigtLXR3LXNrZXcteCwpIHZhcigtLXR3LXNrZXcteSwpfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLXBvaW50ZXJ7Y3Vyc29yOnBvaW50ZXJ9LnNjcm9sbC1teS0xe3Njcm9sbC1tYXJnaW4tYmxvY2s6dmFyKC0tc3BhY2luZyl9LmF1dG8tcm93cy1taW57Z3JpZC1hdXRvLXJvd3M6bWluLWNvbnRlbnR9LmdyaWQtY29scy0ye2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMixtaW5tYXgoMCwxZnIpKX0uZmxleC1jb2x7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LXdyYXB7ZmxleC13cmFwOndyYXB9Lml0ZW1zLWNlbnRlcnthbGlnbi1pdGVtczpjZW50ZXJ9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uanVzdGlmeS1jZW50ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uZ2FwLTBcLjV7Z2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAuNSl9LmdhcC0xe2dhcDp2YXIoLS1zcGFjaW5nKX0uZ2FwLTFcLjV7Z2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5nYXAtMntnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5nYXAtM3tnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5nYXAtNHtnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5nYXAtNntnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfS5nYXAteC0ze2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5nYXAteC00e2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5nYXAteC02e2NvbHVtbi1nYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfS5nYXAteS0xe3Jvdy1nYXA6dmFyKC0tc3BhY2luZyl9LmdhcC15LTFcLjV7cm93LWdhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMS41KX0uc2VsZi1zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnR9Lmp1c3RpZnktc2VsZi1lbmR7anVzdGlmeS1zZWxmOmZsZXgtZW5kfS50cnVuY2F0ZXt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LXgtYXV0b3tvdmVyZmxvdy14OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LWF1dG97b3ZlcmZsb3cteTphdXRvfS5yb3VuZGVke2JvcmRlci1yYWRpdXM6LjI1cmVtfS5yb3VuZGVkLTR4bHtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cy00eGwpfS5yb3VuZGVkLVxbbWluXCh2YXJcKC0tcmFkaXVzLW1kXClcLDEwcHhcKVxde2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEwcHgpfS5yb3VuZGVkLVxbbWluXCh2YXJcKC0tcmFkaXVzLW1kXClcLDEycHhcKVxde2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEycHgpfS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czoyMTQ3NDgzNjQ3cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC14bHtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCl9LnJvdW5kZWQtdC14bHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpICsgNHB4KX0ucm91bmRlZC1iLXhse2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpfS5ib3JkZXJ7Ym9yZGVyLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOjFweH0uYm9yZGVyLXR7Ym9yZGVyLXRvcC1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci10b3Atd2lkdGg6MXB4fS5ib3JkZXItYntib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ib3JkZXJ7Ym9yZGVyLWNvbG9yOnZhcigtLWJvcmRlcil9LmJvcmRlci1pbnB1dHtib3JkZXItY29sb3I6dmFyKC0taW5wdXQpfS5ib3JkZXItc3RhdHVzLXdhcm5cLzQwe2JvcmRlci1jb2xvcjp2YXIoLS1zdGF0dXMtd2Fybil9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5ib3JkZXItc3RhdHVzLXdhcm5cLzQwe2JvcmRlci1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXN0YXR1cy13YXJuKSA0MCUsIHRyYW5zcGFyZW50KX19LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6IzAwMDB9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1iYWNrZ3JvdW5kKX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tYm9yZGVyKX0uYmctY2FyZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNhcmQpfS5iZy1kZXN0cnVjdGl2ZVwvMTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5iZy1kZXN0cnVjdGl2ZVwvMTB7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSAxMCUsIHRyYW5zcGFyZW50KX19LmJnLW11dGVkLC5iZy1tdXRlZFwvNTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tdXRlZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5iZy1tdXRlZFwvNTB7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLW11dGVkKSA1MCUsIHRyYW5zcGFyZW50KX19LmJnLXBvcG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wb3BvdmVyKX0uYmctcHJpbWFyeSwuYmctcHJpbWFyeVwvMTB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wcmltYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmJnLXByaW1hcnlcLzEwe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1wcmltYXJ5KSAxMCUsIHRyYW5zcGFyZW50KX19LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXNlY29uZGFyeSl9LmJnLXRyYW5zcGFyZW50e2JhY2tncm91bmQtY29sb3I6IzAwMDB9LmJnLWNsaXAtcGFkZGluZ3tiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3h9LnAtMFwuNzV7cGFkZGluZzpjYWxjKHZhcigtLXNwYWNpbmcpICogLjc1KX0ucC0xe3BhZGRpbmc6dmFyKC0tc3BhY2luZyl9LnAtMntwYWRkaW5nOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ucC00e3BhZGRpbmc6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5weC0xXC41e3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5weC0ye3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0ucHgtMlwuNXtwYWRkaW5nLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0ucHgtM3twYWRkaW5nLWlubGluZTpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9LnB4LTR7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5weS0wXC41e3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KX0ucHktMXtwYWRkaW5nLWJsb2NrOnZhcigtLXNwYWNpbmcpfS5weS0ye3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5weS0yXC41e3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnB5LTR7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9LnB5LTZ7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogNil9LnB5LTh7cGFkZGluZy1ibG9jazpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LnB5LTEwe3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEwKX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wci0ye3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIpfS5wci04e3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS5wci0xMHtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxMCl9LnBiLTJcLjV7cGFkZGluZy1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDIuNSl9LnBsLTFcLjV7cGFkZGluZy1sZWZ0OmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5wbC0yXC41e3BhZGRpbmctbGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMi41KX0ucGwtOHtwYWRkaW5nLWxlZnQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS5hbGlnbi1taWRkbGV7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mb250LW1vbm97Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLFNGIE1vbm8sQ2FzY2FkaWEgQ29kZSxSb2JvdG8gTW9ubyxDb25zb2xhcyxtb25vc3BhY2V9LnRleHQtYmFzZXtmb250LXNpemU6dmFyKC0tdGV4dC1iYXNlKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtYmFzZS0tbGluZS1oZWlnaHQpKX0udGV4dC1sZ3tmb250LXNpemU6dmFyKC0tdGV4dC1sZyk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LWxnLS1saW5lLWhlaWdodCkpfS50ZXh0LXNte2ZvbnQtc2l6ZTp2YXIoLS10ZXh0LXNtKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtc20tLWxpbmUtaGVpZ2h0KSl9LnRleHQteGx7Zm9udC1zaXplOnZhcigtLXRleHQteGwpO2xpbmUtaGVpZ2h0OnZhcigtLXR3LWxlYWRpbmcsdmFyKC0tdGV4dC14bC0tbGluZS1oZWlnaHQpKX0udGV4dC14c3tmb250LXNpemU6dmFyKC0tdGV4dC14cyk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LXhzLS1saW5lLWhlaWdodCkpfS50ZXh0LVxbMFwuOHJlbVxde2ZvbnQtc2l6ZTouOHJlbX0ubGVhZGluZy1zbnVney0tdHctbGVhZGluZzp2YXIoLS1sZWFkaW5nLXNudWcpO2xpbmUtaGVpZ2h0OnZhcigtLWxlYWRpbmctc251Zyl9LmZvbnQtbWVkaXVtey0tdHctZm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbWVkaXVtKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1tZWRpdW0pfS5mb250LW5vcm1hbHstLXR3LWZvbnQtd2VpZ2h0OnZhcigtLWZvbnQtd2VpZ2h0LW5vcm1hbCk7Zm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbm9ybWFsKX0uZm9udC1zZW1pYm9sZHstLXR3LWZvbnQtd2VpZ2h0OnZhcigtLWZvbnQtd2VpZ2h0LXNlbWlib2xkKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1zZW1pYm9sZCl9LnRyYWNraW5nLXRpZ2h0ey0tdHctdHJhY2tpbmc6dmFyKC0tdHJhY2tpbmctdGlnaHQpO2xldHRlci1zcGFjaW5nOnZhcigtLXRyYWNraW5nLXRpZ2h0KX0udGV4dC1iYWxhbmNle3RleHQtd3JhcDpiYWxhbmNlfS5icmVhay1hbGx7d29yZC1icmVhazpicmVhay1hbGx9LndoaXRlc3BhY2Utbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0udGV4dC1jYXJkLWZvcmVncm91bmR7Y29sb3I6dmFyKC0tY2FyZC1mb3JlZ3JvdW5kKX0udGV4dC1jaGFydC1yZXF1ZXN0c3tjb2xvcjp2YXIoLS1jaGFydC1yZXF1ZXN0cyl9LnRleHQtZGVzdHJ1Y3RpdmV7Y29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfS50ZXh0LWZvcmVncm91bmQsLnRleHQtZm9yZWdyb3VuZFwvNjB7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey50ZXh0LWZvcmVncm91bmRcLzYwe2NvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZm9yZWdyb3VuZCkgNjAlLCB0cmFuc3BhcmVudCl9fS50ZXh0LW11dGVkLWZvcmVncm91bmQsLnRleHQtbXV0ZWQtZm9yZWdyb3VuZFwvNjB7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey50ZXh0LW11dGVkLWZvcmVncm91bmRcLzYwe2NvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkgNjAlLCB0cmFuc3BhcmVudCl9fS50ZXh0LXBvcG92ZXItZm9yZWdyb3VuZHtjb2xvcjp2YXIoLS1wb3BvdmVyLWZvcmVncm91bmQpfS50ZXh0LXByaW1hcnl7Y29sb3I6dmFyKC0tcHJpbWFyeSl9LnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5ke2NvbG9yOnZhcigtLXByaW1hcnktZm9yZWdyb3VuZCl9LnRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmR7Y29sb3I6dmFyKC0tc2Vjb25kYXJ5LWZvcmVncm91bmQpfS50ZXh0LXN0YXR1cy13YXJue2NvbG9yOnZhcigtLXN0YXR1cy13YXJuKX0ubG93ZXJjYXNle3RleHQtdHJhbnNmb3JtOmxvd2VyY2FzZX0udGFidWxhci1udW1zey0tdHctbnVtZXJpYy1zcGFjaW5nOnRhYnVsYXItbnVtcztmb250LXZhcmlhbnQtbnVtZXJpYzp2YXIoLS10dy1vcmRpbmFsLCkgdmFyKC0tdHctc2xhc2hlZC16ZXJvLCkgdmFyKC0tdHctbnVtZXJpYy1maWd1cmUsKSB2YXIoLS10dy1udW1lcmljLXNwYWNpbmcsKSB2YXIoLS10dy1udW1lcmljLWZyYWN0aW9uLCl9LnVuZGVybGluZS1vZmZzZXQtNHt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NHB4fS5zaGFkb3ctbWR7LS10dy1zaGFkb3c6MCA0cHggNnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yLCMwMDAwMDAxYSksIDAgMnB4IDRweCAtMnB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciwjMDAwMDAwMWEpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LnJpbmcsLnJpbmctMXstLXR3LXJpbmctc2hhZG93OnZhcigtLXR3LXJpbmctaW5zZXQsKSAwIDAgMCBjYWxjKDFweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcixjdXJyZW50Y29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LnJpbmctZm9yZWdyb3VuZFwvMTB7LS10dy1yaW5nLWNvbG9yOnZhcigtLWZvcmVncm91bmQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsucmluZy1mb3JlZ3JvdW5kXC8xMHstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mb3JlZ3JvdW5kKSAxMCUsIHRyYW5zcGFyZW50KX19Lm91dGxpbmUtaGlkZGVuey0tdHctb3V0bGluZS1zdHlsZTpub25lO291dGxpbmUtc3R5bGU6bm9uZX1AbWVkaWEgKGZvcmNlZC1jb2xvcnM6YWN0aXZlKXsub3V0bGluZS1oaWRkZW57b3V0bGluZS1vZmZzZXQ6MnB4O291dGxpbmU6MnB4IHNvbGlkICMwMDAwfX0ub3V0bGluZXtvdXRsaW5lLXN0eWxlOnZhcigtLXR3LW91dGxpbmUtc3R5bGUpO291dGxpbmUtd2lkdGg6MXB4fS5maWx0ZXJ7ZmlsdGVyOnZhcigtLXR3LWJsdXIsKSB2YXIoLS10dy1icmlnaHRuZXNzLCkgdmFyKC0tdHctY29udHJhc3QsKSB2YXIoLS10dy1ncmF5c2NhbGUsKSB2YXIoLS10dy1odWUtcm90YXRlLCkgdmFyKC0tdHctaW52ZXJ0LCkgdmFyKC0tdHctc2F0dXJhdGUsKSB2YXIoLS10dy1zZXBpYSwpIHZhcigtLXR3LWRyb3Atc2hhZG93LCl9LnRyYW5zaXRpb257dHJhbnNpdGlvbi1wcm9wZXJ0eTpjb2xvcixiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcixvdXRsaW5lLWNvbG9yLHRleHQtZGVjb3JhdGlvbi1jb2xvcixmaWxsLHN0cm9rZSwtLXR3LWdyYWRpZW50LWZyb20sLS10dy1ncmFkaWVudC12aWEsLS10dy1ncmFkaWVudC10byxvcGFjaXR5LGJveC1zaGFkb3csdHJhbnNmb3JtLHRyYW5zbGF0ZSxzY2FsZSxyb3RhdGUsZmlsdGVyLC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyLGJhY2tkcm9wLWZpbHRlcixkaXNwbGF5LGNvbnRlbnQtdmlzaWJpbGl0eSxvdmVybGF5LHBvaW50ZXItZXZlbnRzO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLXR3LWVhc2UsdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikpO3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tdHctZHVyYXRpb24sdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLWR1cmF0aW9uKSl9LnRyYW5zaXRpb24tYWxse3RyYW5zaXRpb24tcHJvcGVydHk6YWxsO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLXR3LWVhc2UsdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikpO3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tdHctZHVyYXRpb24sdmFyKC0tZGVmYXVsdC10cmFuc2l0aW9uLWR1cmF0aW9uKSl9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3Isb3V0bGluZS1jb2xvcix0ZXh0LWRlY29yYXRpb24tY29sb3IsZmlsbCxzdHJva2UsLS10dy1ncmFkaWVudC1mcm9tLC0tdHctZ3JhZGllbnQtdmlhLC0tdHctZ3JhZGllbnQtdG87dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246dmFyKC0tdHctZWFzZSx2YXIoLS1kZWZhdWx0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKSk7dHJhbnNpdGlvbi1kdXJhdGlvbjp2YXIoLS10dy1kdXJhdGlvbix2YXIoLS1kZWZhdWx0LXRyYW5zaXRpb24tZHVyYXRpb24pKX0uZHVyYXRpb24tMTAwey0tdHctZHVyYXRpb246LjFzO3RyYW5zaXRpb24tZHVyYXRpb246LjFzfS5vdXRsaW5lLW5vbmV7LS10dy1vdXRsaW5lLXN0eWxlOm5vbmU7b3V0bGluZS1zdHlsZTpub25lfS5zZWxlY3Qtbm9uZXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uc2VsZWN0LXRleHR7LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHR9LnJ1bm5pbmd7YW5pbWF0aW9uLXBsYXktc3RhdGU6cnVubmluZ30ubm90LWxhc3RcOmJvcmRlci1iOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ncm91cC1oYXMtXFtcPnN2Z1xdXC9hbGVydFw6Y29sLXN0YXJ0LTI6aXMoOndoZXJlKC5ncm91cFwvYWxlcnQpOmhhcyg+c3ZnKSAqKXtncmlkLWNvbHVtbi1zdGFydDoyfS5ncm91cC1hcmlhLWV4cGFuZGVkXC9hY2NvcmRpb24tdHJpZ2dlclw6aGlkZGVuOmlzKDp3aGVyZSguZ3JvdXBcL2FjY29yZGlvbi10cmlnZ2VyKVthcmlhLWV4cGFuZGVkPXRydWVdICope2Rpc3BsYXk6bm9uZX0uZ3JvdXAtYXJpYS1leHBhbmRlZFwvYWNjb3JkaW9uLXRyaWdnZXJcOmlubGluZTppcyg6d2hlcmUoLmdyb3VwXC9hY2NvcmRpb24tdHJpZ2dlcilbYXJpYS1leHBhbmRlZD10cnVlXSAqKXtkaXNwbGF5OmlubGluZX0uZ3JvdXAtZGF0YS1cW3NpemVcPXNtXF1cL2NhcmRcOnAtMzppcyg6d2hlcmUoLmdyb3VwXC9jYXJkKVtkYXRhLXNpemU9c21dICope3BhZGRpbmc6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5ncm91cC1kYXRhLVxbc2l6ZVw9c21cXVwvY2FyZFw6cHgtMzppcyg6d2hlcmUoLmdyb3VwXC9jYXJkKVtkYXRhLXNpemU9c21dICope3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiAzKX0uZ3JvdXAtZGF0YS1cW3NpemVcPXNtXF1cL2NhcmRcOnRleHQtc206aXMoOndoZXJlKC5ncm91cFwvY2FyZClbZGF0YS1zaXplPXNtXSAqKXtmb250LXNpemU6dmFyKC0tdGV4dC1zbSk7bGluZS1oZWlnaHQ6dmFyKC0tdHctbGVhZGluZyx2YXIoLS10ZXh0LXNtLS1saW5lLWhlaWdodCkpfS5ncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICope2JhY2tncm91bmQtY29sb3I6IzAwMDB9Lmdyb3VwLWRhdGEtaG9yaXpvbnRhbFwvdGFic1w6aC04OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKSAqKXtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDgpfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDpoLWZpdDppcyg6d2hlcmUoLmdyb3VwXC90YWJzKTp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pICope2hlaWdodDpmaXQtY29udGVudH0uZ3JvdXAtZGF0YS12ZXJ0aWNhbFwvdGFic1w6dy1mdWxsOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgKil7d2lkdGg6MTAwJX0uZ3JvdXAtZGF0YS12ZXJ0aWNhbFwvdGFic1w6ZmxleC1jb2w6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lmdyb3VwLWRhdGEtdmVydGljYWxcL3RhYnNcOmp1c3RpZnktc3RhcnQ6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uZmlsZVw6aW5saW5lLWZsZXg6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXh9LmZpbGVcOmgtNjo6ZmlsZS1zZWxlY3Rvci1idXR0b257aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA2KX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci1zdHlsZTp2YXIoLS10dy1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDowfS5maWxlXDpiZy10cmFuc3BhcmVudDo6ZmlsZS1zZWxlY3Rvci1idXR0b257YmFja2dyb3VuZC1jb2xvcjojMDAwMH0uZmlsZVw6dGV4dC1zbTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC1zaXplOnZhcigtLXRleHQtc20pO2xpbmUtaGVpZ2h0OnZhcigtLXR3LWxlYWRpbmcsdmFyKC0tdGV4dC1zbS0tbGluZS1oZWlnaHQpKX0uZmlsZVw6Zm9udC1tZWRpdW06OmZpbGUtc2VsZWN0b3ItYnV0dG9uey0tdHctZm9udC13ZWlnaHQ6dmFyKC0tZm9udC13ZWlnaHQtbWVkaXVtKTtmb250LXdlaWdodDp2YXIoLS1mb250LXdlaWdodC1tZWRpdW0pfS5maWxlXDp0ZXh0LWZvcmVncm91bmQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2NvbG9yOnZhcigtLWZvcmVncm91bmQpfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjpwbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKX0uYWZ0ZXJcOmFic29sdXRlOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7cG9zaXRpb246YWJzb2x1dGV9LmFmdGVyXDpiZy1mb3JlZ3JvdW5kOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mb3JlZ3JvdW5kKX0uYWZ0ZXJcOm9wYWNpdHktMDphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO29wYWNpdHk6MH0uYWZ0ZXJcOnRyYW5zaXRpb24tb3BhY2l0eTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjp2YXIoLS10dy1lYXNlLHZhcigtLWRlZmF1bHQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24pKTt0cmFuc2l0aW9uLWR1cmF0aW9uOnZhcigtLXR3LWR1cmF0aW9uLHZhcigtLWRlZmF1bHQtdHJhbnNpdGlvbi1kdXJhdGlvbikpfS5ncm91cC1kYXRhLWhvcml6b250YWxcL3RhYnNcOmFmdGVyXDppbnNldC14LTA6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pICopOmFmdGVye2NvbnRlbnQ6dmFyKC0tdHctY29udGVudCk7aW5zZXQtaW5saW5lOjB9Lmdyb3VwLWRhdGEtaG9yaXpvbnRhbFwvdGFic1w6YWZ0ZXJcOmJvdHRvbS1cWy01cHhcXTppcyg6d2hlcmUoLmdyb3VwXC90YWJzKTp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSkgKik6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtib3R0b206LTVweH0uZ3JvdXAtZGF0YS1ob3Jpem9udGFsXC90YWJzXDphZnRlclw6aC0wXC41OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogLjUpfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDphZnRlclw6aW5zZXQteS0wOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMpOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgKik6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtpbnNldC1ibG9jazowfS5ncm91cC1kYXRhLXZlcnRpY2FsXC90YWJzXDphZnRlclw6LXJpZ2h0LTE6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3JpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAtMSl9Lmdyb3VwLWRhdGEtdmVydGljYWxcL3RhYnNcOmFmdGVyXDp3LTBcLjU6aXMoOndoZXJlKC5ncm91cFwvdGFicyk6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAqKTphZnRlcntjb250ZW50OnZhcigtLXR3LWNvbnRlbnQpO3dpZHRoOmNhbGModmFyKC0tc3BhY2luZykgKiAuNSl9QG1lZGlhIChob3Zlcjpob3Zlcil7LmhvdmVyXDpiZy1hY2NlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1hY2NlbnQpfS5ob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzIwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLWRlc3RydWN0aXZlXC8yMDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDIwJSwgdHJhbnNwYXJlbnQpfX0uaG92ZXJcOmJnLW11dGVkOmhvdmVyLC5ob3Zlclw6YmctbXV0ZWRcLzUwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbXV0ZWQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLW11dGVkXC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tbXV0ZWQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zZWNvbmRhcnkpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXNlY29uZGFyeSkgODAlLCB0cmFuc3BhcmVudCl9fS5ob3Zlclw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpob3Zlcntjb2xvcjp2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCl9LmhvdmVyXDp0ZXh0LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9LmhvdmVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9LmhvdmVyXDp1bmRlcmxpbmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWFjY2VudCl9LmZvY3VzXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmZvY3VzLDppcygubm90LWRhdGEtXFt2YXJpYW50XD1kZXN0cnVjdGl2ZVxdXDpmb2N1c1w6XCpcKlw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpub3QoW2RhdGEtdmFyaWFudD1kZXN0cnVjdGl2ZV0pOmZvY3VzICope2NvbG9yOnZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKX0uZm9jdXMtdmlzaWJsZVw6Ym9yZGVyLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxle2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5mb2N1cy12aXNpYmxlXDpib3JkZXItZGVzdHJ1Y3RpdmVcLzQwOmZvY3VzLXZpc2libGV7Ym9yZGVyLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDQwJSwgdHJhbnNwYXJlbnQpfX0uZm9jdXMtdmlzaWJsZVw6Ym9yZGVyLXJpbmc6Zm9jdXMtdmlzaWJsZXtib3JkZXItY29sb3I6dmFyKC0tcmluZyl9LmZvY3VzLXZpc2libGVcOnJpbmctMzpmb2N1cy12aXNpYmxley0tdHctcmluZy1zaGFkb3c6dmFyKC0tdHctcmluZy1pbnNldCwpIDAgMCAwIGNhbGMoM3B4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yLGN1cnJlbnRjb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1pbnNldC1zaGFkb3cpLCB2YXIoLS10dy1pbnNldC1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93KX0uZm9jdXMtdmlzaWJsZVw6cmluZy1kZXN0cnVjdGl2ZVwvMjA6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZm9jdXMtdmlzaWJsZVw6cmluZy1kZXN0cnVjdGl2ZVwvMjA6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMjAlLCB0cmFuc3BhcmVudCl9fS5mb2N1cy12aXNpYmxlXDpyaW5nLXJpbmdcLzUwOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOnZhcigtLXJpbmcpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nXC81MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXJpbmcpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS0xOmZvY3VzLXZpc2libGV7b3V0bGluZS1zdHlsZTp2YXIoLS10dy1vdXRsaW5lLXN0eWxlKTtvdXRsaW5lLXdpZHRoOjFweH0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS1yaW5nOmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjp2YXIoLS1yaW5nKX0uZm9jdXMtdmlzaWJsZVw6YWZ0ZXJcOmJvcmRlci1yaW5nOmZvY3VzLXZpc2libGU6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtib3JkZXItY29sb3I6dmFyKC0tcmluZyl9LmFjdGl2ZVw6bm90LWFyaWEtXFtoYXNwb3B1cFxdXDp0cmFuc2xhdGUteS1weDphY3RpdmU6bm90KFthcmlhLWhhc3BvcHVwXSl7LS10dy10cmFuc2xhdGUteToxcHg7dHJhbnNsYXRlOnZhcigtLXR3LXRyYW5zbGF0ZS14KSB2YXIoLS10dy10cmFuc2xhdGUteSl9LmRpc2FibGVkXDpwb2ludGVyLWV2ZW50cy1ub25lOmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9LmRpc2FibGVkXDpjdXJzb3Itbm90LWFsbG93ZWQ6ZGlzYWJsZWR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5kaXNhYmxlZFw6YmctaW5wdXRcLzUwOmRpc2FibGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGlzYWJsZWRcOmJnLWlucHV0XC81MDpkaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX06d2hlcmUoW2RhdGEtc2xvdD1idXR0b24tZ3JvdXBdKSAuaW4tZGF0YS1cW3Nsb3RcPWJ1dHRvbi1ncm91cFxdXDpyb3VuZGVkLWxne2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKX0uaGFzLWFyaWEtZXhwYW5kZWRcOmJnLW11dGVkXC81MDpoYXMoW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbXV0ZWQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuaGFzLWFyaWEtZXhwYW5kZWRcOmJnLW11dGVkXC81MDpoYXMoW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0pe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1tdXRlZCkgNTAlLCB0cmFuc3BhcmVudCl9fS5oYXMtZGF0YS1cW2ljb25cPWlubGluZS1lbmRcXVw6cHItMTpoYXMoW2RhdGEtaWNvbj1pbmxpbmUtZW5kXSl7cGFkZGluZy1yaWdodDp2YXIoLS1zcGFjaW5nKX0uaGFzLWRhdGEtXFtpY29uXD1pbmxpbmUtZW5kXF1cOnByLTFcLjU6aGFzKFtkYXRhLWljb249aW5saW5lLWVuZF0pe3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDEuNSl9Lmhhcy1kYXRhLVxbaWNvblw9aW5saW5lLWVuZFxdXDpwci0yOmhhcyhbZGF0YS1pY29uPWlubGluZS1lbmRdKXtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0uaGFzLWRhdGEtXFtpY29uXD1pbmxpbmUtc3RhcnRcXVw6cGwtMTpoYXMoW2RhdGEtaWNvbj1pbmxpbmUtc3RhcnRdKXtwYWRkaW5nLWxlZnQ6dmFyKC0tc3BhY2luZyl9Lmhhcy1kYXRhLVxbaWNvblw9aW5saW5lLXN0YXJ0XF1cOnBsLTFcLjU6aGFzKFtkYXRhLWljb249aW5saW5lLXN0YXJ0XSl7cGFkZGluZy1sZWZ0OmNhbGModmFyKC0tc3BhY2luZykgKiAxLjUpfS5oYXMtZGF0YS1cW2ljb25cPWlubGluZS1zdGFydFxdXDpwbC0yOmhhcyhbZGF0YS1pY29uPWlubGluZS1zdGFydF0pe3BhZGRpbmctbGVmdDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9Lmhhcy1kYXRhLVxbc2xvdFw9YWxlcnQtYWN0aW9uXF1cOnJlbGF0aXZlOmhhcyhbZGF0YS1zbG90PWFsZXJ0LWFjdGlvbl0pe3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtZGF0YS1cW3Nsb3RcPWFsZXJ0LWFjdGlvblxdXDpwci0xODpoYXMoW2RhdGEtc2xvdD1hbGVydC1hY3Rpb25dKXtwYWRkaW5nLXJpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiAxOCl9Lmhhcy1kYXRhLVxbc2xvdFw9Y2FyZC1hY3Rpb25cXVw6Z3JpZC1jb2xzLVxbMWZyX2F1dG9cXTpoYXMoW2RhdGEtc2xvdD1jYXJkLWFjdGlvbl0pe2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgYXV0b30uaGFzLWRhdGEtXFtzbG90XD1jYXJkLWRlc2NyaXB0aW9uXF1cOmdyaWQtcm93cy1cW2F1dG9fYXV0b1xdOmhhcyhbZGF0YS1zbG90PWNhcmQtZGVzY3JpcHRpb25dKXtncmlkLXRlbXBsYXRlLXJvd3M6YXV0byBhdXRvfS5oYXMtZGF0YS1cW3Nsb3RcPWNhcmQtZm9vdGVyXF1cOnBiLTA6aGFzKFtkYXRhLXNsb3Q9Y2FyZC1mb290ZXJdKXtwYWRkaW5nLWJvdHRvbTowfS5oYXMtXFtcPmltZ1w6Zmlyc3QtY2hpbGRcXVw6cHQtMDpoYXMoPmltZzpmaXJzdC1jaGlsZCl7cGFkZGluZy10b3A6MH0uaGFzLVxbXD5zdmdcXVw6Z3JpZC1jb2xzLVxbYXV0b18xZnJcXTpoYXMoPnN2Zyl7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gMWZyfS5oYXMtXFtcPnN2Z1xdXDpnYXAteC0yOmhhcyg+c3ZnKXtjb2x1bW4tZ2FwOmNhbGModmFyKC0tc3BhY2luZykgKiAyKX0uYXJpYS1leHBhbmRlZFw6YmctbXV0ZWRbYXJpYS1leHBhbmRlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX0uYXJpYS1leHBhbmRlZFw6Ymctc2Vjb25kYXJ5W2FyaWEtZXhwYW5kZWQ9dHJ1ZV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zZWNvbmRhcnkpfS5hcmlhLWV4cGFuZGVkXDp0ZXh0LWZvcmVncm91bmRbYXJpYS1leHBhbmRlZD10cnVlXXtjb2xvcjp2YXIoLS1mb3JlZ3JvdW5kKX0uYXJpYS1leHBhbmRlZFw6dGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZFthcmlhLWV4cGFuZGVkPXRydWVde2NvbG9yOnZhcigtLXNlY29uZGFyeS1mb3JlZ3JvdW5kKX0uYXJpYS1pbnZhbGlkXDpib3JkZXItZGVzdHJ1Y3RpdmVbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9LmFyaWEtaW52YWxpZFw6cmluZy0zW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctc2hhZG93OnZhcigtLXR3LXJpbmctaW5zZXQsKSAwIDAgMCBjYWxjKDNweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcixjdXJyZW50Y29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9LmFyaWEtaW52YWxpZFw6cmluZy1kZXN0cnVjdGl2ZVwvMjBbYXJpYS1pbnZhbGlkPXRydWVdey0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5hcmlhLWludmFsaWRcOnJpbmctZGVzdHJ1Y3RpdmVcLzIwW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMjAlLCB0cmFuc3BhcmVudCl9fS5kYXRhLXBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmRbZGF0YS1wbGFjZWhvbGRlcl17Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9LmRhdGEtXFthbGlnbi10cmlnZ2VyXD10cnVlXF1cOmFuaW1hdGUtbm9uZVtkYXRhLWFsaWduLXRyaWdnZXI9dHJ1ZV17YW5pbWF0aW9uOm5vbmV9LmRhdGEtXFtkaXNhYmxlZFxdXDpwb2ludGVyLWV2ZW50cy1ub25lW2RhdGEtZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmRhdGEtXFtkaXNhYmxlZFxdXDpvcGFjaXR5LTUwW2RhdGEtZGlzYWJsZWRde29wYWNpdHk6LjV9LmRhdGEtXFtwb3NpdGlvblw9cG9wcGVyXF1cOmgtXCgtLXJla2Etc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClbZGF0YS1wb3NpdGlvbj1wb3BwZXJde2hlaWdodDp2YXIoLS1yZWthLXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmRhdGEtXFtwb3NpdGlvblw9cG9wcGVyXF1cOnctZnVsbFtkYXRhLXBvc2l0aW9uPXBvcHBlcl17d2lkdGg6MTAwJX0uZGF0YS1cW3Bvc2l0aW9uXD1wb3BwZXJcXVw6bWluLXctXCgtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGhcKVtkYXRhLXBvc2l0aW9uPXBvcHBlcl17bWluLXdpZHRoOnZhcigtLXJla2Etc2VsZWN0LXRyaWdnZXItd2lkdGgpfS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPWJvdHRvbV17LS10dy10cmFuc2xhdGUteTp2YXIoLS1zcGFjaW5nKTt0cmFuc2xhdGU6dmFyKC0tdHctdHJhbnNsYXRlLXgpIHZhcigtLXR3LXRyYW5zbGF0ZS15KX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6Y2FsYygyKnZhcigtLXNwYWNpbmcpKi0xKX0uZGF0YS1cW3NpZGVcPWlubGluZS1lbmRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPWlubGluZS1lbmRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6Y2FsYygyKnZhcigtLXNwYWNpbmcpKi0xKX0uZGF0YS1cW3NpZGVcPWlubGluZS1zdGFydFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWlubGluZS1zdGFydF17LS10dy1lbnRlci10cmFuc2xhdGUteDpjYWxjKDIqdmFyKC0tc3BhY2luZykpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDotdHJhbnNsYXRlLXgtMVtkYXRhLXNpZGU9bGVmdF17LS10dy10cmFuc2xhdGUteDpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWxlZnRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6Y2FsYygyKnZhcigtLXNwYWNpbmcpKX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LXRyYW5zbGF0ZS14OnZhcigtLXNwYWNpbmcpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9cmlnaHRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OmNhbGMoMip2YXIoLS1zcGFjaW5nKSotMSl9LmRhdGEtXFtzaWRlXD10b3BcXVw6LXRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPXRvcF17LS10dy10cmFuc2xhdGUteTpjYWxjKHZhcigtLXNwYWNpbmcpICogLTEpO3RyYW5zbGF0ZTp2YXIoLS10dy10cmFuc2xhdGUteCkgdmFyKC0tdHctdHJhbnNsYXRlLXkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTpjYWxjKDIqdmFyKC0tc3BhY2luZykpfS5kYXRhLVxbc2l6ZVw9ZGVmYXVsdFxdXDpoLThbZGF0YS1zaXplPWRlZmF1bHRde2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogOCl9LmRhdGEtXFtzaXplXD1zbVxdXDpoLTdbZGF0YS1zaXplPXNtXXtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDcpfS5kYXRhLVxbc2l6ZVw9c21cXVw6Z2FwLTNbZGF0YS1zaXplPXNtXXtnYXA6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5kYXRhLVxbc2l6ZVw9c21cXVw6cm91bmRlZC1cW21pblwodmFyXCgtLXJhZGl1cy1tZFwpXCwxMHB4XClcXVtkYXRhLXNpemU9c21de2JvcmRlci1yYWRpdXM6bWluKHZhcigtLXJhZGl1cy1tZCksIDEwcHgpfS5kYXRhLVxbc2l6ZVw9c21cXVw6cHktM1tkYXRhLXNpemU9c21de3BhZGRpbmctYmxvY2s6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpfS5kYXRhLVxbc2l6ZVw9c21cXVw6aGFzLWRhdGEtXFtzbG90XD1jYXJkLWZvb3RlclxdXDpwYi0wW2RhdGEtc2l6ZT1zbV06aGFzKFtkYXRhLXNsb3Q9Y2FyZC1mb290ZXJdKXtwYWRkaW5nLWJvdHRvbTowfTppcyguXCpcKlw6ZGF0YS1cW3Nsb3RcPWFjY29yZGlvbi10cmlnZ2VyLWljb25cXVw6bWwtYXV0byAqKVtkYXRhLXNsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl17bWFyZ2luLWxlZnQ6YXV0b306aXMoLlwqXCpcOmRhdGEtXFtzbG90XD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXF1cOnNpemUtNCAqKVtkYXRhLXNsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl17d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9OmlzKC5cKlwqXDpkYXRhLVxbc2xvdFw9YWNjb3JkaW9uLXRyaWdnZXItaWNvblxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmQgKilbZGF0YS1zbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25de2NvbG9yOnZhcigtLW11dGVkLWZvcmVncm91bmQpfTppcyguXCpcOmRhdGEtXFtzbG90XD1hbGVydC1kZXNjcmlwdGlvblxdXDp0ZXh0LWRlc3RydWN0aXZlXC85MD4qKVtkYXRhLXNsb3Q9YWxlcnQtZGVzY3JpcHRpb25de2NvbG9yOnZhcigtLWRlc3RydWN0aXZlKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7OmlzKC5cKlw6ZGF0YS1cW3Nsb3RcPWFsZXJ0LWRlc2NyaXB0aW9uXF1cOnRleHQtZGVzdHJ1Y3RpdmVcLzkwPiopW2RhdGEtc2xvdD1hbGVydC1kZXNjcmlwdGlvbl17Y29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgOTAlLCB0cmFuc3BhcmVudCl9fTppcyguXCpcOmRhdGEtXFtzbG90XD1zZWxlY3QtdmFsdWVcXVw6bGluZS1jbGFtcC0xPiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVdey13ZWJraXQtbGluZS1jbGFtcDoxOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDtkaXNwbGF5Oi13ZWJraXQtYm94O292ZXJmbG93OmhpZGRlbn06aXMoLlwqXDpkYXRhLVxbc2xvdFw9c2VsZWN0LXZhbHVlXF1cOmZsZXg+KilbZGF0YS1zbG90PXNlbGVjdC12YWx1ZV17ZGlzcGxheTpmbGV4fTppcyguXCpcOmRhdGEtXFtzbG90XD1zZWxlY3QtdmFsdWVcXVw6aXRlbXMtY2VudGVyPiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVde2FsaWduLWl0ZW1zOmNlbnRlcn06aXMoLlwqXDpkYXRhLVxbc2xvdFw9c2VsZWN0LXZhbHVlXF1cOmdhcC0xXC41PiopW2RhdGEtc2xvdD1zZWxlY3QtdmFsdWVde2dhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMS41KX0uZGF0YS1cW3N0YXRlXD1zZWxlY3RlZFxdXDpiZy1tdXRlZFtkYXRhLXN0YXRlPXNlbGVjdGVkXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX0uZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVw6cm91bmRlZC1ub25lW2RhdGEtdmFyaWFudD1saW5lXXtib3JkZXItcmFkaXVzOjB9QG1lZGlhICh3aWR0aD49NDByZW0pey5zbVw6Z3JpZC1jb2xzLTN7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgzLG1pbm1heCgwLDFmcikpfS5zbVw6Z3JpZC1jb2xzLTR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LG1pbm1heCgwLDFmcikpfS5zbVw6ZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5zbVw6aXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uc21cOmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uc21cOnB4LTZ7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDYpfX1AbWVkaWEgKHdpZHRoPj00OHJlbSl7Lm1kXDp0ZXh0LXNte2ZvbnQtc2l6ZTp2YXIoLS10ZXh0LXNtKTtsaW5lLWhlaWdodDp2YXIoLS10dy1sZWFkaW5nLHZhcigtLXRleHQtc20tLWxpbmUtaGVpZ2h0KSl9Lm1kXDp0ZXh0LXByZXR0eXt0ZXh0LXdyYXA6cHJldHR5fX1AbWVkaWEgKHdpZHRoPj02NHJlbSl7LmxnXDpweC04e3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc3BhY2luZykgKiA4KX19QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXsuZGFya1w6Ym9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjp2YXIoLS1pbnB1dCl9LmRhcmtcOmJnLWRlc3RydWN0aXZlXC8yMHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWRlc3RydWN0aXZlKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmRhcmtcOmJnLWRlc3RydWN0aXZlXC8yMHtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZGVzdHJ1Y3RpdmUpIDIwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6YmctaW5wdXRcLzMwe2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGFya1w6YmctaW5wdXRcLzMwe2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1pbnB1dCkgMzAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDp0ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6dmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCl9QG1lZGlhIChob3Zlcjpob3Zlcil7LmRhcmtcOmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvMzA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzMwOmhvdmVye2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgMzAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDpob3Zlclw6YmctaW5wdXRcLzUwOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0taW5wdXQpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuZGFya1w6aG92ZXJcOmJnLWlucHV0XC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDUwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6aG92ZXJcOmJnLW11dGVkXC81MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW11dGVkKX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LmRhcmtcOmhvdmVyXDpiZy1tdXRlZFwvNTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLW11dGVkKSA1MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmhvdmVyXDp0ZXh0LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9fS5kYXJrXDpmb2N1cy12aXNpYmxlXDpyaW5nLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpmb2N1cy12aXNpYmxlXDpyaW5nLWRlc3RydWN0aXZlXC80MDpmb2N1cy12aXNpYmxley0tdHctcmluZy1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSA0MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmRpc2FibGVkXDpiZy1pbnB1dFwvODA6ZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpkaXNhYmxlZFw6YmctaW5wdXRcLzgwOmRpc2FibGVke2JhY2tncm91bmQtY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1pbnB1dCkgODAlLCB0cmFuc3BhcmVudCl9fS5kYXJrXDphcmlhLWludmFsaWRcOmJvcmRlci1kZXN0cnVjdGl2ZVwvNTBbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDphcmlhLWludmFsaWRcOmJvcmRlci1kZXN0cnVjdGl2ZVwvNTBbYXJpYS1pbnZhbGlkPXRydWVde2JvcmRlci1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSA1MCUsIHRyYW5zcGFyZW50KX19LmRhcmtcOmFyaWEtaW52YWxpZFw6cmluZy1kZXN0cnVjdGl2ZVwvNDBbYXJpYS1pbnZhbGlkPXRydWVdey0tdHctcmluZy1jb2xvcjp2YXIoLS1kZXN0cnVjdGl2ZSl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDphcmlhLWludmFsaWRcOnJpbmctZGVzdHJ1Y3RpdmVcLzQwW2FyaWEtaW52YWxpZD10cnVlXXstLXR3LXJpbmctY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1kZXN0cnVjdGl2ZSkgNDAlLCB0cmFuc3BhcmVudCl9fX0uZGF0YS1vcGVuXDphbmltYXRlLWFjY29yZGlvbi1kb3duOndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDphbmltYXRlLWFjY29yZGlvbi1kb3duOndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpe2FuaW1hdGlvbjphY2NvcmRpb24tZG93biB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjJzKSl2YXIoLS10dy1lYXNlLGVhc2Utb3V0KXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1vcGVuXDphbmltYXRlLWluOndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDphbmltYXRlLWluOndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpe2FuaW1hdGlvbjplbnRlciB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjE1cykpdmFyKC0tdHctZWFzZSxlYXNlKXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1vcGVuXDpmYWRlLWluLTA6d2hlcmUoW2RhdGEtc3RhdGU9b3Blbl0pLC5kYXRhLW9wZW5cOmZhZGUtaW4tMDp3aGVyZShbZGF0YS1vcGVuXTpub3QoW2RhdGEtb3Blbj1mYWxzZV0pKXstLXR3LWVudGVyLW9wYWNpdHk6MH0uZGF0YS1vcGVuXDp6b29tLWluLTk1OndoZXJlKFtkYXRhLXN0YXRlPW9wZW5dKSwuZGF0YS1vcGVuXDp6b29tLWluLTk1OndoZXJlKFtkYXRhLW9wZW5dOm5vdChbZGF0YS1vcGVuPWZhbHNlXSkpey0tdHctZW50ZXItc2NhbGU6Ljk1fS5kYXRhLWNsb3NlZFw6YW5pbWF0ZS1hY2NvcmRpb24tdXA6d2hlcmUoW2RhdGEtc3RhdGU9Y2xvc2VkXSksLmRhdGEtY2xvc2VkXDphbmltYXRlLWFjY29yZGlvbi11cDp3aGVyZShbZGF0YS1jbG9zZWRdOm5vdChbZGF0YS1jbG9zZWQ9ZmFsc2VdKSl7YW5pbWF0aW9uOmFjY29yZGlvbi11cCB2YXIoLS10dy1hbmltYXRpb24tZHVyYXRpb24sdmFyKC0tdHctZHVyYXRpb24sLjJzKSl2YXIoLS10dy1lYXNlLGVhc2Utb3V0KXZhcigtLXR3LWFuaW1hdGlvbi1kZWxheSwwcyl2YXIoLS10dy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LDEpdmFyKC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbixub3JtYWwpdmFyKC0tdHctYW5pbWF0aW9uLWZpbGwtbW9kZSxub25lKX0uZGF0YS1jbG9zZWRcOmFuaW1hdGUtb3V0OndoZXJlKFtkYXRhLXN0YXRlPWNsb3NlZF0pLC5kYXRhLWNsb3NlZFw6YW5pbWF0ZS1vdXQ6d2hlcmUoW2RhdGEtY2xvc2VkXTpub3QoW2RhdGEtY2xvc2VkPWZhbHNlXSkpe2FuaW1hdGlvbjpleGl0IHZhcigtLXR3LWFuaW1hdGlvbi1kdXJhdGlvbix2YXIoLS10dy1kdXJhdGlvbiwuMTVzKSl2YXIoLS10dy1lYXNlLGVhc2UpdmFyKC0tdHctYW5pbWF0aW9uLWRlbGF5LDBzKXZhcigtLXR3LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsMSl2YXIoLS10dy1hbmltYXRpb24tZGlyZWN0aW9uLG5vcm1hbCl2YXIoLS10dy1hbmltYXRpb24tZmlsbC1tb2RlLG5vbmUpfS5kYXRhLWNsb3NlZFw6ZmFkZS1vdXQtMDp3aGVyZShbZGF0YS1zdGF0ZT1jbG9zZWRdKSwuZGF0YS1jbG9zZWRcOmZhZGUtb3V0LTA6d2hlcmUoW2RhdGEtY2xvc2VkXTpub3QoW2RhdGEtY2xvc2VkPWZhbHNlXSkpey0tdHctZXhpdC1vcGFjaXR5OjB9LmRhdGEtY2xvc2VkXDp6b29tLW91dC05NTp3aGVyZShbZGF0YS1zdGF0ZT1jbG9zZWRdKSwuZGF0YS1jbG9zZWRcOnpvb20tb3V0LTk1OndoZXJlKFtkYXRhLWNsb3NlZF06bm90KFtkYXRhLWNsb3NlZD1mYWxzZV0pKXstLXR3LWV4aXQtc2NhbGU6Ljk1fS5kYXRhLWFjdGl2ZVw6YmctYmFja2dyb3VuZDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGF0YS1hY3RpdmVcOmJnLWJhY2tncm91bmQ6d2hlcmUoW2RhdGEtYWN0aXZlXTpub3QoW2RhdGEtYWN0aXZlPWZhbHNlXSkpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tYmFja2dyb3VuZCl9LmRhdGEtYWN0aXZlXDp0ZXh0LWZvcmVncm91bmQ6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmRhdGEtYWN0aXZlXDp0ZXh0LWZvcmVncm91bmQ6d2hlcmUoW2RhdGEtYWN0aXZlXTpub3QoW2RhdGEtYWN0aXZlPWZhbHNlXSkpe2NvbG9yOnZhcigtLWZvcmVncm91bmQpfS5ncm91cC1kYXRhLVxbdmFyaWFudFw9ZGVmYXVsdFxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpzaGFkb3ctc206aXMoOndoZXJlKC5ncm91cFwvdGFicy1saXN0KVtkYXRhLXZhcmlhbnQ9ZGVmYXVsdF0gKik6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1kZWZhdWx0XF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOnNoYWRvdy1zbTppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1kZWZhdWx0XSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7LS10dy1zaGFkb3c6MCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yLCMwMDAwMDAxYSksIDAgMXB4IDJweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciwjMDAwMDAwMWEpO2JveC1zaGFkb3c6dmFyKC0tdHctaW5zZXQtc2hhZG93KSwgdmFyKC0tdHctaW5zZXQtcmluZy1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdyl9Lmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5ncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpiZy10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjojMDAwMH0uZ3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6c2hhZG93LW5vbmU6aXMoOndoZXJlKC5ncm91cFwvdGFicy1saXN0KVtkYXRhLXZhcmlhbnQ9bGluZV0gKik6d2hlcmUoW2RhdGEtc3RhdGU9YWN0aXZlXSksLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOnNoYWRvdy1ub25lOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXstLXR3LXNoYWRvdzowIDAgIzAwMDA7Ym94LXNoYWRvdzp2YXIoLS10dy1pbnNldC1zaGFkb3cpLCB2YXIoLS10dy1pbnNldC1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93KX06aXMoLmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmFmdGVyXDpvcGFjaXR5LTEwMDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZ3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6YWZ0ZXJcOm9wYWNpdHktMTAwOmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKSk6YWZ0ZXJ7Y29udGVudDp2YXIoLS10dy1jb250ZW50KTtvcGFjaXR5OjF9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXsuZGFya1w6ZGF0YS1hY3RpdmVcOmJvcmRlci1pbnB1dDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOmJvcmRlci1pbnB1dDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7Ym9yZGVyLWNvbG9yOnZhcigtLWlucHV0KX0uZGFya1w6ZGF0YS1hY3RpdmVcOmJnLWlucHV0XC8zMDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOmJnLWlucHV0XC8zMDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gbGFiLCByZWQsIHJlZCkpey5kYXJrXDpkYXRhLWFjdGl2ZVw6YmctaW5wdXRcLzMwOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5kYXJrXDpkYXRhLWFjdGl2ZVw6YmctaW5wdXRcLzMwOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXtiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0taW5wdXQpIDMwJSwgdHJhbnNwYXJlbnQpfX0uZGFya1w6ZGF0YS1hY3RpdmVcOnRleHQtZm9yZWdyb3VuZDp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6ZGF0YS1hY3RpdmVcOnRleHQtZm9yZWdyb3VuZDp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9LmRhcmtcOmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJvcmRlci10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1zdGF0ZT1hY3RpdmVdKSwuZGFya1w6Z3JvdXAtZGF0YS1cW3ZhcmlhbnRcPWxpbmVcXVwvdGFicy1saXN0XDpkYXRhLWFjdGl2ZVw6Ym9yZGVyLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLWFjdGl2ZV06bm90KFtkYXRhLWFjdGl2ZT1mYWxzZV0pKXtib3JkZXItY29sb3I6IzAwMDB9LmRhcmtcOmdyb3VwLWRhdGEtXFt2YXJpYW50XD1saW5lXF1cL3RhYnMtbGlzdFw6ZGF0YS1hY3RpdmVcOmJnLXRyYW5zcGFyZW50OmlzKDp3aGVyZSguZ3JvdXBcL3RhYnMtbGlzdClbZGF0YS12YXJpYW50PWxpbmVdICopOndoZXJlKFtkYXRhLXN0YXRlPWFjdGl2ZV0pLC5kYXJrXDpncm91cC1kYXRhLVxbdmFyaWFudFw9bGluZVxdXC90YWJzLWxpc3RcOmRhdGEtYWN0aXZlXDpiZy10cmFuc3BhcmVudDppcyg6d2hlcmUoLmdyb3VwXC90YWJzLWxpc3QpW2RhdGEtdmFyaWFudD1saW5lXSAqKTp3aGVyZShbZGF0YS1hY3RpdmVdOm5vdChbZGF0YS1hY3RpdmU9ZmFsc2VdKSl7YmFja2dyb3VuZC1jb2xvcjojMDAwMH19LmRhdGEtaG9yaXpvbnRhbFw6ZmxleC1jb2w6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pe2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uXFtcJl9hXF1cOnVuZGVybGluZSBhe3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uXFtcJl9hXF1cOnVuZGVybGluZS1vZmZzZXQtMyBhe3RleHQtdW5kZXJsaW5lLW9mZnNldDozcHh9QG1lZGlhIChob3Zlcjpob3Zlcil7LlxbXCZfYVxdXDpob3Zlclw6dGV4dC1mb3JlZ3JvdW5kIGE6aG92ZXJ7Y29sb3I6dmFyKC0tZm9yZWdyb3VuZCl9fS5cW1wmX3BcOm5vdFwoXDpsYXN0LWNoaWxkXClcXVw6bWItNCBwOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTpjYWxjKHZhcigtLXNwYWNpbmcpICogNCl9LlxbXCZfc3ZnXF1cOnBvaW50ZXItZXZlbnRzLW5vbmUgc3Zne3BvaW50ZXItZXZlbnRzOm5vbmV9LlxbXCZfc3ZnXF1cOnNocmluay0wIHN2Z3tmbGV4LXNocmluazowfS5cW1wmX3N2Z1w6bm90XChcW2NsYXNzXCpcPXNpemUtXF1cKVxdXDpzaXplLTMgc3ZnOm5vdChbY2xhc3MqPXNpemUtXSl7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpO2hlaWdodDpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9LlxbXCZfc3ZnXDpub3RcKFxbY2xhc3NcKlw9c2l6ZS1cXVwpXF1cOnNpemUtM1wuNSBzdmc6bm90KFtjbGFzcyo9c2l6ZS1dKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogMy41KTtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMuNSl9LlxbXCZfc3ZnXDpub3RcKFxbY2xhc3NcKlw9c2l6ZS1cXVwpXF1cOnNpemUtNCBzdmc6bm90KFtjbGFzcyo9c2l6ZS1dKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0uXFtcJl90clxdXDpib3JkZXItYiB0cntib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLXR3LWJvcmRlci1zdHlsZSk7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LlxbXCZfdHJcOmxhc3QtY2hpbGRcXVw6Ym9yZGVyLTAgdHI6bGFzdC1jaGlsZHtib3JkZXItc3R5bGU6dmFyKC0tdHctYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6MH0uXFtcJlw6aGFzXChcW3JvbGVcPWNoZWNrYm94XF1cKVxdXDpwci0wOmhhcyhbcm9sZT1jaGVja2JveF0pe3BhZGRpbmctcmlnaHQ6MH0uXFtcLmJvcmRlci1iXF1cOnBiLTQuYm9yZGVyLWJ7cGFkZGluZy1ib3R0b206Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDQpfS5ncm91cC1kYXRhLVxbc2l6ZVw9c21cXVwvY2FyZFw6XFtcLmJvcmRlci1iXF1cOnBiLTM6aXMoOndoZXJlKC5ncm91cFwvY2FyZClbZGF0YS1zaXplPXNtXSAqKS5ib3JkZXItYntwYWRkaW5nLWJvdHRvbTpjYWxjKHZhcigtLXNwYWNpbmcpICogMyl9QG1lZGlhIChob3Zlcjpob3Zlcil7LlxbYVxdXDpob3Zlclw6YmctZGVzdHJ1Y3RpdmVcLzIwOmlzKGEpOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZGVzdHJ1Y3RpdmUpfUBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIGxhYiwgcmVkLCByZWQpKXsuXFthXF1cOmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvMjA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWRlc3RydWN0aXZlKSAyMCUsIHRyYW5zcGFyZW50KX19LlxbYVxdXDpob3Zlclw6YmctbXV0ZWQ6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tdXRlZCl9LlxbYVxdXDpob3Zlclw6YmctcHJpbWFyeVwvODA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wcmltYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LlxbYVxdXDpob3Zlclw6YmctcHJpbWFyeVwvODA6aXMoYSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLXByaW1hcnkpIDgwJSwgdHJhbnNwYXJlbnQpfX0uXFthXF1cOmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmlzKGEpOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tc2Vjb25kYXJ5KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBsYWIsIHJlZCwgcmVkKSl7LlxbYVxdXDpob3Zlclw6Ymctc2Vjb25kYXJ5XC84MDppcyhhKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tc2Vjb25kYXJ5KSA4MCUsIHRyYW5zcGFyZW50KX19LlxbYVxdXDpob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmlzKGEpOmhvdmVye2NvbG9yOnZhcigtLW11dGVkLWZvcmVncm91bmQpfX06aXMoLlwqXDpcW2ltZ1w6Zmlyc3QtY2hpbGRcXVw6cm91bmRlZC10LXhsPiopOmlzKGltZzpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSArIDRweCl9OmlzKC5cKlw6XFtpbWdcOmxhc3QtY2hpbGRcXVw6cm91bmRlZC1iLXhsPiopOmlzKGltZzpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgKyA0cHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpICsgNHB4KX06aXMoLlwqXDpcW3NwYW5cXVw6bGFzdFw6ZmxleD4qKTppcyhzcGFuKTpsYXN0LWNoaWxke2Rpc3BsYXk6ZmxleH06aXMoLlwqXDpcW3NwYW5cXVw6bGFzdFw6aXRlbXMtY2VudGVyPiopOmlzKHNwYW4pOmxhc3QtY2hpbGR7YWxpZ24taXRlbXM6Y2VudGVyfTppcyguXCpcOlxbc3BhblxdXDpsYXN0XDpnYXAtMj4qKTppcyhzcGFuKTpsYXN0LWNoaWxke2dhcDpjYWxjKHZhcigtLXNwYWNpbmcpICogMil9OmlzKC5cKlw6XFtzdmdcXVw6cm93LXNwYW4tMj4qKTppcyhzdmcpe2dyaWQtcm93OnNwYW4gMi9zcGFuIDJ9OmlzKC5cKlw6XFtzdmdcXVw6dHJhbnNsYXRlLXktMFwuNT4qKTppcyhzdmcpey0tdHctdHJhbnNsYXRlLXk6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIC41KTt0cmFuc2xhdGU6dmFyKC0tdHctdHJhbnNsYXRlLXgpIHZhcigtLXR3LXRyYW5zbGF0ZS15KX06aXMoLlwqXDpcW3N2Z1xdXDp0ZXh0LWN1cnJlbnQ+Kik6aXMoc3ZnKXtjb2xvcjpjdXJyZW50Q29sb3J9OmlzKC5cKlw6XFtzdmdcOm5vdFwoXFtjbGFzc1wqXD1zaXplLVxdXClcXVw6c2l6ZS00PiopOmlzKHN2Zzpub3QoW2NsYXNzKj1zaXplLV0pKXt3aWR0aDpjYWxjKHZhcigtLXNwYWNpbmcpICogNCk7aGVpZ2h0OmNhbGModmFyKC0tc3BhY2luZykgKiA0KX0uXFtcJlw+c3ZnXF1cOnBvaW50ZXItZXZlbnRzLW5vbmU+c3Zne3BvaW50ZXItZXZlbnRzOm5vbmV9LlxbXCZcPnN2Z1xdXDpzaXplLTNcIT5zdmd7d2lkdGg6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpIWltcG9ydGFudDtoZWlnaHQ6Y2FsYyh2YXIoLS1zcGFjaW5nKSAqIDMpIWltcG9ydGFudH0uXFtcJlw+dHJcXVw6bGFzdFw6Ym9yZGVyLWItMD50cjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tc3R5bGU6dmFyKC0tdHctYm9yZGVyLXN0eWxlKTtib3JkZXItYm90dG9tLXdpZHRoOjB9fUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1kZWxheXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MHN9QHByb3BlcnR5IC0tdHctYW5pbWF0aW9uLWRpcmVjdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6bm9ybWFsfUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1kdXJhdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWFuaW1hdGlvbi1maWxsLW1vZGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOm5vbmV9QHByb3BlcnR5IC0tdHctYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MX1AcHJvcGVydHkgLS10dy1lbnRlci1ibHVye3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLW9wYWNpdHl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjF9QHByb3BlcnR5IC0tdHctZW50ZXItcm90YXRle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXNjYWxle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXRyYW5zbGF0ZS14e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWVudGVyLXRyYW5zbGF0ZS15e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWV4aXQtYmx1cntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy1leGl0LW9wYWNpdHl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjF9QHByb3BlcnR5IC0tdHctZXhpdC1yb3RhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tdHctZXhpdC1zY2FsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MX1AcHJvcGVydHkgLS10dy1leGl0LXRyYW5zbGF0ZS14e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXR3LWV4aXQtdHJhbnNsYXRlLXl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tc2Nyb2xsLWZhZGUtdHtzeW50YXg6IjxsZW5ndGgtcGVyY2VudGFnZT4iO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS1zY3JvbGwtZmFkZS1ie3N5bnRheDoiPGxlbmd0aC1wZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowfUBwcm9wZXJ0eSAtLXNjcm9sbC1mYWRlLXN7c3ludGF4OiI8bGVuZ3RoLXBlcmNlbnRhZ2U+Ijtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tc2Nyb2xsLWZhZGUtZXtzeW50YXg6IjxsZW5ndGgtcGVyY2VudGFnZT4iO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS1zY3JvbGwtZmFkZS1tYXNre3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tc2hpbW1lci1hbmdsZXtzeW50YXg6IjxhbmdsZT4iO2luaGVyaXRzOnRydWU7aW5pdGlhbC12YWx1ZToyMGRlZ31AcHJvcGVydHkgLS1zaGltbWVyLWltYWdle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tc2hpbW1lci10ZXh0LWZpbGx7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsuc2hpbW1lcnstd2Via2l0LXRleHQtZmlsbC1jb2xvcjpjdXJyZW50Q29sb3I7YmFja2dyb3VuZC1pbWFnZTpub25lO2FuaW1hdGlvbjpub25lfX06cm9vdHstLWJhY2tncm91bmQ6b2tsY2goOTklIC4wMDQgNzUpOy0tZm9yZWdyb3VuZDpva2xjaCgxOSUgLjAxMiA3NSk7LS1jYXJkOm9rbGNoKDk5LjUlIC4wMDMgNzUpOy0tY2FyZC1mb3JlZ3JvdW5kOm9rbGNoKDE5JSAuMDEyIDc1KTstLXBvcG92ZXI6b2tsY2goOTkuNSUgLjAwMyA3NSk7LS1wb3BvdmVyLWZvcmVncm91bmQ6b2tsY2goMTklIC4wMTIgNzUpOy0tcHJpbWFyeTpva2xjaCg0NiUgLjA5IDIwMCk7LS1wcmltYXJ5LWZvcmVncm91bmQ6b2tsY2goOTglIC4wMDYgMjAwKTstLXNlY29uZGFyeTpva2xjaCg5NSUgLjAwNiA3NSk7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDpva2xjaCgyMiUgLjAxIDc1KTstLW11dGVkOm9rbGNoKDk1JSAuMDA2IDc1KTstLW11dGVkLWZvcmVncm91bmQ6b2tsY2goNDglIC4wMTIgNzUpOy0tYWNjZW50Om9rbGNoKDkzJSAuMDIgMjAwKTstLWFjY2VudC1mb3JlZ3JvdW5kOm9rbGNoKDI4JSAuMDUgMjAwKTstLWRlc3RydWN0aXZlOm9rbGNoKDU1JSAuMiAyNSk7LS1ib3JkZXI6b2tsY2goOTAlIC4wMDcgNzUpOy0taW5wdXQ6b2tsY2goOTAlIC4wMDcgNzUpOy0tcmluZzpva2xjaCg1NSUgLjA5IDIwMCk7LS1yYWRpdXM6LjM3NXJlbTstLWNoYXJ0LXJlcXVlc3RzOiMwMDllNzM7LS1jaGFydC10b2tlbnMtaW46IzAwNzJiMjstLWNoYXJ0LXRva2Vucy1vdXQ6I2U2OWYwMDstLWNoYXJ0LWNvc3Q6I2Q1NWUwMDstLXN0YXR1cy13YXJuOiNhMzVjMDB9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6cm9vdHstLWJhY2tncm91bmQ6b2tsY2goMTclIC4wMDcgNzUpOy0tZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1jYXJkOm9rbGNoKDIxJSAuMDA5IDc1KTstLWNhcmQtZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1wb3BvdmVyOm9rbGNoKDIxJSAuMDA5IDc1KTstLXBvcG92ZXItZm9yZWdyb3VuZDpva2xjaCg5NSUgLjAwNSA3NSk7LS1wcmltYXJ5Om9rbGNoKDc0JSAuMTEgMjAwKTstLXByaW1hcnktZm9yZWdyb3VuZDpva2xjaCgxNiUgLjAxMiAyMDApOy0tc2Vjb25kYXJ5Om9rbGNoKDI3JSAuMDExIDc1KTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOm9rbGNoKDkzJSAuMDA1IDc1KTstLW11dGVkOm9rbGNoKDI3JSAuMDExIDc1KTstLW11dGVkLWZvcmVncm91bmQ6b2tsY2goNjglIC4wMTIgNzUpOy0tYWNjZW50Om9rbGNoKDMyJSAuMDM1IDIwMCk7LS1hY2NlbnQtZm9yZWdyb3VuZDpva2xjaCg5MSUgLjAzIDIwMCk7LS1kZXN0cnVjdGl2ZTpva2xjaCg2OCUgLjE5IDI1KTstLWJvcmRlcjpva2xjaCgxMDAlIDAgMC8uMTIpOy0taW5wdXQ6b2tsY2goMTAwJSAwIDAvLjE2KTstLXJpbmc6b2tsY2goNjIlIC4xIDIwMCk7LS1jaGFydC1yZXF1ZXN0czojMTZiODkxOy0tY2hhcnQtdG9rZW5zLWluOiM0MDk4ZDc7LS1jaGFydC10b2tlbnMtb3V0OiNmMGFjMWY7LS1jaGFydC1jb3N0OiNlODc2M2E7LS1zdGF0dXMtd2FybjojZjBhYzFmfX1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUteHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUteXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy10cmFuc2xhdGUtentzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MH1AcHJvcGVydHkgLS10dy1yb3RhdGUteHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXJvdGF0ZS15e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctcm90YXRlLXp7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1za2V3LXh7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1za2V3LXl7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1ib3JkZXItc3R5bGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOnNvbGlkfUBwcm9wZXJ0eSAtLXR3LWxlYWRpbmd7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1mb250LXdlaWdodHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXRyYWNraW5ne3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctb3JkaW5hbHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNsYXNoZWQtemVyb3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LW51bWVyaWMtZmlndXJle3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctbnVtZXJpYy1zcGFjaW5ne3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctbnVtZXJpYy1mcmFjdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LXNoYWRvdy1jb2xvcntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvdy1jb2xvcntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LXJpbmctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1yaW5nLXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LWluc2V0LXJpbmctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1pbnNldC1yaW5nLXNoYWRvd3tzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6MCAwICMwMDAwfUBwcm9wZXJ0eSAtLXR3LXJpbmctaW5zZXR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1yaW5nLW9mZnNldC13aWR0aHtzeW50YXg6IjxsZW5ndGg+Ijtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOjB9QHByb3BlcnR5IC0tdHctcmluZy1vZmZzZXQtY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOiNmZmZ9QHByb3BlcnR5IC0tdHctcmluZy1vZmZzZXQtc2hhZG93e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZTowIDAgIzAwMDB9QHByb3BlcnR5IC0tdHctb3V0bGluZS1zdHlsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlO2luaXRpYWwtdmFsdWU6c29saWR9QHByb3BlcnR5IC0tdHctYmx1cntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWJyaWdodG5lc3N7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1jb250cmFzdHtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWdyYXlzY2FsZXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWh1ZS1yb3RhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1pbnZlcnR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1vcGFjaXR5e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctc2F0dXJhdGV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1zZXBpYXtzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWRyb3Atc2hhZG93e3N5bnRheDoiKiI7aW5oZXJpdHM6ZmFsc2V9QHByb3BlcnR5IC0tdHctZHJvcC1zaGFkb3ctY29sb3J7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1kcm9wLXNoYWRvdy1hbHBoYXtzeW50YXg6IjxwZXJjZW50YWdlPiI7aW5oZXJpdHM6ZmFsc2U7aW5pdGlhbC12YWx1ZToxMDAlfUBwcm9wZXJ0eSAtLXR3LWRyb3Atc2hhZG93LXNpemV7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZX1AcHJvcGVydHkgLS10dy1kdXJhdGlvbntzeW50YXg6IioiO2luaGVyaXRzOmZhbHNlfUBwcm9wZXJ0eSAtLXR3LWNvbnRlbnR7c3ludGF4OiIqIjtpbmhlcml0czpmYWxzZTtpbml0aWFsLXZhbHVlOiIifUBrZXlmcmFtZXMgZW50ZXJ7MCV7b3BhY2l0eTp2YXIoLS10dy1lbnRlci1vcGFjaXR5LDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteCwwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwwKSwwKXNjYWxlM2QodmFyKC0tdHctZW50ZXItc2NhbGUsMSksdmFyKC0tdHctZW50ZXItc2NhbGUsMSksdmFyKC0tdHctZW50ZXItc2NhbGUsMSkpcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwwKSk7ZmlsdGVyOmJsdXIodmFyKC0tdHctZW50ZXItYmx1ciwwKSl9fUBrZXlmcmFtZXMgZXhpdHt0b3tvcGFjaXR5OnZhcigtLXR3LWV4aXQtb3BhY2l0eSwxKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QodmFyKC0tdHctZXhpdC10cmFuc2xhdGUteCwwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LDApLDApc2NhbGUzZCh2YXIoLS10dy1leGl0LXNjYWxlLDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsMSksdmFyKC0tdHctZXhpdC1zY2FsZSwxKSlyb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsMCkpO2ZpbHRlcjpibHVyKHZhcigtLXR3LWV4aXQtYmx1ciwwKSl9fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJla2EtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0LHZhcigtLWFjY29yZGlvbi1wYW5lbC1oZWlnaHQsYXV0bykpfX1Aa2V5ZnJhbWVzIGFjY29yZGlvbi11cHswJXtoZWlnaHQ6dmFyKC0tcmVrYS1hY2NvcmRpb24tY29udGVudC1oZWlnaHQsdmFyKC0tYWNjb3JkaW9uLXBhbmVsLWhlaWdodCxhdXRvKSl9dG97aGVpZ2h0OjB9fQo=", ), }, - "index-CwP_MbOb.js": { + "index-Cn6vEAjP.js": { contentType: "text/javascript; charset=utf-8", body: decodeAdminAsset( - "dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5LHQ9KHQsbik9PntsZXQgcj17fTtmb3IodmFyIGkgaW4gdCllKHIsaSx7Z2V0OnRbaV0sZW51bWVyYWJsZTohMH0pO3JldHVybiBufHxlKHIsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpgTW9kdWxlYH0pLHJ9O2Z1bmN0aW9uIG4oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG4gb2YgZS5zcGxpdChgLGApKXRbbl09MTtyZXR1cm4gZT0+ZSBpbiB0fXZhciByPXt9LGk9W10sYT0oKT0+e30sbz0oKT0+ITEscz1lPT5lLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmUuY2hhckNvZGVBdCgxKT09PTExMCYmKGUuY2hhckNvZGVBdCgyKT4xMjJ8fGUuY2hhckNvZGVBdCgyKTw5NyksYz1lPT5lLnN0YXJ0c1dpdGgoYG9uVXBkYXRlOmApLGw9T2JqZWN0LmFzc2lnbix1PShlLHQpPT57bGV0IG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9LGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmPShlLHQpPT5kLmNhbGwoZSx0KSxwPUFycmF5LmlzQXJyYXksbT1lPT53KGUpPT09YFtvYmplY3QgTWFwXWAsaD1lPT53KGUpPT09YFtvYmplY3QgU2V0XWAsZz1lPT53KGUpPT09YFtvYmplY3QgRGF0ZV1gLF89ZT0+dyhlKT09PWBbb2JqZWN0IFJlZ0V4cF1gLHY9ZT0+dHlwZW9mIGU9PWBmdW5jdGlvbmAseT1lPT50eXBlb2YgZT09YHN0cmluZ2AsYj1lPT50eXBlb2YgZT09YHN5bWJvbGAseD1lPT50eXBlb2YgZT09YG9iamVjdGAmJiEhZSxTPWU9Pih4KGUpfHx2KGUpKSYmdihlLnRoZW4pJiZ2KGUuY2F0Y2gpLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx3PWU9PkMuY2FsbChlKSxlZT1lPT53KGUpLnNsaWNlKDgsLTEpLHRlPWU9PncoZSk9PT1gW29iamVjdCBPYmplY3RdYCxUPWU9PnkoZSkmJmUhPT1gTmFOYCYmZVswXSE9PWAtYCYmYGArcGFyc2VJbnQoZSwxMCk9PT1lLG5lPW4oYCxrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkYCkscmU9ZT0+e2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuKG49PnRbbl18fCh0W25dPWUobikpKX0saWU9Ly1cdy9nLEU9cmUoZT0+ZS5yZXBsYWNlKGllLGU9PmUuc2xpY2UoMSkudG9VcHBlckNhc2UoKSkpLGFlPS9cQihbQS1aXSkvZyxvZT1yZShlPT5lLnJlcGxhY2UoYWUsYC0kMWApLnRvTG93ZXJDYXNlKCkpLHNlPXJlKGU9PmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSksY2U9cmUoZT0+ZT9gb24ke3NlKGUpfWA6YGApLEQ9KGUsdCk9PiFPYmplY3QuaXMoZSx0KSxsZT0oZSwuLi50KT0+e2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oLi4udCl9LHVlPShlLHQsbixyPSExKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOnIsdmFsdWU6bn0pfSxkZT1lPT57bGV0IHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fSxmZT1lPT57bGV0IHQ9eShlKT9OdW1iZXIoZSk6TmFOO3JldHVybiBpc05hTih0KT9lOnR9LHBlLG1lPSgpPT5wZXx8PXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPGB1YD9zZWxmOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6e30saGU9bihgSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3IsU3ltYm9sYCk7ZnVuY3Rpb24gZ2UoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0saT15KHIpP2JlKHIpOmdlKHIpO2lmKGkpZm9yKGxldCBlIGluIGkpdFtlXT1pW2VdfXJldHVybiB0fWlmKHkoZSl8fHgoZSkpcmV0dXJuIGV9dmFyIF9lPS87KD8hW14oXSpcKSkvZyx2ZT0vOihbXl0rKS8seWU9L1wvXCpbXl0qP1wqXC8vZztmdW5jdGlvbiBiZShlKXtsZXQgdD17fTtyZXR1cm4gZS5yZXBsYWNlKHllLGBgKS5zcGxpdChfZSkuZm9yRWFjaChlPT57aWYoZSl7bGV0IG49ZS5zcGxpdCh2ZSk7bi5sZW5ndGg+MSYmKHRbblswXS50cmltKCldPW5bMV0udHJpbSgpKX19KSx0fWZ1bmN0aW9uIE8oZSl7bGV0IHQ9YGA7aWYoeShlKSl0PWU7ZWxzZSBpZihwKGUpKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1PKGVbbl0pO3ImJih0Kz1yK2AgYCl9ZWxzZSBpZih4KGUpKWZvcihsZXQgbiBpbiBlKWVbbl0mJih0Kz1uK2AgYCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIHhlKGUpe2lmKCFlKXJldHVybiBudWxsO2xldHtjbGFzczp0LHN0eWxlOm59PWU7cmV0dXJuIHQmJiF5KHQpJiYoZS5jbGFzcz1PKHQpKSxuJiYoZS5zdHlsZT1nZShuKSksZX12YXIgU2U9YGl0ZW1zY29wZSxhbGxvd2Z1bGxzY3JlZW4sZm9ybW5vdmFsaWRhdGUsaXNtYXAsbm9tb2R1bGUsbm92YWxpZGF0ZSxyZWFkb25seWAsQ2U9bihTZSk7U2UrYGA7ZnVuY3Rpb24gd2UoZSl7cmV0dXJuISFlfHxlPT09YGB9ZnVuY3Rpb24gVGUoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2xldCBuPSEwO2ZvcihsZXQgcj0wO24mJnI8ZS5sZW5ndGg7cisrKW49RWUoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBFZShlLHQpe2lmKGU9PT10KXJldHVybiEwO2xldCBuPWcoZSkscj1nKHQpO2lmKG58fHIpcmV0dXJuIG4mJnI/ZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTohMTtpZihuPWIoZSkscj1iKHQpLG58fHIpcmV0dXJuIGU9PT10O2lmKG49cChlKSxyPXAodCksbnx8cilyZXR1cm4gbiYmcj9UZShlLHQpOiExO2lmKG49eChlKSxyPXgodCksbnx8cil7aWYoIW58fCFyfHxPYmplY3Qua2V5cyhlKS5sZW5ndGghPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuIGluIGUpe2xldCByPWUuaGFzT3duUHJvcGVydHkobiksaT10Lmhhc093blByb3BlcnR5KG4pO2lmKHImJiFpfHwhciYmaXx8IUVlKGVbbl0sdFtuXSkpcmV0dXJuITF9fXJldHVybiBTdHJpbmcoZSk9PT1TdHJpbmcodCl9ZnVuY3Rpb24gRGUoZSx0KXtyZXR1cm4gZS5maW5kSW5kZXgoZT0+RWUoZSx0KSl9dmFyIE9lPWU9PiEhKGUmJmUuX192X2lzUmVmPT09ITApLGs9ZT0+eShlKT9lOmU9PW51bGw/YGA6cChlKXx8eChlKSYmKGUudG9TdHJpbmc9PT1DfHwhdihlLnRvU3RyaW5nKSk/T2UoZSk/ayhlLnZhbHVlKTpKU09OLnN0cmluZ2lmeShlLGtlLDIpOlN0cmluZyhlKSxrZT0oZSx0KT0+T2UodCk/a2UoZSx0LnZhbHVlKTptKHQpP3tbYE1hcCgke3Quc2l6ZX0pYF06Wy4uLnQuZW50cmllcygpXS5yZWR1Y2UoKGUsW3Qsbl0scik9PihlW0FlKHQscikrYCA9PmBdPW4sZSkse30pfTpoKHQpP3tbYFNldCgke3Quc2l6ZX0pYF06Wy4uLnQudmFsdWVzKCldLm1hcChlPT5BZShlKSl9OmIodCk/QWUodCk6eCh0KSYmIXAodCkmJiF0ZSh0KT9TdHJpbmcodCk6dCxBZT0oZSx0PWBgKT0+YihlKT9gU3ltYm9sKCR7ZS5kZXNjcmlwdGlvbj8/dH0pYDplO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlPT1udWxsP2Bpbml0aWFsYDp0eXBlb2YgZT09YHN0cmluZ2A/ZT09PWBgP2AgYDplOlN0cmluZyhlKX12YXIgTWUsTmU9Y2xhc3N7Y29uc3RydWN0b3IoZT0hMSl7dGhpcy5kZXRhY2hlZD1lLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9vbj0wLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMuX2lzUGF1c2VkPSExLHRoaXMuX3dhcm5PblJ1bj0hMCx0aGlzLl9fdl9za2lwPSEwLCFlJiZNZSYmKE1lLmFjdGl2ZT8odGhpcy5wYXJlbnQ9TWUsdGhpcy5pbmRleD0oTWUuc2NvcGVzfHwoTWUuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKToodGhpcy5fYWN0aXZlPSExLHRoaXMuX3dhcm5PblJ1bj0hMSkpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXBhdXNlKCl7aWYodGhpcy5fYWN0aXZlKXt0aGlzLl9pc1BhdXNlZD0hMDtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucGF1c2UoKX1mb3IoZT0wLHQ9dGhpcy5lZmZlY3RzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZWZmZWN0c1tlXS5wYXVzZSgpfX1yZXN1bWUoKXtpZih0aGlzLl9hY3RpdmUmJnRoaXMuX2lzUGF1c2VkKXt0aGlzLl9pc1BhdXNlZD0hMTtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucmVzdW1lKCl9bGV0IG49dGhpcy5lZmZlY3RzLnNsaWNlKCk7Zm9yKGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspbltlXS5yZXN1bWUoKX19cnVuKGUpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IHQ9TWU7dHJ5e3JldHVybiBNZT10aGlzLGUoKX1maW5hbGx5e01lPXR9fX1vbigpeysrdGhpcy5fb249PT0xJiYodGhpcy5wcmV2U2NvcGU9TWUsTWU9dGhpcyl9b2ZmKCl7aWYodGhpcy5fb24+MCYmLS10aGlzLl9vbj09PTApe2lmKE1lPT09dGhpcylNZT10aGlzLnByZXZTY29wZTtlbHNle2xldCBlPU1lO2Zvcig7ZTspe2lmKGUucHJldlNjb3BlPT09dGhpcyl7ZS5wcmV2U2NvcGU9dGhpcy5wcmV2U2NvcGU7YnJlYWt9ZT1lLnByZXZTY29wZX19dGhpcy5wcmV2U2NvcGU9dm9pZCAwfX1zdG9wKGUpe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fYWN0aXZlPSExO2xldCB0LG47Zm9yKHQ9MCxuPXRoaXMuZWZmZWN0cy5sZW5ndGg7dDxuO3QrKyl0aGlzLmVmZmVjdHNbdF0uc3RvcCgpO2Zvcih0aGlzLmVmZmVjdHMubGVuZ3RoPTAsdD0wLG49dGhpcy5jbGVhbnVwcy5sZW5ndGg7dDxuO3QrKyl0aGlzLmNsZWFudXBzW3RdKCk7aWYodGhpcy5jbGVhbnVwcy5sZW5ndGg9MCx0aGlzLnNjb3Blcyl7bGV0IGU9dGhpcy5zY29wZXMuc2xpY2UoKTtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnN0b3AoITApO3RoaXMuc2NvcGVzLmxlbmd0aD0wfWlmKCF0aGlzLmRldGFjaGVkJiZ0aGlzLnBhcmVudCYmIWUpe2xldCBlPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtlJiZlIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1lLGUuaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwfX19O2Z1bmN0aW9uIFBlKGUpe3JldHVybiBuZXcgTmUoZSl9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gTWV9ZnVuY3Rpb24gSWUoZSx0PSExKXtNZSYmTWUuY2xlYW51cHMucHVzaChlKX12YXIgTGUsUmU9bmV3IFdlYWtTZXQsemU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5mbj1lLHRoaXMuZGVwcz12b2lkIDAsdGhpcy5kZXBzVGFpbD12b2lkIDAsdGhpcy5mbGFncz01LHRoaXMubmV4dD12b2lkIDAsdGhpcy5jbGVhbnVwPXZvaWQgMCx0aGlzLnNjaGVkdWxlcj12b2lkIDAsTWUmJihNZS5hY3RpdmU/TWUuZWZmZWN0cy5wdXNoKHRoaXMpOnRoaXMuZmxhZ3MmPS0yKX1wYXVzZSgpe3RoaXMuZmxhZ3N8PTY0fXJlc3VtZSgpe3RoaXMuZmxhZ3MmNjQmJih0aGlzLmZsYWdzJj0tNjUsUmUuaGFzKHRoaXMpJiYoUmUuZGVsZXRlKHRoaXMpLHRoaXMudHJpZ2dlcigpKSl9bm90aWZ5KCl7dGhpcy5mbGFncyYyJiYhKHRoaXMuZmxhZ3MmMzIpfHx0aGlzLmZsYWdzJjh8fFVlKHRoaXMpfXJ1bigpe2lmKCEodGhpcy5mbGFncyYxKSlyZXR1cm4gdGhpcy5mbigpO3RoaXMuZmxhZ3N8PTIsaXQodGhpcyksS2UodGhpcyk7bGV0IGU9TGUsdD1ldDtMZT10aGlzLGV0PSEwO3RyeXtyZXR1cm4gdGhpcy5mbigpfWZpbmFsbHl7cWUodGhpcyksTGU9ZSxldD10LHRoaXMuZmxhZ3MmPS0zfX1zdG9wKCl7aWYodGhpcy5mbGFncyYxKXtmb3IobGV0IGU9dGhpcy5kZXBzO2U7ZT1lLm5leHREZXApWGUoZSk7dGhpcy5kZXBzPXRoaXMuZGVwc1RhaWw9dm9pZCAwLGl0KHRoaXMpLHRoaXMub25TdG9wJiZ0aGlzLm9uU3RvcCgpLHRoaXMuZmxhZ3MmPS0yfX10cmlnZ2VyKCl7dGhpcy5mbGFncyY2ND9SZS5hZGQodGhpcyk6dGhpcy5zY2hlZHVsZXI/dGhpcy5zY2hlZHVsZXIoKTp0aGlzLnJ1bklmRGlydHkoKX1ydW5JZkRpcnR5KCl7SmUodGhpcykmJnRoaXMucnVuKCl9Z2V0IGRpcnR5KCl7cmV0dXJuIEplKHRoaXMpfX0sQmU9MCxWZSxIZTtmdW5jdGlvbiBVZShlLHQ9ITEpe2lmKGUuZmxhZ3N8PTgsdCl7ZS5uZXh0PUhlLEhlPWU7cmV0dXJufWUubmV4dD1WZSxWZT1lfWZ1bmN0aW9uIFdlKCl7QmUrK31mdW5jdGlvbiBHZSgpe2lmKC0tQmU+MClyZXR1cm47aWYoSGUpe2xldCBlPUhlO2ZvcihIZT12b2lkIDA7ZTspe2xldCB0PWUubmV4dDtlLm5leHQ9dm9pZCAwLGUuZmxhZ3MmPS05LGU9dH19bGV0IGU7Zm9yKDtWZTspe2xldCB0PVZlO2ZvcihWZT12b2lkIDA7dDspe2xldCBuPXQubmV4dDtpZih0Lm5leHQ9dm9pZCAwLHQuZmxhZ3MmPS05LHQuZmxhZ3MmMSl0cnl7dC50cmlnZ2VyKCl9Y2F0Y2godCl7ZXx8PXR9dD1ufX1pZihlKXRocm93IGV9ZnVuY3Rpb24gS2UoZSl7Zm9yKGxldCB0PWUuZGVwczt0O3Q9dC5uZXh0RGVwKXQudmVyc2lvbj0tMSx0LnByZXZBY3RpdmVMaW5rPXQuZGVwLmFjdGl2ZUxpbmssdC5kZXAuYWN0aXZlTGluaz10fWZ1bmN0aW9uIHFlKGUpe2xldCB0LG49ZS5kZXBzVGFpbCxyPW47Zm9yKDtyOyl7bGV0IGU9ci5wcmV2RGVwO3IudmVyc2lvbj09PS0xPyhyPT09biYmKG49ZSksWGUociksWmUocikpOnQ9cixyLmRlcC5hY3RpdmVMaW5rPXIucHJldkFjdGl2ZUxpbmssci5wcmV2QWN0aXZlTGluaz12b2lkIDAscj1lfWUuZGVwcz10LGUuZGVwc1RhaWw9bn1mdW5jdGlvbiBKZShlKXtmb3IobGV0IHQ9ZS5kZXBzO3Q7dD10Lm5leHREZXApaWYodC5kZXAudmVyc2lvbiE9PXQudmVyc2lvbnx8dC5kZXAuY29tcHV0ZWQmJihZZSh0LmRlcC5jb21wdXRlZCl8fHQuZGVwLnZlcnNpb24hPT10LnZlcnNpb24pKXJldHVybiEwO3JldHVybiEhZS5fZGlydHl9ZnVuY3Rpb24gWWUoZSl7aWYoZS5mbGFncyY0JiYhKGUuZmxhZ3MmMTYpfHwoZS5mbGFncyY9LTE3LGUuZ2xvYmFsVmVyc2lvbj09PWF0KXx8KGUuZ2xvYmFsVmVyc2lvbj1hdCwhZS5pc1NTUiYmZS5mbGFncyYxMjgmJighZS5kZXBzJiYhZS5fZGlydHl8fCFKZShlKSkpKXJldHVybjtlLmZsYWdzfD0yO2xldCB0PWUuZGVwLG49TGUscj1ldDtMZT1lLGV0PSEwO3RyeXtLZShlKTtsZXQgbj1lLmZuKGUuX3ZhbHVlKTsodC52ZXJzaW9uPT09MHx8RChuLGUuX3ZhbHVlKSkmJihlLmZsYWdzfD0xMjgsZS5fdmFsdWU9bix0LnZlcnNpb24rKyl9Y2F0Y2goZSl7dGhyb3cgdC52ZXJzaW9uKyssZX1maW5hbGx5e0xlPW4sZXQ9cixxZShlKSxlLmZsYWdzJj0tM319ZnVuY3Rpb24gWGUoZSx0PSExKXtsZXR7ZGVwOm4scHJldlN1YjpyLG5leHRTdWI6aX09ZTtpZihyJiYoci5uZXh0U3ViPWksZS5wcmV2U3ViPXZvaWQgMCksaSYmKGkucHJldlN1Yj1yLGUubmV4dFN1Yj12b2lkIDApLG4uc3Vicz09PWUmJihuLnN1YnM9ciwhciYmbi5jb21wdXRlZCkpe24uY29tcHV0ZWQuZmxhZ3MmPS01O2ZvcihsZXQgZT1uLmNvbXB1dGVkLmRlcHM7ZTtlPWUubmV4dERlcClYZShlLCEwKX0hdCYmIS0tbi5zYyYmbi5tYXAmJm4ubWFwLmRlbGV0ZShuLmtleSl9ZnVuY3Rpb24gWmUoZSl7bGV0e3ByZXZEZXA6dCxuZXh0RGVwOm59PWU7dCYmKHQubmV4dERlcD1uLGUucHJldkRlcD12b2lkIDApLG4mJihuLnByZXZEZXA9dCxlLm5leHREZXA9dm9pZCAwKX1mdW5jdGlvbiBRZShlLHQpe2UuZWZmZWN0IGluc3RhbmNlb2YgemUmJihlPWUuZWZmZWN0LmZuKTtsZXQgbj1uZXcgemUoZSk7dCYmbChuLHQpO3RyeXtuLnJ1bigpfWNhdGNoKGUpe3Rocm93IG4uc3RvcCgpLGV9bGV0IHI9bi5ydW4uYmluZChuKTtyZXR1cm4gci5lZmZlY3Q9bixyfWZ1bmN0aW9uICRlKGUpe2UuZWZmZWN0LnN0b3AoKX12YXIgZXQ9ITAsdHQ9W107ZnVuY3Rpb24gbnQoKXt0dC5wdXNoKGV0KSxldD0hMX1mdW5jdGlvbiBydCgpe2xldCBlPXR0LnBvcCgpO2V0PWU9PT12b2lkIDB8fGV9ZnVuY3Rpb24gaXQoZSl7bGV0e2NsZWFudXA6dH09ZTtpZihlLmNsZWFudXA9dm9pZCAwLHQpe2xldCBlPUxlO0xlPXZvaWQgMDt0cnl7dCgpfWZpbmFsbHl7TGU9ZX19fXZhciBhdD0wLG90PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zdWI9ZSx0aGlzLmRlcD10LHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5uZXh0RGVwPXRoaXMucHJldkRlcD10aGlzLm5leHRTdWI9dGhpcy5wcmV2U3ViPXRoaXMucHJldkFjdGl2ZUxpbms9dm9pZCAwfX0sc3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jb21wdXRlZD1lLHRoaXMudmVyc2lvbj0wLHRoaXMuYWN0aXZlTGluaz12b2lkIDAsdGhpcy5zdWJzPXZvaWQgMCx0aGlzLm1hcD12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMuc2M9MCx0aGlzLl9fdl9za2lwPSEwfXRyYWNrKGUpe2lmKCFMZXx8IWV0fHxMZT09PXRoaXMuY29tcHV0ZWQpcmV0dXJuO2xldCB0PXRoaXMuYWN0aXZlTGluaztpZih0PT09dm9pZCAwfHx0LnN1YiE9PUxlKXQ9dGhpcy5hY3RpdmVMaW5rPW5ldyBvdChMZSx0aGlzKSxMZS5kZXBzPyh0LnByZXZEZXA9TGUuZGVwc1RhaWwsTGUuZGVwc1RhaWwubmV4dERlcD10LExlLmRlcHNUYWlsPXQpOkxlLmRlcHM9TGUuZGVwc1RhaWw9dCxjdCh0KTtlbHNlIGlmKHQudmVyc2lvbj09PS0xJiYodC52ZXJzaW9uPXRoaXMudmVyc2lvbix0Lm5leHREZXApKXtsZXQgZT10Lm5leHREZXA7ZS5wcmV2RGVwPXQucHJldkRlcCx0LnByZXZEZXAmJih0LnByZXZEZXAubmV4dERlcD1lKSx0LnByZXZEZXA9TGUuZGVwc1RhaWwsdC5uZXh0RGVwPXZvaWQgMCxMZS5kZXBzVGFpbC5uZXh0RGVwPXQsTGUuZGVwc1RhaWw9dCxMZS5kZXBzPT09dCYmKExlLmRlcHM9ZSl9cmV0dXJuIHR9dHJpZ2dlcihlKXt0aGlzLnZlcnNpb24rKyxhdCsrLHRoaXMubm90aWZ5KGUpfW5vdGlmeShlKXtXZSgpO3RyeXtmb3IobGV0IGU9dGhpcy5zdWJzO2U7ZT1lLnByZXZTdWIpZS5zdWIubm90aWZ5KCkmJmUuc3ViLmRlcC5ub3RpZnkoKX1maW5hbGx5e0dlKCl9fX07ZnVuY3Rpb24gY3QoZSl7aWYoZS5kZXAuc2MrKyxlLnN1Yi5mbGFncyY0KXtsZXQgdD1lLmRlcC5jb21wdXRlZDtpZih0JiYhZS5kZXAuc3Vicyl7dC5mbGFnc3w9MjA7Zm9yKGxldCBlPXQuZGVwcztlO2U9ZS5uZXh0RGVwKWN0KGUpfWxldCBuPWUuZGVwLnN1YnM7biE9PWUmJihlLnByZXZTdWI9bixuJiYobi5uZXh0U3ViPWUpKSxlLmRlcC5zdWJzPWV9fXZhciBsdD1uZXcgV2Vha01hcCx1dD1TeW1ib2woYGApLGR0PVN5bWJvbChgYCksZnQ9U3ltYm9sKGBgKTtmdW5jdGlvbiBwdChlLHQsbil7aWYoZXQmJkxlKXtsZXQgdD1sdC5nZXQoZSk7dHx8bHQuc2V0KGUsdD1uZXcgTWFwKTtsZXQgcj10LmdldChuKTtyfHwodC5zZXQobixyPW5ldyBzdCksci5tYXA9dCxyLmtleT1uKSxyLnRyYWNrKCl9fWZ1bmN0aW9uIG10KGUsdCxuLHIsaSxhKXtsZXQgbz1sdC5nZXQoZSk7aWYoIW8pe2F0Kys7cmV0dXJufWxldCBzPWU9PntlJiZlLnRyaWdnZXIoKX07aWYoV2UoKSx0PT09YGNsZWFyYClvLmZvckVhY2gocyk7ZWxzZXtsZXQgaT1wKGUpLGE9aSYmVChuKTtpZihpJiZuPT09YGxlbmd0aGApe2xldCBlPU51bWJlcihyKTtvLmZvckVhY2goKHQsbik9Pnsobj09PWBsZW5ndGhgfHxuPT09ZnR8fCFiKG4pJiZuPj1lKSYmcyh0KX0pfWVsc2Ugc3dpdGNoKChuIT09dm9pZCAwfHxvLmhhcyh2b2lkIDApKSYmcyhvLmdldChuKSksYSYmcyhvLmdldChmdCkpLHQpe2Nhc2VgYWRkYDppP2EmJnMoby5nZXQoYGxlbmd0aGApKToocyhvLmdldCh1dCkpLG0oZSkmJnMoby5nZXQoZHQpKSk7YnJlYWs7Y2FzZWBkZWxldGVgOml8fChzKG8uZ2V0KHV0KSksbShlKSYmcyhvLmdldChkdCkpKTticmVhaztjYXNlYHNldGA6bShlKSYmcyhvLmdldCh1dCkpfX1HZSgpfWZ1bmN0aW9uIGh0KGUsdCl7bGV0IG49bHQuZ2V0KGUpO3JldHVybiBuJiZuLmdldCh0KX1mdW5jdGlvbiBndChlKXtsZXQgdD1BKGUpO3JldHVybiB0PT09ZT90OihwdCh0LGBpdGVyYXRlYCxmdCksYW4oZSk/dDp0Lm1hcChjbikpfWZ1bmN0aW9uIF90KGUpe3JldHVybiBwdChlPUEoZSksYGl0ZXJhdGVgLGZ0KSxlfWZ1bmN0aW9uIHZ0KGUsdCl7cmV0dXJuIHJuKGUpP2xuKG5uKGUpP2NuKHQpOnQpOmNuKHQpfXZhciB5dD17X19wcm90b19fOm51bGwsW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gYnQodGhpcyxTeW1ib2wuaXRlcmF0b3IsZT0+dnQodGhpcyxlKSl9LGNvbmNhdCguLi5lKXtyZXR1cm4gZ3QodGhpcykuY29uY2F0KC4uLmUubWFwKGU9PnAoZSk/Z3QoZSk6ZSkpfSxlbnRyaWVzKCl7cmV0dXJuIGJ0KHRoaXMsYGVudHJpZXNgLGU9PihlWzFdPXZ0KHRoaXMsZVsxXSksZSkpfSxldmVyeShlLHQpe3JldHVybiBTdCh0aGlzLGBldmVyeWAsZSx0LHZvaWQgMCxhcmd1bWVudHMpfSxmaWx0ZXIoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmlsdGVyYCxlLHQsZT0+ZS5tYXAoZT0+dnQodGhpcyxlKSksYXJndW1lbnRzKX0sZmluZChlLHQpe3JldHVybiBTdCh0aGlzLGBmaW5kYCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kSW5kZXgoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmluZEluZGV4YCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGZpbmRMYXN0KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0YCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kTGFzdEluZGV4KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0SW5kZXhgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sZm9yRWFjaChlLHQpe3JldHVybiBTdCh0aGlzLGBmb3JFYWNoYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGluY2x1ZGVzKC4uLmUpe3JldHVybiB3dCh0aGlzLGBpbmNsdWRlc2AsZSl9LGluZGV4T2YoLi4uZSl7cmV0dXJuIHd0KHRoaXMsYGluZGV4T2ZgLGUpfSxqb2luKGUpe3JldHVybiBndCh0aGlzKS5qb2luKGUpfSxsYXN0SW5kZXhPZiguLi5lKXtyZXR1cm4gd3QodGhpcyxgbGFzdEluZGV4T2ZgLGUpfSxtYXAoZSx0KXtyZXR1cm4gU3QodGhpcyxgbWFwYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LHBvcCgpe3JldHVybiBUdCh0aGlzLGBwb3BgKX0scHVzaCguLi5lKXtyZXR1cm4gVHQodGhpcyxgcHVzaGAsZSl9LHJlZHVjZShlLC4uLnQpe3JldHVybiBDdCh0aGlzLGByZWR1Y2VgLGUsdCl9LHJlZHVjZVJpZ2h0KGUsLi4udCl7cmV0dXJuIEN0KHRoaXMsYHJlZHVjZVJpZ2h0YCxlLHQpfSxzaGlmdCgpe3JldHVybiBUdCh0aGlzLGBzaGlmdGApfSxzb21lKGUsdCl7cmV0dXJuIFN0KHRoaXMsYHNvbWVgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sc3BsaWNlKC4uLmUpe3JldHVybiBUdCh0aGlzLGBzcGxpY2VgLGUpfSx0b1JldmVyc2VkKCl7cmV0dXJuIGd0KHRoaXMpLnRvUmV2ZXJzZWQoKX0sdG9Tb3J0ZWQoZSl7cmV0dXJuIGd0KHRoaXMpLnRvU29ydGVkKGUpfSx0b1NwbGljZWQoLi4uZSl7cmV0dXJuIGd0KHRoaXMpLnRvU3BsaWNlZCguLi5lKX0sdW5zaGlmdCguLi5lKXtyZXR1cm4gVHQodGhpcyxgdW5zaGlmdGAsZSl9LHZhbHVlcygpe3JldHVybiBidCh0aGlzLGB2YWx1ZXNgLGU9PnZ0KHRoaXMsZSkpfX07ZnVuY3Rpb24gYnQoZSx0LG4pe2xldCByPV90KGUpLGk9clt0XSgpO3JldHVybiByIT09ZSYmIWFuKGUpJiYoaS5fbmV4dD1pLm5leHQsaS5uZXh0PSgpPT57bGV0IGU9aS5fbmV4dCgpO3JldHVybiBlLmRvbmV8fChlLnZhbHVlPW4oZS52YWx1ZSkpLGV9KSxpfXZhciB4dD1BcnJheS5wcm90b3R5cGU7ZnVuY3Rpb24gU3QoZSx0LG4scixpLGEpe2xldCBvPV90KGUpLHM9byE9PWUmJiFhbihlKSxjPW9bdF07aWYoYyE9PXh0W3RdKXtsZXQgdD1jLmFwcGx5KGUsYSk7cmV0dXJuIHM/Y24odCk6dH1sZXQgbD1uO28hPT1lJiYocz9sPWZ1bmN0aW9uKHQscil7cmV0dXJuIG4uY2FsbCh0aGlzLHZ0KGUsdCkscixlKX06bi5sZW5ndGg+MiYmKGw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCxyLGUpfSkpO2xldCB1PWMuY2FsbChvLGwscik7cmV0dXJuIHMmJmk/aSh1KTp1fWZ1bmN0aW9uIEN0KGUsdCxuLHIpe2xldCBpPV90KGUpLGE9aSE9PWUmJiFhbihlKSxvPW4scz0hMTtpIT09ZSYmKGE/KHM9ci5sZW5ndGg9PT0wLG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBzJiYocz0hMSx0PXZ0KGUsdCkpLG4uY2FsbCh0aGlzLHQsdnQoZSxyKSxpLGUpfSk6bi5sZW5ndGg+MyYmKG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBuLmNhbGwodGhpcyx0LHIsaSxlKX0pKTtsZXQgYz1pW3RdKG8sLi4ucik7cmV0dXJuIHM/dnQoZSxjKTpjfWZ1bmN0aW9uIHd0KGUsdCxuKXtsZXQgcj1BKGUpO3B0KHIsYGl0ZXJhdGVgLGZ0KTtsZXQgaT1yW3RdKC4uLm4pO3JldHVybihpPT09LTF8fGk9PT0hMSkmJm9uKG5bMF0pPyhuWzBdPUEoblswXSksclt0XSguLi5uKSk6aX1mdW5jdGlvbiBUdChlLHQsbj1bXSl7bnQoKSxXZSgpO2xldCByPUEoZSlbdF0uYXBwbHkoZSxuKTtyZXR1cm4gR2UoKSxydCgpLHJ9dmFyIEV0PW4oYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApLER0PW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoZT0+ZSE9PWBhcmd1bWVudHNgJiZlIT09YGNhbGxlcmApLm1hcChlPT5TeW1ib2xbZV0pLmZpbHRlcihiKSk7ZnVuY3Rpb24gT3QoZSl7YihlKXx8KGU9U3RyaW5nKGUpKTtsZXQgdD1BKHRoaXMpO3JldHVybiBwdCh0LGBoYXNgLGUpLHQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGt0PWNsYXNze2NvbnN0cnVjdG9yKGU9ITEsdD0hMSl7dGhpcy5faXNSZWFkb25seT1lLHRoaXMuX2lzU2hhbGxvdz10fWdldChlLHQsbil7aWYodD09PWBfX3Zfc2tpcGApcmV0dXJuIGUuX192X3NraXA7bGV0IHI9dGhpcy5faXNSZWFkb25seSxpPXRoaXMuX2lzU2hhbGxvdztpZih0PT09YF9fdl9pc1JlYWN0aXZlYClyZXR1cm4hcjtpZih0PT09YF9fdl9pc1JlYWRvbmx5YClyZXR1cm4gcjtpZih0PT09YF9fdl9pc1NoYWxsb3dgKXJldHVybiBpO2lmKHQ9PT1gX192X3Jhd2ApcmV0dXJuIG49PT0ocj9pP1l0Okp0Omk/cXQ6S3QpLmdldChlKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pP2U6dm9pZCAwO2xldCBhPXAoZSk7aWYoIXIpe2xldCBlO2lmKGEmJihlPXl0W3RdKSlyZXR1cm4gZTtpZih0PT09YGhhc093blByb3BlcnR5YClyZXR1cm4gT3R9bGV0IG89UmVmbGVjdC5nZXQoZSx0LGooZSk/ZTpuKTtpZigoYih0KT9EdC5oYXModCk6RXQodCkpfHwocnx8cHQoZSxgZ2V0YCx0KSxpKSlyZXR1cm4gbztpZihqKG8pKXtsZXQgZT1hJiZUKHQpP286by52YWx1ZTtyZXR1cm4gciYmeChlKT8kdChlKTplfXJldHVybiB4KG8pP3I/JHQobyk6WnQobyk6b319LEF0PWNsYXNzIGV4dGVuZHMga3R7Y29uc3RydWN0b3IoZT0hMSl7c3VwZXIoITEsZSl9c2V0KGUsdCxuLHIpe2xldCBpPWVbdF0sYT1wKGUpJiZUKHQpO2lmKCF0aGlzLl9pc1NoYWxsb3cpe2xldCBlPXJuKGkpO2lmKCFhbihuKSYmIXJuKG4pJiYoaT1BKGkpLG49QShuKSksIWEmJmooaSkmJiFqKG4pKXJldHVybiBlfHwoaS52YWx1ZT1uKSwhMH1sZXQgbz1hP051bWJlcih0KTxlLmxlbmd0aDpmKGUsdCkscz1SZWZsZWN0LnNldChlLHQsbixqKGUpP2U6cik7cmV0dXJuIGU9PT1BKHIpJiZzJiYobz9EKG4saSkmJm10KGUsYHNldGAsdCxuLGkpOm10KGUsYGFkZGAsdCxuKSksc31kZWxldGVQcm9wZXJ0eShlLHQpe2xldCBuPWYoZSx0KSxyPWVbdF0saT1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsdCk7cmV0dXJuIGkmJm4mJm10KGUsYGRlbGV0ZWAsdCx2b2lkIDAsciksaX1oYXMoZSx0KXtsZXQgbj1SZWZsZWN0LmhhcyhlLHQpO3JldHVybighYih0KXx8IUR0Lmhhcyh0KSkmJnB0KGUsYGhhc2AsdCksbn1vd25LZXlzKGUpe3JldHVybiBwdChlLGBpdGVyYXRlYCxwKGUpP2BsZW5ndGhgOnV0KSxSZWZsZWN0Lm93bktleXMoZSl9fSxqdD1jbGFzcyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKGU9ITEpe3N1cGVyKCEwLGUpfXNldChlLHQpe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KGUsdCl7cmV0dXJuITB9fSxNdD1uZXcgQXQsTnQ9bmV3IGp0LFB0PW5ldyBBdCghMCksRnQ9bmV3IGp0KCEwKSxJdD1lPT5lLEx0PWU9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSk7ZnVuY3Rpb24gUnQoZSx0LG4pe3JldHVybiBmdW5jdGlvbiguLi5yKXtsZXQgaT10aGlzLl9fdl9yYXcsYT1BKGkpLG89bShhKSxzPWU9PT1gZW50cmllc2B8fGU9PT1TeW1ib2wuaXRlcmF0b3ImJm8sYz1lPT09YGtleXNgJiZvLHU9aVtlXSguLi5yKSxkPW4/SXQ6dD9sbjpjbjtyZXR1cm4hdCYmcHQoYSxgaXRlcmF0ZWAsYz9kdDp1dCksbChPYmplY3QuY3JlYXRlKHUpLHtuZXh0KCl7bGV0e3ZhbHVlOmUsZG9uZTp0fT11Lm5leHQoKTtyZXR1cm4gdD97dmFsdWU6ZSxkb25lOnR9Ont2YWx1ZTpzP1tkKGVbMF0pLGQoZVsxXSldOmQoZSksZG9uZTp0fX19KX19ZnVuY3Rpb24genQoZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLnQpe3JldHVybiBlPT09YGRlbGV0ZWA/ITE6ZT09PWBjbGVhcmA/dm9pZCAwOnRoaXN9fWZ1bmN0aW9uIEJ0KGUsdCl7bGV0IG49e2dldChuKXtsZXQgcj10aGlzLl9fdl9yYXcsaT1BKHIpLGE9QShuKTtlfHwoRChuLGEpJiZwdChpLGBnZXRgLG4pLHB0KGksYGdldGAsYSkpO2xldHtoYXM6b309THQoaSkscz10P0l0OmU/bG46Y247aWYoby5jYWxsKGksbikpcmV0dXJuIHMoci5nZXQobikpO2lmKG8uY2FsbChpLGEpKXJldHVybiBzKHIuZ2V0KGEpKTtyIT09aSYmci5nZXQobil9LGdldCBzaXplKCl7bGV0IHQ9dGhpcy5fX3ZfcmF3O3JldHVybiFlJiZwdChBKHQpLGBpdGVyYXRlYCx1dCksdC5zaXplfSxoYXModCl7bGV0IG49dGhpcy5fX3ZfcmF3LHI9QShuKSxpPUEodCk7cmV0dXJuIGV8fChEKHQsaSkmJnB0KHIsYGhhc2AsdCkscHQocixgaGFzYCxpKSksdD09PWk/bi5oYXModCk6bi5oYXModCl8fG4uaGFzKGkpfSxmb3JFYWNoKG4scil7bGV0IGk9dGhpcyxhPWkuX192X3JhdyxvPUEoYSkscz10P0l0OmU/bG46Y247cmV0dXJuIWUmJnB0KG8sYGl0ZXJhdGVgLHV0KSxhLmZvckVhY2goKGUsdCk9Pm4uY2FsbChyLHMoZSkscyh0KSxpKSl9fTtyZXR1cm4gbChuLGU/e2FkZDp6dChgYWRkYCksc2V0Onp0KGBzZXRgKSxkZWxldGU6enQoYGRlbGV0ZWApLGNsZWFyOnp0KGBjbGVhcmApfTp7YWRkKGUpe2xldCBuPUEodGhpcykscj1MdChuKSxpPUEoZSksYT0hdCYmIWFuKGUpJiYhcm4oZSk/aTplO3JldHVybiByLmhhcy5jYWxsKG4sYSl8fEQoZSxhKSYmci5oYXMuY2FsbChuLGUpfHxEKGksYSkmJnIuaGFzLmNhbGwobixpKXx8KG4uYWRkKGEpLG10KG4sYGFkZGAsYSxhKSksdGhpc30sc2V0KGUsbil7IXQmJiFhbihuKSYmIXJuKG4pJiYobj1BKG4pKTtsZXQgcj1BKHRoaXMpLHtoYXM6aSxnZXQ6YX09THQociksbz1pLmNhbGwocixlKTtvfHw9KGU9QShlKSxpLmNhbGwocixlKSk7bGV0IHM9YS5jYWxsKHIsZSk7cmV0dXJuIHIuc2V0KGUsbiksbz9EKG4scykmJm10KHIsYHNldGAsZSxuLHMpOm10KHIsYGFkZGAsZSxuKSx0aGlzfSxkZWxldGUoZSl7bGV0IHQ9QSh0aGlzKSx7aGFzOm4sZ2V0OnJ9PUx0KHQpLGk9bi5jYWxsKHQsZSk7aXx8PShlPUEoZSksbi5jYWxsKHQsZSkpO2xldCBhPXI/ci5jYWxsKHQsZSk6dm9pZCAwLG89dC5kZWxldGUoZSk7cmV0dXJuIGkmJm10KHQsYGRlbGV0ZWAsZSx2b2lkIDAsYSksb30sY2xlYXIoKXtsZXQgZT1BKHRoaXMpLHQ9ZS5zaXplIT09MCxuPWUuY2xlYXIoKTtyZXR1cm4gdCYmbXQoZSxgY2xlYXJgLHZvaWQgMCx2b2lkIDAsdm9pZCAwKSxufX0pLFtga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChyPT57bltyXT1SdChyLGUsdCl9KSxufWZ1bmN0aW9uIFZ0KGUsdCl7bGV0IG49QnQoZSx0KTtyZXR1cm4odCxyLGkpPT5yPT09YF9fdl9pc1JlYWN0aXZlYD8hZTpyPT09YF9fdl9pc1JlYWRvbmx5YD9lOnI9PT1gX192X3Jhd2A/dDpSZWZsZWN0LmdldChmKG4scikmJnIgaW4gdD9uOnQscixpKX12YXIgSHQ9e2dldDpWdCghMSwhMSl9LFV0PXtnZXQ6VnQoITEsITApfSxXdD17Z2V0OlZ0KCEwLCExKX0sR3Q9e2dldDpWdCghMCwhMCl9LEt0PW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLEp0PW5ldyBXZWFrTWFwLFl0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFh0KGUpe3N3aXRjaChlKXtjYXNlYE9iamVjdGA6Y2FzZWBBcnJheWA6cmV0dXJuIDE7Y2FzZWBNYXBgOmNhc2VgU2V0YDpjYXNlYFdlYWtNYXBgOmNhc2VgV2Vha1NldGA6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gWnQoZSl7cmV0dXJuIHJuKGUpP2U6dG4oZSwhMSxNdCxIdCxLdCl9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIHRuKGUsITEsUHQsVXQscXQpfWZ1bmN0aW9uICR0KGUpe3JldHVybiB0bihlLCEwLE50LFd0LEp0KX1mdW5jdGlvbiBlbihlKXtyZXR1cm4gdG4oZSwhMCxGdCxHdCxZdCl9ZnVuY3Rpb24gdG4oZSx0LG4scixpKXtpZigheChlKXx8ZS5fX3ZfcmF3JiYhKHQmJmUuX192X2lzUmVhY3RpdmUpfHxlLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSlyZXR1cm4gZTtsZXQgYT1pLmdldChlKTtpZihhKXJldHVybiBhO2xldCBvPVh0KGVlKGUpKTtpZihvPT09MClyZXR1cm4gZTtsZXQgcz1uZXcgUHJveHkoZSxvPT09Mj9yOm4pO3JldHVybiBpLnNldChlLHMpLHN9ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIHJuKGUpP25uKGUuX192X3Jhdyk6ISEoZSYmZS5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gcm4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZT8hIWUuX192X3JhdzohMX1mdW5jdGlvbiBBKGUpe2xldCB0PWUmJmUuX192X3JhdztyZXR1cm4gdD9BKHQpOmV9ZnVuY3Rpb24gc24oZSl7cmV0dXJuIWYoZSxgX192X3NraXBgKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmdWUoZSxgX192X3NraXBgLCEwKSxlfXZhciBjbj1lPT54KGUpP1p0KGUpOmUsbG49ZT0+eChlKT8kdChlKTplO2Z1bmN0aW9uIGooZSl7cmV0dXJuIGU/ZS5fX3ZfaXNSZWY9PT0hMDohMX1mdW5jdGlvbiBNKGUpe3JldHVybiBkbihlLCExKX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZG4oZSwhMCl9ZnVuY3Rpb24gZG4oZSx0KXtyZXR1cm4gaihlKT9lOm5ldyBmbihlLHQpfXZhciBmbj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVwPW5ldyBzdCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1NoYWxsb3c9ITEsdGhpcy5fcmF3VmFsdWU9dD9lOkEoZSksdGhpcy5fdmFsdWU9dD9lOmNuKGUpLHRoaXMuX192X2lzU2hhbGxvdz10fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLmRlcC50cmFjaygpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShlKXtsZXQgdD10aGlzLl9yYXdWYWx1ZSxuPXRoaXMuX192X2lzU2hhbGxvd3x8YW4oZSl8fHJuKGUpO2U9bj9lOkEoZSksRChlLHQpJiYodGhpcy5fcmF3VmFsdWU9ZSx0aGlzLl92YWx1ZT1uP2U6Y24oZSksdGhpcy5kZXAudHJpZ2dlcigpKX19O2Z1bmN0aW9uIHBuKGUpe2UuZGVwJiZlLmRlcC50cmlnZ2VyKCl9ZnVuY3Rpb24gTihlKXtyZXR1cm4gaihlKT9lLnZhbHVlOmV9ZnVuY3Rpb24gbW4oZSl7cmV0dXJuIHYoZSk/ZSgpOk4oZSl9dmFyIGhuPXtnZXQ6KGUsdCxuKT0+dD09PWBfX3ZfcmF3YD9lOk4oUmVmbGVjdC5nZXQoZSx0LG4pKSxzZXQ6KGUsdCxuLHIpPT57bGV0IGk9ZVt0XTtyZXR1cm4gaihpKSYmIWoobik/KGkudmFsdWU9biwhMCk6UmVmbGVjdC5zZXQoZSx0LG4scil9fTtmdW5jdGlvbiBnbihlKXtyZXR1cm4gbm4oZSk/ZTpuZXcgUHJveHkoZSxobil9dmFyIF9uPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMDtsZXQgdD10aGlzLmRlcD1uZXcgc3Qse2dldDpuLHNldDpyfT1lKHQudHJhY2suYmluZCh0KSx0LnRyaWdnZXIuYmluZCh0KSk7dGhpcy5fZ2V0PW4sdGhpcy5fc2V0PXJ9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldCgpfXNldCB2YWx1ZShlKXt0aGlzLl9zZXQoZSl9fTtmdW5jdGlvbiB2bihlKXtyZXR1cm4gbmV3IF9uKGUpfWZ1bmN0aW9uIHluKGUpe2xldCB0PXAoZSk/QXJyYXkoZS5sZW5ndGgpOnt9O2ZvcihsZXQgbiBpbiBlKXRbbl09Q24oZSxuKTtyZXR1cm4gdH12YXIgYm49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX29iamVjdD1lLHRoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9rZXk9Yih0KT90OlN0cmluZyh0KSx0aGlzLl9yYXc9QShlKTtsZXQgcj0hMCxpPWU7aWYoIXAoZSl8fGIodGhpcy5fa2V5KXx8IVQodGhpcy5fa2V5KSlkbyByPSFvbihpKXx8YW4oaSk7d2hpbGUociYmKGk9aS5fX3ZfcmF3KSk7dGhpcy5fc2hhbGxvdz1yfWdldCB2YWx1ZSgpe2xldCBlPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiB0aGlzLl9zaGFsbG93JiYoZT1OKGUpKSx0aGlzLl92YWx1ZT1lPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTplfXNldCB2YWx1ZShlKXtpZih0aGlzLl9zaGFsbG93JiZqKHRoaXMuX3Jhd1t0aGlzLl9rZXldKSl7bGV0IHQ9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07aWYoaih0KSl7dC52YWx1ZT1lO3JldHVybn19dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09ZX1nZXQgZGVwKCl7cmV0dXJuIGh0KHRoaXMuX3Jhdyx0aGlzLl9rZXkpfX0seG49Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fZ2V0dGVyPWUsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMCx0aGlzLl92YWx1ZT12b2lkIDB9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldHRlcigpfX07ZnVuY3Rpb24gU24oZSx0LG4pe3JldHVybiBqKGUpP2U6dihlKT9uZXcgeG4oZSk6eChlKSYmYXJndW1lbnRzLmxlbmd0aD4xP0NuKGUsdCxuKTpNKGUpfWZ1bmN0aW9uIENuKGUsdCxuKXtyZXR1cm4gbmV3IGJuKGUsdCxuKX12YXIgd249Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZm49ZSx0aGlzLnNldHRlcj10LHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLmRlcD1uZXcgc3QodGhpcyksdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5kZXBzPXZvaWQgMCx0aGlzLmRlcHNUYWlsPXZvaWQgMCx0aGlzLmZsYWdzPTE2LHRoaXMuZ2xvYmFsVmVyc2lvbj1hdC0xLHRoaXMubmV4dD12b2lkIDAsdGhpcy5lZmZlY3Q9dGhpcyx0aGlzLl9fdl9pc1JlYWRvbmx5PSF0LHRoaXMuaXNTU1I9bn1ub3RpZnkoKXtpZih0aGlzLmZsYWdzfD0xNiwhKHRoaXMuZmxhZ3MmOCkmJkxlIT09dGhpcylyZXR1cm4gVWUodGhpcywhMCksITB9Z2V0IHZhbHVlKCl7bGV0IGU9dGhpcy5kZXAudHJhY2soKTtyZXR1cm4gWWUodGhpcyksZSYmKGUudmVyc2lvbj10aGlzLmRlcC52ZXJzaW9uKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5zZXR0ZXImJnRoaXMuc2V0dGVyKGUpfX07ZnVuY3Rpb24gVG4oZSx0LG49ITEpe2xldCByLGk7cmV0dXJuIHYoZSk/cj1lOihyPWUuZ2V0LGk9ZS5zZXQpLG5ldyB3bihyLGksbil9dmFyIEVuPXtHRVQ6YGdldGAsSEFTOmBoYXNgLElURVJBVEU6YGl0ZXJhdGVgfSxEbj17U0VUOmBzZXRgLEFERDpgYWRkYCxERUxFVEU6YGRlbGV0ZWAsQ0xFQVI6YGNsZWFyYH0sT249e30sa249bmV3IFdlYWtNYXAsQW49dm9pZCAwO2Z1bmN0aW9uIGpuKCl7cmV0dXJuIEFufWZ1bmN0aW9uIE1uKGUsdD0hMSxuPUFuKXtpZihuKXtsZXQgdD1rbi5nZXQobik7dHx8a24uc2V0KG4sdD1bXSksdC5wdXNoKGUpfX1mdW5jdGlvbiBObihlLHQsbj1yKXtsZXR7aW1tZWRpYXRlOmksZGVlcDpvLG9uY2U6cyxzY2hlZHVsZXI6YyxhdWdtZW50Sm9iOmwsY2FsbDpkfT1uLGY9ZT0+bz9lOmFuKGUpfHxvPT09ITF8fG89PT0wP1BuKGUsMSk6UG4oZSksbSxoLGcsXyx5PSExLGI9ITE7aWYoaihlKT8oaD0oKT0+ZS52YWx1ZSx5PWFuKGUpKTpubihlKT8oaD0oKT0+ZihlKSx5PSEwKTpwKGUpPyhiPSEwLHk9ZS5zb21lKGU9Pm5uKGUpfHxhbihlKSksaD0oKT0+ZS5tYXAoZT0+e2lmKGooZSkpcmV0dXJuIGUudmFsdWU7aWYobm4oZSkpcmV0dXJuIGYoZSk7aWYodihlKSlyZXR1cm4gZD9kKGUsMik6ZSgpfSkpOmg9dihlKT90P2Q/KCk9PmQoZSwyKTplOigpPT57aWYoZyl7bnQoKTt0cnl7ZygpfWZpbmFsbHl7cnQoKX19bGV0IHQ9QW47QW49bTt0cnl7cmV0dXJuIGQ/ZChlLDMsW19dKTplKF8pfWZpbmFsbHl7QW49dH19OmEsdCYmbyl7bGV0IGU9aCx0PW89PT0hMD8xLzA6bztoPSgpPT5QbihlKCksdCl9bGV0IHg9RmUoKSxTPSgpPT57bS5zdG9wKCkseCYmeC5hY3RpdmUmJnUoeC5lZmZlY3RzLG0pfTtpZihzJiZ0KXtsZXQgZT10O3Q9KC4uLnQpPT57bGV0IG49ZSguLi50KTtyZXR1cm4gUygpLG59fWxldCBDPWI/QXJyYXkoZS5sZW5ndGgpLmZpbGwoT24pOk9uLHc9ZT0+e2lmKCEoIShtLmZsYWdzJjEpfHwhbS5kaXJ0eSYmIWUpKXtpZih0KXtsZXQgbj1tLnJ1bigpO2lmKGV8fG98fHl8fChiP24uc29tZSgoZSx0KT0+RChlLENbdF0pKTpEKG4sQykpKXtnJiZnKCk7bGV0IGU9QW47QW49bTt0cnl7bGV0IGU9W24sQz09PU9uP3ZvaWQgMDpiJiZDWzBdPT09T24/W106QyxfXTtDPW4sZD9kKHQsMyxlKTp0KC4uLmUpfWZpbmFsbHl7QW49ZX19fWVsc2UgbS5ydW4oKX19O3JldHVybiBsJiZsKHcpLG09bmV3IHplKGgpLG0uc2NoZWR1bGVyPWM/KCk9PmModywhMSk6dyxfPWU9Pk1uKGUsITEsbSksZz1tLm9uU3RvcD0oKT0+e2xldCBlPWtuLmdldChtKTtpZihlKXtpZihkKWQoZSw0KTtlbHNlIGZvcihsZXQgdCBvZiBlKXQoKTtrbi5kZWxldGUobSl9fSx0P2k/dyghMCk6Qz1tLnJ1bigpOmM/Yyh3LmJpbmQobnVsbCwhMCksITApOm0ucnVuKCksUy5wYXVzZT1tLnBhdXNlLmJpbmQobSksUy5yZXN1bWU9bS5yZXN1bWUuYmluZChtKSxTLnN0b3A9UyxTfWZ1bmN0aW9uIFBuKGUsdD0xLzAsbil7aWYodDw9MHx8IXgoZSl8fGUuX192X3NraXB8fChufHw9bmV3IE1hcCwobi5nZXQoZSl8fDApPj10KSlyZXR1cm4gZTtpZihuLnNldChlLHQpLHQtLSxqKGUpKVBuKGUudmFsdWUsdCxuKTtlbHNlIGlmKHAoZSkpZm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspUG4oZVtyXSx0LG4pO2Vsc2UgaWYoaChlKXx8bShlKSllLmZvckVhY2goZT0+e1BuKGUsdCxuKX0pO2Vsc2UgaWYodGUoZSkpe2ZvcihsZXQgciBpbiBlKVBuKGVbcl0sdCxuKTtmb3IobGV0IHIgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSlPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmUG4oZVtyXSx0LG4pfXJldHVybiBlfXZhciBGbj1bXTtmdW5jdGlvbiBJbihlKXtGbi5wdXNoKGUpfWZ1bmN0aW9uIExuKCl7Rm4ucG9wKCl9ZnVuY3Rpb24gUm4oZSx0KXt9dmFyIHpuPXtTRVRVUF9GVU5DVElPTjowLDA6YFNFVFVQX0ZVTkNUSU9OYCxSRU5ERVJfRlVOQ1RJT046MSwxOmBSRU5ERVJfRlVOQ1RJT05gLE5BVElWRV9FVkVOVF9IQU5ETEVSOjUsNTpgTkFUSVZFX0VWRU5UX0hBTkRMRVJgLENPTVBPTkVOVF9FVkVOVF9IQU5ETEVSOjYsNjpgQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJgLFZOT0RFX0hPT0s6Nyw3OmBWTk9ERV9IT09LYCxESVJFQ1RJVkVfSE9PSzo4LDg6YERJUkVDVElWRV9IT09LYCxUUkFOU0lUSU9OX0hPT0s6OSw5OmBUUkFOU0lUSU9OX0hPT0tgLEFQUF9FUlJPUl9IQU5ETEVSOjEwLDEwOmBBUFBfRVJST1JfSEFORExFUmAsQVBQX1dBUk5fSEFORExFUjoxMSwxMTpgQVBQX1dBUk5fSEFORExFUmAsRlVOQ1RJT05fUkVGOjEyLDEyOmBGVU5DVElPTl9SRUZgLEFTWU5DX0NPTVBPTkVOVF9MT0FERVI6MTMsMTM6YEFTWU5DX0NPTVBPTkVOVF9MT0FERVJgLFNDSEVEVUxFUjoxNCwxNDpgU0NIRURVTEVSYCxDT01QT05FTlRfVVBEQVRFOjE1LDE1OmBDT01QT05FTlRfVVBEQVRFYCxBUFBfVU5NT1VOVF9DTEVBTlVQOjE2LDE2OmBBUFBfVU5NT1VOVF9DTEVBTlVQYH0sQm49e3NwOmBzZXJ2ZXJQcmVmZXRjaCBob29rYCxiYzpgYmVmb3JlQ3JlYXRlIGhvb2tgLGM6YGNyZWF0ZWQgaG9va2AsYm06YGJlZm9yZU1vdW50IGhvb2tgLG06YG1vdW50ZWQgaG9va2AsYnU6YGJlZm9yZVVwZGF0ZSBob29rYCx1OmB1cGRhdGVkYCxidW06YGJlZm9yZVVubW91bnQgaG9va2AsdW06YHVubW91bnRlZCBob29rYCxhOmBhY3RpdmF0ZWQgaG9va2AsZGE6YGRlYWN0aXZhdGVkIGhvb2tgLGVjOmBlcnJvckNhcHR1cmVkIGhvb2tgLHJ0YzpgcmVuZGVyVHJhY2tlZCBob29rYCxydGc6YHJlbmRlclRyaWdnZXJlZCBob29rYCwwOmBzZXR1cCBmdW5jdGlvbmAsMTpgcmVuZGVyIGZ1bmN0aW9uYCwyOmB3YXRjaGVyIGdldHRlcmAsMzpgd2F0Y2hlciBjYWxsYmFja2AsNDpgd2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uYCw1OmBuYXRpdmUgZXZlbnQgaGFuZGxlcmAsNjpgY29tcG9uZW50IGV2ZW50IGhhbmRsZXJgLDc6YHZub2RlIGhvb2tgLDg6YGRpcmVjdGl2ZSBob29rYCw5OmB0cmFuc2l0aW9uIGhvb2tgLDEwOmBhcHAgZXJyb3JIYW5kbGVyYCwxMTpgYXBwIHdhcm5IYW5kbGVyYCwxMjpgcmVmIGZ1bmN0aW9uYCwxMzpgYXN5bmMgY29tcG9uZW50IGxvYWRlcmAsMTQ6YHNjaGVkdWxlciBmbHVzaGAsMTU6YGNvbXBvbmVudCB1cGRhdGVgLDE2OmBhcHAgdW5tb3VudCBjbGVhbnVwIGZ1bmN0aW9uYH07ZnVuY3Rpb24gVm4oZSx0LG4scil7dHJ5e3JldHVybiByP2UoLi4ucik6ZSgpfWNhdGNoKGUpe1VuKGUsdCxuKX19ZnVuY3Rpb24gSG4oZSx0LG4scil7aWYodihlKSl7bGV0IGk9Vm4oZSx0LG4scik7cmV0dXJuIGkmJlMoaSkmJmkuY2F0Y2goZT0+e1VuKGUsdCxuKX0pLGl9aWYocChlKSl7bGV0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspaS5wdXNoKEhuKGVbYV0sdCxuLHIpKTtyZXR1cm4gaX19ZnVuY3Rpb24gVW4oZSx0LG4saT0hMCl7bGV0IGE9dD90LnZub2RlOm51bGwse2Vycm9ySGFuZGxlcjpvLHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb246c309dCYmdC5hcHBDb250ZXh0LmNvbmZpZ3x8cjtpZih0KXtsZXQgcj10LnBhcmVudCxpPXQucHJveHksYT1gaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSR7bn1gO2Zvcig7cjspe2xldCB0PXIuZWM7aWYodCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXShlLGksYSk9PT0hMSlyZXR1cm59cj1yLnBhcmVudH1pZihvKXtudCgpLFZuKG8sbnVsbCwxMCxbZSxpLGFdKSxydCgpO3JldHVybn19V24oZSxuLGEsaSxzKX1mdW5jdGlvbiBXbihlLHQsbixyPSEwLGk9ITEpe2lmKGkpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBHbj1bXSxLbj0tMSxxbj1bXSxKbj1udWxsLFluPTAsWG49UHJvbWlzZS5yZXNvbHZlKCksWm49bnVsbDtmdW5jdGlvbiBRbihlKXtsZXQgdD1abnx8WG47cmV0dXJuIGU/dC50aGVuKHRoaXM/ZS5iaW5kKHRoaXMpOmUpOnR9ZnVuY3Rpb24gJG4oZSl7bGV0IHQ9S24rMSxuPUduLmxlbmd0aDtmb3IoO3Q8bjspe2xldCByPXQrbj4+PjEsaT1HbltyXSxhPWFyKGkpO2E8ZXx8YT09PWUmJmkuZmxhZ3MmMj90PXIrMTpuPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gZXIoZSl7aWYoIShlLmZsYWdzJjEpKXtsZXQgdD1hcihlKSxuPUduW0duLmxlbmd0aC0xXTshbnx8IShlLmZsYWdzJjIpJiZ0Pj1hcihuKT9Hbi5wdXNoKGUpOkduLnNwbGljZSgkbih0KSwwLGUpLGUuZmxhZ3N8PTEsdHIoKX19ZnVuY3Rpb24gdHIoKXtabnx8PVhuLnRoZW4ob3IpfWZ1bmN0aW9uIG5yKGUpe2lmKCFwKGUpKUpuJiZlLmlkPT09LTE/Sm4uc3BsaWNlKFluKzEsMCxlKTplLmZsYWdzJjF8fChxbi5wdXNoKGUpLGUuZmxhZ3N8PTEpO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspcW4ucHVzaChlW3RdKTt0cigpfWZ1bmN0aW9uIHJyKGUsdCxuPUtuKzEpe2Zvcig7bjxHbi5sZW5ndGg7bisrKXtsZXQgdD1HbltuXTtpZih0JiZ0LmZsYWdzJjIpe2lmKGUmJnQuaWQhPT1lLnVpZCljb250aW51ZTtHbi5zcGxpY2UobiwxKSxuLS0sdC5mbGFncyY0JiYodC5mbGFncyY9LTIpLHQoKSx0LmZsYWdzJjR8fCh0LmZsYWdzJj0tMil9fX1mdW5jdGlvbiBpcihlKXtpZihxbi5sZW5ndGgpe2xldCBlPVsuLi5uZXcgU2V0KHFuKV0uc29ydCgoZSx0KT0+YXIoZSktYXIodCkpO2lmKHFuLmxlbmd0aD0wLEpuKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylKbi5wdXNoKGVbdF0pO3JldHVybn1mb3IoSm49ZSxZbj0wO1luPEpuLmxlbmd0aDtZbisrKXtsZXQgZT1KbltZbl07ZS5mbGFncyY0JiYoZS5mbGFncyY9LTIpLGUuZmxhZ3MmOHx8ZSgpLGUuZmxhZ3MmPS0yfUpuPW51bGwsWW49MH19dmFyIGFyPWU9PmUuaWQ9PW51bGw/ZS5mbGFncyYyPy0xOjEvMDplLmlkO2Z1bmN0aW9uIG9yKGUpe3RyeXtmb3IoS249MDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJiEoZS5mbGFncyY4KSYmKGUuZmxhZ3MmNCYmKGUuZmxhZ3MmPS0yKSxWbihlLGUuaSxlLmk/MTU6MTQpLGUuZmxhZ3MmNHx8KGUuZmxhZ3MmPS0yKSl9fWZpbmFsbHl7Zm9yKDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJihlLmZsYWdzJj0tMil9S249LTEsR24ubGVuZ3RoPTAsaXIoZSksWm49bnVsbCwoR24ubGVuZ3RofHxxbi5sZW5ndGgpJiZvcihlKX19dmFyIHNyLGNyPVtdO2Z1bmN0aW9uIGxyKGUsdCl7c3I9ZSxzcj8oc3IuZW5hYmxlZD0hMCxjci5mb3JFYWNoKCh7ZXZlbnQ6ZSxhcmdzOnR9KT0+c3IuZW1pdChlLC4uLnQpKSxjcj1bXSk6dHlwZW9mIHdpbmRvdzxgdWAmJndpbmRvdy5IVE1MRWxlbWVudCYmISh3aW5kb3cubmF2aWdhdG9yPy51c2VyQWdlbnQpPy5pbmNsdWRlcyhganNkb21gKT8oKHQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz10Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdKS5wdXNoKGU9PntscihlLHQpfSksc2V0VGltZW91dCgoKT0+e3NyfHwodC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsY3I9W10pfSwzZTMpKTpjcj1bXX12YXIgdXI9bnVsbCxkcj1udWxsO2Z1bmN0aW9uIGZyKGUpe2xldCB0PXVyO3JldHVybiB1cj1lLGRyPWUmJmUudHlwZS5fX3Njb3BlSWR8fG51bGwsdH1mdW5jdGlvbiBwcihlKXtkcj1lfWZ1bmN0aW9uIG1yKCl7ZHI9bnVsbH12YXIgaHI9ZT0+UDtmdW5jdGlvbiBQKGUsdD11cixuKXtpZighdHx8ZS5fbilyZXR1cm4gZTtsZXQgcj0oLi4ubik9PntyLl9kJiZtcygtMSk7bGV0IGk9ZnIodCksYT11cy5sZW5ndGgsbzt0cnl7bz1lKC4uLm4pfWZpbmFsbHl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPmE7ZS0tKWZzKCk7ZnIoaSksci5fZCYmbXMoMSl9cmV0dXJuIG99O3JldHVybiByLl9uPSEwLHIuX2M9ITAsci5fZD0hMCxyfWZ1bmN0aW9uIGdyKGUsdCl7aWYodXI9PT1udWxsKXJldHVybiBlO2xldCBuPVFzKHVyKSxpPWUuZGlyc3x8PVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXRbYSxvLHMsYz1yXT10W2VdO2EmJih2KGEpJiYoYT17bW91bnRlZDphLHVwZGF0ZWQ6YX0pLGEuZGVlcCYmUG4obyksaS5wdXNoKHtkaXI6YSxpbnN0YW5jZTpuLHZhbHVlOm8sb2xkVmFsdWU6dm9pZCAwLGFyZzpzLG1vZGlmaWVyczpjfSkpfXJldHVybiBlfWZ1bmN0aW9uIF9yKGUsdCxuLHIpe2xldCBpPWUuZGlycyxhPXQmJnQuZGlycztmb3IobGV0IG89MDtvPGkubGVuZ3RoO28rKyl7bGV0IHM9aVtvXTthJiYocy5vbGRWYWx1ZT1hW29dLnZhbHVlKTtsZXQgYz1zLmRpcltyXTtjJiYobnQoKSxIbihjLG4sOCxbZS5lbCxzLGUsdF0pLHJ0KCkpfX1mdW5jdGlvbiB2cihlLHQpe2lmKFBzKXtsZXQgbj1Qcy5wcm92aWRlcyxyPVBzLnBhcmVudCYmUHMucGFyZW50LnByb3ZpZGVzO3I9PT1uJiYobj1Qcy5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHIpKSxuW2VdPXR9fWZ1bmN0aW9uIHlyKGUsdCxuPSExKXtsZXQgcj1GcygpO2lmKHJ8fG5vKXtsZXQgaT1ubz9uby5fY29udGV4dC5wcm92aWRlczpyP3IucGFyZW50PT1udWxsfHxyLmNlP3Iudm5vZGUuYXBwQ29udGV4dCYmci52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnIucGFyZW50LnByb3ZpZGVzOnZvaWQgMDtpZihpJiZlIGluIGkpcmV0dXJuIGlbZV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBuJiZ2KHQpP3QuY2FsbChyJiZyLnByb3h5KTp0fX1mdW5jdGlvbiBicigpe3JldHVybiEhKEZzKCl8fG5vKX12YXIgeHI9U3ltYm9sLmZvcihgdi1zY3hgKSxTcj0oKT0+eXIoeHIpO2Z1bmN0aW9uIENyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx0KX1mdW5jdGlvbiB3cihlLHQpe3JldHVybiBEcihlLG51bGwse2ZsdXNoOmBwb3N0YH0pfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx7Zmx1c2g6YHN5bmNgfSl9ZnVuY3Rpb24gRXIoZSx0LG4pe3JldHVybiBEcihlLHQsbil9ZnVuY3Rpb24gRHIoZSx0LG49cil7bGV0e2ltbWVkaWF0ZTppLGRlZXA6byxmbHVzaDpzLG9uY2U6Y309bix1PWwoe30sbiksZD10JiZpfHwhdCYmcyE9PWBwb3N0YCxmO2lmKFZzKXtpZihzPT09YHN5bmNgKXtsZXQgZT1TcigpO2Y9ZS5fX3dhdGNoZXJIYW5kbGVzfHw9W119ZWxzZSBpZighZCl7bGV0IGU9KCk9Pnt9O3JldHVybiBlLnN0b3A9YSxlLnJlc3VtZT1hLGUucGF1c2U9YSxlfX1sZXQgcD1Qczt1LmNhbGw9KGUsdCxuKT0+SG4oZSxwLHQsbik7bGV0IG09ITE7cz09PWBwb3N0YD91LnNjaGVkdWxlcj1lPT57SW8oZSxwJiZwLnN1c3BlbnNlKX06cyE9PWBzeW5jYCYmKG09ITAsdS5zY2hlZHVsZXI9KGUsdCk9Pnt0P2UoKTplcihlKX0pLHUuYXVnbWVudEpvYj1lPT57dCYmKGUuZmxhZ3N8PTQpLG0mJihlLmZsYWdzfD0yLHAmJihlLmlkPXAudWlkLGUuaT1wKSl9O2xldCBoPU5uKGUsdCx1KTtyZXR1cm4gVnMmJihmP2YucHVzaChoKTpkJiZoKCkpLGh9ZnVuY3Rpb24gT3IoZSx0LG4pe2xldCByPXRoaXMucHJveHksaT15KGUpP2UuaW5jbHVkZXMoYC5gKT9rcihyLGUpOigpPT5yW2VdOmUuYmluZChyLHIpLGE7dih0KT9hPXQ6KGE9dC5oYW5kbGVyLG49dCk7bGV0IG89UnModGhpcykscz1EcihpLGEuYmluZChyKSxuKTtyZXR1cm4gbygpLHN9ZnVuY3Rpb24ga3IoZSx0KXtsZXQgbj10LnNwbGl0KGAuYCk7cmV0dXJuKCk9PntsZXQgdD1lO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGgmJnQ7ZSsrKXQ9dFtuW2VdXTtyZXR1cm4gdH19dmFyIEFyPW5ldyBXZWFrTWFwLGpyPVN5bWJvbChgX3Z0ZWApLE1yPWU9PmUuX19pc1RlbGVwb3J0LE5yPWU9PmUmJihlLmRpc2FibGVkfHxlLmRpc2FibGVkPT09YGApLFByPWU9PmUmJihlLmRlZmVyfHxlLmRlZmVyPT09YGApLEZyPWU9PnR5cGVvZiBTVkdFbGVtZW50PGB1YCYmZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsSXI9ZT0+dHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50LExyPShlLHQpPT57bGV0IG49ZSYmZS50bztyZXR1cm4geShuKT90P3Qobik6bnVsbDpufSxScj17bmFtZTpgVGVsZXBvcnRgLF9faXNUZWxlcG9ydDohMCxwcm9jZXNzKGUsdCxuLHIsaSxhLG8scyxjLGwpe2xldHttYzp1LHBjOmQscGJjOmYsbzp7aW5zZXJ0OnAscXVlcnlTZWxlY3RvcjptLGNyZWF0ZVRleHQ6aCxjcmVhdGVDb21tZW50OmcscGFyZW50Tm9kZTpffX09bCx2PU5yKHQucHJvcHMpLHtkeW5hbWljQ2hpbGRyZW46eX09dCxiPShlLHQsbik9PntlLnNoYXBlRmxhZyYxNiYmdShlLmNoaWxkcmVuLHQsbixpLGEsbyxzLGMpfSx4PShlPXQpPT57bGV0IG49TnIoZS5wcm9wcykscj1lLnRhcmdldD1McihlLnByb3BzLG0pLGE9VXIocixlLGgscCk7ciYmKG8hPT1gc3ZnYCYmRnIocik/bz1gc3ZnYDpvIT09YG1hdGhtbGAmJklyKHIpJiYobz1gbWF0aG1sYCksaSYmaS5pc0NFJiYoaS5jZS5fdGVsZXBvcnRUYXJnZXRzfHwoaS5jZS5fdGVsZXBvcnRUYXJnZXRzPW5ldyBTZXQpKS5hZGQociksbnx8KGIoZSxyLGEpLEhyKGUsITEpKSl9LFM9ZT0+e2xldCB0PSgpPT57aWYoQXIuZ2V0KGUpPT09dCl7aWYoQXIuZGVsZXRlKGUpLE5yKGUucHJvcHMpKXtsZXQgdD1fKGUuZWwpfHxuO2IoZSx0LGUuYW5jaG9yKSxIcihlLCEwKX14KGUpfX07QXIuc2V0KGUsdCksSW8odCxhKX07aWYoZT09bnVsbCl7bGV0IGU9dC5lbD1oKGBgKSxpPXQuYW5jaG9yPWgoYGApO2lmKHAoZSxuLHIpLHAoaSxuLHIpLFByKHQucHJvcHMpfHxhJiZhLnBlbmRpbmdCcmFuY2gpe1ModCk7cmV0dXJufXYmJihiKHQsbixpKSxIcih0LCEwKSkseCgpfWVsc2V7dC5lbD1lLmVsO2xldCByPXQuYW5jaG9yPWUuYW5jaG9yLHU9QXIuZ2V0KGUpO2lmKHUpe3UuZmxhZ3N8PTgsQXIuZGVsZXRlKGUpLFModCk7cmV0dXJufXQudGFyZ2V0U3RhcnQ9ZS50YXJnZXRTdGFydDtsZXQgcD10LnRhcmdldD1lLnRhcmdldCxoPXQudGFyZ2V0QW5jaG9yPWUudGFyZ2V0QW5jaG9yLGc9TnIoZS5wcm9wcyksXz1nP246cCxiPWc/cjpoO2lmKG89PT1gc3ZnYHx8RnIocCk/bz1gc3ZnYDoobz09PWBtYXRobWxgfHxJcihwKSkmJihvPWBtYXRobWxgKSx5PyhmKGUuZHluYW1pY0NoaWxkcmVuLHksXyxpLGEsbyxzKSxVbyhlLHQsITApKTpjfHxkKGUsdCxfLGIsaSxhLG8scywhMSksdilnP3QucHJvcHMmJmUucHJvcHMmJnQucHJvcHMudG8hPT1lLnByb3BzLnRvJiYodC5wcm9wcy50bz1lLnByb3BzLnRvKTp6cih0LG4scixsLDEpO2Vsc2UgaWYoKHQucHJvcHMmJnQucHJvcHMudG8pIT09KGUucHJvcHMmJmUucHJvcHMudG8pKXtsZXQgZT1Mcih0LnByb3BzLG0pO2UmJih0LnRhcmdldD1lLHpyKHQsZSxudWxsLGwsMCkpfWVsc2UgZyYmenIodCxwLGgsbCwxKTtIcih0LHYpfX0scmVtb3ZlKGUsdCxuLHt1bTpyLG86e3JlbW92ZTppfX0sYSl7bGV0e3NoYXBlRmxhZzpvLGNoaWxkcmVuOnMsYW5jaG9yOmMsdGFyZ2V0U3RhcnQ6bCx0YXJnZXRBbmNob3I6dSx0YXJnZXQ6ZCxwcm9wczpmfT1lLHA9TnIoZiksbT1hfHwhcCxoPUFyLmdldChlKTtpZihoJiYoaC5mbGFnc3w9OCxBci5kZWxldGUoZSkpLGQmJihpKGwpLGkodSkpLGEmJmkoYyksIWgmJihwfHxkKSYmbyYxNilmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IGk9c1tlXTtyKGksdCxuLG0sISFpLmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOnpyLGh5ZHJhdGU6QnJ9O2Z1bmN0aW9uIHpyKGUsdCxuLHtvOntpbnNlcnQ6cn0sbTppfSxhPTIpe2E9PT0wJiZyKGUudGFyZ2V0QW5jaG9yLHQsbik7bGV0e2VsOm8sYW5jaG9yOnMsc2hhcGVGbGFnOmMsY2hpbGRyZW46bCxwcm9wczp1fT1lLGQ9YT09PTI7aWYoZCYmcihvLHQsbiksIUFyLmhhcyhlKSYmKCFkfHxOcih1KSkmJmMmMTYpZm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaShsW2VdLHQsbiwyKTtkJiZyKHMsdCxuKX1mdW5jdGlvbiBCcihlLHQsbixyLGksYSx7bzp7bmV4dFNpYmxpbmc6byxwYXJlbnROb2RlOnMscXVlcnlTZWxlY3RvcjpjLGluc2VydDpsLGNyZWF0ZVRleHQ6dX19LGQpe2Z1bmN0aW9uIGYoZSxuKXtsZXQgcj1uO2Zvcig7cjspe2lmKHImJnIubm9kZVR5cGU9PT04KXtpZihyLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnQgYW5jaG9yYCl0LnRhcmdldFN0YXJ0PXI7ZWxzZSBpZihyLmRhdGE9PT1gdGVsZXBvcnQgYW5jaG9yYCl7dC50YXJnZXRBbmNob3I9cixlLl9scGE9dC50YXJnZXRBbmNob3ImJm8odC50YXJnZXRBbmNob3IpO2JyZWFrfX1yPW8ocil9fWZ1bmN0aW9uIHAoZSx0KXt0LmFuY2hvcj1kKG8oZSksdCxzKGUpLG4scixpLGEpfWxldCBtPXQudGFyZ2V0PUxyKHQucHJvcHMsYyksaD1Ocih0LnByb3BzKTtpZihtKXtsZXQgYz1tLl9scGF8fG0uZmlyc3RDaGlsZDt0LnNoYXBlRmxhZyYxNiYmKGg/KHAoZSx0KSxmKG0sYyksdC50YXJnZXRBbmNob3J8fFVyKG0sdCx1LGwscyhlKT09PW0/ZTpudWxsKSk6KHQuYW5jaG9yPW8oZSksZihtLGMpLHQudGFyZ2V0QW5jaG9yfHxVcihtLHQsdSxsKSxkKGMmJm8oYyksdCxtLG4scixpLGEpKSksSHIodCxoKX1lbHNlIGgmJnQuc2hhcGVGbGFnJjE2JiYocChlLHQpLHQudGFyZ2V0U3RhcnQ9ZSx0LnRhcmdldEFuY2hvcj1vKGUpKTtyZXR1cm4gdC5hbmNob3ImJm8odC5hbmNob3IpfXZhciBWcj1ScjtmdW5jdGlvbiBIcihlLHQpe2xldCBuPWUuY3R4O2lmKG4mJm4udXQpe2xldCByLGk7Zm9yKHQ/KHI9ZS5lbCxpPWUuYW5jaG9yKToocj1lLnRhcmdldFN0YXJ0LGk9ZS50YXJnZXRBbmNob3IpO3ImJnIhPT1pOylyLm5vZGVUeXBlPT09MSYmci5zZXRBdHRyaWJ1dGUoYGRhdGEtdi1vd25lcmAsbi51aWQpLHI9ci5uZXh0U2libGluZztuLnV0KCl9fWZ1bmN0aW9uIFVyKGUsdCxuLHIsaT1udWxsKXtsZXQgYT10LnRhcmdldFN0YXJ0PW4oYGApLG89dC50YXJnZXRBbmNob3I9bihgYCk7cmV0dXJuIGFbanJdPW8sZSYmKHIoYSxlLGkpLHIobyxlLGkpKSxvfXZhciBXcj1TeW1ib2woYF9sZWF2ZUNiYCksR3I9U3ltYm9sKGBfZW50ZXJDYmApO2Z1bmN0aW9uIEtyKCl7bGV0IGU9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIFppKCgpPT57ZS5pc01vdW50ZWQ9ITB9KSxlYSgoKT0+e2UuaXNVbm1vdW50aW5nPSEwfSksZX12YXIgcXI9W0Z1bmN0aW9uLEFycmF5XSxKcj17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpxcixvbkVudGVyOnFyLG9uQWZ0ZXJFbnRlcjpxcixvbkVudGVyQ2FuY2VsbGVkOnFyLG9uQmVmb3JlTGVhdmU6cXIsb25MZWF2ZTpxcixvbkFmdGVyTGVhdmU6cXIsb25MZWF2ZUNhbmNlbGxlZDpxcixvbkJlZm9yZUFwcGVhcjpxcixvbkFwcGVhcjpxcixvbkFmdGVyQXBwZWFyOnFyLG9uQXBwZWFyQ2FuY2VsbGVkOnFyfSxZcj1lPT57bGV0IHQ9ZS5zdWJUcmVlO3JldHVybiB0LmNvbXBvbmVudD9Zcih0LmNvbXBvbmVudCk6dH0sWHI9e25hbWU6YEJhc2VUcmFuc2l0aW9uYCxwcm9wczpKcixzZXR1cChlLHtzbG90czp0fSl7bGV0IG49RnMoKSxyPUtyKCk7cmV0dXJuKCk9PntsZXQgaT10LmRlZmF1bHQmJmlpKHQuZGVmYXVsdCgpLCEwKSxhPWkmJmkubGVuZ3RoP1pyKGkpOm4uc3ViVHJlZT9UcygpOnZvaWQgMDtpZighYSlyZXR1cm47bGV0IG89QShlKSx7bW9kZTpzfT1vO2lmKHIuaXNMZWF2aW5nKXJldHVybiB0aShhKTtsZXQgYz1uaShhKTtpZighYylyZXR1cm4gdGkoYSk7bGV0IGw9ZWkoYyxvLHIsbixlPT5sPWUpO2MudHlwZSE9PWNzJiZyaShjLGwpO2xldCB1PW4uc3ViVHJlZSYmbmkobi5zdWJUcmVlKTtpZih1JiZ1LnR5cGUhPT1jcyYmIV9zKHUsYykmJllyKG4pLnR5cGUhPT1jcyl7bGV0IGU9ZWkodSxvLHIsbik7aWYocmkodSxlKSxzPT09YG91dC1pbmAmJmMudHlwZSE9PWNzKXJldHVybiByLmlzTGVhdmluZz0hMCxlLmFmdGVyTGVhdmU9KCk9PntyLmlzTGVhdmluZz0hMSxuLmpvYi5mbGFncyY4fHxuLnVwZGF0ZSgpLGRlbGV0ZSBlLmFmdGVyTGVhdmUsdT12b2lkIDB9LHRpKGEpO3M9PT1gaW4tb3V0YCYmYy50eXBlIT09Y3M/ZS5kZWxheUxlYXZlPShlLHQsbik9PntsZXQgaT0kcihyLHUpO2lbU3RyaW5nKHUua2V5KV09dSxlW1dyXT0oKT0+e3QoKSxlW1dyXT12b2lkIDAsZGVsZXRlIGwuZGVsYXllZExlYXZlLHU9dm9pZCAwfSxsLmRlbGF5ZWRMZWF2ZT0oKT0+e24oKSxkZWxldGUgbC5kZWxheWVkTGVhdmUsdT12b2lkIDB9fTp1PXZvaWQgMH1lbHNlIHUmJj12b2lkIDA7cmV0dXJuIGF9fX07ZnVuY3Rpb24gWnIoZSl7bGV0IHQ9ZVswXTtpZihlLmxlbmd0aD4xKXtmb3IobGV0IG4gb2YgZSlpZihuLnR5cGUhPT1jcyl7dD1uO2JyZWFrfX1yZXR1cm4gdH12YXIgUXI9WHI7ZnVuY3Rpb24gJHIoZSx0KXtsZXR7bGVhdmluZ1ZOb2RlczpufT1lLHI9bi5nZXQodC50eXBlKTtyZXR1cm4gcnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuLnNldCh0LnR5cGUscikpLHJ9ZnVuY3Rpb24gZWkoZSx0LG4scixpKXtsZXR7YXBwZWFyOmEsbW9kZTpvLHBlcnNpc3RlZDpzPSExLG9uQmVmb3JlRW50ZXI6YyxvbkVudGVyOmwsb25BZnRlckVudGVyOnUsb25FbnRlckNhbmNlbGxlZDpkLG9uQmVmb3JlTGVhdmU6ZixvbkxlYXZlOm0sb25BZnRlckxlYXZlOmgsb25MZWF2ZUNhbmNlbGxlZDpnLG9uQmVmb3JlQXBwZWFyOl8sb25BcHBlYXI6dixvbkFmdGVyQXBwZWFyOnksb25BcHBlYXJDYW5jZWxsZWQ6Yn09dCx4PVN0cmluZyhlLmtleSksUz0kcihuLGUpLEM9KGUsdCk9PntlJiZIbihlLHIsOSx0KX0sdz0oZSx0KT0+e2xldCBuPXRbMV07QyhlLHQpLHAoZSk/ZS5ldmVyeShlPT5lLmxlbmd0aDw9MSkmJm4oKTplLmxlbmd0aDw9MSYmbigpfSxlZT17bW9kZTpvLHBlcnNpc3RlZDpzLGJlZm9yZUVudGVyKHQpe2xldCByPWM7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9X3x8YztlbHNlIHJldHVybn10W1dyXSYmdFtXcl0oITApO2xldCBpPVNbeF07aSYmX3MoZSxpKSYmaS5lbFtXcl0mJmkuZWxbV3JdKCksQyhyLFt0XSl9LGVudGVyKHQpe2lmKFNbeF09PT1lKXJldHVybjtsZXQgcj1sLGk9dSxvPWQ7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9dnx8bCxpPXl8fHUsbz1ifHxkO2Vsc2UgcmV0dXJufWxldCBzPSExO3RbR3JdPWU9PntzfHwocz0hMCxDKGU/bzppLFt0XSksZWUuZGVsYXllZExlYXZlJiZlZS5kZWxheWVkTGVhdmUoKSx0W0dyXT12b2lkIDApfTtsZXQgYz10W0dyXS5iaW5kKG51bGwsITEpO3I/dyhyLFt0LGNdKTpjKCl9LGxlYXZlKHQscil7bGV0IGk9U3RyaW5nKGUua2V5KTtpZih0W0dyXSYmdFtHcl0oITApLG4uaXNVbm1vdW50aW5nKXJldHVybiByKCk7QyhmLFt0XSk7bGV0IGE9ITE7dFtXcl09bj0+e2F8fChhPSEwLHIoKSxDKG4/ZzpoLFt0XSksdFtXcl09dm9pZCAwLFNbaV09PT1lJiZkZWxldGUgU1tpXSl9O2xldCBvPXRbV3JdLmJpbmQobnVsbCwhMSk7U1tpXT1lLG0/dyhtLFt0LG9dKTpvKCl9LGNsb25lKGUpe2xldCBhPWVpKGUsdCxuLHIsaSk7cmV0dXJuIGkmJmkoYSksYX19O3JldHVybiBlZX1mdW5jdGlvbiB0aShlKXtpZih6aShlKSlyZXR1cm4gZT1DcyhlKSxlLmNoaWxkcmVuPW51bGwsZX1mdW5jdGlvbiBuaShlKXtpZighemkoZSkpcmV0dXJuIE1yKGUudHlwZSkmJmUuY2hpbGRyZW4/WnIoZS5jaGlsZHJlbik6ZTtpZihlLmNvbXBvbmVudClyZXR1cm4gZS5jb21wb25lbnQuc3ViVHJlZTtsZXR7c2hhcGVGbGFnOnQsY2hpbGRyZW46bn09ZTtpZihuKXtpZih0JjE2KXJldHVybiBuWzBdO2lmKHQmMzImJnYobi5kZWZhdWx0KSlyZXR1cm4gbi5kZWZhdWx0KCl9fWZ1bmN0aW9uIHJpKGUsdCl7aWYoZS5zaGFwZUZsYWcmNiYmZS5jb21wb25lbnQpe2UudHJhbnNpdGlvbj10O2xldCBuPWUuY29tcG9uZW50LnN1YlRyZWU7cmkoTXIobi50eXBlKSYmbmkobil8fG4sdCl9ZWxzZSBlLnNoYXBlRmxhZyYxMjg/KGUuc3NDb250ZW50LnRyYW5zaXRpb249dC5jbG9uZShlLnNzQ29udGVudCksZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249dC5jbG9uZShlLnNzRmFsbGJhY2spKTplLnRyYW5zaXRpb249dH1mdW5jdGlvbiBpaShlLHQ9ITEsbil7bGV0IHI9W10saT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgbz1lW2FdLHM9bj09bnVsbD9vLmtleTpTdHJpbmcobikrU3RyaW5nKG8ua2V5PT1udWxsP2E6by5rZXkpO28udHlwZT09PUw/KG8ucGF0Y2hGbGFnJjEyOCYmaSsrLHI9ci5jb25jYXQoaWkoby5jaGlsZHJlbix0LHMpKSk6KHR8fG8udHlwZSE9PWNzKSYmci5wdXNoKHM9PW51bGw/bzpDcyhvLHtrZXk6c30pKX1pZihpPjEpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspcltlXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHJ9ZnVuY3Rpb24gRihlLHQpe3JldHVybiB2KGUpP2woe25hbWU6ZS5uYW1lfSx0LHtzZXR1cDplfSk6ZX1mdW5jdGlvbiBhaSgpe2xldCBlPUZzKCk7cmV0dXJuIGU/KGUuYXBwQ29udGV4dC5jb25maWcuaWRQcmVmaXh8fGB2YCkrYC1gK2UuaWRzWzBdK2UuaWRzWzFdKys6YGB9ZnVuY3Rpb24gb2koZSl7ZS5pZHM9W2UuaWRzWzBdK2UuaWRzWzJdKysrYC1gLDAsMF19ZnVuY3Rpb24gc2koZSl7bGV0IHQ9RnMoKSxuPXVuKG51bGwpO2lmKHQpe2xldCBpPXQucmVmcz09PXI/dC5yZWZzPXt9OnQucmVmcztPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxlLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+bi52YWx1ZSxzZXQ6ZT0+bi52YWx1ZT1lfSl9cmV0dXJuIG59ZnVuY3Rpb24gY2koZSx0KXtsZXQgbjtyZXR1cm4hISgobj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkpJiYhbi5jb25maWd1cmFibGUpfXZhciBsaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB1aShlLHQsbixpLGE9ITEpe2lmKHAoZSkpe2UuZm9yRWFjaCgoZSxyKT0+dWkoZSx0JiYocCh0KT90W3JdOnQpLG4saSxhKSk7cmV0dXJufWlmKElpKGkpJiYhYSl7aS5zaGFwZUZsYWcmNTEyJiZpLnR5cGUuX19hc3luY1Jlc29sdmVkJiZpLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCYmdWkoZSx0LG4saS5jb21wb25lbnQuc3ViVHJlZSk7cmV0dXJufWxldCBzPWkuc2hhcGVGbGFnJjQ/UXMoaS5jb21wb25lbnQpOmkuZWwsYz1hP251bGw6cyx7aTpsLHI6ZH09ZSxtPXQmJnQucixoPWwucmVmcz09PXI/bC5yZWZzPXt9OmwucmVmcyxnPWwuc2V0dXBTdGF0ZSxfPUEoZyksYj1nPT09cj9vOmU9PiFjaShoLGUpJiZmKF8sZSkseD0oZSx0KT0+ISh0JiZjaShoLHQpKTtpZihtIT1udWxsJiZtIT09ZCl7aWYoZGkodCkseShtKSloW21dPW51bGwsYihtKSYmKGdbbV09bnVsbCk7ZWxzZSBpZihqKG0pKXtsZXQgZT10O3gobSxlLmspJiYobS52YWx1ZT1udWxsKSxlLmsmJihoW2Uua109bnVsbCl9fWlmKHYoZCkpVm4oZCxsLDEyLFtjLGhdKTtlbHNle2xldCB0PXkoZCkscj1qKGQpO2lmKHR8fHIpe2xldCBpPSgpPT57aWYoZS5mKXtsZXQgbj10P2IoZCk/Z1tkXTpoW2RdOngoZCl8fCFlLms/ZC52YWx1ZTpoW2Uua107aWYoYSlwKG4pJiZ1KG4scyk7ZWxzZSBpZihwKG4pKW4uaW5jbHVkZXMocyl8fG4ucHVzaChzKTtlbHNlIGlmKHQpaFtkXT1bc10sYihkKSYmKGdbZF09aFtkXSk7ZWxzZXtsZXQgdD1bc107eChkLGUuaykmJihkLnZhbHVlPXQpLGUuayYmKGhbZS5rXT10KX19ZWxzZSB0PyhoW2RdPWMsYihkKSYmKGdbZF09YykpOnImJih4KGQsZS5rKSYmKGQudmFsdWU9YyksZS5rJiYoaFtlLmtdPWMpKX07aWYoYyl7bGV0IHQ9KCk9PntpKCksbGkuZGVsZXRlKGUpfTt0LmlkPS0xLGxpLnNldChlLHQpLElvKHQsbil9ZWxzZSBkaShlKSxpKCl9fX1mdW5jdGlvbiBkaShlKXtsZXQgdD1saS5nZXQoZSk7dCYmKHQuZmxhZ3N8PTgsbGkuZGVsZXRlKGUpKX12YXIgZmk9ITEscGk9KCk9PntmaXx8PShjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApLCEwKX0sbWk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYHN2Z2ApJiZlLnRhZ05hbWUhPT1gZm9yZWlnbk9iamVjdGAsaGk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApLGdpPWU9PntpZihlLm5vZGVUeXBlPT09MSl7aWYobWkoZSkpcmV0dXJuYHN2Z2A7aWYoaGkoZSkpcmV0dXJuYG1hdGhtbGB9fSxfaT1lPT5lLm5vZGVUeXBlPT09ODtmdW5jdGlvbiB2aShlKXtsZXR7bXQ6dCxwOm4sbzp7cGF0Y2hQcm9wOnIsY3JlYXRlVGV4dDppLG5leHRTaWJsaW5nOmEscGFyZW50Tm9kZTpvLHJlbW92ZTpjLGluc2VydDpsLGNyZWF0ZUNvbW1lbnQ6dX19PWUsZD0oZSx0KT0+e2lmKCF0Lmhhc0NoaWxkTm9kZXMoKSl7bihudWxsLGUsdCksaXIoKSx0Ll92bm9kZT1lO3JldHVybn1mKHQuZmlyc3RDaGlsZCxlLG51bGwsbnVsbCxudWxsKSxpcigpLHQuX3Zub2RlPWV9LGY9KG4scixzLGMsdSxkPSExKT0+e2R8fD0hIXIuZHluYW1pY0NoaWxkcmVuO2xldCBiPV9pKG4pJiZuLmRhdGE9PT1gW2AseD0oKT0+ZyhuLHIscyxjLHUsYikse3R5cGU6UyxyZWY6QyxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6ZWV9PXIsdGU9bi5ub2RlVHlwZTtyLmVsPW4sZWU9PT0tMiYmKGQ9ITEsci5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0IFQ9bnVsbDtzd2l0Y2goUyl7Y2FzZSBzczp0ZT09PTM/KG4uZGF0YSE9PXIuY2hpbGRyZW4mJihwaSgpLG4uZGF0YT1yLmNoaWxkcmVuKSxUPWEobikpOnIuY2hpbGRyZW49PT1gYD8obChyLmVsPWkoYGApLG8obiksbiksVD1uKTpUPXgoKTticmVhaztjYXNlIGNzOnkobik/KFQ9YShuKSx2KHIuZWw9bi5jb250ZW50LmZpcnN0Q2hpbGQsbixzKSk6VD10ZSE9PTh8fGI/eCgpOmEobik7YnJlYWs7Y2FzZSBsczppZihiJiYobj1hKG4pLHRlPW4ubm9kZVR5cGUpLHRlPT09MXx8dGU9PT0zKXtUPW47bGV0IGU9IXIuY2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8ci5zdGF0aWNDb3VudDt0KyspZSYmKHIuY2hpbGRyZW4rPVQubm9kZVR5cGU9PT0xP1Qub3V0ZXJIVE1MOlQuZGF0YSksdD09PXIuc3RhdGljQ291bnQtMSYmKHIuYW5jaG9yPVQpLFQ9YShUKTtyZXR1cm4gYj9hKFQpOlR9eCgpO2JyZWFrO2Nhc2UgTDpUPWI/aChuLHIscyxjLHUsZCk6eCgpO2JyZWFrO2RlZmF1bHQ6aWYodyYxKVQ9KHRlIT09MXx8ci50eXBlLnRvTG93ZXJDYXNlKCkhPT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkmJiF5KG4pP3goKTpwKG4scixzLGMsdSxkKTtlbHNlIGlmKHcmNil7ci5zbG90U2NvcGVJZHM9dTtsZXQgZT1vKG4pO2lmKFQ9Yj9fKG4pOl9pKG4pJiZuLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnRgP18obixuLmRhdGEsYHRlbGVwb3J0IGVuZGApOmEobiksdChyLGUsbnVsbCxzLGMsZ2koZSksZCksSWkocikmJiFyLnR5cGUuX19hc3luY1Jlc29sdmVkKXtsZXQgdDtiPyh0PUgoTCksdC5hbmNob3I9VD9ULnByZXZpb3VzU2libGluZzplLmxhc3RDaGlsZCk6dD1uLm5vZGVUeXBlPT09Mz9VKGBgKTpIKGBkaXZgKSx0LmVsPW4sci5jb21wb25lbnQuc3ViVHJlZT10fX1lbHNlIHcmNjQ/VD10ZT09PTg/ci50eXBlLmh5ZHJhdGUobixyLHMsYyx1LGQsZSxtKTp4KCk6dyYxMjgmJihUPXIudHlwZS5oeWRyYXRlKG4scixzLGMsZ2kobyhuKSksdSxkLGUsZikpfXJldHVybiBDIT1udWxsJiZ1aShDLG51bGwsYyxyKSxUfSxwPShlLHQsbixpLGEsbyk9PntvfHw9ISF0LmR5bmFtaWNDaGlsZHJlbjtsZXR7dHlwZTpsLGR5bmFtaWNQcm9wczp1LHByb3BzOmQscGF0Y2hGbGFnOmYsc2hhcGVGbGFnOnAsZGlyczpoLHRyYW5zaXRpb246Z309dCxfPWw9PT1gaW5wdXRgfHxsPT09YG9wdGlvbmAsYj0hIXU7aWYoX3x8Ynx8ZiE9PS0xKXtoJiZfcih0LG51bGwsbixgY3JlYXRlZGApO2xldCBsPSExO2lmKHkoZSkpe2w9SG8obnVsbCxnKSYmbiYmbi52bm9kZS5wcm9wcyYmbi52bm9kZS5wcm9wcy5hcHBlYXI7bGV0IHI9ZS5jb250ZW50LmZpcnN0Q2hpbGQ7aWYobCl7bGV0IGU9ci5nZXRBdHRyaWJ1dGUoYGNsYXNzYCk7ZSYmKHIuJGNscz1lKSxnLmJlZm9yZUVudGVyKHIpfXYocixlLG4pLHQuZWw9ZT1yfWlmKHAmMTYmJiEoZCYmKGQuaW5uZXJIVE1MfHxkLnRleHRDb250ZW50KSkpe2xldCByPW0oZS5maXJzdENoaWxkLHQsZSxuLGksYSxvKTtmb3IociYmIUNpKGUsMSkmJnBpKCk7cjspe2xldCBlPXI7cj1yLm5leHRTaWJsaW5nLGMoZSl9fWVsc2UgaWYocCY4KXtsZXQgbj10LmNoaWxkcmVuO25bMF09PT1gCmAmJihlLnRhZ05hbWU9PT1gUFJFYHx8ZS50YWdOYW1lPT09YFRFWFRBUkVBYCkmJihuPW4uc2xpY2UoMSkpO2xldHt0ZXh0Q29udGVudDpyfT1lO3IhPT1uJiZyIT09bi5yZXBsYWNlKC9cclxufFxyL2csYApgKSYmKENpKGUsMCl8fHBpKCksZS50ZXh0Q29udGVudD10LmNoaWxkcmVuKX1pZihkKXtpZihffHxifHwhb3x8ZiY0OCl7bGV0IHQ9ZS50YWdOYW1lLmluY2x1ZGVzKGAtYCksaT1lLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhgc3ZnYCk/YHN2Z2A6ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApP2BtYXRobWxgOnZvaWQgMDtmb3IobGV0IGEgaW4gZClpZihfJiYoYS5lbmRzV2l0aChgdmFsdWVgKXx8YT09PWBpbmRldGVybWluYXRlYCl8fHMoYSkmJiFuZShhKXx8YVswXT09PWAuYHx8dCYmIW5lKGEpfHx1JiZ1LmluY2x1ZGVzKGEpKXtpZihiaShlLGEsZFthXSkpY29udGludWU7cihlLGEsbnVsbCxkW2FdLGksbil9fWVsc2UgaWYoZC5vbkNsaWNrKXIoZSxgb25DbGlja2AsbnVsbCxkLm9uQ2xpY2ssdm9pZCAwLG4pO2Vsc2UgaWYoZiY0JiZubihkLnN0eWxlKSlmb3IobGV0IGUgaW4gZC5zdHlsZSlkLnN0eWxlW2VdfWxldCB4Oyh4PWQmJmQub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoeCxuLHQpLGgmJl9yKHQsbnVsbCxuLGBiZWZvcmVNb3VudGApLCgoeD1kJiZkLm9uVm5vZGVNb3VudGVkKXx8aHx8bCkmJmlzKCgpPT57eCYmQXMoeCxuLHQpLGwmJmcuZW50ZXIoZSksaCYmX3IodCxudWxsLG4sYG1vdW50ZWRgKX0saSl9cmV0dXJuIGUubmV4dFNpYmxpbmd9LG09KGUsdCxyLG8scyxjLHUpPT57dXx8PSEhdC5keW5hbWljQ2hpbGRyZW47bGV0IGQ9dC5jaGlsZHJlbixwPWQubGVuZ3RoLG09ITE7Zm9yKGxldCB0PTA7dDxwO3QrKyl7bGV0IGg9dT9kW3RdOmRbdF09RXMoZFt0XSksZz1oLnR5cGU9PT1zcztlPyhnJiYhdSYmdCsxPHAmJkVzKGRbdCsxXSkudHlwZT09PXNzJiYobChpKGUuZGF0YS5zbGljZShoLmNoaWxkcmVuLmxlbmd0aCkpLHIsYShlKSksZS5kYXRhPWguY2hpbGRyZW4pLGU9ZihlLGgsbyxzLGMsdSkpOmcmJiFoLmNoaWxkcmVuP2woaC5lbD1pKGBgKSxyKToobXx8KG09ITAsQ2kociwxKXx8cGkoKSksbihudWxsLGgscixudWxsLG8scyxnaShyKSxjKSl9cmV0dXJuIGV9LGg9KGUsdCxuLHIsaSxzKT0+e2xldHtzbG90U2NvcGVJZHM6Y309dDtjJiYoaT1pP2kuY29uY2F0KGMpOmMpO2xldCBkPW8oZSksZj1tKGEoZSksdCxkLG4scixpLHMpO3JldHVybiBmJiZfaShmKSYmZi5kYXRhPT09YF1gP2EodC5hbmNob3I9Zik6KHBpKCksbCh0LmFuY2hvcj11KGBdYCksZCxmKSxmKX0sZz0oZSx0LHIsaSxzLGwpPT57aWYoVGkoZSx0KXx8cGkoKSx0LmVsPW51bGwsbCl7bGV0IHQ9XyhlKTtmb3IoOzspe2xldCBuPWEoZSk7aWYobiYmbiE9PXQpYyhuKTtlbHNlIGJyZWFrfX1sZXQgdT1hKGUpLGQ9byhlKTtyZXR1cm4gYyhlKSxuKG51bGwsdCxkLHUscixpLGdpKGQpLHMpLHImJihyLnZub2RlLmVsPXQuZWwsX28ocix0LmVsKSksdX0sXz0oZSx0PWBbYCxuPWBdYCk9PntsZXQgcj0wO2Zvcig7ZTspaWYoZT1hKGUpLGUmJl9pKGUpJiYoZS5kYXRhPT09dCYmcisrLGUuZGF0YT09PW4pKXtpZihyPT09MClyZXR1cm4gYShlKTtyLS19cmV0dXJuIGV9LHY9KGUsdCxuKT0+e2xldCByPXQucGFyZW50Tm9kZTtyJiZyLnJlcGxhY2VDaGlsZChlLHQpO2xldCBpPW47Zm9yKDtpOylpLnZub2RlLmVsPT09dCYmKGkudm5vZGUuZWw9aS5zdWJUcmVlLmVsPWUpLGk9aS5wYXJlbnR9LHk9ZT0+ZS5ub2RlVHlwZT09PTEmJmUudGFnTmFtZT09PWBURU1QTEFURWA7cmV0dXJuW2QsZl19dmFyIHlpPW5ldyBTZXQoW2BzcmNgLGBzcmNzZXRgLGBocmVmYCxgcG9zdGVyYF0pO2Z1bmN0aW9uIGJpKGUsdCxuKXtyZXR1cm4geWkuaGFzKHQpP2UuZ2V0QXR0cmlidXRlKHQpPT09KG49PW51bGw/bnVsbDpgJHtufWApOiExfXZhciB4aT1gZGF0YS1hbGxvdy1taXNtYXRjaGAsU2k9ezA6YHRleHRgLDE6YGNoaWxkcmVuYCwyOmBjbGFzc2AsMzpgc3R5bGVgLDQ6YGF0dHJpYnV0ZWB9O2Z1bmN0aW9uIENpKGUsdCl7aWYodD09PTB8fHQ9PT0xKWZvcig7ZSYmIWUuaGFzQXR0cmlidXRlKHhpKTspZT1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIHdpKGUmJmUuZ2V0QXR0cmlidXRlKHhpKSx0KX1mdW5jdGlvbiB3aShlLHQpe2lmKGU9PW51bGwpcmV0dXJuITE7aWYoZT09PWBgKXJldHVybiEwO3tsZXQgbj1lLnNwbGl0KGAsYCk7cmV0dXJuIHQ9PT0wJiZuLmluY2x1ZGVzKGBjaGlsZHJlbmApPyEwOm4uaW5jbHVkZXMoU2lbdF0pfX1mdW5jdGlvbiBUaShlLHQpe3JldHVybiBDaShlLnBhcmVudEVsZW1lbnQsMSl8fEVpKGUpfHxEaSh0KX1mdW5jdGlvbiBFaShlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTEmJndpKGUuZ2V0QXR0cmlidXRlKHhpKSwxKX1mdW5jdGlvbiBEaSh7cHJvcHM6ZX0pe2xldCB0PWUmJmVbeGldO3JldHVybiB0eXBlb2YgdD09YHN0cmluZ2AmJndpKHQsMSl9dmFyIE9pPW1lKCkucmVxdWVzdElkbGVDYWxsYmFja3x8KGU9PnNldFRpbWVvdXQoZSwxKSksa2k9bWUoKS5jYW5jZWxJZGxlQ2FsbGJhY2t8fChlPT5jbGVhclRpbWVvdXQoZSkpLEFpPShlPTFlNCk9PnQ9PntsZXQgbj1PaSh0LHt0aW1lb3V0OmV9KTtyZXR1cm4oKT0+a2kobil9O2Z1bmN0aW9uIGppKGUpe2xldHt0b3A6dCxsZWZ0Om4sYm90dG9tOnIscmlnaHQ6aX09ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7aW5uZXJIZWlnaHQ6YSxpbm5lcldpZHRoOm99PXdpbmRvdztyZXR1cm4odD4wJiZ0PGF8fHI+MCYmcjxhKSYmKG4+MCYmbjxvfHxpPjAmJmk8byl9dmFyIE1pPWU9Pih0LG4pPT57bGV0IHI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGU9Pntmb3IobGV0IG4gb2YgZSlpZihuLmlzSW50ZXJzZWN0aW5nKXtyLmRpc2Nvbm5lY3QoKSx0KCk7YnJlYWt9fSxlKTtyZXR1cm4gbihlPT57aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpe2lmKGppKGUpKXJldHVybiB0KCksci5kaXNjb25uZWN0KCksITE7ci5vYnNlcnZlKGUpfX0pLCgpPT5yLmRpc2Nvbm5lY3QoKX0sTmk9ZT0+dD0+e2lmKGUpe2xldCBuPW1hdGNoTWVkaWEoZSk7aWYobi5tYXRjaGVzKXQoKTtlbHNlIHJldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCx7b25jZTohMH0pLCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCl9fSxQaT0oZT1bXSk9Pih0LG4pPT57eShlKSYmKGU9W2VdKTtsZXQgcj0hMSxpPWU9PntyfHwocj0hMCxhKCksdCgpLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLGUpKSl9LGE9KCk9PntuKHQ9Pntmb3IobGV0IG4gb2YgZSl0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpKX0pfTtyZXR1cm4gbih0PT57Zm9yKGxldCBuIG9mIGUpdC5hZGRFdmVudExpc3RlbmVyKG4saSx7b25jZTohMH0pfSksYX07ZnVuY3Rpb24gRmkoZSx0KXtpZihfaShlKSYmZS5kYXRhPT09YFtgKXtsZXQgbj0xLHI9ZS5uZXh0U2libGluZztmb3IoO3I7KXtpZihyLm5vZGVUeXBlPT09MSl7aWYodChyKT09PSExKWJyZWFrfWVsc2UgaWYoX2kocikpe2lmKHIuZGF0YT09PWBdYCl7aWYoLS1uPT09MClicmVha31lbHNlIHIuZGF0YT09PWBbYCYmbisrfXI9ci5uZXh0U2libGluZ319ZWxzZSB0KGUpfXZhciBJaT1lPT4hIWUudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIExpKGUpe3YoZSkmJihlPXtsb2FkZXI6ZX0pO2xldHtsb2FkZXI6dCxsb2FkaW5nQ29tcG9uZW50Om4sZXJyb3JDb21wb25lbnQ6cixkZWxheTppPTIwMCxoeWRyYXRlOmEsdGltZW91dDpvLHN1c3BlbnNpYmxlOnM9ITAsb25FcnJvcjpjfT1lLGw9bnVsbCx1LGQ9MCxmPSgpPT4oZCsrLGw9bnVsbCxwKCkpLHA9KCk9PntsZXQgZTtyZXR1cm4gbHx8KGU9bD10KCkuY2F0Y2goZT0+e2lmKGU9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKSxjKXJldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2MoZSwoKT0+dChmKCkpLCgpPT5uKGUpLGQrMSl9KTt0aHJvdyBlfSkudGhlbih0PT5lIT09bCYmbD9sOih0JiYodC5fX2VzTW9kdWxlfHx0W1N5bWJvbC50b1N0cmluZ1RhZ109PT1gTW9kdWxlYCkmJih0PXQuZGVmYXVsdCksdT10LHQpKSl9O3JldHVybiBGKHtuYW1lOmBBc3luY0NvbXBvbmVudFdyYXBwZXJgLF9fYXN5bmNMb2FkZXI6cCxfX2FzeW5jSHlkcmF0ZShlLHQsbil7bGV0IHI9ZS5pc0Nvbm5lY3RlZCxpPSExOyh0LmJ1fHw9W10pLnB1c2goKCk9Pmk9ITApO2xldCBvPSgpPT57aXx8IWUucGFyZW50Tm9kZXx8ciYmIWUuaXNDb25uZWN0ZWR8fG4oKX0scz1hPygpPT57bGV0IG49YShvLHQ9PkZpKGUsdCkpO24mJih0LmJ1bXx8PVtdKS5wdXNoKG4pfTpvO3U/cygpOnAoKS50aGVuKCgpPT4hdC5pc1VubW91bnRlZCYmcygpKX0sZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiB1fSxzZXR1cCgpe2xldCBlPVBzO2lmKG9pKGUpLHUpcmV0dXJuKCk9PlJpKHUsZSk7bGV0IHQ9dD0+e2w9bnVsbCxVbih0LGUsMTMsIXIpfTtpZihzJiZlLnN1c3BlbnNlfHxWcylyZXR1cm4gcCgpLnRoZW4odD0+KCk9PlJpKHQsZSkpLmNhdGNoKGU9Pih0KGUpLCgpPT5yP0gocix7ZXJyb3I6ZX0pOm51bGwpKTtsZXQgYT1NKCExKSxjPU0oKSxkPU0oISFpKSxmLG07cmV0dXJuIHRhKCgpPT57ZiE9bnVsbCYmY2xlYXJUaW1lb3V0KGYpLG0hPW51bGwmJmNsZWFyVGltZW91dChtKX0pLGkmJihtPXNldFRpbWVvdXQoKCk9PntlLmlzVW5tb3VudGVkfHwoZC52YWx1ZT0hMSl9LGkpKSxvIT1udWxsJiYoZj1zZXRUaW1lb3V0KCgpPT57aWYoIWUuaXNVbm1vdW50ZWQmJiFhLnZhbHVlJiYhYy52YWx1ZSl7bGV0IGU9RXJyb3IoYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHtvfW1zLmApO3QoZSksYy52YWx1ZT1lfX0sbykpLHAoKS50aGVuKCgpPT57ZS5pc1VubW91bnRlZHx8KGEudmFsdWU9ITAsZS5wYXJlbnQmJnppKGUucGFyZW50LnZub2RlKSYmZS5wYXJlbnQudXBkYXRlKCkpfSkuY2F0Y2gobj0+e2lmKGUuaXNVbm1vdW50ZWQpe2w9bnVsbDtyZXR1cm59dChuKSxjLnZhbHVlPW59KSwoKT0+e2lmKGEudmFsdWUmJnUpcmV0dXJuIFJpKHUsZSk7aWYoYy52YWx1ZSYmcilyZXR1cm4gSChyLHtlcnJvcjpjLnZhbHVlfSk7aWYobiYmIWQudmFsdWUpcmV0dXJuIFJpKG4sZSl9fX0pfWZ1bmN0aW9uIFJpKGUsdCl7bGV0e3JlZjpuLHByb3BzOnIsY2hpbGRyZW46aSxjZTphfT10LnZub2RlLG89SChlLHIsaSk7cmV0dXJuIG8ucmVmPW4sby5jZT1hLGRlbGV0ZSB0LnZub2RlLmNlLG99dmFyIHppPWU9PmUudHlwZS5fX2lzS2VlcEFsaXZlLEJpPXtuYW1lOmBLZWVwQWxpdmVgLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9bi5jdHg7aWYoIXIucmVuZGVyZXIpcmV0dXJuKCk9PntsZXQgZT10LmRlZmF1bHQmJnQuZGVmYXVsdCgpO3JldHVybiBlJiZlLmxlbmd0aD09PTE/ZVswXTplfTtsZXQgaT1uZXcgTWFwLGE9bmV3IFNldCxvPW51bGwscz1uLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpjLG06bCx1bTp1LG86e2NyZWF0ZUVsZW1lbnQ6ZH19fT1yLGY9ZChgZGl2YCk7ci5hY3RpdmF0ZT0oZSx0LG4scixpKT0+e2xldCBhPWUuY29tcG9uZW50O2woZSx0LG4sMCxzKSxjKGEudm5vZGUsZSx0LG4sYSxzLHIsZS5zbG90U2NvcGVJZHMsaSksSW8oKCk9PnthLmlzRGVhY3RpdmF0ZWQ9ITEsYS5hJiZsZShhLmEpO2xldCB0PWUucHJvcHMmJmUucHJvcHMub25Wbm9kZU1vdW50ZWQ7dCYmQXModCxhLnBhcmVudCxlKX0scyl9LHIuZGVhY3RpdmF0ZT1lPT57bGV0IHQ9ZS5jb21wb25lbnQ7S28odC5tKSxLbyh0LmEpLGwoZSxmLG51bGwsMSxzKSxJbygoKT0+e3QuZGEmJmxlKHQuZGEpO2xldCBuPWUucHJvcHMmJmUucHJvcHMub25Wbm9kZVVubW91bnRlZDtuJiZBcyhuLHQucGFyZW50LGUpLHQuaXNEZWFjdGl2YXRlZD0hMH0scyl9O2Z1bmN0aW9uIHAoZSl7S2koZSksdShlLG4scywhMCl9ZnVuY3Rpb24gbShlKXtpLmZvckVhY2goKHQsbik9PntsZXQgcj0kcyhJaSh0KT90LnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTp0LnR5cGUpO3ImJiFlKHIpJiZoKG4pfSl9ZnVuY3Rpb24gaChlKXtsZXQgdD1pLmdldChlKTt0JiYoIW98fCFfcyh0LG8pKT9wKHQpOm8mJktpKG8pLGkuZGVsZXRlKGUpLGEuZGVsZXRlKGUpfUVyKCgpPT5bZS5pbmNsdWRlLGUuZXhjbHVkZV0sKFtlLHRdKT0+e2UmJm0odD0+VmkoZSx0KSksdCYmbShlPT4hVmkodCxlKSl9LHtmbHVzaDpgcG9zdGAsZGVlcDohMH0pO2xldCBnPW51bGwsXz0oKT0+e2chPW51bGwmJihKbyhuLnN1YlRyZWUudHlwZSk/SW8oKCk9PntpLnNldChnLHFpKG4uc3ViVHJlZSkpfSxuLnN1YlRyZWUuc3VzcGVuc2UpOmkuc2V0KGcscWkobi5zdWJUcmVlKSkpfTtyZXR1cm4gWmkoXyksJGkoXyksZWEoKCk9PntpLmZvckVhY2goZT0+e2xldHtzdWJUcmVlOnQsc3VzcGVuc2U6cn09bixpPXFpKHQpO2lmKGUudHlwZT09PWkudHlwZSYmZS5rZXk9PT1pLmtleSl7S2koaSk7bGV0IGU9aS5jb21wb25lbnQuZGE7ZSYmSW8oZSxyKTtyZXR1cm59cChlKX0pfSksKCk9PntpZihnPW51bGwsIXQuZGVmYXVsdClyZXR1cm4gbz1udWxsO2xldCBuPXQuZGVmYXVsdCgpLHI9blswXTtpZihuLmxlbmd0aD4xKXJldHVybiBvPW51bGwsbjtpZighZ3Mocil8fCEoci5zaGFwZUZsYWcmNCkmJiEoci5zaGFwZUZsYWcmMTI4KSlyZXR1cm4gbz1udWxsLHI7bGV0IHM9cWkocik7aWYocy50eXBlPT09Y3MpcmV0dXJuIG89bnVsbCxzO2xldCBjPXMudHlwZSxsPSRzKElpKHMpP3MudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmMpLHtpbmNsdWRlOnUsZXhjbHVkZTpkLG1heDpmfT1lO2lmKHUmJighbHx8IVZpKHUsbCkpfHxkJiZsJiZWaShkLGwpKXJldHVybiBzLnNoYXBlRmxhZyY9LTI1NyxvPXMscjtsZXQgcD1zLmtleT09bnVsbD9jOnMua2V5LG09aS5nZXQocCk7cmV0dXJuIHMuZWwmJihzPUNzKHMpLHIuc2hhcGVGbGFnJjEyOCYmKHIuc3NDb250ZW50PXMpKSxnPXAsbT8ocy5lbD1tLmVsLHMuY29tcG9uZW50PW0uY29tcG9uZW50LHMudHJhbnNpdGlvbiYmcmkocyxzLnRyYW5zaXRpb24pLHMuc2hhcGVGbGFnfD01MTIsYS5kZWxldGUocCksYS5hZGQocCkpOihhLmFkZChwKSxmJiZhLnNpemU+cGFyc2VJbnQoZiwxMCkmJmgoYS52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxzLnNoYXBlRmxhZ3w9MjU2LG89cyxKbyhyLnR5cGUpP3I6c319fTtmdW5jdGlvbiBWaShlLHQpe3JldHVybiBwKGUpP2Uuc29tZShlPT5WaShlLHQpKTp5KGUpP2Uuc3BsaXQoYCxgKS5pbmNsdWRlcyh0KTpfKGUpPyhlLmxhc3RJbmRleD0wLGUudGVzdCh0KSk6ITF9ZnVuY3Rpb24gSGkoZSx0KXtXaShlLGBhYCx0KX1mdW5jdGlvbiBVaShlLHQpe1dpKGUsYGRhYCx0KX1mdW5jdGlvbiBXaShlLHQsbj1Qcyl7bGV0IHI9ZS5fX3dkY3x8PSgpPT57bGV0IHQ9bjtmb3IoO3Q7KXtpZih0LmlzRGVhY3RpdmF0ZWQpcmV0dXJuO3Q9dC5wYXJlbnR9cmV0dXJuIGUoKX07aWYoSmkodCxyLG4pLG4pe2xldCBlPW4ucGFyZW50O2Zvcig7ZSYmZS5wYXJlbnQ7KXppKGUucGFyZW50LnZub2RlKSYmR2kocix0LG4sZSksZT1lLnBhcmVudH19ZnVuY3Rpb24gR2koZSx0LG4scil7bGV0IGk9SmkodCxlLHIsITApO3RhKCgpPT57dShyW3RdLGkpfSxuKX1mdW5jdGlvbiBLaShlKXtlLnNoYXBlRmxhZyY9LTI1NyxlLnNoYXBlRmxhZyY9LTUxM31mdW5jdGlvbiBxaShlKXtyZXR1cm4gZS5zaGFwZUZsYWcmMTI4P2Uuc3NDb250ZW50OmV9ZnVuY3Rpb24gSmkoZSx0LG49UHMscj0hMSl7aWYobil7bGV0IGk9bltlXXx8KG5bZV09W10pLGE9dC5fX3dlaHx8PSguLi5yKT0+e250KCk7bGV0IGk9UnMobiksYT1Ibih0LG4sZSxyKTtyZXR1cm4gaSgpLHJ0KCksYX07cmV0dXJuIHI/aS51bnNoaWZ0KGEpOmkucHVzaChhKSxhfX12YXIgWWk9ZT0+KHQsbj1Qcyk9PnsoIVZzfHxlPT09YHNwYCkmJkppKGUsKC4uLmUpPT50KC4uLmUpLG4pfSxYaT1ZaShgYm1gKSxaaT1ZaShgbWApLFFpPVlpKGBidWApLCRpPVlpKGB1YCksZWE9WWkoYGJ1bWApLHRhPVlpKGB1bWApLG5hPVlpKGBzcGApLHJhPVlpKGBydGdgKSxpYT1ZaShgcnRjYCk7ZnVuY3Rpb24gYWEoZSx0PVBzKXtKaShgZWNgLGUsdCl9dmFyIG9hPWBjb21wb25lbnRzYCxzYT1gZGlyZWN0aXZlc2A7ZnVuY3Rpb24gY2EoZSx0KXtyZXR1cm4gZmEob2EsZSwhMCx0KXx8ZX12YXIgbGE9U3ltYm9sLmZvcihgdi1uZGNgKTtmdW5jdGlvbiB1YShlKXtyZXR1cm4geShlKT9mYShvYSxlLCExKXx8ZTplfHxsYX1mdW5jdGlvbiBkYShlKXtyZXR1cm4gZmEoc2EsZSl9ZnVuY3Rpb24gZmEoZSx0LG49ITAscj0hMSl7bGV0IGk9dXJ8fFBzO2lmKGkpe2xldCBuPWkudHlwZTtpZihlPT09b2Epe2xldCBlPSRzKG4sITEpO2lmKGUmJihlPT09dHx8ZT09PUUodCl8fGU9PT1zZShFKHQpKSkpcmV0dXJuIG59bGV0IGE9cGEoaVtlXXx8bltlXSx0KXx8cGEoaS5hcHBDb250ZXh0W2VdLHQpO3JldHVybiFhJiZyP246YX19ZnVuY3Rpb24gcGEoZSx0KXtyZXR1cm4gZSYmKGVbdF18fGVbRSh0KV18fGVbc2UoRSh0KSldKX1mdW5jdGlvbiBtYShlLHQsbixyKXtsZXQgaSxhPW4mJm5bcl0sbz1wKGUpO2lmKG98fHkoZSkpe2xldCBuPW8mJm5uKGUpLHI9ITEscz0hMTtuJiYocj0hYW4oZSkscz1ybihlKSxlPV90KGUpKSxpPUFycmF5KGUubGVuZ3RoKTtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspaVtuXT10KHI/cz9sbihjbihlW25dKSk6Y24oZVtuXSk6ZVtuXSxuLHZvaWQgMCxhJiZhW25dKX1lbHNlIGlmKHR5cGVvZiBlPT1gbnVtYmVyYCl7aT1BcnJheShlKTtmb3IobGV0IG49MDtuPGU7bisrKWlbbl09dChuKzEsbix2b2lkIDAsYSYmYVtuXSl9ZWxzZSBpZih4KGUpKXtpZihlW1N5bWJvbC5pdGVyYXRvcl0paT1BcnJheS5mcm9tKGUsKGUsbik9PnQoZSxuLHZvaWQgMCxhJiZhW25dKSk7ZWxzZXtsZXQgbj1PYmplY3Qua2V5cyhlKTtpPUFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2xldCBvPW5bcl07aVtyXT10KGVbb10sbyxyLGEmJmFbcl0pfX19ZWxzZSBpPVtdO3JldHVybiBuJiYobltyXT1pKSxpfWZ1bmN0aW9uIGhhKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07aWYocChyKSlmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllW3JbdF0ubmFtZV09clt0XS5mbjtlbHNlIHImJihlW3IubmFtZV09ci5rZXk/KC4uLmUpPT57bGV0IHQ9ci5mbiguLi5lKTtyZXR1cm4gdCYmKHQua2V5PXIua2V5KSx0fTpyLmZuKX1yZXR1cm4gZX1mdW5jdGlvbiBJKGUsdCxuLHIsaSxhKXtpZihuPz89e30sdXIuY2V8fHVyLnBhcmVudCYmSWkodXIucGFyZW50KSYmdXIucGFyZW50LmNlKXtsZXQgZT1hIT1udWxsJiZuLmtleT09bnVsbD9sKHt9LG4se2tleTphfSk6bixpPU9iamVjdC5rZXlzKGUpLmxlbmd0aD4wO3JldHVybiB0IT09ImRlZmF1bHQiJiYoZS5uYW1lPXQpLFIoKSxCKEwsbnVsbCxbSChgc2xvdGAsZSxyJiZyKCkpXSxpPy0yOjY0KX1sZXQgbz1lW3RdO28mJm8uX2MmJihvLl9kPSExKTtsZXQgcz11cy5sZW5ndGg7UigpO2xldCBjO3RyeXtsZXQgaT1vJiZnYShvKG4pKSxzPW4ua2V5fHxhfHxpJiZpLmtleTtjPUIoTCx7a2V5OihzJiYhYihzKT9zOmBfJHt0fWApKyghaSYmcj9gX2ZiYDpgYCl9LGl8fChyP3IoKTpbXSksaSYmZS5fPT09MT82NDotMil9Y2F0Y2goZSl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPnM7ZS0tKWZzKCk7dGhyb3cgZX1maW5hbGx5e28mJm8uX2MmJihvLl9kPSEwKX1yZXR1cm4haSYmYy5zY29wZUlkJiYoYy5zbG90U2NvcGVJZHM9W2Muc2NvcGVJZCtgLXNgXSksY31mdW5jdGlvbiBnYShlKXtyZXR1cm4gZS5zb21lKGU9PiFncyhlKXx8IShlLnR5cGU9PT1jc3x8ZS50eXBlPT09TCYmIWdhKGUuY2hpbGRyZW4pKSk/ZTpudWxsfWZ1bmN0aW9uIF9hKGUsdCl7bGV0IG49e307Zm9yKGxldCByIGluIGUpblt0JiYvW0EtWl0vLnRlc3Qocik/YG9uOiR7cn1gOmNlKHIpXT1lW3JdO3JldHVybiBufXZhciB2YT1lPT5lP0JzKGUpP1FzKGUpOnZhKGUucGFyZW50KTpudWxsLHlhPWwoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDplPT5lLCRlbDplPT5lLnZub2RlLmVsLCRkYXRhOmU9PmUuZGF0YSwkcHJvcHM6ZT0+ZS5wcm9wcywkYXR0cnM6ZT0+ZS5hdHRycywkc2xvdHM6ZT0+ZS5zbG90cywkcmVmczplPT5lLnJlZnMsJHBhcmVudDplPT52YShlLnBhcmVudCksJHJvb3Q6ZT0+dmEoZS5yb290KSwkaG9zdDplPT5lLmNlLCRlbWl0OmU9PmUuZW1pdCwkb3B0aW9uczplPT5VYShlKSwkZm9yY2VVcGRhdGU6ZT0+ZS5mfHw9KCk9PntlcihlLnVwZGF0ZSl9LCRuZXh0VGljazplPT5lLm58fD1Rbi5iaW5kKGUucHJveHkpLCR3YXRjaDplPT5Pci5iaW5kKGUpfSksYmE9KGUsdCk9PmUhPT1yJiYhZS5fX2lzU2NyaXB0U2V0dXAmJmYoZSx0KSx4YT17Z2V0KHtfOmV9LHQpe2lmKHQ9PT1gX192X3NraXBgKXJldHVybiEwO2xldHtjdHg6bixzZXR1cFN0YXRlOmksZGF0YTphLHByb3BzOm8sYWNjZXNzQ2FjaGU6cyx0eXBlOmMsYXBwQ29udGV4dDpsfT1lO2lmKHRbMF0hPT1gJGApe2xldCBlPXNbdF07aWYoZSE9PXZvaWQgMClzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBpW3RdO2Nhc2UgMjpyZXR1cm4gYVt0XTtjYXNlIDQ6cmV0dXJuIG5bdF07Y2FzZSAzOnJldHVybiBvW3RdfWVsc2UgaWYoYmEoaSx0KSlyZXR1cm4gc1t0XT0xLGlbdF07ZWxzZSBpZihhIT09ciYmZihhLHQpKXJldHVybiBzW3RdPTIsYVt0XTtlbHNlIGlmKGYobyx0KSlyZXR1cm4gc1t0XT0zLG9bdF07ZWxzZSBpZihuIT09ciYmZihuLHQpKXJldHVybiBzW3RdPTQsblt0XTtlbHNlIFJhJiYoc1t0XT0wKX1sZXQgdT15YVt0XSxkLHA7aWYodSlyZXR1cm4gdD09PWAkYXR0cnNgJiZwdChlLmF0dHJzLGBnZXRgLGBgKSx1KGUpO2lmKChkPWMuX19jc3NNb2R1bGVzKSYmKGQ9ZFt0XSkpcmV0dXJuIGQ7aWYobiE9PXImJmYobix0KSlyZXR1cm4gc1t0XT00LG5bdF07aWYocD1sLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGYocCx0KSlyZXR1cm4gcFt0XX0sc2V0KHtfOmV9LHQsbil7bGV0e2RhdGE6aSxzZXR1cFN0YXRlOmEsY3R4Om99PWU7cmV0dXJuIGJhKGEsdCk/KGFbdF09biwhMCk6aSE9PXImJmYoaSx0KT8oaVt0XT1uLCEwKTpmKGUucHJvcHMsdCl8fHRbMF09PT1gJGAmJnQuc2xpY2UoMSlpbiBlPyExOihvW3RdPW4sITApfSxoYXMoe186e2RhdGE6ZSxzZXR1cFN0YXRlOnQsYWNjZXNzQ2FjaGU6bixjdHg6aSxhcHBDb250ZXh0OmEscHJvcHM6byx0eXBlOnN9fSxjKXtsZXQgbDtyZXR1cm4hIShuW2NdfHxlIT09ciYmY1swXSE9PWAkYCYmZihlLGMpfHxiYSh0LGMpfHxmKG8sYyl8fGYoaSxjKXx8Zih5YSxjKXx8ZihhLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGMpfHwobD1zLl9fY3NzTW9kdWxlcykmJmxbY10pfSxkZWZpbmVQcm9wZXJ0eShlLHQsbil7cmV0dXJuIG4uZ2V0PT1udWxsP2YobixgdmFsdWVgKSYmdGhpcy5zZXQoZSx0LG4udmFsdWUsbnVsbCk6ZS5fLmFjY2Vzc0NhY2hlW3RdPTAsUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbil9fSxTYT1sKHt9LHhhLHtnZXQoZSx0KXtpZih0IT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB4YS5nZXQoZSx0LGUpfSxoYXMoZSx0KXtyZXR1cm4gdFswXSE9PWBfYCYmIWhlKHQpfX0pO2Z1bmN0aW9uIENhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gd2EoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUYShlKXt9ZnVuY3Rpb24gRWEoZSl7fWZ1bmN0aW9uIERhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gT2EoKXt9ZnVuY3Rpb24ga2EoZSx0KXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBBYSgpe3JldHVybiBNYShgdXNlU2xvdHNgKS5zbG90c31mdW5jdGlvbiBqYSgpe3JldHVybiBNYShgdXNlQXR0cnNgKS5hdHRyc31mdW5jdGlvbiBNYShlKXtsZXQgdD1GcygpO3JldHVybiB0LnNldHVwQ29udGV4dHx8PVpzKHQpfWZ1bmN0aW9uIE5hKGUpe3JldHVybiBwKGUpP2UucmVkdWNlKChlLHQpPT4oZVt0XT1udWxsLGUpLHt9KTplfWZ1bmN0aW9uIFBhKGUsdCl7bGV0IG49TmEoZSk7Zm9yKGxldCBlIGluIHQpe2lmKGUuc3RhcnRzV2l0aChgX19za2lwYCkpY29udGludWU7bGV0IHI9bltlXTtyP3Aocil8fHYocik/cj1uW2VdPXt0eXBlOnIsZGVmYXVsdDp0W2VdfTpyLmRlZmF1bHQ9dFtlXTpyPT09bnVsbCYmKHI9bltlXT17ZGVmYXVsdDp0W2VdfSksciYmdFtgX19za2lwXyR7ZX1gXSYmKHIuc2tpcEZhY3Rvcnk9ITApfXJldHVybiBufWZ1bmN0aW9uIEZhKGUsdCl7cmV0dXJuIWV8fCF0P2V8fHQ6cChlKSYmcCh0KT9lLmNvbmNhdCh0KTpsKHt9LE5hKGUpLE5hKHQpKX1mdW5jdGlvbiBJYShlLHQpe2xldCBuPXt9O2ZvcihsZXQgciBpbiBlKXQuaW5jbHVkZXMocil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5lW3JdfSk7cmV0dXJuIG59ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9RnMoKSxuPVZzLHI9ZSgpO3pzKCksbiYmTHMoITEpO2xldCBpPSgpPT57UnModCksbiYmTHMoITApfSxhPSgpPT57RnMoKSE9PXQmJnQuc2NvcGUub2ZmKCksenMoKSxuJiZMcyghMSl9O3JldHVybiBTKHIpJiYocj1yLmNhdGNoKGU9Pnt0aHJvdyBpKCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhKSksZX0pKSxbciwoKT0+e2koKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfV19dmFyIFJhPSEwO2Z1bmN0aW9uIHphKGUpe2xldCB0PVVhKGUpLG49ZS5wcm94eSxyPWUuY3R4O1JhPSExLHQuYmVmb3JlQ3JlYXRlJiZWYSh0LmJlZm9yZUNyZWF0ZSxlLGBiY2ApO2xldHtkYXRhOmksY29tcHV0ZWQ6byxtZXRob2RzOnMsd2F0Y2g6Yyxwcm92aWRlOmwsaW5qZWN0OnUsY3JlYXRlZDpkLGJlZm9yZU1vdW50OmYsbW91bnRlZDptLGJlZm9yZVVwZGF0ZTpoLHVwZGF0ZWQ6ZyxhY3RpdmF0ZWQ6XyxkZWFjdGl2YXRlZDp5LGJlZm9yZURlc3Ryb3k6YixiZWZvcmVVbm1vdW50OlMsZGVzdHJveWVkOkMsdW5tb3VudGVkOncscmVuZGVyOmVlLHJlbmRlclRyYWNrZWQ6dGUscmVuZGVyVHJpZ2dlcmVkOlQsZXJyb3JDYXB0dXJlZDpuZSxzZXJ2ZXJQcmVmZXRjaDpyZSxleHBvc2U6aWUsaW5oZXJpdEF0dHJzOkUsY29tcG9uZW50czphZSxkaXJlY3RpdmVzOm9lLGZpbHRlcnM6c2V9PXQ7aWYodSYmQmEodSxyLG51bGwpLHMpZm9yKGxldCBlIGluIHMpe2xldCB0PXNbZV07dih0KSYmKHJbZV09dC5iaW5kKG4pKX1pZihpKXtsZXQgdD1pLmNhbGwobixuKTt4KHQpJiYoZS5kYXRhPVp0KHQpKX1pZihSYT0hMCxvKWZvcihsZXQgZSBpbiBvKXtsZXQgdD1vW2VdLGk9Vyh7Z2V0OnYodCk/dC5iaW5kKG4sbik6dih0LmdldCk/dC5nZXQuYmluZChuLG4pOmEsc2V0OiF2KHQpJiZ2KHQuc2V0KT90LnNldC5iaW5kKG4pOmF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmkudmFsdWUsc2V0OmU9PmkudmFsdWU9ZX0pfWlmKGMpZm9yKGxldCBlIGluIGMpSGEoY1tlXSxyLG4sZSk7aWYobCl7bGV0IGU9dihsKT9sLmNhbGwobik6bDtSZWZsZWN0Lm93bktleXMoZSkuZm9yRWFjaCh0PT57dnIodCxlW3RdKX0pfWQmJlZhKGQsZSxgY2ApO2Z1bmN0aW9uIGNlKGUsdCl7cCh0KT90LmZvckVhY2godD0+ZSh0LmJpbmQobikpKTp0JiZlKHQuYmluZChuKSl9aWYoY2UoWGksZiksY2UoWmksbSksY2UoUWksaCksY2UoJGksZyksY2UoSGksXyksY2UoVWkseSksY2UoYWEsbmUpLGNlKGlhLHRlKSxjZShyYSxUKSxjZShlYSxTKSxjZSh0YSx3KSxjZShuYSxyZSkscChpZSkpe2lmKGllLmxlbmd0aCl7bGV0IHQ9ZS5leHBvc2VkfHw9e307aWUuZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OigpPT5uW2VdLHNldDp0PT5uW2VdPXQsZW51bWVyYWJsZTohMH0pfSl9ZWxzZSBlLmV4cG9zZWR8fD17fX1lZSYmZS5yZW5kZXI9PT1hJiYoZS5yZW5kZXI9ZWUpLEUhPW51bGwmJihlLmluaGVyaXRBdHRycz1FKSxhZSYmKGUuY29tcG9uZW50cz1hZSksb2UmJihlLmRpcmVjdGl2ZXM9b2UpLHJlJiZvaShlKX1mdW5jdGlvbiBCYShlLHQsbj1hKXtwKGUpJiYoZT1KYShlKSk7Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl0saTtpPXgocik/YGRlZmF1bHRgaW4gcj95cihyLmZyb218fG4sci5kZWZhdWx0LCEwKTp5cihyLmZyb218fG4pOnlyKHIpLGooaSk/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pLnZhbHVlLHNldDplPT5pLnZhbHVlPWV9KTp0W25dPWl9fWZ1bmN0aW9uIFZhKGUsdCxuKXtIbihwKGUpP2UubWFwKGU9PmUuYmluZCh0LnByb3h5KSk6ZS5iaW5kKHQucHJveHkpLHQsbil9ZnVuY3Rpb24gSGEoZSx0LG4scil7bGV0IGk9ci5pbmNsdWRlcyhgLmApP2tyKG4scik6KCk9Pm5bcl07aWYoeShlKSl7bGV0IG49dFtlXTt2KG4pJiZFcihpLG4pfWVsc2UgaWYodihlKSlFcihpLGUuYmluZChuKSk7ZWxzZSBpZih4KGUpKXtpZihwKGUpKWUuZm9yRWFjaChlPT5IYShlLHQsbixyKSk7ZWxzZXtsZXQgcj12KGUuaGFuZGxlcik/ZS5oYW5kbGVyLmJpbmQobik6dFtlLmhhbmRsZXJdO3YocikmJkVyKGkscixlKX19fWZ1bmN0aW9uIFVhKGUpe2xldCB0PWUudHlwZSx7bWl4aW5zOm4sZXh0ZW5kczpyfT10LHttaXhpbnM6aSxvcHRpb25zQ2FjaGU6YSxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpvfX09ZS5hcHBDb250ZXh0LHM9YS5nZXQodCksYztyZXR1cm4gcz9jPXM6IWkubGVuZ3RoJiYhbiYmIXI/Yz10OihjPXt9LGkubGVuZ3RoJiZpLmZvckVhY2goZT0+V2EoYyxlLG8sITApKSxXYShjLHQsbykpLHgodCkmJmEuc2V0KHQsYyksY31mdW5jdGlvbiBXYShlLHQsbixyPSExKXtsZXR7bWl4aW5zOmksZXh0ZW5kczphfT10O2EmJldhKGUsYSxuLCEwKSxpJiZpLmZvckVhY2godD0+V2EoZSx0LG4sITApKTtmb3IobGV0IGkgaW4gdClpZighKHImJmk9PT1gZXhwb3NlYCkpe2xldCByPUdhW2ldfHxuJiZuW2ldO2VbaV09cj9yKGVbaV0sdFtpXSk6dFtpXX1yZXR1cm4gZX12YXIgR2E9e2RhdGE6S2EscHJvcHM6WmEsZW1pdHM6WmEsbWV0aG9kczpYYSxjb21wdXRlZDpYYSxiZWZvcmVDcmVhdGU6WWEsY3JlYXRlZDpZYSxiZWZvcmVNb3VudDpZYSxtb3VudGVkOllhLGJlZm9yZVVwZGF0ZTpZYSx1cGRhdGVkOllhLGJlZm9yZURlc3Ryb3k6WWEsYmVmb3JlVW5tb3VudDpZYSxkZXN0cm95ZWQ6WWEsdW5tb3VudGVkOllhLGFjdGl2YXRlZDpZYSxkZWFjdGl2YXRlZDpZYSxlcnJvckNhcHR1cmVkOllhLHNlcnZlclByZWZldGNoOllhLGNvbXBvbmVudHM6WGEsZGlyZWN0aXZlczpYYSx3YXRjaDpRYSxwcm92aWRlOkthLGluamVjdDpxYX07ZnVuY3Rpb24gS2EoZSx0KXtyZXR1cm4gdD9lP2Z1bmN0aW9uKCl7cmV0dXJuIGwodihlKT9lLmNhbGwodGhpcyx0aGlzKTplLHYodCk/dC5jYWxsKHRoaXMsdGhpcyk6dCl9OnQ6ZX1mdW5jdGlvbiBxYShlLHQpe3JldHVybiBYYShKYShlKSxKYSh0KSl9ZnVuY3Rpb24gSmEoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT1lW25dO3JldHVybiB0fXJldHVybiBlfWZ1bmN0aW9uIFlhKGUsdCl7cmV0dXJuIGU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGUsdCkpXTp0fWZ1bmN0aW9uIFhhKGUsdCl7cmV0dXJuIGU/bChPYmplY3QuY3JlYXRlKG51bGwpLGUsdCk6dH1mdW5jdGlvbiBaYShlLHQpe3JldHVybiBlP3AoZSkmJnAodCk/Wy4uLm5ldyBTZXQoWy4uLmUsLi4udF0pXTpsKE9iamVjdC5jcmVhdGUobnVsbCksTmEoZSksTmEodD8/e30pKTp0fWZ1bmN0aW9uIFFhKGUsdCl7aWYoIWUpcmV0dXJuIHQ7aWYoIXQpcmV0dXJuIGU7bGV0IG49bChPYmplY3QuY3JlYXRlKG51bGwpLGUpO2ZvcihsZXQgciBpbiB0KW5bcl09WWEoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiAkYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOm8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIGVvPTA7ZnVuY3Rpb24gdG8oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyPW51bGwpe3Yobil8fChuPWwoe30sbikpLHIhPW51bGwmJiF4KHIpJiYocj1udWxsKTtsZXQgaT0kYSgpLGE9bmV3IFdlYWtTZXQsbz1bXSxzPSExLGM9aS5hcHA9e191aWQ6ZW8rKyxfY29tcG9uZW50Om4sX3Byb3BzOnIsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OmksX2luc3RhbmNlOm51bGwsdmVyc2lvbjppYyxnZXQgY29uZmlnKCl7cmV0dXJuIGkuY29uZmlnfSxzZXQgY29uZmlnKGUpe30sdXNlKGUsLi4udCl7cmV0dXJuIGEuaGFzKGUpfHwoZSYmdihlLmluc3RhbGwpPyhhLmFkZChlKSxlLmluc3RhbGwoYywuLi50KSk6dihlKSYmKGEuYWRkKGUpLGUoYywuLi50KSkpLGN9LG1peGluKGUpe3JldHVybiBpLm1peGlucy5pbmNsdWRlcyhlKXx8aS5taXhpbnMucHVzaChlKSxjfSxjb21wb25lbnQoZSx0KXtyZXR1cm4gdD8oaS5jb21wb25lbnRzW2VdPXQsYyk6aS5jb21wb25lbnRzW2VdfSxkaXJlY3RpdmUoZSx0KXtyZXR1cm4gdD8oaS5kaXJlY3RpdmVzW2VdPXQsYyk6aS5kaXJlY3RpdmVzW2VdfSxtb3VudChhLG8sbCl7aWYoIXMpe2xldCB1PWMuX2NlVk5vZGV8fEgobixyKTtyZXR1cm4gdS5hcHBDb250ZXh0PWksbD09PSEwP2w9YHN2Z2A6bD09PSExJiYobD12b2lkIDApLG8mJnQ/dCh1LGEpOmUodSxhLGwpLHM9ITAsYy5fY29udGFpbmVyPWEsYS5fX3Z1ZV9hcHBfXz1jLFFzKHUuY29tcG9uZW50KX19LG9uVW5tb3VudChlKXtvLnB1c2goZSl9LHVubW91bnQoKXtzJiYoSG4obyxjLl9pbnN0YW5jZSwxNiksZShudWxsLGMuX2NvbnRhaW5lciksZGVsZXRlIGMuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUoZSx0KXtyZXR1cm4gaS5wcm92aWRlc1tlXT10LGN9LHJ1bldpdGhDb250ZXh0KGUpe2xldCB0PW5vO25vPWM7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtubz10fX19O3JldHVybiBjfX12YXIgbm89bnVsbDtmdW5jdGlvbiBybyhlLHQsbj1yKXtsZXQgaT1GcygpLGE9RSh0KSxvPW9lKHQpLHM9aW8oZSxhKSxjPXZuKChzLGMpPT57bGV0IGwsdT1yLGQ7cmV0dXJuIFRyKCgpPT57bGV0IHQ9ZVthXTtEKGwsdCkmJihsPXQsYygpKX0pLHtnZXQoKXtyZXR1cm4gcygpLG4uZ2V0P24uZ2V0KGwpOmx9LHNldChlKXtsZXQgcz1uLnNldD9uLnNldChlKTplO2lmKCFEKHMsbCkmJiEodSE9PXImJkQoZSx1KSkpcmV0dXJuO2xldCBmPWkudm5vZGUucHJvcHMscD0hIShmJiYodCBpbiBmfHxhIGluIGZ8fG8gaW4gZikmJihgb25VcGRhdGU6JHt0fWBpbiBmfHxgb25VcGRhdGU6JHthfWBpbiBmfHxgb25VcGRhdGU6JHtvfWBpbiBmKSk7cHx8KGw9ZSxjKCkpLGkuZW1pdChgdXBkYXRlOiR7dH1gLHMpLEQoZSx1KSYmKEQoZSxzKSYmIUQocyxkKXx8cCYmdSE9PXImJiFEKHMsbCkpJiZjKCksdT1lLGQ9c319fSk7cmV0dXJuIGNbU3ltYm9sLml0ZXJhdG9yXT0oKT0+e2xldCBlPTA7cmV0dXJue25leHQoKXtyZXR1cm4gZTwyP3t2YWx1ZTplKys/c3x8cjpjLGRvbmU6ITF9Ontkb25lOiEwfX19fSxjfXZhciBpbz0oZSx0KT0+dD09PWBtb2RlbFZhbHVlYHx8dD09PWBtb2RlbC12YWx1ZWA/ZS5tb2RlbE1vZGlmaWVyczplW2Ake3R9TW9kaWZpZXJzYF18fGVbYCR7RSh0KX1Nb2RpZmllcnNgXXx8ZVtgJHtvZSh0KX1Nb2RpZmllcnNgXTtmdW5jdGlvbiBhbyhlLHQsLi4ubil7aWYoZS5pc1VubW91bnRlZClyZXR1cm47bGV0IGk9ZS52bm9kZS5wcm9wc3x8cixhPW4sbz10LnN0YXJ0c1dpdGgoYHVwZGF0ZTpgKSxzPW8mJmlvKGksdC5zbGljZSg3KSk7cyYmKHMudHJpbSYmKGE9bi5tYXAoZT0+eShlKT9lLnRyaW0oKTplKSkscy5udW1iZXImJihhPW4ubWFwKGRlKSkpO2xldCBjLGw9aVtjPWNlKHQpXXx8aVtjPWNlKEUodCkpXTshbCYmbyYmKGw9aVtjPWNlKG9lKHQpKV0pLGwmJkhuKGwsZSw2LGEpO2xldCB1PWlbYytgT25jZWBdO2lmKHUpe2lmKCFlLmVtaXR0ZWQpZS5lbWl0dGVkPXt9O2Vsc2UgaWYoZS5lbWl0dGVkW2NdKXJldHVybjtlLmVtaXR0ZWRbY109ITAsSG4odSxlLDYsYSl9fXZhciBvbz1uZXcgV2Vha01hcDtmdW5jdGlvbiBzbyhlLHQsbj0hMSl7bGV0IHI9bj9vbzp0LmVtaXRzQ2FjaGUsaT1yLmdldChlKTtpZihpIT09dm9pZCAwKXJldHVybiBpO2xldCBhPWUuZW1pdHMsbz17fSxzPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57bGV0IG49c28oZSx0LCEwKTtuJiYocz0hMCxsKG8sbikpfTshbiYmdC5taXhpbnMubGVuZ3RoJiZ0Lm1peGlucy5mb3JFYWNoKHIpLGUuZXh0ZW5kcyYmcihlLmV4dGVuZHMpLGUubWl4aW5zJiZlLm1peGlucy5mb3JFYWNoKHIpfXJldHVybiFhJiYhcz8oeChlKSYmci5zZXQoZSxudWxsKSxudWxsKToocChhKT9hLmZvckVhY2goZT0+b1tlXT1udWxsKTpsKG8sYSkseChlKSYmci5zZXQoZSxvKSxvKX1mdW5jdGlvbiBjbyhlLHQpe3JldHVybiFlfHwhcyh0KT8hMToodD10LnNsaWNlKDIpLHQ9dD09PWBPbmNlYD90OnQucmVwbGFjZSgvT25jZSQvLGBgKSxmKGUsdFswXS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSkpfHxmKGUsb2UodCkpfHxmKGUsdCkpfWZ1bmN0aW9uIGxvKGUpe2xldHt0eXBlOnQsdm5vZGU6bixwcm94eTpyLHdpdGhQcm94eTppLHByb3BzT3B0aW9uczpbYV0sc2xvdHM6byxhdHRyczpzLGVtaXQ6bCxyZW5kZXI6dSxyZW5kZXJDYWNoZTpkLHByb3BzOmYsZGF0YTpwLHNldHVwU3RhdGU6bSxjdHg6aCxpbmhlcml0QXR0cnM6Z309ZSxfPWZyKGUpLHYseTt0cnl7aWYobi5zaGFwZUZsYWcmNCl7bGV0IGU9aXx8cix0PWU7dj1Fcyh1LmNhbGwodCxlLGQsZixtLHAsaCkpLHk9c31lbHNle2xldCBlPXQ7dj1FcyhlLmxlbmd0aD4xP2UoZix7YXR0cnM6cyxzbG90czpvLGVtaXQ6bH0pOmUoZixudWxsKSkseT10LnByb3BzP3M6Zm8ocyl9fWNhdGNoKHQpe3VzLmxlbmd0aD0wLFVuKHQsZSwxKSx2PUgoY3MpfWxldCBiPXY7aWYoeSYmZyE9PSExKXtsZXQgZT1PYmplY3Qua2V5cyh5KSx7c2hhcGVGbGFnOnR9PWI7ZS5sZW5ndGgmJnQmNyYmKGEmJmUuc29tZShjKSYmKHk9cG8oeSxhKSksYj1DcyhiLHksITEsITApKX1yZXR1cm4gbi5kaXJzJiYoYj1DcyhiLG51bGwsITEsITApLGIuZGlycz1iLmRpcnM/Yi5kaXJzLmNvbmNhdChuLmRpcnMpOm4uZGlycyksbi50cmFuc2l0aW9uJiZyaShNcihiLnR5cGUpJiZuaShiKXx8YixuLnRyYW5zaXRpb24pLHY9YixmcihfKSx2fWZ1bmN0aW9uIHVvKGUsdD0hMCl7bGV0IG47Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF07aWYoZ3Mocikpe2lmKHIudHlwZSE9PWNzfHxyLmNoaWxkcmVuPT09YHYtaWZgKXtpZihuKXJldHVybjtuPXJ9fWVsc2UgcmV0dXJufXJldHVybiBufXZhciBmbz1lPT57bGV0IHQ7Zm9yKGxldCBuIGluIGUpKG49PT1gY2xhc3NgfHxuPT09YHN0eWxlYHx8cyhuKSkmJigodHx8PXt9KVtuXT1lW25dKTtyZXR1cm4gdH0scG89KGUsdCk9PntsZXQgbj17fTtmb3IobGV0IHIgaW4gZSkoIWMocil8fCEoci5zbGljZSg5KWluIHQpKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59O2Z1bmN0aW9uIG1vKGUsdCxuKXtsZXR7cHJvcHM6cixjaGlsZHJlbjppLGNvbXBvbmVudDphfT1lLHtwcm9wczpvLGNoaWxkcmVuOnMscGF0Y2hGbGFnOmN9PXQsbD1hLmVtaXRzT3B0aW9ucztpZih0LmRpcnN8fHQudHJhbnNpdGlvbilyZXR1cm4hMDtpZihuJiZjPj0wKXtpZihjJjEwMjQpcmV0dXJuITA7aWYoYyYxNilyZXR1cm4gcj9obyhyLG8sbCk6ISFvO2lmKGMmOCl7bGV0IGU9dC5keW5hbWljUHJvcHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPWVbdF07aWYoZ28obyxyLG4pJiYhY28obCxuKSlyZXR1cm4hMH19fWVsc2UgcmV0dXJuKGl8fHMpJiYoIXN8fCFzLiRzdGFibGUpPyEwOnI9PT1vPyExOnI/IW98fGhvKHIsbyxsKTohIW87cmV0dXJuITF9ZnVuY3Rpb24gaG8oZSx0LG4pe2xldCByPU9iamVjdC5rZXlzKHQpO2lmKHIubGVuZ3RoIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXJldHVybiEwO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKXtsZXQgYT1yW2ldO2lmKGdvKHQsZSxhKSYmIWNvKG4sYSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZ28oZSx0LG4pe2xldCByPWVbbl0saT10W25dO3JldHVybiBuPT09YHN0eWxlYCYmeChyKSYmeChpKT8hRWUocixpKTpyIT09aX1mdW5jdGlvbiBfbyh7dm5vZGU6ZSxwYXJlbnQ6dCxzdXNwZW5zZTpufSxyKXtmb3IoO3Q7KXtsZXQgbj10LnN1YlRyZWU7aWYobi5zdXNwZW5zZSYmbi5zdXNwZW5zZS5hY3RpdmVCcmFuY2g9PT1lJiYobi5zdXNwZW5zZS52bm9kZS5lbD1uLmVsPXIsZT1uKSxuPT09ZSkoZT10LnZub2RlKS5lbD1yLHQ9dC5wYXJlbnQ7ZWxzZSBicmVha31uJiZuLmFjdGl2ZUJyYW5jaD09PWUmJihuLnZub2RlLmVsPXIpfXZhciB2bz17fSx5bz0oKT0+T2JqZWN0LmNyZWF0ZSh2byksYm89ZT0+T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09dm87ZnVuY3Rpb24geG8oZSx0LG4scj0hMSl7bGV0IGk9e30sYT15bygpO2UucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLENvKGUsdCxpLGEpO2ZvcihsZXQgdCBpbiBlLnByb3BzT3B0aW9uc1swXSl0IGluIGl8fChpW3RdPXZvaWQgMCk7ZS5wcm9wcz1uP3I/aTpRdChpKTplLnR5cGUucHJvcHM/aTphLGUuYXR0cnM9YX1mdW5jdGlvbiBTbyhlLHQsbixyKXtsZXR7cHJvcHM6aSxhdHRyczphLHZub2RlOntwYXRjaEZsYWc6b319PWUscz1BKGkpLFtjXT1lLnByb3BzT3B0aW9ucyxsPSExO2lmKChyfHxvPjApJiYhKG8mMTYpKXtpZihvJjgpe2xldCBuPWUudm5vZGUuZHluYW1pY1Byb3BzO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtsZXQgbz1uW3JdO2lmKGNvKGUuZW1pdHNPcHRpb25zLG8pKWNvbnRpbnVlO2xldCB1PXRbb107aWYoYyl7aWYoZihhLG8pKXUhPT1hW29dJiYoYVtvXT11LGw9ITApO2Vsc2V7bGV0IHQ9RShvKTtpW3RdPXdvKGMscyx0LHUsZSwhMSl9fWVsc2UgdSE9PWFbb10mJihhW29dPXUsbD0hMCl9fX1lbHNle0NvKGUsdCxpLGEpJiYobD0hMCk7bGV0IHI7Zm9yKGxldCBhIGluIHMpKCF0fHwhZih0LGEpJiYoKHI9b2UoYSkpPT09YXx8IWYodCxyKSkpJiYoYz9uJiYoblthXSE9PXZvaWQgMHx8bltyXSE9PXZvaWQgMCkmJihpW2FdPXdvKGMscyxhLHZvaWQgMCxlLCEwKSk6ZGVsZXRlIGlbYV0pO2lmKGEhPT1zKWZvcihsZXQgZSBpbiBhKSghdHx8IWYodCxlKSkmJihkZWxldGUgYVtlXSxsPSEwKX1sJiZtdChlLmF0dHJzLGBzZXRgLGBgKX1mdW5jdGlvbiBDbyhlLHQsbixpKXtsZXRbYSxvXT1lLnByb3BzT3B0aW9ucyxzPSExLGM7aWYodClmb3IobGV0IHIgaW4gdCl7aWYobmUocikpY29udGludWU7bGV0IGw9dFtyXSx1O2EmJmYoYSx1PUUocikpPyFvfHwhby5pbmNsdWRlcyh1KT9uW3VdPWw6KGN8fD17fSlbdV09bDpjbyhlLmVtaXRzT3B0aW9ucyxyKXx8KCEociBpbiBpKXx8bCE9PWlbcl0pJiYoaVtyXT1sLHM9ITApfWlmKG8pe2xldCB0PUEobiksaT1jfHxyO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKXtsZXQgcz1vW3JdO25bc109d28oYSx0LHMsaVtzXSxlLCFmKGkscykpfX1yZXR1cm4gc31mdW5jdGlvbiB3byhlLHQsbixyLGksYSl7bGV0IG89ZVtuXTtpZihvIT1udWxsKXtsZXQgZT1mKG8sYGRlZmF1bHRgKTtpZihlJiZyPT09dm9pZCAwKXtsZXQgZT1vLmRlZmF1bHQ7aWYoby50eXBlIT09RnVuY3Rpb24mJiFvLnNraXBGYWN0b3J5JiZ2KGUpKXtsZXR7cHJvcHNEZWZhdWx0czphfT1pO2lmKG4gaW4gYSlyPWFbbl07ZWxzZXtsZXQgbz1ScyhpKTtyPWFbbl09ZS5jYWxsKG51bGwsdCksbygpfX1lbHNlIHI9ZTtpLmNlJiZpLmNlLl9zZXRQcm9wKG4scil9b1swXSYmKGEmJiFlP3I9ITE6b1sxXSYmKHI9PT1gYHx8cj09PW9lKG4pKSYmKHI9ITApKX1yZXR1cm4gcn12YXIgVG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRW8oZSx0LG49ITEpe2xldCBhPW4/VG86dC5wcm9wc0NhY2hlLG89YS5nZXQoZSk7aWYobylyZXR1cm4gbztsZXQgcz1lLnByb3BzLGM9e30sdT1bXSxkPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57ZD0hMDtsZXRbbixyXT1FbyhlLHQsITApO2woYyxuKSxyJiZ1LnB1c2goLi4ucil9OyFuJiZ0Lm1peGlucy5sZW5ndGgmJnQubWl4aW5zLmZvckVhY2gociksZS5leHRlbmRzJiZyKGUuZXh0ZW5kcyksZS5taXhpbnMmJmUubWl4aW5zLmZvckVhY2gocil9aWYoIXMmJiFkKXJldHVybiB4KGUpJiZhLnNldChlLGkpLGk7aWYocChzKSlmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IHQ9RShzW2VdKTtEbyh0KSYmKGNbdF09cil9ZWxzZSBpZihzKWZvcihsZXQgZSBpbiBzKXtsZXQgdD1FKGUpO2lmKERvKHQpKXtsZXQgbj1zW2VdLHI9Y1t0XT1wKG4pfHx2KG4pP3t0eXBlOm59Omwoe30sbiksaT1yLnR5cGUsYT0hMSxvPSEwO2lmKHAoaSkpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2xldCB0PWlbZV0sbj12KHQpJiZ0Lm5hbWU7aWYobj09PWBCb29sZWFuYCl7YT0hMDticmVha31uPT09YFN0cmluZ2AmJihvPSExKX1lbHNlIGE9dihpKSYmaS5uYW1lPT09YEJvb2xlYW5gO3JbMF09YSxyWzFdPW8sKGF8fGYocixgZGVmYXVsdGApKSYmdS5wdXNoKHQpfX1sZXQgbT1bYyx1XTtyZXR1cm4geChlKSYmYS5zZXQoZSxtKSxtfWZ1bmN0aW9uIERvKGUpe3JldHVybiBlWzBdIT09YCRgJiYhbmUoZSl9dmFyIE9vPWU9PmU9PT1gX2B8fGU9PT1gX2N0eGB8fGU9PT1gJHN0YWJsZWAsa289ZT0+cChlKT9lLm1hcChFcyk6W0VzKGUpXSxBbz0oZSx0LG4pPT57aWYodC5fbilyZXR1cm4gdDtsZXQgcj1QKCguLi5lKT0+a28odCguLi5lKSksbik7cmV0dXJuIHIuX2M9ITEscn0sam89KGUsdCxuKT0+e2xldCByPWUuX2N0eDtmb3IobGV0IG4gaW4gZSl7aWYoT28obikpY29udGludWU7bGV0IGk9ZVtuXTtpZih2KGkpKXRbbl09QW8obixpLHIpO2Vsc2UgaWYoaSE9bnVsbCl7bGV0IGU9a28oaSk7dFtuXT0oKT0+ZX19fSxNbz0oZSx0KT0+e2xldCBuPWtvKHQpO2Uuc2xvdHMuZGVmYXVsdD0oKT0+bn0sTm89KGUsdCxuKT0+e2ZvcihsZXQgciBpbiB0KShufHwhT28ocikpJiYoZVtyXT10W3JdKX0sUG89KGUsdCxuKT0+e2xldCByPWUuc2xvdHM9eW8oKTtpZihlLnZub2RlLnNoYXBlRmxhZyYzMil7bGV0IGU9dC5fO2U/KE5vKHIsdCxuKSxuJiZ1ZShyLGBfYCxlLCEwKSk6am8odCxyKX1lbHNlIHQmJk1vKGUsdCl9LEZvPShlLHQsbik9PntsZXR7dm5vZGU6aSxzbG90czphfT1lLG89ITAscz1yO2lmKGkuc2hhcGVGbGFnJjMyKXtsZXQgZT10Ll87ZT9uJiZlPT09MT9vPSExOk5vKGEsdCxuKToobz0hdC4kc3RhYmxlLGpvKHQsYSkpLHM9dH1lbHNlIHQmJihNbyhlLHQpLHM9e2RlZmF1bHQ6MX0pO2lmKG8pZm9yKGxldCBlIGluIGEpIU9vKGUpJiZzW2VdPT1udWxsJiZkZWxldGUgYVtlXX0sSW89aXM7ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIHpvKGUpfWZ1bmN0aW9uIFJvKGUpe3JldHVybiB6byhlLHZpKX1mdW5jdGlvbiB6byhlLHQpe2xldCBuPW1lKCk7bi5fX1ZVRV9fPSEwO2xldHtpbnNlcnQ6byxyZW1vdmU6cyxwYXRjaFByb3A6YyxjcmVhdGVFbGVtZW50OmwsY3JlYXRlVGV4dDp1LGNyZWF0ZUNvbW1lbnQ6ZCxzZXRUZXh0OmYsc2V0RWxlbWVudFRleHQ6cCxwYXJlbnROb2RlOm0sbmV4dFNpYmxpbmc6aCxzZXRTY29wZUlkOmc9YSxpbnNlcnRTdGF0aWNDb250ZW50Ol99PWUsdj0oZSx0LG4scj1udWxsLGk9bnVsbCxhPW51bGwsbz12b2lkIDAscz1udWxsLGM9ISF0LmR5bmFtaWNDaGlsZHJlbik9PntpZihlPT09dClyZXR1cm47ZSYmIV9zKGUsdCkmJihyPU8oZSksZ2UoZSxpLGEsITApLGU9bnVsbCksdC5wYXRjaEZsYWc9PT0tMiYmKGM9ITEsdC5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0e3R5cGU6bCxyZWY6dSxzaGFwZUZsYWc6ZH09dDtzd2l0Y2gobCl7Y2FzZSBzczp5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgY3M6YihlLHQsbixyKTticmVhaztjYXNlIGxzOmU/P3godCxuLHIsbyk7YnJlYWs7Y2FzZSBMOmFlKGUsdCxuLHIsaSxhLG8scyxjKTticmVhaztkZWZhdWx0OmQmMT93KGUsdCxuLHIsaSxhLG8scyxjKTpkJjY/b2UoZSx0LG4scixpLGEsbyxzLGMpOihkJjY0fHxkJjEyOCkmJmwucHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxDZSl9dSE9bnVsbCYmaT91aSh1LGUmJmUucmVmLGEsdHx8ZSwhdCk6dT09bnVsbCYmZSYmZS5yZWYhPW51bGwmJnVpKGUucmVmLG51bGwsYSxlLCEwKX0seT0oZSx0LG4scik9PntpZihlPT1udWxsKW8odC5lbD11KHQuY2hpbGRyZW4pLG4scik7ZWxzZXtsZXQgbj10LmVsPWUuZWw7dC5jaGlsZHJlbiE9PWUuY2hpbGRyZW4mJmYobix0LmNoaWxkcmVuKX19LGI9KGUsdCxuLHIpPT57ZT09bnVsbD9vKHQuZWw9ZCh0LmNoaWxkcmVufHxgYCksbixyKTp0LmVsPWUuZWx9LHg9KGUsdCxuLHIpPT57W2UuZWwsZS5hbmNob3JdPV8oZS5jaGlsZHJlbix0LG4scixlLmVsLGUuYW5jaG9yKX0sUz0oe2VsOmUsYW5jaG9yOnR9LG4scik9PntsZXQgaTtmb3IoO2UmJmUhPT10OylpPWgoZSksbyhlLG4sciksZT1pO28odCxuLHIpfSxDPSh7ZWw6ZSxhbmNob3I6dH0pPT57bGV0IG47Zm9yKDtlJiZlIT09dDspbj1oKGUpLHMoZSksZT1uO3ModCl9LHc9KGUsdCxuLHIsaSxhLG8scyxjKT0+e2lmKHQudHlwZT09PWBzdmdgP289YHN2Z2A6dC50eXBlPT09YG1hdGhgJiYobz1gbWF0aG1sYCksZT09bnVsbCllZSh0LG4scixpLGEsbyxzLGMpO2Vsc2V7bGV0IG49ZS5lbCYmZS5lbC5faXNWdWVDRT9lLmVsOm51bGw7dHJ5e24mJm4uX2JlZ2luUGF0Y2goKSxyZShlLHQsaSxhLG8scyxjKX1maW5hbGx5e24mJm4uX2VuZFBhdGNoKCl9fX0sZWU9KGUsdCxuLHIsaSxhLHMsdSk9PntsZXQgZCxmLHtwcm9wczptLHNoYXBlRmxhZzpoLHRyYW5zaXRpb246ZyxkaXJzOl99PWU7aWYoZD1lLmVsPWwoZS50eXBlLGEsbSYmbS5pcyxtKSxoJjg/cChkLGUuY2hpbGRyZW4pOmgmMTYmJlQoZS5jaGlsZHJlbixkLG51bGwscixpLEJvKGUsYSkscyx1KSxfJiZfcihlLG51bGwscixgY3JlYXRlZGApLHRlKGQsZSxlLnNjb3BlSWQscyxyKSxtKXtmb3IobGV0IGUgaW4gbSllIT09YHZhbHVlYCYmIW5lKGUpJiZjKGQsZSxudWxsLG1bZV0sYSxyKTtgdmFsdWVgaW4gbSYmYyhkLGB2YWx1ZWAsbnVsbCxtLnZhbHVlLGEpLChmPW0ub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoZixyLGUpfV8mJl9yKGUsbnVsbCxyLGBiZWZvcmVNb3VudGApO2xldCB2PUhvKGksZyk7diYmZy5iZWZvcmVFbnRlcihkKSxvKGQsdCxuKSwoKGY9bSYmbS5vblZub2RlTW91bnRlZCl8fHZ8fF8pJiZJbygoKT0+e3RyeXtmJiZBcyhmLHIsZSksdiYmZy5lbnRlcihkKSxfJiZfcihlLG51bGwscixgbW91bnRlZGApfWZpbmFsbHl7fX0saSl9LHRlPShlLHQsbixyLGkpPT57aWYobiYmZyhlLG4pLHIpZm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspZyhlLHJbdF0pO2lmKGkpe2xldCBuPWkuc3ViVHJlZTtpZih0PT09bnx8Sm8obi50eXBlKSYmKG4uc3NDb250ZW50PT09dHx8bi5zc0ZhbGxiYWNrPT09dCkpe2xldCB0PWkudm5vZGU7dGUoZSx0LHQuc2NvcGVJZCx0LnNsb3RTY29wZUlkcyxpLnBhcmVudCl9fX0sVD0oZSx0LG4scixpLGEsbyxzLGM9MCk9Pntmb3IobGV0IGw9YztsPGUubGVuZ3RoO2wrKyl7bGV0IGM9ZVtsXT1zP0RzKGVbbF0pOkVzKGVbbF0pO3YobnVsbCxjLHQsbixyLGksYSxvLHMpfX0scmU9KGUsdCxuLGksYSxvLHMpPT57bGV0IGw9dC5lbD1lLmVsLHtwYXRjaEZsYWc6dSxkeW5hbWljQ2hpbGRyZW46ZCxkaXJzOmZ9PXQ7dXw9ZS5wYXRjaEZsYWcmMTY7bGV0IG09ZS5wcm9wc3x8cixoPXQucHJvcHN8fHIsZztpZihuJiZWbyhuLCExKSwoZz1oLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZBcyhnLG4sdCxlKSxmJiZfcih0LGUsbixgYmVmb3JlVXBkYXRlYCksbiYmVm8obiwhMCksZCYmKCFlLmR5bmFtaWNDaGlsZHJlbnx8ZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoIT09ZC5sZW5ndGgpJiYodT0wLHM9ITEsZD1udWxsKSwobS5pbm5lckhUTUwmJmguaW5uZXJIVE1MPT1udWxsfHxtLnRleHRDb250ZW50JiZoLnRleHRDb250ZW50PT1udWxsKSYmcChsLGBgKSxkP2llKGUuZHluYW1pY0NoaWxkcmVuLGQsbCxuLGksQm8odCxhKSxvKTpzfHxkZShlLHQsbCxudWxsLG4saSxCbyh0LGEpLG8sITEpLHU+MCl7aWYodSYxNilFKGwsbSxoLG4sYSk7ZWxzZSBpZih1JjImJm0uY2xhc3MhPT1oLmNsYXNzJiZjKGwsYGNsYXNzYCxudWxsLGguY2xhc3MsYSksdSY0JiZjKGwsYHN0eWxlYCxtLnN0eWxlLGguc3R5bGUsYSksdSY4KXtsZXQgZT10LmR5bmFtaWNQcm9wcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxpPW1bcl0sbz1oW3JdOyhvIT09aXx8cj09PWB2YWx1ZWApJiZjKGwscixpLG8sYSxuKX19dSYxJiZlLmNoaWxkcmVuIT09dC5jaGlsZHJlbiYmcChsLHQuY2hpbGRyZW4pfWVsc2UhcyYmZD09bnVsbCYmRShsLG0saCxuLGEpOygoZz1oLm9uVm5vZGVVcGRhdGVkKXx8ZikmJklvKCgpPT57ZyYmQXMoZyxuLHQsZSksZiYmX3IodCxlLG4sYHVwZGF0ZWRgKX0saSl9LGllPShlLHQsbixyLGksYSxvKT0+e2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgYz1lW3NdLGw9dFtzXSx1PWMuZWwmJihjLnR5cGU9PT1MfHwhX3MoYyxsKXx8Yy5zaGFwZUZsYWcmMTk4KT9tKGMuZWwpOm47dihjLGwsdSxudWxsLHIsaSxhLG8sITApfX0sRT0oZSx0LG4saSxhKT0+e2lmKHQhPT1uKXtpZih0IT09cilmb3IobGV0IHIgaW4gdCkhbmUocikmJiEociBpbiBuKSYmYyhlLHIsdFtyXSxudWxsLGEsaSk7Zm9yKGxldCByIGluIG4pe2lmKG5lKHIpKWNvbnRpbnVlO2xldCBvPW5bcl0scz10W3JdO28hPT1zJiZyIT09YHZhbHVlYCYmYyhlLHIscyxvLGEsaSl9YHZhbHVlYGluIG4mJmMoZSxgdmFsdWVgLHQudmFsdWUsbi52YWx1ZSxhKX19LGFlPShlLHQsbixyLGksYSxzLGMsbCk9PntsZXQgZD10LmVsPWU/ZS5lbDp1KGBgKSxmPXQuYW5jaG9yPWU/ZS5hbmNob3I6dShgYCkse3BhdGNoRmxhZzpwLGR5bmFtaWNDaGlsZHJlbjptLHNsb3RTY29wZUlkczpofT10O2gmJihjPWM/Yy5jb25jYXQoaCk6aCksZT09bnVsbD8obyhkLG4sciksbyhmLG4sciksVCh0LmNoaWxkcmVufHxbXSxuLGYsaSxhLHMsYyxsKSk6cD4wJiZwJjY0JiZtJiZlLmR5bmFtaWNDaGlsZHJlbiYmZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoPT09bS5sZW5ndGg/KGllKGUuZHluYW1pY0NoaWxkcmVuLG0sbixpLGEscyxjKSwodC5rZXkhPW51bGx8fGkmJnQ9PT1pLnN1YlRyZWUpJiZVbyhlLHQsITApKTpkZShlLHQsbixmLGksYSxzLGMsbCl9LG9lPShlLHQsbixyLGksYSxvLHMsYyk9Pnt0LnNsb3RTY29wZUlkcz1zLGU9PW51bGw/dC5zaGFwZUZsYWcmNTEyP2kuY3R4LmFjdGl2YXRlKHQsbixyLG8sYyk6c2UodCxuLHIsaSxhLG8sYyk6Y2UoZSx0LGMpfSxzZT0oZSx0LG4scixpLGEsbyk9PntsZXQgcz1lLmNvbXBvbmVudD1OcyhlLHIsaSk7aWYoemkoZSkmJihzLmN0eC5yZW5kZXJlcj1DZSksSHMocywhMSxvKSxzLmFzeW5jRGVwKXtpZihpJiZpLnJlZ2lzdGVyRGVwKHMsRCxvKSwhZS5lbCl7bGV0IHI9cy5zdWJUcmVlPUgoY3MpO2IobnVsbCxyLHQsbiksZS5wbGFjZWhvbGRlcj1yLmVsfX1lbHNlIEQocyxlLHQsbixpLGEsbyl9LGNlPShlLHQsbik9PntsZXQgcj10LmNvbXBvbmVudD1lLmNvbXBvbmVudDtpZihtbyhlLHQsbikpe2lmKHIuYXN5bmNEZXAmJiFyLmFzeW5jUmVzb2x2ZWQpe3VlKHIsdCxuKTtyZXR1cm59ci5uZXh0PXQsci51cGRhdGUoKX1lbHNlIHQuZWw9ZS5lbCxyLnZub2RlPXR9LEQ9KGUsdCxuLHIsaSxhLG8pPT57bGV0IHM9KCk9PntpZihlLmlzTW91bnRlZCl7bGV0e25leHQ6dCxidTpuLHU6cixwYXJlbnQ6cyx2bm9kZTpjfT1lO3tsZXQgbj1HbyhlKTtpZihuKXt0JiYodC5lbD1jLmVsLHVlKGUsdCxvKSksbi5hc3luY0RlcC50aGVuKCgpPT57SW8oKCk9PntlLmlzVW5tb3VudGVkfHxsKCl9LGkpfSk7cmV0dXJufX1sZXQgdT10LGQ7Vm8oZSwhMSksdD8odC5lbD1jLmVsLHVlKGUsdCxvKSk6dD1jLG4mJmxlKG4pLChkPXQucHJvcHMmJnQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkFzKGQscyx0LGMpLFZvKGUsITApO2xldCBmPWxvKGUpLHA9ZS5zdWJUcmVlO2Uuc3ViVHJlZT1mLHYocCxmLG0ocC5lbCksTyhwKSxlLGksYSksdC5lbD1mLmVsLHU9PT1udWxsJiZfbyhlLGYuZWwpLHImJklvKHIsaSksKGQ9dC5wcm9wcyYmdC5wcm9wcy5vblZub2RlVXBkYXRlZCkmJklvKCgpPT5BcyhkLHMsdCxjKSxpKX1lbHNle2xldCBvLHtlbDpzLHByb3BzOmN9PXQse2JtOmwsbTp1LHBhcmVudDpkLHJvb3Q6Zix0eXBlOnB9PWUsbT1JaSh0KTtpZihWbyhlLCExKSxsJiZsZShsKSwhbSYmKG89YyYmYy5vblZub2RlQmVmb3JlTW91bnQpJiZBcyhvLGQsdCksVm8oZSwhMCkscyYmVGUpe2xldCB0PSgpPT57ZS5zdWJUcmVlPWxvKGUpLFRlKHMsZS5zdWJUcmVlLGUsaSxudWxsKX07bSYmcC5fX2FzeW5jSHlkcmF0ZT9wLl9fYXN5bmNIeWRyYXRlKHMsZSx0KTp0KCl9ZWxzZXtmLmNlJiZmLmNlLl9oYXNTaGFkb3dSb290KCkmJmYuY2UuX2luamVjdENoaWxkU3R5bGUocCxlLnBhcmVudD9lLnBhcmVudC50eXBlOnZvaWQgMCk7bGV0IG89ZS5zdWJUcmVlPWxvKGUpO3YobnVsbCxvLG4scixlLGksYSksdC5lbD1vLmVsfWlmKHUmJklvKHUsaSksIW0mJihvPWMmJmMub25Wbm9kZU1vdW50ZWQpKXtsZXQgZT10O0lvKCgpPT5BcyhvLGQsZSksaSl9KHQuc2hhcGVGbGFnJjI1Nnx8ZCYmSWkoZC52bm9kZSkmJmQudm5vZGUuc2hhcGVGbGFnJjI1NikmJmUuYSYmSW8oZS5hLGkpLGUuaXNNb3VudGVkPSEwLHQ9bj1yPW51bGx9fTtlLnNjb3BlLm9uKCk7bGV0IGM9ZS5lZmZlY3Q9bmV3IHplKHMpO2Uuc2NvcGUub2ZmKCk7bGV0IGw9ZS51cGRhdGU9Yy5ydW4uYmluZChjKSx1PWUuam9iPWMucnVuSWZEaXJ0eS5iaW5kKGMpO3UuaT1lLHUuaWQ9ZS51aWQsYy5zY2hlZHVsZXI9KCk9PmVyKHUpLFZvKGUsITApLGwoKX0sdWU9KGUsdCxuKT0+e3QuY29tcG9uZW50PWU7bGV0IHI9ZS52bm9kZS5wcm9wcztlLnZub2RlPXQsZS5uZXh0PW51bGwsU28oZSx0LnByb3BzLHIsbiksRm8oZSx0LmNoaWxkcmVuLG4pLG50KCkscnIoZSkscnQoKX0sZGU9KGUsdCxuLHIsaSxhLG8scyxjPSExKT0+e2xldCBsPWUmJmUuY2hpbGRyZW4sdT1lP2Uuc2hhcGVGbGFnOjAsZD10LmNoaWxkcmVuLHtwYXRjaEZsYWc6ZixzaGFwZUZsYWc6bX09dDtpZihmPjApe2lmKGYmMTI4KXtwZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufWlmKGYmMjU2KXtmZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufX1tJjg/KHUmMTYmJmJlKGwsaSxhKSxkIT09bCYmcChuLGQpKTp1JjE2P20mMTY/cGUobCxkLG4scixpLGEsbyxzLGMpOmJlKGwsaSxhLCEwKToodSY4JiZwKG4sYGApLG0mMTYmJlQoZCxuLHIsaSxhLG8scyxjKSl9LGZlPShlLHQsbixyLGEsbyxzLGMsbCk9PntlfHw9aSx0fHw9aTtsZXQgdT1lLmxlbmd0aCxkPXQubGVuZ3RoLGY9TWF0aC5taW4odSxkKSxwO2ZvcihwPTA7cDxmO3ArKyl7bGV0IHI9dFtwXT1sP0RzKHRbcF0pOkVzKHRbcF0pO3YoZVtwXSxyLG4sbnVsbCxhLG8scyxjLGwpfXU+ZD9iZShlLGEsbywhMCwhMSxmKTpUKHQsbixyLGEsbyxzLGMsbCxmKX0scGU9KGUsdCxuLHIsYSxvLHMsYyxsKT0+e2xldCB1PTAsZD10Lmxlbmd0aCxmPWUubGVuZ3RoLTEscD1kLTE7Zm9yKDt1PD1mJiZ1PD1wOyl7bGV0IHI9ZVt1XSxpPXRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKTtpZihfcyhyLGkpKXYocixpLG4sbnVsbCxhLG8scyxjLGwpO2Vsc2UgYnJlYWs7dSsrfWZvcig7dTw9ZiYmdTw9cDspe2xldCByPWVbZl0saT10W3BdPWw/RHModFtwXSk6RXModFtwXSk7aWYoX3MocixpKSl2KHIsaSxuLG51bGwsYSxvLHMsYyxsKTtlbHNlIGJyZWFrO2YtLSxwLS19aWYodT5mKXtpZih1PD1wKXtsZXQgZT1wKzEsaT1lPGQ/dFtlXS5lbDpyO2Zvcig7dTw9cDspdihudWxsLHRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKSxuLGksYSxvLHMsYyxsKSx1Kyt9fWVsc2UgaWYodT5wKWZvcig7dTw9ZjspZ2UoZVt1XSxhLG8sITApLHUrKztlbHNle2xldCBtPXUsaD11LGc9bmV3IE1hcDtmb3IodT1oO3U8PXA7dSsrKXtsZXQgZT10W3VdPWw/RHModFt1XSk6RXModFt1XSk7ZS5rZXkhPW51bGwmJmcuc2V0KGUua2V5LHUpfWxldCBfLHk9MCxiPXAtaCsxLHg9ITEsUz0wLEM9QXJyYXkoYik7Zm9yKHU9MDt1PGI7dSsrKUNbdV09MDtmb3IodT1tO3U8PWY7dSsrKXtsZXQgcj1lW3VdO2lmKHk+PWIpe2dlKHIsYSxvLCEwKTtjb250aW51ZX1sZXQgaTtpZihyLmtleSE9bnVsbClpPWcuZ2V0KHIua2V5KTtlbHNlIGZvcihfPWg7Xzw9cDtfKyspaWYoQ1tfLWhdPT09MCYmX3Mocix0W19dKSl7aT1fO2JyZWFrfWk9PT12b2lkIDA/Z2UocixhLG8sITApOihDW2ktaF09dSsxLGk+PVM/Uz1pOng9ITAsdihyLHRbaV0sbixudWxsLGEsbyxzLGMsbCkseSsrKX1sZXQgdz14P1dvKEMpOmk7Zm9yKF89dy5sZW5ndGgtMSx1PWItMTt1Pj0wO3UtLSl7bGV0IGU9aCt1LGk9dFtlXSxmPXRbZSsxXSxwPWUrMTxkP2YuZWx8fHFvKGYpOnI7Q1t1XT09PTA/dihudWxsLGksbixwLGEsbyxzLGMsbCk6eCYmKF88MHx8dSE9PXdbX10/aGUoaSxuLHAsMik6Xy0tKX19fSxoZT0oZSx0LG4scixpPW51bGwpPT57bGV0e2VsOmEsdHlwZTpjLHRyYW5zaXRpb246bCxjaGlsZHJlbjp1LHNoYXBlRmxhZzpkfT1lO2lmKGQmNil7aGUoZS5jb21wb25lbnQuc3ViVHJlZSx0LG4scik7cmV0dXJufWlmKGQmMTI4KXtlLnN1c3BlbnNlLm1vdmUodCxuLHIpO3JldHVybn1pZihkJjY0KXtjLm1vdmUoZSx0LG4sQ2UpO3JldHVybn1pZihjPT09TCl7byhhLHQsbik7Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspaGUodVtlXSx0LG4scik7byhlLmFuY2hvcix0LG4pO3JldHVybn1pZihjPT09bHMpe1MoZSx0LG4pO3JldHVybn1pZihyIT09MiYmZCYxJiZsKXtpZihyPT09MClsLnBlcnNpc3RlZCYmIWFbV3JdP28oYSx0LG4pOihsLmJlZm9yZUVudGVyKGEpLG8oYSx0LG4pLElvKCgpPT5sLmVudGVyKGEpLGkpKTtlbHNle2xldHtsZWF2ZTpyLGRlbGF5TGVhdmU6aSxhZnRlckxlYXZlOmN9PWwsdT0oKT0+e2UuY3R4LmlzVW5tb3VudGVkP3MoYSk6byhhLHQsbil9LGQ9KCk9PntsZXQgZT1hLl9pc0xlYXZpbmd8fCEhYVtXcl07YS5faXNMZWF2aW5nJiZhW1dyXSghMCksbC5wZXJzaXN0ZWQmJiFlP3UoKTpyKGEsKCk9Pnt1KCksYyYmYygpfSl9O2k/aShhLHUsZCk6ZCgpfX1lbHNlIG8oYSx0LG4pfSxnZT0oZSx0LG4scj0hMSxpPSExKT0+e2xldHt0eXBlOmEscHJvcHM6byxyZWY6cyxjaGlsZHJlbjpjLGR5bmFtaWNDaGlsZHJlbjpsLHNoYXBlRmxhZzp1LHBhdGNoRmxhZzpkLGRpcnM6ZixjYWNoZUluZGV4OnAsbWVtbzptfT1lO2lmKGQ9PT0tMiYmKGk9ITEpLHMhPW51bGwmJihudCgpLHVpKHMsbnVsbCxuLGUsITApLHJ0KCkpLHAhPW51bGwmJih0LnJlbmRlckNhY2hlW3BdPXZvaWQgMCksdSYyNTYpe3QuY3R4LmRlYWN0aXZhdGUoZSk7cmV0dXJufWxldCBoPXUmMSYmZixnPSFJaShlKSxfO2lmKGcmJihfPW8mJm8ub25Wbm9kZUJlZm9yZVVubW91bnQpJiZBcyhfLHQsZSksdSY2KXllKGUuY29tcG9uZW50LG4scik7ZWxzZXtpZih1JjEyOCl7ZS5zdXNwZW5zZS51bm1vdW50KG4scik7cmV0dXJufWgmJl9yKGUsbnVsbCx0LGBiZWZvcmVVbm1vdW50YCksdSY2ND9lLnR5cGUucmVtb3ZlKGUsdCxuLENlLHIpOmwmJiFsLmhhc09uY2UmJihhIT09THx8ZD4wJiZkJjY0KT9iZShsLHQsbiwhMSwhMCk6KGE9PT1MJiZkJjM4NHx8IWkmJnUmMTYpJiZiZShjLHQsbiksciYmX2UoZSl9bGV0IHY9bSE9bnVsbCYmcD09bnVsbDsoZyYmKF89byYmby5vblZub2RlVW5tb3VudGVkKXx8aHx8dikmJklvKCgpPT57XyYmQXMoXyx0LGUpLGgmJl9yKGUsbnVsbCx0LGB1bm1vdW50ZWRgKSx2JiYoZS5lbD1udWxsKX0sbil9LF9lPWU9PntsZXR7dHlwZTp0LGVsOm4sYW5jaG9yOnIsdHJhbnNpdGlvbjppfT1lO2lmKHQ9PT1MKXt2ZShuLHIpO3JldHVybn1pZih0PT09bHMpe0MoZSk7cmV0dXJufWxldCBhPSgpPT57cyhuKSxpJiYhaS5wZXJzaXN0ZWQmJmkuYWZ0ZXJMZWF2ZSYmaS5hZnRlckxlYXZlKCl9O2lmKGUuc2hhcGVGbGFnJjEmJmkmJiFpLnBlcnNpc3RlZCl7bGV0e2xlYXZlOnQsZGVsYXlMZWF2ZTpyfT1pLG89KCk9PnQobixhKTtyP3IoZS5lbCxhLG8pOm8oKX1lbHNlIGEoKX0sdmU9KGUsdCk9PntsZXQgbjtmb3IoO2UhPT10OyluPWgoZSkscyhlKSxlPW47cyh0KX0seWU9KGUsdCxuKT0+e2xldHtidW06cixzY29wZTppLGpvYjphLHN1YlRyZWU6byx1bTpzLG06YyxhOmx9PWU7S28oYyksS28obCksciYmbGUociksaS5zdG9wKCksYSYmKGEuZmxhZ3N8PTgsZ2UobyxlLHQsbikpLHMmJklvKHMsdCksSW8oKCk9PntlLmlzVW5tb3VudGVkPSEwfSx0KX0sYmU9KGUsdCxuLHI9ITEsaT0hMSxhPTApPT57Zm9yKGxldCBvPWE7bzxlLmxlbmd0aDtvKyspZ2UoZVtvXSx0LG4scixpKX0sTz1lPT57aWYoZS5zaGFwZUZsYWcmNilyZXR1cm4gTyhlLmNvbXBvbmVudC5zdWJUcmVlKTtpZihlLnNoYXBlRmxhZyYxMjgpcmV0dXJuIGUuc3VzcGVuc2UubmV4dCgpO2xldCB0PWgoZS5hbmNob3J8fGUuZWwpLG49dCYmdFtqcl07cmV0dXJuIG4/aChuKTp0fSx4ZT0hMSxTZT0oZSx0LG4pPT57bGV0IHI7ZT09bnVsbD90Ll92bm9kZSYmKGdlKHQuX3Zub2RlLG51bGwsbnVsbCwhMCkscj10Ll92bm9kZS5jb21wb25lbnQpOnYodC5fdm5vZGV8fG51bGwsZSx0LG51bGwsbnVsbCxudWxsLG4pLHQuX3Zub2RlPWUseGV8fD0oeGU9ITAscnIociksaXIoKSwhMSl9LENlPXtwOnYsdW06Z2UsbTpoZSxyOl9lLG10OnNlLG1jOlQscGM6ZGUscGJjOmllLG46TyxvOmV9LHdlLFRlO3JldHVybiB0JiYoW3dlLFRlXT10KENlKSkse3JlbmRlcjpTZSxoeWRyYXRlOndlLGNyZWF0ZUFwcDp0byhTZSx3ZSl9fWZ1bmN0aW9uIEJvKHt0eXBlOmUscHJvcHM6dH0sbil7cmV0dXJuIG49PT1gc3ZnYCYmZT09PWBmb3JlaWduT2JqZWN0YHx8bj09PWBtYXRobWxgJiZlPT09YGFubm90YXRpb24teG1sYCYmdCYmdC5lbmNvZGluZyYmdC5lbmNvZGluZy5pbmNsdWRlcyhgaHRtbGApP3ZvaWQgMDpufWZ1bmN0aW9uIFZvKHtlZmZlY3Q6ZSxqb2I6dH0sbil7bj8oZS5mbGFnc3w9MzIsdC5mbGFnc3w9NCk6KGUuZmxhZ3MmPS0zMyx0LmZsYWdzJj0tNSl9ZnVuY3Rpb24gSG8oZSx0KXtyZXR1cm4oIWV8fGUmJiFlLnBlbmRpbmdCcmFuY2gpJiZ0JiYhdC5wZXJzaXN0ZWR9ZnVuY3Rpb24gVW8oZSx0LG49ITEpe2xldCByPWUuY2hpbGRyZW4saT10LmNoaWxkcmVuO2lmKHAocikmJnAoaSkpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCB0PXJbZV0sYT1pW2VdO2Euc2hhcGVGbGFnJjEmJiFhLmR5bmFtaWNDaGlsZHJlbiYmKChhLnBhdGNoRmxhZzw9MHx8YS5wYXRjaEZsYWc9PT0zMikmJihhPWlbZV09RHMoaVtlXSksYS5lbD10LmVsKSwhbiYmYS5wYXRjaEZsYWchPT0tMiYmVW8odCxhKSksYS50eXBlPT09c3MmJihhLnBhdGNoRmxhZz09PS0xJiYoYT1pW2VdPURzKGEpKSxhLmVsPXQuZWwpLGEudHlwZT09PWNzJiYhYS5lbCYmKGEuZWw9dC5lbCl9fWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKSxuPVswXSxyLGksYSxvLHMsYz1lLmxlbmd0aDtmb3Iocj0wO3I8YztyKyspe2xldCBjPWVbcl07aWYoYyE9PTApe2lmKGk9bltuLmxlbmd0aC0xXSxlW2ldPGMpe3Rbcl09aSxuLnB1c2gocik7Y29udGludWV9Zm9yKGE9MCxvPW4ubGVuZ3RoLTE7YTxvOylzPWErbz4+MSxlW25bc11dPGM/YT1zKzE6bz1zO2M8ZVtuW2FdXSYmKGE+MCYmKHRbcl09blthLTFdKSxuW2FdPXIpfX1mb3IoYT1uLmxlbmd0aCxvPW5bYS0xXTthLS0+MDspblthXT1vLG89dFtvXTtyZXR1cm4gbn1mdW5jdGlvbiBHbyhlKXtsZXQgdD1lLnN1YlRyZWUuY29tcG9uZW50O2lmKHQpcmV0dXJuIHQuYXN5bmNEZXAmJiF0LmFzeW5jUmVzb2x2ZWQ/dDpHbyh0KX1mdW5jdGlvbiBLbyhlKXtpZihlKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmxhZ3N8PTh9ZnVuY3Rpb24gcW8oZSl7aWYoZS5wbGFjZWhvbGRlcilyZXR1cm4gZS5wbGFjZWhvbGRlcjtsZXQgdD1lLmNvbXBvbmVudDtyZXR1cm4gdD9xbyh0LnN1YlRyZWUpOm51bGx9dmFyIEpvPWU9PmUuX19pc1N1c3BlbnNlLFlvPTAsWG89e25hbWU6YFN1c3BlbnNlYCxfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxsKXtpZihlPT1udWxsKVFvKHQsbixyLGksYSxvLHMsYyxsKTtlbHNle2lmKGEmJmEuZGVwcz4wJiYhZS5zdXNwZW5zZS5pc0luRmFsbGJhY2spe3Quc3VzcGVuc2U9ZS5zdXNwZW5zZSx0LnN1c3BlbnNlLnZub2RlPXQsdC5lbD1lLmVsO3JldHVybn0kbyhlLHQsbixyLGksbyxzLGMsbCl9fSxoeWRyYXRlOnRzLG5vcm1hbGl6ZTpuc307ZnVuY3Rpb24gWm8oZSx0KXtsZXQgbj1lLnByb3BzJiZlLnByb3BzW3RdO3YobikmJm4oKX1mdW5jdGlvbiBRbyhlLHQsbixyLGksYSxvLHMsYyl7bGV0e3A6bCxvOntjcmVhdGVFbGVtZW50OnV9fT1jLGQ9dShgZGl2YCksZj1lLnN1c3BlbnNlPWVzKGUsaSxyLHQsZCxuLGEsbyxzLGMpO2wobnVsbCxmLnBlbmRpbmdCcmFuY2g9ZS5zc0NvbnRlbnQsZCxudWxsLHIsZixhLG8pLGYuZGVwcz4wPyhabyhlLGBvblBlbmRpbmdgKSxabyhlLGBvbkZhbGxiYWNrYCksbChudWxsLGUuc3NGYWxsYmFjayx0LG4scixudWxsLGEsbyksYXMoZixlLnNzRmFsbGJhY2spKTpmLnJlc29sdmUoITEsITApfWZ1bmN0aW9uICRvKGUsdCxuLHIsaSxhLG8scyx7cDpjLHVtOmwsbzp7Y3JlYXRlRWxlbWVudDp1fX0pe2xldCBkPXQuc3VzcGVuc2U9ZS5zdXNwZW5zZTtkLnZub2RlPXQsdC5lbD1lLmVsO2xldCBmPXQuc3NDb250ZW50LHA9dC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6bSxwZW5kaW5nQnJhbmNoOmgsaXNJbkZhbGxiYWNrOmcsaXNIeWRyYXRpbmc6X309ZDtpZihoKWQucGVuZGluZ0JyYW5jaD1mLF9zKGgsZik/KGMoaCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6ZyYmKF98fChjKG0scCxuLHIsaSxudWxsLGEsbyxzKSxhcyhkLHApKSkpOihkLnBlbmRpbmdJZD1ZbysrLF8/KGQuaXNIeWRyYXRpbmc9ITEsZC5hY3RpdmVCcmFuY2g9aCk6bChoLGksZCksZC5kZXBzPTAsZC5lZmZlY3RzLmxlbmd0aD0wLGQuaGlkZGVuQ29udGFpbmVyPXUoYGRpdmApLGc/KGMobnVsbCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6KGMobSxwLG4scixpLG51bGwsYSxvLHMpLGFzKGQscCkpKTptJiZfcyhtLGYpPyhjKG0sZixuLHIsaSxkLGEsbyxzKSxkLnJlc29sdmUoITApKTooYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MCYmZC5yZXNvbHZlKCkpKTtlbHNlIGlmKG0mJl9zKG0sZikpYyhtLGYsbixyLGksZCxhLG8scyksYXMoZCxmKTtlbHNlIGlmKFpvKHQsYG9uUGVuZGluZ2ApLGQucGVuZGluZ0JyYW5jaD1mLGQucGVuZGluZ0lkPWYuc2hhcGVGbGFnJjUxMj9mLmNvbXBvbmVudC5zdXNwZW5zZUlkOllvKyssYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MClkLnJlc29sdmUoKTtlbHNle2xldHt0aW1lb3V0OmUscGVuZGluZ0lkOnR9PWQ7ZT4wP3NldFRpbWVvdXQoKCk9PntkLnBlbmRpbmdJZD09PXQmJmQuZmFsbGJhY2socCl9LGUpOmU9PT0wJiZkLmZhbGxiYWNrKHApfX1mdW5jdGlvbiBlcyhlLHQsbixyLGksYSxvLHMsYyxsLHU9ITEpe2xldHtwOmQsbTpmLHVtOnAsbjptLG86e3BhcmVudE5vZGU6aCxyZW1vdmU6Z319PWwsXyx2PW9zKGUpO3YmJnQmJnQucGVuZGluZ0JyYW5jaCYmKF89dC5wZW5kaW5nSWQsdC5kZXBzKyspO2xldCB5PWUucHJvcHM/ZmUoZS5wcm9wcy50aW1lb3V0KTp2b2lkIDAsYj1hLHg9e3Zub2RlOmUscGFyZW50OnQscGFyZW50Q29tcG9uZW50Om4sbmFtZXNwYWNlOm8sY29udGFpbmVyOnIsaGlkZGVuQ29udGFpbmVyOmksZGVwczowLHBlbmRpbmdJZDpZbysrLHRpbWVvdXQ6dHlwZW9mIHk9PWBudW1iZXJgP3k6LTEsYWN0aXZlQnJhbmNoOm51bGwsaXNGYWxsYmFja01vdW50UGVuZGluZzohMSxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiF1LGlzSHlkcmF0aW5nOnUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKGU9ITEsbj0hMSl7bGV0e3Zub2RlOnIsYWN0aXZlQnJhbmNoOmkscGVuZGluZ0JyYW5jaDpvLHBlbmRpbmdJZDpzLGVmZmVjdHM6YyxwYXJlbnRDb21wb25lbnQ6bCxjb250YWluZXI6dSxpc0luRmFsbGJhY2s6ZH09eCxnPSExO2lmKHguaXNIeWRyYXRpbmcpeC5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFlKXtnPWkmJm8udHJhbnNpdGlvbiYmby50cmFuc2l0aW9uLm1vZGU9PT1gb3V0LWluYDtsZXQgZT0hMTtnJiYoaS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntzPT09eC5wZW5kaW5nSWQmJihmKG8sdSxhPT09YiYmIWU/bShpKTphLDApLG5yKGMpLGQmJnIuc3NGYWxsYmFjayYmKHIuc3NGYWxsYmFjay5lbD1udWxsKSl9KSxpJiYheC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nJiYoaChpLmVsKT09PXUmJihhPW0oaSksZT0hMCkscChpLGwseCwhMCksIWcmJmQmJnIuc3NGYWxsYmFjayYmSW8oKCk9PnIuc3NGYWxsYmFjay5lbD1udWxsLHgpKSxnfHxmKG8sdSxhLDApfXguaXNGYWxsYmFja01vdW50UGVuZGluZz0hMSxhcyh4LG8pLHgucGVuZGluZ0JyYW5jaD1udWxsLHguaXNJbkZhbGxiYWNrPSExO2xldCB5PXgucGFyZW50LFM9ITE7Zm9yKDt5Oyl7aWYoeS5wZW5kaW5nQnJhbmNoKXtmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKyl5LmVmZmVjdHMucHVzaChjW2VdKTtTPSEwO2JyZWFrfXk9eS5wYXJlbnR9IVMmJiFnJiZucihjKSx4LmVmZmVjdHM9W10sdiYmdCYmdC5wZW5kaW5nQnJhbmNoJiZfPT09dC5wZW5kaW5nSWQmJih0LmRlcHMtLSx0LmRlcHM9PT0wJiYhbiYmdC5yZXNvbHZlKCkpLFpvKHIsYG9uUmVzb2x2ZWApfSxmYWxsYmFjayhlKXtpZigheC5wZW5kaW5nQnJhbmNoKXJldHVybjtsZXR7dm5vZGU6dCxhY3RpdmVCcmFuY2g6bixwYXJlbnRDb21wb25lbnQ6cixjb250YWluZXI6aSxuYW1lc3BhY2U6YX09eDtabyh0LGBvbkZhbGxiYWNrYCk7bGV0IG89bShuKSxsPSgpPT57eC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nPSExLHguaXNJbkZhbGxiYWNrJiYoZChudWxsLGUsaSxvLHIsbnVsbCxhLHMsYyksYXMoeCxlKSl9LHU9ZS50cmFuc2l0aW9uJiZlLnRyYW5zaXRpb24ubW9kZT09PWBvdXQtaW5gO3UmJih4LmlzRmFsbGJhY2tNb3VudFBlbmRpbmc9ITAsbi50cmFuc2l0aW9uLmFmdGVyTGVhdmU9bCkseC5pc0luRmFsbGJhY2s9ITAscChuLHIsbnVsbCwhMCksdXx8bCgpfSxtb3ZlKGUsdCxuKXt4LmFjdGl2ZUJyYW5jaCYmZih4LmFjdGl2ZUJyYW5jaCxlLHQsbikseC5jb250YWluZXI9ZX0sbmV4dCgpe3JldHVybiB4LmFjdGl2ZUJyYW5jaCYmbSh4LmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKGUsdCxuKXtsZXQgcj0hIXgucGVuZGluZ0JyYW5jaDtyJiZ4LmRlcHMrKztsZXQgaT1lLnZub2RlLmVsO2UuYXN5bmNEZXAuY2F0Y2godD0+e1VuKHQsZSwwKX0pLnRoZW4oYT0+e2lmKGUuaXNVbm1vdW50ZWR8fHguaXNVbm1vdW50ZWR8fHgucGVuZGluZ0lkIT09ZS5zdXNwZW5zZUlkKXJldHVybjt6cygpLGUuYXN5bmNSZXNvbHZlZD0hMDtsZXR7dm5vZGU6c309ZTtXcyhlLGEsITEpLGkmJihzLmVsPWkpO2xldCBjPSFpJiZlLnN1YlRyZWUuZWw7dChlLHMsaChpfHxlLnN1YlRyZWUuZWwpLGk/bnVsbDptKGUuc3ViVHJlZSkseCxvLG4pLGMmJihzLnBsYWNlaG9sZGVyPW51bGwsZyhjKSksX28oZSxzLmVsKSxyJiYtLXguZGVwcz09PTAmJngucmVzb2x2ZSgpfSl9LHVubW91bnQoZSx0KXt4LmlzVW5tb3VudGVkPSEwLHguYWN0aXZlQnJhbmNoJiZwKHguYWN0aXZlQnJhbmNoLG4sZSx0KSx4LnBlbmRpbmdCcmFuY2gmJnAoeC5wZW5kaW5nQnJhbmNoLG4sZSx0KX19O3JldHVybiB4fWZ1bmN0aW9uIHRzKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD10LnN1c3BlbnNlPWVzKHQscixuLGUucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBkaXZgKSxudWxsLGksYSxvLHMsITApLHU9YyhlLGwucGVuZGluZ0JyYW5jaD10LnNzQ29udGVudCxuLGwsYSxvKTtyZXR1cm4gbC5kZXBzPT09MCYmbC5yZXNvbHZlKCExLCEwKSx1fWZ1bmN0aW9uIG5zKGUpe2xldHtzaGFwZUZsYWc6dCxjaGlsZHJlbjpufT1lLHI9dCYzMjtlLnNzQ29udGVudD1ycyhyP24uZGVmYXVsdDpuKSxlLnNzRmFsbGJhY2s9cj9ycyhuLmZhbGxiYWNrKTpIKGNzKX1mdW5jdGlvbiBycyhlKXtsZXQgdDtpZih2KGUpKXtsZXQgbj1wcyYmZS5fYztuJiYoZS5fZD0hMSxSKCkpLGU9ZSgpLG4mJihlLl9kPSEwLHQ9ZHMsZnMoKSl9cmV0dXJuIHAoZSkmJihlPXVvKGUpKSxlPUVzKGUpLHQmJiFlLmR5bmFtaWNDaGlsZHJlbiYmKGUuZHluYW1pY0NoaWxkcmVuPXQuZmlsdGVyKHQ9PnQhPT1lKSksZX1mdW5jdGlvbiBpcyhlLHQpe3QmJnQucGVuZGluZ0JyYW5jaD9wKGUpP3QuZWZmZWN0cy5wdXNoKC4uLmUpOnQuZWZmZWN0cy5wdXNoKGUpOm5yKGUpfWZ1bmN0aW9uIGFzKGUsdCl7ZS5hY3RpdmVCcmFuY2g9dDtsZXR7dm5vZGU6bixwYXJlbnRDb21wb25lbnQ6cn09ZSxpPXQuZWw7Zm9yKDshaSYmdC5jb21wb25lbnQ7KXQ9dC5jb21wb25lbnQuc3ViVHJlZSxpPXQuZWw7bi5lbD1pLHImJnIuc3ViVHJlZT09PW4mJihyLnZub2RlLmVsPWksX28ocixpKSl9ZnVuY3Rpb24gb3MoZSl7bGV0IHQ9ZS5wcm9wcyYmZS5wcm9wcy5zdXNwZW5zaWJsZTtyZXR1cm4gdCE9bnVsbCYmdCE9PSExfXZhciBMPVN5bWJvbC5mb3IoYHYtZmd0YCksc3M9U3ltYm9sLmZvcihgdi10eHRgKSxjcz1TeW1ib2wuZm9yKGB2LWNtdGApLGxzPVN5bWJvbC5mb3IoYHYtc3RjYCksdXM9W10sZHM9bnVsbDtmdW5jdGlvbiBSKGU9ITEpe3VzLnB1c2goZHM9ZT9udWxsOltdKX1mdW5jdGlvbiBmcygpe3VzLnBvcCgpLGRzPXVzW3VzLmxlbmd0aC0xXXx8bnVsbH12YXIgcHM9MTtmdW5jdGlvbiBtcyhlLHQ9ITEpe3BzKz1lLGU8MCYmZHMmJnQmJihkcy5oYXNPbmNlPSEwKX1mdW5jdGlvbiBocyhlKXtyZXR1cm4gZS5keW5hbWljQ2hpbGRyZW49cHM+MD9kc3x8aTpudWxsLGZzKCkscHM+MCYmZHMmJmRzLnB1c2goZSksZX1mdW5jdGlvbiB6KGUsdCxuLHIsaSxhKXtyZXR1cm4gaHMoVihlLHQsbixyLGksYSwhMCkpfWZ1bmN0aW9uIEIoZSx0LG4scixpKXtyZXR1cm4gaHMoSChlLHQsbixyLGksITApKX1mdW5jdGlvbiBncyhlKXtyZXR1cm4gZT9lLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gX3MoZSx0KXtyZXR1cm4gZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQua2V5fWZ1bmN0aW9uIHZzKGUpe312YXIgeXM9KHtrZXk6ZX0pPT5lPz9udWxsLGJzPSh7cmVmOmUscmVmX2tleTp0LHJlZl9mb3I6bn0pPT4odHlwZW9mIGU9PWBudW1iZXJgJiYoZT1gYCtlKSxlPT1udWxsP251bGw6eShlKXx8aihlKXx8dihlKT97aTp1cixyOmUsazp0LGY6ISFufTplKTtmdW5jdGlvbiBWKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ZT09PUw/MDoxLG89ITEscz0hMSl7bGV0IGM9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6ZSxwcm9wczp0LGtleTp0JiZ5cyh0KSxyZWY6dCYmYnModCksc2NvcGVJZDpkcixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpuLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRTdGFydDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOmEscGF0Y2hGbGFnOnIsZHluYW1pY1Byb3BzOmksZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDp1cn07cmV0dXJuIHM/KE9zKGMsbiksYSYxMjgmJmUubm9ybWFsaXplKGMpKTpuJiYoYy5zaGFwZUZsYWd8PXkobik/ODoxNikscHM+MCYmIW8mJmRzJiYoYy5wYXRjaEZsYWc+MHx8YSY2KSYmYy5wYXRjaEZsYWchPT0zMiYmZHMucHVzaChjKSxjfXZhciBIPXhzO2Z1bmN0aW9uIHhzKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ITEpe2lmKCghZXx8ZT09PWxhKSYmKGU9Y3MpLGdzKGUpKXtsZXQgcj1DcyhlLHQsITApO3JldHVybiBuJiZPcyhyLG4pLHBzPjAmJiFhJiZkcyYmKHIuc2hhcGVGbGFnJjY/ZHNbZHMuaW5kZXhPZihlKV09cjpkcy5wdXNoKHIpKSxyLnBhdGNoRmxhZz0tMixyfWlmKGVjKGUpJiYoZT1lLl9fdmNjT3B0cyksdCl7dD1Tcyh0KTtsZXR7Y2xhc3M6ZSxzdHlsZTpufT10O2UmJiF5KGUpJiYodC5jbGFzcz1PKGUpKSx4KG4pJiYob24obikmJiFwKG4pJiYobj1sKHt9LG4pKSx0LnN0eWxlPWdlKG4pKX1sZXQgbz15KGUpPzE6Sm8oZSk/MTI4Ok1yKGUpPzY0OngoZSk/NDp2KGUpPzI6MDtyZXR1cm4gVihlLHQsbixyLGksbyxhLCEwKX1mdW5jdGlvbiBTcyhlKXtyZXR1cm4gZT9vbihlKXx8Ym8oZSk/bCh7fSxlKTplOm51bGx9ZnVuY3Rpb24gQ3MoZSx0LG49ITEscj0hMSl7bGV0e3Byb3BzOmkscmVmOmEscGF0Y2hGbGFnOm8sY2hpbGRyZW46cyx0cmFuc2l0aW9uOmN9PWUsbD10P2tzKGl8fHt9LHQpOmksdT17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTplLnR5cGUscHJvcHM6bCxrZXk6bCYmeXMobCkscmVmOnQmJnQucmVmP24mJmE/cChhKT9hLmNvbmNhdChicyh0KSk6W2EsYnModCldOmJzKHQpOmEsc2NvcGVJZDplLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmUuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOnMsdGFyZ2V0OmUudGFyZ2V0LHRhcmdldFN0YXJ0OmUudGFyZ2V0U3RhcnQsdGFyZ2V0QW5jaG9yOmUudGFyZ2V0QW5jaG9yLHN0YXRpY0NvdW50OmUuc3RhdGljQ291bnQsc2hhcGVGbGFnOmUuc2hhcGVGbGFnLHBhdGNoRmxhZzp0JiZlLnR5cGUhPT1MP289PT0tMT8xNjpvfDE2Om8sZHluYW1pY1Byb3BzOmUuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjplLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmUuYXBwQ29udGV4dCxkaXJzOmUuZGlycyx0cmFuc2l0aW9uOmMsY29tcG9uZW50OmUuY29tcG9uZW50LHN1c3BlbnNlOmUuc3VzcGVuc2Usc3NDb250ZW50OmUuc3NDb250ZW50JiZDcyhlLnNzQ29udGVudCksc3NGYWxsYmFjazplLnNzRmFsbGJhY2smJkNzKGUuc3NGYWxsYmFjaykscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcixlbDplLmVsLGFuY2hvcjplLmFuY2hvcixjdHg6ZS5jdHgsY2U6ZS5jZX07cmV0dXJuIGMmJnImJnJpKHUsYy5jbG9uZSh1KSksdX1mdW5jdGlvbiBVKGU9YCBgLHQ9MCl7cmV0dXJuIEgoc3MsbnVsbCxlLHQpfWZ1bmN0aW9uIHdzKGUsdCl7bGV0IG49SChscyxudWxsLGUpO3JldHVybiBuLnN0YXRpY0NvdW50PXQsbn1mdW5jdGlvbiBUcyhlPWBgLHQ9ITEpe3JldHVybiB0PyhSKCksQihjcyxudWxsLGUpKTpIKGNzLG51bGwsZSl9ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIGU9PW51bGx8fHR5cGVvZiBlPT1gYm9vbGVhbmA/SChjcyk6cChlKT9IKEwsbnVsbCxlLnNsaWNlKCkpOmdzKGUpP0RzKGUpOkgoc3MsbnVsbCxTdHJpbmcoZSkpfWZ1bmN0aW9uIERzKGUpe3JldHVybiBlLmVsPT09bnVsbCYmZS5wYXRjaEZsYWchPT0tMXx8ZS5tZW1vP2U6Q3MoZSl9ZnVuY3Rpb24gT3MoZSx0KXtsZXQgbj0wLHtzaGFwZUZsYWc6cn09ZTtpZih0PT1udWxsKXQ9bnVsbDtlbHNlIGlmKHAodCkpbj0xNjtlbHNlIGlmKHR5cGVvZiB0PT1gb2JqZWN0YCl7aWYociY2NSl7bGV0IG49dC5kZWZhdWx0O24mJihuLl9jJiYobi5fZD0hMSksT3MoZSxuKCkpLG4uX2MmJihuLl9kPSEwKSk7cmV0dXJufXtuPTMyO2xldCByPXQuXzshciYmIWJvKHQpP3QuX2N0eD11cjpyPT09MyYmdXImJih1ci5zbG90cy5fPT09MT90Ll89MToodC5fPTIsZS5wYXRjaEZsYWd8PTEwMjQpKX19ZWxzZSBpZih2KHQpKXtpZihyJjY1KXtPcyhlLHtkZWZhdWx0OnR9KTtyZXR1cm59dD17ZGVmYXVsdDp0LF9jdHg6dXJ9LG49MzJ9ZWxzZSB0PVN0cmluZyh0KSxyJjY0PyhuPTE2LHQ9W1UodCldKTpuPTg7ZS5jaGlsZHJlbj10LGUuc2hhcGVGbGFnfD1ufWZ1bmN0aW9uIGtzKC4uLmUpe2xldCB0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2ZvcihsZXQgZSBpbiByKWlmKGU9PT1gY2xhc3NgKXQuY2xhc3MhPT1yLmNsYXNzJiYodC5jbGFzcz1PKFt0LmNsYXNzLHIuY2xhc3NdKSk7ZWxzZSBpZihlPT09YHN0eWxlYCl0LnN0eWxlPWdlKFt0LnN0eWxlLHIuc3R5bGVdKTtlbHNlIGlmKHMoZSkpe2xldCBuPXRbZV0saT1yW2VdO2kmJm4hPT1pJiYhKHAobikmJm4uaW5jbHVkZXMoaSkpP3RbZV09bj9bXS5jb25jYXQobixpKTppOmk9PW51bGwmJm49PW51bGwmJiFjKGUpJiYodFtlXT1pKX1lbHNlIGUhPT1gYCYmKHRbZV09cltlXSl9cmV0dXJuIHR9ZnVuY3Rpb24gQXMoZSx0LG4scj1udWxsKXtIbihlLHQsNyxbbixyXSl9dmFyIGpzPSRhKCksTXM9MDtmdW5jdGlvbiBOcyhlLHQsbil7bGV0IGk9ZS50eXBlLGE9KHQ/dC5hcHBDb250ZXh0OmUuYXBwQ29udGV4dCl8fGpzLG89e3VpZDpNcysrLHZub2RlOmUsdHlwZTppLHBhcmVudDp0LGFwcENvbnRleHQ6YSxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxqb2I6bnVsbCxzY29wZTpuZXcgTmUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dD90LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoYS5wcm92aWRlcyksaWRzOnQ/dC5pZHM6W2BgLDAsMF0sYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpFbyhpLGEpLGVtaXRzT3B0aW9uczpzbyhpLGEpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpyLGluaGVyaXRBdHRyczppLmluaGVyaXRBdHRycyxjdHg6cixkYXRhOnIscHJvcHM6cixhdHRyczpyLHNsb3RzOnIscmVmczpyLHNldHVwU3RhdGU6cixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpuLHN1c3BlbnNlSWQ6bj9uLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIG8uY3R4PXtfOm99LG8ucm9vdD10P3Qucm9vdDpvLG8uZW1pdD1hby5iaW5kKG51bGwsbyksZS5jZSYmZS5jZShvKSxvfXZhciBQcz1udWxsLEZzPSgpPT5Qc3x8dXIsSXMsTHM7e2xldCBlPW1lKCksdD0odCxuKT0+e2xldCByO3JldHVybihyPWVbdF0pfHwocj1lW3RdPVtdKSxyLnB1c2gobiksZT0+e3IubGVuZ3RoPjE/ci5mb3JFYWNoKHQ9PnQoZSkpOnJbMF0oZSl9fTtJcz10KGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLGU9PlBzPWUpLExzPXQoYF9fVlVFX1NTUl9TRVRURVJTX19gLGU9PlZzPWUpfXZhciBScz1lPT57bGV0IHQ9UHM7cmV0dXJuIElzKGUpLGUuc2NvcGUub24oKSwoKT0+e2Uuc2NvcGUub2ZmKCksSXModCl9fSx6cz0oKT0+e1BzJiZQcy5zY29wZS5vZmYoKSxJcyhudWxsKX07ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIGUudm5vZGUuc2hhcGVGbGFnJjR9dmFyIFZzPSExO2Z1bmN0aW9uIEhzKGUsdD0hMSxuPSExKXt0JiZMcyh0KTtsZXR7cHJvcHM6cixjaGlsZHJlbjppfT1lLnZub2RlLGE9QnMoZSk7eG8oZSxyLGEsdCksUG8oZSxpLG58fHQpO2xldCBvPWE/VXMoZSx0KTp2b2lkIDA7cmV0dXJuIHQmJkxzKCExKSxvfWZ1bmN0aW9uIFVzKGUsdCl7bGV0IG49ZS50eXBlO2UuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLnByb3h5PW5ldyBQcm94eShlLmN0eCx4YSk7bGV0e3NldHVwOnJ9PW47aWYocil7bnQoKTtsZXQgbj1lLnNldHVwQ29udGV4dD1yLmxlbmd0aD4xP1pzKGUpOm51bGwsaT1ScyhlKSxhPVZuKHIsZSwwLFtlLnByb3BzLG5dKSxvPVMoYSk7aWYocnQoKSxpKCksKG98fGUuc3ApJiYhSWkoZSkmJm9pKGUpLG8pe2lmKGEudGhlbih6cyx6cyksdClyZXR1cm4gYS50aGVuKG49PntMcyghMCk7dHJ5e1dzKGUsbix0KX1maW5hbGx5e0xzKCExKX19KS5jYXRjaCh0PT57VW4odCxlLDApfSk7ZS5hc3luY0RlcD1hfWVsc2UgV3MoZSxhLHQpfWVsc2UgWXMoZSx0KX1mdW5jdGlvbiBXcyhlLHQsbil7dih0KT9lLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/ZS5zc3JSZW5kZXI9dDplLnJlbmRlcj10OngodCkmJihlLnNldHVwU3RhdGU9Z24odCkpLFlzKGUsbil9dmFyIEdzLEtzO2Z1bmN0aW9uIHFzKGUpe0dzPWUsS3M9ZT0+e2UucmVuZGVyLl9yYyYmKGUud2l0aFByb3h5PW5ldyBQcm94eShlLmN0eCxTYSkpfX12YXIgSnM9KCk9PiFHcztmdW5jdGlvbiBZcyhlLHQsbil7bGV0IHI9ZS50eXBlO2lmKCFlLnJlbmRlcil7aWYoIXQmJkdzJiYhci5yZW5kZXIpe2xldCB0PXIudGVtcGxhdGV8fFVhKGUpLnRlbXBsYXRlO2lmKHQpe2xldHtpc0N1c3RvbUVsZW1lbnQ6bixjb21waWxlck9wdGlvbnM6aX09ZS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczphLGNvbXBpbGVyT3B0aW9uczpvfT1yLHM9bChsKHtpc0N1c3RvbUVsZW1lbnQ6bixkZWxpbWl0ZXJzOmF9LGkpLG8pO3IucmVuZGVyPUdzKHQscyl9fWUucmVuZGVyPXIucmVuZGVyfHxhLEtzJiZLcyhlKX17bGV0IHQ9UnMoZSk7bnQoKTt0cnl7emEoZSl9ZmluYWxseXtydCgpLHQoKX19fXZhciBYcz17Z2V0KGUsdCl7cmV0dXJuIHB0KGUsYGdldGAsYGApLGVbdF19fTtmdW5jdGlvbiBacyhlKXtyZXR1cm57YXR0cnM6bmV3IFByb3h5KGUuYXR0cnMsWHMpLHNsb3RzOmUuc2xvdHMsZW1pdDplLmVtaXQsZXhwb3NlOnQ9PntlLmV4cG9zZWQ9dHx8e319fX1mdW5jdGlvbiBRcyhlKXtyZXR1cm4gZS5leHBvc2VkP2UuZXhwb3NlUHJveHl8fD1uZXcgUHJveHkoZ24oc24oZS5leHBvc2VkKSkse2dldCh0LG4pe2lmKG4gaW4gdClyZXR1cm4gdFtuXTtpZihuIGluIHlhKXJldHVybiB5YVtuXShlKX0saGFzKGUsdCl7cmV0dXJuIHQgaW4gZXx8dCBpbiB5YX19KTplLnByb3h5fWZ1bmN0aW9uICRzKGUsdD0hMCl7cmV0dXJuIHYoZSk/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOmUubmFtZXx8dCYmZS5fX25hbWV9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIHYoZSkmJmBfX3ZjY09wdHNgaW4gZX12YXIgVz0oZSx0KT0+VG4oZSx0LFZzKTtmdW5jdGlvbiBHKGUsdCxuKXt0cnl7bXMoLTEpO2xldCByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI9PT0yP3godCkmJiFwKHQpP2dzKHQpP0goZSxudWxsLFt0XSk6SChlLHQpOkgoZSxudWxsLHQpOihyPjM/bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6cj09PTMmJmdzKG4pJiYobj1bbl0pLEgoZSx0LG4pKX1maW5hbGx5e21zKDEpfX1mdW5jdGlvbiB0Yygpe31mdW5jdGlvbiBuYyhlLHQsbixyKXtsZXQgaT1uW3JdO2lmKGkmJnJjKGksZSkpcmV0dXJuIGk7bGV0IGE9dCgpO3JldHVybiBhLm1lbW89ZS5zbGljZSgpLGEuY2FjaGVJbmRleD1yLG5bcl09YX1mdW5jdGlvbiByYyhlLHQpe2xldCBuPWUubWVtbztpZihuLmxlbmd0aCE9dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoRChuW2VdLHRbZV0pKXJldHVybiExO3JldHVybiBwcz4wJiZkcyYmZHMucHVzaChlKSwhMH12YXIgaWM9YDMuNS40MWAsYWM9YSxvYz1CbixzYz1zcixjYz1scixsYz17Y3JlYXRlQ29tcG9uZW50SW5zdGFuY2U6TnMsc2V0dXBDb21wb25lbnQ6SHMscmVuZGVyQ29tcG9uZW50Um9vdDpsbyxzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U6ZnIsaXNWTm9kZTpncyxub3JtYWxpemVWTm9kZTpFcyxnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZTpRcyxlbnN1cmVWYWxpZFZOb2RlOmdhLHB1c2hXYXJuaW5nQ29udGV4dDpJbixwb3BXYXJuaW5nQ29udGV4dDpMbn0sdWM9dm9pZCAwLGRjPXR5cGVvZiB3aW5kb3c8YHVgJiZ3aW5kb3cudHJ1c3RlZFR5cGVzO2lmKGRjKXRyeXt1Yz1kYy5jcmVhdGVQb2xpY3koYHZ1ZWAse2NyZWF0ZUhUTUw6ZT0+ZX0pfWNhdGNoe312YXIgZmM9dWM/ZT0+dWMuY3JlYXRlSFRNTChlKTplPT5lLHBjPWBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsbWM9YGh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxgLGhjPXR5cGVvZiBkb2N1bWVudDxgdWA/ZG9jdW1lbnQ6bnVsbCxnYz1oYyYmaGMuY3JlYXRlRWxlbWVudChgdGVtcGxhdGVgKSxfYz17aW5zZXJ0OihlLHQsbik9Pnt0Lmluc2VydEJlZm9yZShlLG58fG51bGwpfSxyZW1vdmU6ZT0+e2xldCB0PWUucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKGUpfSxjcmVhdGVFbGVtZW50OihlLHQsbixyKT0+e2xldCBpPXQ9PT1gc3ZnYD9oYy5jcmVhdGVFbGVtZW50TlMocGMsZSk6dD09PWBtYXRobWxgP2hjLmNyZWF0ZUVsZW1lbnROUyhtYyxlKTpuP2hjLmNyZWF0ZUVsZW1lbnQoZSx7aXM6bn0pOmhjLmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIGU9PT1gc2VsZWN0YCYmciYmci5tdWx0aXBsZSE9bnVsbCYmaS5zZXRBdHRyaWJ1dGUoYG11bHRpcGxlYCxyLm11bHRpcGxlKSxpfSxjcmVhdGVUZXh0OmU9PmhjLmNyZWF0ZVRleHROb2RlKGUpLGNyZWF0ZUNvbW1lbnQ6ZT0+aGMuY3JlYXRlQ29tbWVudChlKSxzZXRUZXh0OihlLHQpPT57ZS5ub2RlVmFsdWU9dH0sc2V0RWxlbWVudFRleHQ6KGUsdCk9PntlLnRleHRDb250ZW50PXR9LHBhcmVudE5vZGU6ZT0+ZS5wYXJlbnROb2RlLG5leHRTaWJsaW5nOmU9PmUubmV4dFNpYmxpbmcscXVlcnlTZWxlY3RvcjplPT5oYy5xdWVyeVNlbGVjdG9yKGUpLHNldFNjb3BlSWQoZSx0KXtlLnNldEF0dHJpYnV0ZSh0LGBgKX0saW5zZXJ0U3RhdGljQ29udGVudChlLHQsbixyLGksYSl7bGV0IG89bj9uLnByZXZpb3VzU2libGluZzp0Lmxhc3RDaGlsZDtpZihpJiYoaT09PWF8fGkubmV4dFNpYmxpbmcpKWZvcig7dC5pbnNlcnRCZWZvcmUoaS5jbG9uZU5vZGUoITApLG4pLCEoaT09PWF8fCEoaT1pLm5leHRTaWJsaW5nKSk7KTtlbHNle2djLmlubmVySFRNTD1mYyhyPT09YHN2Z2A/YDxzdmc+JHtlfTwvc3ZnPmA6cj09PWBtYXRobWxgP2A8bWF0aD4ke2V9PC9tYXRoPmA6ZSk7bGV0IGk9Z2MuY29udGVudDtpZihyPT09YHN2Z2B8fHI9PT1gbWF0aG1sYCl7bGV0IGU9aS5maXJzdENoaWxkO2Zvcig7ZS5maXJzdENoaWxkOylpLmFwcGVuZENoaWxkKGUuZmlyc3RDaGlsZCk7aS5yZW1vdmVDaGlsZChlKX10Lmluc2VydEJlZm9yZShpLG4pfXJldHVybltvP28ubmV4dFNpYmxpbmc6dC5maXJzdENoaWxkLG4/bi5wcmV2aW91c1NpYmxpbmc6dC5sYXN0Q2hpbGRdfX0sdmM9YHRyYW5zaXRpb25gLHljPWBhbmltYXRpb25gLGJjPVN5bWJvbChgX3Z0Y2ApLHhjPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxTYz1sKHt9LEpyLHhjKSxDYz0oZT0+KGUuZGlzcGxheU5hbWU9YFRyYW5zaXRpb25gLGUucHJvcHM9U2MsZSkpKChlLHtzbG90czp0fSk9PkcoUXIsRWMoZSksdCkpLHdjPShlLHQ9W10pPT57cChlKT9lLmZvckVhY2goZT0+ZSguLi50KSk6ZSYmZSguLi50KX0sVGM9ZT0+ZT9wKGUpP2Uuc29tZShlPT5lLmxlbmd0aD4xKTplLmxlbmd0aD4xOiExO2Z1bmN0aW9uIEVjKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKW4gaW4geGN8fCh0W25dPWVbbl0pO2lmKGUuY3NzPT09ITEpcmV0dXJuIHQ7bGV0e25hbWU6bj1gdmAsdHlwZTpyLGR1cmF0aW9uOmksZW50ZXJGcm9tQ2xhc3M6YT1gJHtufS1lbnRlci1mcm9tYCxlbnRlckFjdGl2ZUNsYXNzOm89YCR7bn0tZW50ZXItYWN0aXZlYCxlbnRlclRvQ2xhc3M6cz1gJHtufS1lbnRlci10b2AsYXBwZWFyRnJvbUNsYXNzOmM9YSxhcHBlYXJBY3RpdmVDbGFzczp1PW8sYXBwZWFyVG9DbGFzczpkPXMsbGVhdmVGcm9tQ2xhc3M6Zj1gJHtufS1sZWF2ZS1mcm9tYCxsZWF2ZUFjdGl2ZUNsYXNzOnA9YCR7bn0tbGVhdmUtYWN0aXZlYCxsZWF2ZVRvQ2xhc3M6bT1gJHtufS1sZWF2ZS10b2B9PWUsaD1EYyhpKSxnPWgmJmhbMF0sXz1oJiZoWzFdLHtvbkJlZm9yZUVudGVyOnYsb25FbnRlcjp5LG9uRW50ZXJDYW5jZWxsZWQ6YixvbkxlYXZlOngsb25MZWF2ZUNhbmNlbGxlZDpTLG9uQmVmb3JlQXBwZWFyOkM9dixvbkFwcGVhcjp3PXksb25BcHBlYXJDYW5jZWxsZWQ6ZWU9Yn09dCx0ZT0oZSx0LG4scik9PntlLl9lbnRlckNhbmNlbGxlZD1yLEFjKGUsdD9kOnMpLEFjKGUsdD91Om8pLG4mJm4oKX0sVD0oZSx0KT0+e2UuX2lzTGVhdmluZz0hMSxBYyhlLGYpLEFjKGUsbSksQWMoZSxwKSx0JiZ0KCl9LG5lPWU9Pih0LG4pPT57bGV0IGk9ZT93Onksbz0oKT0+dGUodCxlLG4pO3djKGksW3Qsb10pLGpjKCgpPT57QWModCxlP2M6YSksa2ModCxlP2Q6cyksVGMoaSl8fE5jKHQscixnLG8pfSl9O3JldHVybiBsKHQse29uQmVmb3JlRW50ZXIoZSl7d2ModixbZV0pLGtjKGUsYSksa2MoZSxvKX0sb25CZWZvcmVBcHBlYXIoZSl7d2MoQyxbZV0pLGtjKGUsYyksa2MoZSx1KX0sb25FbnRlcjpuZSghMSksb25BcHBlYXI6bmUoITApLG9uTGVhdmUoZSx0KXtlLl9pc0xlYXZpbmc9ITA7bGV0IG49KCk9PlQoZSx0KTtrYyhlLGYpLGUuX2VudGVyQ2FuY2VsbGVkPyhrYyhlLHApLExjKGUpKTooTGMoZSksa2MoZSxwKSksamMoKCk9PntlLl9pc0xlYXZpbmcmJihBYyhlLGYpLGtjKGUsbSksVGMoeCl8fE5jKGUscixfLG4pKX0pLHdjKHgsW2Usbl0pfSxvbkVudGVyQ2FuY2VsbGVkKGUpe3RlKGUsITEsdm9pZCAwLCEwKSx3YyhiLFtlXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKGUpe3RlKGUsITAsdm9pZCAwLCEwKSx3YyhlZSxbZV0pfSxvbkxlYXZlQ2FuY2VsbGVkKGUpe1QoZSksd2MoUyxbZV0pfX0pfWZ1bmN0aW9uIERjKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoeChlKSlyZXR1cm5bT2MoZS5lbnRlciksT2MoZS5sZWF2ZSldO3tsZXQgdD1PYyhlKTtyZXR1cm5bdCx0XX19ZnVuY3Rpb24gT2MoZSl7cmV0dXJuIGZlKGUpfWZ1bmN0aW9uIGtjKGUsdCl7dC5zcGxpdCgvXHMrLykuZm9yRWFjaCh0PT50JiZlLmNsYXNzTGlzdC5hZGQodCkpLChlW2JjXXx8KGVbYmNdPW5ldyBTZXQpKS5hZGQodCl9ZnVuY3Rpb24gQWMoZSx0KXt0LnNwbGl0KC9ccysvKS5mb3JFYWNoKHQ9PnQmJmUuY2xhc3NMaXN0LnJlbW92ZSh0KSk7bGV0IG49ZVtiY107biYmKG4uZGVsZXRlKHQpLG4uc2l6ZXx8KGVbYmNdPXZvaWQgMCkpfWZ1bmN0aW9uIGpjKGUpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShlKX0pfXZhciBNYz0wO2Z1bmN0aW9uIE5jKGUsdCxuLHIpe2xldCBpPWUuX2VuZElkPSsrTWMsYT0oKT0+e2k9PT1lLl9lbmRJZCYmcigpfTtpZihuIT1udWxsKXJldHVybiBzZXRUaW1lb3V0KGEsbik7bGV0e3R5cGU6byx0aW1lb3V0OnMscHJvcENvdW50OmN9PVBjKGUsdCk7aWYoIW8pcmV0dXJuIHIoKTtsZXQgbD1vK2BlbmRgLHU9MCxkPSgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKGwsZiksYSgpfSxmPXQ9Pnt0LnRhcmdldD09PWUmJisrdT49YyYmZCgpfTtzZXRUaW1lb3V0KCgpPT57dTxjJiZkKCl9LHMrMSksZS5hZGRFdmVudExpc3RlbmVyKGwsZil9ZnVuY3Rpb24gUGMoZSx0KXtsZXQgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxyPWU9PihuW2VdfHxgYCkuc3BsaXQoYCwgYCksaT1yKGAke3ZjfURlbGF5YCksYT1yKGAke3ZjfUR1cmF0aW9uYCksbz1GYyhpLGEpLHM9cihgJHt5Y31EZWxheWApLGM9cihgJHt5Y31EdXJhdGlvbmApLGw9RmMocyxjKSx1PW51bGwsZD0wLGY9MDt0PT09dmM/bz4wJiYodT12YyxkPW8sZj1hLmxlbmd0aCk6dD09PXljP2w+MCYmKHU9eWMsZD1sLGY9Yy5sZW5ndGgpOihkPU1hdGgubWF4KG8sbCksdT1kPjA/bz5sP3ZjOnljOm51bGwsZj11P3U9PT12Yz9hLmxlbmd0aDpjLmxlbmd0aDowKTtsZXQgcD11PT09dmMmJi9cYig/OnRyYW5zZm9ybXxhbGwpKD86LHwkKS8udGVzdChyKGAke3ZjfVByb3BlcnR5YCkudG9TdHJpbmcoKSk7cmV0dXJue3R5cGU6dSx0aW1lb3V0OmQscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOnB9fWZ1bmN0aW9uIEZjKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXgoLi4udC5tYXAoKHQsbik9PkljKHQpK0ljKGVbbl0pKSl9ZnVuY3Rpb24gSWMoZSl7cmV0dXJuIGU9PT1gYXV0b2A/MDpOdW1iZXIoZS5zbGljZSgwLC0xKS5yZXBsYWNlKGAsYCxgLmApKSoxZTN9ZnVuY3Rpb24gTGMoZSl7cmV0dXJuKGU/ZS5vd25lckRvY3VtZW50OmRvY3VtZW50KS5ib2R5Lm9mZnNldEhlaWdodH1mdW5jdGlvbiBSYyhlLHQsbil7bGV0IHI9ZVtiY107ciYmKHQ9KHQ/W3QsLi4ucl06Wy4uLnJdKS5qb2luKGAgYCkpLHQ9PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6bj9lLnNldEF0dHJpYnV0ZShgY2xhc3NgLHQpOmUuY2xhc3NOYW1lPXR9dmFyIHpjPVN5bWJvbChgX3ZvZGApLEJjPVN5bWJvbChgX3ZzaGApLFZjPXtuYW1lOmBzaG93YCxiZWZvcmVNb3VudChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7ZVt6Y109ZS5zdHlsZS5kaXNwbGF5PT09YG5vbmVgP2BgOmUuc3R5bGUuZGlzcGxheSxuJiZ0P24uYmVmb3JlRW50ZXIoZSk6SGMoZSx0KX0sbW91bnRlZChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7biYmdCYmbi5lbnRlcihlKX0sdXBkYXRlZChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHt0cmFuc2l0aW9uOnJ9KXshdCE9IW4mJihyP3Q/KHIuYmVmb3JlRW50ZXIoZSksSGMoZSwhMCksci5lbnRlcihlKSk6ci5sZWF2ZShlLCgpPT57SGMoZSwhMSl9KTpIYyhlLHQpKX0sYmVmb3JlVW5tb3VudChlLHt2YWx1ZTp0fSl7SGMoZSx0KX19O2Z1bmN0aW9uIEhjKGUsdCl7ZS5zdHlsZS5kaXNwbGF5PXQ/ZVt6Y106YG5vbmVgLGVbQmNdPSF0fWZ1bmN0aW9uIFVjKCl7VmMuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSk9PntpZighZSlyZXR1cm57c3R5bGU6e2Rpc3BsYXk6YG5vbmVgfX19fXZhciBXYz1TeW1ib2woYGApO2Z1bmN0aW9uIEdjKGUpe2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuO2xldCBuPXQudXQ9KG49ZSh0LnByb3h5KSk9PntBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXYtb3duZXI9IiR7dC51aWR9Il1gKSkuZm9yRWFjaChlPT5xYyhlLG4pKX0scj0oKT0+e2xldCByPWUodC5wcm94eSk7dC5jZT9xYyh0LmNlLHIpOktjKHQuc3ViVHJlZSxyKSxuKHIpfTtRaSgoKT0+e25yKHIpfSksWmkoKCk9PntFcihyLGEse2ZsdXNoOmBwb3N0YH0pO2xldCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHIpO2Uub2JzZXJ2ZSh0LnN1YlRyZWUuZWwucGFyZW50Tm9kZSx7Y2hpbGRMaXN0OiEwfSksdGEoKCk9PmUuZGlzY29ubmVjdCgpKX0pfWZ1bmN0aW9uIEtjKGUsdCl7aWYoZS5zaGFwZUZsYWcmMTI4KXtsZXQgbj1lLnN1c3BlbnNlO2U9bi5hY3RpdmVCcmFuY2gsbi5wZW5kaW5nQnJhbmNoJiYhbi5pc0h5ZHJhdGluZyYmbi5lZmZlY3RzLnB1c2goKCk9PntLYyhuLmFjdGl2ZUJyYW5jaCx0KX0pfWZvcig7ZS5jb21wb25lbnQ7KWU9ZS5jb21wb25lbnQuc3ViVHJlZTtpZihlLnNoYXBlRmxhZyYxJiZlLmVsKXFjKGUuZWwsdCk7ZWxzZSBpZihlLnR5cGU9PT1MKWUuY2hpbGRyZW4uZm9yRWFjaChlPT5LYyhlLHQpKTtlbHNlIGlmKGUudHlwZT09PWxzKXtsZXR7ZWw6bixhbmNob3I6cn09ZTtmb3IoO24mJihxYyhuLHQpLG4hPT1yKTspbj1uLm5leHRTaWJsaW5nfX1mdW5jdGlvbiBxYyhlLHQpe2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgbj1lLnN0eWxlLHI9YGA7Zm9yKGxldCBlIGluIHQpe2xldCBpPWplKHRbZV0pO24uc2V0UHJvcGVydHkoYC0tJHtlfWAsaSkscis9YC0tJHtlfTogJHtpfTtgfW5bV2NdPXJ9fXZhciBKYz0vKD86Xnw7KVxzKmRpc3BsYXlccyo6LztmdW5jdGlvbiBZYyhlLHQsbil7bGV0IHI9ZS5zdHlsZSxpPXkobiksYT0hMTtpZihuJiYhaSl7aWYodCl7aWYoeSh0KSlmb3IobGV0IGUgb2YgdC5zcGxpdChgO2ApKXtsZXQgdD1lLnNsaWNlKDAsZS5pbmRleE9mKGA6YCkpLnRyaW0oKTtuW3RdPz9aYyhyLHQsYGApfWVsc2UgZm9yKGxldCBlIGluIHQpbltlXT8/WmMocixlLGBgKX1mb3IobGV0IGkgaW4gbil7aT09PWBkaXNwbGF5YCYmKGE9ITApO2xldCBvPW5baV07bz09bnVsbD9aYyhyLGksYGApOnRsKGUsaSwheSh0KSYmdD90W2ldOnZvaWQgMCxvKXx8WmMocixpLG8pfX1lbHNlIGlmKGkpe2lmKHQhPT1uKXtsZXQgZT1yW1djXTtlJiYobis9YDtgK2UpLHIuY3NzVGV4dD1uLGE9SmMudGVzdChuKX19ZWxzZSB0JiZlLnJlbW92ZUF0dHJpYnV0ZShgc3R5bGVgKTt6YyBpbiBlJiYoZVt6Y109YT9yLmRpc3BsYXk6YGAsZVtCY10mJihyLmRpc3BsYXk9YG5vbmVgKSl9dmFyIFhjPS9ccyohaW1wb3J0YW50JC87ZnVuY3Rpb24gWmMoZSx0LG4pe2lmKHAobikpbi5mb3JFYWNoKG49PlpjKGUsdCxuKSk7ZWxzZSBpZihuPz89YGAsdC5zdGFydHNXaXRoKGAtLWApKWUuc2V0UHJvcGVydHkodCxuKTtlbHNle2xldCByPWVsKGUsdCk7WGMudGVzdChuKT9lLnNldFByb3BlcnR5KG9lKHIpLG4ucmVwbGFjZShYYyxgYCksYGltcG9ydGFudGApOmVbcl09bn19dmFyIFFjPVtgV2Via2l0YCxgTW96YCxgbXNgXSwkYz17fTtmdW5jdGlvbiBlbChlLHQpe2xldCBuPSRjW3RdO2lmKG4pcmV0dXJuIG47bGV0IHI9RSh0KTtpZihyIT09YGZpbHRlcmAmJnIgaW4gZSlyZXR1cm4gJGNbdF09cjtyPXNlKHIpO2ZvcihsZXQgbj0wO248UWMubGVuZ3RoO24rKyl7bGV0IGk9UWNbbl0rcjtpZihpIGluIGUpcmV0dXJuICRjW3RdPWl9cmV0dXJuIHR9ZnVuY3Rpb24gdGwoZSx0LG4scil7cmV0dXJuIGUudGFnTmFtZT09PWBURVhUQVJFQWAmJih0PT09YHdpZHRoYHx8dD09PWBoZWlnaHRgKSYmeShyKSYmbj09PXJ9dmFyIG5sPWBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rYDtmdW5jdGlvbiBybChlLHQsbixyLGksYT1DZSh0KSl7ciYmdC5zdGFydHNXaXRoKGB4bGluazpgKT9uPT1udWxsP2UucmVtb3ZlQXR0cmlidXRlTlMobmwsdC5zbGljZSg2LHQubGVuZ3RoKSk6ZS5zZXRBdHRyaWJ1dGVOUyhubCx0LG4pOm49PW51bGx8fGEmJiF3ZShuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LGE/YGA6YihuKT9TdHJpbmcobik6bil9ZnVuY3Rpb24gaWwoZSx0LG4scixpKXtpZih0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgKXtuIT1udWxsJiYoZVt0XT10PT09YGlubmVySFRNTGA/ZmMobik6bik7cmV0dXJufWxldCBhPWUudGFnTmFtZTtpZih0PT09YHZhbHVlYCYmYSE9PWBQUk9HUkVTU2AmJiFhLmluY2x1ZGVzKGAtYCkpe2xldCByPWE9PT1gT1BUSU9OYD9lLmdldEF0dHJpYnV0ZShgdmFsdWVgKXx8YGA6ZS52YWx1ZSxpPW49PW51bGw/ZS50eXBlPT09YGNoZWNrYm94YD9gb25gOmBgOlN0cmluZyhuKTsociE9PWl8fCEoYF92YWx1ZWBpbiBlKSkmJihlLnZhbHVlPWkpLG4/P2UucmVtb3ZlQXR0cmlidXRlKHQpLGUuX3ZhbHVlPW47cmV0dXJufWxldCBvPSExO2lmKG49PT1gYHx8bj09bnVsbCl7bGV0IHI9dHlwZW9mIGVbdF07cj09PWBib29sZWFuYD9uPXdlKG4pOm49PW51bGwmJnI9PT1gc3RyaW5nYD8obj1gYCxvPSEwKTpyPT09YG51bWJlcmAmJihuPTAsbz0hMCl9dHJ5e2VbdF09bn1jYXRjaHt9byYmZS5yZW1vdmVBdHRyaWJ1dGUoaXx8dCl9ZnVuY3Rpb24gYWwoZSx0LG4scil7ZS5hZGRFdmVudExpc3RlbmVyKHQsbixyKX1mdW5jdGlvbiBvbChlLHQsbixyKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLHIpfXZhciBzbD1TeW1ib2woYF92ZWlgKTtmdW5jdGlvbiBjbChlLHQsbixyLGk9bnVsbCl7bGV0IGE9ZVtzbF18fChlW3NsXT17fSksbz1hW3RdO2lmKHImJm8pby52YWx1ZT1yO2Vsc2V7bGV0W24sc109ZGwodCk7cj9hbChlLG4sYVt0XT1obChyLGkpLHMpOm8mJihvbChlLG4sbyxzKSxhW3RdPXZvaWQgMCl9fXZhciBsbD0vKE9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvLHVsPS9eb246Pyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIGRsKGUpe2xldCB0LG47Zm9yKDsobj1lLm1hdGNoKGxsKSkmJiF1bC50ZXN0KGUpOyl0fHw9e30sZT1lLnNsaWNlKDAsZS5sZW5ndGgtblsxXS5sZW5ndGgpLHRbblsxXS50b0xvd2VyQ2FzZSgpXT0hMDtyZXR1cm5bZVsyXT09PWA6YD9lLnNsaWNlKDMpOm9lKGUuc2xpY2UoMikpLHRdfXZhciBmbD0wLHBsPVByb21pc2UucmVzb2x2ZSgpLG1sPSgpPT5mbHx8PShwbC50aGVuKCgpPT5mbD0wKSxEYXRlLm5vdygpKTtmdW5jdGlvbiBobChlLHQpe2xldCBuPWU9PntpZighZS5fdnRzKWUuX3Z0cz1EYXRlLm5vdygpO2Vsc2UgaWYoZS5fdnRzPD1uLmF0dGFjaGVkKXJldHVybjtsZXQgcj1uLnZhbHVlO2lmKHAocikpe2xldCBuPWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPSgpPT57bi5jYWxsKGUpLGUuX3N0b3BwZWQ9ITB9O2xldCBpPXIuc2xpY2UoKSxhPVtlXTtmb3IobGV0IG49MDtuPGkubGVuZ3RoJiYhZS5fc3RvcHBlZDtuKyspe2xldCBlPWlbbl07ZSYmSG4oZSx0LDUsYSl9fWVsc2UgSG4ocix0LDUsW2VdKX07cmV0dXJuIG4udmFsdWU9ZSxuLmF0dGFjaGVkPW1sKCksbn12YXIgZ2w9ZT0+ZS5jaGFyQ29kZUF0KDApPT09MTExJiZlLmNoYXJDb2RlQXQoMSk9PT0xMTAmJmUuY2hhckNvZGVBdCgyKT45NiYmZS5jaGFyQ29kZUF0KDIpPDEyMyxfbD0oZSx0LG4scixpLGEpPT57bGV0IG89aT09PWBzdmdgO3Q9PT1gY2xhc3NgP1JjKGUscixvKTp0PT09YHN0eWxlYD9ZYyhlLG4scik6cyh0KT9jKHQpfHxjbChlLHQsbixyLGEpOih0WzBdPT09YC5gPyh0PXQuc2xpY2UoMSksITApOnRbMF09PT1gXmA/KHQ9dC5zbGljZSgxKSwhMSk6dmwoZSx0LHIsbykpPyhpbChlLHQsciksIWUudGFnTmFtZS5pbmNsdWRlcyhgLWApJiYodD09PWB2YWx1ZWB8fHQ9PT1gY2hlY2tlZGB8fHQ9PT1gc2VsZWN0ZWRgKSYmcmwoZSx0LHIsbyxhLHQhPT1gdmFsdWVgKSk6ZS5faXNWdWVDRSYmKHlsKGUsdCl8fGUuX2RlZi5fX2FzeW5jTG9hZGVyJiYoL1tBLVpdLy50ZXN0KHQpfHwheShyKSkpP2lsKGUsRSh0KSxyLGEsdCk6KHQ9PT1gdHJ1ZS12YWx1ZWA/ZS5fdHJ1ZVZhbHVlPXI6dD09PWBmYWxzZS12YWx1ZWAmJihlLl9mYWxzZVZhbHVlPXIpLHJsKGUsdCxyLG8pKX07ZnVuY3Rpb24gdmwoZSx0LG4scil7aWYocilyZXR1cm4hISh0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgfHx0IGluIGUmJmdsKHQpJiZ2KG4pKTtpZih0PT09YHNwZWxsY2hlY2tgfHx0PT09YGRyYWdnYWJsZWB8fHQ9PT1gdHJhbnNsYXRlYHx8dD09PWBhdXRvY29ycmVjdGB8fHQ9PT1gc2FuZGJveGAmJmUudGFnTmFtZT09PWBJRlJBTUVgfHx0PT09YGZvcm1gfHx0PT09YGxpc3RgJiZlLnRhZ05hbWU9PT1gSU5QVVRgfHx0PT09YHR5cGVgJiZlLnRhZ05hbWU9PT1gVEVYVEFSRUFgKXJldHVybiExO2lmKHQ9PT1gd2lkdGhgfHx0PT09YGhlaWdodGApe2xldCB0PWUudGFnTmFtZTtpZih0PT09YElNR2B8fHQ9PT1gVklERU9gfHx0PT09YENBTlZBU2B8fHQ9PT1gU09VUkNFYClyZXR1cm4hMX1yZXR1cm4gZ2wodCkmJnkobik/ITE6dCBpbiBlfWZ1bmN0aW9uIHlsKGUsdCl7bGV0IG49ZS5fZGVmLnByb3BzO2lmKCFuKXJldHVybiExO2xldCByPUUodCk7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/bi5zb21lKGU9PkUoZSk9PT1yKTpPYmplY3Qua2V5cyhuKS5zb21lKGU9PkUoZSk9PT1yKX12YXIgYmw9e307ZnVuY3Rpb24geGwoZSx0LG4pe2xldCByPUYoZSx0KTt0ZShyKSYmKHI9bCh7fSxyLHQpKTtjbGFzcyBpIGV4dGVuZHMgd2x7Y29uc3RydWN0b3IoZSl7c3VwZXIocixlLG4pfX1yZXR1cm4gaS5kZWY9cixpfXZhciBTbD0oKGUsdCk9PnhsKGUsdCxodSkpLENsPXR5cGVvZiBIVE1MRWxlbWVudDxgdWA/SFRNTEVsZW1lbnQ6Y2xhc3N7fSx3bD1jbGFzcyBlIGV4dGVuZHMgQ2x7Y29uc3RydWN0b3IoZSx0PXt9LG49bXUpe3N1cGVyKCksdGhpcy5fZGVmPWUsdGhpcy5fcHJvcHM9dCx0aGlzLl9jcmVhdGVBcHA9bix0aGlzLl9pc1Z1ZUNFPSEwLHRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fYXBwPW51bGwsdGhpcy5fbm9uY2U9dGhpcy5fZGVmLm5vbmNlLHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzLl9yZXNvbHZlZD0hMSx0aGlzLl9wYXRjaGluZz0hMSx0aGlzLl9kaXJ0eT0hMSx0aGlzLl9udW1iZXJQcm9wcz1udWxsLHRoaXMuX3N0eWxlQ2hpbGRyZW49bmV3IFdlYWtTZXQsdGhpcy5fc3R5bGVBbmNob3JzPW5ldyBXZWFrTWFwLHRoaXMuX29iPW51bGwsdGhpcy5zaGFkb3dSb290JiZuIT09bXU/dGhpcy5fcm9vdD10aGlzLnNoYWRvd1Jvb3Q6ZS5zaGFkb3dSb290PT09ITE/dGhpcy5fcm9vdD10aGlzOih0aGlzLmF0dGFjaFNoYWRvdyhsKHt9LGUuc2hhZG93Um9vdE9wdGlvbnMse21vZGU6YG9wZW5gfSkpLHRoaXMuX3Jvb3Q9dGhpcy5zaGFkb3dSb290KX1jb25uZWN0ZWRDYWxsYmFjaygpe2lmKCF0aGlzLmlzQ29ubmVjdGVkKXJldHVybjshdGhpcy5zaGFkb3dSb290JiYhdGhpcy5fcmVzb2x2ZWQmJnRoaXMuX3BhcnNlU2xvdHMoKSx0aGlzLl9jb25uZWN0ZWQ9ITA7bGV0IHQ9dGhpcztmb3IoO3QmJj10LmFzc2lnbmVkU2xvdHx8dC5wYXJlbnROb2RlfHx0Lmhvc3Q7KWlmKHQgaW5zdGFuY2VvZiBlKXt0aGlzLl9wYXJlbnQ9dDticmVha310aGlzLl9pbnN0YW5jZXx8KHRoaXMuX3Jlc29sdmVkP3RoaXMuX21vdW50KHRoaXMuX2RlZik6dCYmdC5fcGVuZGluZ1Jlc29sdmU/dGhpcy5fcGVuZGluZ1Jlc29sdmU9dC5fcGVuZGluZ1Jlc29sdmUudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlPXZvaWQgMCx0aGlzLmlzQ29ubmVjdGVkKXJldHVybiB0aGlzLl9yZXNvbHZlRGVmKCl9KTp0aGlzLl9yZXNvbHZlRGVmKCkpfV9zZXRQYXJlbnQoZT10aGlzLl9wYXJlbnQpe2UmJih0aGlzLl9pbnN0YW5jZS5wYXJlbnQ9ZS5faW5zdGFuY2UsdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoZSkpfV9pbmhlcml0UGFyZW50Q29udGV4dChlPXRoaXMuX3BhcmVudCl7ZSYmdGhpcy5fYXBwJiZPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcy5fYXBwLl9jb250ZXh0LnByb3ZpZGVzLGUuX2luc3RhbmNlLnByb3ZpZGVzKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX2Nvbm5lY3RlZD0hMSxRbigoKT0+e3RoaXMuX2Nvbm5lY3RlZHx8KHRoaXMuX29iJiY9KHRoaXMuX29iLmRpc2Nvbm5lY3QoKSxudWxsKSx0aGlzLl9hcHAmJnRoaXMuX2FwcC51bm1vdW50KCksdGhpcy5faW5zdGFuY2UmJih0aGlzLl9pbnN0YW5jZS5jZT12b2lkIDApLHRoaXMuX2FwcD10aGlzLl9pbnN0YW5jZT1udWxsLHRoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmPSh0aGlzLl90ZWxlcG9ydFRhcmdldHMuY2xlYXIoKSx2b2lkIDApKX0pfV9wcm9jZXNzTXV0YXRpb25zKGUpe2ZvcihsZXQgdCBvZiBlKXRoaXMuX3NldEF0dHIodC5hdHRyaWJ1dGVOYW1lKX1fcmVzb2x2ZURlZigpe2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlKXJldHVybiB0aGlzLl9wZW5kaW5nUmVzb2x2ZTtmb3IobGV0IGU9MDtlPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXRoaXMuX3NldEF0dHIodGhpcy5hdHRyaWJ1dGVzW2VdLm5hbWUpO3RoaXMuX29iPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMuYmluZCh0aGlzKSksdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSk7bGV0IGU9KGUsdD0hMSk9Pnt0aGlzLl9yZXNvbHZlZD0hMCx0aGlzLl9wZW5kaW5nUmVzb2x2ZT12b2lkIDA7bGV0e3Byb3BzOm4sc3R5bGVzOnJ9PWUsaTtpZihuJiYhcChuKSlmb3IobGV0IGUgaW4gbil7bGV0IHQ9bltlXTsodD09PU51bWJlcnx8dCYmdC50eXBlPT09TnVtYmVyKSYmKGUgaW4gdGhpcy5fcHJvcHMmJih0aGlzLl9wcm9wc1tlXT1mZSh0aGlzLl9wcm9wc1tlXSkpLChpfHw9T2JqZWN0LmNyZWF0ZShudWxsKSlbRShlKV09ITApfXRoaXMuX251bWJlclByb3BzPWksdGhpcy5fcmVzb2x2ZVByb3BzKGUpLHRoaXMuc2hhZG93Um9vdCYmdGhpcy5fYXBwbHlTdHlsZXMociksdGhpcy5fbW91bnQoZSl9LHQ9dGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7aWYodClyZXR1cm4gdGhpcy5fcGVuZGluZ1Jlc29sdmU9dCgpLnRoZW4odD0+e3QuY29uZmlndXJlQXBwPXRoaXMuX2RlZi5jb25maWd1cmVBcHAsZSh0aGlzLl9kZWY9dCwhMCl9KSx0aGlzLl9wZW5kaW5nUmVzb2x2ZTtlKHRoaXMuX2RlZil9X21vdW50KGUpe3RoaXMuX2FwcD10aGlzLl9jcmVhdGVBcHAoZSksdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoKSxlLmNvbmZpZ3VyZUFwcCYmZS5jb25maWd1cmVBcHAodGhpcy5fYXBwKSx0aGlzLl9hcHAuX2NlVk5vZGU9dGhpcy5fY3JlYXRlVk5vZGUoKSx0aGlzLl9hcHAubW91bnQodGhpcy5fcm9vdCk7bGV0IHQ9dGhpcy5faW5zdGFuY2UmJnRoaXMuX2luc3RhbmNlLmV4cG9zZWQ7aWYodClmb3IobGV0IGUgaW4gdClmKHRoaXMsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldDooKT0+Tih0W2VdKX0pfV9yZXNvbHZlUHJvcHMoZSl7bGV0e3Byb3BzOnR9PWUsbj1wKHQpP3Q6T2JqZWN0LmtleXModHx8e30pO2ZvcihsZXQgZSBvZiBPYmplY3Qua2V5cyh0aGlzKSllWzBdIT09YF9gJiZuLmluY2x1ZGVzKGUpJiZ0aGlzLl9zZXRQcm9wKGUsdGhpc1tlXSk7Zm9yKGxldCBlIG9mIG4ubWFwKEUpKU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldCgpe3JldHVybiB0aGlzLl9nZXRQcm9wKGUpfSxzZXQodCl7dGhpcy5fc2V0UHJvcChlLHQsITAsIXRoaXMuX3BhdGNoaW5nKX19KX1fc2V0QXR0cihlKXtpZihlLnN0YXJ0c1dpdGgoYGRhdGEtdi1gKSlyZXR1cm47bGV0IHQ9dGhpcy5oYXNBdHRyaWJ1dGUoZSksbj10P3RoaXMuZ2V0QXR0cmlidXRlKGUpOmJsLHI9RShlKTt0JiZ0aGlzLl9udW1iZXJQcm9wcyYmdGhpcy5fbnVtYmVyUHJvcHNbcl0mJihuPWZlKG4pKSx0aGlzLl9zZXRQcm9wKHIsbiwhMSwhMCl9X2dldFByb3AoZSl7cmV0dXJuIHRoaXMuX3Byb3BzW2VdfV9zZXRQcm9wKGUsdCxuPSEwLHI9ITEpe2lmKHQhPT10aGlzLl9wcm9wc1tlXSYmKHRoaXMuX2RpcnR5PSEwLHQ9PT1ibD9kZWxldGUgdGhpcy5fcHJvcHNbZV06KHRoaXMuX3Byb3BzW2VdPXQsZT09PWBrZXlgJiZ0aGlzLl9hcHAmJih0aGlzLl9hcHAuX2NlVk5vZGUua2V5PXQpKSxyJiZ0aGlzLl9pbnN0YW5jZSYmdGhpcy5fdXBkYXRlKCksbikpe2xldCBuPXRoaXMuX29iO24mJih0aGlzLl9wcm9jZXNzTXV0YXRpb25zKG4udGFrZVJlY29yZHMoKSksbi5kaXNjb25uZWN0KCkpLHQ9PT0hMD90aGlzLnNldEF0dHJpYnV0ZShvZShlKSxgYCk6dHlwZW9mIHQ9PWBzdHJpbmdgfHx0eXBlb2YgdD09YG51bWJlcmA/dGhpcy5zZXRBdHRyaWJ1dGUob2UoZSksdCtgYCk6dHx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUob2UoZSkpLG4mJm4ub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSl9fV91cGRhdGUoKXtsZXQgZT10aGlzLl9jcmVhdGVWTm9kZSgpO3RoaXMuX2FwcCYmKGUuYXBwQ29udGV4dD10aGlzLl9hcHAuX2NvbnRleHQpLGZ1KGUsdGhpcy5fcm9vdCl9X2NyZWF0ZVZOb2RlKCl7bGV0IGU9e307dGhpcy5zaGFkb3dSb290fHwoZS5vblZub2RlTW91bnRlZD1lLm9uVm5vZGVVcGRhdGVkPXRoaXMuX3JlbmRlclNsb3RzLmJpbmQodGhpcykpO2xldCB0PUgodGhpcy5fZGVmLGwoZSx0aGlzLl9wcm9wcykpO3JldHVybiB0aGlzLl9pbnN0YW5jZXx8KHQuY2U9ZT0+e3RoaXMuX2luc3RhbmNlPWUsZS5jZT10aGlzLGUuaXNDRT0hMDtsZXQgdD0oZSx0KT0+e3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZSx0ZSh0WzBdKT9sKHtkZXRhaWw6dH0sdFswXSk6e2RldGFpbDp0fSkpfTtlLmVtaXQ9KGUsLi4ubik9Pnt0KGUsbiksb2UoZSkhPT1lJiZ0KG9lKGUpLG4pfSx0aGlzLl9zZXRQYXJlbnQoKX0pLHR9X2FwcGx5U3R5bGVzKGUsdCxuKXtpZighZSlyZXR1cm47aWYodCl7aWYodD09PXRoaXMuX2RlZnx8dGhpcy5fc3R5bGVDaGlsZHJlbi5oYXModCkpcmV0dXJuO3RoaXMuX3N0eWxlQ2hpbGRyZW4uYWRkKHQpfWxldCByPXRoaXMuX25vbmNlLGk9dGhpcy5zaGFkb3dSb290LGE9bj90aGlzLl9nZXRTdHlsZUFuY2hvcihuKXx8dGhpcy5fZ2V0U3R5bGVBbmNob3IodGhpcy5fZGVmKTp0aGlzLl9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoaSksbz1udWxsO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTA7cy0tKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBzdHlsZWApO3ImJmMuc2V0QXR0cmlidXRlKGBub25jZWAsciksYy50ZXh0Q29udGVudD1lW3NdLGkuaW5zZXJ0QmVmb3JlKGMsb3x8YSksbz1jLHM9PT0wJiYobnx8dGhpcy5fc3R5bGVBbmNob3JzLnNldCh0aGlzLl9kZWYsYyksdCYmdGhpcy5fc3R5bGVBbmNob3JzLnNldCh0LGMpKX19X2dldFN0eWxlQW5jaG9yKGUpe2lmKCFlKXJldHVybiBudWxsO2xldCB0PXRoaXMuX3N0eWxlQW5jaG9ycy5nZXQoZSk7cmV0dXJuIHQmJnQucGFyZW50Tm9kZT09PXRoaXMuc2hhZG93Um9vdD90Oih0JiZ0aGlzLl9zdHlsZUFuY2hvcnMuZGVsZXRlKGUpLG51bGwpfV9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoZSl7Zm9yKGxldCB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5jaGlsZE5vZGVzW3RdO2lmKCEobiBpbnN0YW5jZW9mIEhUTUxTdHlsZUVsZW1lbnQpKXJldHVybiBufXJldHVybiBudWxsfV9wYXJzZVNsb3RzKCl7bGV0IGU9dGhpcy5fc2xvdHM9e30sdDtmb3IoO3Q9dGhpcy5maXJzdENoaWxkOyl7bGV0IG49dC5ub2RlVHlwZT09PTEmJnQuZ2V0QXR0cmlidXRlKGBzbG90YCl8fGBkZWZhdWx0YDsoZVtuXXx8KGVbbl09W10pKS5wdXNoKHQpLHRoaXMucmVtb3ZlQ2hpbGQodCl9fV9yZW5kZXJTbG90cygpe2xldCBlPXRoaXMuX2dldFNsb3RzKCksdD10aGlzLl9pbnN0YW5jZS50eXBlLl9fc2NvcGVJZDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxpPXIuZ2V0QXR0cmlidXRlKGBuYW1lYCl8fGBkZWZhdWx0YCxhPXRoaXMuX3Nsb3RzW2ldLG89ci5wYXJlbnROb2RlO2lmKGEpZm9yKGxldCBlIG9mIGEpe2lmKHQmJmUubm9kZVR5cGU9PT0xKXtsZXQgbj10K2Atc2Ascj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGUsMSk7ZS5zZXRBdHRyaWJ1dGUobixgYCk7bGV0IGk7Zm9yKDtpPXIubmV4dE5vZGUoKTspaS5zZXRBdHRyaWJ1dGUobixgYCl9by5pbnNlcnRCZWZvcmUoZSxyKX1lbHNlIGZvcig7ci5maXJzdENoaWxkOylvLmluc2VydEJlZm9yZShyLmZpcnN0Q2hpbGQscik7by5yZW1vdmVDaGlsZChyKX19X2dldFNsb3RzKCl7bGV0IGU9W3RoaXNdO3RoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmZS5wdXNoKC4uLnRoaXMuX3RlbGVwb3J0VGFyZ2V0cyk7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgZSl7bGV0IGU9bi5xdWVyeVNlbGVjdG9yQWxsKGBzbG90YCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5hZGQoZVtuXSl9cmV0dXJuIEFycmF5LmZyb20odCl9X2luamVjdENoaWxkU3R5bGUoZSx0KXt0aGlzLl9hcHBseVN0eWxlcyhlLnN0eWxlcyxlLHQpfV9iZWdpblBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITAsdGhpcy5fZGlydHk9ITF9X2VuZFBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITEsdGhpcy5fZGlydHkmJnRoaXMuX2luc3RhbmNlJiZ0aGlzLl91cGRhdGUoKX1faGFzU2hhZG93Um9vdCgpe3JldHVybiB0aGlzLl9kZWYuc2hhZG93Um9vdCE9PSExfV9yZW1vdmVDaGlsZFN0eWxlKGUpe319O2Z1bmN0aW9uIFRsKGUpe2xldCB0PUZzKCk7cmV0dXJuIHQmJnQuY2V8fG51bGx9ZnVuY3Rpb24gRWwoKXtsZXQgZT1UbCgpO3JldHVybiBlJiZlLnNoYWRvd1Jvb3R9ZnVuY3Rpb24gRGwoZT1gJHN0eWxlYCl7e2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuIHI7bGV0IG49dC50eXBlLl9fY3NzTW9kdWxlcztyZXR1cm4gbiYmbltlXXx8cn19dmFyIE9sPW5ldyBXZWFrTWFwLGtsPW5ldyBXZWFrTWFwLEFsPVN5bWJvbChgX21vdmVDYmApLGpsPVN5bWJvbChgX2VudGVyQ2JgKSxNbD0oZT0+KGRlbGV0ZSBlLnByb3BzLm1vZGUsZSkpKHtuYW1lOmBUcmFuc2l0aW9uR3JvdXBgLHByb3BzOmwoe30sU2Mse3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30pLHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9S3IoKSxpLGE7cmV0dXJuICRpKCgpPT57aWYoIWkubGVuZ3RoKXJldHVybjtsZXQgdD1lLm1vdmVDbGFzc3x8YCR7ZS5uYW1lfHxgdmB9LW1vdmVgO2lmKCFMbChpWzBdLmVsLG4udm5vZGUuZWwsdCkpe2k9W107cmV0dXJufWkuZm9yRWFjaChObCksaS5mb3JFYWNoKFBsKTtsZXQgcj1pLmZpbHRlcihGbCk7TGMobi52bm9kZS5lbCksci5mb3JFYWNoKGU9PntsZXQgbj1lLmVsLHI9bi5zdHlsZTtrYyhuLHQpLHIudHJhbnNmb3JtPXIud2Via2l0VHJhbnNmb3JtPXIudHJhbnNpdGlvbkR1cmF0aW9uPWBgO2xldCBpPW5bQWxdPWU9PntlJiZlLnRhcmdldCE9PW58fCghZXx8ZS5wcm9wZXJ0eU5hbWUuZW5kc1dpdGgoYHRyYW5zZm9ybWApKSYmKG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdHJhbnNpdGlvbmVuZGAsaSksbltBbF09bnVsbCxBYyhuLHQpKX07bi5hZGRFdmVudExpc3RlbmVyKGB0cmFuc2l0aW9uZW5kYCxpKX0pLGk9W119KSwoKT0+e2xldCBvPUEoZSkscz1FYyhvKSxjPW8udGFnfHxMO2lmKGk9W10sYSlmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKyl7bGV0IHQ9YVtlXTt0LmVsJiZ0LmVsIGluc3RhbmNlb2YgRWxlbWVudCYmIXQuZWxbQmNdJiYoaS5wdXNoKHQpLHJpKHQsZWkodCxzLHIsbikpLE9sLnNldCh0LElsKHQuZWwpKSl9YT10LmRlZmF1bHQ/aWkodC5kZWZhdWx0KCkpOltdO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKXtsZXQgdD1hW2VdO3Qua2V5IT1udWxsJiZyaSh0LGVpKHQscyxyLG4pKX1yZXR1cm4gSChjLG51bGwsYSl9fX0pO2Z1bmN0aW9uIE5sKGUpe2xldCB0PWUuZWw7dFtBbF0mJnRbQWxdKCksdFtqbF0mJnRbamxdKCl9ZnVuY3Rpb24gUGwoZSl7a2wuc2V0KGUsSWwoZS5lbCkpfWZ1bmN0aW9uIEZsKGUpe2xldCB0PU9sLmdldChlKSxuPWtsLmdldChlKSxyPXQubGVmdC1uLmxlZnQsaT10LnRvcC1uLnRvcDtpZihyfHxpKXtsZXQgdD1lLmVsLG49dC5zdHlsZSxhPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz0xLHM9MTtyZXR1cm4gdC5vZmZzZXRXaWR0aCYmKG89YS53aWR0aC90Lm9mZnNldFdpZHRoKSx0Lm9mZnNldEhlaWdodCYmKHM9YS5oZWlnaHQvdC5vZmZzZXRIZWlnaHQpLCghTnVtYmVyLmlzRmluaXRlKG8pfHxvPT09MCkmJihvPTEpLCghTnVtYmVyLmlzRmluaXRlKHMpfHxzPT09MCkmJihzPTEpLE1hdGguYWJzKG8tMSk8LjAxJiYobz0xKSxNYXRoLmFicyhzLTEpPC4wMSYmKHM9MSksbi50cmFuc2Zvcm09bi53ZWJraXRUcmFuc2Zvcm09YHRyYW5zbGF0ZSgke3Ivb31weCwke2kvc31weClgLG4udHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZX19ZnVuY3Rpb24gSWwoZSl7bGV0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDp0LmxlZnQsdG9wOnQudG9wfX1mdW5jdGlvbiBMbChlLHQsbil7bGV0IHI9ZS5jbG9uZU5vZGUoKSxpPWVbYmNdO2kmJmkuZm9yRWFjaChlPT57ZS5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5yZW1vdmUoZSkpfSksbi5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5hZGQoZSkpLHIuc3R5bGUuZGlzcGxheT1gbm9uZWA7bGV0IGE9dC5ub2RlVHlwZT09PTE/dDp0LnBhcmVudE5vZGU7YS5hcHBlbmRDaGlsZChyKTtsZXR7aGFzVHJhbnNmb3JtOm99PVBjKHIpO3JldHVybiBhLnJlbW92ZUNoaWxkKHIpLG99dmFyIFJsPWU9PntsZXQgdD1lLnByb3BzW2BvblVwZGF0ZTptb2RlbFZhbHVlYF18fCExO3JldHVybiBwKHQpP2U9PmxlKHQsZSk6dH07ZnVuY3Rpb24gemwoZSl7ZS50YXJnZXQuY29tcG9zaW5nPSEwfWZ1bmN0aW9uIEJsKGUpe2xldCB0PWUudGFyZ2V0O3QuY29tcG9zaW5nJiYodC5jb21wb3Npbmc9ITEsdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChgaW5wdXRgKSkpfXZhciBWbD1TeW1ib2woYF9hc3NpZ25gKSxIbD1TeW1ib2woYF9pbml0aWFsVmFsdWVgKTtmdW5jdGlvbiBVbChlLHQsbil7cmV0dXJuIHQmJihlPWUudHJpbSgpKSxuJiYoZT1kZShlKSksZX12YXIgV2w9e2NyZWF0ZWQoZSx7bW9kaWZpZXJzOntsYXp5OnQsdHJpbTpuLG51bWJlcjpyfX0saSl7ZS5wYXJlbnROb2RlJiYoZS50eXBlPT09YHRleHRgP2VbSGxdPWUuZGVmYXVsdFZhbHVlLnJlcGxhY2UoL1tcclxuXS9nLGBgKTplLnR5cGU9PT1gdGV4dGFyZWFgJiYoZVtIbF09ZS5kZWZhdWx0VmFsdWUucmVwbGFjZSgvXHJcbj8vZyxgCmApKSksZVtWbF09UmwoaSk7bGV0IGE9cnx8aS5wcm9wcyYmaS5wcm9wcy50eXBlPT09YG51bWJlcmA7YWwoZSx0P2BjaGFuZ2VgOmBpbnB1dGAsdD0+e3QudGFyZ2V0LmNvbXBvc2luZ3x8ZVtWbF0oVWwoZS52YWx1ZSxuLGEpKX0pLChufHxhKSYmYWwoZSxgY2hhbmdlYCwoKT0+e2UudmFsdWU9VWwoZS52YWx1ZSxuLGEpfSksdHx8KGFsKGUsYGNvbXBvc2l0aW9uc3RhcnRgLHpsKSxhbChlLGBjb21wb3NpdGlvbmVuZGAsQmwpLGFsKGUsYGNoYW5nZWAsQmwpKX0sbW91bnRlZChlLHt2YWx1ZTp0LG1vZGlmaWVyczp7dHJpbTpuLG51bWJlcjpyfX0pe2xldCBpPXQ/P2BgLGE9ZVtIbF07ZGVsZXRlIGVbSGxdLGEhPT12b2lkIDAmJihlLnR5cGU9PT1gdGV4dGB8fGUudHlwZT09PWB0ZXh0YXJlYWApJiZlLnZhbHVlIT09YT9lW1ZsXShVbChlLnZhbHVlLG4scikpOmUudmFsdWU9aX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bixtb2RpZmllcnM6e2xhenk6cix0cmltOmksbnVtYmVyOmF9fSxvKXtpZihlW1ZsXT1SbChvKSxlLmNvbXBvc2luZylyZXR1cm47bGV0IHM9KGF8fGUudHlwZT09PWBudW1iZXJgKSYmIS9eMFxkLy50ZXN0KGUudmFsdWUpP2RlKGUudmFsdWUpOmUudmFsdWUsYz10Pz9gYDtpZihzPT09YylyZXR1cm47bGV0IGw9ZS5nZXRSb290Tm9kZSgpOyhsIGluc3RhbmNlb2YgRG9jdW1lbnR8fGwgaW5zdGFuY2VvZiBTaGFkb3dSb290KSYmbC5hY3RpdmVFbGVtZW50PT09ZSYmZS50eXBlIT09YHJhbmdlYCYmKHImJnQ9PT1ufHxpJiZlLnZhbHVlLnRyaW0oKT09PWMpfHwoZS52YWx1ZT1jKX19LEdsPXtkZWVwOiEwLGNyZWF0ZWQoZSx0LG4pe2VbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntsZXQgdD1lLl9tb2RlbFZhbHVlLG49WGwoZSkscj1lLmNoZWNrZWQsaT1lW1ZsXTtpZihwKHQpKXtsZXQgZT1EZSh0LG4pLGE9ZSE9PS0xO2lmKHImJiFhKWkodC5jb25jYXQobikpO2Vsc2UgaWYoIXImJmEpe2xldCBuPVsuLi50XTtuLnNwbGljZShlLDEpLGkobil9fWVsc2UgaWYoaCh0KSl7bGV0IGU9bmV3IFNldCh0KTtyP2UuYWRkKG4pOmUuZGVsZXRlKG4pLGkoZSl9ZWxzZSBpKFpsKGUscikpfSl9LG1vdW50ZWQ6S2wsYmVmb3JlVXBkYXRlKGUsdCxuKXtlW1ZsXT1SbChuKSxLbChlLHQsbil9fTtmdW5jdGlvbiBLbChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHIpe2UuX21vZGVsVmFsdWU9dDtsZXQgaTtpZihwKHQpKWk9RGUodCxyLnByb3BzLnZhbHVlKT4tMTtlbHNlIGlmKGgodCkpaT10LmhhcyhyLnByb3BzLnZhbHVlKTtlbHNle2lmKHQ9PT1uKXJldHVybjtpPUVlKHQsWmwoZSwhMCkpfWUuY2hlY2tlZCE9PWkmJihlLmNoZWNrZWQ9aSl9dmFyIHFsPXtjcmVhdGVkKGUse3ZhbHVlOnR9LG4pe2UuY2hlY2tlZD1FZSh0LG4ucHJvcHMudmFsdWUpLGVbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntlW1ZsXShYbChlKSl9KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bn0scil7ZVtWbF09UmwociksdCE9PW4mJihlLmNoZWNrZWQ9RWUodCxyLnByb3BzLnZhbHVlKSl9fSxKbD17ZGVlcDohMCxjcmVhdGVkKGUse3ZhbHVlOnQsbW9kaWZpZXJzOntudW1iZXI6bn19LHIpe2UuX21vZGVsVmFsdWU9dCxhbChlLGBjaGFuZ2VgLCgpPT57bGV0IHQ9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUub3B0aW9ucyxlPT5lLnNlbGVjdGVkKS5tYXAoZT0+bj9kZShYbChlKSk6WGwoZSkpO2VbVmxdKGUubXVsdGlwbGU/aChlLl9tb2RlbFZhbHVlKT9uZXcgU2V0KHQpOnQ6dFswXSksZS5fYXNzaWduaW5nPSEwLFFuKCgpPT57ZS5fYXNzaWduaW5nPSExfSl9KSxlW1ZsXT1SbChyKX0sbW91bnRlZChlLHt2YWx1ZTp0fSl7WWwoZSx0KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnR9LG4pe2UuX21vZGVsVmFsdWU9dCxlW1ZsXT1SbChuKX0sdXBkYXRlZChlLHt2YWx1ZTp0fSl7ZS5fYXNzaWduaW5nfHxZbChlLHQpfX07ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj1lLm11bHRpcGxlLHI9cCh0KTtpZighKG4mJiFyJiYhaCh0KSkpe2ZvcihsZXQgaT0wLGE9ZS5vcHRpb25zLmxlbmd0aDtpPGE7aSsrKXtsZXQgYT1lLm9wdGlvbnNbaV0sbz1YbChhKTtpZihuKXtpZihyKXtsZXQgZT10eXBlb2YgbzthLnNlbGVjdGVkPWU9PT1gc3RyaW5nYHx8ZT09PWBudW1iZXJgP3Quc29tZShlPT5TdHJpbmcoZSk9PT1TdHJpbmcobykpOkRlKHQsbyk+LTF9ZWxzZSBhLnNlbGVjdGVkPXQuaGFzKG8pfWVsc2UgaWYoRWUoWGwoYSksdCkpe2Uuc2VsZWN0ZWRJbmRleCE9PWkmJihlLnNlbGVjdGVkSW5kZXg9aSk7cmV0dXJufX0hbiYmZS5zZWxlY3RlZEluZGV4IT09LTEmJihlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBYbChlKXtyZXR1cm5gX3ZhbHVlYGluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBabChlLHQpe2xldCBuPXQ/YF90cnVlVmFsdWVgOmBfZmFsc2VWYWx1ZWA7cmV0dXJuIG4gaW4gZT9lW25dOnR9dmFyIFFsPXtjcmVhdGVkKGUsdCxuKXtldShlLHQsbixudWxsLGBjcmVhdGVkYCl9LG1vdW50ZWQoZSx0LG4pe2V1KGUsdCxuLG51bGwsYG1vdW50ZWRgKX0sYmVmb3JlVXBkYXRlKGUsdCxuLHIpe2V1KGUsdCxuLHIsYGJlZm9yZVVwZGF0ZWApfSx1cGRhdGVkKGUsdCxuLHIpe2V1KGUsdCxuLHIsYHVwZGF0ZWRgKX19O2Z1bmN0aW9uICRsKGUsdCl7c3dpdGNoKGUpe2Nhc2VgU0VMRUNUYDpyZXR1cm4gSmw7Y2FzZWBURVhUQVJFQWA6cmV0dXJuIFdsO2RlZmF1bHQ6c3dpdGNoKHQpe2Nhc2VgY2hlY2tib3hgOnJldHVybiBHbDtjYXNlYHJhZGlvYDpyZXR1cm4gcWw7ZGVmYXVsdDpyZXR1cm4gV2x9fX1mdW5jdGlvbiBldShlLHQsbixyLGkpe2xldCBhPSRsKGUudGFnTmFtZSxuLnByb3BzJiZuLnByb3BzLnR5cGUpW2ldO2EmJmEoZSx0LG4scil9ZnVuY3Rpb24gdHUoKXtXbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9KT0+KHt2YWx1ZTplfSkscWwuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSx0KT0+e2lmKHQucHJvcHMmJkVlKHQucHJvcHMudmFsdWUsZSkpcmV0dXJue2NoZWNrZWQ6ITB9fSxHbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9LHQpPT57aWYocChlKSl7aWYodC5wcm9wcyYmRGUoZSx0LnByb3BzLnZhbHVlKT4tMSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihoKGUpKXtpZih0LnByb3BzJiZlLmhhcyh0LnByb3BzLnZhbHVlKSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihlKXJldHVybntjaGVja2VkOiEwfX0sUWwuZ2V0U1NSUHJvcHM9KGUsdCk9PntpZih0eXBlb2YgdC50eXBlIT1gc3RyaW5nYClyZXR1cm47bGV0IG49JGwodC50eXBlLnRvVXBwZXJDYXNlKCksdC5wcm9wcyYmdC5wcm9wcy50eXBlKTtpZihuLmdldFNTUlByb3BzKXJldHVybiBuLmdldFNTUlByb3BzKGUsdCl9fXZhciBudT1bYGN0cmxgLGBzaGlmdGAsYGFsdGAsYG1ldGFgXSxydT17c3RvcDplPT5lLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6ZT0+ZS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6ZT0+ZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQsY3RybDplPT4hZS5jdHJsS2V5LHNoaWZ0OmU9PiFlLnNoaWZ0S2V5LGFsdDplPT4hZS5hbHRLZXksbWV0YTplPT4hZS5tZXRhS2V5LGxlZnQ6ZT0+YGJ1dHRvbmBpbiBlJiZlLmJ1dHRvbiE9PTAsbWlkZGxlOmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0xLHJpZ2h0OmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0yLGV4YWN0OihlLHQpPT5udS5zb21lKG49PmVbYCR7bn1LZXlgXSYmIXQuaW5jbHVkZXMobikpfSxpdT0oZSx0KT0+e2lmKCFlKXJldHVybiBlO2xldCBuPWUuX3dpdGhNb2RzfHw9e30scj10LmpvaW4oYC5gKTtyZXR1cm4gbltyXXx8KG5bcl09KChuLC4uLnIpPT57Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCByPXJ1W3RbZV1dO2lmKHImJnIobix0KSlyZXR1cm59cmV0dXJuIGUobiwuLi5yKX0pKX0sYXU9e2VzYzpgZXNjYXBlYCxzcGFjZTpgIGAsdXA6YGFycm93LXVwYCxsZWZ0OmBhcnJvdy1sZWZ0YCxyaWdodDpgYXJyb3ctcmlnaHRgLGRvd246YGFycm93LWRvd25gLGRlbGV0ZTpgYmFja3NwYWNlYH0sb3U9KGUsdCk9PntsZXQgbj1lLl93aXRoS2V5c3x8PXt9LHI9dC5qb2luKGAuYCk7cmV0dXJuIG5bcl18fChuW3JdPShuPT57aWYoIShga2V5YGluIG4pKXJldHVybjtsZXQgcj1vZShuLmtleSk7aWYodC5zb21lKGU9PmU9PT1yfHxhdVtlXT09PXIpKXJldHVybiBlKG4pfSkpfSxzdT1sKHtwYXRjaFByb3A6X2x9LF9jKSxjdSxsdT0hMTtmdW5jdGlvbiB1dSgpe3JldHVybiBjdXx8PUxvKHN1KX1mdW5jdGlvbiBkdSgpe3JldHVybiBjdT1sdT9jdTpSbyhzdSksbHU9ITAsY3V9dmFyIGZ1PSgoLi4uZSk9Pnt1dSgpLnJlbmRlciguLi5lKX0pLHB1PSgoLi4uZSk9PntkdSgpLmh5ZHJhdGUoLi4uZSl9KSxtdT0oKC4uLmUpPT57bGV0IHQ9dXUoKS5jcmVhdGVBcHAoLi4uZSkse21vdW50Om59PXQ7cmV0dXJuIHQubW91bnQ9ZT0+e2xldCByPV91KGUpO2lmKCFyKXJldHVybjtsZXQgaT10Ll9jb21wb25lbnQ7IXYoaSkmJiFpLnJlbmRlciYmIWkudGVtcGxhdGUmJihpLnRlbXBsYXRlPXIuaW5uZXJIVE1MKSxyLm5vZGVUeXBlPT09MSYmKHIudGV4dENvbnRlbnQ9YGApO2xldCBhPW4ociwhMSxndShyKSk7cmV0dXJuIHIgaW5zdGFuY2VvZiBFbGVtZW50JiYoci5yZW1vdmVBdHRyaWJ1dGUoYHYtY2xvYWtgKSxyLnNldEF0dHJpYnV0ZShgZGF0YS12LWFwcGAsYGApKSxhfSx0fSksaHU9KCguLi5lKT0+e2xldCB0PWR1KCkuY3JlYXRlQXBwKC4uLmUpLHttb3VudDpufT10O3JldHVybiB0Lm1vdW50PWU9PntsZXQgdD1fdShlKTtpZih0KXJldHVybiBuKHQsITAsZ3UodCkpfSx0fSk7ZnVuY3Rpb24gZ3UoZSl7aWYoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpcmV0dXJuYHN2Z2A7aWYodHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KXJldHVybmBtYXRobWxgfWZ1bmN0aW9uIF91KGUpe3JldHVybiB5KGUpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6ZX12YXIgdnU9ITEseXU9KCk9Pnt2dXx8KHZ1PSEwLHR1KCksVWMoKSl9LGJ1PXQoe0Jhc2VUcmFuc2l0aW9uOigpPT5RcixCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yczooKT0+SnIsQ29tbWVudDooKT0+Y3MsRGVwcmVjYXRpb25UeXBlczooKT0+bnVsbCxFZmZlY3RTY29wZTooKT0+TmUsRXJyb3JDb2RlczooKT0+em4sRXJyb3JUeXBlU3RyaW5nczooKT0+b2MsRnJhZ21lbnQ6KCk9PkwsS2VlcEFsaXZlOigpPT5CaSxSZWFjdGl2ZUVmZmVjdDooKT0+emUsU3RhdGljOigpPT5scyxTdXNwZW5zZTooKT0+WG8sVGVsZXBvcnQ6KCk9PlZyLFRleHQ6KCk9PnNzLFRyYWNrT3BUeXBlczooKT0+RW4sVHJhbnNpdGlvbjooKT0+Q2MsVHJhbnNpdGlvbkdyb3VwOigpPT5NbCxUcmlnZ2VyT3BUeXBlczooKT0+RG4sVnVlRWxlbWVudDooKT0+d2wsYXNzZXJ0TnVtYmVyOigpPT5SbixjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZzooKT0+SG4sY2FsbFdpdGhFcnJvckhhbmRsaW5nOigpPT5WbixjYW1lbGl6ZTooKT0+RSxjYXBpdGFsaXplOigpPT5zZSxjbG9uZVZOb2RlOigpPT5Dcyxjb21wYXRVdGlsczooKT0+bnVsbCxjb21waWxlOigpPT54dSxjb21wdXRlZDooKT0+VyxjcmVhdGVBcHA6KCk9Pm11LGNyZWF0ZUJsb2NrOigpPT5CLGNyZWF0ZUNvbW1lbnRWTm9kZTooKT0+VHMsY3JlYXRlRWxlbWVudEJsb2NrOigpPT56LGNyZWF0ZUVsZW1lbnRWTm9kZTooKT0+VixjcmVhdGVIeWRyYXRpb25SZW5kZXJlcjooKT0+Um8sY3JlYXRlUHJvcHNSZXN0UHJveHk6KCk9PklhLGNyZWF0ZVJlbmRlcmVyOigpPT5MbyxjcmVhdGVTU1JBcHA6KCk9Pmh1LGNyZWF0ZVNsb3RzOigpPT5oYSxjcmVhdGVTdGF0aWNWTm9kZTooKT0+d3MsY3JlYXRlVGV4dFZOb2RlOigpPT5VLGNyZWF0ZVZOb2RlOigpPT5ILGN1c3RvbVJlZjooKT0+dm4sZGVmaW5lQXN5bmNDb21wb25lbnQ6KCk9PkxpLGRlZmluZUNvbXBvbmVudDooKT0+RixkZWZpbmVDdXN0b21FbGVtZW50OigpPT54bCxkZWZpbmVFbWl0czooKT0+d2EsZGVmaW5lRXhwb3NlOigpPT5UYSxkZWZpbmVNb2RlbDooKT0+T2EsZGVmaW5lT3B0aW9uczooKT0+RWEsZGVmaW5lUHJvcHM6KCk9PkNhLGRlZmluZVNTUkN1c3RvbUVsZW1lbnQ6KCk9PlNsLGRlZmluZVNsb3RzOigpPT5EYSxkZXZ0b29sczooKT0+c2MsZWZmZWN0OigpPT5RZSxlZmZlY3RTY29wZTooKT0+UGUsZ2V0Q3VycmVudEluc3RhbmNlOigpPT5GcyxnZXRDdXJyZW50U2NvcGU6KCk9PkZlLGdldEN1cnJlbnRXYXRjaGVyOigpPT5qbixnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW46KCk9PmlpLGd1YXJkUmVhY3RpdmVQcm9wczooKT0+U3MsaDooKT0+RyxoYW5kbGVFcnJvcjooKT0+VW4saGFzSW5qZWN0aW9uQ29udGV4dDooKT0+YnIsaHlkcmF0ZTooKT0+cHUsaHlkcmF0ZU9uSWRsZTooKT0+QWksaHlkcmF0ZU9uSW50ZXJhY3Rpb246KCk9PlBpLGh5ZHJhdGVPbk1lZGlhUXVlcnk6KCk9Pk5pLGh5ZHJhdGVPblZpc2libGU6KCk9Pk1pLGluaXRDdXN0b21Gb3JtYXR0ZXI6KCk9PnRjLGluaXREaXJlY3RpdmVzRm9yU1NSOigpPT55dSxpbmplY3Q6KCk9PnlyLGlzTWVtb1NhbWU6KCk9PnJjLGlzUHJveHk6KCk9Pm9uLGlzUmVhY3RpdmU6KCk9Pm5uLGlzUmVhZG9ubHk6KCk9PnJuLGlzUmVmOigpPT5qLGlzUnVudGltZU9ubHk6KCk9PkpzLGlzU2hhbGxvdzooKT0+YW4saXNWTm9kZTooKT0+Z3MsbWFya1JhdzooKT0+c24sbWVyZ2VEZWZhdWx0czooKT0+UGEsbWVyZ2VNb2RlbHM6KCk9PkZhLG1lcmdlUHJvcHM6KCk9PmtzLG5leHRUaWNrOigpPT5Rbixub2RlT3BzOigpPT5fYyxub3JtYWxpemVDbGFzczooKT0+Tyxub3JtYWxpemVQcm9wczooKT0+eGUsbm9ybWFsaXplU3R5bGU6KCk9PmdlLG9uQWN0aXZhdGVkOigpPT5IaSxvbkJlZm9yZU1vdW50OigpPT5YaSxvbkJlZm9yZVVubW91bnQ6KCk9PmVhLG9uQmVmb3JlVXBkYXRlOigpPT5RaSxvbkRlYWN0aXZhdGVkOigpPT5VaSxvbkVycm9yQ2FwdHVyZWQ6KCk9PmFhLG9uTW91bnRlZDooKT0+Wmksb25SZW5kZXJUcmFja2VkOigpPT5pYSxvblJlbmRlclRyaWdnZXJlZDooKT0+cmEsb25TY29wZURpc3Bvc2U6KCk9PkllLG9uU2VydmVyUHJlZmV0Y2g6KCk9Pm5hLG9uVW5tb3VudGVkOigpPT50YSxvblVwZGF0ZWQ6KCk9PiRpLG9uV2F0Y2hlckNsZWFudXA6KCk9Pk1uLG9wZW5CbG9jazooKT0+UixwYXRjaFByb3A6KCk9Pl9sLHBvcFNjb3BlSWQ6KCk9Pm1yLHByb3ZpZGU6KCk9PnZyLHByb3h5UmVmczooKT0+Z24scHVzaFNjb3BlSWQ6KCk9PnByLHF1ZXVlUG9zdEZsdXNoQ2I6KCk9Pm5yLHJlYWN0aXZlOigpPT5adCxyZWFkb25seTooKT0+JHQscmVmOigpPT5NLHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyOigpPT5xcyxyZW5kZXI6KCk9PmZ1LHJlbmRlckxpc3Q6KCk9Pm1hLHJlbmRlclNsb3Q6KCk9PkkscmVzb2x2ZUNvbXBvbmVudDooKT0+Y2EscmVzb2x2ZURpcmVjdGl2ZTooKT0+ZGEscmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ6KCk9PnVhLHJlc29sdmVGaWx0ZXI6KCk9Pm51bGwscmVzb2x2ZVRyYW5zaXRpb25Ib29rczooKT0+ZWksc2V0QmxvY2tUcmFja2luZzooKT0+bXMsc2V0RGV2dG9vbHNIb29rOigpPT5jYyxzZXRUcmFuc2l0aW9uSG9va3M6KCk9PnJpLHNoYWxsb3dSZWFjdGl2ZTooKT0+UXQsc2hhbGxvd1JlYWRvbmx5OigpPT5lbixzaGFsbG93UmVmOigpPT51bixzc3JDb250ZXh0S2V5OigpPT54cixzc3JVdGlsczooKT0+bGMsc3RvcDooKT0+JGUsdG9EaXNwbGF5U3RyaW5nOigpPT5rLHRvSGFuZGxlcktleTooKT0+Y2UsdG9IYW5kbGVyczooKT0+X2EsdG9SYXc6KCk9PkEsdG9SZWY6KCk9PlNuLHRvUmVmczooKT0+eW4sdG9WYWx1ZTooKT0+bW4sdHJhbnNmb3JtVk5vZGVBcmdzOigpPT52cyx0cmlnZ2VyUmVmOigpPT5wbix1bnJlZjooKT0+Tix1c2VBdHRyczooKT0+amEsdXNlQ3NzTW9kdWxlOigpPT5EbCx1c2VDc3NWYXJzOigpPT5HYyx1c2VIb3N0OigpPT5UbCx1c2VJZDooKT0+YWksdXNlTW9kZWw6KCk9PnJvLHVzZVNTUkNvbnRleHQ6KCk9PlNyLHVzZVNoYWRvd1Jvb3Q6KCk9PkVsLHVzZVNsb3RzOigpPT5BYSx1c2VUZW1wbGF0ZVJlZjooKT0+c2ksdXNlVHJhbnNpdGlvblN0YXRlOigpPT5Lcix2TW9kZWxDaGVja2JveDooKT0+R2wsdk1vZGVsRHluYW1pYzooKT0+UWwsdk1vZGVsUmFkaW86KCk9PnFsLHZNb2RlbFNlbGVjdDooKT0+Smwsdk1vZGVsVGV4dDooKT0+V2wsdlNob3c6KCk9PlZjLHZlcnNpb246KCk9PmljLHdhcm46KCk9PmFjLHdhdGNoOigpPT5Fcix3YXRjaEVmZmVjdDooKT0+Q3Isd2F0Y2hQb3N0RWZmZWN0OigpPT53cix3YXRjaFN5bmNFZmZlY3Q6KCk9PlRyLHdpdGhBc3luY0NvbnRleHQ6KCk9PkxhLHdpdGhDdHg6KCk9PlAsd2l0aERlZmF1bHRzOigpPT5rYSx3aXRoRGlyZWN0aXZlczooKT0+Z3Isd2l0aEtleXM6KCk9Pm91LHdpdGhNZW1vOigpPT5uYyx3aXRoTW9kaWZpZXJzOigpPT5pdSx3aXRoU2NvcGVJZDooKT0+aHJ9KSx4dT0oKT0+e307ZnVuY3Rpb24gU3UoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPUFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIEN1KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gd3UoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gU3UoZSl9ZnVuY3Rpb24gVHUoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbmApfWZ1bmN0aW9uIEV1KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsYHZhbHVlYGluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxMdShyLmtleSkscil9fWZ1bmN0aW9uIER1KGUsdCxuKXtyZXR1cm4gdCYmRXUoZS5wcm90b3R5cGUsdCksbiYmRXUoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIE91KGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVtgQEBpdGVyYXRvcmBdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj16dShlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09YG51bWJlcmApe24mJihlPW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6aX19dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgYSxvPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBlPW4ubmV4dCgpO3JldHVybiBvPWUuZG9uZSxlfSxlOmZ1bmN0aW9uKGUpe3M9ITAsYT1lfSxmOmZ1bmN0aW9uKCl7dHJ5e298fG4ucmV0dXJuPT1udWxsfHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX19fWZ1bmN0aW9uIEsoZSx0LG4pe3JldHVybih0PUx1KHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGt1KGUpe2lmKHR5cGVvZiBTeW1ib2w8YHVgJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbYEBAaXRlcmF0b3JgXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBBdShlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPGB1YCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlW2BAQGl0ZXJhdG9yYF07aWYobiE9bnVsbCl7dmFyIHIsaSxhLG8scz1bXSxjPSEwLGw9ITE7dHJ5e2lmKGE9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9YS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXtsPSEwLGk9ZX1maW5hbGx5e3RyeXtpZighYyYmbi5yZXR1cm4hPW51bGwmJihvPW4ucmV0dXJuKCksT2JqZWN0KG8pIT09bykpcmV0dXJufWZpbmFsbHl7aWYobCl0aHJvdyBpfX1yZXR1cm4gc319ZnVuY3Rpb24ganUoKXt0aHJvdyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBNdSgpe3Rocm93IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBOdShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHEoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/TnUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0soZSx0LG5bdF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TnUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfWZ1bmN0aW9uIFB1KGUsdCl7cmV0dXJuIEN1KGUpfHxBdShlLHQpfHx6dShlLHQpfHxqdSgpfWZ1bmN0aW9uIEZ1KGUpe3JldHVybiB3dShlKXx8a3UoZSl8fHp1KGUpfHxNdSgpfWZ1bmN0aW9uIEl1KGUsdCl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4gZTt2YXIgbj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGUsdHx8YGRlZmF1bHRgKTtpZih0eXBlb2YgciE9YG9iamVjdGApcmV0dXJuIHI7dGhyb3cgVHlwZUVycm9yKGBAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLmApfXJldHVybih0PT09YHN0cmluZ2A/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gTHUoZSl7dmFyIHQ9SXUoZSxgc3RyaW5nYCk7cmV0dXJuIHR5cGVvZiB0PT1gc3ltYm9sYD90OnQrYGB9ZnVuY3Rpb24gUnUoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4gUnU9dHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09YHN5bWJvbGA/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmdHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/YHN5bWJvbGA6dHlwZW9mIGV9LFJ1KGUpfWZ1bmN0aW9uIHp1KGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBTdShlLHQpO3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7cmV0dXJuIG49PT1gT2JqZWN0YCYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxuPT09YE1hcGB8fG49PT1gU2V0YD9BcnJheS5mcm9tKGUpOm49PT1gQXJndW1lbnRzYHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/U3UoZSx0KTp2b2lkIDB9fXZhciBCdT1mdW5jdGlvbigpe30sVnU9e30sSHU9e30sVXU9bnVsbCxXdT17bWFyazpCdSxtZWFzdXJlOkJ1fTt0cnl7dHlwZW9mIHdpbmRvdzxgdWAmJihWdT13aW5kb3cpLHR5cGVvZiBkb2N1bWVudDxgdWAmJihIdT1kb2N1bWVudCksdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI8YHVgJiYoVXU9TXV0YXRpb25PYnNlcnZlciksdHlwZW9mIHBlcmZvcm1hbmNlPGB1YCYmKFd1PXBlcmZvcm1hbmNlKX1jYXRjaHt9dmFyIEd1PShWdS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQsS3U9R3U9PT12b2lkIDA/YGA6R3UscXU9VnUsSnU9SHUsWXU9VXUsWHU9V3U7cXUuZG9jdW1lbnQ7dmFyIFp1PSEhSnUuZG9jdW1lbnRFbGVtZW50JiYhIUp1LmhlYWQmJnR5cGVvZiBKdS5hZGRFdmVudExpc3RlbmVyPT1gZnVuY3Rpb25gJiZ0eXBlb2YgSnUuY3JlYXRlRWxlbWVudD09YGZ1bmN0aW9uYCxRdT1+S3UuaW5kZXhPZihgTVNJRWApfHx+S3UuaW5kZXhPZihgVHJpZGVudC9gKSwkdSxlZD0vZmEoa3xrZHxzfHJ8bHx0fGR8ZHJ8ZGx8ZHR8YnxzbHJ8c2xwcnx3c2J8dGx8bnN8bmRzfGVzfGd0fGpyfGpmcnxqZHJ8dXNifHVmc2J8dWRzYnxjcnxzc3xzcnxzbHxzdHxzZHN8c2RyfHNkbHxzZHR8c2xkcnxzbHBkcnxwcnxtc3x2cyk/W1wtXCBdLyx0ZD0vRm9udCA/QXdlc29tZSA/KFs1NjcgXSopKFNvbGlkfFJlZ3VsYXJ8TGlnaHR8VGhpbnxEdW90b25lfEJyYW5kc3xGcmVlfFByb3xTaGFycCBEdW90b25lfFNoYXJwfEtpdHxOb3Rkb2cgRHVvfE5vdGRvZ3xDaGlzZWx8RXRjaHxHcmFwaGl0ZXxUaHVtYnByaW50fEplbGx5IEZpbGx8SmVsbHkgRHVvfEplbGx5fFV0aWxpdHl8VXRpbGl0eSBGaWxsfFV0aWxpdHkgRHVvfFNsYWIgUHJlc3N8U2xhYnxTbGFiIER1b3xTbGFiIFByZXNzIER1b3xQaXhlbHxNb3NhaWN8VmVsbHVtfFdoaXRlYm9hcmQpPy4qL2ksbmQ9e2NsYXNzaWM6e2ZhOmBzb2xpZGAsZmFzOmBzb2xpZGAsImZhLXNvbGlkIjpgc29saWRgLGZhcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWw6YGxpZ2h0YCwiZmEtbGlnaHQiOmBsaWdodGAsZmF0OmB0aGluYCwiZmEtdGhpbiI6YHRoaW5gLGZhYjpgYnJhbmRzYCwiZmEtYnJhbmRzIjpgYnJhbmRzYH0sZHVvdG9uZTp7ZmE6YHNvbGlkYCxmYWQ6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsImZhLWR1b3RvbmUiOmBzb2xpZGAsZmFkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWRsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhZHQ6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LHNoYXJwOntmYTpgc29saWRgLGZhc3M6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsZmFzcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhc3Q6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmE6YHNvbGlkYCxmYXNkczpgc29saWRgLCJmYS1zb2xpZCI6YHNvbGlkYCxmYXNkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNkbDpgbGlnaHRgLCJmYS1saWdodCI6YGxpZ2h0YCxmYXNkdDpgdGhpbmAsImZhLXRoaW4iOmB0aGluYH0sc2xhYjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscjpgcmVndWxhcmB9LCJzbGFiLXByZXNzIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscHI6YHJlZ3VsYXJgfSwic2xhYi1kdW8iOnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhc2xkcjpgcmVndWxhcmB9LCJzbGFiLXByZXNzLWR1byI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFzbHBkcjpgcmVndWxhcmB9LHRodW1icHJpbnQ6eyJmYS1saWdodCI6YGxpZ2h0YCxmYXRsOmBsaWdodGB9LHZlbGx1bTp7ImZhLXNvbGlkIjpgc29saWRgLGZhdnM6YHNvbGlkYH0scGl4ZWw6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFwcjpgcmVndWxhcmB9LG1vc2FpYzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbXM6YHNvbGlkYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhd3NiOmBzZW1pYm9sZGB9LG5vdGRvZzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbnM6YHNvbGlkYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBzb2xpZGAsZmFuZHM6YHNvbGlkYH0sZXRjaDp7ImZhLXNvbGlkIjpgc29saWRgLGZhZXM6YHNvbGlkYH0sZ3JhcGhpdGU6eyJmYS10aGluIjpgdGhpbmAsZmFndDpgdGhpbmB9LGplbGx5OnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhanI6YHJlZ3VsYXJgfSwiamVsbHktZmlsbCI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFqZnI6YHJlZ3VsYXJgfSwiamVsbHktZHVvIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWpkcjpgcmVndWxhcmB9LGNoaXNlbDp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWNyOmByZWd1bGFyYH0sdXRpbGl0eTp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhdXNiOmBzZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVkc2I6YHNlbWlib2xkYH0sInV0aWxpdHktZmlsbCI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVmc2I6YHNlbWlib2xkYH19LHJkPXtHUk9VUDpgZHVvdG9uZS1ncm91cGAsU1dBUF9PUEFDSVRZOmBzd2FwLW9wYWNpdHlgLFBSSU1BUlk6YHByaW1hcnlgLFNFQ09OREFSWTpgc2Vjb25kYXJ5YH0saWQ9W2BmYS1jbGFzc2ljYCxgZmEtZHVvdG9uZWAsYGZhLXNoYXJwYCxgZmEtc2hhcnAtZHVvdG9uZWAsYGZhLXRodW1icHJpbnRgLGBmYS13aGl0ZWJvYXJkYCxgZmEtbm90ZG9nYCxgZmEtbm90ZG9nLWR1b2AsYGZhLWNoaXNlbGAsYGZhLWV0Y2hgLGBmYS1ncmFwaGl0ZWAsYGZhLWplbGx5YCxgZmEtamVsbHktZmlsbGAsYGZhLWplbGx5LWR1b2AsYGZhLXNsYWJgLGBmYS1zbGFiLXByZXNzYCxgZmEtc2xhYi1wcmVzcy1kdW9gLGBmYS1zbGFiLWR1b2AsYGZhLW1vc2FpY2AsYGZhLXBpeGVsYCxgZmEtdmVsbHVtYCxgZmEtdXRpbGl0eWAsYGZhLXV0aWxpdHktZHVvYCxgZmEtdXRpbGl0eS1maWxsYF0sYWQ9YGNsYXNzaWNgLG9kPWBkdW90b25lYCxzZD1gc2hhcnBgLGNkPWBzaGFycC1kdW90b25lYCxsZD1gY2hpc2VsYCx1ZD1gZXRjaGAsZGQ9YGdyYXBoaXRlYCxmZD1gamVsbHlgLHBkPWBqZWxseS1kdW9gLG1kPWBqZWxseS1maWxsYCxoZD1gbW9zYWljYCxnZD1gbm90ZG9nYCxfZD1gbm90ZG9nLWR1b2AsdmQ9YHBpeGVsYCx5ZD1gc2xhYmAsYmQ9YHNsYWItZHVvYCx4ZD1gc2xhYi1wcmVzc2AsU2Q9YHNsYWItcHJlc3MtZHVvYCxDZD1gdGh1bWJwcmludGAsd2Q9YHV0aWxpdHlgLFRkPWB1dGlsaXR5LWR1b2AsRWQ9YHV0aWxpdHktZmlsbGAsRGQ9YHZlbGx1bWAsT2Q9YHdoaXRlYm9hcmRgLGtkPWBDbGFzc2ljYCxBZD1gRHVvdG9uZWAsamQ9YFNoYXJwYCxNZD1gU2hhcnAgRHVvdG9uZWAsTmQ9YENoaXNlbGAsUGQ9YEV0Y2hgLEZkPWBHcmFwaGl0ZWAsSWQ9YEplbGx5YCxMZD1gSmVsbHkgRHVvYCxSZD1gSmVsbHkgRmlsbGAsemQ9YE1vc2FpY2AsQmQ9YE5vdGRvZ2AsVmQ9YE5vdGRvZyBEdW9gLEhkPWBQaXhlbGAsVWQ9YFNsYWJgLFdkPWBTbGFiIER1b2AsR2Q9YFNsYWIgUHJlc3NgLEtkPWBTbGFiIFByZXNzIER1b2AscWQ9YFRodW1icHJpbnRgLEpkPWBVdGlsaXR5YCxZZD1gVXRpbGl0eSBEdW9gLFhkPWBVdGlsaXR5IEZpbGxgLFpkPWBWZWxsdW1gLFFkPWBXaGl0ZWJvYXJkYCwkZD1bYWQsb2Qsc2QsY2QsbGQsdWQsZGQsZmQscGQsbWQsaGQsZ2QsX2QsdmQseWQsYmQseGQsU2QsQ2Qsd2QsVGQsRWQsRGQsT2RdOyR1PXt9LEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsYWQsa2QpLG9kLEFkKSxzZCxqZCksY2QsTWQpLGxkLE5kKSx1ZCxQZCksZGQsRmQpLGZkLElkKSxwZCxMZCksbWQsUmQpLEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsaGQsemQpLGdkLEJkKSxfZCxWZCksdmQsSGQpLHlkLFVkKSxiZCxXZCkseGQsR2QpLFNkLEtkKSxDZCxxZCksd2QsSmQpLEsoSyhLKEsoJHUsVGQsWWQpLEVkLFhkKSxEZCxaZCksT2QsUWQpO3ZhciBlZj17Y2xhc3NpYzp7OTAwOmBmYXNgLDQwMDpgZmFyYCxub3JtYWw6YGZhcmAsMzAwOmBmYWxgLDEwMDpgZmF0YH0sZHVvdG9uZTp7OTAwOmBmYWRgLDQwMDpgZmFkcmAsMzAwOmBmYWRsYCwxMDA6YGZhZHRgfSxzaGFycDp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLDMwMDpgZmFzbGAsMTAwOmBmYXN0YH0sInNoYXJwLWR1b3RvbmUiOns5MDA6YGZhc2RzYCw0MDA6YGZhc2RyYCwzMDA6YGZhc2RsYCwxMDA6YGZhc2R0YH0sc2xhYjp7NDAwOmBmYXNscmB9LCJzbGFiLXByZXNzIjp7NDAwOmBmYXNscHJgfSwic2xhYi1kdW8iOns0MDA6YGZhc2xkcmB9LCJzbGFiLXByZXNzLWR1byI6ezQwMDpgZmFzbHBkcmB9LHZlbGx1bTp7OTAwOmBmYXZzYH0sbW9zYWljOns5MDA6YGZhbXNgfSxwaXhlbDp7NDAwOmBmYXByYH0sd2hpdGVib2FyZDp7NjAwOmBmYXdzYmB9LHRodW1icHJpbnQ6ezMwMDpgZmF0bGB9LG5vdGRvZzp7OTAwOmBmYW5zYH0sIm5vdGRvZy1kdW8iOns5MDA6YGZhbmRzYH0sZXRjaDp7OTAwOmBmYWVzYH0sZ3JhcGhpdGU6ezEwMDpgZmFndGB9LGNoaXNlbDp7NDAwOmBmYWNyYH0samVsbHk6ezQwMDpgZmFqcmB9LCJqZWxseS1maWxsIjp7NDAwOmBmYWpmcmB9LCJqZWxseS1kdW8iOns0MDA6YGZhamRyYH0sdXRpbGl0eTp7NjAwOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6ezYwMDpgZmF1ZHNiYH0sInV0aWxpdHktZmlsbCI6ezYwMDpgZmF1ZnNiYH19LHRmPXsiRm9udCBBd2Vzb21lIDcgRnJlZSI6ezkwMDpgZmFzYCw0MDA6YGZhcmB9LCJGb250IEF3ZXNvbWUgNyBQcm8iOns5MDA6YGZhc2AsNDAwOmBmYXJgLG5vcm1hbDpgZmFyYCwzMDA6YGZhbGAsMTAwOmBmYXRgfSwiRm9udCBBd2Vzb21lIDcgQnJhbmRzIjp7NDAwOmBmYWJgLG5vcm1hbDpgZmFiYH0sIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOns5MDA6YGZhZGAsNDAwOmBmYWRyYCxub3JtYWw6YGZhZHJgLDMwMDpgZmFkbGAsMTAwOmBmYWR0YH0sIkZvbnQgQXdlc29tZSA3IFNoYXJwIjp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLG5vcm1hbDpgZmFzcmAsMzAwOmBmYXNsYCwxMDA6YGZhc3RgfSwiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI6ezkwMDpgZmFzZHNgLDQwMDpgZmFzZHJgLG5vcm1hbDpgZmFzZHJgLDMwMDpgZmFzZGxgLDEwMDpgZmFzZHRgfSwiRm9udCBBd2Vzb21lIDcgSmVsbHkiOns0MDA6YGZhanJgLG5vcm1hbDpgZmFqcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsIjp7NDAwOmBmYWpmcmAsbm9ybWFsOmBmYWpmcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8iOns0MDA6YGZhamRyYCxub3JtYWw6YGZhamRyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIiOns0MDA6YGZhc2xyYCxub3JtYWw6YGZhc2xyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MiOns0MDA6YGZhc2xwcmAsbm9ybWFsOmBmYXNscHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBEdW8iOns0MDA6YGZhc2xkcmAsbm9ybWFsOmBmYXNsZHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyBEdW8iOns0MDA6YGZhc2xwZHJgLG5vcm1hbDpgZmFzbHBkcmB9LCJGb250IEF3ZXNvbWUgNyBQaXhlbCI6ezQwMDpgZmFwcmAsbm9ybWFsOmBmYXByYH0sIkZvbnQgQXdlc29tZSA3IE1vc2FpYyI6ezkwMDpgZmFtc2Asbm9ybWFsOmBmYW1zYH0sIkZvbnQgQXdlc29tZSA3IFZlbGx1bSI6ezkwMDpgZmF2c2Asbm9ybWFsOmBmYXZzYH0sIkZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQiOnszMDA6YGZhdGxgLG5vcm1hbDpgZmF0bGB9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2ciOns5MDA6YGZhbnNgLG5vcm1hbDpgZmFuc2B9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjp7OTAwOmBmYW5kc2Asbm9ybWFsOmBmYW5kc2B9LCJGb250IEF3ZXNvbWUgNyBFdGNoIjp7OTAwOmBmYWVzYCxub3JtYWw6YGZhZXNgfSwiRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUiOnsxMDA6YGZhZ3RgLG5vcm1hbDpgZmFndGB9LCJGb250IEF3ZXNvbWUgNyBDaGlzZWwiOns0MDA6YGZhY3JgLG5vcm1hbDpgZmFjcmB9LCJGb250IEF3ZXNvbWUgNyBXaGl0ZWJvYXJkIjp7NjAwOmBmYXdzYmAsbm9ybWFsOmBmYXdzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5Ijp7NjAwOmBmYXVzYmAsbm9ybWFsOmBmYXVzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byI6ezYwMDpgZmF1ZHNiYCxub3JtYWw6YGZhdWRzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOns2MDA6YGZhdWZzYmAsbm9ybWFsOmBmYXVmc2JgfX0sbmY9bmV3IE1hcChbW2BjbGFzc2ljYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYCxgcmVndWxhcmAsYGxpZ2h0YCxgdGhpbmAsYGJyYW5kc2BdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZHVvdG9uZWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWRgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc3NgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwLWR1b3RvbmVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzZHNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYGNoaXNlbGAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWNyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BldGNoYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhZXNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZ3JhcGhpdGVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFndGAsZGVmYXVsdFN0eWxlSWQ6YHRoaW5gLHN0eWxlSWRzOltgdGhpbmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjEwMH1dLFtgamVsbHlgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFqcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgamVsbHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamRyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BqZWxseS1maWxsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamZyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2Btb3NhaWNgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFtc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2dgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFuc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2ctZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhbmRzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHBpeGVsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhcHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWJgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzbHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xkcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgc2xhYi1wcmVzc2Ase2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXNscHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItcHJlc3MtZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xwZHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHRodW1icHJpbnRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF0bGAsZGVmYXVsdFN0eWxlSWQ6YGxpZ2h0YCxzdHlsZUlkczpbYGxpZ2h0YF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6MzAwfV0sW2B1dGlsaXR5YCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdXNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHV0aWxpdHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdWRzYmAsZGVmYXVsdFN0eWxlSWQ6YHNlbWlib2xkYCxzdHlsZUlkczpbYHNlbWlib2xkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NjAwfV0sW2B1dGlsaXR5LWZpbGxgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF1ZnNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHZlbGx1bWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXZzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHdoaXRlYm9hcmRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF3c2JgLGRlZmF1bHRTdHlsZUlkOmBzZW1pYm9sZGAsc3R5bGVJZHM6W2BzZW1pYm9sZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjYwMH1dXSkscmY9e2NoaXNlbDp7cmVndWxhcjpgZmFjcmB9LGNsYXNzaWM6e2JyYW5kczpgZmFiYCxsaWdodDpgZmFsYCxyZWd1bGFyOmBmYXJgLHNvbGlkOmBmYXNgLHRoaW46YGZhdGB9LGR1b3RvbmU6e2xpZ2h0OmBmYWRsYCxyZWd1bGFyOmBmYWRyYCxzb2xpZDpgZmFkYCx0aGluOmBmYWR0YH0sZXRjaDp7c29saWQ6YGZhZXNgfSxncmFwaGl0ZTp7dGhpbjpgZmFndGB9LGplbGx5OntyZWd1bGFyOmBmYWpyYH0sImplbGx5LWR1byI6e3JlZ3VsYXI6YGZhamRyYH0sImplbGx5LWZpbGwiOntyZWd1bGFyOmBmYWpmcmB9LG1vc2FpYzp7c29saWQ6YGZhbXNgfSxub3Rkb2c6e3NvbGlkOmBmYW5zYH0sIm5vdGRvZy1kdW8iOntzb2xpZDpgZmFuZHNgfSxwaXhlbDp7cmVndWxhcjpgZmFwcmB9LHNoYXJwOntsaWdodDpgZmFzbGAscmVndWxhcjpgZmFzcmAsc29saWQ6YGZhc3NgLHRoaW46YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6e2xpZ2h0OmBmYXNkbGAscmVndWxhcjpgZmFzZHJgLHNvbGlkOmBmYXNkc2AsdGhpbjpgZmFzZHRgfSxzbGFiOntyZWd1bGFyOmBmYXNscmB9LCJzbGFiLWR1byI6e3JlZ3VsYXI6YGZhc2xkcmB9LCJzbGFiLXByZXNzIjp7cmVndWxhcjpgZmFzbHByYH0sInNsYWItcHJlc3MtZHVvIjp7cmVndWxhcjpgZmFzbHBkcmB9LHRodW1icHJpbnQ6e2xpZ2h0OmBmYXRsYH0sdXRpbGl0eTp7c2VtaWJvbGQ6YGZhdXNiYH0sInV0aWxpdHktZHVvIjp7c2VtaWJvbGQ6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOntzZW1pYm9sZDpgZmF1ZnNiYH0sdmVsbHVtOntzb2xpZDpgZmF2c2B9LHdoaXRlYm9hcmQ6e3NlbWlib2xkOmBmYXdzYmB9fSxhZj1bYGZha2AsYGZhLWtpdGAsYGZha2RgLGBmYS1raXQtZHVvdG9uZWBdLG9mPXtraXQ6e2Zhazpga2l0YCwiZmEta2l0Ijpga2l0YH0sImtpdC1kdW90b25lIjp7ZmFrZDpga2l0LWR1b3RvbmVgLCJmYS1raXQtZHVvdG9uZSI6YGtpdC1kdW90b25lYH19LHNmPVtga2l0YF07SyhLKHt9LGBraXRgLGBLaXRgKSxga2l0LWR1b3RvbmVgLGBLaXQgRHVvdG9uZWApO3ZhciBjZj17a2l0OnsiZmEta2l0IjpgZmFrYH0sImtpdC1kdW90b25lIjp7ImZhLWtpdC1kdW90b25lIjpgZmFrZGB9fSxsZj17IkZvbnQgQXdlc29tZSBLaXQiOns0MDA6YGZha2Asbm9ybWFsOmBmYWtgfSwiRm9udCBBd2Vzb21lIEtpdCBEdW90b25lIjp7NDAwOmBmYWtkYCxub3JtYWw6YGZha2RgfX0sdWY9e2tpdDp7ZmFrOmBmYS1raXRgfSwia2l0LWR1b3RvbmUiOntmYWtkOmBmYS1raXQtZHVvdG9uZWB9fSxkZj17a2l0OntraXQ6YGZha2B9LCJraXQtZHVvdG9uZSI6eyJraXQtZHVvdG9uZSI6YGZha2RgfX0sZmYscGY9e0dST1VQOmBkdW90b25lLWdyb3VwYCxTV0FQX09QQUNJVFk6YHN3YXAtb3BhY2l0eWAsUFJJTUFSWTpgcHJpbWFyeWAsU0VDT05EQVJZOmBzZWNvbmRhcnlgfSxtZj1bYGZhLWNsYXNzaWNgLGBmYS1kdW90b25lYCxgZmEtc2hhcnBgLGBmYS1zaGFycC1kdW90b25lYCxgZmEtdGh1bWJwcmludGAsYGZhLXdoaXRlYm9hcmRgLGBmYS1ub3Rkb2dgLGBmYS1ub3Rkb2ctZHVvYCxgZmEtY2hpc2VsYCxgZmEtZXRjaGAsYGZhLWdyYXBoaXRlYCxgZmEtamVsbHlgLGBmYS1qZWxseS1maWxsYCxgZmEtamVsbHktZHVvYCxgZmEtc2xhYmAsYGZhLXNsYWItcHJlc3NgLGBmYS1zbGFiLXByZXNzLWR1b2AsYGZhLXNsYWItZHVvYCxgZmEtbW9zYWljYCxgZmEtcGl4ZWxgLGBmYS12ZWxsdW1gLGBmYS11dGlsaXR5YCxgZmEtdXRpbGl0eS1kdW9gLGBmYS11dGlsaXR5LWZpbGxgXTtmZj17fSxLKEsoSyhLKEsoSyhLKEsoSyhLKGZmLGBjbGFzc2ljYCxgQ2xhc3NpY2ApLGBkdW90b25lYCxgRHVvdG9uZWApLGBzaGFycGAsYFNoYXJwYCksYHNoYXJwLWR1b3RvbmVgLGBTaGFycCBEdW90b25lYCksYGNoaXNlbGAsYENoaXNlbGApLGBldGNoYCxgRXRjaGApLGBncmFwaGl0ZWAsYEdyYXBoaXRlYCksYGplbGx5YCxgSmVsbHlgKSxgamVsbHktZHVvYCxgSmVsbHkgRHVvYCksYGplbGx5LWZpbGxgLGBKZWxseSBGaWxsYCksSyhLKEsoSyhLKEsoSyhLKEsoSyhmZixgbW9zYWljYCxgTW9zYWljYCksYG5vdGRvZ2AsYE5vdGRvZ2ApLGBub3Rkb2ctZHVvYCxgTm90ZG9nIER1b2ApLGBwaXhlbGAsYFBpeGVsYCksYHNsYWJgLGBTbGFiYCksYHNsYWItZHVvYCxgU2xhYiBEdW9gKSxgc2xhYi1wcmVzc2AsYFNsYWIgUHJlc3NgKSxgc2xhYi1wcmVzcy1kdW9gLGBTbGFiIFByZXNzIER1b2ApLGB0aHVtYnByaW50YCxgVGh1bWJwcmludGApLGB1dGlsaXR5YCxgVXRpbGl0eWApLEsoSyhLKEsoZmYsYHV0aWxpdHktZHVvYCxgVXRpbGl0eSBEdW9gKSxgdXRpbGl0eS1maWxsYCxgVXRpbGl0eSBGaWxsYCksYHZlbGx1bWAsYFZlbGx1bWApLGB3aGl0ZWJvYXJkYCxgV2hpdGVib2FyZGApLEsoSyh7fSxga2l0YCxgS2l0YCksYGtpdC1kdW90b25lYCxgS2l0IER1b3RvbmVgKTt2YXIgaGY9e2NsYXNzaWM6eyJmYS1icmFuZHMiOmBmYWJgLCJmYS1kdW90b25lIjpgZmFkYCwiZmEtbGlnaHQiOmBmYWxgLCJmYS1yZWd1bGFyIjpgZmFyYCwiZmEtc29saWQiOmBmYXNgLCJmYS10aGluIjpgZmF0YH0sZHVvdG9uZTp7ImZhLXJlZ3VsYXIiOmBmYWRyYCwiZmEtbGlnaHQiOmBmYWRsYCwiZmEtdGhpbiI6YGZhZHRgfSxzaGFycDp7ImZhLXNvbGlkIjpgZmFzc2AsImZhLXJlZ3VsYXIiOmBmYXNyYCwiZmEtbGlnaHQiOmBmYXNsYCwiZmEtdGhpbiI6YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6eyJmYS1zb2xpZCI6YGZhc2RzYCwiZmEtcmVndWxhciI6YGZhc2RyYCwiZmEtbGlnaHQiOmBmYXNkbGAsImZhLXRoaW4iOmBmYXNkdGB9LHNsYWI6eyJmYS1yZWd1bGFyIjpgZmFzbHJgfSwic2xhYi1wcmVzcyI6eyJmYS1yZWd1bGFyIjpgZmFzbHByYH0sInNsYWItZHVvIjp7ImZhLXJlZ3VsYXIiOmBmYXNsZHJgfSwic2xhYi1wcmVzcy1kdW8iOnsiZmEtcmVndWxhciI6YGZhc2xwZHJgfSxwaXhlbDp7ImZhLXJlZ3VsYXIiOmBmYXByYH0sbW9zYWljOnsiZmEtc29saWQiOmBmYW1zYH0sdmVsbHVtOnsiZmEtc29saWQiOmBmYXZzYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgZmF3c2JgfSx0aHVtYnByaW50OnsiZmEtbGlnaHQiOmBmYXRsYH0sbm90ZG9nOnsiZmEtc29saWQiOmBmYW5zYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBmYW5kc2B9LGV0Y2g6eyJmYS1zb2xpZCI6YGZhZXNgfSxncmFwaGl0ZTp7ImZhLXRoaW4iOmBmYWd0YH0samVsbHk6eyJmYS1yZWd1bGFyIjpgZmFqcmB9LCJqZWxseS1maWxsIjp7ImZhLXJlZ3VsYXIiOmBmYWpmcmB9LCJqZWxseS1kdW8iOnsiZmEtcmVndWxhciI6YGZhamRyYH0sY2hpc2VsOnsiZmEtcmVndWxhciI6YGZhY3JgfSx1dGlsaXR5OnsiZmEtc2VtaWJvbGQiOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOnsiZmEtc2VtaWJvbGQiOmBmYXVmc2JgfX0sZ2Y9e2NsYXNzaWM6W2BmYXNgLGBmYXJgLGBmYWxgLGBmYXRgLGBmYWRgXSxkdW90b25lOltgZmFkcmAsYGZhZGxgLGBmYWR0YF0sc2hhcnA6W2BmYXNzYCxgZmFzcmAsYGZhc2xgLGBmYXN0YF0sInNoYXJwLWR1b3RvbmUiOltgZmFzZHNgLGBmYXNkcmAsYGZhc2RsYCxgZmFzZHRgXSxzbGFiOltgZmFzbHJgXSwic2xhYi1wcmVzcyI6W2BmYXNscHJgXSwic2xhYi1kdW8iOltgZmFzbGRyYF0sInNsYWItcHJlc3MtZHVvIjpbYGZhc2xwZHJgXSxwaXhlbDpbYGZhcHJgXSxtb3NhaWM6W2BmYW1zYF0sdmVsbHVtOltgZmF2c2BdLHdoaXRlYm9hcmQ6W2BmYXdzYmBdLHRodW1icHJpbnQ6W2BmYXRsYF0sbm90ZG9nOltgZmFuc2BdLCJub3Rkb2ctZHVvIjpbYGZhbmRzYF0sZXRjaDpbYGZhZXNgXSxncmFwaGl0ZTpbYGZhZ3RgXSxqZWxseTpbYGZhanJgXSwiamVsbHktZmlsbCI6W2BmYWpmcmBdLCJqZWxseS1kdW8iOltgZmFqZHJgXSxjaGlzZWw6W2BmYWNyYF0sdXRpbGl0eTpbYGZhdXNiYF0sInV0aWxpdHktZHVvIjpbYGZhdWRzYmBdLCJ1dGlsaXR5LWZpbGwiOltgZmF1ZnNiYF19LF9mPXtjbGFzc2ljOntmYWI6YGZhLWJyYW5kc2AsZmFkOmBmYS1kdW90b25lYCxmYWw6YGZhLWxpZ2h0YCxmYXI6YGZhLXJlZ3VsYXJgLGZhczpgZmEtc29saWRgLGZhdDpgZmEtdGhpbmB9LGR1b3RvbmU6e2ZhZHI6YGZhLXJlZ3VsYXJgLGZhZGw6YGZhLWxpZ2h0YCxmYWR0OmBmYS10aGluYH0sc2hhcnA6e2Zhc3M6YGZhLXNvbGlkYCxmYXNyOmBmYS1yZWd1bGFyYCxmYXNsOmBmYS1saWdodGAsZmFzdDpgZmEtdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmFzZHM6YGZhLXNvbGlkYCxmYXNkcjpgZmEtcmVndWxhcmAsZmFzZGw6YGZhLWxpZ2h0YCxmYXNkdDpgZmEtdGhpbmB9LHNsYWI6e2Zhc2xyOmBmYS1yZWd1bGFyYH0sInNsYWItcHJlc3MiOntmYXNscHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1kdW8iOntmYXNsZHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1wcmVzcy1kdW8iOntmYXNscGRyOmBmYS1yZWd1bGFyYH0scGl4ZWw6e2ZhcHI6YGZhLXJlZ3VsYXJgfSxtb3NhaWM6e2ZhbXM6YGZhLXNvbGlkYH0sdmVsbHVtOntmYXZzOmBmYS1zb2xpZGB9LHdoaXRlYm9hcmQ6e2Zhd3NiOmBmYS1zZW1pYm9sZGB9LHRodW1icHJpbnQ6e2ZhdGw6YGZhLWxpZ2h0YH0sbm90ZG9nOntmYW5zOmBmYS1zb2xpZGB9LCJub3Rkb2ctZHVvIjp7ZmFuZHM6YGZhLXNvbGlkYH0sZXRjaDp7ZmFlczpgZmEtc29saWRgfSxncmFwaGl0ZTp7ZmFndDpgZmEtdGhpbmB9LGplbGx5OntmYWpyOmBmYS1yZWd1bGFyYH0sImplbGx5LWZpbGwiOntmYWpmcjpgZmEtcmVndWxhcmB9LCJqZWxseS1kdW8iOntmYWpkcjpgZmEtcmVndWxhcmB9LGNoaXNlbDp7ZmFjcjpgZmEtcmVndWxhcmB9LHV0aWxpdHk6e2ZhdXNiOmBmYS1zZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6e2ZhdWRzYjpgZmEtc2VtaWJvbGRgfSwidXRpbGl0eS1maWxsIjp7ZmF1ZnNiOmBmYS1zZW1pYm9sZGB9fSx2Zj1gZmEuZmFzLmZhci5mYWwuZmF0LmZhZC5mYWRyLmZhZGwuZmFkdC5mYWIuZmFzcy5mYXNyLmZhc2wuZmFzdC5mYXNkcy5mYXNkci5mYXNkbC5mYXNkdC5mYXNsci5mYXNscHIuZmFzbGRyLmZhc2xwZHIuZmFwci5mYW1zLmZhdnMuZmF3c2IuZmF0bC5mYW5zLmZhbmRzLmZhZXMuZmFndC5mYWpyLmZhamZyLmZhamRyLmZhY3IuZmF1c2IuZmF1ZHNiLmZhdWZzYmAuc3BsaXQoYC5gKS5jb25jYXQobWYsW2BmYS1zb2xpZGAsYGZhLXJlZ3VsYXJgLGBmYS1saWdodGAsYGZhLXRoaW5gLGBmYS1kdW90b25lYCxgZmEtYnJhbmRzYCxgZmEtc2VtaWJvbGRgXSkseWY9W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gLGBkdW90b25lYCxgYnJhbmRzYCxgc2VtaWJvbGRgXSxiZj1bMSwyLDMsNCw1LDYsNyw4LDksMTBdLHhmPWJmLmNvbmNhdChbMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdKSxTZj1bXS5jb25jYXQoRnUoT2JqZWN0LmtleXMoZ2YpKSx5ZixbYGF3YCxgZndgLGBwdWxsLWxlZnRgLGBwdWxsLXJpZ2h0YF0sW2AyeHNgLGB4c2AsYHNtYCxgbGdgLGB4bGAsYDJ4bGAsYGJlYXRgLGBiZWF0LWZhZGVgLGBib3JkZXJgLGBib3VuY2VgLGBidXp6YCxgY2FudmFzLXNxdWFyZWAsYGNhbnZhcy1yb29teWAsYGZhZGVgLGBmbGlwLTM2MGAsYGZsaXAtYm90aGAsYGZsaXAtaG9yaXpvbnRhbGAsYGZsaXAtdmVydGljYWxgLGBmbGlwYCxgZmxvYXRgLGBpbnZlcnNlYCxgamVsbG9gLGBsYXllcnNgLGBsYXllcnMtYm90dG9tLWxlZnRgLGBsYXllcnMtYm90dG9tLXJpZ2h0YCxgbGF5ZXJzLWNvdW50ZXJgLGBsYXllcnMtdGV4dGAsYGxheWVycy10b3AtbGVmdGAsYGxheWVycy10b3AtcmlnaHRgLGBsaWAsYHB1bGwtZW5kYCxgcHVsbC1zdGFydGAsYHB1bHNlYCxgcm90YXRlLTE4MGAsYHJvdGF0ZS0yNzBgLGByb3RhdGUtOTBgLGByb3RhdGUtYnlgLGBzaGFrZWAsYHNwaW4tcHVsc2VgLGBzcGluLXJldmVyc2VgLGBzcGluYCxgc3Bpbi1zbmFwYCxgc3Bpbi1zbmFwLTRgLGBzcGluLXNuYXAtOGAsYHN0YWNrLTF4YCxgc3RhY2stMnhgLGBzdGFja2AsYHN3aW5nYCxgdWxgLGB3YWdgLGB3aWR0aC1hdXRvYCxgd2lkdGgtZml4ZWRgLHBmLkdST1VQLHBmLlNXQVBfT1BBQ0lUWSxwZi5QUklNQVJZLHBmLlNFQ09OREFSWV0sYmYubWFwKGZ1bmN0aW9uKGUpe3JldHVybmAke2V9eGB9KSx4Zi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYHctJHtlfWB9KSksQ2Y9eyJGb250IEF3ZXNvbWUgNSBGcmVlIjp7OTAwOmBmYXNgLDQwMDpgZmFyYH0sIkZvbnQgQXdlc29tZSA1IFBybyI6ezkwMDpgZmFzYCw0MDA6YGZhcmAsbm9ybWFsOmBmYXJgLDMwMDpgZmFsYH0sIkZvbnQgQXdlc29tZSA1IEJyYW5kcyI6ezQwMDpgZmFiYCxub3JtYWw6YGZhYmB9LCJGb250IEF3ZXNvbWUgNSBEdW90b25lIjp7OTAwOmBmYWRgfX0sd2Y9YF9fX0ZPTlRfQVdFU09NRV9fX2AsVGY9MTYsRWY9YGZhYCxEZj1gc3ZnLWlubGluZS0tZmFgLE9mPWBkYXRhLWZhLWkyc3ZnYCxrZj1gZGF0YS1mYS1wc2V1ZG8tZWxlbWVudGAsQWY9YGRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZ2AsamY9YGRhdGEtcHJlZml4YCxNZj1gZGF0YS1pY29uYCxOZj1gZm9udGF3ZXNvbWUtaTJzdmdgLFBmPWBhc3luY2AsRmY9W2BIVE1MYCxgSEVBRGAsYFNUWUxFYCxgU0NSSVBUYF0sSWY9W2A6OmJlZm9yZWAsYDo6YWZ0ZXJgLGA6YmVmb3JlYCxgOmFmdGVyYF0sTGY9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuITB9Y2F0Y2h7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIFJmKGUpe3JldHVybiBuZXcgUHJveHkoZSx7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQgaW4gZT9lW3RdOmVbYWRdfX0pfXZhciB6Zj1xKHt9LG5kKTt6ZlthZF09cShxKHEocSh7fSx7ImZhLWR1b3RvbmUiOmBkdW90b25lYH0pLG5kW2FkXSksb2Yua2l0KSxvZltga2l0LWR1b3RvbmVgXSk7dmFyIEJmPVJmKHpmKSxWZj1xKHt9LHJmKTtWZlthZF09cShxKHEocSh7fSx7ZHVvdG9uZTpgZmFkYH0pLFZmW2FkXSksZGYua2l0KSxkZltga2l0LWR1b3RvbmVgXSk7dmFyIEhmPVJmKFZmKSxVZj1xKHt9LF9mKTtVZlthZF09cShxKHt9LFVmW2FkXSksdWYua2l0KTt2YXIgV2Y9UmYoVWYpLEdmPXEoe30saGYpO0dmW2FkXT1xKHEoe30sR2ZbYWRdKSxjZi5raXQpLFJmKEdmKTt2YXIgS2Y9ZWQscWY9YGZhLWxheWVycy10ZXh0YCxKZj10ZDtSZihxKHt9LGVmKSk7dmFyIFlmPVtgY2xhc3NgLGBkYXRhLXByZWZpeGAsYGRhdGEtaWNvbmAsYGRhdGEtZmEtdHJhbnNmb3JtYCxgZGF0YS1mYS1tYXNrYF0sWGY9cmQsWmY9W10uY29uY2F0KEZ1KHNmKSxGdShTZikpLFFmPXF1LkZvbnRBd2Vzb21lQ29uZmlnfHx7fTtmdW5jdGlvbiAkZihlKXt2YXIgdD1KdS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbYCtlK2BdYCk7aWYodClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24gZXAoZSl7cmV0dXJuIGU9PT1gYD8hMDplPT09YGZhbHNlYD8hMTplPT09YHRydWVgfHxlfUp1JiZ0eXBlb2YgSnUucXVlcnlTZWxlY3Rvcj09YGZ1bmN0aW9uYCYmW1tgZGF0YS1mYW1pbHktcHJlZml4YCxgZmFtaWx5UHJlZml4YF0sW2BkYXRhLWNzcy1wcmVmaXhgLGBjc3NQcmVmaXhgXSxbYGRhdGEtZmFtaWx5LWRlZmF1bHRgLGBmYW1pbHlEZWZhdWx0YF0sW2BkYXRhLXN0eWxlLWRlZmF1bHRgLGBzdHlsZURlZmF1bHRgXSxbYGRhdGEtcmVwbGFjZW1lbnQtY2xhc3NgLGByZXBsYWNlbWVudENsYXNzYF0sW2BkYXRhLWF1dG8tcmVwbGFjZS1zdmdgLGBhdXRvUmVwbGFjZVN2Z2BdLFtgZGF0YS1hdXRvLWFkZC1jc3NgLGBhdXRvQWRkQ3NzYF0sW2BkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHNgLGBzZWFyY2hQc2V1ZG9FbGVtZW50c2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLXdhcm5pbmdzYCxgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5nc2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLWZ1bGwtc2NhbmAsYHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW5gXSxbYGRhdGEtb2JzZXJ2ZS1tdXRhdGlvbnNgLGBvYnNlcnZlTXV0YXRpb25zYF0sW2BkYXRhLW11dGF0ZS1hcHByb2FjaGAsYG11dGF0ZUFwcHJvYWNoYF0sW2BkYXRhLWtlZXAtb3JpZ2luYWwtc291cmNlYCxga2VlcE9yaWdpbmFsU291cmNlYF0sW2BkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2VgLGBtZWFzdXJlUGVyZm9ybWFuY2VgXSxbYGRhdGEtc2hvdy1taXNzaW5nLWljb25zYCxgc2hvd01pc3NpbmdJY29uc2BdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PVB1KGUsMiksbj10WzBdLHI9dFsxXSxpPWVwKCRmKG4pKTtpIT1udWxsJiYoUWZbcl09aSl9KTt2YXIgdHA9e3N0eWxlRGVmYXVsdDpgc29saWRgLGZhbWlseURlZmF1bHQ6YWQsY3NzUHJlZml4OkVmLHJlcGxhY2VtZW50Q2xhc3M6RGYsYXV0b1JlcGxhY2VTdmc6ITAsYXV0b0FkZENzczohMCxzZWFyY2hQc2V1ZG9FbGVtZW50czohMSxzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzOiEwLHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW46ITEsb2JzZXJ2ZU11dGF0aW9uczohMCxtdXRhdGVBcHByb2FjaDpgYXN5bmNgLGtlZXBPcmlnaW5hbFNvdXJjZTohMCxtZWFzdXJlUGVyZm9ybWFuY2U6ITEsc2hvd01pc3NpbmdJY29uczohMH07UWYuZmFtaWx5UHJlZml4JiYoUWYuY3NzUHJlZml4PVFmLmZhbWlseVByZWZpeCk7dmFyIG5wPXEocSh7fSx0cCksUWYpO25wLmF1dG9SZXBsYWNlU3ZnfHwobnAub2JzZXJ2ZU11dGF0aW9ucz0hMSk7dmFyIEo9e307T2JqZWN0LmtleXModHApLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEosZSx7ZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24odCl7bnBbZV09dCxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucFtlXX19KX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKLCJmYW1pbHlQcmVmaXgiLHtlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihlKXtucC5jc3NQcmVmaXg9ZSxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucC5jc3NQcmVmaXh9fSkscXUuRm9udEF3ZXNvbWVDb25maWc9Sjt2YXIgcnA9W107ZnVuY3Rpb24gaXAoZSl7cmV0dXJuIHJwLnB1c2goZSksZnVuY3Rpb24oKXtycC5zcGxpY2UocnAuaW5kZXhPZihlKSwxKX19dmFyIGFwPVRmLG9wPXtzaXplOjE2LHg6MCx5OjAscm90YXRlOjAsZmxpcFg6ITEsZmxpcFk6ITF9O2Z1bmN0aW9uIHNwKGUpe2lmKCEoIWV8fCFadSkpe3ZhciB0PUp1LmNyZWF0ZUVsZW1lbnQoYHN0eWxlYCk7dC5zZXRBdHRyaWJ1dGUoYHR5cGVgLGB0ZXh0L2Nzc2ApLHQuaW5uZXJIVE1MPWU7Zm9yKHZhciBuPUp1LmhlYWQuY2hpbGROb2RlcyxyPW51bGwsaT1uLmxlbmd0aC0xO2k+LTE7aS0tKXt2YXIgYT1uW2ldLG89KGEudGFnTmFtZXx8YGApLnRvVXBwZXJDYXNlKCk7W2BTVFlMRWAsYExJTktgXS5pbmRleE9mKG8pPi0xJiYocj1hKX1yZXR1cm4gSnUuaGVhZC5pbnNlcnRCZWZvcmUodCxyKSxlfX12YXIgY3A9YDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYDtmdW5jdGlvbiBscCgpe2Zvcih2YXIgZT0xMix0PWBgO2UtLT4wOyl0Kz1jcFtNYXRoLnJhbmRvbSgpKjYyfDBdO3JldHVybiB0fWZ1bmN0aW9uIHVwKGUpe2Zvcih2YXIgdD1bXSxuPShlfHxbXSkubGVuZ3RoPj4+MDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBkcChlKXtyZXR1cm4gZS5jbGFzc0xpc3Q/dXAoZS5jbGFzc0xpc3QpOihlLmdldEF0dHJpYnV0ZShgY2xhc3NgKXx8YGApLnNwbGl0KGAgYCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9ZnVuY3Rpb24gZnAoZSl7cmV0dXJuYCR7ZX1gLnJlcGxhY2UoLyYvZyxgJmFtcDtgKS5yZXBsYWNlKC8iL2csYCZxdW90O2ApLnJlcGxhY2UoLycvZyxgJiMzOTtgKS5yZXBsYWNlKC88L2csYCZsdDtgKS5yZXBsYWNlKC8+L2csYCZndDtgKX1mdW5jdGlvbiBwcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259PSIke2ZwKGVbbl0pfSIgYH0sYGApLnRyaW0oKX1mdW5jdGlvbiBtcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259OiAke2Vbbl0udHJpbSgpfTtgfSxgYCl9ZnVuY3Rpb24gaHAoZSl7cmV0dXJuIGUuc2l6ZSE9PW9wLnNpemV8fGUueCE9PW9wLnh8fGUueSE9PW9wLnl8fGUucm90YXRlIT09b3Aucm90YXRlfHxlLmZsaXBYfHxlLmZsaXBZfWZ1bmN0aW9uIGdwKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS5jb250YWluZXJXaWR0aCxyPWUuaWNvbldpZHRoO3JldHVybntvdXRlcjp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtuLzJ9IDI1NilgfSxpbm5lcjp7dHJhbnNmb3JtOmAke2B0cmFuc2xhdGUoJHt0LngqMzJ9LCAke3QueSozMn0pIGB9ICR7YHNjYWxlKCR7dC5zaXplLzE2Kih0LmZsaXBYPy0xOjEpfSwgJHt0LnNpemUvMTYqKHQuZmxpcFk/LTE6MSl9KSBgfSAke2Byb3RhdGUoJHt0LnJvdGF0ZX0gMCAwKWB9YH0scGF0aDp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtyLzIqLTF9IC0yNTYpYH19fWZ1bmN0aW9uIF9wKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS53aWR0aCxyPW49PT12b2lkIDA/VGY6bixpPWUuaGVpZ2h0LGE9aT09PXZvaWQgMD9UZjppLG89ZS5zdGFydENlbnRlcmVkLHM9byE9PXZvaWQgMCYmbyxjPWBgO3JldHVybiBjKz1zJiZRdT9gdHJhbnNsYXRlKCR7dC54L2FwLXIvMn1lbSwgJHt0LnkvYXAtYS8yfWVtKSBgOnM/YHRyYW5zbGF0ZShjYWxjKC01MCUgKyAke3QueC9hcH1lbSksIGNhbGMoLTUwJSArICR7dC55L2FwfWVtKSkgYDpgdHJhbnNsYXRlKCR7dC54L2FwfWVtLCAke3QueS9hcH1lbSkgYCxjKz1gc2NhbGUoJHt0LnNpemUvYXAqKHQuZmxpcFg/LTE6MSl9LCAke3Quc2l6ZS9hcCoodC5mbGlwWT8tMToxKX0pIGAsYys9YHJvdGF0ZSgke3Qucm90YXRlfWRlZykgYCxjfXZhciB2cD1gOnJvb3QsIDpob3N0IHsKICAtLWZhLWZvbnQtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEZyZWUnOwogIC0tZmEtZm9udC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBGcmVlJzsKICAtLWZhLWZvbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LWR1b3RvbmU6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtZHVvdG9uZS10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBCcmFuZHMnOwogIC0tZmEtZm9udC1zaGFycC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAnOwogIC0tZmEtZm9udC1zaGFycC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJzsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zbGFiLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWInOwogIC0tZmEtZm9udC1zbGFiLXByZXNzLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MnOwogIC0tZmEtZm9udC1zbGFiLWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTbGFiIER1byc7CiAgLS1mYS1mb250LXNsYWItcHJlc3MtZHVvLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MgRHVvJzsKICAtLWZhLWZvbnQtcGl4ZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgUGl4ZWwnOwogIC0tZmEtZm9udC1tb3NhaWMtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE1vc2FpYyc7CiAgLS1mYS1mb250LXZlbGx1bS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVmVsbHVtJzsKICAtLWZhLWZvbnQtd2hpdGVib2FyZC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgV2hpdGVib2FyZCc7CiAgLS1mYS1mb250LXRodW1icHJpbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQnOwogIC0tZmEtZm9udC1ub3Rkb2ctc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyc7CiAgLS1mYS1mb250LW5vdGRvZy1kdW8tc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyBEdW8nOwogIC0tZmEtZm9udC1ldGNoLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBFdGNoJzsKICAtLWZhLWZvbnQtZ3JhcGhpdGUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUnOwogIC0tZmEtZm9udC1qZWxseS1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSc7CiAgLS1mYS1mb250LWplbGx5LWZpbGwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgSmVsbHkgRmlsbCc7CiAgLS1mYS1mb250LWplbGx5LWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8nOwogIC0tZmEtZm9udC1jaGlzZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgQ2hpc2VsJzsKICAtLWZhLWZvbnQtdXRpbGl0eS1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSc7CiAgLS1mYS1mb250LXV0aWxpdHktZHVvLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byc7CiAgLS1mYS1mb250LXV0aWxpdHktZmlsbC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBGaWxsJzsKfQoKLnN2Zy1pbmxpbmUtLWZhIHsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBkaXNwbGF5OiB2YXIoLS1mYS1kaXNwbGF5LCBpbmxpbmUtYmxvY2spOwogIGhlaWdodDogMWVtOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgsIDEuMjVlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4cyB7CiAgdmVydGljYWwtYWxpZ246IDAuMWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14cyB7CiAgdmVydGljYWwtYWxpZ246IDBlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtc20gewogIHZlcnRpY2FsLWFsaWduOiAtMC4wNzE0Mjg1NzE0ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMmVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjMxMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1sZWZ0LAouc3ZnLWlubGluZS0tZmEgLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXB1bGwtcmlnaHQsCi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxpIHsKICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIGluc2V0LWJsb2NrLXN0YXJ0OiAwLjI1ZW07IC8qIHN5bmNpbmcgdmVydGljYWwgYWxpZ25tZW50IHdpdGggV2ViIEZvbnQgcmVuZGVyaW5nICovCn0KCi5mYS1sYXllcnMtY291bnRlciwgLmZhLWxheWVycy10ZXh0IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZhLWxheWVycyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMWVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCwgMS4yNWVtKTsKfQouZmEtbGF5ZXJzIC5zdmctaW5saW5lLS1mYSB7CiAgaW5zZXQ6IDA7CiAgbWFyZ2luOiBhdXRvOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLXRleHQgewogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLWNvdW50ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhLWNvdW50ZXItYmFja2dyb3VuZC1jb2xvciwgI2ZmMjUzYSk7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZmEtY291bnRlci1ib3JkZXItcmFkaXVzLCAxZW0pOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS1mYS1jb3VudGVyLWxpbmUtaGVpZ2h0LCAxKTsKICBtYXgtd2lkdGg6IHZhcigtLWZhLWNvdW50ZXItbWF4LXdpZHRoLCA1ZW0pOwogIG1pbi13aWR0aDogdmFyKC0tZmEtY291bnRlci1taW4td2lkdGgsIDEuNWVtKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IHZhcigtLWZhLWNvdW50ZXItcGFkZGluZywgMC4yNWVtIDAuNWVtKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWNvdW50ZXItc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLXJpZ2h0IHsKICBib3R0b206IHZhcigtLWZhLWJvdHRvbSwgMCk7CiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLWxlZnQgewogIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDsKfQoKLmZhLWxheWVycy10b3AtcmlnaHQgewogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtbGF5ZXJzLXNjYWxlLCAwLjI1KSk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0Owp9CgouZmEtbGF5ZXJzLXRvcC1sZWZ0IHsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLmZhLTF4IHsKICBmb250LXNpemU6IDFlbTsKfQoKLmZhLTJ4IHsKICBmb250LXNpemU6IDJlbTsKfQoKLmZhLTN4IHsKICBmb250LXNpemU6IDNlbTsKfQoKLmZhLTR4IHsKICBmb250LXNpemU6IDRlbTsKfQoKLmZhLTV4IHsKICBmb250LXNpemU6IDVlbTsKfQoKLmZhLTZ4IHsKICBmb250LXNpemU6IDZlbTsKfQoKLmZhLTd4IHsKICBmb250LXNpemU6IDdlbTsKfQoKLmZhLTh4IHsKICBmb250LXNpemU6IDhlbTsKfQoKLmZhLTl4IHsKICBmb250LXNpemU6IDllbTsKfQoKLmZhLTEweCB7CiAgZm9udC1zaXplOiAxMGVtOwp9CgouZmEtMnhzIHsKICBmb250LXNpemU6IGNhbGMoMTAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteHMgewogIGZvbnQtc2l6ZTogY2FsYygxMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS1zbSB7CiAgZm9udC1zaXplOiBjYWxjKDE0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDE0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDE0IC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLWxnIHsKICBmb250LXNpemU6IGNhbGMoMjAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMjBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAyMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMjAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteGwgewogIGZvbnQtc2l6ZTogY2FsYygyNCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyNHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDI0ICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAyNCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS0yeGwgewogIGZvbnQtc2l6ZTogY2FsYygzMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAzMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDMyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAzMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS13aWR0aC1hdXRvIHsKICAtLWZhLXdpZHRoOiBhdXRvOwp9CgouZmEtZncsCi5mYS13aWR0aC1maXhlZCB7CiAgLS1mYS13aWR0aDogMS4yNWVtOwp9CgouZmEtY2FudmFzLXNxdWFyZSB7CiAgcGFkZGluZy1ibG9jazogMC4xMjVlbTsKICBtYXJnaW4tYmxvY2stZW5kOiAtMC4xMjVlbTsKfQoKLmZhLWNhbnZhcy1yb29teSB7CiAgcGFkZGluZy1ibG9jazogMC4yNWVtOwogIHBhZGRpbmctaW5saW5lOiAwLjEyNWVtOwogIG1hcmdpbi1ibG9jay1lbmQ6IC0wLjI1ZW07CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi5mYS11bCB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLWxpLW1hcmdpbiwgMi41ZW0pOwogIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0Owp9CgovKiBIZWFkcyBVcDogQm9yZGVyZWQgSWNvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUhCiAgLSBUaGlzIGZlYXR1cmUgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgRm9udCBBd2Vzb21lICh2OCkhCiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguCiovCi8qIE5vdGVzOgoqIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSkKKiAtLUB7di4kY3NzLXByZWZpeH0tYm9yZGVyLXBhZGRpbmcgPQogICoqIDMvMTYgZm9yIHZlcnRpY2FsIHBhZGRpbmcgKHRvIGdpdmUgfjJweCBvZiB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFyb3VuZCBhbiBpY29uIGNvbnNpZGVyaW5nIGl0J3MgdmVydGljYWwgYWxpZ25tZW50KQogICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbikKKi8KLmZhLWJvcmRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWJvcmRlci1yYWRpdXMsIDAuMWVtKTsKICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpOwogIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7CiAgYm94LXNpemluZzogdmFyKC0tZmEtYm9yZGVyLWJveC1zaXppbmcsIGNvbnRlbnQtYm94KTsKICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4xODc1ZW0gMC4yNWVtKTsKfQoKLmZhLXB1bGwtbGVmdCwKLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1wdWxsLXJpZ2h0LAouZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1iZWF0IHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtYm91bmNlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC4yOCwgMC44NCwgMC40MiwgMSkpOwp9CgouZmEtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKfQoKLmZhLWJlYXQtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZsaXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxLjVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcC0zNjAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwLTM2MDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc2hha2UgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zaGFrZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuNzVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc3BpbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXJldmVyc2UgewogIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsKfQoKLmZhLXB1bHNlLAouZmEtc3Bpbi1wdWxzZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7Cn0KCi5mYS1zcGluLXNuYXAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zcGluLXNuYXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtNCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC00OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMi40cyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtOCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC04OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgNHMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpOwp9CgouZmEtYnV6eiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJ1eno7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjZzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgbGluZWFyKTsKfQoKLmZhLXdhZyB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXdhZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuOXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIGNlbnRlcjsKfQoKLmZhLWZsb2F0IHsKICBhbmltYXRpb24tbmFtZTogZmEtZmxvYXQ7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwp9CgouZmEtc3dpbmcgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zd2luZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDEuMnMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGNlbnRlcjsKfQoKLmZhLWplbGxvIHsKICBhbmltYXRpb24tbmFtZTogZmEtamVsbG87CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjlzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1vdXQpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogIC5mYS1iZWF0LAogIC5mYS1ib3VuY2UsCiAgLmZhLWZhZGUsCiAgLmZhLWJlYXQtZmFkZSwKICAuZmEtZmxpcCwKICAuZmEtZmxpcC0zNjAsCiAgLmZhLXB1bHNlLAogIC5mYS1zaGFrZSwKICAuZmEtc3BpbiwKICAuZmEtc3Bpbi1wdWxzZSwKICAuZmEtYnV6eiwKICAuZmEtZmxvYXQsCiAgLmZhLWplbGxvLAogIC5mYS1zcGluLXNuYXAsCiAgLmZhLXNwaW4tc25hcC00LAogIC5mYS1zcGluLXNuYXAtOCwKICAuZmEtc3dpbmcsCiAgLmZhLXdhZyB7CiAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9Cn0KQGtleWZyYW1lcyBmYS1iZWF0IHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA0NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjIgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjIyKSkpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA5MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1ib3VuY2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcpOwogIH0KICAxNCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteCwgMS4wNiksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjk0KSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtYW50aWNpcGF0aW9uLCAzcHgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45NCksIHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXksIDEuMTIpKSB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAwLjVlbSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLjY2LCAwLjY2LCAxKTsKICB9CiAgNTIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0tZmEtYm91bmNlLWhlaWdodCwgMC41ZW0pICogMS4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAxLCAwLjUpOwogIH0KICA3MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA2KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45MikpIHRyYW5zbGF0ZVkoMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC4zMywgMC42NiwgMSk7CiAgfQogIDg1JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgsIDEuMDQpIHRyYW5zbGF0ZVkoY2FsYygtMnB4ICogdmFyKC0tZmEtYm91bmNlLXJlYm91bmQsIDEpKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZhZGUgewogIDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgNDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWZhZGUtb3BhY2l0eSwgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7CiAgMCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgMjUlIHsKICAgIG9wYWNpdHk6IGNhbGModmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCkgKyAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7CiAgfQogIDQ1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjUpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICBvcGFjaXR5OiBjYWxjKHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpICsgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjI4KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbGlwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIDAuNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICA5MiUgewogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyZW0pIHNjYWxlKDEpIHJvdGF0ZTNkKHZhcigtLWZhLWZsaXAteCwgMCksIHZhcigtLWZhLWZsaXAteSwgMSksIHZhcigtLWZhLWZsaXAteiwgMCksIGNhbGModmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykgKiB2YXIoLS1mYS1mbGlwLW92ZXJzaG9vdCwgMS4wNCkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZsaXAtMzYwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDgwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIHZhcigtLWZhLWZsaXAtb3ZlcnNob290LCAxLjA0KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc2hha2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDIwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpIHRyYW5zbGF0ZVgoLTFweCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA3OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoLTNkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgOTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLXNwaW4tc25hcCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxNi42NyUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDI4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDMzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDYyJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDY2LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDc4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDgzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDk1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtNCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtOCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEyLjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAyMS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAzNCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAzNy41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ2LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgNTklIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNjIuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICA3MS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDg0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMTVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDg3LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDMxNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOTYuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYnV6eiB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjEsIDAsIDAuOSwgMSk7CiAgfQogIDUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC41ZGVnKTsKICB9CiAgMTAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC41ZGVnKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC4zZGVnKTsKICB9CiAgMjAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC4zZGVnKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjcpKSByb3RhdGUoMC4yZGVnKTsKICB9CiAgMzAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSAqIDAuNykpIHJvdGF0ZSgtMC4yZGVnKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjQpKSByb3RhdGUoMC4xZGVnKTsKICB9CiAgNDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS13YWcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIsIDAsIDAuNiwgMSk7CiAgfQogIDM2JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZShjYWxjKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpICogMC44NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGModmFyKC0tZmEtd2FnLWFuZ2xlLCAxMmRlZykgKiAwLjYpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY4JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbG9hdCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHRyYW5zbGF0ZVgoMCkgcm90YXRlKDBkZWcpIHNjYWxlKHZhcigtLWZhLWZsb2F0LXNxdWFzaC14LCAxLjAyKSwgdmFyKC0tZmEtZmxvYXQtc3F1YXNoLXksIDAuOTgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0wLjQgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKHZhcigtLWZhLWZsb2F0LWRyaWZ0LCAxcHgpKSByb3RhdGUodmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpIHNjYWxlKDEsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXgsIDAuOTgpLCB2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXksIDEuMDMpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMCk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC45MiAqIHZhcigtLWZhLWZsb2F0LWhlaWdodCwgNnB4KSkpIHRyYW5zbGF0ZVgoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpKSBzY2FsZSgwLjk5NSwgMS4wMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMC4zMyk7CiAgfQogIDcwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC4zICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLWZsb2F0LXRpbHQsIDFkZWcpKSkgc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygwLjA1ICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZykgc2NhbGUodmFyKC0tZmEtZmxvYXQtc3F1YXNoLXgsIDEuMDIpLCB2YXIoLS1mYS1mbG9hdC1zcXVhc2gteSwgMC45OCkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zcXVhc2gteCwgMS4wMiksIHZhcigtLWZhLWZsb2F0LXNxdWFzaC15LCAwLjk4KSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc3dpbmcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tZmEtc3dpbmctYW5nbGUsIDIyZGVnKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAxOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjg1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAyOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC42NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuNjUsIDEpOwogIH0KICAzOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjQ1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA0OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4yNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTYlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGMoLTEgKiB2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtamVsbG8gewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjgsIDEpOwogIH0KICAxMiUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSwgY2FsYygyIC0gdmFyKC0tZmEtamVsbG8tc2NhbGUteCwgMS4xNSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKGNhbGMoMiAtIHZhcigtLWZhLWplbGxvLXNjYWxlLXksIDEuMTIpKSwgdmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMywgMCwgMC43LCAxKTsKICB9CiAgMzYlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygxICsgKHZhcigtLWZhLWplbGxvLXNjYWxlLXgsIDEuMTUpIC0gMSkgKiAwLjUpLCBjYWxjKDIgLSAoMSArICh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSAtIDEpICogMC41KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygyIC0gKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpLCBjYWxjKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMiwgMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogIH0KICA2OCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpOwogIH0KfQouZmEtcm90YXRlLTkwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KCi5mYS1yb3RhdGUtMTgwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwp9CgouZmEtcm90YXRlLTI3MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKfQoKLmZhLWZsaXAtaG9yaXpvbnRhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7Cn0KCi5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTsKfQoKLmZhLWZsaXAtYm90aCwKLmZhLWZsaXAtaG9yaXpvbnRhbC5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAtMSk7Cn0KCi5mYS1yb3RhdGUtYnkgewogIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgMCkpOwp9Cgouc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkgewogIGZpbGw6IHZhcigtLWZhLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTsKICBvcGFjaXR5OiB2YXIoLS1mYS1zZWNvbmRhcnktb3BhY2l0eSwgMC40KTsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLXN3YXAtb3BhY2l0eSAuZmEtcHJpbWFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXNlY29uZGFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksCi5zdmctaW5saW5lLS1mYSBtYXNrIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IGJsYWNrOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtaW52ZXJzZSB7CiAgZmlsbDogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7Cn0KCi5mYS1zdGFjayB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMmVtOwogIGxpbmUtaGVpZ2h0OiAyZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDIuNWVtOwp9CgouZmEtaW52ZXJzZSB7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXggewogIC0tZmEtd2lkdGg6IDEuMjVlbTsKICBoZWlnaHQ6IDFlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgpOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1zdGFjay0yeCB7CiAgLS1mYS13aWR0aDogMi41ZW07CiAgaGVpZ2h0OiAyZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTsKfQoKLmZhLXN0YWNrLTF4LAouZmEtc3RhY2stMnggewogIGluc2V0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogdmFyKC0tZmEtc3RhY2stei1pbmRleCwgYXV0byk7Cn1gO2Z1bmN0aW9uIHlwKCl7dmFyIGU9RWYsdD1EZixuPUouY3NzUHJlZml4LHI9Si5yZXBsYWNlbWVudENsYXNzLGk9dnA7aWYobiE9PWV8fHIhPT10KXt2YXIgYT1SZWdFeHAoYFxcLiR7ZX1cXC1gLGBnYCksbz1SZWdFeHAoYFxcLS0ke2V9XFwtYCxgZ2ApLHM9UmVnRXhwKGBcXC4ke3R9YCxgZ2ApO2k9aS5yZXBsYWNlKGEsYC4ke259LWApLnJlcGxhY2UobyxgLS0ke259LWApLnJlcGxhY2UocyxgLiR7cn1gKX1yZXR1cm4gaX12YXIgYnA9ITE7ZnVuY3Rpb24geHAoKXtKLmF1dG9BZGRDc3MmJiFicCYmKHNwKHlwKCkpLGJwPSEwKX12YXIgU3A9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e2Nzczp5cCxpbnNlcnRDc3M6eHB9fX0saG9va3M6ZnVuY3Rpb24oKXtyZXR1cm57YmVmb3JlRE9NRWxlbWVudENyZWF0aW9uOmZ1bmN0aW9uKCl7eHAoKX0sYmVmb3JlSTJzdmc6ZnVuY3Rpb24oKXt4cCgpfX19fSxDcD1xdXx8e307Q3Bbd2ZdfHwoQ3Bbd2ZdPXt9KSxDcFt3Zl0uc3R5bGVzfHwoQ3Bbd2ZdLnN0eWxlcz17fSksQ3Bbd2ZdLmhvb2tzfHwoQ3Bbd2ZdLmhvb2tzPXt9KSxDcFt3Zl0uc2hpbXN8fChDcFt3Zl0uc2hpbXM9W10pO3ZhciB3cD1DcFt3Zl0sVHA9W10sRXA9ZnVuY3Rpb24oKXtKdS5yZW1vdmVFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCxFcCksRHA9MSxUcC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pfSxEcD0hMTtadSYmKERwPShKdS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/L15sb2FkZWR8XmMvOi9ebG9hZGVkfF5pfF5jLykudGVzdChKdS5yZWFkeVN0YXRlKSxEcHx8SnUuYWRkRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsRXApKTtmdW5jdGlvbiBPcChlKXtadSYmKERwP3NldFRpbWVvdXQoZSwwKTpUcC5wdXNoKGUpKX1mdW5jdGlvbiBrcChlKXt2YXIgdD1lLnRhZyxuPWUuYXR0cmlidXRlcyxyPW49PT12b2lkIDA/e306bixpPWUuY2hpbGRyZW4sYT1pPT09dm9pZCAwP1tdOmk7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9mcChlKTpgPCR7dH0gJHtwcChyKX0+JHthLm1hcChrcCkuam9pbihgYCl9PC8ke3R9PmB9ZnVuY3Rpb24gQXAoZSx0LG4pe2lmKGUmJmVbdF0mJmVbdF1bbl0pcmV0dXJue3ByZWZpeDp0LGljb25OYW1lOm4saWNvbjplW3RdW25dfX12YXIganA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyLGksYSl7cmV0dXJuIGUuY2FsbCh0LG4scixpLGEpfX0sTXA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmtleXMoZSksYT1pLmxlbmd0aCxvPXI9PT12b2lkIDA/dDpqcCh0LHIpLHMsYyxsO2ZvcihuPT09dm9pZCAwPyhzPTEsbD1lW2lbMF1dKToocz0wLGw9bik7czxhO3MrKyljPWlbc10sbD1vKGwsZVtjXSxjLGUpO3JldHVybiBsfTtmdW5jdGlvbiBOcChlKXtyZXR1cm4gRnUoZSkubGVuZ3RoPT09MT9lLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KTpudWxsfWZ1bmN0aW9uIFBwKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXt2YXIgcj1lW25dO3JldHVybiByLmljb24/dFtyLmljb25OYW1lXT1yLmljb246dFtuXT1yLHR9LHt9KX1mdW5jdGlvbiBGcChlLHQpe3ZhciBuPShhcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30pLnNraXBIb29rcyxyPW4hPT12b2lkIDAmJm4saT1QcCh0KTt0eXBlb2Ygd3AuaG9va3MuYWRkUGFjaz09YGZ1bmN0aW9uYCYmIXI/d3AuaG9va3MuYWRkUGFjayhlLFBwKHQpKTp3cC5zdHlsZXNbZV09cShxKHt9LHdwLnN0eWxlc1tlXXx8e30pLGkpLGU9PT1gZmFzYCYmRnAoYGZhYCx0KX12YXIgSXA9d3Auc3R5bGVzLExwPXdwLnNoaW1zLFJwPU9iamVjdC5rZXlzKFdmKSx6cD1ScC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT1PYmplY3Qua2V5cyhXZlt0XSksZX0se30pLEJwPW51bGwsVnA9e30sSHA9e30sVXA9e30sV3A9e30sR3A9e307ZnVuY3Rpb24gS3AoZSl7cmV0dXJuflpmLmluZGV4T2YoZSl9ZnVuY3Rpb24gcXAoZSx0KXt2YXIgbj10LnNwbGl0KGAtYCkscj1uWzBdLGk9bi5zbGljZSgxKS5qb2luKGAtYCk7cmV0dXJuIHI9PT1lJiZpIT09YGAmJiFLcChpKT9pOm51bGx9dmFyIEpwPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE1wKElwLGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtyXT1NcChuLGUse30pLHR9LHt9KX07VnA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRbM10mJihlW3RbM11dPW4pLHRbMl0mJnRbMl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmB9KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdC50b1N0cmluZygxNildPW59KSxlfSksSHA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbbl09bix0WzJdJiZ0WzJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSksR3A9ZShmdW5jdGlvbihlLHQsbil7dmFyIHI9dFsyXTtyZXR1cm4gZVtuXT1uLHIuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSk7dmFyIHQ9YGZhcmBpbiBJcHx8Si5hdXRvRmV0Y2hTdmcsbj1NcChMcCxmdW5jdGlvbihlLG4pe3ZhciByPW5bMF0saT1uWzFdLGE9blsyXTtyZXR1cm4gaT09PWBmYXJgJiYhdCYmKGk9YGZhc2ApLHR5cGVvZiByPT1gc3RyaW5nYCYmKGUubmFtZXNbcl09e3ByZWZpeDppLGljb25OYW1lOmF9KSx0eXBlb2Ygcj09YG51bWJlcmAmJihlLnVuaWNvZGVzW3IudG9TdHJpbmcoMTYpXT17cHJlZml4OmksaWNvbk5hbWU6YX0pLGV9LHtuYW1lczp7fSx1bmljb2Rlczp7fX0pO1VwPW4ubmFtZXMsV3A9bi51bmljb2RlcyxCcD1ybShKLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfTtpcChmdW5jdGlvbihlKXtCcD1ybShlLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfSksSnAoKTtmdW5jdGlvbiBZcChlLHQpe3JldHVybihWcFtlXXx8e30pW3RdfWZ1bmN0aW9uIFhwKGUsdCl7cmV0dXJuKEhwW2VdfHx7fSlbdF19ZnVuY3Rpb24gWnAoZSx0KXtyZXR1cm4oR3BbZV18fHt9KVt0XX1mdW5jdGlvbiBRcChlKXtyZXR1cm4gVXBbZV18fHtwcmVmaXg6bnVsbCxpY29uTmFtZTpudWxsfX1mdW5jdGlvbiAkcChlKXt2YXIgdD1XcFtlXSxuPVlwKGBmYXNgLGUpO3JldHVybiB0fHwobj97cHJlZml4OmBmYXNgLGljb25OYW1lOm59Om51bGwpfHx7cHJlZml4Om51bGwsaWNvbk5hbWU6bnVsbH19ZnVuY3Rpb24gZW0oKXtyZXR1cm4gQnB9dmFyIHRtPWZ1bmN0aW9uKCl7cmV0dXJue3ByZWZpeDpudWxsLGljb25OYW1lOm51bGwscmVzdDpbXX19O2Z1bmN0aW9uIG5tKGUpe3ZhciB0PWFkLG49UnAucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09YCR7Si5jc3NQcmVmaXh9LSR7dH1gLGV9LHt9KTtyZXR1cm4gJGQuZm9yRWFjaChmdW5jdGlvbihyKXsoZS5pbmNsdWRlcyhuW3JdKXx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB6cFtyXS5pbmNsdWRlcyhlKX0pKSYmKHQ9cil9KSx0fWZ1bmN0aW9uIHJtKGUpe3ZhciB0PShhcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30pLmZhbWlseSxuPXQ9PT12b2lkIDA/YWQ6dCxyPUJmW25dW2VdO2lmKG49PT1vZCYmIWUpcmV0dXJuYGZhZGA7dmFyIGk9SGZbbl1bZV18fEhmW25dW3JdLGE9ZSBpbiB3cC5zdHlsZXM/ZTpudWxsO3JldHVybiBpfHxhfHxudWxsfWZ1bmN0aW9uIGltKGUpe3ZhciB0PVtdLG49bnVsbDtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPXFwKEouY3NzUHJlZml4LGUpO3I/bj1yOmUmJnQucHVzaChlKX0pLHtpY29uTmFtZTpuLHJlc3Q6dH19ZnVuY3Rpb24gYW0oZSl7cmV0dXJuIGUuc29ydCgpLmZpbHRlcihmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4uaW5kZXhPZihlKT09PXR9KX12YXIgb209dmYuY29uY2F0KGFmKTtmdW5jdGlvbiBzbShlKXt2YXIgdD0oYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9KS5za2lwTG9va3VwcyxuPXQhPT12b2lkIDAmJnQscj1udWxsLGk9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG9tLmluY2x1ZGVzKGUpfSkpLGE9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW9tLmluY2x1ZGVzKGUpfSkpLG89UHUoaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSwhaWQuaW5jbHVkZXMoZSl9KSwxKVswXSxzPW89PT12b2lkIDA/bnVsbDpvLGM9bm0oaSksbD1xKHEoe30saW0oYSkpLHt9LHtwcmVmaXg6cm0ocyx7ZmFtaWx5OmN9KX0pO3JldHVybiBxKHEocSh7fSxsKSxkbSh7dmFsdWVzOmUsZmFtaWx5OmMsc3R5bGVzOklwLGNvbmZpZzpKLGNhbm9uaWNhbDpsLGdpdmVuUHJlZml4OnJ9KSksY20obixyLGwpKX1mdW5jdGlvbiBjbShlLHQsbil7dmFyIHI9bi5wcmVmaXgsaT1uLmljb25OYW1lO2lmKGV8fCFyfHwhaSlyZXR1cm57cHJlZml4OnIsaWNvbk5hbWU6aX07dmFyIGE9dD09PWBmYWA/UXAoaSk6e30sbz1acChyLGkpO3JldHVybiBpPWEuaWNvbk5hbWV8fG98fGkscj1hLnByZWZpeHx8cixyPT09YGZhcmAmJiFJcC5mYXImJklwLmZhcyYmIUouYXV0b0ZldGNoU3ZnJiYocj1gZmFzYCkse3ByZWZpeDpyLGljb25OYW1lOml9fXZhciBsbT0kZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1hZHx8ZSE9PW9kfSksdW09T2JqZWN0LmtleXMoX2YpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWFkfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhfZltlXSl9KS5mbGF0KCk7ZnVuY3Rpb24gZG0oZSl7dmFyIHQ9ZS52YWx1ZXMsbj1lLmZhbWlseSxyPWUuY2Fub25pY2FsLGk9ZS5naXZlblByZWZpeCxhPWk9PT12b2lkIDA/YGA6aSxvPWUuc3R5bGVzLHM9bz09PXZvaWQgMD97fTpvLGM9ZS5jb25maWcsbD1jPT09dm9pZCAwP3t9OmMsdT1uPT09b2QsZD10LmluY2x1ZGVzKGBmYS1kdW90b25lYCl8fHQuaW5jbHVkZXMoYGZhZGApLGY9bC5mYW1pbHlEZWZhdWx0PT09YGR1b3RvbmVgLHA9ci5wcmVmaXg9PT1gZmFkYHx8ci5wcmVmaXg9PT1gZmEtZHVvdG9uZWA7cmV0dXJuIXUmJihkfHxmfHxwKSYmKHIucHJlZml4PWBmYWRgKSwodC5pbmNsdWRlcyhgZmEtYnJhbmRzYCl8fHQuaW5jbHVkZXMoYGZhYmApKSYmKHIucHJlZml4PWBmYWJgKSwhci5wcmVmaXgmJmxtLmluY2x1ZGVzKG4pJiYoT2JqZWN0LmtleXMocykuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gdW0uaW5jbHVkZXMoZSl9KXx8bC5hdXRvRmV0Y2hTdmcpJiYoci5wcmVmaXg9bmYuZ2V0KG4pLmRlZmF1bHRTaG9ydFByZWZpeElkLHIuaWNvbk5hbWU9WnAoci5wcmVmaXgsci5pY29uTmFtZSl8fHIuaWNvbk5hbWUpLChyLnByZWZpeD09PWBmYWB8fGE9PT1gZmFgKSYmKHIucHJlZml4PWVtKCl8fGBmYXNgKSxyfXZhciBmbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtUdSh0aGlzLGUpLHRoaXMuZGVmaW5pdGlvbnM9e319cmV0dXJuIER1KGUsW3trZXk6YGFkZGAsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Wy4uLmFyZ3VtZW50c10ucmVkdWNlKHRoaXMuX3B1bGxEZWZpbml0aW9ucyx7fSk7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtlLmRlZmluaXRpb25zW25dPXEocSh7fSxlLmRlZmluaXRpb25zW25dfHx7fSksdFtuXSksRnAobix0W25dKTt2YXIgcj1XZlthZF1bbl07ciYmRnAocix0W25dKSxKcCgpfSl9fSx7a2V5OmByZXNldGAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRlZmluaXRpb25zPXt9fX0se2tleTpgX3B1bGxEZWZpbml0aW9uc2AsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnByZWZpeCYmdC5pY29uTmFtZSYmdC5pY29uP3swOnR9OnQ7cmV0dXJuIE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXt2YXIgcj1uW3RdLGk9ci5wcmVmaXgsYT1yLmljb25OYW1lLG89ci5pY29uLHM9b1syXTtlW2ldfHwoZVtpXT17fSkscy5sZW5ndGg+MCYmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT1gc3RyaW5nYCYmKGVbaV1bdF09byl9KSxlW2ldW2FdPW99KSxlfX1dKX0oKSxwbT1bXSxtbT17fSxobT17fSxnbT1PYmplY3Qua2V5cyhobSk7ZnVuY3Rpb24gX20oZSx0KXt2YXIgbj10Lm1peG91dHNUbztyZXR1cm4gcG09ZSxtbT17fSxPYmplY3Qua2V5cyhobSkuZm9yRWFjaChmdW5jdGlvbihlKXtnbS5pbmRleE9mKGUpPT09LTEmJmRlbGV0ZSBobVtlXX0pLHBtLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5taXhvdXQ/ZS5taXhvdXQoKTp7fTtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3R5cGVvZiB0W2VdPT1gZnVuY3Rpb25gJiYobltlXT10W2VdKSxSdSh0W2VdKT09PWBvYmplY3RgJiZPYmplY3Qua2V5cyh0W2VdKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bZV18fChuW2VdPXt9KSxuW2VdW3JdPXRbZV1bcl19KX0pLGUuaG9va3Mpe3ZhciByPWUuaG9va3MoKTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe21tW2VdfHwobW1bZV09W10pLG1tW2VdLnB1c2gocltlXSl9KX1lLnByb3ZpZGVzJiZlLnByb3ZpZGVzKGhtKX0pLG59ZnVuY3Rpb24gdm0oZSx0KXt2YXIgbj1bLi4uYXJndW1lbnRzXS5zbGljZSgyKTtyZXR1cm4obW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZS5hcHBseShudWxsLFt0XS5jb25jYXQobikpfSksdH1mdW5jdGlvbiB5bShlKXt2YXIgdD1bLi4uYXJndW1lbnRzXS5zbGljZSgxKTsobW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkobnVsbCx0KX0pfWZ1bmN0aW9uIGJtKCl7dmFyIGU9YXJndW1lbnRzWzBdLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBobVtlXT9obVtlXS5hcHBseShudWxsLHQpOnZvaWQgMH1mdW5jdGlvbiB4bShlKXtlLnByZWZpeD09PWBmYWAmJihlLnByZWZpeD1gZmFzYCk7dmFyIHQ9ZS5pY29uTmFtZSxuPWUucHJlZml4fHxlbSgpO2lmKHQpcmV0dXJuIHQ9WnAobix0KXx8dCxBcChTbS5kZWZpbml0aW9ucyxuLHQpfHxBcCh3cC5zdHlsZXMsbix0KX12YXIgU209bmV3IGZtLENtPXtub0F1dG86ZnVuY3Rpb24oKXtKLmF1dG9SZXBsYWNlU3ZnPSExLEoub2JzZXJ2ZU11dGF0aW9ucz0hMSx5bShgbm9BdXRvYCl9LGNvbmZpZzpKLGRvbTp7aTJzdmc6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307cmV0dXJuIFp1Pyh5bShgYmVmb3JlSTJzdmdgLGUpLGJtKGBwc2V1ZG9FbGVtZW50czJzdmdgLGUpLGJtKGBpMnN2Z2AsZSkpOlByb21pc2UucmVqZWN0KEVycm9yKGBPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLmApKX0sd2F0Y2g6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sdD1lLmF1dG9SZXBsYWNlU3ZnUm9vdDtKLmF1dG9SZXBsYWNlU3ZnPT09ITEmJihKLmF1dG9SZXBsYWNlU3ZnPSEwKSxKLm9ic2VydmVNdXRhdGlvbnM9ITAsT3AoZnVuY3Rpb24oKXt3bSh7YXV0b1JlcGxhY2VTdmdSb290OnR9KSx5bShgd2F0Y2hgLGUpfSl9fSxwYXJzZTp7aWNvbjpmdW5jdGlvbihlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtpZihSdShlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSlyZXR1cm57cHJlZml4OmUucHJlZml4LGljb25OYW1lOlpwKGUucHJlZml4LGUuaWNvbk5hbWUpfHxlLmljb25OYW1lfTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTIpe3ZhciB0PWVbMV0uaW5kZXhPZihgZmEtYCk9PT0wP2VbMV0uc2xpY2UoMyk6ZVsxXSxuPXJtKGVbMF0pO3JldHVybntwcmVmaXg6bixpY29uTmFtZTpacChuLHQpfHx0fX1pZih0eXBlb2YgZT09YHN0cmluZ2AmJihlLmluZGV4T2YoYCR7Si5jc3NQcmVmaXh9LWApPi0xfHxlLm1hdGNoKEtmKSkpe3ZhciByPXNtKGUuc3BsaXQoYCBgKSx7c2tpcExvb2t1cHM6ITB9KTtyZXR1cm57cHJlZml4OnIucHJlZml4fHxlbSgpLGljb25OYW1lOlpwKHIucHJlZml4LHIuaWNvbk5hbWUpfHxyLmljb25OYW1lfX1pZih0eXBlb2YgZT09YHN0cmluZ2Ape3ZhciBpPWVtKCk7cmV0dXJue3ByZWZpeDppLGljb25OYW1lOlpwKGksZSl8fGV9fX19LGxpYnJhcnk6U20sZmluZEljb25EZWZpbml0aW9uOnhtLHRvSHRtbDprcH0sd209ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9KS5hdXRvUmVwbGFjZVN2Z1Jvb3QsdD1lPT09dm9pZCAwP0p1OmU7KE9iamVjdC5rZXlzKHdwLnN0eWxlcykubGVuZ3RoPjB8fEouYXV0b0ZldGNoU3ZnKSYmWnUmJkouYXV0b1JlcGxhY2VTdmcmJkNtLmRvbS5pMnN2Zyh7bm9kZTp0fSl9O2Z1bmN0aW9uIFRtKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhYnN0cmFjdCIse2dldDp0fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImh0bWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hYnN0cmFjdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGtwKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZihadSl7dmFyIHQ9SnUuY3JlYXRlRWxlbWVudChgZGl2YCk7cmV0dXJuIHQuaW5uZXJIVE1MPWUuaHRtbCx0LmNoaWxkcmVufX19KSxlfWZ1bmN0aW9uIEVtKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLm1haW4scj1lLm1hc2ssaT1lLmF0dHJpYnV0ZXMsYT1lLnN0eWxlcyxvPWUudHJhbnNmb3JtO2lmKGhwKG8pJiZuLmZvdW5kJiYhci5mb3VuZCl7dmFyIHM9e3g6bi53aWR0aC9uLmhlaWdodC8yLHk6LjV9O2kuc3R5bGU9bXAocShxKHt9LGEpLHt9LHsidHJhbnNmb3JtLW9yaWdpbiI6YCR7cy54K28ueC8xNn1lbSAke3MueStvLnkvMTZ9ZW1gfSkpfXJldHVyblt7dGFnOmBzdmdgLGF0dHJpYnV0ZXM6aSxjaGlsZHJlbjp0fV19ZnVuY3Rpb24gRG0oZSl7dmFyIHQ9ZS5wcmVmaXgsbj1lLmljb25OYW1lLHI9ZS5jaGlsZHJlbixpPWUuYXR0cmlidXRlcyxhPWUuc3ltYm9sLG89YT09PSEwP2Ake3R9LSR7Si5jc3NQcmVmaXh9LSR7bn1gOmE7cmV0dXJuW3t0YWc6YHN2Z2AsYXR0cmlidXRlczp7c3R5bGU6YGRpc3BsYXk6IG5vbmU7YH0sY2hpbGRyZW46W3t0YWc6YHN5bWJvbGAsYXR0cmlidXRlczpxKHEoe30saSkse30se2lkOm99KSxjaGlsZHJlbjpyfV19XX1mdW5jdGlvbiBPbShlKXtyZXR1cm5bYGFyaWEtbGFiZWxgLGBhcmlhLWxhYmVsbGVkYnlgLGB0aXRsZWAsYHJvbGVgXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluIGV9KX1mdW5jdGlvbiBrbShlKXt2YXIgdD1lLmljb25zLG49dC5tYWluLHI9dC5tYXNrLGk9ZS5wcmVmaXgsYT1lLmljb25OYW1lLG89ZS50cmFuc2Zvcm0scz1lLnN5bWJvbCxjPWUubWFza0lkLGw9ZS5leHRyYSx1PWUud2F0Y2hhYmxlLGQ9dSE9PXZvaWQgMCYmdSxmPXIuZm91bmQ/cjpuLHA9Zi53aWR0aCxtPWYuaGVpZ2h0LGg9W0oucmVwbGFjZW1lbnRDbGFzcyxhP2Ake0ouY3NzUHJlZml4fS0ke2F9YDpgYF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBsLmNsYXNzZXMuaW5kZXhPZihlKT09PS0xfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09YGB8fCEhZX0pLmNvbmNhdChsLmNsYXNzZXMpLmpvaW4oYCBgKSxnPXtjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOnEocSh7fSxsLmF0dHJpYnV0ZXMpLHt9LHsiZGF0YS1wcmVmaXgiOmksImRhdGEtaWNvbiI6YSxjbGFzczpoLHJvbGU6bC5hdHRyaWJ1dGVzLnJvbGV8fGBpbWdgLHZpZXdCb3g6YDAgMCAke3B9ICR7bX1gfSl9OyFPbShsLmF0dHJpYnV0ZXMpJiYhbC5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdJiYoZy5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdPWB0cnVlYCksZCYmKGcuYXR0cmlidXRlc1tPZl09YGApO3ZhciBfPXEocSh7fSxnKSx7fSx7cHJlZml4OmksaWNvbk5hbWU6YSxtYWluOm4sbWFzazpyLG1hc2tJZDpjLHRyYW5zZm9ybTpvLHN5bWJvbDpzLHN0eWxlczpxKHt9LGwuc3R5bGVzKX0pLHY9ci5mb3VuZCYmbi5mb3VuZD9ibShgZ2VuZXJhdGVBYnN0cmFjdE1hc2tgLF8pfHx7Y2hpbGRyZW46W10sYXR0cmlidXRlczp7fX06Ym0oYGdlbmVyYXRlQWJzdHJhY3RJY29uYCxfKXx8e2NoaWxkcmVuOltdLGF0dHJpYnV0ZXM6e319LHk9di5jaGlsZHJlbixiPXYuYXR0cmlidXRlcztyZXR1cm4gXy5jaGlsZHJlbj15LF8uYXR0cmlidXRlcz1iLHM/RG0oXyk6RW0oXyl9ZnVuY3Rpb24gQW0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS53aWR0aCxyPWUuaGVpZ2h0LGk9ZS50cmFuc2Zvcm0sYT1lLmV4dHJhLG89ZS53YXRjaGFibGUscz1vIT09dm9pZCAwJiZvLGM9cShxKHt9LGEuYXR0cmlidXRlcykse30se2NsYXNzOmEuY2xhc3Nlcy5qb2luKGAgYCl9KTtzJiYoY1tPZl09YGApO3ZhciBsPXEoe30sYS5zdHlsZXMpO2hwKGkpJiYobC50cmFuc2Zvcm09X3Aoe3RyYW5zZm9ybTppLHN0YXJ0Q2VudGVyZWQ6ITAsd2lkdGg6bixoZWlnaHQ6cn0pLGxbYC13ZWJraXQtdHJhbnNmb3JtYF09bC50cmFuc2Zvcm0pO3ZhciB1PW1wKGwpO3UubGVuZ3RoPjAmJihjLnN0eWxlPXUpO3ZhciBkPVtdO3JldHVybiBkLnB1c2goe3RhZzpgc3BhbmAsYXR0cmlidXRlczpjLGNoaWxkcmVuOlt0XX0pLGR9ZnVuY3Rpb24gam0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS5leHRyYSxyPXEocSh7fSxuLmF0dHJpYnV0ZXMpLHt9LHtjbGFzczpuLmNsYXNzZXMuam9pbihgIGApfSksaT1tcChuLnN0eWxlcyk7aS5sZW5ndGg+MCYmKHIuc3R5bGU9aSk7dmFyIGE9W107cmV0dXJuIGEucHVzaCh7dGFnOmBzcGFuYCxhdHRyaWJ1dGVzOnIsY2hpbGRyZW46W3RdfSksYX12YXIgTW09d3Auc3R5bGVzO2Z1bmN0aW9uIE5tKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9UHUoZS5zbGljZSg0KSwxKVswXSxpPW51bGw7cmV0dXJuIGk9QXJyYXkuaXNBcnJheShyKT97dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5HUk9VUH1gfSxjaGlsZHJlbjpbe3RhZzpgcGF0aGAsYXR0cmlidXRlczp7Y2xhc3M6YCR7Si5jc3NQcmVmaXh9LSR7WGYuU0VDT05EQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMF19fSx7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5QUklNQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMV19fV19Ont0YWc6YHBhdGhgLGF0dHJpYnV0ZXM6e2ZpbGw6YGN1cnJlbnRDb2xvcmAsZDpyfX0se2ZvdW5kOiEwLHdpZHRoOnQsaGVpZ2h0Om4saWNvbjppfX12YXIgUG09e2ZvdW5kOiExLHdpZHRoOjUxMixoZWlnaHQ6NTEyfTtmdW5jdGlvbiBGbShlLHQpeyFMZiYmIUouc2hvd01pc3NpbmdJY29ucyYmZSYmY29uc29sZS5lcnJvcihgSWNvbiB3aXRoIG5hbWUgIiR7ZX0iIGFuZCBwcmVmaXggIiR7dH0iIGlzIG1pc3NpbmcuYCl9ZnVuY3Rpb24gSW0oZSx0KXt2YXIgbj10O3JldHVybiB0PT09YGZhYCYmSi5zdHlsZURlZmF1bHQhPT1udWxsJiYodD1lbSgpKSxuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe2lmKG49PT1gZmFgKXt2YXIgYT1RcChlKXx8e307ZT1hLmljb25OYW1lfHxlLHQ9YS5wcmVmaXh8fHR9aWYoZSYmdCYmTW1bdF0mJk1tW3RdW2VdKXt2YXIgbz1NbVt0XVtlXTtyZXR1cm4gcihObShvKSl9Rm0oZSx0KSxyKHEocSh7fSxQbSkse30se2ljb246Si5zaG93TWlzc2luZ0ljb25zJiZlJiZibShgbWlzc2luZ0ljb25BYnN0cmFjdGApfHx7fX0pKX0pfXZhciBMbT1mdW5jdGlvbigpe30sUm09Si5tZWFzdXJlUGVyZm9ybWFuY2UmJlh1JiZYdS5tYXJrJiZYdS5tZWFzdXJlP1h1OnttYXJrOkxtLG1lYXN1cmU6TG19LHptPWBGQSAiNy4zLjEiYCxCbT1mdW5jdGlvbihlKXtyZXR1cm4gUm0ubWFyayhgJHt6bX0gJHtlfSBiZWdpbnNgKSxmdW5jdGlvbigpe3JldHVybiBWbShlKX19LFZtPWZ1bmN0aW9uKGUpe1JtLm1hcmsoYCR7em19ICR7ZX0gZW5kc2ApLFJtLm1lYXN1cmUoYCR7em19ICR7ZX1gLGAke3ptfSAke2V9IGJlZ2luc2AsYCR7em19ICR7ZX0gZW5kc2ApfSxIbT17YmVnaW46Qm0sZW5kOlZtfSxVbT1mdW5jdGlvbigpe307ZnVuY3Rpb24gV20oZSl7cmV0dXJuIHR5cGVvZihlLmdldEF0dHJpYnV0ZT9lLmdldEF0dHJpYnV0ZShPZik6bnVsbCk9PWBzdHJpbmdgfWZ1bmN0aW9uIEdtKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlP2UuZ2V0QXR0cmlidXRlKGpmKTpudWxsLG49ZS5nZXRBdHRyaWJ1dGU/ZS5nZXRBdHRyaWJ1dGUoTWYpOm51bGw7cmV0dXJuIHQmJm59ZnVuY3Rpb24gS20oZSl7cmV0dXJuIGUmJmUuY2xhc3NMaXN0JiZlLmNsYXNzTGlzdC5jb250YWlucyYmZS5jbGFzc0xpc3QuY29udGFpbnMoSi5yZXBsYWNlbWVudENsYXNzKX1mdW5jdGlvbiBxbSgpe3JldHVybiBKLmF1dG9SZXBsYWNlU3ZnPT09ITA/UW0ucmVwbGFjZTpRbVtKLmF1dG9SZXBsYWNlU3ZnXXx8UW0ucmVwbGFjZX1mdW5jdGlvbiBKbShlKXtyZXR1cm4gSnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsZSl9ZnVuY3Rpb24gWW0oZSl7cmV0dXJuIEp1LmNyZWF0ZUVsZW1lbnQoZSl9ZnVuY3Rpb24gWG0oZSl7dmFyIHQ9KGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSkuY2VGbixuPXQ9PT12b2lkIDA/ZS50YWc9PT1gc3ZnYD9KbTpZbTp0O2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gSnUuY3JlYXRlVGV4dE5vZGUoZSk7dmFyIHI9bihlLnRhZyk7cmV0dXJuIE9iamVjdC5rZXlzKGUuYXR0cmlidXRlc3x8W10pLmZvckVhY2goZnVuY3Rpb24odCl7ci5zZXRBdHRyaWJ1dGUodCxlLmF0dHJpYnV0ZXNbdF0pfSksKGUuY2hpbGRyZW58fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuYXBwZW5kQ2hpbGQoWG0oZSx7Y2VGbjpufSkpfSkscn1mdW5jdGlvbiBabShlKXt2YXIgdD1gICR7ZS5vdXRlckhUTUx9IGA7cmV0dXJuIHQ9YCR7dH1Gb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tIGAsdH12YXIgUW09e3JlcGxhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZih0LnBhcmVudE5vZGUpe2lmKGVbMV0uZm9yRWFjaChmdW5jdGlvbihlKXt0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFhtKGUpLHQpfSksdC5nZXRBdHRyaWJ1dGUoT2YpPT09bnVsbCYmSi5rZWVwT3JpZ2luYWxTb3VyY2Upe3ZhciBuPUp1LmNyZWF0ZUNvbW1lbnQoWm0odCkpO3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobix0KX1lbHNlIHQucmVtb3ZlKCl9fSxuZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2lmKH5kcCh0KS5pbmRleE9mKEoucmVwbGFjZW1lbnRDbGFzcykpcmV0dXJuIFFtLnJlcGxhY2UoZSk7dmFyIHI9UmVnRXhwKGAke0ouY3NzUHJlZml4fS0uKmApO2lmKGRlbGV0ZSBuWzBdLmF0dHJpYnV0ZXMuaWQsblswXS5hdHRyaWJ1dGVzLmNsYXNzKXt2YXIgaT1uWzBdLmF0dHJpYnV0ZXMuY2xhc3Muc3BsaXQoYCBgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PUoucmVwbGFjZW1lbnRDbGFzc3x8dC5tYXRjaChyKT9lLnRvU3ZnLnB1c2godCk6ZS50b05vZGUucHVzaCh0KSxlfSx7dG9Ob2RlOltdLHRvU3ZnOltdfSk7blswXS5hdHRyaWJ1dGVzLmNsYXNzPWkudG9Tdmcuam9pbihgIGApLGkudG9Ob2RlLmxlbmd0aD09PTA/dC5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6dC5zZXRBdHRyaWJ1dGUoYGNsYXNzYCxpLnRvTm9kZS5qb2luKGAgYCkpfXZhciBhPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKTt0LnNldEF0dHJpYnV0ZShPZixgYCksdC5pbm5lckhUTUw9YX19O2Z1bmN0aW9uICRtKGUpe2UoKX1mdW5jdGlvbiBlaChlLHQpe3ZhciBuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3Q6VW07aWYoZS5sZW5ndGg9PT0wKW4oKTtlbHNle3ZhciByPSRtO0oubXV0YXRlQXBwcm9hY2g9PT1QZiYmKHI9cXUucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwkbSkscihmdW5jdGlvbigpe3ZhciB0PXFtKCkscj1IbS5iZWdpbihgbXV0YXRlYCk7ZS5tYXAodCkscigpLG4oKX0pfX12YXIgdGg9ITE7ZnVuY3Rpb24gbmgoKXt0aD0hMH1mdW5jdGlvbiByaCgpe3RoPSExfXZhciBpaD1udWxsO2Z1bmN0aW9uIGFoKGUpe2lmKFl1JiZKLm9ic2VydmVNdXRhdGlvbnMpe3ZhciB0PWUudHJlZUNhbGxiYWNrLG49dD09PXZvaWQgMD9VbTp0LHI9ZS5ub2RlQ2FsbGJhY2ssaT1yPT09dm9pZCAwP1VtOnIsYT1lLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2ssbz1hPT09dm9pZCAwP1VtOmEscz1lLm9ic2VydmVNdXRhdGlvbnNSb290LGM9cz09PXZvaWQgMD9KdTpzO2loPW5ldyBZdShmdW5jdGlvbihlKXtpZighdGgpe3ZhciB0PWVtKCk7dXAoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnR5cGU9PT1gY2hpbGRMaXN0YCYmZS5hZGRlZE5vZGVzLmxlbmd0aD4wJiYhV20oZS5hZGRlZE5vZGVzWzBdKSYmKEouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oZS50YXJnZXQpLG4oZS50YXJnZXQpKSxlLnR5cGU9PT1gYXR0cmlidXRlc2AmJmUudGFyZ2V0LnBhcmVudE5vZGUmJkouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oW2UudGFyZ2V0XSwhMCksZS50eXBlPT09YGF0dHJpYnV0ZXNgJiZXbShlLnRhcmdldCkmJn5ZZi5pbmRleE9mKGUuYXR0cmlidXRlTmFtZSkpe2lmKGUuYXR0cmlidXRlTmFtZT09PWBjbGFzc2AmJkdtKGUudGFyZ2V0KSl7dmFyIHI9c20oZHAoZS50YXJnZXQpKSxhPXIucHJlZml4LHM9ci5pY29uTmFtZTtlLnRhcmdldC5zZXRBdHRyaWJ1dGUoamYsYXx8dCkscyYmZS50YXJnZXQuc2V0QXR0cmlidXRlKE1mLHMpfWVsc2UgS20oZS50YXJnZXQpJiZpKGUudGFyZ2V0KX19KX19KSxadSYmaWgub2JzZXJ2ZShjLHtjaGlsZExpc3Q6ITAsYXR0cmlidXRlczohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19ZnVuY3Rpb24gb2goKXtpaCYmaWguZGlzY29ubmVjdCgpfWZ1bmN0aW9uIHNoKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKGBzdHlsZWApLG49W107cmV0dXJuIHQmJihuPXQuc3BsaXQoYDtgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwbGl0KGA6YCkscj1uWzBdLGk9bi5zbGljZSgxKTtyZXR1cm4gciYmaS5sZW5ndGg+MCYmKGVbcl09aS5qb2luKGA6YCkudHJpbSgpKSxlfSx7fSkpLG59ZnVuY3Rpb24gY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoYGRhdGEtcHJlZml4YCksbj1lLmdldEF0dHJpYnV0ZShgZGF0YS1pY29uYCkscj1lLmlubmVyVGV4dD09PXZvaWQgMD9gYDplLmlubmVyVGV4dC50cmltKCksaT1zbShkcChlKSk7cmV0dXJuIGkucHJlZml4fHw9ZW0oKSx0JiZuJiYoaS5wcmVmaXg9dCxpLmljb25OYW1lPW4pLGkuaWNvbk5hbWUmJmkucHJlZml4P2k6KGkucHJlZml4JiZyLmxlbmd0aD4wJiYoaS5pY29uTmFtZT1YcChpLnByZWZpeCxlLmlubmVyVGV4dCl8fFlwKGkucHJlZml4LE5wKGUuaW5uZXJUZXh0KSkpLCFpLmljb25OYW1lJiZKLmF1dG9GZXRjaFN2ZyYmZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmKGkuaWNvbk5hbWU9ZS5maXJzdENoaWxkLmRhdGEpLGkpfWZ1bmN0aW9uIGxoKGUpe3JldHVybiB1cChlLmF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWUhPT1gY2xhc3NgJiZlLm5hbWUhPT1gc3R5bGVgJiYoZVt0Lm5hbWVdPXQudmFsdWUpLGV9LHt9KX1mdW5jdGlvbiB1aCgpe3JldHVybntpY29uTmFtZTpudWxsLHByZWZpeDpudWxsLHRyYW5zZm9ybTpvcCxzeW1ib2w6ITEsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxleHRyYTp7Y2xhc3NlczpbXSxzdHlsZXM6e30sYXR0cmlidXRlczp7fX19fWZ1bmN0aW9uIGRoKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7c3R5bGVQYXJzZXI6ITB9LG49Y2goZSkscj1uLmljb25OYW1lLGk9bi5wcmVmaXgsYT1uLnJlc3Qsbz1saChlKSxzPXZtKGBwYXJzZU5vZGVBdHRyaWJ1dGVzYCx7fSxlKTtyZXR1cm4gcSh7aWNvbk5hbWU6cixwcmVmaXg6aSx0cmFuc2Zvcm06b3AsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxzeW1ib2w6ITEsZXh0cmE6e2NsYXNzZXM6YSxzdHlsZXM6dC5zdHlsZVBhcnNlcj9zaChlKTpbXSxhdHRyaWJ1dGVzOm99fSxzKX12YXIgZmg9d3Auc3R5bGVzO2Z1bmN0aW9uIHBoKGUpe3ZhciB0PUouYXV0b1JlcGxhY2VTdmc9PT1gbmVzdGA/ZGgoZSx7c3R5bGVQYXJzZXI6ITF9KTpkaChlKTtyZXR1cm5+dC5leHRyYS5jbGFzc2VzLmluZGV4T2YocWYpP2JtKGBnZW5lcmF0ZUxheWVyc1RleHRgLGUsdCk6Ym0oYGdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbmAsZSx0KX1mdW5jdGlvbiBtaCgpe3JldHVybltdLmNvbmNhdChGdShhZiksRnUodmYpKX1mdW5jdGlvbiBoaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZighWnUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBuPUp1LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Qscj1mdW5jdGlvbihlKXtyZXR1cm4gbi5hZGQoYCR7TmZ9LSR7ZX1gKX0saT1mdW5jdGlvbihlKXtyZXR1cm4gbi5yZW1vdmUoYCR7TmZ9LSR7ZX1gKX0sYT1KLmF1dG9GZXRjaFN2Zz9taCgpOmlkLmNvbmNhdChPYmplY3Qua2V5cyhmaCkpO2EuaW5jbHVkZXMoYGZhYCl8fGEucHVzaChgZmFgKTt2YXIgbz1bYC4ke3FmfTpub3QoWyR7T2Z9XSlgXS5jb25jYXQoYS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYC4ke2V9Om5vdChbJHtPZn1dKWB9KSkuam9pbihgLCBgKTtpZihvLmxlbmd0aD09PTApcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBzPVtdO3RyeXtzPXVwKGUucXVlcnlTZWxlY3RvckFsbChvKSl9Y2F0Y2h7fWlmKHMubGVuZ3RoPjApcihgcGVuZGluZ2ApLGkoYGNvbXBsZXRlYCk7ZWxzZSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGM9SG0uYmVnaW4oYG9uVHJlZWApLGw9cy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt0cnl7dmFyIG49cGgodCk7biYmZS5wdXNoKG4pfWNhdGNoKGUpe0xmfHxlLm5hbWU9PT1gTWlzc2luZ0ljb25gJiZjb25zb2xlLmVycm9yKGUpfXJldHVybiBlfSxbXSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7UHJvbWlzZS5hbGwobCkudGhlbihmdW5jdGlvbihuKXtlaChuLGZ1bmN0aW9uKCl7cihgYWN0aXZlYCkscihgY29tcGxldGVgKSxpKGBwZW5kaW5nYCksdHlwZW9mIHQ9PWBmdW5jdGlvbmAmJnQoKSxjKCksZSgpfSl9KS5jYXRjaChmdW5jdGlvbihlKXtjKCksbihlKX0pfSl9ZnVuY3Rpb24gZ2goZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7cGgoZSkudGhlbihmdW5jdGlvbihlKXtlJiZlaChbZV0sdCl9KX1mdW5jdGlvbiBfaChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHI9KHR8fHt9KS5pY29uP3Q6eG0odHx8e30pLGk9bi5tYXNrO3JldHVybiBpJiY9KGl8fHt9KS5pY29uP2k6eG0oaXx8e30pLGUocixxKHEoe30sbikse30se21hc2s6aX0pKX19dmFyIHZoPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5zeW1ib2wsYT1pIT09dm9pZCAwJiZpLG89dC5tYXNrLHM9bz09PXZvaWQgMD9udWxsOm8sYz10Lm1hc2tJZCxsPWM9PT12b2lkIDA/bnVsbDpjLHU9dC5jbGFzc2VzLGQ9dT09PXZvaWQgMD9bXTp1LGY9dC5hdHRyaWJ1dGVzLHA9Zj09PXZvaWQgMD97fTpmLG09dC5zdHlsZXMsaD1tPT09dm9pZCAwP3t9Om07aWYoZSl7dmFyIGc9ZS5wcmVmaXgsXz1lLmljb25OYW1lLHY9ZS5pY29uO3JldHVybiBUbShxKHt0eXBlOmBpY29uYH0sZSksZnVuY3Rpb24oKXtyZXR1cm4geW0oYGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbmAse2ljb25EZWZpbml0aW9uOmUscGFyYW1zOnR9KSxrbSh7aWNvbnM6e21haW46Tm0odiksbWFzazpzP05tKHMuaWNvbik6e2ZvdW5kOiExLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsaWNvbjp7fX19LHByZWZpeDpnLGljb25OYW1lOl8sdHJhbnNmb3JtOnEocSh7fSxvcCksciksc3ltYm9sOmEsbWFza0lkOmwsZXh0cmE6e2F0dHJpYnV0ZXM6cCxzdHlsZXM6aCxjbGFzc2VzOmR9fSl9KX19LHloPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57aWNvbjpfaCh2aCl9fSxob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRyZWVDYWxsYmFjaz1oaCxlLm5vZGVDYWxsYmFjaz1naCxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuaTJzdmc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlLG49dD09PXZvaWQgMD9KdTp0LHI9ZS5jYWxsYmFjaztyZXR1cm4gaGgobixyPT09dm9pZCAwP2Z1bmN0aW9uKCl7fTpyKX0sZS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmljb25OYW1lLHI9dC5wcmVmaXgsaT10LnRyYW5zZm9ybSxhPXQuc3ltYm9sLG89dC5tYXNrLHM9dC5tYXNrSWQsYz10LmV4dHJhO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGwpe1Byb21pc2UuYWxsKFtJbShuLHIpLG8uaWNvbk5hbWU/SW0oby5pY29uTmFtZSxvLnByZWZpeCk6UHJvbWlzZS5yZXNvbHZlKHtmb3VuZDohMSx3aWR0aDo1MTIsaGVpZ2h0OjUxMixpY29uOnt9fSldKS50aGVuKGZ1bmN0aW9uKG8pe3ZhciBsPVB1KG8sMiksdT1sWzBdLGQ9bFsxXTt0KFtlLGttKHtpY29uczp7bWFpbjp1LG1hc2s6ZH0scHJlZml4OnIsaWNvbk5hbWU6bix0cmFuc2Zvcm06aSxzeW1ib2w6YSxtYXNrSWQ6cyxleHRyYTpjLHdhdGNoYWJsZTohMH0pXSl9KS5jYXRjaChsKX0pfSxlLmdlbmVyYXRlQWJzdHJhY3RJY29uPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLnRyYW5zZm9ybSxhPWUuc3R5bGVzLG89bXAoYSk7by5sZW5ndGg+MCYmKG4uc3R5bGU9byk7dmFyIHM7cmV0dXJuIGhwKGkpJiYocz1ibShgZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nYCx7bWFpbjpyLHRyYW5zZm9ybTppLGNvbnRhaW5lcldpZHRoOnIud2lkdGgsaWNvbldpZHRoOnIud2lkdGh9KSksdC5wdXNoKHN8fHIuaWNvbikse2NoaWxkcmVuOnQsYXR0cmlidXRlczpufX19fSxiaD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2xheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQuY2xhc3NlcyxyPW49PT12b2lkIDA/W106bjtyZXR1cm4gVG0oe3R5cGU6YGxheWVyYH0sZnVuY3Rpb24oKXt5bShgYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uYCx7YXNzZW1ibGVyOmUscGFyYW1zOnR9KTt2YXIgbj1bXTtyZXR1cm4gZShmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpP2UubWFwKGZ1bmN0aW9uKGUpe249bi5jb25jYXQoZS5hYnN0cmFjdCl9KTpuPW4uY29uY2F0KGUuYWJzdHJhY3QpfSksW3t0YWc6YHNwYW5gLGF0dHJpYnV0ZXM6e2NsYXNzOltgJHtKLmNzc1ByZWZpeH0tbGF5ZXJzYF0uY29uY2F0KEZ1KHIpKS5qb2luKGAgYCl9LGNoaWxkcmVuOm59XX0pfX19fSx4aD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2NvdW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LG49dC50aXRsZSxyPW49PT12b2lkIDA/bnVsbDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmBjb3VudGVyYCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxqbSh7Y29udGVudDplLnRvU3RyaW5nKCksdGl0bGU6cixleHRyYTp7YXR0cmlidXRlczpzLHN0eWxlczpsLGNsYXNzZXM6W2Ake0ouY3NzUHJlZml4fS1sYXllcnMtY291bnRlcmBdLmNvbmNhdChGdShhKSl9fSl9KX19fX0sU2g9e21peG91dDpmdW5jdGlvbigpe3JldHVybnt0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmB0ZXh0YCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxBbSh7Y29udGVudDplLHRyYW5zZm9ybTpxKHEoe30sb3ApLHIpLGV4dHJhOnthdHRyaWJ1dGVzOnMsc3R5bGVzOmwsY2xhc3NlczpbYCR7Si5jc3NQcmVmaXh9LWxheWVycy10ZXh0YF0uY29uY2F0KEZ1KGEpKX19KX0pfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVMYXllcnNUZXh0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC50cmFuc2Zvcm0scj10LmV4dHJhLGk9bnVsbCxhPW51bGw7aWYoUXUpe3ZhciBvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZSkuZm9udFNpemUsMTApLHM9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpPXMud2lkdGgvbyxhPXMuaGVpZ2h0L299cmV0dXJuIFByb21pc2UucmVzb2x2ZShbZSxBbSh7Y29udGVudDplLmlubmVySFRNTCx3aWR0aDppLGhlaWdodDphLHRyYW5zZm9ybTpuLGV4dHJhOnIsd2F0Y2hhYmxlOiEwfSldKX19fSxDaD1SZWdFeHAoYCJgLGB1Z2ApLHdoPVsxMTA1OTIwLDExMTIzMTldLFRoPXEocShxKHEoe30se0ZvbnRBd2Vzb21lOntub3JtYWw6YGZhc2AsNDAwOmBmYXNgfX0pLHRmKSxDZiksbGYpLEVoPU9iamVjdC5rZXlzKFRoKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0LnRvTG93ZXJDYXNlKCldPVRoW3RdLGV9LHt9KSxEaD1PYmplY3Qua2V5cyhFaCkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49RWhbdF07cmV0dXJuIGVbdF09bls5MDBdfHxGdShPYmplY3QuZW50cmllcyhuKSlbMF1bMV0sZX0se30pO2Z1bmN0aW9uIE9oKGUpe3JldHVybiBOcChGdShlLnJlcGxhY2UoQ2gsYGApKVswXXx8YGApfWZ1bmN0aW9uIGtoKGUpe3ZhciB0PWUuZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mZWF0dXJlLXNldHRpbmdzYCkuaW5jbHVkZXMoYHNzMDFgKSxuPWUuZ2V0UHJvcGVydHlWYWx1ZShgY29udGVudGApLnJlcGxhY2UoQ2gsYGApLHI9bi5jb2RlUG9pbnRBdCgwKSxpPXI+PXdoWzBdJiZyPD13aFsxXSxhPW4ubGVuZ3RoPT09MiYmblswXT09PW5bMV07cmV0dXJuIGl8fGF8fHR9ZnVuY3Rpb24gQWgoZSx0KXt2YXIgbj1lLnJlcGxhY2UoL15bJyJdfFsnIl0kL2csYGApLnRvTG93ZXJDYXNlKCkscj1wYXJzZUludCh0KSxpPWlzTmFOKHIpP2Bub3JtYWxgOnI7cmV0dXJuKEVoW25dfHx7fSlbaV18fERoW25dfWZ1bmN0aW9uIGpoKGUsdCl7dmFyIG49YCR7QWZ9JHt0LnJlcGxhY2UoYDpgLGAtYCl9YDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixpKXtpZihlLmdldEF0dHJpYnV0ZShuKSE9PW51bGwpcmV0dXJuIHIoKTt2YXIgYT11cChlLmNoaWxkcmVuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKGtmKT09PXR9KVswXSxvPXF1LmdldENvbXB1dGVkU3R5bGUoZSx0KSxzPW8uZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mYW1pbHlgKSxjPXMubWF0Y2goSmYpLGw9by5nZXRQcm9wZXJ0eVZhbHVlKGBmb250LXdlaWdodGApLHU9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCk7aWYoYSYmIWMpcmV0dXJuIGUucmVtb3ZlQ2hpbGQoYSkscigpO2lmKGMmJnUhPT1gbm9uZWAmJnUhPT1gYCl7dmFyIGQ9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCksZj1BaChzLGwpLHA9T2goZCksbT1jWzBdLnN0YXJ0c1dpdGgoYEZvbnRBd2Vzb21lYCksaD1raChvKSxnPVlwKGYscCksXz1nO2lmKG0pe3ZhciB2PSRwKHApO3YuaWNvbk5hbWUmJnYucHJlZml4JiYoZz12Lmljb25OYW1lLGY9di5wcmVmaXgpfWlmKGcmJiFoJiYoIWF8fGEuZ2V0QXR0cmlidXRlKGpmKSE9PWZ8fGEuZ2V0QXR0cmlidXRlKE1mKSE9PV8pKXtlLnNldEF0dHJpYnV0ZShuLF8pLGEmJmUucmVtb3ZlQ2hpbGQoYSk7dmFyIHk9dWgoKSxiPXkuZXh0cmE7Yi5hdHRyaWJ1dGVzW2tmXT10LEltKGcsZikudGhlbihmdW5jdGlvbihpKXt2YXIgYT1rbShxKHEoe30seSkse30se2ljb25zOnttYWluOmksbWFzazp0bSgpfSxwcmVmaXg6ZixpY29uTmFtZTpfLGV4dHJhOmIsd2F0Y2hhYmxlOiEwfSkpLG89SnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsYHN2Z2ApO3Q9PT1gOjpiZWZvcmVgP2UuaW5zZXJ0QmVmb3JlKG8sZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKG8pLG8ub3V0ZXJIVE1MPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKSxlLnJlbW92ZUF0dHJpYnV0ZShuKSxyKCl9KS5jYXRjaChpKX1lbHNlIHIoKX1lbHNlIHIoKX0pfWZ1bmN0aW9uIE1oKGUpe3JldHVybiBQcm9taXNlLmFsbChbamgoZSxgOjpiZWZvcmVgKSxqaChlLGA6OmFmdGVyYCldKX1mdW5jdGlvbiBOaChlKXtyZXR1cm4gZS5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmIX5GZi5pbmRleE9mKGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSYmIWUuZ2V0QXR0cmlidXRlKGtmKSYmKCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS50YWdOYW1lIT09YHN2Z2ApfXZhciBQaD1mdW5jdGlvbihlKXtyZXR1cm4hIWUmJklmLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5jbHVkZXModCl9KX0sRmg9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9bmV3IFNldCxuPWUuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSk7bj1uLmZsYXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5jbHVkZXMoYChgKT9lOmUuc3BsaXQoYCxgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSl9KTt2YXIgcj1PdShuKSxpO3RyeXtmb3Ioci5zKCk7IShpPXIubigpKS5kb25lOyl7dmFyIGE9aS52YWx1ZTtpZihQaChhKSl7dmFyIG89SWYucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSh0LGBgKX0sYSk7byE9PWBgJiZvIT09YCpgJiZ0LmFkZChvKX19fWNhdGNoKGUpe3IuZShlKX1maW5hbGx5e3IuZigpfXJldHVybiB0fTtmdW5jdGlvbiBJaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMCYmYXJndW1lbnRzWzFdO2lmKFp1KXt2YXIgbjtpZih0KW49ZTtlbHNlIGlmKEouc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiluPWUucXVlcnlTZWxlY3RvckFsbChgKmApO2Vsc2V7dmFyIHI9bmV3IFNldCxpPU91KGRvY3VtZW50LnN0eWxlU2hlZXRzKSxhO3RyeXtmb3IoaS5zKCk7IShhPWkubigpKS5kb25lOyl7dmFyIG89YS52YWx1ZTt0cnl7dmFyIHM9T3Uoby5jc3NSdWxlcyksYzt0cnl7Zm9yKHMucygpOyEoYz1zLm4oKSkuZG9uZTspe3ZhciBsPWMudmFsdWUsdT1PdShGaChsLnNlbGVjdG9yVGV4dCkpLGQ7dHJ5e2Zvcih1LnMoKTshKGQ9dS5uKCkpLmRvbmU7KXt2YXIgZj1kLnZhbHVlO3IuYWRkKGYpfX1jYXRjaChlKXt1LmUoZSl9ZmluYWxseXt1LmYoKX19fWNhdGNoKGUpe3MuZShlKX1maW5hbGx5e3MuZigpfX1jYXRjaChlKXtKLnNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MmJmNvbnNvbGUud2FybihgRm9udCBBd2Vzb21lOiBjYW5ub3QgcGFyc2Ugc3R5bGVzaGVldDogJHtvLmhyZWZ9ICgke2UubWVzc2FnZX0pCklmIGl0IGRlY2xhcmVzIGFueSBGb250IEF3ZXNvbWUgQ1NTIHBzZXVkby1lbGVtZW50cywgdGhleSB3aWxsIG5vdCBiZSByZW5kZXJlZCBhcyBTVkcgaWNvbnMuIEFkZCBjcm9zc29yaWdpbj0iYW5vbnltb3VzIiB0byB0aGUgPGxpbms+LCBlbmFibGUgc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiBmb3Igc2xvd2VyIGJ1dCBtb3JlIHRob3JvdWdoIERPTSBwYXJzaW5nLCBvciBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzIHRvIGZhbHNlLmApfX19Y2F0Y2goZSl7aS5lKGUpfWZpbmFsbHl7aS5mKCl9aWYoIXIuc2l6ZSlyZXR1cm47dmFyIHA9QXJyYXkuZnJvbShyKS5qb2luKGAsIGApO3RyeXtuPWUucXVlcnlTZWxlY3RvckFsbChwKX1jYXRjaHt9fXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe3ZhciByPXVwKG4pLmZpbHRlcihOaCkubWFwKE1oKSxpPUhtLmJlZ2luKGBzZWFyY2hQc2V1ZG9FbGVtZW50c2ApO25oKCksUHJvbWlzZS5hbGwocikudGhlbihmdW5jdGlvbigpe2koKSxyaCgpLGUoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aSgpLHJoKCksdCgpfSl9KX19dmFyIExoPXtob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2s9SWgsZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLnBzZXVkb0VsZW1lbnRzMnN2Zz1mdW5jdGlvbihlKXt2YXIgdD1lLm5vZGUsbj10PT09dm9pZCAwP0p1OnQ7Si5zZWFyY2hQc2V1ZG9FbGVtZW50cyYmSWgobil9fX0sUmg9ITEsemg9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e3Vud2F0Y2g6ZnVuY3Rpb24oKXtuaCgpLFJoPSEwfX19fSxob29rczpmdW5jdGlvbigpe3JldHVybntib290c3RyYXA6ZnVuY3Rpb24oKXthaCh2bShgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrc2Ase30pKX0sbm9BdXRvOmZ1bmN0aW9uKCl7b2goKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vYnNlcnZlTXV0YXRpb25zUm9vdDtSaD9yaCgpOmFoKHZtKGBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzYCx7b2JzZXJ2ZU11dGF0aW9uc1Jvb3Q6dH0pKX19fX0sQmg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5zcGxpdChgIGApLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQudG9Mb3dlckNhc2UoKS5zcGxpdChgLWApLHI9blswXSxpPW4uc2xpY2UoMSkuam9pbihgLWApO2lmKHImJmk9PT1gaGApcmV0dXJuIGUuZmxpcFg9ITAsZTtpZihyJiZpPT09YHZgKXJldHVybiBlLmZsaXBZPSEwLGU7aWYoaT1wYXJzZUZsb2F0KGkpLGlzTmFOKGkpKXJldHVybiBlO3N3aXRjaChyKXtjYXNlYGdyb3dgOmUuc2l6ZSs9aTticmVhaztjYXNlYHNocmlua2A6ZS5zaXplLT1pO2JyZWFrO2Nhc2VgbGVmdGA6ZS54LT1pO2JyZWFrO2Nhc2VgcmlnaHRgOmUueCs9aTticmVhaztjYXNlYHVwYDplLnktPWk7YnJlYWs7Y2FzZWBkb3duYDplLnkrPWk7YnJlYWs7Y2FzZWByb3RhdGVgOmUucm90YXRlKz1pfXJldHVybiBlfSx7c2l6ZToxNix4OjAseTowLGZsaXBYOiExLGZsaXBZOiExLHJvdGF0ZTowfSl9LFZoPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGFyc2U6e3RyYW5zZm9ybTpmdW5jdGlvbihlKXtyZXR1cm4gQmgoZSl9fX19LGhvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS10cmFuc2Zvcm1gKTtyZXR1cm4gbiYmKGUudHJhbnNmb3JtPUJoKG4pKSxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWFpbixuPWUudHJhbnNmb3JtLHI9ZS5jb250YWluZXJXaWR0aCxpPWUuaWNvbldpZHRoLGE9e291dGVyOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke3IvMn0gMjU2KWB9LGlubmVyOnt0cmFuc2Zvcm06YCR7YHRyYW5zbGF0ZSgke24ueCozMn0sICR7bi55KjMyfSkgYH0gJHtgc2NhbGUoJHtuLnNpemUvMTYqKG4uZmxpcFg/LTE6MSl9LCAke24uc2l6ZS8xNioobi5mbGlwWT8tMToxKX0pIGB9ICR7YHJvdGF0ZSgke24ucm90YXRlfSAwIDApYH1gfSxwYXRoOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke2kvMiotMX0gLTI1NilgfX07cmV0dXJue3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGEub3V0ZXIpLGNoaWxkcmVuOlt7dGFnOmBnYCxhdHRyaWJ1dGVzOnEoe30sYS5pbm5lciksY2hpbGRyZW46W3t0YWc6dC5pY29uLnRhZyxjaGlsZHJlbjp0Lmljb24uY2hpbGRyZW4sYXR0cmlidXRlczpxKHEoe30sdC5pY29uLmF0dHJpYnV0ZXMpLGEucGF0aCl9XX1dfX19fSxIaD17eDowLHk6MCx3aWR0aDpgMTAwJWAsaGVpZ2h0OmAxMDAlYH07ZnVuY3Rpb24gVWgoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBlLmF0dHJpYnV0ZXMmJihlLmF0dHJpYnV0ZXMuZmlsbHx8dCkmJihlLmF0dHJpYnV0ZXMuZmlsbD1gYmxhY2tgKSxlfWZ1bmN0aW9uIFdoKGUpe3JldHVybiBlLnRhZz09PWBnYD9lLmNoaWxkcmVuOltlXX1fbShbU3AseWgsYmgseGgsU2gsTGgsemgsVmgse2hvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrYCkscj1uP3NtKG4uc3BsaXQoYCBgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSkpOnRtKCk7cmV0dXJuIHIucHJlZml4fHw9ZW0oKSxlLm1hc2s9cixlLm1hc2tJZD10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrLWlkYCksZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLmdlbmVyYXRlQWJzdHJhY3RNYXNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLm1hc2ssYT1lLm1hc2tJZCxvPWUudHJhbnNmb3JtLHM9ci53aWR0aCxjPXIuaWNvbixsPWkud2lkdGgsdT1pLmljb24sZD1ncCh7dHJhbnNmb3JtOm8sY29udGFpbmVyV2lkdGg6bCxpY29uV2lkdGg6c30pLGY9e3RhZzpgcmVjdGAsYXR0cmlidXRlczpxKHEoe30sSGgpLHt9LHtmaWxsOmB3aGl0ZWB9KX0scD1jLmNoaWxkcmVuP3tjaGlsZHJlbjpjLmNoaWxkcmVuLm1hcChVaCl9Ont9LG09e3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGQuaW5uZXIpLGNoaWxkcmVuOltVaChxKHt0YWc6Yy50YWcsYXR0cmlidXRlczpxKHEoe30sYy5hdHRyaWJ1dGVzKSxkLnBhdGgpfSxwKSldfSxoPXt0YWc6YGdgLGF0dHJpYnV0ZXM6cSh7fSxkLm91dGVyKSxjaGlsZHJlbjpbbV19LGc9YG1hc2stJHthfHxscCgpfWAsXz1gY2xpcC0ke2F8fGxwKCl9YCx2PXt0YWc6YG1hc2tgLGF0dHJpYnV0ZXM6cShxKHt9LEhoKSx7fSx7aWQ6ZyxtYXNrVW5pdHM6YHVzZXJTcGFjZU9uVXNlYCxtYXNrQ29udGVudFVuaXRzOmB1c2VyU3BhY2VPblVzZWB9KSxjaGlsZHJlbjpbZixoXX0seT17dGFnOmBkZWZzYCxjaGlsZHJlbjpbe3RhZzpgY2xpcFBhdGhgLGF0dHJpYnV0ZXM6e2lkOl99LGNoaWxkcmVuOldoKHUpfSx2XX07cmV0dXJuIHQucHVzaCh5LHt0YWc6YHJlY3RgLGF0dHJpYnV0ZXM6cSh7ZmlsbDpgY3VycmVudENvbG9yYCwiY2xpcC1wYXRoIjpgdXJsKCMke199KWAsbWFzazpgdXJsKCMke2d9KWB9LEhoKX0pLHtjaGlsZHJlbjp0LGF0dHJpYnV0ZXM6bn19fX0se3Byb3ZpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PSExO3F1Lm1hdGNoTWVkaWEmJih0PXF1Lm1hdGNoTWVkaWEoYChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpYCkubWF0Y2hlcyksZS5taXNzaW5nSWNvbkFic3RyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9W10sbj17ZmlsbDpgY3VycmVudENvbG9yYH0scj17YXR0cmlidXRlVHlwZTpgWE1MYCxyZXBlYXRDb3VudDpgaW5kZWZpbml0ZWAsZHVyOmAyc2B9O2UucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7ZDpgTTE1Ni41LDQ0Ny43bC0xMi42LDI5LjVjLTE4LjctOS41LTM1LjktMjEuMi01MS41LTM0LjlsMjIuNy0yMi43QzEyNy42LDQzMC41LDE0MS41LDQ0MCwxNTYuNSw0NDcuN3ogTTQwLjYsMjcySDguNSBjMS40LDIxLjIsNS40LDQxLjcsMTEuNyw2MS4xTDUwLDMyMS4yQzQ1LjEsMzA1LjUsNDEuOCwyODksNDAuNiwyNzJ6IE00MC42LDI0MGMxLjQtMTguOCw1LjItMzcsMTEuMS01NC4xbC0yOS41LTEyLjYgQzE0LjcsMTk0LjMsMTAsMjE2LjcsOC41LDI0MEg0MC42eiBNNjQuMywxNTYuNWM3LjgtMTQuOSwxNy4yLTI4LjgsMjguMS00MS41TDY5LjcsOTIuM2MtMTMuNywxNS42LTI1LjUsMzIuOC0zNC45LDUxLjUgTDY0LjMsMTU2LjV6IE0zOTcsNDE5LjZjLTEzLjksMTItMjkuNCwyMi4zLTQ2LjEsMzAuNGwxMS45LDI5LjhjMjAuNy05LjksMzkuOC0yMi42LDU2LjktMzcuNkwzOTcsNDE5LjZ6IE0xMTUsOTIuNCBjMTMuOS0xMiwyOS40LTIyLjMsNDYuMS0zMC40bC0xMS45LTI5LjhjLTIwLjcsOS45LTM5LjgsMjIuNi01Ni44LDM3LjZMMTE1LDkyLjR6IE00NDcuNywzNTUuNWMtNy44LDE0LjktMTcuMiwyOC44LTI4LjEsNDEuNSBsMjIuNywyMi43YzEzLjctMTUuNiwyNS41LTMyLjksMzQuOS01MS41TDQ0Ny43LDM1NS41eiBNNDcxLjQsMjcyYy0xLjQsMTguOC01LjIsMzctMTEuMSw1NC4xbDI5LjUsMTIuNiBjNy41LTIxLjEsMTIuMi00My41LDEzLjYtNjYuOEg0NzEuNHogTTMyMS4yLDQ2MmMtMTUuNyw1LTMyLjIsOC4yLTQ5LjIsOS40djMyLjFjMjEuMi0xLjQsNDEuNy01LjQsNjEuMS0xMS43TDMyMS4yLDQ2MnogTTI0MCw0NzEuNGMtMTguOC0xLjQtMzctNS4yLTU0LjEtMTEuMWwtMTIuNiwyOS41YzIxLjEsNy41LDQzLjUsMTIuMiw2Ni44LDEzLjZWNDcxLjR6IE00NjIsMTkwLjhjNSwxNS43LDguMiwzMi4yLDkuNCw0OS4yaDMyLjEgYy0xLjQtMjEuMi01LjQtNDEuNy0xMS43LTYxLjFMNDYyLDE5MC44eiBNOTIuNCwzOTdjLTEyLTEzLjktMjIuMy0yOS40LTMwLjQtNDYuMWwtMjkuOCwxMS45YzkuOSwyMC43LDIyLjYsMzkuOCwzNy42LDU2LjkgTDkyLjQsMzk3eiBNMjcyLDQwLjZjMTguOCwxLjQsMzYuOSw1LjIsNTQuMSwxMS4xbDEyLjYtMjkuNUMzMTcuNywxNC43LDI5NS4zLDEwLDI3Miw4LjVWNDAuNnogTTE5MC44LDUwIGMxNS43LTUsMzIuMi04LjIsNDkuMi05LjRWOC41Yy0yMS4yLDEuNC00MS43LDUuNC02MS4xLDExLjdMMTkwLjgsNTB6IE00NDIuMyw5Mi4zTDQxOS42LDExNWMxMiwxMy45LDIyLjMsMjkuNCwzMC41LDQ2LjEgbDI5LjgtMTEuOUM0NzAsMTI4LjUsNDU3LjMsMTA5LjQsNDQyLjMsOTIuM3ogTTM5Nyw5Mi40bDIyLjctMjIuN2MtMTUuNi0xMy43LTMyLjgtMjUuNS01MS41LTM0LjlsLTEyLjYsMjkuNSBDMzcwLjQsNzIuMSwzODQuNCw4MS41LDM5Nyw5Mi40emB9KX0pO3ZhciBpPXEocSh7fSxyKSx7fSx7YXR0cmlidXRlTmFtZTpgb3BhY2l0eWB9KSxhPXt0YWc6YGNpcmNsZWAsYXR0cmlidXRlczpxKHEoe30sbikse30se2N4OmAyNTZgLGN5OmAzNjRgLHI6YDI4YH0pLGNoaWxkcmVuOltdfTtyZXR1cm4gdHx8YS5jaGlsZHJlbi5wdXNoKHt0YWc6YGFuaW1hdGVgLGF0dHJpYnV0ZXM6cShxKHt9LHIpLHt9LHthdHRyaWJ1dGVOYW1lOmByYCx2YWx1ZXM6YDI4OzE0OzI4OzI4OzE0OzI4O2B9KX0se3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMTswOzE7MTswOzE7YH0pfSksZS5wdXNoKGEpLGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMWAsZDpgTTI2My43LDMxMmgtMTZjLTYuNiwwLTEyLTUuNC0xMi0xMmMwLTcxLDc3LjQtNjMuOSw3Ny40LTEwNy44YzAtMjAtMTcuOC00MC4yLTU3LjQtNDAuMmMtMjkuMSwwLTQ0LjMsOS42LTU5LjIsMjguNyBjLTMuOSw1LTExLjEsNi0xNi4yLDIuNGwtMTMuMS05LjJjLTUuNi0zLjktNi45LTExLjgtMi42LTE3LjJjMjEuMi0yNy4yLDQ2LjQtNDQuNyw5MS4yLTQ0LjdjNTIuMywwLDk3LjQsMjkuOCw5Ny40LDgwLjIgYzAsNjcuNi03Ny40LDYzLjUtNzcuNCwxMDcuOEMyNzUuNywzMDYuNiwyNzAuMywzMTIsMjYzLjcsMzEyemB9KSxjaGlsZHJlbjp0P1tdOlt7dGFnOmBhbmltYXRlYCxhdHRyaWJ1dGVzOnEocSh7fSxpKSx7fSx7dmFsdWVzOmAxOzA7MDswOzA7MTtgfSl9XX0pLHR8fGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMGAsZDpgTTIzMi41LDEzNC41bDcsMTY4YzAuMyw2LjQsNS42LDExLjUsMTIsMTEuNWg5YzYuNCwwLDExLjctNS4xLDEyLTExLjVsNy0xNjhjMC4zLTYuOC01LjItMTIuNS0xMi0xMi41aC0yMyBDMjM3LjcsMTIyLDIzMi4yLDEyNy43LDIzMi41LDEzNC41emB9KSxjaGlsZHJlbjpbe3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMDswOzE7MTswOzA7YH0pfV19KSx7dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgbWlzc2luZ2B9LGNoaWxkcmVuOmV9fX19LHtob29rczpmdW5jdGlvbigpe3JldHVybntwYXJzZU5vZGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYGRhdGEtZmEtc3ltYm9sYCk7cmV0dXJuIGUuc3ltYm9sPW49PT1udWxsPyExOm49PT1gYHx8bixlfX19fV0se21peG91dHNUbzpDbX0pLENtLm5vQXV0byxDbS5jb25maWcsQ20ubGlicmFyeSxDbS5kb207dmFyIEdoPUNtLnBhcnNlO0NtLmZpbmRJY29uRGVmaW5pdGlvbixDbS50b0h0bWw7dmFyIEtoPUNtLmljb247Q20ubGF5ZXIsQ20udGV4dCxDbS5jb3VudGVyO2Z1bmN0aW9uIHFoKGUsdCl7KHQ9PW51bGx8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBKaChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxaChlKX1mdW5jdGlvbiBZaChlLHQsbil7cmV0dXJuKHQ9aWcodCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gWGgoZSl7aWYodHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVtgQEBpdGVyYXRvcmBdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIFpoKCl7dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFFoKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gJGgoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/UWgoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1loKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlFoKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KX1yZXR1cm4gZX1mdW5jdGlvbiBlZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG4scixpPXRnKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iocj0wO3I8YS5sZW5ndGg7cisrKW49YVtyXSx0LmluZGV4T2Yobik9PT0tMSYme30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYoaVtuXT1lW25dKX1yZXR1cm4gaX1mdW5jdGlvbiB0ZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e307Zm9yKHZhciByIGluIGUpaWYoe30uaGFzT3duUHJvcGVydHkuY2FsbChlLHIpKXtpZih0LmluZGV4T2YocikhPT0tMSljb250aW51ZTtuW3JdPWVbcl19cmV0dXJuIG59ZnVuY3Rpb24gbmcoZSl7cmV0dXJuIEpoKGUpfHxYaChlKXx8b2coZSl8fFpoKCl9ZnVuY3Rpb24gcmcoZSx0KXtpZih0eXBlb2YgZSE9YG9iamVjdGB8fCFlKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHxgZGVmYXVsdGApO2lmKHR5cGVvZiByIT1gb2JqZWN0YClyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoYEBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuYCl9cmV0dXJuKHQ9PT1gc3RyaW5nYD9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBpZyhlKXt2YXIgdD1yZyhlLGBzdHJpbmdgKTtyZXR1cm4gdHlwZW9mIHQ9PWBzeW1ib2xgP3Q6dCtgYH1mdW5jdGlvbiBhZyhlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBhZz10eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT1gc3ltYm9sYD9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT9gc3ltYm9sYDp0eXBlb2YgZX0sYWcoZSl9ZnVuY3Rpb24gb2coZSx0KXtpZihlKXtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIHFoKGUsdCk7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4gbj09PWBPYmplY3RgJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT1gTWFwYHx8bj09PWBTZXRgP0FycmF5LmZyb20oZSk6bj09PWBBcmd1bWVudHNgfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9xaChlLHQpOnZvaWQgMH19ZnVuY3Rpb24gc2coZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MHx8IUFycmF5LmlzQXJyYXkodCkmJnQ/WWgoe30sZSx0KTp7fX1mdW5jdGlvbiBjZyhlKXt2YXIgdCxuPSh0PXsiZmEtc3BpbiI6ZS5zcGluLCJmYS1wdWxzZSI6ZS5wdWxzZSwiZmEtZnciOmUuZml4ZWRXaWR0aCwiZmEtYm9yZGVyIjplLmJvcmRlciwiZmEtbGkiOmUubGlzdEl0ZW0sImZhLWludmVyc2UiOmUuaW52ZXJzZSwiZmEtZmxpcCI6ZS5mbGlwPT09ITAsImZhLWZsaXAtaG9yaXpvbnRhbCI6ZS5mbGlwPT09YGhvcml6b250YWxgfHxlLmZsaXA9PT1gYm90aGAsImZhLWZsaXAtdmVydGljYWwiOmUuZmxpcD09PWB2ZXJ0aWNhbGB8fGUuZmxpcD09PWBib3RoYH0sWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgodCxgZmEtJHtlLnNpemV9YCxlLnNpemUhPT1udWxsKSxgZmEtcm90YXRlLSR7ZS5yb3RhdGlvbn1gLGUucm90YXRpb24hPT1udWxsKSxgZmEtcm90YXRlLWJ5YCxlLnJvdGF0ZUJ5KSxgZmEtcHVsbC0ke2UucHVsbH1gLGUucHVsbCE9PW51bGwpLGBmYS1zd2FwLW9wYWNpdHlgLGUuc3dhcE9wYWNpdHkpLGBmYS1ib3VuY2VgLGUuYm91bmNlKSxgZmEtc2hha2VgLGUuc2hha2UpLGBmYS1iZWF0YCxlLmJlYXQpLGBmYS1mYWRlYCxlLmZhZGUpLGBmYS1iZWF0LWZhZGVgLGUuYmVhdEZhZGUpLFloKFloKFloKFloKFloKFloKFloKFloKFloKFloKHQsYGZhLWZsYXNoYCxlLmZsYXNoKSxgZmEtc3Bpbi1wdWxzZWAsZS5zcGluUHVsc2UpLGBmYS1zcGluLXJldmVyc2VgLGUuc3BpblJldmVyc2UpLGBmYS13aWR0aC1hdXRvYCxlLndpZHRoQXV0byksYGZhLWNhbnZhcy1zcXVhcmVgLGUuY2FudmFzU3F1YXJlKSxgZmEtY2FudmFzLXJvb215YCxlLmNhbnZhc1Jvb215KSxgZmEtZmxpcC0zNjBgLGUuZmxpcDM2MCksYGZhLWJ1enpgLGUuYnV6eiksYGZhLWZsb2F0YCxlLmZsb2F0KSxgZmEtamVsbG9gLGUuamVsbG8pLFloKFloKFloKFloKFloKHQsYGZhLXNwaW4tc25hcGAsZS5zcGluU25hcCksYGZhLXNwaW4tc25hcC00YCxlLnNwaW5TbmFwNCksYGZhLXNwaW4tc25hcC04YCxlLnNwaW5TbmFwOCksYGZhLXN3aW5nYCxlLnN3aW5nKSxgZmEtd2FnYCxlLndhZykpO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV0/ZTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9dmFyIGxnPXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6dHlwZW9mIHNlbGY8YHVgP3NlbGY6e30sdWc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7dmFyIG49ZnVuY3Rpb24oZSx0LHIpe2lmKCFsKHQpfHxkKHQpfHxmKHQpfHxwKHQpfHxjKHQpKXJldHVybiB0O3ZhciBpLGE9MCxvPTA7aWYodSh0KSlmb3IoaT1bXSxvPXQubGVuZ3RoO2E8bzthKyspaS5wdXNoKG4oZSx0W2FdLHIpKTtlbHNlIGZvcih2YXIgcyBpbiBpPXt9LHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihpW2UocyxyKV09bihlLHRbc10scikpO3JldHVybiBpfSxyPWZ1bmN0aW9uKGUsdCl7dHx8PXt9O3ZhciBuPXQuc2VwYXJhdG9yfHxgX2Ascj10LnNwbGl0fHwvKD89W0EtWl0pLztyZXR1cm4gZS5zcGxpdChyKS5qb2luKG4pfSxpPWZ1bmN0aW9uKGUpe3JldHVybiBtKGUpP2U6KGU9ZS5yZXBsYWNlKC9bXC1fXHNdKyguKT8vZyxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKTpgYH0pLGUuc3Vic3RyKDAsMSkudG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKSl9LGE9ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtyZXR1cm4gdC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpfSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSx0KS50b0xvd2VyQ2FzZSgpfSxzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBmdW5jdGlvbmB9LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1PYmplY3QoZSl9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQXJyYXldYH0sZD1mdW5jdGlvbihlKXtyZXR1cm4gcy5jYWxsKGUpPT1gW29iamVjdCBEYXRlXWB9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgUmVnRXhwXWB9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQm9vbGVhbl1gfSxtPWZ1bmN0aW9uKGUpe3JldHVybiBlLT0wLGU9PT1lfSxoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmYHByb2Nlc3NgaW4gdD90LnByb2Nlc3M6dDtyZXR1cm4gdHlwZW9mIG49PWBmdW5jdGlvbmA/ZnVuY3Rpb24odCxyKXtyZXR1cm4gbih0LGUscil9OmV9LGc9e2NhbWVsaXplOmksZGVjYW1lbGl6ZTpvLHBhc2NhbGl6ZTphLGRlcGFzY2FsaXplOm8sY2FtZWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChpLHQpLGUpfSxkZWNhbWVsaXplS2V5czpmdW5jdGlvbihlLHQpe3JldHVybiBuKGgobyx0KSxlLHQpfSxwYXNjYWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChhLHQpLGUpfSxkZXBhc2NhbGl6ZUtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNhbWVsaXplS2V5cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtlLmV4cG9ydHM/ZS5leHBvcnRzPWc6dC5odW1wcz1nfSkobGcpfSkodWcpO3ZhciBkZz11Zy5leHBvcnRzLGZnPVtgZ3JhZGllbnRGaWxsYF0scGc9W2BjbGFzc2AsYHN0eWxlYF0sbWc9W2B0eXBlYCxgc3RvcHNgLGBpZGBdO2Z1bmN0aW9uIGhnKGUpe3JldHVybiBlLnNwbGl0KGA7YCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQuaW5kZXhPZihgOmApLHI9ZGcuY2FtZWxpemUodC5zbGljZSgwLG4pKTtyZXR1cm4gZVtyXT10LnNsaWNlKG4rMSkudHJpbSgpLGV9LHt9KX1mdW5jdGlvbiBnZyhlKXtyZXR1cm4gZS5zcGxpdCgvXHMrLykucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09ITAsZX0se30pfWZ1bmN0aW9uIF9nKGUsdCl7cmV0dXJuIEcoYHN0b3BgLCRoKHtrZXk6YCR7dH0tJHtlLm9mZnNldH1gLG9mZnNldDplLm9mZnNldCwic3RvcC1jb2xvciI6ZS5jb2xvcn0sZS5vcGFjaXR5IT09dm9pZCAwJiZ7InN0b3Atb3BhY2l0eSI6ZS5vcGFjaXR5fSkpfWZ1bmN0aW9uIHZnKGUpe2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTt2YXIgdD0oZS5jaGlsZHJlbnx8W10pLm1hcCh2Zyk7cmV0dXJuIGUudGFnPT09YHBhdGhgJiZlLmF0dHJpYnV0ZXMmJmBmaWxsYGluIGUuYXR0cmlidXRlcz8kaCgkaCh7fSxlKSx7fSx7YXR0cmlidXRlczokaCgkaCh7fSxlLmF0dHJpYnV0ZXMpLHt9LHtmaWxsOnZvaWQgMH0pLGNoaWxkcmVuOnR9KTokaCgkaCh7fSxlKSx7fSx7Y2hpbGRyZW46dH0pfWZ1bmN0aW9uIHlnKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGU7dmFyIHI9dC5ncmFkaWVudEZpbGwsaT1yPT09dm9pZCAwP251bGw6cixhPWVnKHQsZmcpLG89aXx8YGZpbGxgaW4gbj92ZyhlKTplLHM9KG8uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHlnKGUse30se30pfSksYz1PYmplY3Qua2V5cyhvLmF0dHJpYnV0ZXN8fHt9KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmF0dHJpYnV0ZXNbdF07c3dpdGNoKHQpe2Nhc2VgY2xhc3NgOmUuY2xhc3M9Z2cobik7YnJlYWs7Y2FzZWBzdHlsZWA6ZS5zdHlsZT1oZyhuKTticmVhaztkZWZhdWx0OmUuYXR0cnNbdF09bn1yZXR1cm4gZX0se2F0dHJzOnt9LGNsYXNzOnt9LHN0eWxlOnt9fSk7bi5jbGFzczt2YXIgbD1uLnN0eWxlLHU9bD09PXZvaWQgMD97fTpsLGQ9ZWcobixwZyk7aWYoaSYmaS5pZCYmKGkudHlwZT09PWBsaW5lYXJgfHxpLnR5cGU9PT1gcmFkaWFsYCkpe3ZhciBmPWkudHlwZSxwPWkuc3RvcHMsbT1wPT09dm9pZCAwP1tdOnAsaD1pLmlkLGc9ZWcoaSxtZyksXz1HKGY9PT1gbGluZWFyYD9gbGluZWFyR3JhZGllbnRgOmByYWRpYWxHcmFkaWVudGAsJGgoJGgoe30sZykse30se2lkOmh9KSxtLm1hcChfZykpO3JldHVybiBHKG8udGFnLCRoKCRoKCRoKCRoKHt9LGEpLHt9LHtjbGFzczpjLmNsYXNzLHN0eWxlOiRoKCRoKHt9LGMuc3R5bGUpLHUpfSxjLmF0dHJzKSxkKSx7fSx7ZmlsbDpgdXJsKCMke2h9KWB9KSxbX10uY29uY2F0KG5nKHMpKSl9cmV0dXJuIEcoZS50YWcsJGgoJGgoJGgoe30sYSkse30se2NsYXNzOmMuY2xhc3Msc3R5bGU6JGgoJGgoe30sYy5zdHlsZSksdSl9LGMuYXR0cnMpLGQpLHMpfXZhciBiZz0hMTt0cnl7Ymc9ITB9Y2F0Y2h7fWZ1bmN0aW9uIHhnKCl7aWYoIWJnJiZjb25zb2xlJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09YGZ1bmN0aW9uYCl7dmFyIGU7KGU9Y29uc29sZSkuZXJyb3IuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBTZyhlKXtpZihlJiZhZyhlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSYmZS5pY29uKXJldHVybiBlO2lmKEdoLmljb24pcmV0dXJuIEdoLmljb24oZSk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7aWYoYWcoZSk9PT1gb2JqZWN0YCYmZS5wcmVmaXgmJmUuaWNvbk5hbWUpcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg9PT0yKXJldHVybntwcmVmaXg6ZVswXSxpY29uTmFtZTplWzFdfTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJue3ByZWZpeDpgZmFzYCxpY29uTmFtZTplfX12YXIgQ2c9Rih7bmFtZTpgRm9udEF3ZXNvbWVJY29uYCxwcm9wczp7Ym9yZGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZml4ZWRXaWR0aDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsaXA6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bITAsITEsYGhvcml6b250YWxgLGB2ZXJ0aWNhbGAsYGJvdGhgXS5pbmRleE9mKGUpPi0xfX0saWNvbjp7dHlwZTpbT2JqZWN0LEFycmF5LFN0cmluZ10scmVxdWlyZWQ6ITB9LG1hc2s6e3R5cGU6W09iamVjdCxBcnJheSxTdHJpbmddLGRlZmF1bHQ6bnVsbH0sbWFza0lkOnt0eXBlOlN0cmluZyxkZWZhdWx0Om51bGx9LGxpc3RJdGVtOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0scHVsbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYHJpZ2h0YCxgbGVmdGBdLmluZGV4T2YoZSk+LTF9fSxwdWxzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHJvdGF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybls5MCwxODAsMjcwXS5pbmRleE9mKE51bWJlci5wYXJzZUludChlLDEwKSk+LTF9fSxyb3RhdGVCeTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3YXBPcGFjaXR5Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYDJ4c2AsYHhzYCxgc21gLGBsZ2AsYHhsYCxgMnhsYCxgMXhgLGAyeGAsYDN4YCxgNHhgLGA1eGAsYDZ4YCxgN3hgLGA4eGAsYDl4YCxgMTB4YF0uaW5kZXhPZihlKT4tMX19LHNwaW46e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx0cmFuc2Zvcm06e3R5cGU6W1N0cmluZyxPYmplY3RdLGRlZmF1bHQ6bnVsbH0sc3ltYm9sOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbH0sdGl0bGVJZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsfSxpbnZlcnNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm91bmNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2hha2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxiZWF0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmFkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJlYXRGYWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmxhc2g6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUHVsc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUmV2ZXJzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHdpZHRoQXV0bzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1NxdWFyZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1Jvb215Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZ3JhZGllbnRGaWxsOnt0eXBlOk9iamVjdCxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZS5pZCE9YHN0cmluZ2B8fCFlLmlkPyhjb25zb2xlLndhcm4oYEZvbnRBd2Vzb21lSWNvbjogZ3JhZGllbnRGaWxsLmlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCksITEpOmUudHlwZSE9PWBsaW5lYXJgJiZlLnR5cGUhPT1gcmFkaWFsYD8oY29uc29sZS53YXJuKGBGb250QXdlc29tZUljb246IGdyYWRpZW50RmlsbC50eXBlIG11c3QgYmUgImxpbmVhciIgb3IgInJhZGlhbCJgKSwhMSk6ITB9fSxmbGlwMzYwOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYnV6ejp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsb2F0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0samVsbG86e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluU25hcDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwNDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwODp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3aW5nOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sd2FnOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LHNldHVwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5hdHRycyxyPVcoZnVuY3Rpb24oKXtyZXR1cm4gU2coZS5pY29uKX0pLGk9VyhmdW5jdGlvbigpe3JldHVybiBzZyhgY2xhc3Nlc2AsY2coZSkpfSksYT1XKGZ1bmN0aW9uKCl7cmV0dXJuIHNnKGB0cmFuc2Zvcm1gLHR5cGVvZiBlLnRyYW5zZm9ybT09YHN0cmluZ2A/R2gudHJhbnNmb3JtKGUudHJhbnNmb3JtKTplLnRyYW5zZm9ybSl9KSxvPVcoZnVuY3Rpb24oKXtyZXR1cm4gc2coYG1hc2tgLFNnKGUubWFzaykpfSkscz1XKGZ1bmN0aW9uKCl7dmFyIHQ9JGgoJGgoJGgoJGgoe30saS52YWx1ZSksYS52YWx1ZSksby52YWx1ZSkse30se3N5bWJvbDplLnN5bWJvbCxtYXNrSWQ6ZS5tYXNrSWR9KTtyZXR1cm4gdC50aXRsZT1lLnRpdGxlLHQudGl0bGVJZD1lLnRpdGxlSWQsS2goci52YWx1ZSx0KX0pO0VyKHMsZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIHhnKGBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBpY29uKHMpYCxyLnZhbHVlLG8udmFsdWUpfSx7aW1tZWRpYXRlOiEwfSksZS5ncmFkaWVudEZpbGwmJmUuc3ltYm9sJiZ4ZyhgZ3JhZGllbnRGaWxsIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBzeW1ib2wgaXMgdHJ1ZSBhbmQgd2lsbCBiZSBpZ25vcmVkYCk7dmFyIGM9VyhmdW5jdGlvbigpe3JldHVybiBzLnZhbHVlP3lnKHMudmFsdWUuYWJzdHJhY3RbMF0se2dyYWRpZW50RmlsbDplLnN5bWJvbD9udWxsOmUuZ3JhZGllbnRGaWxsfSxuKTpudWxsfSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMudmFsdWV9fX0pLHdnPXR5cGVvZiB3aW5kb3c8YHVgLFRnLEVnPWU9PlRnPWUsRGc9U3ltYm9sKCk7ZnVuY3Rpb24gT2coZSl7cmV0dXJuIGUmJnR5cGVvZiBlPT1gb2JqZWN0YCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAmJnR5cGVvZiBlLnRvSlNPTiE9YGZ1bmN0aW9uYH12YXIga2c9dHlwZW9mIHdpbmRvdz09YG9iamVjdGAmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93OnR5cGVvZiBzZWxmPT1gb2JqZWN0YCYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOnR5cGVvZiBnbG9iYWw9PWBvYmplY3RgJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp0eXBlb2YgZ2xvYmFsVGhpcz09YG9iamVjdGA/Z2xvYmFsVGhpczp7SFRNTEVsZW1lbnQ6bnVsbH07ZnVuY3Rpb24gQWcoZSx7YXV0b0JvbTp0PSExfT17fSl7cmV0dXJuIHQmJi9eXHMqKD86dGV4dFwvXFMqfGFwcGxpY2F0aW9uXC94bWx8XFMqXC9cUypcK3htbClccyo7LipjaGFyc2V0XHMqPVxzKnV0Zi04L2kudGVzdChlLnR5cGUpP25ldyBCbG9iKFtg77u/YCxlXSx7dHlwZTplLnR5cGV9KTplfWZ1bmN0aW9uIGpnKGUsdCxuKXtsZXQgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKGBHRVRgLGUpLHIucmVzcG9uc2VUeXBlPWBibG9iYCxyLm9ubG9hZD1mdW5jdGlvbigpe0lnKHIucmVzcG9uc2UsdCxuKX0sci5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihgY291bGQgbm90IGRvd25sb2FkIGZpbGVgKX0sci5zZW5kKCl9ZnVuY3Rpb24gTWcoZSl7bGV0IHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3Qub3BlbihgSEVBRGAsZSwhMSk7dHJ5e3Quc2VuZCgpfWNhdGNoe31yZXR1cm4gdC5zdGF0dXM+PTIwMCYmdC5zdGF0dXM8PTI5OX1mdW5jdGlvbiBOZyhlKXt0cnl7ZS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KGBjbGlja2ApKX1jYXRjaHtsZXQgdD1uZXcgTW91c2VFdmVudChgY2xpY2tgLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsdmlldzp3aW5kb3csZGV0YWlsOjAsc2NyZWVuWDo4MCxzY3JlZW5ZOjIwLGNsaWVudFg6ODAsY2xpZW50WToyMCxjdHJsS2V5OiExLGFsdEtleTohMSxzaGlmdEtleTohMSxtZXRhS2V5OiExLGJ1dHRvbjowLHJlbGF0ZWRUYXJnZXQ6bnVsbH0pO2UuZGlzcGF0Y2hFdmVudCh0KX19dmFyIFBnPXR5cGVvZiBuYXZpZ2F0b3I9PWBvYmplY3RgP25hdmlnYXRvcjp7dXNlckFnZW50OmBgfSxGZz0vTWFjaW50b3NoLy50ZXN0KFBnLnVzZXJBZ2VudCkmJi9BcHBsZVdlYktpdC8udGVzdChQZy51c2VyQWdlbnQpJiYhL1NhZmFyaS8udGVzdChQZy51c2VyQWdlbnQpLElnPXdnP3R5cGVvZiBIVE1MQW5jaG9yRWxlbWVudDxgdWAmJmBkb3dubG9hZGBpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFGZz9MZzpgbXNTYXZlT3JPcGVuQmxvYmBpbiBQZz9SZzp6ZzooKT0+e307ZnVuY3Rpb24gTGcoZSx0PWBkb3dubG9hZGAsbil7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgYWApO3IuZG93bmxvYWQ9dCxyLnJlbD1gbm9vcGVuZXJgLHR5cGVvZiBlPT1gc3RyaW5nYD8oci5ocmVmPWUsci5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/Tmcocik6TWcoci5ocmVmKT9qZyhlLHQsbik6KHIudGFyZ2V0PWBfYmxhbmtgLE5nKHIpKSk6KHIuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtVUkwucmV2b2tlT2JqZWN0VVJMKHIuaHJlZil9LDRlNCksc2V0VGltZW91dChmdW5jdGlvbigpe05nKHIpfSwwKSl9ZnVuY3Rpb24gUmcoZSx0PWBkb3dubG9hZGAsbil7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXtpZihNZyhlKSlqZyhlLHQsbik7ZWxzZXtsZXQgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBhYCk7dC5ocmVmPWUsdC50YXJnZXQ9YF9ibGFua2Asc2V0VGltZW91dChmdW5jdGlvbigpe05nKHQpfSl9fWVsc2UgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoQWcoZSxuKSx0KX1mdW5jdGlvbiB6ZyhlLHQsbixyKXtpZihyfHw9b3BlbihgYCxgX2JsYW5rYCksciYmKHIuZG9jdW1lbnQudGl0bGU9ci5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1gZG93bmxvYWRpbmcuLi5gKSx0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGpnKGUsdCxuKTtsZXQgaT1lLnR5cGU9PT1gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtYCxhPS9jb25zdHJ1Y3Rvci9pLnRlc3QoU3RyaW5nKGtnLkhUTUxFbGVtZW50KSl8fGBzYWZhcmlgaW4ga2csbz0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChvfHxpJiZhfHxGZykmJnR5cGVvZiBGaWxlUmVhZGVyPGB1YCl7bGV0IHQ9bmV3IEZpbGVSZWFkZXI7dC5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXtsZXQgZT10LnJlc3VsdDtpZih0eXBlb2YgZSE9YHN0cmluZ2ApdGhyb3cgcj1udWxsLEVycm9yKGBXcm9uZyByZWFkZXIucmVzdWx0IHR5cGVgKTtlPW8/ZTplLnJlcGxhY2UoL15kYXRhOlteO10qOy8sYGRhdGE6YXR0YWNobWVudC9maWxlO2ApLHI/ci5sb2NhdGlvbi5ocmVmPWU6bG9jYXRpb24uYXNzaWduKGUpLHI9bnVsbH0sdC5yZWFkQXNEYXRhVVJMKGUpfWVsc2V7bGV0IHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChlKTtyP3IubG9jYXRpb24uYXNzaWduKHQpOmxvY2F0aW9uLmhyZWY9dCxyPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe1VSTC5yZXZva2VPYmplY3RVUkwodCl9LDRlNCl9fXZhcnthc3NpZ246Qmd9PU9iamVjdDtmdW5jdGlvbiBWZygpe2xldCBlPVBlKCEwKSx0PWUucnVuKCgpPT5NKHt9KSksbj1bXSxyPVtdLGk9c24oe2luc3RhbGwoZSl7RWcoaSksaS5fYT1lLGUucHJvdmlkZShEZyxpKSxlLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRwaW5pYT1pLHIuZm9yRWFjaChlPT5uLnB1c2goZSkpLHI9W119LHVzZShlKXtyZXR1cm4gdGhpcy5fYT9uLnB1c2goZSk6ci5wdXNoKGUpLHRoaXN9LF9wOm4sX2E6bnVsbCxfZTplLF9zOm5ldyBNYXAsc3RhdGU6dH0pO3JldHVybiBpfXZhciBIZz0oKT0+e307ZnVuY3Rpb24gVWcoZSx0LG4scj1IZyl7ZS5hZGQodCk7bGV0IGk9KCk9PntlLmRlbGV0ZSh0KSYmcigpfTtyZXR1cm4hbiYmRmUoKSYmSWUoaSksaX1mdW5jdGlvbiBXZyhlLC4uLnQpe2UuZm9yRWFjaChlPT57ZSguLi50KX0pfXZhciBHZz1lPT5lKCksS2c9U3ltYm9sKCkscWc9U3ltYm9sKCk7ZnVuY3Rpb24gSmcoZSx0KXtlIGluc3RhbmNlb2YgTWFwJiZ0IGluc3RhbmNlb2YgTWFwP3QuZm9yRWFjaCgodCxuKT0+ZS5zZXQobix0KSk6ZSBpbnN0YW5jZW9mIFNldCYmdCBpbnN0YW5jZW9mIFNldCYmdC5mb3JFYWNoKGUuYWRkLGUpO2ZvcihsZXQgbiBpbiB0KXtpZighT2JqZWN0Lmhhc093bih0LG4pKWNvbnRpbnVlO2xldCByPXRbbl0saT1lW25dO2Vbbl09T2coaSkmJk9nKHIpJiZPYmplY3QuaGFzT3duKGUsbikmJiFqKHIpJiYhbm4ocik/SmcoaSxyKTpyfXJldHVybiBlfXZhciBZZz1TeW1ib2woKTtmdW5jdGlvbiBYZyhlKXtyZXR1cm4hZXx8dHlwZW9mIGUhPWBvYmplY3RgfHwhT2JqZWN0Lmhhc093bihlLFlnKX12YXJ7YXNzaWduOlpnfT1PYmplY3Q7ZnVuY3Rpb24gUWcoZSl7cmV0dXJuISEoaihlKSYmZS5lZmZlY3QpfWZ1bmN0aW9uICRnKGUsdCxuLHIpe2xldHtzdGF0ZTppLGFjdGlvbnM6YSxnZXR0ZXJzOm99PXQscz1uLnN0YXRlLnZhbHVlW2VdLGM7ZnVuY3Rpb24gbCgpe3JldHVybiBzfHwobi5zdGF0ZS52YWx1ZVtlXT1pP2koKTp7fSksWmcoeW4obi5zdGF0ZS52YWx1ZVtlXSksYSxPYmplY3Qua2V5cyhvfHx7fSkucmVkdWNlKCh0LHIpPT4odFtyXT1zbihXKCgpPT57RWcobik7bGV0IHQ9bi5fcy5nZXQoZSk7cmV0dXJuIG9bcl0uY2FsbCh0LHQpfSkpLHQpLHt9KSl9cmV0dXJuIGM9ZV8oZSxsLHQsbixyLCEwKSxjfWZ1bmN0aW9uIGVfKGUsdCxuPXt9LHIsaSxhKXtsZXQgbyxzPVpnKHthY3Rpb25zOnt9fSxuKSxjPXtkZWVwOiEwfSxsLHUsZD1uZXcgU2V0LGY9bmV3IFNldCxwLG09ci5zdGF0ZS52YWx1ZVtlXTshYSYmIW0mJihyLnN0YXRlLnZhbHVlW2VdPXt9KTtsZXQgaDtmdW5jdGlvbiBnKHQpe2xldCBuO2w9dT0hMSx0eXBlb2YgdD09YGZ1bmN0aW9uYD8odChyLnN0YXRlLnZhbHVlW2VdKSxuPXt0eXBlOmBwYXRjaCBmdW5jdGlvbmAsc3RvcmVJZDplLGV2ZW50czpwfSk6KEpnKHIuc3RhdGUudmFsdWVbZV0sdCksbj17dHlwZTpgcGF0Y2ggb2JqZWN0YCxwYXlsb2FkOnQsc3RvcmVJZDplLGV2ZW50czpwfSk7bGV0IGk9aD1TeW1ib2woKTtRbigpLnRoZW4oKCk9PntoPT09aSYmKGw9ITApfSksdT0hMCxXZyhkLG4sci5zdGF0ZS52YWx1ZVtlXSl9bGV0IF89YT9mdW5jdGlvbigpe2xldHtzdGF0ZTplfT1uLHQ9ZT9lKCk6e307dGhpcy4kcGF0Y2goZT0+e1pnKGUsdCl9KX06SGc7ZnVuY3Rpb24gdigpe28uc3RvcCgpLGQuY2xlYXIoKSxmLmNsZWFyKCksci5fcy5kZWxldGUoZSl9bGV0IHk9KHQsbj1gYCk9PntpZihLZyBpbiB0KXJldHVybiB0W3FnXT1uLHQ7bGV0IGk9ZnVuY3Rpb24oKXtFZyhyKTtsZXQgbj1BcnJheS5mcm9tKGFyZ3VtZW50cyksYT1uZXcgU2V0LG89bmV3IFNldDtmdW5jdGlvbiBzKGUpe2EuYWRkKGUpfWZ1bmN0aW9uIGMoZSl7by5hZGQoZSl9V2coZix7YXJnczpuLG5hbWU6aVtxZ10sc3RvcmU6YixhZnRlcjpzLG9uRXJyb3I6Y30pO2xldCBsO3RyeXtsPXQuYXBwbHkodGhpcyYmdGhpcy4kaWQ9PT1lP3RoaXM6YixuKX1jYXRjaChlKXt0aHJvdyBXZyhvLGUpLGV9cmV0dXJuIGwgaW5zdGFuY2VvZiBQcm9taXNlP2wudGhlbihlPT4oV2coYSxlKSxlKSkuY2F0Y2goZT0+KFdnKG8sZSksUHJvbWlzZS5yZWplY3QoZSkpKTooV2coYSxsKSxsKX07cmV0dXJuIGlbS2ddPSEwLGlbcWddPW4saX0sYj1adCh7X3A6ciwkaWQ6ZSwkb25BY3Rpb246VWcuYmluZChudWxsLGYpLCRwYXRjaDpnLCRyZXNldDpfLCRzdWJzY3JpYmUodCxuPXt9KXtpZihkLmhhcyh0KSlyZXR1cm4gSGc7bGV0IGk9VWcoZCx0LG4uZGV0YWNoZWQsKCk9PmEoKSksYT1vLnJ1bigoKT0+RXIoKCk9PnIuc3RhdGUudmFsdWVbZV0scj0+eyhuLmZsdXNoPT09YHN5bmNgP3U6bCkmJnQoe3N0b3JlSWQ6ZSx0eXBlOmBkaXJlY3RgLGV2ZW50czpwfSxyKX0sWmcoe30sYyxuKSkpO3JldHVybiBpfSwkZGlzcG9zZTp2fSk7ci5fcy5zZXQoZSxiKTtsZXQgeD0oci5fYSYmci5fYS5ydW5XaXRoQ29udGV4dHx8R2cpKCgpPT5yLl9lLnJ1bigoKT0+KG89UGUoKSkucnVuKCgpPT50KHthY3Rpb246eX0pKSkpO2ZvcihsZXQgdCBpbiB4KXtsZXQgbj14W3RdO2oobikmJiFRZyhuKXx8bm4obik/YXx8KG0mJlhnKG4pJiYoaihuKT9uLnZhbHVlPW1bdF06KChuIGluc3RhbmNlb2YgU2V0fHxuIGluc3RhbmNlb2YgTWFwKSYmbi5jbGVhcigpLEpnKG4sbVt0XSkpKSxyLnN0YXRlLnZhbHVlW2VdW3RdPW4pOnR5cGVvZiBuPT1gZnVuY3Rpb25gJiYoeFt0XT15KG4sdCkscy5hY3Rpb25zW3RdPW4pfXJldHVybiBaZyhiLHgpLFpnKEEoYikseCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIiRzdGF0ZSIse2dldDooKT0+ci5zdGF0ZS52YWx1ZVtlXSxzZXQ6ZT0+e2codD0+e1pnKHQsZSl9KX19KSxyLl9wLmZvckVhY2goZT0+e2xldCB0PW8ucnVuKCgpPT5lKHtzdG9yZTpiLGFwcDpyLl9hLHBpbmlhOnIsb3B0aW9uczpzfSkpO1pnKGIsdCl9KSxtJiZhJiZuLmh5ZHJhdGUmJm4uaHlkcmF0ZShiLiRzdGF0ZSxtKSxsPSEwLHU9ITAsYn1mdW5jdGlvbiB0XyhlLHQsbil7bGV0IHIsaT10eXBlb2YgdD09YGZ1bmN0aW9uYDtyPWk/bjp0O2Z1bmN0aW9uIGEobixhKXtsZXQgbz1icigpO3JldHVybiBufHw9bz95cihEZyxudWxsKTpudWxsLG4mJkVnKG4pLG49VGcsbi5fcy5oYXMoZSl8fChpP2VfKGUsdCxyLG4pOiRnKGUscixuKSksbi5fcy5nZXQoZSl9cmV0dXJuIGEuJGlkPWUsYX12YXIgbl89e3ByZWZpeDpgZmFiYCxpY29uTmFtZTpgZ2l0aHViYCxpY29uOls1MTIsNTEyLFtdLGBmMDliYCxgTTIxNi41IDM2Mi41Yy02Ni04LTExMi41LTU1LjUtMTEyLjUtMTE3IDAtMjUgOS01MiAyNC03MC02LjUtMTYuNS01LjUtNTEuNSAyLTY2IDIwLTIuNSA0NyA4IDYzIDIyLjUgMTktNiAzOS05IDYzLjUtOXM0NC41IDMgNjIuNSA4LjVjMTUuNS0xNCA0My0yNC41IDYzLTIyIDcgMTMuNSA4IDQ4LjUgMS41IDY1LjUgMTYgMTkgMjQuNSA0NC41IDI0LjUgNzAuNSAwIDYxLjUtNDYuNSAxMDgtMTEzLjUgMTE2LjUgMTcgMTEgMjguNSAzNSAyOC41IDYyLjVsMCA1MkMzMjMgNDkxLjUgMzM1LjUgNTAwIDM1MC41IDQ5NCA0NDEgNDU5LjUgNTEyIDM2OSA1MTIgMjU3IDUxMiAxMTUuNSAzOTcgMCAyNTUuNSAwUzAgMTE1LjUgMCAyNTdjMCAxMTEgNzAuNSAyMDMgMTY1LjUgMjM3LjUgMTMuNSA1IDI2LjUtNCAyNi41LTE3LjVsMC00MGMtNyAzLTE2IDUtMjQgNS0zMyAwLTUyLjUtMTgtNjYuNS01MS41LTUuNS0xMy41LTExLjUtMjEuNS0yMy0yMy02LS41LTgtMy04LTYgMC02IDEwLTEwLjUgMjAtMTAuNSAxNC41IDAgMjcgOSA0MCAyNy41IDEwIDE0LjUgMjAuNSAyMSAzMyAyMXMyMC41LTQuNSAzMi0xNmM4LjUtOC41IDE1LTE2IDIxLTIxemBdfSxyXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBtYWduaWZ5aW5nLWdsYXNzYCxpY29uOls1MTIsNTEyLFsxMjgyNjksYHNlYXJjaGBdLGBmMDAyYCxgTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjA4IDM1MmExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6YF19LGlfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGtleWAsaWNvbjpbNTEyLDUxMixbMTI4MjczXSxgZjA4NGAsYE0zMzYgMzUyYzk3LjIgMCAxNzYtNzguOCAxNzYtMTc2UzQzMy4yIDAgMzM2IDAgMTYwIDc4LjggMTYwIDE3NmMwIDE4LjcgMi45IDM2LjggOC4zIDUzLjdMNyAzOTFjLTQuNSA0LjUtNyAxMC42LTcgMTdsMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDAgNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQwIDQwIDBjNi40IDAgMTIuNS0yLjUgMTctN2wzMy4zLTMzLjNjMTYuOSA1LjQgMzUgOC4zIDUzLjcgOC4zek0zNzYgOTZhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwemBdfSxhXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LXVwYCxpY29uOlszODQsNTEyLFtgc29ydC1hc2NgXSxgZjBkZWAsYE0zMiAyMjRjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhTLjIgMTc4LjUgOS40IDE2OS40bDE2MC0xNjBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTYwIDE2MGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzNjQuOSAyMjQgMzUyIDIyNEwzMiAyMjR6YF19LG9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZWAsaWNvbjpbNTc2LDUxMixbMTI4MDY1XSxgZjA2ZWAsYE0yODggMzJjLTgwLjggMC0xNDUuNSAzNi44LTE5Mi42IDgwLjYtNDYuOCA0My41LTc4LjEgOTUuNC05MyAxMzEuMS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjZzMTQ1LjUtMzYuOCAxOTIuNi04MC42YzQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42ek0xNDQgMjU2YTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE0NC02NGMwIDM1LjMtMjguNyA2NC02NCA2NC0xMS41IDAtMjIuMy0zLTMxLjctOC40LTEgMTAuOS0uMSAyMi4xIDIuOSAzMy4yIDEzLjcgNTEuMiA2Ni40IDgxLjYgMTE3LjYgNjcuOXM4MS42LTY2LjQgNjcuOS0xMTcuNmMtMTIuMi00NS43LTU1LjUtNzQuOC0xMDEuMS03MC44IDUuMyA5LjMgOC40IDIwLjEgOC40IDMxLjd6YF19LHNfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZXZyb24tdXBgLGljb246WzQ0OCw1MTIsW10sYGYwNzdgLGBNMjAxLjQgMTA1LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTkyIDE5MmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwyMjQgMTczLjMgNTQuNiAzNDIuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsMTkyLTE5MnpgXX0sY189e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgY2lyY2xlLXhtYXJrYCxpY29uOls1MTIsNTEyLFs2MTUzMixgdGltZXMtY2lyY2xlYCxgeG1hcmstY2lyY2xlYF0sYGYwNTdgLGBNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NyAxNjdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNTUgNTUgNTUtNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC01NSA1NSA1NSA1NWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC01NS01NS01NSA1NWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1NS01NS01NS01NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6YF19LGxfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1leGNsYW1hdGlvbmAsaWNvbjpbNTEyLDUxMixbYGV4Y2xhbWF0aW9uLWNpcmNsZWBdLGBmMDZhYCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyem0wLTE5MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjYgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LHVfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZWNrYCxpY29uOls0NDgsNTEyLFsxMDAwMywxMDAwNF0sYGYwMGNgLGBNNDM0LjggNzAuMWMxNC4zIDEwLjQgMTcuNSAzMC40IDcuMSA0NC43bC0yNTYgMzUyYy01LjUgNy42LTE0IDEyLjMtMjMuNCAxMy4xcy0xOC41LTIuNy0yNS4xLTkuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxMDEuNSAxMDEuNSAyMzQtMzIxLjdjMTAuNC0xNC4zIDMwLjQtMTcuNSA0NC43LTcuMXpgXX0sZF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgc29ydGAsaWNvbjpbMzg0LDUxMixbYHVuc29ydGVkYF0sYGYwZGNgLGBNMi40IDIwNC4yYzUgMTIgMTYuNiAxOS44IDI5LjYgMTkuOGwzMjAgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0Ljl6bTAgMTAzLjVjLTUgMTItMi4yIDI1LjcgNi45IDM0LjlsMTYwIDE2MGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzM2NC45IDI4OCAzNTIgMjg4TDMyIDI4OGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHpgXX0sZl89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgeG1hcmtgLGljb246WzM4NCw1MTIsWzEyODQ3MywxMDAwNSwxMDAwNiwxMDA2MCwyMTUsYGNsb3NlYCxgbXVsdGlwbHlgLGByZW1vdmVgLGB0aW1lc2BdLGBmMDBkYCxgTTU1LjEgNzMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTQ3LjIgMjU2IDkuOSAzOTMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIuNSAzMDEuMyAzMjkuOSA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDIzNy44IDI1NiAzNzUuMSAxMTguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwxOTIuNSAyMTAuNyA1NS4xIDczLjR6YF19LHBfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1jaGVja2AsaWNvbjpbNTEyLDUxMixbNjE1MzMsYGNoZWNrLWNpcmNsZWBdLGBmMDU4YCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyek0zNzQgMTQ1LjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDIyMS4xIDMxNS4yIDE2OSAyNjMuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOCA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM3OS4zIDE3OS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41emBdfSxtXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaGV2cm9uLWRvd25gLGljb246WzQ0OCw1MTIsW10sYGYwNzhgLGBNMjAxLjQgNDA2LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTkyLTE5MmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyMjQgMzM4LjcgNTQuNiAxNjkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsMTkyIDE5MnpgXX0saF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgdHJpYW5nbGUtZXhjbGFtYXRpb25gLGljb246WzUxMiw1MTIsWzk4ODgsYGV4Y2xhbWF0aW9uLXRyaWFuZ2xlYCxgd2FybmluZ2BdLGBmMDcxYCxgTTI1NiAwYzE0LjcgMCAyOC4yIDguMSAzNS4yIDIxbDIxNiA0MDBjNi43IDEyLjQgNi40IDI3LjQtLjggMzkuNVM0ODYuMSA0ODAgNDcyIDQ4MEw0MCA0ODBjLTE0LjEgMC0yNy4yLTcuNC0zNC40LTE5LjVzLTcuNS0yNy4xLS44LTM5LjVsMjE2LTQwMGM3LTEyLjkgMjAuNS0yMSAzNS4yLTIxem0wIDM1MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjUgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LGdfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNvcHlgLGljb246WzQ0OCw1MTIsW10sYGYwYzVgLGBNMTkyIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjAwLjZjMC0xNy40LTcuMS0zNC4xLTE5LjctNDYuMkwzNzAuNiAxNy44QzM1OC43IDYuNCAzNDIuOCAwIDMyNi4zIDBMMTkyIDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNi02NCAwIDAgMTYtMTkyIDAgMC0yNTYgMTYgMCAwLTY0LTE2IDB6YF19LF9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZS1zbGFzaGAsaWNvbjpbNTc2LDUxMixbXSxgZjA3MGAsYE00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC05Ni40LTk2LjRjMi43LTIuNCA1LjQtNC44IDgtNy4yIDQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42LTU2LjggMC0xMDUuNiAxOC4yLTE0NiA0NC4yTDQxLTI0Ljl6TTIwNC41IDEzOC43YzIzLjUtMTYuOCA1Mi40LTI2LjcgODMuNS0yNi43IDc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0IDAgMzEuMS05LjkgNTkuOS0yNi43IDgzLjVsLTM0LjctMzQuN2MxMi43LTIxLjQgMTctNDcuNyAxMC4xLTczLjctMTMuNy01MS4yLTY2LjQtODEuNi0xMTcuNi02Ny45LTguNiAyLjMtMTYuNyA1LjctMjQgMTBsLTM0LjctMzQuN3pNMzI1LjMgMzk1LjFjLTExLjkgMy4yLTI0LjQgNC45LTM3LjMgNC45LTc5LjUgMC0xNDQtNjQuNS0xNDQtMTQ0IDAtMTIuOSAxLjctMjUuNCA0LjktMzcuM0w2OS40IDEzOS4yYy0zMi42IDM2LjgtNTUgNzUuOC02Ni45IDEwNC41LTMuMyA3LjktMy4zIDE2LjcgMCAyNC42IDE0LjkgMzUuNyA0Ni4yIDg3LjcgOTMgMTMxLjEgNDcuMSA0My43IDExMS44IDgwLjYgMTkyLjYgODAuNiAzNy4zIDAgNzEuMi03LjkgMTAxLjUtMjAuNmwtNjQuMi02NC4yemBdfSx2Xz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LWRvd25gLGljb246WzM4NCw1MTIsW2Bzb3J0LWRlc2NgXSxgZjBkZGAsYE0zMiAyODhjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjIgMzMzLjUgOS40IDM0Mi42bDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzNjQuOSAyODggMzUyIDI4OEwzMiAyODh6YF19O2Z1bmN0aW9uIHlfKGUpe3ZhciB0LG4scj1gYDtpZih0eXBlb2YgZT09YHN0cmluZ2B8fHR5cGVvZiBlPT1gbnVtYmVyYClyKz1lO2Vsc2UgaWYodHlwZW9mIGU9PWBvYmplY3RgKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgaT1lLmxlbmd0aDtmb3IodD0wO3Q8aTt0KyspZVt0XSYmKG49eV8oZVt0XSkpJiYociYmKHIrPWAgYCkscis9bil9ZWxzZSBmb3IobiBpbiBlKWVbbl0mJihyJiYocis9YCBgKSxyKz1uKX1yZXR1cm4gcn1mdW5jdGlvbiBiXygpe2Zvcih2YXIgZSx0LG49MCxyPWBgLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKShlPWFyZ3VtZW50c1tuXSkmJih0PXlfKGUpKSYmKHImJihyKz1gIGApLHIrPXQpO3JldHVybiByfXZhciB4Xz1lPT50eXBlb2YgZT09YGJvb2xlYW5gP2Ake2V9YDplPT09MD9gMGA6ZSxTXz1iXyxDXz0oZSx0KT0+bj0+e2lmKHQ/LnZhcmlhbnRzPT1udWxsKXJldHVybiBTXyhlLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSk7bGV0e3ZhcmlhbnRzOnIsZGVmYXVsdFZhcmlhbnRzOml9PXQsYT1PYmplY3Qua2V5cyhyKS5tYXAoZT0+e2xldCB0PW4/LltlXSxhPWk/LltlXTtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtsZXQgbz14Xyh0KXx8eF8oYSk7cmV0dXJuIHJbZV1bb119KSxvPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgoZSx0KT0+e2xldFtuLHJdPXQ7cmV0dXJuIHI9PT12b2lkIDB8fChlW25dPXIpLGV9LHt9KTtyZXR1cm4gU18oZSxhLHQ/LmNvbXBvdW5kVmFyaWFudHM/LnJlZHVjZSgoZSx0KT0+e2xldHtjbGFzczpuLGNsYXNzTmFtZTpyLC4uLmF9PXQ7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGEpLmV2ZXJ5KGU9PntsZXRbdCxuXT1lO3JldHVybiBBcnJheS5pc0FycmF5KG4pP24uaW5jbHVkZXMoey4uLmksLi4ub31bdF0pOnsuLi5pLC4uLm99W3RdPT09bn0pP1suLi5lLG4scl06ZX0sW10pLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSl9LHdfPShlLHQpPT57bGV0IG49QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyluW2UubGVuZ3RoK3JdPXRbcl07cmV0dXJuIG59LFRfPShlLHQpPT4oe2NsYXNzR3JvdXBJZDplLHZhbGlkYXRvcjp0fSksRV89KGU9bmV3IE1hcCx0PW51bGwsbik9Pih7bmV4dFBhcnQ6ZSx2YWxpZGF0b3JzOnQsY2xhc3NHcm91cElkOm59KSxEXz1gLWAsT189W10sa189YGFyYml0cmFyeS4uYCxBXz1lPT57bGV0IHQ9Tl8oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtyZXR1cm57Z2V0Q2xhc3NHcm91cElkOmU9PntpZihlLnN0YXJ0c1dpdGgoYFtgKSYmZS5lbmRzV2l0aChgXWApKXJldHVybiBNXyhlKTtsZXQgbj1lLnNwbGl0KERfKTtyZXR1cm4gal8obiwrKG5bMF09PT1gYCYmbi5sZW5ndGg+MSksdCl9LGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczooZSx0KT0+e2lmKHQpe2xldCB0PXJbZV0saT1uW2VdO3JldHVybiB0P2k/d18oaSx0KTp0Oml8fE9ffXJldHVybiBuW2VdfHxPX319fSxqXz0oZSx0LG4pPT57aWYoZS5sZW5ndGgtdD09PTApcmV0dXJuIG4uY2xhc3NHcm91cElkO2xldCByPWVbdF0saT1uLm5leHRQYXJ0LmdldChyKTtpZihpKXtsZXQgbj1qXyhlLHQrMSxpKTtpZihuKXJldHVybiBufWxldCBhPW4udmFsaWRhdG9ycztpZihhPT09bnVsbClyZXR1cm47bGV0IG89dD09PTA/ZS5qb2luKERfKTplLnNsaWNlKHQpLmpvaW4oRF8pLHM9YS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxzO2UrKyl7bGV0IHQ9YVtlXTtpZih0LnZhbGlkYXRvcihvKSlyZXR1cm4gdC5jbGFzc0dyb3VwSWR9fSxNXz1lPT5lLnNsaWNlKDEsLTEpLmluZGV4T2YoYDpgKT09PS0xP3ZvaWQgMDooKCk9PntsZXQgdD1lLnNsaWNlKDEsLTEpLG49dC5pbmRleE9mKGA6YCkscj10LnNsaWNlKDAsbik7cmV0dXJuIHI/a18rcjp2b2lkIDB9KSgpLE5fPWU9PntsZXR7dGhlbWU6dCxjbGFzc0dyb3VwczpufT1lO3JldHVybiBQXyhuLHQpfSxQXz0oZSx0KT0+e2xldCBuPUVfKCk7Zm9yKGxldCByIGluIGUpe2xldCBpPWVbcl07Rl8oaSxuLHIsdCl9cmV0dXJuIG59LEZfPShlLHQsbixyKT0+e2xldCBpPWUubGVuZ3RoO2ZvcihsZXQgYT0wO2E8aTthKyspe2xldCBpPWVbYV07SV8oaSx0LG4scil9fSxJXz0oZSx0LG4scik9PntpZih0eXBlb2YgZT09YHN0cmluZ2Ape0xfKGUsdCxuKTtyZXR1cm59aWYodHlwZW9mIGU9PWBmdW5jdGlvbmApe1JfKGUsdCxuLHIpO3JldHVybn16XyhlLHQsbixyKX0sTF89KGUsdCxuKT0+e2xldCByPWU9PT1gYD90OkJfKHQsZSk7ci5jbGFzc0dyb3VwSWQ9bn0sUl89KGUsdCxuLHIpPT57aWYoVl8oZSkpe0ZfKGUociksdCxuLHIpO3JldHVybn10LnZhbGlkYXRvcnM9PT1udWxsJiYodC52YWxpZGF0b3JzPVtdKSx0LnZhbGlkYXRvcnMucHVzaChUXyhuLGUpKX0sel89KGUsdCxuLHIpPT57bGV0IGk9T2JqZWN0LmVudHJpZXMoZSksYT1pLmxlbmd0aDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtsZXRbYSxvXT1pW2VdO0ZfKG8sQl8odCxhKSxuLHIpfX0sQl89KGUsdCk9PntsZXQgbj1lLHI9dC5zcGxpdChEXyksaT1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgdD1yW2VdLGk9bi5uZXh0UGFydC5nZXQodCk7aXx8KGk9RV8oKSxuLm5leHRQYXJ0LnNldCh0LGkpKSxuPWl9cmV0dXJuIG59LFZfPWU9PmBpc1RoZW1lR2V0dGVyYGluIGUmJmUuaXNUaGVtZUdldHRlcj09PSEwLEhfPWU9PntpZihlPDEpcmV0dXJue2dldDooKT0+dm9pZCAwLHNldDooKT0+e319O2xldCB0PTAsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9T2JqZWN0LmNyZWF0ZShudWxsKSxpPShpLGEpPT57bltpXT1hLHQrKyx0PmUmJih0PTAscj1uLG49T2JqZWN0LmNyZWF0ZShudWxsKSl9O3JldHVybntnZXQoZSl7bGV0IHQ9bltlXTtpZih0IT09dm9pZCAwKXJldHVybiB0O2lmKCh0PXJbZV0pIT09dm9pZCAwKXJldHVybiBpKGUsdCksdH0sc2V0KGUsdCl7ZSBpbiBuP25bZV09dDppKGUsdCl9fX0sVV89YCFgLFdfPWA6YCxHXz1bXSxLXz0oZSx0LG4scixpKT0+KHttb2RpZmllcnM6ZSxoYXNJbXBvcnRhbnRNb2RpZmllcjp0LGJhc2VDbGFzc05hbWU6bixtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOnIsaXNFeHRlcm5hbDppfSkscV89ZT0+e2xldHtwcmVmaXg6dCxleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZTpufT1lLHI9ZT0+e2xldCB0PVtdLG49MCxyPTAsaT0wLGEsbz1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgbz1lW3NdO2lmKG49PT0wJiZyPT09MCl7aWYobz09PVdfKXt0LnB1c2goZS5zbGljZShpLHMpKSxpPXMrMTtjb250aW51ZX1pZihvPT09YC9gKXthPXM7Y29udGludWV9fW89PT1gW2A/bisrOm89PT1gXWA/bi0tOm89PT1gKGA/cisrOm89PT1gKWAmJnItLX1sZXQgcz10Lmxlbmd0aD09PTA/ZTplLnNsaWNlKGkpLGM9cyxsPSExO3MuZW5kc1dpdGgoVV8pPyhjPXMuc2xpY2UoMCwtMSksbD0hMCk6cy5zdGFydHNXaXRoKFVfKSYmKGM9cy5zbGljZSgxKSxsPSEwKTtsZXQgdT1hJiZhPmk/YS1pOnZvaWQgMDtyZXR1cm4gS18odCxsLGMsdSl9O2lmKHQpe2xldCBlPXQrV18sbj1yO3I9dD0+dC5zdGFydHNXaXRoKGUpP24odC5zbGljZShlLmxlbmd0aCkpOktfKEdfLCExLHQsdm9pZCAwLCEwKX1pZihuKXtsZXQgZT1yO3I9dD0+bih7Y2xhc3NOYW1lOnQscGFyc2VDbGFzc05hbWU6ZX0pfXJldHVybiByfSxKXz1lPT57bGV0IHQ9bmV3IE1hcDtyZXR1cm4gZS5vcmRlclNlbnNpdGl2ZU1vZGlmaWVycy5mb3JFYWNoKChlLG4pPT57dC5zZXQoZSwxZTYrbil9KSxlPT57bGV0IG49W10scj1bXTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IGE9ZVtpXSxvPWFbMF09PT1gW2Ascz10LmhhcyhhKTtvfHxzPyhyLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpLHI9W10pLG4ucHVzaChhKSk6ci5wdXNoKGEpfXJldHVybiByLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpKSxufX0sWV89ZT0+KHtjYWNoZTpIXyhlLmNhY2hlU2l6ZSkscGFyc2VDbGFzc05hbWU6cV8oZSksc29ydE1vZGlmaWVyczpKXyhlKSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpYXyhlKSwuLi5BXyhlKX0pLFhfPWU9PntsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLG49ZS5wb3N0Zml4TG9va3VwQ2xhc3NHcm91cHM7aWYobilmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyl0W25bZV1dPSEwO3JldHVybiB0fSxaXz0vXHMrLyxRXz0oZSx0KT0+e2xldHtwYXJzZUNsYXNzTmFtZTpuLGdldENsYXNzR3JvdXBJZDpyLGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczppLHNvcnRNb2RpZmllcnM6YSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpvfT10LHM9W10sYz1lLnRyaW0oKS5zcGxpdChaXyksbD1gYDtmb3IobGV0IGU9Yy5sZW5ndGgtMTtlPj0wOy0tZSl7bGV0IHQ9Y1tlXSx7aXNFeHRlcm5hbDp1LG1vZGlmaWVyczpkLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpwLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246bX09bih0KTtpZih1KXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9bGV0IGg9ISFtLGc7aWYoaCl7Zz1yKHAuc3Vic3RyaW5nKDAsbSkpO2xldCBlPWcmJm9bZ10/cihwKTp2b2lkIDA7ZSYmZSE9PWcmJihnPWUsaD0hMSl9ZWxzZSBnPXIocCk7aWYoIWcpe2lmKCFoKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aWYoZz1yKHApLCFnKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aD0hMX1sZXQgXz1kLmxlbmd0aD09PTA/YGA6ZC5sZW5ndGg9PT0xP2RbMF06YShkKS5qb2luKGA6YCksdj1mP18rVV86Xyx5PXYrZztpZihzLmluZGV4T2YoeSk+LTEpY29udGludWU7cy5wdXNoKHkpO2xldCBiPWkoZyxoKTtmb3IobGV0IGU9MDtlPGIubGVuZ3RoOysrZSl7bGV0IHQ9YltlXTtzLnB1c2godit0KX1sPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCl9cmV0dXJuIGx9LCRfPSguLi5lKT0+e2xldCB0PTAsbixyLGk9YGA7Zm9yKDt0PGUubGVuZ3RoOykobj1lW3QrK10pJiYocj1ldihuKSkmJihpJiYoaSs9YCBgKSxpKz1yKTtyZXR1cm4gaX0sZXY9ZT0+e2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTtsZXQgdCxuPWBgO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PWV2KGVbcl0pKSYmKG4mJihuKz1gIGApLG4rPXQpO3JldHVybiBufSx0dj0oZSwuLi50KT0+e2xldCBuLHIsaSxhLG89bz0+KG49WV8odC5yZWR1Y2UoKGUsdCk9PnQoZSksZSgpKSkscj1uLmNhY2hlLmdldCxpPW4uY2FjaGUuc2V0LGE9cyxzKG8pKSxzPWU9PntsZXQgdD1yKGUpO2lmKHQpcmV0dXJuIHQ7bGV0IGE9UV8oZSxuKTtyZXR1cm4gaShlLGEpLGF9O3JldHVybiBhPW8sKC4uLmUpPT5hKCRfKC4uLmUpKX0sbnY9W10scnY9ZT0+e2xldCB0PXQ9PnRbZV18fG52O3JldHVybiB0LmlzVGhlbWVHZXR0ZXI9ITAsdH0saXY9L15cWyg/Oihcd1tcdy1dKik6KT8oLispXF0kL2ksYXY9L15cKCg/Oihcd1tcdy1dKik6KT8oLispXCkkL2ksb3Y9L15cZCsoPzpcLlxkKyk/XC9cZCsoPzpcLlxkKyk/JC8sc3Y9L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxjdj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sbHY9L14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpfGNvbG9yLW1peClcKC4rXCkkLyx1dj0vXihpbnNldF8pPy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxkdj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvLGZ2PWU9Pm92LnRlc3QoZSksWT1lPT4hIWUmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKGUpKSxwdj1lPT4hIWUmJk51bWJlci5pc0ludGVnZXIoTnVtYmVyKGUpKSxtdj1lPT5lLmVuZHNXaXRoKGAlYCkmJlkoZS5zbGljZSgwLC0xKSksaHY9ZT0+c3YudGVzdChlKSxndj0oKT0+ITAsX3Y9ZT0+Y3YudGVzdChlKSYmIWx2LnRlc3QoZSksdnY9KCk9PiExLHl2PWU9PnV2LnRlc3QoZSksYnY9ZT0+ZHYudGVzdChlKSx4dj1lPT4hWChlKSYmIVooZSksU3Y9ZT0+ZS5zdGFydHNXaXRoKGBAY29udGFpbmVyYCkmJihlWzEwXT09PWAvYCYmZVsxMV0hPT12b2lkIDB8fGVbMTFdPT09YHNgJiZlWzE2XSE9PXZvaWQgMCYmZS5zdGFydHNXaXRoKGAtc2l6ZS9gLDEwKXx8ZVsxMV09PT1gbmAmJmVbMThdIT09dm9pZCAwJiZlLnN0YXJ0c1dpdGgoYC1ub3JtYWwvYCwxMCkpLEN2PWU9PlJ2KGUsSHYsdnYpLFg9ZT0+aXYudGVzdChlKSx3dj1lPT5SdihlLFV2LF92KSxUdj1lPT5SdihlLFd2LFkpLEV2PWU9PlJ2KGUsS3YsZ3YpLER2PWU9PlJ2KGUsR3YsdnYpLE92PWU9PlJ2KGUsQnYsdnYpLGt2PWU9PlJ2KGUsVnYsYnYpLEF2PWU9PlJ2KGUscXYseXYpLFo9ZT0+YXYudGVzdChlKSxqdj1lPT56dihlLFV2KSxNdj1lPT56dihlLEd2KSxOdj1lPT56dihlLEJ2KSxQdj1lPT56dihlLEh2KSxGdj1lPT56dihlLFZ2KSxJdj1lPT56dihlLHF2LCEwKSxMdj1lPT56dihlLEt2LCEwKSxSdj0oZSx0LG4pPT57bGV0IHI9aXYuZXhlYyhlKTtyZXR1cm4gcj9yWzFdP3QoclsxXSk6bihyWzJdKTohMX0senY9KGUsdCxuPSExKT0+e2xldCByPWF2LmV4ZWMoZSk7cmV0dXJuIHI/clsxXT90KHJbMV0pOm46ITF9LEJ2PWU9PmU9PT1gcG9zaXRpb25gfHxlPT09YHBlcmNlbnRhZ2VgLFZ2PWU9PmU9PT1gaW1hZ2VgfHxlPT09YHVybGAsSHY9ZT0+ZT09PWBsZW5ndGhgfHxlPT09YHNpemVgfHxlPT09YGJnLXNpemVgLFV2PWU9PmU9PT1gbGVuZ3RoYCxXdj1lPT5lPT09YG51bWJlcmAsR3Y9ZT0+ZT09PWBmYW1pbHktbmFtZWAsS3Y9ZT0+ZT09PWBudW1iZXJgfHxlPT09YHdlaWdodGAscXY9ZT0+ZT09PWBzaGFkb3dgLEp2PXR2KCgpPT57bGV0IGU9cnYoYGNvbG9yYCksdD1ydihgZm9udGApLG49cnYoYHRleHRgKSxyPXJ2KGBmb250LXdlaWdodGApLGk9cnYoYHRyYWNraW5nYCksYT1ydihgbGVhZGluZ2ApLG89cnYoYGJyZWFrcG9pbnRgKSxzPXJ2KGBjb250YWluZXJgKSxjPXJ2KGBzcGFjaW5nYCksbD1ydihgcmFkaXVzYCksdT1ydihgc2hhZG93YCksZD1ydihgaW5zZXQtc2hhZG93YCksZj1ydihgdGV4dC1zaGFkb3dgKSxwPXJ2KGBkcm9wLXNoYWRvd2ApLG09cnYoYGJsdXJgKSxoPXJ2KGBwZXJzcGVjdGl2ZWApLGc9cnYoYGFzcGVjdGApLF89cnYoYGVhc2VgKSx2PXJ2KGBhbmltYXRlYCkseT0oKT0+W2BhdXRvYCxgYXZvaWRgLGBhbGxgLGBhdm9pZC1wYWdlYCxgcGFnZWAsYGxlZnRgLGByaWdodGAsYGNvbHVtbmBdLGI9KCk9PltgY2VudGVyYCxgdG9wYCxgYm90dG9tYCxgbGVmdGAsYHJpZ2h0YCxgdG9wLWxlZnRgLGBsZWZ0LXRvcGAsYHRvcC1yaWdodGAsYHJpZ2h0LXRvcGAsYGJvdHRvbS1yaWdodGAsYHJpZ2h0LWJvdHRvbWAsYGJvdHRvbS1sZWZ0YCxgbGVmdC1ib3R0b21gXSx4PSgpPT5bLi4uYigpLFosWF0sUz0oKT0+W2BhdXRvYCxgaGlkZGVuYCxgY2xpcGAsYHZpc2libGVgLGBzY3JvbGxgXSxDPSgpPT5bYGF1dG9gLGBjb250YWluYCxgbm9uZWBdLHc9KCk9PltaLFgsY10sZWU9KCk9PltmdixgZnVsbGAsYGF1dG9gLC4uLncoKV0sdGU9KCk9Pltwdixgbm9uZWAsYHN1YmdyaWRgLFosWF0sVD0oKT0+W2BhdXRvYCx7c3BhbjpbYGZ1bGxgLHB2LFosWF19LHB2LFosWF0sbmU9KCk9PltwdixgYXV0b2AsWixYXSxyZT0oKT0+W2BhdXRvYCxgbWluYCxgbWF4YCxgZnJgLFosWF0saWU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBiZXR3ZWVuYCxgYXJvdW5kYCxgZXZlbmx5YCxgc3RyZXRjaGAsYGJhc2VsaW5lYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLEU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBzdHJldGNoYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLGFlPSgpPT5bYGF1dG9gLC4uLncoKV0sb2U9KCk9PltmdixgYXV0b2AsYGZ1bGxgLGBkdndgLGBkdmhgLGBsdndgLGBsdmhgLGBzdndgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sc2U9KCk9Pltmdixgc2NyZWVuYCxgZnVsbGAsYGR2d2AsYGx2d2AsYHN2d2AsYG1pbmAsYG1heGAsYGZpdGAsLi4udygpXSxjZT0oKT0+W2Z2LGBzY3JlZW5gLGBmdWxsYCxgbGhgLGBkdmhgLGBsdmhgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sRD0oKT0+W2UsWixYXSxsZT0oKT0+Wy4uLmIoKSxOdixPdix7cG9zaXRpb246W1osWF19XSx1ZT0oKT0+W2Buby1yZXBlYXRgLHtyZXBlYXQ6W2BgLGB4YCxgeWAsYHNwYWNlYCxgcm91bmRgXX1dLGRlPSgpPT5bYGF1dG9gLGBjb3ZlcmAsYGNvbnRhaW5gLFB2LEN2LHtzaXplOltaLFhdfV0sZmU9KCk9Plttdixqdix3dl0scGU9KCk9PltgYCxgbm9uZWAsYGZ1bGxgLGwsWixYXSxtZT0oKT0+W2BgLFksanYsd3ZdLGhlPSgpPT5bYHNvbGlkYCxgZGFzaGVkYCxgZG90dGVkYCxgZG91YmxlYF0sZ2U9KCk9Pltgbm9ybWFsYCxgbXVsdGlwbHlgLGBzY3JlZW5gLGBvdmVybGF5YCxgZGFya2VuYCxgbGlnaHRlbmAsYGNvbG9yLWRvZGdlYCxgY29sb3ItYnVybmAsYGhhcmQtbGlnaHRgLGBzb2Z0LWxpZ2h0YCxgZGlmZmVyZW5jZWAsYGV4Y2x1c2lvbmAsYGh1ZWAsYHNhdHVyYXRpb25gLGBjb2xvcmAsYGx1bWlub3NpdHlgXSxfZT0oKT0+W1ksbXYsTnYsT3ZdLHZlPSgpPT5bYGAsYG5vbmVgLG0sWixYXSx5ZT0oKT0+W2Bub25lYCxZLFosWF0sYmU9KCk9Pltgbm9uZWAsWSxaLFhdLE89KCk9PltZLFosWF0seGU9KCk9PltmdixgZnVsbGAsLi4udygpXTtyZXR1cm57Y2FjaGVTaXplOjUwMCx0aGVtZTp7YW5pbWF0ZTpbYHNwaW5gLGBwaW5nYCxgcHVsc2VgLGBib3VuY2VgXSxhc3BlY3Q6W2B2aWRlb2BdLGJsdXI6W2h2XSxicmVha3BvaW50Oltodl0sY29sb3I6W2d2XSxjb250YWluZXI6W2h2XSwiZHJvcC1zaGFkb3ciOltodl0sZWFzZTpbYGluYCxgb3V0YCxgaW4tb3V0YF0sZm9udDpbeHZdLCJmb250LXdlaWdodCI6W2B0aGluYCxgZXh0cmFsaWdodGAsYGxpZ2h0YCxgbm9ybWFsYCxgbWVkaXVtYCxgc2VtaWJvbGRgLGBib2xkYCxgZXh0cmFib2xkYCxgYmxhY2tgXSwiaW5zZXQtc2hhZG93IjpbaHZdLGxlYWRpbmc6W2Bub25lYCxgdGlnaHRgLGBzbnVnYCxgbm9ybWFsYCxgcmVsYXhlZGAsYGxvb3NlYF0scGVyc3BlY3RpdmU6W2BkcmFtYXRpY2AsYG5lYXJgLGBub3JtYWxgLGBtaWRyYW5nZWAsYGRpc3RhbnRgLGBub25lYF0scmFkaXVzOltodl0sc2hhZG93Oltodl0sc3BhY2luZzpbYHB4YCxZXSx0ZXh0Oltodl0sInRleHQtc2hhZG93IjpbaHZdLHRyYWNraW5nOltgdGlnaHRlcmAsYHRpZ2h0YCxgbm9ybWFsYCxgd2lkZWAsYHdpZGVyYCxgd2lkZXN0YF19LGNsYXNzR3JvdXBzOnthc3BlY3Q6W3thc3BlY3Q6W2BhdXRvYCxgc3F1YXJlYCxmdixYLFosZ119XSxjb250YWluZXI6W2Bjb250YWluZXJgXSwiY29udGFpbmVyLXR5cGUiOlt7IkBjb250YWluZXIiOltgYCxgbm9ybWFsYCxgc2l6ZWAsWixYXX1dLCJjb250YWluZXItbmFtZWQiOltTdl0sY29sdW1uczpbe2NvbHVtbnM6W1ksWCxaLHNdfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6eSgpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjp5KCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOltgYXV0b2AsYGF2b2lkYCxgYXZvaWQtcGFnZWAsYGF2b2lkLWNvbHVtbmBdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6W2BzbGljZWAsYGNsb25lYF19XSxib3g6W3tib3g6W2Bib3JkZXJgLGBjb250ZW50YF19XSxkaXNwbGF5OltgYmxvY2tgLGBpbmxpbmUtYmxvY2tgLGBpbmxpbmVgLGBmbGV4YCxgaW5saW5lLWZsZXhgLGB0YWJsZWAsYGlubGluZS10YWJsZWAsYHRhYmxlLWNhcHRpb25gLGB0YWJsZS1jZWxsYCxgdGFibGUtY29sdW1uYCxgdGFibGUtY29sdW1uLWdyb3VwYCxgdGFibGUtZm9vdGVyLWdyb3VwYCxgdGFibGUtaGVhZGVyLWdyb3VwYCxgdGFibGUtcm93LWdyb3VwYCxgdGFibGUtcm93YCxgZmxvdy1yb290YCxgZ3JpZGAsYGlubGluZS1ncmlkYCxgY29udGVudHNgLGBsaXN0LWl0ZW1gLGBoaWRkZW5gXSxzcjpbYHNyLW9ubHlgLGBub3Qtc3Itb25seWBdLGZsb2F0Olt7ZmxvYXQ6W2ByaWdodGAsYGxlZnRgLGBub25lYCxgc3RhcnRgLGBlbmRgXX1dLGNsZWFyOlt7Y2xlYXI6W2BsZWZ0YCxgcmlnaHRgLGBib3RoYCxgbm9uZWAsYHN0YXJ0YCxgZW5kYF19XSxpc29sYXRpb246W2Bpc29sYXRlYCxgaXNvbGF0aW9uLWF1dG9gXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6W2Bjb250YWluYCxgY292ZXJgLGBmaWxsYCxgbm9uZWAsYHNjYWxlLWRvd25gXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OngoKX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UygpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlMoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpTKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpDKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOkMoKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6QygpfV0scG9zaXRpb246W2BzdGF0aWNgLGBmaXhlZGAsYGFic29sdXRlYCxgcmVsYXRpdmVgLGBzdGlja3lgXSxpbnNldDpbe2luc2V0OmVlKCl9XSwiaW5zZXQteCI6W3siaW5zZXQteCI6ZWUoKX1dLCJpbnNldC15IjpbeyJpbnNldC15IjplZSgpfV0sc3RhcnQ6W3siaW5zZXQtcyI6ZWUoKSxzdGFydDplZSgpfV0sZW5kOlt7Imluc2V0LWUiOmVlKCksZW5kOmVlKCl9XSwiaW5zZXQtYnMiOlt7Imluc2V0LWJzIjplZSgpfV0sImluc2V0LWJlIjpbeyJpbnNldC1iZSI6ZWUoKX1dLHRvcDpbe3RvcDplZSgpfV0scmlnaHQ6W3tyaWdodDplZSgpfV0sYm90dG9tOlt7Ym90dG9tOmVlKCl9XSxsZWZ0Olt7bGVmdDplZSgpfV0sdmlzaWJpbGl0eTpbYHZpc2libGVgLGBpbnZpc2libGVgLGBjb2xsYXBzZWBdLHo6W3t6OltwdixgYXV0b2AsWixYXX1dLGJhc2lzOlt7YmFzaXM6W2Z2LGBmdWxsYCxgYXV0b2AscywuLi53KCldfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6W2Byb3dgLGByb3ctcmV2ZXJzZWAsYGNvbGAsYGNvbC1yZXZlcnNlYF19XSwiZmxleC13cmFwIjpbe2ZsZXg6W2Bub3dyYXBgLGB3cmFwYCxgd3JhcC1yZXZlcnNlYF19XSxmbGV4Olt7ZmxleDpbWSxmdixgYXV0b2AsYGluaXRpYWxgLGBub25lYCxYXX1dLGdyb3c6W3tncm93OltgYCxZLFosWF19XSxzaHJpbms6W3tzaHJpbms6W2BgLFksWixYXX1dLG9yZGVyOlt7b3JkZXI6W3B2LGBmaXJzdGAsYGxhc3RgLGBub25lYCxaLFhdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjp0ZSgpfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlQoKX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6bmUoKX1dLCJjb2wtZW5kIjpbeyJjb2wtZW5kIjpuZSgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjp0ZSgpfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlQoKX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6bmUoKX1dLCJyb3ctZW5kIjpbeyJyb3ctZW5kIjpuZSgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbYHJvd2AsYGNvbGAsYGRlbnNlYCxgcm93LWRlbnNlYCxgY29sLWRlbnNlYF19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOnJlKCl9XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOnJlKCl9XSxnYXA6W3tnYXA6dygpfV0sImdhcC14IjpbeyJnYXAteCI6dygpfV0sImdhcC15IjpbeyJnYXAteSI6dygpfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5OlsuLi5pZSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbLi4uRSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LXNlbGYiOlt7Imp1c3RpZnktc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbYG5vcm1hbGAsLi4uaWUoKV19XSwiYWxpZ24taXRlbXMiOlt7aXRlbXM6Wy4uLkUoKSx7YmFzZWxpbmU6W2BgLGBsYXN0YF19XX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6W2BhdXRvYCwuLi5FKCkse2Jhc2VsaW5lOltgYCxgbGFzdGBdfV19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6aWUoKX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsuLi5FKCksYGJhc2VsaW5lYF19XSwicGxhY2Utc2VsZiI6W3sicGxhY2Utc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0scDpbe3A6dygpfV0scHg6W3tweDp3KCl9XSxweTpbe3B5OncoKX1dLHBzOlt7cHM6dygpfV0scGU6W3twZTp3KCl9XSxwYnM6W3twYnM6dygpfV0scGJlOlt7cGJlOncoKX1dLHB0Olt7cHQ6dygpfV0scHI6W3twcjp3KCl9XSxwYjpbe3BiOncoKX1dLHBsOlt7cGw6dygpfV0sbTpbe206YWUoKX1dLG14Olt7bXg6YWUoKX1dLG15Olt7bXk6YWUoKX1dLG1zOlt7bXM6YWUoKX1dLG1lOlt7bWU6YWUoKX1dLG1iczpbe21iczphZSgpfV0sbWJlOlt7bWJlOmFlKCl9XSxtdDpbe210OmFlKCl9XSxtcjpbe21yOmFlKCl9XSxtYjpbe21iOmFlKCl9XSxtbDpbe21sOmFlKCl9XSwic3BhY2UteCI6W3sic3BhY2UteCI6dygpfV0sInNwYWNlLXgtcmV2ZXJzZSI6W2BzcGFjZS14LXJldmVyc2VgXSwic3BhY2UteSI6W3sic3BhY2UteSI6dygpfV0sInNwYWNlLXktcmV2ZXJzZSI6W2BzcGFjZS15LXJldmVyc2VgXSxzaXplOlt7c2l6ZTpvZSgpfV0sImlubGluZS1zaXplIjpbe2lubGluZTpbYGF1dG9gLC4uLnNlKCldfV0sIm1pbi1pbmxpbmUtc2l6ZSI6W3sibWluLWlubGluZSI6W2BhdXRvYCwuLi5zZSgpXX1dLCJtYXgtaW5saW5lLXNpemUiOlt7Im1heC1pbmxpbmUiOltgbm9uZWAsLi4uc2UoKV19XSwiYmxvY2stc2l6ZSI6W3tibG9jazpbYGF1dG9gLC4uLmNlKCldfV0sIm1pbi1ibG9jay1zaXplIjpbeyJtaW4tYmxvY2siOltgYXV0b2AsLi4uY2UoKV19XSwibWF4LWJsb2NrLXNpemUiOlt7Im1heC1ibG9jayI6W2Bub25lYCwuLi5jZSgpXX1dLHc6W3t3OltzLGBzY3JlZW5gLC4uLm9lKCldfV0sIm1pbi13IjpbeyJtaW4tdyI6W3MsYHNjcmVlbmAsYG5vbmVgLC4uLm9lKCldfV0sIm1heC13IjpbeyJtYXgtdyI6W3MsYHNjcmVlbmAsYG5vbmVgLGBwcm9zZWAse3NjcmVlbjpbb119LC4uLm9lKCldfV0saDpbe2g6W2BzY3JlZW5gLGBsaGAsLi4ub2UoKV19XSwibWluLWgiOlt7Im1pbi1oIjpbYHNjcmVlbmAsYGxoYCxgbm9uZWAsLi4ub2UoKV19XSwibWF4LWgiOlt7Im1heC1oIjpbYHNjcmVlbmAsYGxoYCwuLi5vZSgpXX1dLCJmb250LXNpemUiOlt7dGV4dDpbYGJhc2VgLG4sanYsd3ZdfV0sImZvbnQtc21vb3RoaW5nIjpbYGFudGlhbGlhc2VkYCxgc3VicGl4ZWwtYW50aWFsaWFzZWRgXSwiZm9udC1zdHlsZSI6W2BpdGFsaWNgLGBub3QtaXRhbGljYF0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6W3IsTHYsRXZdfV0sImZvbnQtc3RyZXRjaCI6W3siZm9udC1zdHJldGNoIjpbYHVsdHJhLWNvbmRlbnNlZGAsYGV4dHJhLWNvbmRlbnNlZGAsYGNvbmRlbnNlZGAsYHNlbWktY29uZGVuc2VkYCxgbm9ybWFsYCxgc2VtaS1leHBhbmRlZGAsYGV4cGFuZGVkYCxgZXh0cmEtZXhwYW5kZWRgLGB1bHRyYS1leHBhbmRlZGAsbXYsWF19XSwiZm9udC1mYW1pbHkiOlt7Zm9udDpbTXYsRHYsdF19XSwiZm9udC1mZWF0dXJlcyI6W3siZm9udC1mZWF0dXJlcyI6W1hdfV0sImZ2bi1ub3JtYWwiOltgbm9ybWFsLW51bXNgXSwiZnZuLW9yZGluYWwiOltgb3JkaW5hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYHNsYXNoZWQtemVyb2BdLCJmdm4tZmlndXJlIjpbYGxpbmluZy1udW1zYCxgb2xkc3R5bGUtbnVtc2BdLCJmdm4tc3BhY2luZyI6W2Bwcm9wb3J0aW9uYWwtbnVtc2AsYHRhYnVsYXItbnVtc2BdLCJmdm4tZnJhY3Rpb24iOltgZGlhZ29uYWwtZnJhY3Rpb25zYCxgc3RhY2tlZC1mcmFjdGlvbnNgXSx0cmFja2luZzpbe3RyYWNraW5nOltpLFosWF19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6W1ksYG5vbmVgLFosVHZdfV0sbGVhZGluZzpbe2xlYWRpbmc6W2EsLi4udygpXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbYG5vbmVgLFosWF19XSwibGlzdC1zdHlsZS1wb3NpdGlvbiI6W3tsaXN0OltgaW5zaWRlYCxgb3V0c2lkZWBdfV0sImxpc3Qtc3R5bGUtdHlwZSI6W3tsaXN0OltgZGlzY2AsYGRlY2ltYWxgLGBub25lYCxaLFhdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6W2BsZWZ0YCxgY2VudGVyYCxgcmlnaHRgLGBqdXN0aWZ5YCxgc3RhcnRgLGBlbmRgXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpEKCl9XSwidGV4dC1jb2xvciI6W3t0ZXh0OkQoKX1dLCJ0ZXh0LWRlY29yYXRpb24iOltgdW5kZXJsaW5lYCxgb3ZlcmxpbmVgLGBsaW5lLXRocm91Z2hgLGBuby11bmRlcmxpbmVgXSwidGV4dC1kZWNvcmF0aW9uLXN0eWxlIjpbe2RlY29yYXRpb246Wy4uLmhlKCksYHdhdnlgXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246W1ksYGZyb20tZm9udGAsYGF1dG9gLFosd3ZdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOkQoKX1dLCJ1bmRlcmxpbmUtb2Zmc2V0IjpbeyJ1bmRlcmxpbmUtb2Zmc2V0IjpbWSxgYXV0b2AsWixYXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6W2B1cHBlcmNhc2VgLGBsb3dlcmNhc2VgLGBjYXBpdGFsaXplYCxgbm9ybWFsLWNhc2VgXSwidGV4dC1vdmVyZmxvdyI6W2B0cnVuY2F0ZWAsYHRleHQtZWxsaXBzaXNgLGB0ZXh0LWNsaXBgXSwidGV4dC13cmFwIjpbe3RleHQ6W2B3cmFwYCxgbm93cmFwYCxgYmFsYW5jZWAsYHByZXR0eWBdfV0saW5kZW50Olt7aW5kZW50OncoKX1dLCJ0YWItc2l6ZSI6W3t0YWI6W3B2LFosWF19XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246W2BiYXNlbGluZWAsYHRvcGAsYG1pZGRsZWAsYGJvdHRvbWAsYHRleHQtdG9wYCxgdGV4dC1ib3R0b21gLGBzdWJgLGBzdXBlcmAsWixYXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOltgbm9ybWFsYCxgbm93cmFwYCxgcHJlYCxgcHJlLWxpbmVgLGBwcmUtd3JhcGAsYGJyZWFrLXNwYWNlc2BdfV0sYnJlYWs6W3ticmVhazpbYG5vcm1hbGAsYHdvcmRzYCxgYWxsYCxga2VlcGBdfV0sd3JhcDpbe3dyYXA6W2BicmVhay13b3JkYCxgYW55d2hlcmVgLGBub3JtYWxgXX1dLGh5cGhlbnM6W3toeXBoZW5zOltgbm9uZWAsYG1hbnVhbGAsYGF1dG9gXX1dLGNvbnRlbnQ6W3tjb250ZW50Oltgbm9uZWAsWixYXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOltgZml4ZWRgLGBsb2NhbGAsYHNjcm9sbGBdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGB0ZXh0YF19XSwiYmctb3JpZ2luIjpbeyJiZy1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgXX1dLCJiZy1wb3NpdGlvbiI6W3tiZzpsZSgpfV0sImJnLXJlcGVhdCI6W3tiZzp1ZSgpfV0sImJnLXNpemUiOlt7Ymc6ZGUoKX1dLCJiZy1pbWFnZSI6W3tiZzpbYG5vbmVgLHtsaW5lYXI6W3t0bzpbYHRgLGB0cmAsYHJgLGBicmAsYGJgLGBibGAsYGxgLGB0bGBdfSxwdixaLFhdLHJhZGlhbDpbYGAsWixYXSxjb25pYzpbcHYsWixYXX0sRnYsa3ZdfV0sImJnLWNvbG9yIjpbe2JnOkQoKX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOmZlKCl9XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6ZmUoKX1dLCJncmFkaWVudC10by1wb3MiOlt7dG86ZmUoKX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206RCgpfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6RCgpfV0sImdyYWRpZW50LXRvIjpbe3RvOkQoKX1dLHJvdW5kZWQ6W3tyb3VuZGVkOnBlKCl9XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOnBlKCl9XSwicm91bmRlZC1lIjpbeyJyb3VuZGVkLWUiOnBlKCl9XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOnBlKCl9XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOnBlKCl9XSwicm91bmRlZC1iIjpbeyJyb3VuZGVkLWIiOnBlKCl9XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOnBlKCl9XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6cGUoKX1dLCJyb3VuZGVkLXNlIjpbeyJyb3VuZGVkLXNlIjpwZSgpfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOnBlKCl9XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6cGUoKX1dLCJyb3VuZGVkLXRsIjpbeyJyb3VuZGVkLXRsIjpwZSgpfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOnBlKCl9XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6cGUoKX1dLCJyb3VuZGVkLWJsIjpbeyJyb3VuZGVkLWJsIjpwZSgpfV0sImJvcmRlci13Ijpbe2JvcmRlcjptZSgpfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14IjptZSgpfV0sImJvcmRlci13LXkiOlt7ImJvcmRlci15IjptZSgpfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjptZSgpfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjptZSgpfV0sImJvcmRlci13LWJzIjpbeyJib3JkZXItYnMiOm1lKCl9XSwiYm9yZGVyLXctYmUiOlt7ImJvcmRlci1iZSI6bWUoKX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6bWUoKX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6bWUoKX1dLCJib3JkZXItdy1iIjpbeyJib3JkZXItYiI6bWUoKX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6bWUoKX1dLCJkaXZpZGUteCI6W3siZGl2aWRlLXgiOm1lKCl9XSwiZGl2aWRlLXgtcmV2ZXJzZSI6W2BkaXZpZGUteC1yZXZlcnNlYF0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6bWUoKX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbYGRpdmlkZS15LXJldmVyc2VgXSwiYm9yZGVyLXN0eWxlIjpbe2JvcmRlcjpbLi4uaGUoKSxgaGlkZGVuYCxgbm9uZWBdfV0sImRpdmlkZS1zdHlsZSI6W3tkaXZpZGU6Wy4uLmhlKCksYGhpZGRlbmAsYG5vbmVgXX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOkQoKX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOkQoKX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOkQoKX1dLCJib3JkZXItY29sb3ItcyI6W3siYm9yZGVyLXMiOkQoKX1dLCJib3JkZXItY29sb3ItZSI6W3siYm9yZGVyLWUiOkQoKX1dLCJib3JkZXItY29sb3ItYnMiOlt7ImJvcmRlci1icyI6RCgpfV0sImJvcmRlci1jb2xvci1iZSI6W3siYm9yZGVyLWJlIjpEKCl9XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10IjpEKCl9XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpEKCl9XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpEKCl9XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsuLi5oZSgpLGBub25lYCxgaGlkZGVuYF19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbWSxaLFhdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltgYCxZLGp2LHd2XX1dLCJvdXRsaW5lLWNvbG9yIjpbe291dGxpbmU6RCgpfV0sc2hhZG93Olt7c2hhZG93OltgYCxgbm9uZWAsdSxJdixBdl19XSwic2hhZG93LWNvbG9yIjpbe3NoYWRvdzpEKCl9XSwiaW5zZXQtc2hhZG93IjpbeyJpbnNldC1zaGFkb3ciOltgbm9uZWAsZCxJdixBdl19XSwiaW5zZXQtc2hhZG93LWNvbG9yIjpbeyJpbnNldC1zaGFkb3ciOkQoKX1dLCJyaW5nLXciOlt7cmluZzptZSgpfV0sInJpbmctdy1pbnNldCI6W2ByaW5nLWluc2V0YF0sInJpbmctY29sb3IiOlt7cmluZzpEKCl9XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltZLHd2XX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOkQoKX1dLCJpbnNldC1yaW5nLXciOlt7Imluc2V0LXJpbmciOm1lKCl9XSwiaW5zZXQtcmluZy1jb2xvciI6W3siaW5zZXQtcmluZyI6RCgpfV0sInRleHQtc2hhZG93IjpbeyJ0ZXh0LXNoYWRvdyI6W2Bub25lYCxmLEl2LEF2XX1dLCJ0ZXh0LXNoYWRvdy1jb2xvciI6W3sidGV4dC1zaGFkb3ciOkQoKX1dLG9wYWNpdHk6W3tvcGFjaXR5OltZLFosWF19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOlsuLi5nZSgpLGBwbHVzLWRhcmtlcmAsYHBsdXMtbGlnaHRlcmBdfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6Z2UoKX1dLCJtYXNrLWNsaXAiOlt7Im1hc2stY2xpcCI6W2Bib3JkZXJgLGBwYWRkaW5nYCxgY29udGVudGAsYGZpbGxgLGBzdHJva2VgLGB2aWV3YF19LGBtYXNrLW5vLWNsaXBgXSwibWFzay1jb21wb3NpdGUiOlt7bWFzazpbYGFkZGAsYHN1YnRyYWN0YCxgaW50ZXJzZWN0YCxgZXhjbHVkZWBdfV0sIm1hc2staW1hZ2UtbGluZWFyLXBvcyI6W3sibWFzay1saW5lYXIiOltZXX1dLCJtYXNrLWltYWdlLWxpbmVhci1mcm9tLXBvcyI6W3sibWFzay1saW5lYXItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1wb3MiOlt7Im1hc2stbGluZWFyLXRvIjpfZSgpfV0sIm1hc2staW1hZ2UtbGluZWFyLWZyb20tY29sb3IiOlt7Im1hc2stbGluZWFyLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1jb2xvciI6W3sibWFzay1saW5lYXItdG8iOkQoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1wb3MiOlt7Im1hc2stdC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtdC10by1wb3MiOlt7Im1hc2stdC10byI6X2UoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1jb2xvciI6W3sibWFzay10LWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXQtdG8tY29sb3IiOlt7Im1hc2stdC10byI6RCgpfV0sIm1hc2staW1hZ2Utci1mcm9tLXBvcyI6W3sibWFzay1yLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1yLXRvLXBvcyI6W3sibWFzay1yLXRvIjpfZSgpfV0sIm1hc2staW1hZ2Utci1mcm9tLWNvbG9yIjpbeyJtYXNrLXItZnJvbSI6RCgpfV0sIm1hc2staW1hZ2Utci10by1jb2xvciI6W3sibWFzay1yLXRvIjpEKCl9XSwibWFzay1pbWFnZS1iLWZyb20tcG9zIjpbeyJtYXNrLWItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWItdG8tcG9zIjpbeyJtYXNrLWItdG8iOl9lKCl9XSwibWFzay1pbWFnZS1iLWZyb20tY29sb3IiOlt7Im1hc2stYi1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS1iLXRvLWNvbG9yIjpbeyJtYXNrLWItdG8iOkQoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1wb3MiOlt7Im1hc2stbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtbC10by1wb3MiOlt7Im1hc2stbC10byI6X2UoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1jb2xvciI6W3sibWFzay1sLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWwtdG8tY29sb3IiOlt7Im1hc2stbC10byI6RCgpfV0sIm1hc2staW1hZ2UteC1mcm9tLXBvcyI6W3sibWFzay14LWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS14LXRvLXBvcyI6W3sibWFzay14LXRvIjpfZSgpfV0sIm1hc2staW1hZ2UteC1mcm9tLWNvbG9yIjpbeyJtYXNrLXgtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UteC10by1jb2xvciI6W3sibWFzay14LXRvIjpEKCl9XSwibWFzay1pbWFnZS15LWZyb20tcG9zIjpbeyJtYXNrLXktZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLXktdG8tcG9zIjpbeyJtYXNrLXktdG8iOl9lKCl9XSwibWFzay1pbWFnZS15LWZyb20tY29sb3IiOlt7Im1hc2steS1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS15LXRvLWNvbG9yIjpbeyJtYXNrLXktdG8iOkQoKX1dLCJtYXNrLWltYWdlLXJhZGlhbCI6W3sibWFzay1yYWRpYWwiOltaLFhdfV0sIm1hc2staW1hZ2UtcmFkaWFsLWZyb20tcG9zIjpbeyJtYXNrLXJhZGlhbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLXBvcyI6W3sibWFzay1yYWRpYWwtdG8iOl9lKCl9XSwibWFzay1pbWFnZS1yYWRpYWwtZnJvbS1jb2xvciI6W3sibWFzay1yYWRpYWwtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLWNvbG9yIjpbeyJtYXNrLXJhZGlhbC10byI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXNoYXBlIjpbeyJtYXNrLXJhZGlhbCI6W2BjaXJjbGVgLGBlbGxpcHNlYF19XSwibWFzay1pbWFnZS1yYWRpYWwtc2l6ZSI6W3sibWFzay1yYWRpYWwiOlt7Y2xvc2VzdDpbYHNpZGVgLGBjb3JuZXJgXSxmYXJ0aGVzdDpbYHNpZGVgLGBjb3JuZXJgXX1dfV0sIm1hc2staW1hZ2UtcmFkaWFsLXBvcyI6W3sibWFzay1yYWRpYWwtYXQiOmIoKX1dLCJtYXNrLWltYWdlLWNvbmljLXBvcyI6W3sibWFzay1jb25pYyI6W1ldfV0sIm1hc2staW1hZ2UtY29uaWMtZnJvbS1wb3MiOlt7Im1hc2stY29uaWMtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLXRvLXBvcyI6W3sibWFzay1jb25pYy10byI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLWZyb20tY29sb3IiOlt7Im1hc2stY29uaWMtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtY29uaWMtdG8tY29sb3IiOlt7Im1hc2stY29uaWMtdG8iOkQoKX1dLCJtYXNrLW1vZGUiOlt7bWFzazpbYGFscGhhYCxgbHVtaW5hbmNlYCxgbWF0Y2hgXX1dLCJtYXNrLW9yaWdpbiI6W3sibWFzay1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGBmaWxsYCxgc3Ryb2tlYCxgdmlld2BdfV0sIm1hc2stcG9zaXRpb24iOlt7bWFzazpsZSgpfV0sIm1hc2stcmVwZWF0Ijpbe21hc2s6dWUoKX1dLCJtYXNrLXNpemUiOlt7bWFzazpkZSgpfV0sIm1hc2stdHlwZSI6W3sibWFzay10eXBlIjpbYGFscGhhYCxgbHVtaW5hbmNlYF19XSwibWFzay1pbWFnZSI6W3ttYXNrOltgbm9uZWAsWixYXX1dLGZpbHRlcjpbe2ZpbHRlcjpbYGAsYG5vbmVgLFosWF19XSxibHVyOlt7Ymx1cjp2ZSgpfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W1ksWixYXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W1ksWixYXX1dLCJkcm9wLXNoYWRvdyI6W3siZHJvcC1zaGFkb3ciOltgYCxgbm9uZWAscCxJdixBdl19XSwiZHJvcC1zaGFkb3ctY29sb3IiOlt7ImRyb3Atc2hhZG93IjpEKCl9XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W2BgLFksWixYXX1dLCJodWUtcm90YXRlIjpbeyJodWUtcm90YXRlIjpbWSxaLFhdfV0saW52ZXJ0Olt7aW52ZXJ0OltgYCxZLFosWF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOltZLFosWF19XSxzZXBpYTpbe3NlcGlhOltgYCxZLFosWF19XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOltgYCxgbm9uZWAsWixYXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjp2ZSgpfV0sImJhY2tkcm9wLWJyaWdodG5lc3MiOlt7ImJhY2tkcm9wLWJyaWdodG5lc3MiOltZLFosWF19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbWSxaLFhdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbYGAsWSxaLFhdfV0sImJhY2tkcm9wLWh1ZS1yb3RhdGUiOlt7ImJhY2tkcm9wLWh1ZS1yb3RhdGUiOltZLFosWF19XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltgYCxZLFosWF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W1ksWixYXX1dLCJiYWNrZHJvcC1zYXR1cmF0ZSI6W3siYmFja2Ryb3Atc2F0dXJhdGUiOltZLFosWF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpbYGAsWSxaLFhdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6W2Bjb2xsYXBzZWAsYHNlcGFyYXRlYF19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjp3KCl9XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6dygpfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOncoKX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6W2BhdXRvYCxgZml4ZWRgXX1dLGNhcHRpb246W3tjYXB0aW9uOltgdG9wYCxgYm90dG9tYF19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbYGAsYGFsbGAsYGNvbG9yc2AsYG9wYWNpdHlgLGBzaGFkb3dgLGB0cmFuc2Zvcm1gLGBub25lYCxaLFhdfV0sInRyYW5zaXRpb24tYmVoYXZpb3IiOlt7dHJhbnNpdGlvbjpbYG5vcm1hbGAsYGRpc2NyZXRlYF19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOltZLGBpbml0aWFsYCxaLFhdfV0sZWFzZTpbe2Vhc2U6W2BsaW5lYXJgLGBpbml0aWFsYCxfLFosWF19XSxkZWxheTpbe2RlbGF5OltZLFosWF19XSxhbmltYXRlOlt7YW5pbWF0ZTpbYG5vbmVgLHYsWixYXX1dLGJhY2tmYWNlOlt7YmFja2ZhY2U6W2BoaWRkZW5gLGB2aXNpYmxlYF19XSxwZXJzcGVjdGl2ZTpbe3BlcnNwZWN0aXZlOltoLFosWF19XSwicGVyc3BlY3RpdmUtb3JpZ2luIjpbeyJwZXJzcGVjdGl2ZS1vcmlnaW4iOngoKX1dLHJvdGF0ZTpbe3JvdGF0ZTp5ZSgpfV0sInJvdGF0ZS14IjpbeyJyb3RhdGUteCI6eWUoKX1dLCJyb3RhdGUteSI6W3sicm90YXRlLXkiOnllKCl9XSwicm90YXRlLXoiOlt7InJvdGF0ZS16Ijp5ZSgpfV0sc2NhbGU6W3tzY2FsZTpiZSgpfV0sInNjYWxlLXgiOlt7InNjYWxlLXgiOmJlKCl9XSwic2NhbGUteSI6W3sic2NhbGUteSI6YmUoKX1dLCJzY2FsZS16IjpbeyJzY2FsZS16IjpiZSgpfV0sInNjYWxlLTNkIjpbYHNjYWxlLTNkYF0sc2tldzpbe3NrZXc6TygpfV0sInNrZXcteCI6W3sic2tldy14IjpPKCl9XSwic2tldy15IjpbeyJza2V3LXkiOk8oKX1dLHRyYW5zZm9ybTpbe3RyYW5zZm9ybTpbWixYLGBgLGBub25lYCxgZ3B1YCxgY3B1YF19XSwidHJhbnNmb3JtLW9yaWdpbiI6W3tvcmlnaW46eCgpfV0sInRyYW5zZm9ybS1zdHlsZSI6W3t0cmFuc2Zvcm06W2AzZGAsYGZsYXRgXX1dLHRyYW5zbGF0ZTpbe3RyYW5zbGF0ZTp4ZSgpfV0sInRyYW5zbGF0ZS14IjpbeyJ0cmFuc2xhdGUteCI6eGUoKX1dLCJ0cmFuc2xhdGUteSI6W3sidHJhbnNsYXRlLXkiOnhlKCl9XSwidHJhbnNsYXRlLXoiOlt7InRyYW5zbGF0ZS16Ijp4ZSgpfV0sInRyYW5zbGF0ZS1ub25lIjpbYHRyYW5zbGF0ZS1ub25lYF0sem9vbTpbe3pvb206W3B2LFosWF19XSxhY2NlbnQ6W3thY2NlbnQ6RCgpfV0sYXBwZWFyYW5jZTpbe2FwcGVhcmFuY2U6W2Bub25lYCxgYXV0b2BdfV0sImNhcmV0LWNvbG9yIjpbe2NhcmV0OkQoKX1dLCJjb2xvci1zY2hlbWUiOlt7c2NoZW1lOltgbm9ybWFsYCxgZGFya2AsYGxpZ2h0YCxgbGlnaHQtZGFya2AsYG9ubHktZGFya2AsYG9ubHktbGlnaHRgXX1dLGN1cnNvcjpbe2N1cnNvcjpbYGF1dG9gLGBkZWZhdWx0YCxgcG9pbnRlcmAsYHdhaXRgLGB0ZXh0YCxgbW92ZWAsYGhlbHBgLGBub3QtYWxsb3dlZGAsYG5vbmVgLGBjb250ZXh0LW1lbnVgLGBwcm9ncmVzc2AsYGNlbGxgLGBjcm9zc2hhaXJgLGB2ZXJ0aWNhbC10ZXh0YCxgYWxpYXNgLGBjb3B5YCxgbm8tZHJvcGAsYGdyYWJgLGBncmFiYmluZ2AsYGFsbC1zY3JvbGxgLGBjb2wtcmVzaXplYCxgcm93LXJlc2l6ZWAsYG4tcmVzaXplYCxgZS1yZXNpemVgLGBzLXJlc2l6ZWAsYHctcmVzaXplYCxgbmUtcmVzaXplYCxgbnctcmVzaXplYCxgc2UtcmVzaXplYCxgc3ctcmVzaXplYCxgZXctcmVzaXplYCxgbnMtcmVzaXplYCxgbmVzdy1yZXNpemVgLGBud3NlLXJlc2l6ZWAsYHpvb20taW5gLGB6b29tLW91dGAsWixYXX1dLCJmaWVsZC1zaXppbmciOlt7ImZpZWxkLXNpemluZyI6W2BmaXhlZGAsYGNvbnRlbnRgXX1dLCJwb2ludGVyLWV2ZW50cyI6W3sicG9pbnRlci1ldmVudHMiOltgYXV0b2AsYG5vbmVgXX1dLHJlc2l6ZTpbe3Jlc2l6ZTpbYG5vbmVgLGBgLGB5YCxgeGBdfV0sInNjcm9sbC1iZWhhdmlvciI6W3tzY3JvbGw6W2BhdXRvYCxgc21vb3RoYF19XSwic2Nyb2xsYmFyLXRodW1iLWNvbG9yIjpbeyJzY3JvbGxiYXItdGh1bWIiOkQoKX1dLCJzY3JvbGxiYXItdHJhY2stY29sb3IiOlt7InNjcm9sbGJhci10cmFjayI6RCgpfV0sInNjcm9sbGJhci1ndXR0ZXIiOlt7InNjcm9sbGJhci1ndXR0ZXIiOltgYXV0b2AsYHN0YWJsZWAsYGJvdGhgXX1dLCJzY3JvbGxiYXItdyI6W3tzY3JvbGxiYXI6W2BhdXRvYCxgdGhpbmAsYG5vbmVgXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOncoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6dygpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15Ijp3KCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOncoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6dygpfV0sInNjcm9sbC1tYnMiOlt7InNjcm9sbC1tYnMiOncoKX1dLCJzY3JvbGwtbWJlIjpbeyJzY3JvbGwtbWJlIjp3KCl9XSwic2Nyb2xsLW10IjpbeyJzY3JvbGwtbXQiOncoKX1dLCJzY3JvbGwtbXIiOlt7InNjcm9sbC1tciI6dygpfV0sInNjcm9sbC1tYiI6W3sic2Nyb2xsLW1iIjp3KCl9XSwic2Nyb2xsLW1sIjpbeyJzY3JvbGwtbWwiOncoKX1dLCJzY3JvbGwtcCI6W3sic2Nyb2xsLXAiOncoKX1dLCJzY3JvbGwtcHgiOlt7InNjcm9sbC1weCI6dygpfV0sInNjcm9sbC1weSI6W3sic2Nyb2xsLXB5Ijp3KCl9XSwic2Nyb2xsLXBzIjpbeyJzY3JvbGwtcHMiOncoKX1dLCJzY3JvbGwtcGUiOlt7InNjcm9sbC1wZSI6dygpfV0sInNjcm9sbC1wYnMiOlt7InNjcm9sbC1wYnMiOncoKX1dLCJzY3JvbGwtcGJlIjpbeyJzY3JvbGwtcGJlIjp3KCl9XSwic2Nyb2xsLXB0IjpbeyJzY3JvbGwtcHQiOncoKX1dLCJzY3JvbGwtcHIiOlt7InNjcm9sbC1wciI6dygpfV0sInNjcm9sbC1wYiI6W3sic2Nyb2xsLXBiIjp3KCl9XSwic2Nyb2xsLXBsIjpbeyJzY3JvbGwtcGwiOncoKX1dLCJzbmFwLWFsaWduIjpbe3NuYXA6W2BzdGFydGAsYGVuZGAsYGNlbnRlcmAsYGFsaWduLW5vbmVgXX1dLCJzbmFwLXN0b3AiOlt7c25hcDpbYG5vcm1hbGAsYGFsd2F5c2BdfV0sInNuYXAtdHlwZSI6W3tzbmFwOltgbm9uZWAsYHhgLGB5YCxgYm90aGBdfV0sInNuYXAtc3RyaWN0bmVzcyI6W3tzbmFwOltgbWFuZGF0b3J5YCxgcHJveGltaXR5YF19XSx0b3VjaDpbe3RvdWNoOltgYXV0b2AsYG5vbmVgLGBtYW5pcHVsYXRpb25gXX1dLCJ0b3VjaC14IjpbeyJ0b3VjaC1wYW4iOltgeGAsYGxlZnRgLGByaWdodGBdfV0sInRvdWNoLXkiOlt7InRvdWNoLXBhbiI6W2B5YCxgdXBgLGBkb3duYF19XSwidG91Y2gtcHoiOltgdG91Y2gtcGluY2gtem9vbWBdLHNlbGVjdDpbe3NlbGVjdDpbYG5vbmVgLGB0ZXh0YCxgYWxsYCxgYXV0b2BdfV0sIndpbGwtY2hhbmdlIjpbeyJ3aWxsLWNoYW5nZSI6W2BhdXRvYCxgc2Nyb2xsYCxgY29udGVudHNgLGB0cmFuc2Zvcm1gLFosWF19XSxmaWxsOlt7ZmlsbDpbYG5vbmVgLC4uLkQoKV19XSwic3Ryb2tlLXciOlt7c3Ryb2tlOltZLGp2LHd2LFR2XX1dLHN0cm9rZTpbe3N0cm9rZTpbYG5vbmVgLC4uLkQoKV19XSwiZm9yY2VkLWNvbG9yLWFkanVzdCI6W3siZm9yY2VkLWNvbG9yLWFkanVzdCI6W2BhdXRvYCxgbm9uZWBdfV19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cHM6eyJjb250YWluZXItbmFtZWQiOltgY29udGFpbmVyLXR5cGVgXSxvdmVyZmxvdzpbYG92ZXJmbG93LXhgLGBvdmVyZmxvdy15YF0sb3ZlcnNjcm9sbDpbYG92ZXJzY3JvbGwteGAsYG92ZXJzY3JvbGwteWBdLGluc2V0OltgaW5zZXQteGAsYGluc2V0LXlgLGBpbnNldC1ic2AsYGluc2V0LWJlYCxgc3RhcnRgLGBlbmRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSwiaW5zZXQteCI6W2ByaWdodGAsYGxlZnRgXSwiaW5zZXQteSI6W2B0b3BgLGBib3R0b21gXSxmbGV4OltgYmFzaXNgLGBncm93YCxgc2hyaW5rYF0sZ2FwOltgZ2FwLXhgLGBnYXAteWBdLHA6W2BweGAsYHB5YCxgcHNgLGBwZWAsYHBic2AsYHBiZWAsYHB0YCxgcHJgLGBwYmAsYHBsYF0scHg6W2BwcmAsYHBsYF0scHk6W2BwdGAsYHBiYF0sbTpbYG14YCxgbXlgLGBtc2AsYG1lYCxgbWJzYCxgbWJlYCxgbXRgLGBtcmAsYG1iYCxgbWxgXSxteDpbYG1yYCxgbWxgXSxteTpbYG10YCxgbWJgXSxzaXplOltgd2AsYGhgXSwiZm9udC1zaXplIjpbYGxlYWRpbmdgXSwiZnZuLW5vcm1hbCI6W2Bmdm4tb3JkaW5hbGAsYGZ2bi1zbGFzaGVkLXplcm9gLGBmdm4tZmlndXJlYCxgZnZuLXNwYWNpbmdgLGBmdm4tZnJhY3Rpb25gXSwiZnZuLW9yZGluYWwiOltgZnZuLW5vcm1hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZpZ3VyZSI6W2Bmdm4tbm9ybWFsYF0sImZ2bi1zcGFjaW5nIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZyYWN0aW9uIjpbYGZ2bi1ub3JtYWxgXSwibGluZS1jbGFtcCI6W2BkaXNwbGF5YCxgb3ZlcmZsb3dgXSxyb3VuZGVkOltgcm91bmRlZC1zYCxgcm91bmRlZC1lYCxgcm91bmRlZC10YCxgcm91bmRlZC1yYCxgcm91bmRlZC1iYCxgcm91bmRlZC1sYCxgcm91bmRlZC1zc2AsYHJvdW5kZWQtc2VgLGByb3VuZGVkLWVlYCxgcm91bmRlZC1lc2AsYHJvdW5kZWQtdGxgLGByb3VuZGVkLXRyYCxgcm91bmRlZC1icmAsYHJvdW5kZWQtYmxgXSwicm91bmRlZC1zIjpbYHJvdW5kZWQtc3NgLGByb3VuZGVkLWVzYF0sInJvdW5kZWQtZSI6W2Byb3VuZGVkLXNlYCxgcm91bmRlZC1lZWBdLCJyb3VuZGVkLXQiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtdHJgXSwicm91bmRlZC1yIjpbYHJvdW5kZWQtdHJgLGByb3VuZGVkLWJyYF0sInJvdW5kZWQtYiI6W2Byb3VuZGVkLWJyYCxgcm91bmRlZC1ibGBdLCJyb3VuZGVkLWwiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtYmxgXSwiYm9yZGVyLXNwYWNpbmciOltgYm9yZGVyLXNwYWNpbmcteGAsYGJvcmRlci1zcGFjaW5nLXlgXSwiYm9yZGVyLXciOltgYm9yZGVyLXcteGAsYGJvcmRlci13LXlgLGBib3JkZXItdy1zYCxgYm9yZGVyLXctZWAsYGJvcmRlci13LWJzYCxgYm9yZGVyLXctYmVgLGBib3JkZXItdy10YCxgYm9yZGVyLXctcmAsYGJvcmRlci13LWJgLGBib3JkZXItdy1sYF0sImJvcmRlci13LXgiOltgYm9yZGVyLXctcmAsYGJvcmRlci13LWxgXSwiYm9yZGVyLXcteSI6W2Bib3JkZXItdy10YCxgYm9yZGVyLXctYmBdLCJib3JkZXItY29sb3IiOltgYm9yZGVyLWNvbG9yLXhgLGBib3JkZXItY29sb3IteWAsYGJvcmRlci1jb2xvci1zYCxgYm9yZGVyLWNvbG9yLWVgLGBib3JkZXItY29sb3ItYnNgLGBib3JkZXItY29sb3ItYmVgLGBib3JkZXItY29sb3ItdGAsYGJvcmRlci1jb2xvci1yYCxgYm9yZGVyLWNvbG9yLWJgLGBib3JkZXItY29sb3ItbGBdLCJib3JkZXItY29sb3IteCI6W2Bib3JkZXItY29sb3ItcmAsYGJvcmRlci1jb2xvci1sYF0sImJvcmRlci1jb2xvci15IjpbYGJvcmRlci1jb2xvci10YCxgYm9yZGVyLWNvbG9yLWJgXSx0cmFuc2xhdGU6W2B0cmFuc2xhdGUteGAsYHRyYW5zbGF0ZS15YCxgdHJhbnNsYXRlLW5vbmVgXSwidHJhbnNsYXRlLW5vbmUiOltgdHJhbnNsYXRlYCxgdHJhbnNsYXRlLXhgLGB0cmFuc2xhdGUteWAsYHRyYW5zbGF0ZS16YF0sInNjcm9sbC1tIjpbYHNjcm9sbC1teGAsYHNjcm9sbC1teWAsYHNjcm9sbC1tc2AsYHNjcm9sbC1tZWAsYHNjcm9sbC1tYnNgLGBzY3JvbGwtbWJlYCxgc2Nyb2xsLW10YCxgc2Nyb2xsLW1yYCxgc2Nyb2xsLW1iYCxgc2Nyb2xsLW1sYF0sInNjcm9sbC1teCI6W2BzY3JvbGwtbXJgLGBzY3JvbGwtbWxgXSwic2Nyb2xsLW15IjpbYHNjcm9sbC1tdGAsYHNjcm9sbC1tYmBdLCJzY3JvbGwtcCI6W2BzY3JvbGwtcHhgLGBzY3JvbGwtcHlgLGBzY3JvbGwtcHNgLGBzY3JvbGwtcGVgLGBzY3JvbGwtcGJzYCxgc2Nyb2xsLXBiZWAsYHNjcm9sbC1wdGAsYHNjcm9sbC1wcmAsYHNjcm9sbC1wYmAsYHNjcm9sbC1wbGBdLCJzY3JvbGwtcHgiOltgc2Nyb2xsLXByYCxgc2Nyb2xsLXBsYF0sInNjcm9sbC1weSI6W2BzY3JvbGwtcHRgLGBzY3JvbGwtcGJgXSx0b3VjaDpbYHRvdWNoLXhgLGB0b3VjaC15YCxgdG91Y2gtcHpgXSwidG91Y2gteCI6W2B0b3VjaGBdLCJ0b3VjaC15IjpbYHRvdWNoYF0sInRvdWNoLXB6IjpbYHRvdWNoYF19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczp7ImZvbnQtc2l6ZSI6W2BsZWFkaW5nYF19LHBvc3RmaXhMb29rdXBDbGFzc0dyb3VwczpbYGNvbnRhaW5lci10eXBlYF0sb3JkZXJTZW5zaXRpdmVNb2RpZmllcnM6W2AqYCxgKipgLGBhZnRlcmAsYGJhY2tkcm9wYCxgYmVmb3JlYCxgZGV0YWlscy1jb250ZW50YCxgZmlsZWAsYGZpcnN0LWxldHRlcmAsYGZpcnN0LWxpbmVgLGBtYXJrZXJgLGBwbGFjZWhvbGRlcmAsYHNlbGVjdGlvbmBdfX0pO2Z1bmN0aW9uIFl2KC4uLmUpe3JldHVybiBKdihiXyhlKSl9dmFyIFh2PUYoe19fbmFtZTpgQWxlcnRgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfSx2YXJpYW50Ont9fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihuLHIpPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBhbGVydGAsY2xhc3M6TyhOKFl2KShOKCR2KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKSkscm9sZTpgYWxlcnRgfSxbSShuLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWnY9Rih7X19uYW1lOmBBbGVydERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGFsZXJ0LWRlc2NyaXB0aW9uYCxjbGFzczpPKE4oWXYpKGB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbSB0ZXh0LWJhbGFuY2UgbWQ6dGV4dC1wcmV0dHkgWyZfcDpub3QoOmxhc3QtY2hpbGQpXTptYi00IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxRdj1GKHtfX25hbWU6YEFsZXJ0VGl0bGVgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgYWxlcnQtdGl0bGVgLGNsYXNzOk8oTihZdikoYGZvbnQtbWVkaXVtIGdyb3VwLWhhcy1bPnN2Z10vYWxlcnQ6Y29sLXN0YXJ0LTIgY24tZm9udC1oZWFkaW5nIFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSwkdj1DXyhgZ3JpZCBnYXAtMC41IHJvdW5kZWQtbGcgYm9yZGVyIHB4LTIuNSBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGhhcy1kYXRhLVtzbG90PWFsZXJ0LWFjdGlvbl06cmVsYXRpdmUgaGFzLWRhdGEtW3Nsb3Q9YWxlcnQtYWN0aW9uXTpwci0xOCBoYXMtWz5zdmddOmdyaWQtY29scy1bYXV0b18xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMiAqOltzdmddOnJvdy1zcGFuLTIgKjpbc3ZnXTp0cmFuc2xhdGUteS0wLjUgKjpbc3ZnXTp0ZXh0LWN1cnJlbnQgKjpbc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBncm91cC9hbGVydCByZWxhdGl2ZSB3LWZ1bGxgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZGAsZGVzdHJ1Y3RpdmU6YHRleHQtZGVzdHJ1Y3RpdmUgYmctY2FyZCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZGVzdHJ1Y3RpdmUvOTAgKjpbc3ZnXTp0ZXh0LWN1cnJlbnRgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YH19KTtmdW5jdGlvbiBleShlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgP2AnJHtlfSdgOm5ldyBpeSgpLnNlcmlhbGl6ZShlKX12YXIgdHk9YCBfLSw7OiE/LiciKClbXXt9QCovXFwmIyVcYF4rPD0+fH4kMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YCxueT0oZnVuY3Rpb24oKXtsZXQgZT1uZXcgVWludDhBcnJheSgxMjgpO2ZvcihsZXQgdD0wO3Q8Njk7dCsrKWVbdHkuY2hhckNvZGVBdCh0KV09dCsxO2ZvcihsZXQgdD02NTt0PD05MDt0KyspZVt0XT1lW3QrMzJdO3JldHVybiBlfSkoKTtmdW5jdGlvbiByeShlLHQpe2lmKGU9PT10KXJldHVybiAwO2xldCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49ZS5jaGFyQ29kZUF0KGkpLGE9dC5jaGFyQ29kZUF0KGkpO2lmKG49PT1hKWNvbnRpbnVlO2xldCBvPW48MTI4JiZueVtuXT9ueVtuXTpuKzEyOCxzPWE8MTI4JiZueVthXT9ueVthXTphKzEyODtpZihvIT09cylyZXR1cm4gbzxzPy0xOjE7cj09PTAmJihyPW4+YT8tMToxKX1yZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aD9yOmUubGVuZ3RoPHQubGVuZ3RoPy0xOjF9dmFyIGl5PShmdW5jdGlvbigpe2NsYXNzIGV7I2U9bmV3IE1hcDtjb21wYXJlKGUsdCl7bGV0IG49dHlwZW9mIGUscj10eXBlb2YgdDtyZXR1cm4gbj09PWBzdHJpbmdgJiZyPT09YHN0cmluZ2A/cnkoZSx0KTpuPT09YG51bWJlcmAmJnI9PT1gbnVtYmVyYD9lLXQ6cnkodGhpcy5zZXJpYWxpemUoZSwhMCksdGhpcy5zZXJpYWxpemUodCwhMCkpfXNlcmlhbGl6ZShlLHQpe2lmKGU9PT1udWxsKXJldHVybmBudWxsYDtzd2l0Y2godHlwZW9mIGUpe2Nhc2Vgc3RyaW5nYDpyZXR1cm4gdD9lOmAnJHtlfSdgO2Nhc2VgYmlnaW50YDpyZXR1cm5gJHtlfW5gO2Nhc2Vgb2JqZWN0YDpyZXR1cm4gdGhpcy4kb2JqZWN0KGUpO2Nhc2VgZnVuY3Rpb25gOnJldHVybiB0aGlzLiRmdW5jdGlvbihlKX1yZXR1cm4gU3RyaW5nKGUpfXNlcmlhbGl6ZU9iamVjdChlKXtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYodCE9PWBbb2JqZWN0IE9iamVjdF1gKXJldHVybiB0aGlzLnNlcmlhbGl6ZUJ1aWx0SW5UeXBlKHQubGVuZ3RoPDEwP2B1bmtub3duOiR7dH1gOnQuc2xpY2UoOCwtMSksZSk7bGV0IG49ZS5jb25zdHJ1Y3RvcixyPW49PT1PYmplY3R8fG49PT12b2lkIDA/YGA6bi5uYW1lO2lmKHIhPT1gYCYmZ2xvYmFsVGhpc1tyXT09PW4pcmV0dXJuIHRoaXMuc2VyaWFsaXplQnVpbHRJblR5cGUocixlKTtpZihgdG9KU09OYGluIGUmJnR5cGVvZiBlLnRvSlNPTj09YGZ1bmN0aW9uYCl7bGV0IHQ9ZS50b0pTT04oKTtyZXR1cm4gcisodHlwZW9mIHQ9PWBvYmplY3RgJiZ0P3RoaXMuJG9iamVjdCh0KTpgKCR7dGhpcy5zZXJpYWxpemUodCl9KWApfWxldCBpPU9iamVjdC5rZXlzKGUpLnNvcnQocnkpLGE9YCR7cn17YDtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IG49aVt0XTthKz1gJHtufToke3RoaXMuc2VyaWFsaXplKGVbbl0pfWAsdDxpLmxlbmd0aC0xJiYoYSs9YCxgKX1yZXR1cm4gYStgfWB9c2VyaWFsaXplQnVpbHRJblR5cGUoZSx0KXtsZXQgbj10aGlzW2AkYCtlXTtpZihuKXJldHVybiBuLmNhbGwodGhpcyx0KTtpZih0eXBlb2YgdC5lbnRyaWVzPT1gZnVuY3Rpb25gKXJldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0LmVudHJpZXMoKSk7dGhyb3cgRXJyb3IoYENhbm5vdCBzZXJpYWxpemUgJHtlfWApfXNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0KXtsZXQgbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlWzBdLHRbMF0pKSxyPWAke2V9e2A7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2xldFt0LGldPW5bZV07cis9YCR7dGhpcy5zZXJpYWxpemUodCwhMCl9OiR7dGhpcy5zZXJpYWxpemUoaSl9YCxlPG4ubGVuZ3RoLTEmJihyKz1gLGApfXJldHVybiByK2B9YH0kb2JqZWN0KGUpe2xldCB0PXRoaXMuI2UuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiYodGhpcy4jZS5zZXQoZSxgIyR7dGhpcy4jZS5zaXplfWApLHQ9dGhpcy5zZXJpYWxpemVPYmplY3QoZSksdGhpcy4jZS5zZXQoZSx0KSksdH0kZnVuY3Rpb24oZSl7bGV0IHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoLTE1KT09PWBbbmF0aXZlIGNvZGVdIH1gP2Ake2UubmFtZXx8YGB9KClbbmF0aXZlXWA6YCR7ZS5uYW1lfSgke2UubGVuZ3RofSkke3QucmVwbGFjZSgvXHMqXG5ccyovZyxgYCl9YH0kQXJyYXkoZSl7bGV0IHQ9YFtgO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPXRoaXMuc2VyaWFsaXplKGVbbl0pLG48ZS5sZW5ndGgtMSYmKHQrPWAsYCk7cmV0dXJuIHQrYF1gfSREYXRlKGUpe3RyeXtyZXR1cm5gRGF0ZSgke2UudG9JU09TdHJpbmcoKX0pYH1jYXRjaHtyZXR1cm5gRGF0ZShudWxsKWB9fSRBcnJheUJ1ZmZlcihlKXtyZXR1cm5gQXJyYXlCdWZmZXJbJHtuZXcgVWludDhBcnJheShlKS5qb2luKGAsYCl9XWB9JFNldChlKXtyZXR1cm5gU2V0JHt0aGlzLiRBcnJheShBcnJheS5mcm9tKGUpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlLHQpKSl9YH0kTWFwKGUpe3JldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoYE1hcGAsZS5lbnRyaWVzKCkpfX1mb3IobGV0IHQgb2ZbYEVycm9yYCxgUmVnRXhwYCxgVVJMYF0pZS5wcm90b3R5cGVbYCRgK3RdPWZ1bmN0aW9uKGUpe3JldHVybmAke3R9KCR7ZX0pYH07Zm9yKGxldCB0IG9mW2BJbnQ4QXJyYXlgLGBVaW50OEFycmF5YCxgVWludDhDbGFtcGVkQXJyYXlgLGBJbnQxNkFycmF5YCxgVWludDE2QXJyYXlgLGBJbnQzMkFycmF5YCxgVWludDMyQXJyYXlgLGBGbG9hdDMyQXJyYXlgLGBGbG9hdDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYCxgKX1dYH07Zm9yKGxldCB0IG9mW2BCaWdJbnQ2NEFycmF5YCxgQmlnVWludDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYG4sYCl9JHtlLmxlbmd0aD4wP2BuYDpgYH1dYH07cmV0dXJuIGV9KSgpO2Z1bmN0aW9uIGF5KGUsdCl7cmV0dXJuIGU9PT10fHxleShlKT09PWV5KHQpfWZ1bmN0aW9uIG95KGUsdCl7bGV0IG49dHlwZW9mIGU9PWBzdHJpbmdgJiYhdD9gJHtlfUNvbnRleHRgOnQscj1TeW1ib2wobik7cmV0dXJuW3Q9PntsZXQgbj15cihyLHQpO2lmKG58fG49PT1udWxsKXJldHVybiBuO3Rocm93IEVycm9yKGBJbmplY3Rpb24gXGAke3IudG9TdHJpbmcoKX1cYCBub3QgZm91bmQuIENvbXBvbmVudCBtdXN0IGJlIHVzZWQgd2l0aGluICR7QXJyYXkuaXNBcnJheShlKT9gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJHtlLmpvaW4oYCwgYCl9YDpgXGAke2V9XGBgfWApfSxlPT4odnIocixlKSxlKV19ZnVuY3Rpb24gc3koKXtsZXQgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKDtlIT1udWxsJiZlLnNoYWRvd1Jvb3QhPW51bGwmJmUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50IT1udWxsOyllPWUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBlfWZ1bmN0aW9uIGN5KGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIGx5KGUsdCl7cmV0dXJuIGN5KGUpPyExOkFycmF5LmlzQXJyYXkoZSk/ZS5zb21lKGU9PmF5KGUsdCkpOmF5KGUsdCl9ZnVuY3Rpb24gdXkoZSx0KXtyZXR1cm4gRmUoKT8oSWUoZSx0KSwhMCk6ITF9ZnVuY3Rpb24gZHkoZSl7bGV0IHQ9ITEsbixyPVBlKCEwKTtyZXR1cm4oKC4uLmkpPT4odHx8PShuPXIucnVuKCgpPT5lKC4uLmkpKSwhMCksbikpfXZhciBmeT10eXBlb2Ygd2luZG93PGB1YCYmdHlwZW9mIGRvY3VtZW50PGB1YDt0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8YHVgJiZnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7dmFyIHB5PWU9PmUhPT12b2lkIDAsbXk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoeT1lPT5teS5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAsZ3k9X3koKTtmdW5jdGlvbiBfeSgpe3ZhciBlLHQ7cmV0dXJuIGZ5JiYhISgoZT13aW5kb3cpIT1udWxsJiYoZT1lLm5hdmlnYXRvcikhPW51bGwmJmUudXNlckFnZW50KSYmKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KXx8KCh0PXdpbmRvdyk9PW51bGx8fCh0PXQubmF2aWdhdG9yKT09bnVsbD92b2lkIDA6dC5tYXhUb3VjaFBvaW50cyk+MiYmL2lQYWR8TWFjaW50b3NoLy50ZXN0KHdpbmRvdz8ubmF2aWdhdG9yLnVzZXJBZ2VudCkpfWZ1bmN0aW9uIHZ5KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W2VdfWZ1bmN0aW9uIHl5KGUpe3JldHVybiBlfHxGcygpfWZ1bmN0aW9uIGJ5KGUpe2lmKCFmeSlyZXR1cm4gZTtsZXQgdD0wLG4scixpPSgpPT57LS10LHImJnQ8PTAmJihyLnN0b3AoKSxuPXZvaWQgMCxyPXZvaWQgMCl9O3JldHVybigoLi4uYSk9Pih0Kz0xLHJ8fChyPVBlKCEwKSxuPXIucnVuKCgpPT5lKC4uLmEpKSksdXkoaSksbikpfWZ1bmN0aW9uIHh5KGUpe3JldHVybiBadChqKGUpP25ldyBQcm94eSh7fSx7Z2V0KHQsbixyKXtyZXR1cm4gTihSZWZsZWN0LmdldChlLnZhbHVlLG4scikpfSxzZXQodCxuLHIpe3JldHVybiBqKGUudmFsdWVbbl0pJiYhaihyKT9lLnZhbHVlW25dLnZhbHVlPXI6ZS52YWx1ZVtuXT1yLCEwfSxkZWxldGVQcm9wZXJ0eSh0LG4pe3JldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUudmFsdWUsbil9LGhhcyh0LG4pe3JldHVybiBSZWZsZWN0LmhhcyhlLnZhbHVlLG4pfSxvd25LZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUudmFsdWUpfSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKXtyZXR1cm57ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9fX0pOmUpfWZ1bmN0aW9uIFN5KGUpe3JldHVybiB4eShXKGUpKX1mdW5jdGlvbiBDeShlLC4uLnQpe2xldCBuPXQuZmxhdCgpLHI9blswXTtyZXR1cm4gU3koKCk9Pk9iamVjdC5mcm9tRW50cmllcyh0eXBlb2Ygcj09YGZ1bmN0aW9uYD9PYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKChbZSx0XSk9PiFyKG1uKHQpLGUpKTpPYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKGU9PiFuLmluY2x1ZGVzKGVbMF0pKSkpfWZ1bmN0aW9uIHd5KGUsdD0xZTQpe3JldHVybiB2bigobixyKT0+e2xldCBpPW1uKGUpLGEsbz0oKT0+c2V0VGltZW91dCgoKT0+e2k9bW4oZSkscigpfSxtbih0KSk7cmV0dXJuIHV5KCgpPT57Y2xlYXJUaW1lb3V0KGEpfSkse2dldCgpe3JldHVybiBuKCksaX0sc2V0KGUpe2k9ZSxyKCksY2xlYXJUaW1lb3V0KGEpLGE9bygpfX19KX1mdW5jdGlvbiBUeShlLHQpe3l5KHQpJiZlYShlLHQpfWZ1bmN0aW9uIEV5KGUsdCxuKXtyZXR1cm4gRXIoZSx0LHsuLi5uLGltbWVkaWF0ZTohMH0pfXZhciBEeT1meT93aW5kb3c6dm9pZCAwO2Z5JiZ3aW5kb3cuZG9jdW1lbnQsZnkmJndpbmRvdy5uYXZpZ2F0b3IsZnkmJndpbmRvdy5sb2NhdGlvbjtmdW5jdGlvbiBPeShlKXtsZXQgdD1tbihlKTtyZXR1cm4gdD8uJGVsPz90fWZ1bmN0aW9uIGt5KC4uLmUpe2xldCB0PShlLHQsbixyKT0+KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sciksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4scikpLG49VygoKT0+e2xldCB0PXZ5KG1uKGVbMF0pKS5maWx0ZXIoZT0+ZSE9bnVsbCk7cmV0dXJuIHQuZXZlcnkoZT0+dHlwZW9mIGUhPWBzdHJpbmdgKT90OnZvaWQgMH0pO3JldHVybiBFeSgoKT0+W24udmFsdWU/Lm1hcChlPT5PeShlKSk/P1tEeV0uZmlsdGVyKGU9PmUhPW51bGwpLHZ5KG1uKG4udmFsdWU/ZVsxXTplWzBdKSksdnkoTihuLnZhbHVlP2VbMl06ZVsxXSkpLG1uKG4udmFsdWU/ZVszXTplWzJdKV0sKFtlLG4scixpXSxhLG8pPT57aWYoIWU/Lmxlbmd0aHx8IW4/Lmxlbmd0aHx8IXI/Lmxlbmd0aClyZXR1cm47bGV0IHM9aHkoaSk/ey4uLml9OmksYz1lLmZsYXRNYXAoZT0+bi5mbGF0TWFwKG49PnIubWFwKHI9PnQoZSxuLHIscykpKSk7bygoKT0+e2MuZm9yRWFjaChlPT5lKCkpfSl9LHtmbHVzaDpgcG9zdGB9KX1mdW5jdGlvbiBBeSgpe2xldCBlPXVuKCExKSx0PUZzKCk7cmV0dXJuIHQmJlppKCgpPT57ZS52YWx1ZT0hMH0sdCksZX1mdW5jdGlvbiBqeShlKXtsZXQgdD1BeSgpO3JldHVybiBXKCgpPT4odC52YWx1ZSwhIWUoKSkpfWZ1bmN0aW9uIE15KGUpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lOnR5cGVvZiBlPT1gc3RyaW5nYD90PT50LmtleT09PWU6QXJyYXkuaXNBcnJheShlKT90PT5lLmluY2x1ZGVzKHQua2V5KTooKT0+ITB9ZnVuY3Rpb24gTnkoLi4uZSl7bGV0IHQsbixyPXt9O2UubGVuZ3RoPT09Mz8odD1lWzBdLG49ZVsxXSxyPWVbMl0pOmUubGVuZ3RoPT09Mj90eXBlb2YgZVsxXT09YG9iamVjdGA/KHQ9ITAsbj1lWzBdLHI9ZVsxXSk6KHQ9ZVswXSxuPWVbMV0pOih0PSEwLG49ZVswXSk7bGV0e3RhcmdldDppPUR5LGV2ZW50TmFtZTphPWBrZXlkb3duYCxwYXNzaXZlOm89ITEsZGVkdXBlOnM9ITF9PXIsYz1NeSh0KTtyZXR1cm4ga3koaSxhLGU9PntlLnJlcGVhdCYmbW4ocyl8fGMoZSkmJm4oZSl9LG8pfWZ1bmN0aW9uIFB5KGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiBGeShlLHQsbj17fSl7bGV0e3dpbmRvdzpyPUR5LC4uLml9PW4sYSxvPWp5KCgpPT5yJiZgUmVzaXplT2JzZXJ2ZXJgaW4gcikscz0oKT0+e2EmJj0oYS5kaXNjb25uZWN0KCksdm9pZCAwKX0sYz1FcihXKCgpPT57bGV0IHQ9bW4oZSk7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5tYXAoZT0+T3koZSkpOltPeSh0KV19KSxlPT57aWYocygpLG8udmFsdWUmJnIpe2E9bmV3IFJlc2l6ZU9ic2VydmVyKHQpO2ZvcihsZXQgdCBvZiBlKXQmJmEub2JzZXJ2ZSh0LGkpfX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgcG9zdGB9KSxsPSgpPT57cygpLGMoKX07cmV0dXJuIHV5KGwpLHtpc1N1cHBvcnRlZDpvLHN0b3A6bH19ZnVuY3Rpb24gSXkoZSx0LG4scj17fSl7dmFyIGksYTtsZXR7Y2xvbmU6bz0hMSxwYXNzaXZlOnM9ITEsZXZlbnROYW1lOmMsZGVlcDpsPSExLGRlZmF1bHRWYWx1ZTp1LHNob3VsZEVtaXQ6ZH09cixmPUZzKCkscD1ufHxmPy5lbWl0fHwoZj09bnVsbHx8KGk9Zi4kZW1pdCk9PW51bGw/dm9pZCAwOmkuYmluZChmKSl8fChmPT1udWxsfHwoYT1mLnByb3h5KT09bnVsbHx8KGE9YS4kZW1pdCk9PW51bGw/dm9pZCAwOmEuYmluZChmPy5wcm94eSkpLG09Yzt0fHw9YG1vZGVsVmFsdWVgLG18fD1gdXBkYXRlOiR7dC50b1N0cmluZygpfWA7bGV0IGg9ZT0+bz90eXBlb2Ygbz09YGZ1bmN0aW9uYD9vKGUpOlB5KGUpOmUsZz0oKT0+cHkoZVt0XSk/aChlW3RdKTp1LF89ZT0+e2Q/ZChlKSYmcChtLGUpOnAobSxlKX07aWYocyl7bGV0IG49TShnKCkpLHI9ITE7cmV0dXJuIEVyKCgpPT5lW3RdLGU9PntyfHwocj0hMCxuLnZhbHVlPWgoZSksUW4oKCk9PnI9ITEpKX0pLEVyKG4sbj0+eyFyJiYobiE9PWVbdF18fGwpJiZfKG4pfSx7ZGVlcDpsfSksbn1yZXR1cm4gVyh7Z2V0KCl7cmV0dXJuIGcoKX0sc2V0KGUpe18oZSl9fSl9ZnVuY3Rpb24gTHkoZSl7cmV0dXJuIGU/ZS5mbGF0TWFwKGU9PmUudHlwZT09PUw/THkoZS5jaGlsZHJlbik6W2VdKTpbXX12YXIgUnk9W2BJTlBVVGAsYFRFWFRBUkVBYF07ZnVuY3Rpb24genkoZSx0LG4scj17fSl7aWYoIXR8fHIuZW5hYmxlSWdub3JlZEVsZW1lbnQmJlJ5LmluY2x1ZGVzKHQubm9kZU5hbWUpKXJldHVybiBudWxsO2xldHthcnJvd0tleU9wdGlvbnM6aT1gYm90aGAsYXR0cmlidXRlTmFtZTphPWBbZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbV1gLGl0ZW1zQXJyYXk6bz1bXSxsb29wOnM9ITAsZGlyOmM9YGx0cmAscHJldmVudFNjcm9sbDpsPSEwLGZvY3VzOnU9ITF9PXIsW2QsZixwLG0saCxnXT1bZS5rZXk9PT1gQXJyb3dSaWdodGAsZS5rZXk9PT1gQXJyb3dMZWZ0YCxlLmtleT09PWBBcnJvd1VwYCxlLmtleT09PWBBcnJvd0Rvd25gLGUua2V5PT09YEhvbWVgLGUua2V5PT09YEVuZGBdLF89cHx8bSx2PWR8fGY7aWYoIWgmJiFnJiYoIV8mJiF2fHxpPT09YHZlcnRpY2FsYCYmdnx8aT09PWBob3Jpem9udGFsYCYmXykpcmV0dXJuIG51bGw7bGV0IHk9bj9BcnJheS5mcm9tKG4ucXVlcnlTZWxlY3RvckFsbChhKSk6bztpZigheS5sZW5ndGgpcmV0dXJuIG51bGw7bCYmZS5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPW51bGw7cmV0dXJuIHZ8fF8/Yj1CeSh5LHQse2dvRm9yd2FyZDpfP206Yz09PWBsdHJgP2Q6Zixsb29wOnN9KTpoP2I9eS5hdCgwKXx8bnVsbDpnJiYoYj15LmF0KC0xKXx8bnVsbCksdSYmYj8uZm9jdXMoKSxifWZ1bmN0aW9uIEJ5KGUsdCxuLHI9ZS5pbmNsdWRlcyh0KT9lLmxlbmd0aDplLmxlbmd0aCsxKXtpZigtLXI9PT0wKXJldHVybiBudWxsO2xldCBpPWUuaW5kZXhPZih0KSxhO2lmKGE9aT09PS0xP24uZ29Gb3J3YXJkPzA6ZS5sZW5ndGgtMTpuLmdvRm9yd2FyZD9pKzE6aS0xLCFuLmxvb3AmJihhPDB8fGE+PWUubGVuZ3RoKSlyZXR1cm4gbnVsbDtsZXQgbz1lWyhhK2UubGVuZ3RoKSVlLmxlbmd0aF07cmV0dXJuIG8/by5oYXNBdHRyaWJ1dGUoYGRpc2FibGVkYCkmJm8uZ2V0QXR0cmlidXRlKGBkaXNhYmxlZGApIT09YGZhbHNlYD9CeShlLG8sbixyKTpvOm51bGx9dmFyW1Z5LEh5XT1veShgQ29uZmlnUHJvdmlkZXJgKTtmdW5jdGlvbiBVeShlKXtsZXQgdD1WeSh7ZGlyOk0oYGx0cmApfSk7cmV0dXJuIFcoKCk9PmU/LnZhbHVlfHx0LmRpcj8udmFsdWV8fGBsdHJgKX1mdW5jdGlvbiBXeShlKXtsZXQgdD1GcygpLG49dD8udHlwZS5lbWl0cyxyPXt9O3JldHVybiBuPy5sZW5ndGh8fGNvbnNvbGUud2FybihgTm8gZW1pdHRlZCBldmVudCBmb3VuZC4gUGxlYXNlIGNoZWNrIGNvbXBvbmVudDogJHt0Py50eXBlLl9fbmFtZX1gKSxuPy5mb3JFYWNoKHQ9PntyW2NlKEUodCkpXT0oLi4ubik9PmUodCwuLi5uKX0pLHJ9ZnVuY3Rpb24gR3koKXtsZXQgZT1GcygpLHQ9TSgpLG49VygoKT0+cigpKTskaSgoKT0+e24udmFsdWUhPT1yKCkmJnBuKHQpfSk7ZnVuY3Rpb24gcigpe3JldHVybiB0LnZhbHVlJiZgJGVsYGluIHQudmFsdWUmJltgI3RleHRgLGAjY29tbWVudGBdLmluY2x1ZGVzKHQudmFsdWUuJGVsLm5vZGVOYW1lKT90LnZhbHVlLiRlbC5uZXh0RWxlbWVudFNpYmxpbmc6T3kodCl9bGV0IGk9T2JqZWN0LmFzc2lnbih7fSxlLmV4cG9zZWQpLGE9e307Zm9yKGxldCB0IGluIGUucHJvcHMpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5lLnByb3BzW3RdfSk7aWYoT2JqZWN0LmtleXMoaSkubGVuZ3RoPjApZm9yKGxldCBlIGluIGkpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pW2VdfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIiRlbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZS52bm9kZS5lbH0pLGUuZXhwb3NlZD1hO2Z1bmN0aW9uIG8obil7aWYodC52YWx1ZT1uLG4mJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiJGVsIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5uIGluc3RhbmNlb2YgRWxlbWVudD9uOm4uJGVsfSksIShuIGluc3RhbmNlb2YgRWxlbWVudCkmJiFPYmplY3QuaGFzT3duKG4sYCRlbGApKSl7bGV0IHQ9bi4kLmV4cG9zZWQscj1PYmplY3QuYXNzaWduKHt9LGEpO2ZvcihsZXQgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dFtlXX0pO2UuZXhwb3NlZD1yfX1yZXR1cm57Zm9yd2FyZFJlZjpvLGN1cnJlbnRSZWY6dCxjdXJyZW50RWxlbWVudDpufX1mdW5jdGlvbiBLeShlKXtsZXQgdD1GcygpLG49T2JqZWN0LmtleXModD8udHlwZS5wcm9wcz8/e30pLnJlZHVjZSgoZSxuKT0+e2xldCByPSh0Py50eXBlLnByb3BzW25dKS5kZWZhdWx0O3JldHVybiByIT09dm9pZCAwJiYoZVtuXT1yKSxlfSx7fSkscj1TbihlKTtyZXR1cm4gVygoKT0+e2xldCBlPXt9LGk9dD8udm5vZGUucHJvcHM/P3t9O3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKHQ9PntlW0UodCldPWlbdF19KSxPYmplY3Qua2V5cyh7Li4ubiwuLi5lfSkucmVkdWNlKChlLHQpPT4oci52YWx1ZVt0XSE9PXZvaWQgMCYmKGVbdF09ci52YWx1ZVt0XSksZSkse30pfSl9ZnVuY3Rpb24gcXkoZSx0KXtsZXQgbj1LeShlKSxyPXQ/V3kodCk6e307cmV0dXJuIFcoKCk9Pih7Li4ubi52YWx1ZSwuLi5yfSkpfXZhciBKeT0wO2Z1bmN0aW9uIFl5KGUsdD1gcmVrYWApe2lmKGUpcmV0dXJuIGU7bGV0IG4scj1WeSh7dXNlSWQ6dm9pZCAwfSk7cmV0dXJuIG49ci51c2VJZD9yLnVzZUlkKCk6YHVzZUlkYGluIGJ1P2FpPy4oKTpgJHsrK0p5fWAsdD9gJHt0fS0ke259YDpufWZ1bmN0aW9uIFh5KGUsdCl7bGV0IG49TShlKTtmdW5jdGlvbiByKGUpe3JldHVybiB0W24udmFsdWVdW2VdPz9uLnZhbHVlfXJldHVybntzdGF0ZTpuLGRpc3BhdGNoOmU9PntuLnZhbHVlPXIoZSl9fX1mdW5jdGlvbiBaeShlLHQpe2xldCBuPU0oe30pLHI9TShgbm9uZWApLGk9TShlKSxhPWUudmFsdWU/YG1vdW50ZWRgOmB1bm1vdW50ZWRgLG8scz10LnZhbHVlPy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Pz9EeSx7c3RhdGU6YyxkaXNwYXRjaDpsfT1YeShhLHttb3VudGVkOntVTk1PVU5UOmB1bm1vdW50ZWRgLEFOSU1BVElPTl9PVVQ6YHVubW91bnRTdXNwZW5kZWRgfSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDpgbW91bnRlZGAsQU5JTUFUSU9OX0VORDpgdW5tb3VudGVkYH0sdW5tb3VudGVkOntNT1VOVDpgbW91bnRlZGB9fSksdT1lPT57aWYoZnkpe2xldCBuPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTt0LnZhbHVlPy5kaXNwYXRjaEV2ZW50KG4pfX07RXIoZSxhc3luYyhlLGkpPT57bGV0IGE9aSE9PWU7aWYoYXdhaXQgUW4oKSxhKXtsZXQgYT1yLnZhbHVlLG89UXkodC52YWx1ZSk7ZT8obChgTU9VTlRgKSx1KGBlbnRlcmApLG89PT1gbm9uZWAmJnUoYGFmdGVyLWVudGVyYCkpOm89PT1gbm9uZWB8fG89PT1gdW5kZWZpbmVkYHx8bi52YWx1ZT8uZGlzcGxheT09PWBub25lYD8obChgVU5NT1VOVGApLHUoYGxlYXZlYCksdShgYWZ0ZXItbGVhdmVgKSk6aSYmYSE9PW8/KGwoYEFOSU1BVElPTl9PVVRgKSx1KGBsZWF2ZWApKToobChgVU5NT1VOVGApLHUoYGFmdGVyLWxlYXZlYCkpfX0se2ltbWVkaWF0ZTohMH0pO2xldCBkPWU9PntpZihlLnRhcmdldCE9PXQudmFsdWUpcmV0dXJuO2xldCBuPVF5KHQudmFsdWUpLHI9bi5pbmNsdWRlcyhDU1MuZXNjYXBlKGUuYW5pbWF0aW9uTmFtZSkpLGE9Yy52YWx1ZT09PWBtb3VudGVkYD9gZW50ZXJgOmBsZWF2ZWA7aWYociYmKHUoYGFmdGVyLSR7YX1gKSxsKGBBTklNQVRJT05fRU5EYCksIWkudmFsdWUpKXtsZXQgZT10LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlO3QudmFsdWUuc3R5bGUuYW5pbWF0aW9uRmlsbE1vZGU9YGZvcndhcmRzYCxvPXM/LnNldFRpbWVvdXQoKCk9Pnt0LnZhbHVlPy5zdHlsZS5hbmltYXRpb25GaWxsTW9kZT09PWBmb3J3YXJkc2AmJih0LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlPWUpfSl9bj09PWBub25lYCYmbChgQU5JTUFUSU9OX0VORGApfSxmPWU9PntlLnRhcmdldD09PXQudmFsdWUmJihyLnZhbHVlPVF5KHQudmFsdWUpKX0scD1Fcih0LChlLHQpPT57ZT8obi52YWx1ZT1nZXRDb21wdXRlZFN0eWxlKGUpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uc3RhcnRgLGYpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uY2FuY2VsYCxkKSxlLmFkZEV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpOihsKGBBTklNQVRJT05fRU5EYCksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbnN0YXJ0YCxmKSx0Py5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpfSx7aW1tZWRpYXRlOiEwfSksbT1FcihjLCgpPT57bGV0IGU9UXkodC52YWx1ZSk7ci52YWx1ZT1jLnZhbHVlPT09YG1vdW50ZWRgP2U6YG5vbmVgfSk7cmV0dXJuIHRhKCgpPT57cCgpLG0oKSx0LnZhbHVlJiYodC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25zdGFydGAsZiksdC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQudmFsdWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uZW5kYCxkKSksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pfSkse2lzUHJlc2VudDpXKCgpPT5bYG1vdW50ZWRgLGB1bm1vdW50U3VzcGVuZGVkYF0uaW5jbHVkZXMoYy52YWx1ZSkpfX1mdW5jdGlvbiBReShlKXtyZXR1cm4gZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKS5hbmltYXRpb25OYW1lfHxgbm9uZWB9dmFyICR5PUYoe25hbWU6YFByZXNlbmNlYCxwcm9wczp7cHJlc2VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW59fSxzbG90czp7fSxzZXR1cChlLHtzbG90czp0LGV4cG9zZTpufSl7bGV0e3ByZXNlbnQ6cixmb3JjZU1vdW50Oml9PXluKGUpLGE9TSgpLHtpc1ByZXNlbnQ6b309WnkocixhKTtuKHtwcmVzZW50Om99KTtsZXQgcz10LmRlZmF1bHQoe3ByZXNlbnQ6by52YWx1ZX0pO3M9THkoc3x8W10pO2xldCBjPUZzKCk7aWYocyYmcz8ubGVuZ3RoPjEpe2xldCBlPWM/LnBhcmVudD8udHlwZS5uYW1lP2A8JHtjLnBhcmVudC50eXBlLm5hbWV9IC8+YDpgY29tcG9uZW50YDt0aHJvdyBFcnJvcihbYERldGVjdGVkIGFuIGludmFsaWQgY2hpbGRyZW4gZm9yIFxgJHtlfVxgIGZvciAgXGBQcmVzZW5jZVxgIGNvbXBvbmVudC5gLGBgLCJOb3RlOiBQcmVzZW5jZSB3b3JrcyBzaW1pbGFybHkgdG8gYHYtaWZgIGRpcmVjdGx5LCBidXQgaXQgd2FpdHMgZm9yIGFuaW1hdGlvbi90cmFuc2l0aW9uIHRvIGZpbmlzaGVkIGJlZm9yZSB1bm1vdW50aW5nLiBTbyBpdCBleHBlY3Qgb25seSBvbmUgZGlyZWN0IGNoaWxkIG9mIHZhbGlkIFZOb2RlIHR5cGUuIixgWW91IGNhbiBhcHBseSBhIGZldyBzb2x1dGlvbnM6YCxbIlByb3ZpZGUgYSBzaW5nbGUgY2hpbGQgZWxlbWVudCBzbyB0aGF0IGBwcmVzZW5jZWAgZGlyZWN0aXZlIGF0dGFjaCBjb3JyZWN0bHkuIixgRW5zdXJlIHRoZSBmaXJzdCBjaGlsZCBpcyBhbiBhY3R1YWwgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmF3IHRleHQgbm9kZSBvciBjb21tZW50IG5vZGUuYF0ubWFwKGU9PmAgIC0gJHtlfWApLmpvaW4oYApgKV0uam9pbihgCmApKX1yZXR1cm4oKT0+aS52YWx1ZXx8ci52YWx1ZXx8by52YWx1ZT9HKHQuZGVmYXVsdCh7cHJlc2VudDpvLnZhbHVlfSlbMF0se3JlZjplPT57bGV0IHQ9T3koZSk7cmV0dXJuIHQ/Lmhhc0F0dHJpYnV0ZT09PXZvaWQgMHx8KHQ/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9hLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6YS52YWx1ZT10KSx0fX0pOm51bGx9fSksZWI9Rih7bmFtZTpgUHJpbWl0aXZlU2xvdGAsaW5oZXJpdEF0dHJzOiExLHNldHVwKGUse2F0dHJzOnQsc2xvdHM6bn0pe3JldHVybigpPT57aWYoIW4uZGVmYXVsdClyZXR1cm4gbnVsbDtsZXQgZT1MeShuLmRlZmF1bHQoKSkscj1lLmZpbmRJbmRleChlPT5lLnR5cGUhPT1jcyk7aWYocj09PS0xKXJldHVybiBlO2xldCBpPWVbcl07ZGVsZXRlIGkucHJvcHM/LnJlZjtsZXQgYT1pLnByb3BzP2tzKHQsaS5wcm9wcyk6dCxvPUNzKHsuLi5pLHByb3BzOnt9fSxhKTtyZXR1cm4gZS5sZW5ndGg9PT0xP286KGVbcl09byxlKX19fSksdGI9W2BhcmVhYCxgaW1nYCxgaW5wdXRgXSxuYj1GKHtuYW1lOmBQcmltaXRpdmVgLGluaGVyaXRBdHRyczohMSxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFzOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxkZWZhdWx0OmBkaXZgfX0sc2V0dXAoZSx7YXR0cnM6dCxzbG90czpufSl7bGV0IHI9ZS5hc0NoaWxkP2B0ZW1wbGF0ZWA6ZS5hcztyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgJiZ0Yi5pbmNsdWRlcyhyKT8oKT0+RyhyLHQpOnI9PT1gdGVtcGxhdGVgPygpPT5HKGViLHQse2RlZmF1bHQ6bi5kZWZhdWx0fSk6KCk9PkcoZS5hcyx0LHtkZWZhdWx0Om4uZGVmYXVsdH0pfX0pO2Z1bmN0aW9uIHJiKCl7bGV0IGU9TSgpO3JldHVybntwcmltaXRpdmVFbGVtZW50OmUsY3VycmVudEVsZW1lbnQ6VygoKT0+W2AjdGV4dGAsYCNjb21tZW50YF0uaW5jbHVkZXMoZS52YWx1ZT8uJGVsLm5vZGVOYW1lKT9lLnZhbHVlPy4kZWwubmV4dEVsZW1lbnRTaWJsaW5nOk95KGUpKX19dmFyW2liLGFiXT1veShgQ29sbGFwc2libGVSb290YCksb2I9Rih7X19uYW1lOmBDb2xsYXBzaWJsZVJvb3RgLHByb3BzOntkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LG9wZW46e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OnZvaWQgMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtleHBvc2U6dCxlbWl0Om59KXtsZXQgcj1lLGk9SXkocixgb3BlbmAsbix7ZGVmYXVsdFZhbHVlOnIuZGVmYXVsdE9wZW4scGFzc2l2ZTpyLm9wZW49PT12b2lkIDB9KSx7ZGlzYWJsZWQ6YSx1bm1vdW50T25IaWRlOm99PXluKHIpO3JldHVybiBhYih7Y29udGVudElkOmBgLGRpc2FibGVkOmEsb3BlbjppLHVubW91bnRPbkhpZGU6byxvbk9wZW5Ub2dnbGU6KCk9PnthLnZhbHVlfHwoaS52YWx1ZT0haS52YWx1ZSl9fSksdCh7b3BlbjppfSksR3koKSwoZSx0KT0+KFIoKSxCKE4obmIpLHthczplLmFzLCJhcy1jaGlsZCI6ci5hc0NoaWxkLCJkYXRhLXN0YXRlIjpOKGkpP2BvcGVuYDpgY2xvc2VkYCwiZGF0YS1kaXNhYmxlZCI6TihhKT9gYDp2b2lkIDB9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx7b3BlbjpOKGkpfSldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLHNiPUYoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YENvbGxhcHNpYmxlQ29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Bjb250ZW50Rm91bmRgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPWliKCk7aS5jb250ZW50SWR8fD1ZeSh2b2lkIDAsYHJla2EtY29sbGFwc2libGUtY29udGVudGApO2xldCBhPU0oKSx7Zm9yd2FyZFJlZjpvLGN1cnJlbnRFbGVtZW50OnN9PUd5KCksYz1NKDApLGw9TSgwKSx1PVcoKCk9Pmkub3Blbi52YWx1ZSksZD1NKHUudmFsdWUpLGY9TSgpO0VyKCgpPT5bdS52YWx1ZSxhLnZhbHVlPy5wcmVzZW50XSxhc3luYygpPT57YXdhaXQgUW4oKTtsZXQgZT1zLnZhbHVlO2lmKCFlKXJldHVybjtmLnZhbHVlPWYudmFsdWV8fHt0cmFuc2l0aW9uRHVyYXRpb246ZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24sYW5pbWF0aW9uTmFtZTplLnN0eWxlLmFuaW1hdGlvbk5hbWV9LGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZS5zdHlsZS5hbmltYXRpb25OYW1lPWBub25lYDtsZXQgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2wudmFsdWU9dC5oZWlnaHQsYy52YWx1ZT10LndpZHRoLGQudmFsdWV8fChlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1mLnZhbHVlLnRyYW5zaXRpb25EdXJhdGlvbixlLnN0eWxlLmFuaW1hdGlvbk5hbWU9Zi52YWx1ZS5hbmltYXRpb25OYW1lKX0se2ltbWVkaWF0ZTohMH0pO2xldCBwPVcoKCk9PmQudmFsdWUmJmkub3Blbi52YWx1ZSk7cmV0dXJuIFppKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZC52YWx1ZT0hMX0pfSksa3kocyxgYmVmb3JlbWF0Y2hgLGU9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntpLm9uT3BlblRvZ2dsZSgpLHIoYGNvbnRlbnRGb3VuZGApfSl9KSwoZSx0KT0+KFIoKSxCKE4oJHkpLHtyZWZfa2V5OmBwcmVzZW50UmVmYCxyZWY6YSxwcmVzZW50OmUuZm9yY2VNb3VudHx8TihpKS5vcGVuLnZhbHVlLCJmb3JjZS1tb3VudCI6ITB9LHtkZWZhdWx0OlAoKHtwcmVzZW50OnR9KT0+W0goTihuYiksa3MoZS4kYXR0cnMse2lkOk4oaSkuY29udGVudElkLHJlZjpOKG8pLCJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOmUuYXMsaGlkZGVuOnQ/dm9pZCAwOk4oaSkudW5tb3VudE9uSGlkZS52YWx1ZT9gYDpgdW50aWwtZm91bmRgLCJkYXRhLXN0YXRlIjpwLnZhbHVlP3ZvaWQgMDpOKGkpLm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjpOKGkpLmRpc2FibGVkPy52YWx1ZT9gYDp2b2lkIDAsc3R5bGU6eyItLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQiOmAke2wudmFsdWV9cHhgLCItLXJla2EtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6YCR7Yy52YWx1ZX1weGB9fSkse2RlZmF1bHQ6UCgoKT0+WyFOKGkpLnVubW91bnRPbkhpZGUudmFsdWV8fHQ/SShlLiRzbG90cyxgZGVmYXVsdGAse2tleTowfSk6VHMoYHYtaWZgLCEwKV0pLF86Mn0sMTA0MCxbYGlkYCxgYXMtY2hpbGRgLGBhc2AsYGhpZGRlbmAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgc3R5bGVgXSldKSxfOjN9LDgsW2BwcmVzZW50YF0pKX19KSxjYj1GKHtfX25hbWU6YENvbGxhcHNpYmxlVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZTtHeSgpO2xldCBuPWliKCk7cmV0dXJuKGUscik9PihSKCksQihOKG5iKSx7dHlwZTplLmFzPT09YGJ1dHRvbmA/YGJ1dHRvbmA6dm9pZCAwLGFzOmUuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImFyaWEtY29udHJvbHMiOk4obikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpOKG4pLm9wZW4udmFsdWUsImRhdGEtc3RhdGUiOk4obikub3Blbi52YWx1ZT9gb3BlbmA6YGNsb3NlZGAsImRhdGEtZGlzYWJsZWQiOk4obikuZGlzYWJsZWQ/LnZhbHVlP2BgOnZvaWQgMCxkaXNhYmxlZDpOKG4pLmRpc2FibGVkPy52YWx1ZSxvbkNsaWNrOk4obikub25PcGVuVG9nZ2xlfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFzYCxgYXMtY2hpbGRgLGBhcmlhLWNvbnRyb2xzYCxgYXJpYS1leHBhbmRlZGAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGlzYWJsZWRgLGBvbkNsaWNrYF0pKX19KTtmdW5jdGlvbiBsYih7dHlwZTplLGRlZmF1bHRWYWx1ZTp0LG1vZGVsVmFsdWU6bn0pe2xldCByPW58fHQ7cmV0dXJuIG4hPT12b2lkIDB8fHQhPT12b2lkIDA/QXJyYXkuaXNBcnJheShyKT9gbXVsdGlwbGVgOmBzaW5nbGVgOmU/P2BzaW5nbGVgfWZ1bmN0aW9uIHViKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl7cmV0dXJuIGV8fGxiKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl9ZnVuY3Rpb24gZGIoe3R5cGU6ZSxkZWZhdWx0VmFsdWU6dH0pe3JldHVybiB0PT09dm9pZCAwP2U9PT1gc2luZ2xlYD92b2lkIDA6W106dH1mdW5jdGlvbiBmYihlLHQpe2xldCBuPVcoKCk9PnViKGUpKSxyPUl5KGUsYG1vZGVsVmFsdWVgLHQse2RlZmF1bHRWYWx1ZTpkYihlKSxwYXNzaXZlOmUubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSk7ZnVuY3Rpb24gaShlKXtpZihuLnZhbHVlPT09YHNpbmdsZWApci52YWx1ZT1heShlLHIudmFsdWUpP3ZvaWQgMDplO2Vsc2V7bGV0IHQ9QXJyYXkuaXNBcnJheShyLnZhbHVlKT9bLi4uci52YWx1ZXx8W11dOltyLnZhbHVlXS5maWx0ZXIoQm9vbGVhbik7aWYobHkodCxlKSl7bGV0IG49dC5maW5kSW5kZXgodD0+YXkodCxlKSk7dC5zcGxpY2UobiwxKX1lbHNlIHQucHVzaChlKTtyLnZhbHVlPXR9fXJldHVybnttb2RlbFZhbHVlOnIsY2hhbmdlTW9kZWxWYWx1ZTppLGlzU2luZ2xlOlcoKCk9Pm4udmFsdWU9PT1gc2luZ2xlYCl9fXZhcltwYixtYl09b3koYEFjY29yZGlvblJvb3RgKSxoYj1GKHtfX25hbWU6YEFjY29yZGlvblJvb3RgLHByb3BzOntjb2xsYXBzaWJsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sb3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHZlcnRpY2FsYH0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sdHlwZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LG1vZGVsVmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGVmYXVsdFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2RpcjppLGRpc2FibGVkOmEsdW5tb3VudE9uSGlkZTpvfT15bihuKSxzPVV5KGkpLHttb2RlbFZhbHVlOmMsY2hhbmdlTW9kZWxWYWx1ZTpsLGlzU2luZ2xlOnV9PWZiKG4scikse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1HeSgpO3JldHVybiBtYih7ZGlzYWJsZWQ6YSxkaXJlY3Rpb246cyxvcmllbnRhdGlvbjpuLm9yaWVudGF0aW9uLHBhcmVudEVsZW1lbnQ6Zixpc1NpbmdsZTp1LGNvbGxhcHNpYmxlOm4uY29sbGFwc2libGUsbW9kZWxWYWx1ZTpjLGNoYW5nZU1vZGVsVmFsdWU6bCx1bm1vdW50T25IaWRlOm99KSwoZSx0KT0+KFIoKSxCKE4obmIpLHtyZWY6TihkKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse21vZGVsVmFsdWU6TihjKX0pXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2BdKSl9fSksZ2I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuT3Blbj1gb3BlbmAsZS5DbG9zZWQ9YGNsb3NlZGAsZX0oZ2J8fHt9KSxbX2IsdmJdPW95KGBBY2NvcmRpb25JdGVtYCkseWI9Rih7X19uYW1lOmBBY2NvcmRpb25JdGVtYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDp2b2lkIDB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUse2V4cG9zZTp0fSl7bGV0IG49ZSxyPXBiKCksaT1XKCgpPT5yLmlzU2luZ2xlLnZhbHVlP24udmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWU6QXJyYXkuaXNBcnJheShyLm1vZGVsVmFsdWUudmFsdWUpJiZyLm1vZGVsVmFsdWUudmFsdWUuaW5jbHVkZXMobi52YWx1ZSkpLGE9VygoKT0+ci5kaXNhYmxlZC52YWx1ZXx8bi5kaXNhYmxlZCksbz1XKCgpPT5hLnZhbHVlP2BgOnZvaWQgMCkscz1XKCgpPT5pLnZhbHVlP2diLk9wZW46Z2IuQ2xvc2VkKTt0KHtvcGVuOmksZGF0YURpc2FibGVkOm99KTtsZXR7Y3VycmVudFJlZjpjLGN1cnJlbnRFbGVtZW50Omx9PUd5KCk7dmIoe29wZW46aSxkYXRhU3RhdGU6cyxkaXNhYmxlZDphLGRhdGFEaXNhYmxlZDpvLHRyaWdnZXJJZDpgYCxjdXJyZW50UmVmOmMsY3VycmVudEVsZW1lbnQ6bCx2YWx1ZTpXKCgpPT5uLnZhbHVlKX0pO2Z1bmN0aW9uIHUoZSl7bGV0IHQ9ZS50YXJnZXQ7aWYoQXJyYXkuZnJvbShyLnBhcmVudEVsZW1lbnQudmFsdWU/LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtXWApPz9bXSkuZmluZEluZGV4KGU9PmU9PT10KT09PS0xKXJldHVybiBudWxsO3p5KGUsdCxyLnBhcmVudEVsZW1lbnQudmFsdWUse2Fycm93S2V5T3B0aW9uczpyLm9yaWVudGF0aW9uLGRpcjpyLmRpcmVjdGlvbi52YWx1ZSxmb2N1czohMH0pfXJldHVybihlLHQpPT4oUigpLEIoTihvYikseyJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLCJkYXRhLWRpc2FibGVkIjpvLnZhbHVlLCJkYXRhLXN0YXRlIjpzLnZhbHVlLGRpc2FibGVkOmEudmFsdWUsb3BlbjppLnZhbHVlLGFzOm4uYXMsImFzLWNoaWxkIjpuLmFzQ2hpbGQsInVubW91bnQtb24taGlkZSI6bi51bm1vdW50T25IaWRlPz9OKHIpLnVubW91bnRPbkhpZGUudmFsdWUsb25LZXlkb3duOm91KHUsW2B1cGAsYGRvd25gLGBsZWZ0YCxgcmlnaHRgLGBob21lYCxgZW5kYF0pfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse29wZW46aS52YWx1ZX0pXSksXzozfSw4LFtgZGF0YS1vcmllbnRhdGlvbmAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBvcGVuYCxgYXNgLGBhcy1jaGlsZGAsYHVubW91bnQtb24taGlkZWBdKSl9fSksYmI9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49cGIoKSxyPV9iKCk7cmV0dXJuIEd5KCksKGUsaSk9PihSKCksQihOKHNiKSx7cm9sZTpgcmVnaW9uYCwiYXMtY2hpbGQiOnQuYXNDaGlsZCxhczplLmFzLCJmb3JjZS1tb3VudCI6dC5mb3JjZU1vdW50LCJhcmlhLWxhYmVsbGVkYnkiOk4ocikudHJpZ2dlcklkLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSwiZGF0YS1kaXNhYmxlZCI6TihyKS5kYXRhRGlzYWJsZWQudmFsdWUsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sc3R5bGU6eyItLXJla2EtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOmB2YXIoLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgpYCwiLS1yZWthLWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6YHZhcigtLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQpYH0sb25Db250ZW50Rm91bmQ6aVswXXx8PWU9Pk4obikuY2hhbmdlTW9kZWxWYWx1ZShOKHIpLnZhbHVlLnZhbHVlKX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBmb3JjZS1tb3VudGAsYGFyaWEtbGFiZWxsZWRieWAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKSl9fSkseGI9Rih7X19uYW1lOmBBY2NvcmRpb25IZWFkZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaDNgfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXBiKCkscj1fYigpO3JldHVybiBHeSgpLChlLGkpPT4oUigpLEIoTihuYikse2FzOnQuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sImRhdGEtc3RhdGUiOk4ocikuZGF0YVN0YXRlLnZhbHVlLCJkYXRhLWRpc2FibGVkIjpOKHIpLmRhdGFEaXNhYmxlZC52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgLGBkYXRhLW9yaWVudGF0aW9uYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLFNiPUYoe19fbmFtZTpgQWNjb3JkaW9uVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUsbj1wYigpLHI9X2IoKTtyLnRyaWdnZXJJZHx8PVl5KHZvaWQgMCxgcmVrYS1hY2NvcmRpb24tdHJpZ2dlcmApO2Z1bmN0aW9uIGkoKXtsZXQgZT1uLmlzU2luZ2xlLnZhbHVlJiZyLm9wZW4udmFsdWUmJiFuLmNvbGxhcHNpYmxlO3IuZGlzYWJsZWQudmFsdWV8fGV8fG4uY2hhbmdlTW9kZWxWYWx1ZShyLnZhbHVlLnZhbHVlKX1yZXR1cm4oZSxhKT0+KFIoKSxCKE4oY2IpLHtpZDpOKHIpLnRyaWdnZXJJZCxyZWY6TihyKS5jdXJyZW50UmVmLCJkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtIjpgYCxhczp0LmFzLCJhcy1jaGlsZCI6dC5hc0NoaWxkLCJhcmlhLWRpc2FibGVkIjpOKHIpLmRpc2FibGVkLnZhbHVlfHx2b2lkIDAsImFyaWEtZXhwYW5kZWQiOk4ocikub3Blbi52YWx1ZXx8ITEsImRhdGEtZGlzYWJsZWQiOk4ocikuZGF0YURpc2FibGVkLnZhbHVlLCJkYXRhLW9yaWVudGF0aW9uIjpOKG4pLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSxkaXNhYmxlZDpOKHIpLmRpc2FibGVkLnZhbHVlLG9uQ2xpY2s6aX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGlkYCxgYXNgLGBhcy1jaGlsZGAsYGFyaWEtZGlzYWJsZWRgLGBhcmlhLWV4cGFuZGVkYCxgZGF0YS1kaXNhYmxlZGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgXSkpfX0pLENiPWBkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtYDtmdW5jdGlvbiB3YihlPXt9KXtsZXR7a2V5OnQ9YGAsaXNQcm92aWRlcjpuPSExfT1lLHI9YCR7dH1Db2xsZWN0aW9uUHJvdmlkZXJgLGk7bj8oaT17Y29sbGVjdGlvblJlZjpNKCksaXRlbU1hcDpNKG5ldyBNYXApfSx2cihyLGkpKTppPXlyKHIpO2xldCBhPShlPSExKT0+e2xldCB0PWkuY29sbGVjdGlvblJlZi52YWx1ZTtpZighdClyZXR1cm5bXTtsZXQgbj1BcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbChgWyR7Q2J9XWApKSxyPW5ldyBNYXAobi5tYXAoKGUsdCk9PltlLHRdKSksYT1BcnJheS5mcm9tKGkuaXRlbU1hcC52YWx1ZS52YWx1ZXMoKSkuc29ydCgoZSx0KT0+KHIuZ2V0KGUucmVmKT8/LTEpLShyLmdldCh0LnJlZik/Py0xKSk7cmV0dXJuIGU/YTphLmZpbHRlcihlPT5lLnJlZi5kYXRhc2V0LmRpc2FibGVkIT09YGApfSxvPUYoe25hbWU6YENvbGxlY3Rpb25TbG90YCxpbmhlcml0QXR0cnM6ITEsc2V0dXAoZSx7c2xvdHM6dCxhdHRyczpufSl7bGV0e3ByaW1pdGl2ZUVsZW1lbnQ6cixjdXJyZW50RWxlbWVudDphfT1yYigpO3JldHVybiBFcihhLCgpPT57aS5jb2xsZWN0aW9uUmVmLnZhbHVlPWEudmFsdWV9KSwoKT0+RyhlYix7cmVmOnIsLi4ubn0sdCl9fSkscz1GKHtuYW1lOmBDb2xsZWN0aW9uSXRlbWAsaW5oZXJpdEF0dHJzOiExLHByb3BzOnt2YWx1ZTp7dmFsaWRhdG9yOigpPT4hMH19LHNldHVwKGUse3Nsb3RzOnQsYXR0cnM6bn0pe2xldHtwcmltaXRpdmVFbGVtZW50OnIsY3VycmVudEVsZW1lbnQ6YX09cmIoKTtyZXR1cm4gQ3IodD0+e2lmKGEudmFsdWUpe2xldCBuPXNuKGEudmFsdWUpO2kuaXRlbU1hcC52YWx1ZS5zZXQobix7cmVmOmEudmFsdWUsdmFsdWU6ZS52YWx1ZX0pLHQoKCk9PmkuaXRlbU1hcC52YWx1ZS5kZWxldGUobikpfX0pLCgpPT5HKGViLHsuLi5uLFtDYl06YGAscmVmOnJ9LHQpfX0pO3JldHVybntnZXRJdGVtczphLHJlYWN0aXZlSXRlbXM6VygoKT0+QXJyYXkuZnJvbShpLml0ZW1NYXAudmFsdWUudmFsdWVzKCkpKSxpdGVtTWFwU2l6ZTpXKCgpPT5pLml0ZW1NYXAudmFsdWUuc2l6ZSksQ29sbGVjdGlvblNsb3Q6byxDb2xsZWN0aW9uSXRlbTpzfX12YXIgVGI9YHJvdmluZ0ZvY3VzR3JvdXAub25FbnRyeUZvY3VzYCxFYj17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxEYj17QXJyb3dMZWZ0OmBwcmV2YCxBcnJvd1VwOmBwcmV2YCxBcnJvd1JpZ2h0OmBuZXh0YCxBcnJvd0Rvd246YG5leHRgLFBhZ2VVcDpgZmlyc3RgLEhvbWU6YGZpcnN0YCxQYWdlRG93bjpgbGFzdGAsRW5kOmBsYXN0YH07ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gdD09PWBydGxgP2U9PT1gQXJyb3dMZWZ0YD9gQXJyb3dSaWdodGA6ZT09PWBBcnJvd1JpZ2h0YD9gQXJyb3dMZWZ0YDplOmV9ZnVuY3Rpb24ga2IoZSx0LG4pe2xldCByPU9iKGUua2V5LG4pO2lmKCEodD09PWB2ZXJ0aWNhbGAmJltgQXJyb3dMZWZ0YCxgQXJyb3dSaWdodGBdLmluY2x1ZGVzKHIpKSYmISh0PT09YGhvcml6b250YWxgJiZbYEFycm93VXBgLGBBcnJvd0Rvd25gXS5pbmNsdWRlcyhyKSkpcmV0dXJuIERiW3JdfWZ1bmN0aW9uIEFiKGUsdD0hMSl7bGV0IG49c3koKTtmb3IobGV0IHIgb2YgZSlpZihyPT09bnx8KHIuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dH0pLHN5KCkhPT1uKSlyZXR1cm59ZnVuY3Rpb24gamIoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX12YXJbTWIsTmJdPW95KGBSb3ZpbmdGb2N1c0dyb3VwYCksUGI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0dyb3VwYCxwcm9wczp7b3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sY3VycmVudFRhYlN0b3BJZDp7dHlwZTpbU3RyaW5nLG51bGxdLHJlcXVpcmVkOiExfSxkZWZhdWx0Q3VycmVudFRhYlN0b3BJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYGVudHJ5Rm9jdXNgLGB1cGRhdGU6Y3VycmVudFRhYlN0b3BJZGBdLHNldHVwKGUse2V4cG9zZTp0LGVtaXQ6bn0pe2xldCByPWUsaT1uLHtsb29wOmEsb3JpZW50YXRpb246byxkaXI6c309eW4ociksYz1VeShzKSxsPUl5KHIsYGN1cnJlbnRUYWJTdG9wSWRgLGkse2RlZmF1bHRWYWx1ZTpyLmRlZmF1bHRDdXJyZW50VGFiU3RvcElkLHBhc3NpdmU6ci5jdXJyZW50VGFiU3RvcElkPT09dm9pZCAwfSksdT1NKCExKSxkPU0oITEpLGY9TSgwKSx7Z2V0SXRlbXM6cCxDb2xsZWN0aW9uU2xvdDptfT13Yih7aXNQcm92aWRlcjohMH0pO2Z1bmN0aW9uIGgoZSl7bGV0IHQ9IWQudmFsdWU7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLnRhcmdldD09PWUuY3VycmVudFRhcmdldCYmdCYmIXUudmFsdWUpe2xldCB0PW5ldyBDdXN0b21FdmVudChUYixFYik7aWYoZS5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQodCksaShgZW50cnlGb2N1c2AsdCksIXQuZGVmYXVsdFByZXZlbnRlZCl7bGV0IGU9cCgpLm1hcChlPT5lLnJlZikuZmlsdGVyKGU9PmUuZGF0YXNldC5kaXNhYmxlZCE9PWBgKTtBYihbZS5maW5kKGU9PmUuZ2V0QXR0cmlidXRlKGBkYXRhLWFjdGl2ZWApPT09YGApLGUuZmluZChlPT5lLmdldEF0dHJpYnV0ZShgZGF0YS1oaWdobGlnaHRlZGApPT09YGApLGUuZmluZChlPT5lLmlkPT09bC52YWx1ZSksLi4uZV0uZmlsdGVyKEJvb2xlYW4pLHIucHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyl9fWQudmFsdWU9ITF9ZnVuY3Rpb24gZygpe3NldFRpbWVvdXQoKCk9PntkLnZhbHVlPSExfSwxKX1yZXR1cm4gdCh7Z2V0SXRlbXM6cH0pLE5iKHtsb29wOmEsZGlyOmMsb3JpZW50YXRpb246byxjdXJyZW50VGFiU3RvcElkOmwsb25JdGVtRm9jdXM6ZT0+e2wudmFsdWU9ZX0sb25JdGVtU2hpZnRUYWI6KCk9Pnt1LnZhbHVlPSEwfSxvbkZvY3VzYWJsZUl0ZW1BZGQ6KCk9PntmLnZhbHVlKyt9LG9uRm9jdXNhYmxlSXRlbVJlbW92ZTooKT0+e2YudmFsdWUtLX19KSwoZSx0KT0+KFIoKSxCKE4obSksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7dGFiaW5kZXg6dS52YWx1ZXx8Zi52YWx1ZT09PTA/LTE6MCwiZGF0YS1vcmllbnRhdGlvbiI6TihvKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGRpcjpOKGMpLHN0eWxlOntvdXRsaW5lOmBub25lYH0sb25Nb3VzZWRvd246dFswXXx8PWU9PmQudmFsdWU9ITAsb25Nb3VzZXVwOmcsb25Gb2N1czpoLG9uQmx1cjp0WzFdfHw9ZT0+dS52YWx1ZT0hMX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYHRhYmluZGV4YCxgZGF0YS1vcmllbnRhdGlvbmAsYGFzYCxgYXMtY2hpbGRgLGBkaXJgXSldKSxfOjN9KSl9fSksRmI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0l0ZW1gLHByb3BzOnt0YWJTdG9wSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxmb2N1c2FibGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYWxsb3dTaGlmdEtleTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLG49TWIoKSxyPVl5KCksaT1XKCgpPT50LnRhYlN0b3BJZHx8ciksYT1XKCgpPT5uLmN1cnJlbnRUYWJTdG9wSWQudmFsdWU9PT1pLnZhbHVlKSx7Z2V0SXRlbXM6byxDb2xsZWN0aW9uSXRlbTpzfT13YigpO1ppKCgpPT57dC5mb2N1c2FibGUmJm4ub25Gb2N1c2FibGVJdGVtQWRkKCl9KSx0YSgoKT0+e3QuZm9jdXNhYmxlJiZuLm9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpfSksRXIoKCk9PnQuZm9jdXNhYmxlLChlLHQpPT57ZSE9PXQmJihlP24ub25Gb2N1c2FibGVJdGVtQWRkKCk6bi5vbkZvY3VzYWJsZUl0ZW1SZW1vdmUoKSl9KTtmdW5jdGlvbiBjKGUpe2lmKGUua2V5PT09YFRhYmAmJmUuc2hpZnRLZXkpe24ub25JdGVtU2hpZnRUYWIoKTtyZXR1cm59aWYoZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQpcmV0dXJuO2xldCByPWtiKGUsbi5vcmllbnRhdGlvbi52YWx1ZSxuLmRpci52YWx1ZSk7aWYociE9PXZvaWQgMCl7aWYoZS5tZXRhS2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5fHwhdC5hbGxvd1NoaWZ0S2V5JiZlLnNoaWZ0S2V5KXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7bGV0IGk9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpLmZpbHRlcihlPT5lLmRhdGFzZXQuZGlzYWJsZWQhPT1gYCldO2lmKHI9PT1gbGFzdGApaS5yZXZlcnNlKCk7ZWxzZSBpZihyPT09YHByZXZgfHxyPT09YG5leHRgKXtyPT09YHByZXZgJiZpLnJldmVyc2UoKTtsZXQgdD1pLmluZGV4T2YoZS5jdXJyZW50VGFyZ2V0KTtpPW4ubG9vcC52YWx1ZT9qYihpLHQrMSk6aS5zbGljZSh0KzEpfVFuKCgpPT5BYihpKSl9fXJldHVybihlLHQpPT4oUigpLEIoTihzKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4obmIpLHt0YWJpbmRleDphLnZhbHVlPzA6LTEsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24udmFsdWUsImRhdGEtYWN0aXZlIjplLmFjdGl2ZT9gYDp2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmUuZm9jdXNhYmxlP3ZvaWQgMDpgYCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLG9uTW91c2Vkb3duOnRbMF18fD10PT57ZS5mb2N1c2FibGU/TihuKS5vbkl0ZW1Gb2N1cyhpLnZhbHVlKTp0LnByZXZlbnREZWZhdWx0KCl9LG9uRm9jdXM6dFsxXXx8PWU9Pk4obikub25JdGVtRm9jdXMoaS52YWx1ZSksb25LZXlkb3duOmN9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2B0YWJpbmRleGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLWFjdGl2ZWAsYGRhdGEtZGlzYWJsZWRgLGBhc2AsYGFzLWNoaWxkYF0pXSksXzozfSkpfX0pLFtJYixMYl09b3koYFRhYnNSb290YCksUmI9Rih7X19uYW1lOmBUYWJzUm9vdGAscHJvcHM6e2RlZmF1bHRWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxvcmllbnRhdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaG9yaXpvbnRhbGB9LGRpcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFjdGl2YXRpb25Nb2RlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBhdXRvbWF0aWNgfSxtb2RlbFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse29yaWVudGF0aW9uOmksdW5tb3VudE9uSGlkZTphLGRpcjpvfT15bihuKSxzPVV5KG8pO0d5KCk7bGV0IGM9SXkobixgbW9kZWxWYWx1ZWAscix7ZGVmYXVsdFZhbHVlOm4uZGVmYXVsdFZhbHVlLHBhc3NpdmU6bi5tb2RlbFZhbHVlPT09dm9pZCAwfSksbD1NKCksdT11bihuZXcgU2V0KTtyZXR1cm4gTGIoe21vZGVsVmFsdWU6YyxjaGFuZ2VNb2RlbFZhbHVlOmU9PntjLnZhbHVlPWV9LG9yaWVudGF0aW9uOmksZGlyOnMsdW5tb3VudE9uSGlkZTphLGFjdGl2YXRpb25Nb2RlOm4uYWN0aXZhdGlvbk1vZGUsYmFzZUlkOll5KHZvaWQgMCxgcmVrYS10YWJzYCksdGFic0xpc3Q6bCxjb250ZW50SWRzOnUscmVnaXN0ZXJDb250ZW50OmU9Pnt1LnZhbHVlPW5ldyBTZXQoWy4uLnUudmFsdWUsZV0pfSx1bnJlZ2lzdGVyQ29udGVudDplPT57bGV0IHQ9bmV3IFNldCh1LnZhbHVlKTt0LmRlbGV0ZShlKSx1LnZhbHVlPXR9fSksKGUsdCk9PihSKCksQihOKG5iKSx7ZGlyOk4ocyksImRhdGEtb3JpZW50YXRpb24iOk4oaSksImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hc30se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOk4oYyl9KV0pLF86M30sOCxbYGRpcmAsYGRhdGEtb3JpZW50YXRpb25gLGBhcy1jaGlsZGAsYGFzYF0pKX19KTtmdW5jdGlvbiB6YihlLHQpe3JldHVybmAke2V9LXRyaWdnZXItJHt0fWB9ZnVuY3Rpb24gQmIoZSx0KXtyZXR1cm5gJHtlfS1jb250ZW50LSR7dH1gfXZhciBWYj1GKHtfX25hbWU6YFRhYnNDb250ZW50YCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse2ZvcndhcmRSZWY6bn09R3koKSxyPUliKCksaT1XKCgpPT56YihyLmJhc2VJZCx0LnZhbHVlKSksYT1XKCgpPT5CYihyLmJhc2VJZCx0LnZhbHVlKSksbz1XKCgpPT50LnZhbHVlPT09ci5tb2RlbFZhbHVlLnZhbHVlKSxzPU0oby52YWx1ZSk7cmV0dXJuIFppKCgpPT57ci5yZWdpc3RlckNvbnRlbnQodC52YWx1ZSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cy52YWx1ZT0hMX0pfSksZWEoKCk9PntyLnVucmVnaXN0ZXJDb250ZW50KHQudmFsdWUpfSksKGUsdCk9PihSKCksQihOKCR5KSx7cHJlc2VudDplLmZvcmNlTW91bnR8fG8udmFsdWUsImZvcmNlLW1vdW50IjpgYH0se2RlZmF1bHQ6UCgoe3ByZXNlbnQ6dH0pPT5bSChOKG5iKSx7aWQ6YS52YWx1ZSxyZWY6TihuKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzLHJvbGU6YHRhYnBhbmVsYCwiZGF0YS1zdGF0ZSI6by52YWx1ZT9gYWN0aXZlYDpgaW5hY3RpdmVgLCJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLnZhbHVlLCJhcmlhLWxhYmVsbGVkYnkiOmkudmFsdWUsaGlkZGVuOiF0LHRhYmluZGV4OmAwYCxzdHlsZTpnZSh7YW5pbWF0aW9uRHVyYXRpb246cy52YWx1ZT9gMHNgOnZvaWQgMH0pfSx7ZGVmYXVsdDpQKCgpPT5bIU4ocikudW5tb3VudE9uSGlkZS52YWx1ZXx8dD9JKGUuJHNsb3RzLGBkZWZhdWx0YCx7a2V5OjB9KTpUcyhgdi1pZmAsITApXSksXzoyfSwxMDMyLFtgaWRgLGBhcy1jaGlsZGAsYGFzYCxgZGF0YS1zdGF0ZWAsYGRhdGEtb3JpZW50YXRpb25gLGBhcmlhLWxhYmVsbGVkYnlgLGBoaWRkZW5gLGBzdHlsZWBdKV0pLF86M30sOCxbYHByZXNlbnRgXSkpfX0pLEhiPUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0e2xvb3A6dH09eW4oZSkse2ZvcndhcmRSZWY6bixjdXJyZW50RWxlbWVudDpyfT1HeSgpLGk9SWIoKTtyZXR1cm4gaS50YWJzTGlzdD1yLChlLHIpPT4oUigpLEIoTihQYikseyJhcy1jaGlsZCI6YGAsb3JpZW50YXRpb246TihpKS5vcmllbnRhdGlvbi52YWx1ZSxkaXI6TihpKS5kaXIudmFsdWUsbG9vcDpOKHQpfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7cmVmOk4obikscm9sZTpgdGFibGlzdGAsImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hcywiYXJpYS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbi52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBhcmlhLW9yaWVudGF0aW9uYF0pXSksXzozfSw4LFtgb3JpZW50YXRpb25gLGBkaXJgLGBsb29wYF0pKX19KSxVYj1GKHtfX25hbWU6YFRhYnNUcmlnZ2VyYCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZSx7Zm9yd2FyZFJlZjpufT1HeSgpLHI9SWIoKSxpPVcoKCk9PnpiKHIuYmFzZUlkLHQudmFsdWUpKSxhPVcoKCk9PnIuY29udGVudElkcy52YWx1ZS5oYXModC52YWx1ZSk/QmIoci5iYXNlSWQsdC52YWx1ZSk6dm9pZCAwKSxvPVcoKCk9PnQudmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWUpO3JldHVybihlLHQpPT4oUigpLEIoTihGYikseyJhcy1jaGlsZCI6YGAsZm9jdXNhYmxlOiFlLmRpc2FibGVkLGFjdGl2ZTpvLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7aWQ6aS52YWx1ZSxyZWY6TihuKSxyb2xlOmB0YWJgLHR5cGU6ZS5hcz09PWBidXR0b25gP2BidXR0b25gOnZvaWQgMCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLCJhcmlhLXNlbGVjdGVkIjpvLnZhbHVlP2B0cnVlYDpgZmFsc2VgLCJhcmlhLWNvbnRyb2xzIjphLnZhbHVlLCJkYXRhLXN0YXRlIjpvLnZhbHVlP2BhY3RpdmVgOmBpbmFjdGl2ZWAsZGlzYWJsZWQ6ZS5kaXNhYmxlZCwiZGF0YS1kaXNhYmxlZCI6ZS5kaXNhYmxlZD9gYDp2b2lkIDAsImRhdGEtb3JpZW50YXRpb24iOk4ocikub3JpZW50YXRpb24udmFsdWUsb25Nb3VzZWRvd246dFswXXx8PWl1KHQ9PnshZS5kaXNhYmxlZCYmdC5jdHJsS2V5PT09ITE/TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpOnQucHJldmVudERlZmF1bHQoKX0sW2BsZWZ0YF0pLG9uS2V5ZG93bjp0WzFdfHw9b3UodD0+TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpLFtgZW50ZXJgLGBzcGFjZWBdKSxvbkZvY3VzOnRbMl18fD0oKT0+e2xldCB0PU4ocikuYWN0aXZhdGlvbk1vZGUhPT1gbWFudWFsYDshby52YWx1ZSYmIWUuZGlzYWJsZWQmJnQmJk4ocikuY2hhbmdlTW9kZWxWYWx1ZShlLnZhbHVlKX19LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BpZGAsYHR5cGVgLGBhc2AsYGFzLWNoaWxkYCxgYXJpYS1zZWxlY3RlZGAsYGFyaWEtY29udHJvbHNgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKV0pLF86M30sOCxbYGZvY3VzYWJsZWAsYGFjdGl2ZWBdKSl9fSksV2I9Rih7X19uYW1lOmBCdXR0b25gLHByb3BzOnt2YXJpYW50Ont9LHNpemU6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7ZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKG4scik9PihSKCksQihOKG5iKSx7ImRhdGEtc2xvdCI6YGJ1dHRvbmAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50LCJkYXRhLXNpemUiOmUuc2l6ZSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGNsYXNzOk8oTihZdikoTihHYikoe3ZhcmlhbnQ6ZS52YXJpYW50LHNpemU6ZS5zaXplfSksdC5jbGFzcykpfSx7ZGVmYXVsdDpQKCgpPT5bSShuLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS12YXJpYW50YCxgZGF0YS1zaXplYCxgYXNgLGBhcy1jaGlsZGAsYGNsYXNzYF0pKX19KSxHYj1DXyhgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBiZy1jbGlwLXBhZGRpbmcgdGV4dC1zbSBmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGFjdGl2ZTpub3QtYXJpYS1baGFzcG9wdXBdOnRyYW5zbGF0ZS15LXB4IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTQgZ3JvdXAvYnV0dG9uIGlubGluZS1mbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgc2VsZWN0LW5vbmUgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6YGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2FdOmhvdmVyOmJnLXByaW1hcnkvODBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1tdXRlZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLHNlY29uZGFyeTpgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIGFyaWEtZXhwYW5kZWQ6Ymctc2Vjb25kYXJ5IGFyaWEtZXhwYW5kZWQ6dGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZGAsZ2hvc3Q6YGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBkYXJrOmhvdmVyOmJnLW11dGVkLzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLGRlc3RydWN0aXZlOmBiZy1kZXN0cnVjdGl2ZS8xMCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS8yMCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS8yMCB0ZXh0LWRlc3RydWN0aXZlIGZvY3VzLXZpc2libGU6Ym9yZGVyLWRlc3RydWN0aXZlLzQwIGRhcms6aG92ZXI6YmctZGVzdHJ1Y3RpdmUvMzBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH0sc2l6ZTp7ZGVmYXVsdDpgaC04IGdhcC0xLjUgcHgtMi41IGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTIgaGFzLWRhdGEtW2ljb249aW5saW5lLXN0YXJ0XTpwbC0yYCx4czpgaC02IGdhcC0xIHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEwcHgpXSBweC0yIHRleHQteHMgaW4tZGF0YS1bc2xvdD1idXR0b24tZ3JvdXBdOnJvdW5kZWQtbGcgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMS41IGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMS41IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLHNtOmBoLTcgZ2FwLTEgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTJweCldIHB4LTIuNSB0ZXh0LVswLjhyZW1dIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS0zLjVgLGxnOmBoLTkgZ2FwLTEuNSBweC0yLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMiBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTJgLGljb246YHNpemUtOGAsImljb24teHMiOmBzaXplLTYgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTBweCldIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLCJpY29uLXNtIjpgc2l6ZS03IHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEycHgpXSBpbi1kYXRhLVtzbG90PWJ1dHRvbi1ncm91cF06cm91bmRlZC1sZ2AsImljb24tbGciOmBzaXplLTlgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YCxzaXplOmBkZWZhdWx0YH19KSxLYj1bYGRhdGEtc2l6ZWBdLHFiPUYoe19fbmFtZTpgQ2FyZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19LHNpemU6e2RlZmF1bHQ6YGRlZmF1bHRgfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4obixyKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZGAsImRhdGEtc2l6ZSI6ZS5zaXplLGNsYXNzOk8oTihZdikoYHJpbmctZm9yZWdyb3VuZC8xMCBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kIGdhcC00IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIHB5LTQgdGV4dC1zbSByaW5nLTEgaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgaGFzLVs+aW1nOmZpcnN0LWNoaWxkXTpwdC0wIGRhdGEtW3NpemU9c21dOmdhcC0zIGRhdGEtW3NpemU9c21dOnB5LTMgZGF0YS1bc2l6ZT1zbV06aGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgKjpbaW1nOmZpcnN0LWNoaWxkXTpyb3VuZGVkLXQteGwgKjpbaW1nOmxhc3QtY2hpbGRdOnJvdW5kZWQtYi14bCBncm91cC9jYXJkIGZsZXggZmxleC1jb2xgLHQuY2xhc3MpKX0sW0kobi4kc2xvdHMsYGRlZmF1bHRgKV0sMTAsS2IpKX19KSxKYj1GKHtfX25hbWU6YENhcmRDb250ZW50YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtY29udGVudGAsY2xhc3M6TyhOKFl2KShgcHgtNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOnB4LTNgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFliPUYoe19fbmFtZTpgQ2FyZERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtZGVzY3JpcHRpb25gLGNsYXNzOk8oTihZdikoYHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxYYj1GKHtfX25hbWU6YENhcmRIZWFkZXJgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZC1oZWFkZXJgLGNsYXNzOk8oTihZdikoYGdhcC0xIHJvdW5kZWQtdC14bCBweC00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6cHgtMyBbLmJvcmRlci1iXTpwYi00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6Wy5ib3JkZXItYl06cGItMyBncm91cC9jYXJkLWhlYWRlciBAY29udGFpbmVyL2NhcmQtaGVhZGVyIGdyaWQgYXV0by1yb3dzLW1pbiBpdGVtcy1zdGFydCBoYXMtZGF0YS1bc2xvdD1jYXJkLWFjdGlvbl06Z3JpZC1jb2xzLVsxZnJfYXV0b10gaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1kZXNjcmlwdGlvbl06Z3JpZC1yb3dzLVthdXRvX2F1dG9dYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxaYj1GKHtfX25hbWU6YENhcmRUaXRsZWAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkLXRpdGxlYCxjbGFzczpPKE4oWXYpKGB0ZXh0LWJhc2UgbGVhZGluZy1zbnVnIGZvbnQtbWVkaXVtIGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6dGV4dC1zbSBjbi1mb250LWhlYWRpbmdgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFFiPUYoe19fbmFtZTpgSW5wdXRgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sbW9kZWxWYWx1ZTp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj1JeShuLGBtb2RlbFZhbHVlYCx0LHtwYXNzaXZlOiEwLGRlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZX0pO3JldHVybihlLHQpPT5ncigoUigpLHooYGlucHV0YCx7Im9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLCJkYXRhLXNsb3QiOmBpbnB1dGAsY2xhc3M6TyhOKFl2KShgZGFyazpiZy1pbnB1dC8zMCBib3JkZXItaW5wdXQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIGRpc2FibGVkOmJnLWlucHV0LzUwIGRhcms6ZGlzYWJsZWQ6YmctaW5wdXQvODAgaC04IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB4LTIuNSBweS0xIHRleHQtYmFzZSB0cmFuc2l0aW9uLWNvbG9ycyBmaWxlOmgtNiBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIG1kOnRleHQtc20gdy1mdWxsIG1pbi13LTAgb3V0bGluZS1ub25lIGZpbGU6aW5saW5lLWZsZXggZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1mb3JlZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwYCxuLmNsYXNzKSl9LG51bGwsMikpLFtbV2wsTihyKV1dKX19KSwkYj1gbGxtZ3dBZG1pbktleWA7ZnVuY3Rpb24gZXgoKXt0cnl7cmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJGIpPz9gYH1jYXRjaHtyZXR1cm5gYH19ZnVuY3Rpb24gdHgoZSl7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJGIsZSl9Y2F0Y2h7fX1mdW5jdGlvbiBueCgpe3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCRiKX1jYXRjaHt9fXZhciByeD10XyhgYXV0aGAse3N0YXRlOigpPT4oe2FwaUtleTpleCgpLGVycm9yOmBgfSksZ2V0dGVyczp7aXNBdXRoZW50aWNhdGVkOmU9PmUuYXBpS2V5IT09YGB9LGFjdGlvbnM6e3N1Ym1pdChlKXtlJiYodGhpcy5hcGlLZXk9ZSx0aGlzLmVycm9yPWBgLHR4KGUpKX0scmVqZWN0KGUpe3RoaXMuYXBpS2V5PWBgLHRoaXMuZXJyb3I9ZSxueCgpfX19KSxpeD1jbGFzcyBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpLHRoaXMubmFtZT1gQWRtaW5BcGlFcnJvcmAsdGhpcy5zdGF0dXM9dH19O2FzeW5jIGZ1bmN0aW9uIGF4KGUpe2xldCB0PXJ4KCksbj10LmFwaUtleSxyPWF3YWl0IGZldGNoKGUse2NyZWRlbnRpYWxzOmBzYW1lLW9yaWdpbmAsaGVhZGVyczpuP3sieC1hcGkta2V5IjpufTp7fX0pO2lmKHIuc3RhdHVzPT09NDAxfHxyLnN0YXR1cz09PTQwMyl0aHJvdyB0LmFwaUtleT09PW4mJnQucmVqZWN0KGBpbnZhbGlkIGtleSwgb3Igbm90IGFuIGFkbWluYCksbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7aWYoIXIub2spdGhyb3cgbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7cmV0dXJuIGF3YWl0IHIuanNvbigpfXZhciBveD01ZTMsc3g9dF8oYGRhc2hib2FyZGAse3N0YXRlOigpPT4oe292ZXJ2aWV3Om51bGwsdXNhZ2U6bnVsbCx0YXJnZXRzOm51bGwsbGFzdFVwZGF0ZWQ6bnVsbCxlcnJvcjpgYCx0aW1lcjp2b2lkIDB9KSxhY3Rpb25zOnthc3luYyByZWZyZXNoKCl7aWYoIXJ4KCkuaXNBdXRoZW50aWNhdGVkKXJldHVybjtsZXRbZSx0LG5dPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbYXgoYC9hZG1pbi9hcGkvb3ZlcnZpZXdgKSxheChgL2FkbWluL2FwaS91c2FnZWApLGF4KGAvYWRtaW4vYXBpL3RhcmdldHNgKV0pO2Uuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLm92ZXJ2aWV3PWUudmFsdWUpLHQuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnVzYWdlPXQudmFsdWUpLG4uc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnRhcmdldHM9bi52YWx1ZSk7bGV0IHI9W107aWYoZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmBvdmVydmlld2AscmVhc29uOmUucmVhc29ufSksdC5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB1c2FnZWAscmVhc29uOnQucmVhc29ufSksbi5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB0YXJnZXRzYCxyZWFzb246bi5yZWFzb259KSxyLmxlbmd0aD09PTApe3RoaXMubGFzdFVwZGF0ZWQ9bmV3IERhdGUsdGhpcy5lcnJvcj1gYDtyZXR1cm59ci5zb21lKCh7cmVhc29uOmV9KT0+ZSBpbnN0YW5jZW9mIGl4JiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSl8fChyLmxlbmd0aDwzJiYodGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZSksdGhpcy5lcnJvcj1yLm1hcCgoe2xhYmVsOmUscmVhc29uOnR9KT0+YCR7ZX06ICR7dCBpbnN0YW5jZW9mIEVycm9yP3QubWVzc2FnZTpTdHJpbmcodCl9YCkuam9pbihgOyBgKSl9LHN0YXJ0UG9sbGluZygpe3RoaXMudGltZXI9PT12b2lkIDAmJih0aGlzLnJlZnJlc2goKSx0aGlzLnRpbWVyPXNldEludGVydmFsKCgpPT52b2lkIHRoaXMucmVmcmVzaCgpLG94KSl9LHN0b3BQb2xsaW5nKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxjeD17Y2xhc3M6YG14LWF1dG8gZmxleCBtaW4taC1bNzB2aF0gbWF4LXctbWQgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgcHgtNGB9LGx4PXtjbGFzczpgZmxleCBzaXplLTEyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgYmctcHJpbWFyeS8xMCB0ZXh0LXByaW1hcnlgfSx1eD17Y2xhc3M6YGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xYH0sZHg9eyJhcmlhLWxhYmVsbGVkYnkiOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMS41IHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sZng9e2NsYXNzOmBmbGV4IGl0ZW1zLXN0YXJ0IGdhcC0xLjVgfSxweD17Y2xhc3M6YGZsZXggaXRlbXMtc3RhcnQgZ2FwLTEuNWB9LG14PXtjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41YH0saHg9e2NsYXNzOmByZWxhdGl2ZWB9LGd4PSgoZSx0KT0+e2xldCBuPWUuX192Y2NPcHRzfHxlO2ZvcihsZXRbZSxyXW9mIHQpbltlXT1yO3JldHVybiBufSkoRih7X19uYW1lOmBBdXRoR2F0ZWAsc2V0dXAoZSl7bGV0IHQ9cngoKSxuPXN4KCkscj1NKGBgKSxpPU0oITEpLGE9TShudWxsKSxvPVcoKCk9PnIudmFsdWUudHJpbSgpIT09YGApO2Z1bmN0aW9uIHMoKXtsZXQgZT1yLnZhbHVlO3IudmFsdWU9YGAsdC5zdWJtaXQoZSksbi5yZWZyZXNoKCl9ZnVuY3Rpb24gYygpe1FuKCgpPT5hLnZhbHVlPy4kZWw/LmZvY3VzKCkpfXJldHVybiBaaShjKSxFcigoKT0+dC5lcnJvcixlPT57ZSYmYygpfSksKGUsbik9PntsZXQgYz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLGN4LFtIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYikse2NsYXNzOmBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LWNlbnRlcmB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLGx4LFtIKGMse2ljb246TihpXyksY2xhc3M6YHNpemUtNWAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxWKGBkaXZgLHV4LFtuWzNdfHw9Vihgc3BhbmAse2NsYXNzOmB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBMTE0gR2F0ZXdheWAsLTEpLEgoTihaYikse2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ublsyXXx8PVtVKGBBZG1pbiBrZXkgcmVxdWlyZWRgLC0xKV1dKSxfOjF9KV0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls0XXx8PVtVKGBFbnRlciBhbiBhZG1pbiBBUEkga2V5IHRvIGNvbnRpbnVlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTRgfSx7ZGVmYXVsdDpQKCgpPT5bblsxMF18fD1WKGBoMmAse2lkOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgc3Itb25seWB9LGAgSG93IHRoaXMga2V5IGlzIGhhbmRsZWQgYCwtMSksVihgdWxgLGR4LFtWKGBsaWAsZngsW0goYyx7aWNvbjpOKHVfKSxjbGFzczpgbXQtMC41IHNpemUtMyBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSksbls1XXx8PVYoYHNwYW5gLG51bGwsYEtlcHQgb25seSBpbiB0aGlzIHRhYidzIHNlc3Npb24gc3RvcmFnZWAsLTEpXSksVihgbGlgLHB4LFtIKGMse2ljb246Tih1XyksY2xhc3M6YG10LTAuNSBzaXplLTMgc2hyaW5rLTBgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLG5bNl18fD1WKGBzcGFuYCxudWxsLGBOZXZlciB3cml0dGVuIHRvIGRpc2tgLC0xKV0pLFYoYGxpYCxteCxbSChjLHtpY29uOk4odV8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zIHNocmluay0wYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSxuWzddfHw9Vihgc3BhbmAsbnVsbCxgU2VudCBvbmx5IHRvIHRoaXMgcGFnZSdzIG93biAvYWRtaW4vYXBpLyogcmVxdWVzdHNgLC0xKV0pXSksVihgZm9ybWAse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC0zYCxvblN1Ym1pdDppdShzLFtgcHJldmVudGBdKX0sW1YoYGRpdmAsaHgsW0goTihRYikse3JlZl9rZXk6YGtleUlucHV0RWxgLHJlZjphLG1vZGVsVmFsdWU6ci52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6blswXXx8PWU9PnIudmFsdWU9ZSx0eXBlOmkudmFsdWU/YHRleHRgOmBwYXNzd29yZGAsYXV0b2NvbXBsZXRlOmBvZmZgLHBsYWNlaG9sZGVyOmBBUEkga2V5YCwiYXJpYS1sYWJlbCI6YEFkbWluIEFQSSBrZXlgLCJhcmlhLWludmFsaWQiOiEhTih0KS5lcnJvciwiYXJpYS1kZXNjcmliZWRieSI6Tih0KS5lcnJvcj9gYXV0aGdhdGUtZXJyb3JgOnZvaWQgMCxjbGFzczpPKFtgaC0xMCBwci0xMGAseyJhdXRoZ2F0ZS1zaGFrZSI6Tih0KS5lcnJvcn1dKX0sbnVsbCw4LFtgbW9kZWxWYWx1ZWAsYHR5cGVgLGBhcmlhLWludmFsaWRgLGBhcmlhLWRlc2NyaWJlZGJ5YCxgY2xhc3NgXSksSChOKFdiKSx7dHlwZTpgYnV0dG9uYCx2YXJpYW50OmBnaG9zdGAsc2l6ZTpgaWNvbi14c2AsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMS41IC10cmFuc2xhdGUteS0xLzIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZGAsImFyaWEtbGFiZWwiOmkudmFsdWU/YEhpZGUga2V5YDpgU2hvdyBrZXlgLG9uQ2xpY2s6blsxXXx8PWU9PmkudmFsdWU9IWkudmFsdWV9LHtkZWZhdWx0OlAoKCk9PltIKGMse2ljb246aS52YWx1ZT9OKF9fKTpOKG9fKSxjbGFzczpgc2l6ZS0zLjVgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSw4LFtgYXJpYS1sYWJlbGBdKV0pLEgoTihXYikse3R5cGU6YHN1Ym1pdGAsY2xhc3M6YHctZnVsbGAsZGlzYWJsZWQ6IW8udmFsdWV9LHtkZWZhdWx0OlAoKCk9PlsuLi5uWzhdfHw9W1UoYCBDb250aW51ZSBgLC0xKV1dKSxfOjF9LDgsW2BkaXNhYmxlZGBdKV0sMzIpLE4odCkuZXJyb3I/KFIoKSxCKE4oWHYpLHtrZXk6MCxpZDpgYXV0aGdhdGUtZXJyb3JgLHZhcmlhbnQ6YGRlc3RydWN0aXZlYH0se2RlZmF1bHQ6UCgoKT0+W0goTihRdiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls5XXx8PVtVKGBBdXRoZW50aWNhdGlvbiBmYWlsZWRgLC0xKV1dKSxfOjF9KSxIKE4oWnYpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1UoayhOKHQpLmVycm9yKSwxKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKV0pLF86MX0pXSksXzoxfSldKX19fSksW1tgX19zY29wZUlkYCxgZGF0YS12LTRiZTZiYzA5YF1dKTtmdW5jdGlvbiBfeChlLHQpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lKHQpOmV9ZnVuY3Rpb24gdngoZSx0KXtyZXR1cm4gbj0+e3Quc2V0U3RhdGUodD0+KHsuLi50LFtlXTpfeChuLHRbZV0pfSkpfX1mdW5jdGlvbiB5eChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEZ1bmN0aW9ufWZ1bmN0aW9uIGJ4KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmV2ZXJ5KGU9PnR5cGVvZiBlPT1gbnVtYmVyYCl9ZnVuY3Rpb24geHgoZSx0KXtsZXQgbj1bXSxyPWU9PntlLmZvckVhY2goZT0+e24ucHVzaChlKTtsZXQgaT10KGUpO2khPW51bGwmJmkubGVuZ3RoJiZyKGkpfSl9O3JldHVybiByKGUpLG59ZnVuY3Rpb24gUShlLHQsbil7bGV0IHI9W10saTtyZXR1cm4gYT0+e2xldCBvO24ua2V5JiZuLmRlYnVnJiYobz1EYXRlLm5vdygpKTtsZXQgcz1lKGEpO2lmKCEocy5sZW5ndGghPT1yLmxlbmd0aHx8cy5zb21lKChlLHQpPT5yW3RdIT09ZSkpKXJldHVybiBpO3I9cztsZXQgYztpZihuLmtleSYmbi5kZWJ1ZyYmKGM9RGF0ZS5ub3coKSksaT10KC4uLnMpLG49PW51bGx8fG4ub25DaGFuZ2U9PW51bGx8fG4ub25DaGFuZ2UoaSksbi5rZXkmJm4uZGVidWcmJm4hPW51bGwmJm4uZGVidWcoKSl7bGV0IGU9TWF0aC5yb3VuZCgoRGF0ZS5ub3coKS1vKSoxMDApLzEwMCx0PU1hdGgucm91bmQoKERhdGUubm93KCktYykqMTAwKS8xMDAscj10LzE2LGk9KGUsdCk9Pntmb3IoZT1TdHJpbmcoZSk7ZS5sZW5ndGg8dDspZT1gIGArZTtyZXR1cm4gZX07Y29uc29sZS5pbmZvKGAlY+KPsSAke2kodCw1KX0gLyR7aShlLDUpfSBtc2AsYAogICAgICAgICAgICBmb250LXNpemU6IC42cmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICAgICAgY29sb3I6IGhzbCgke01hdGgubWF4KDAsTWF0aC5taW4oMTIwLTEyMCpyLDEyMCkpfWRlZyAxMDAlIDMxJSk7YCxuPy5rZXkpfXJldHVybiBpfX1mdW5jdGlvbiAkKGUsdCxuLHIpe3JldHVybntkZWJ1ZzooKT0+ZT8uZGVidWdBbGw/P2VbdF0sa2V5OiExLG9uQ2hhbmdlOnJ9fWZ1bmN0aW9uIFN4KGUsdCxuLHIpe2xldCBpPXtpZDpgJHt0LmlkfV8ke24uaWR9YCxyb3c6dCxjb2x1bW46bixnZXRWYWx1ZTooKT0+dC5nZXRWYWx1ZShyKSxyZW5kZXJWYWx1ZTooKT0+aS5nZXRWYWx1ZSgpPz9lLm9wdGlvbnMucmVuZGVyRmFsbGJhY2tWYWx1ZSxnZXRDb250ZXh0OlEoKCk9PltlLG4sdCxpXSwoZSx0LG4scik9Pih7dGFibGU6ZSxjb2x1bW46dCxyb3c6bixjZWxsOnIsZ2V0VmFsdWU6ci5nZXRWYWx1ZSxyZW5kZXJWYWx1ZTpyLnJlbmRlclZhbHVlfSksJChlLm9wdGlvbnMsYGRlYnVnQ2VsbHNgLGBjZWxsLmdldENvbnRleHRgKSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHI9PntyLmNyZWF0ZUNlbGw9PW51bGx8fHIuY3JlYXRlQ2VsbChpLG4sdCxlKX0se30pLGl9ZnVuY3Rpb24gQ3goZSx0LG4scil7bGV0IGk9ey4uLmUuX2dldERlZmF1bHRDb2x1bW5EZWYoKSwuLi50fSxhPWkuYWNjZXNzb3JLZXksbz1pLmlkPz8oYT90eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsPT1gZnVuY3Rpb25gP2EucmVwbGFjZUFsbChgLmAsYF9gKTphLnJlcGxhY2UoL1wuL2csYF9gKTp2b2lkIDApPz8odHlwZW9mIGkuaGVhZGVyPT1gc3RyaW5nYD9pLmhlYWRlcjp2b2lkIDApLHM7aWYoaS5hY2Nlc3NvckZuP3M9aS5hY2Nlc3NvckZuOmEmJihzPWEuaW5jbHVkZXMoYC5gKT9lPT57bGV0IHQ9ZTtmb3IobGV0IGUgb2YgYS5zcGxpdChgLmApKXQ9dD8uW2VdO3JldHVybiB0fTplPT5lW2kuYWNjZXNzb3JLZXldKSwhbyl0aHJvdyBFcnJvcigpO2xldCBjPXtpZDpgJHtTdHJpbmcobyl9YCxhY2Nlc3NvckZuOnMscGFyZW50OnIsZGVwdGg6bixjb2x1bW5EZWY6aSxjb2x1bW5zOltdLGdldEZsYXRDb2x1bW5zOlEoKCk9PlshMF0sKCk9PltjLC4uLmMuY29sdW1ucz8uZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpXSwkKGUub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgY29sdW1uLmdldEZsYXRDb2x1bW5zYCkpLGdldExlYWZDb2x1bW5zOlEoKCk9PltlLl9nZXRPcmRlckNvbHVtbnNGbigpXSxlPT57dmFyIHQ7cmV0dXJuKHQ9Yy5jb2x1bW5zKSE9bnVsbCYmdC5sZW5ndGg/ZShjLmNvbHVtbnMuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKTpbY119LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBjb2x1bW4uZ2V0TGVhZkNvbHVtbnNgKSl9O2ZvcihsZXQgdCBvZiBlLl9mZWF0dXJlcyl0LmNyZWF0ZUNvbHVtbj09bnVsbHx8dC5jcmVhdGVDb2x1bW4oYyxlKTtyZXR1cm4gY312YXIgd3g9YGRlYnVnSGVhZGVyc2A7ZnVuY3Rpb24gVHgoZSx0LG4pe2xldCByPXtpZDpuLmlkPz90LmlkLGNvbHVtbjp0LGluZGV4Om4uaW5kZXgsaXNQbGFjZWhvbGRlcjohIW4uaXNQbGFjZWhvbGRlcixwbGFjZWhvbGRlcklkOm4ucGxhY2Vob2xkZXJJZCxkZXB0aDpuLmRlcHRoLHN1YkhlYWRlcnM6W10sY29sU3BhbjowLHJvd1NwYW46MCxoZWFkZXJHcm91cDpudWxsLGdldExlYWZIZWFkZXJzOigpPT57bGV0IGU9W10sdD1uPT57bi5zdWJIZWFkZXJzJiZuLnN1YkhlYWRlcnMubGVuZ3RoJiZuLnN1YkhlYWRlcnMubWFwKHQpLGUucHVzaChuKX07cmV0dXJuIHQociksZX0sZ2V0Q29udGV4dDooKT0+KHt0YWJsZTplLGhlYWRlcjpyLGNvbHVtbjp0fSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHQ9Pnt0LmNyZWF0ZUhlYWRlcj09bnVsbHx8dC5jcmVhdGVIZWFkZXIocixlKX0pLHJ9dmFyIEV4PXtjcmVhdGVUYWJsZTplPT57ZS5nZXRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT57bGV0IGE9cj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sbz1pPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxzPW4uZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlLmlkKSkmJiEoaSE9bnVsbCYmaS5pbmNsdWRlcyhlLmlkKSkpO3JldHVybiBEeCh0LFsuLi5hLC4uLnMsLi4ub10sZSl9LCQoZS5vcHRpb25zLHd4LGBnZXRIZWFkZXJHcm91cHNgKSksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT4obj1uLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZS5pZCkpJiYhKGkhPW51bGwmJmkuaW5jbHVkZXMoZS5pZCkpKSxEeCh0LG4sZSxgY2VudGVyYCkpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJIZWFkZXJHcm91cHNgKSksZS5nZXRMZWZ0SGVhZGVyR3JvdXBzPVEoKCk9PltlLmdldEFsbENvbHVtbnMoKSxlLmdldFZpc2libGVMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgbGVmdGApLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0SGVhZGVyR3JvdXBzYCkpLGUuZ2V0UmlnaHRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgcmlnaHRgKSwkKGUub3B0aW9ucyx3eCxgZ2V0UmlnaHRIZWFkZXJHcm91cHNgKSksZS5nZXRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0SGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldEZvb3Rlckdyb3Vwc2ApKSxlLmdldExlZnRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0Rm9vdGVyR3JvdXBzYCkpLGUuZ2V0Q2VudGVyRm9vdGVyR3JvdXBzPVEoKCk9PltlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGb290ZXJHcm91cHNgKSksZS5nZXRSaWdodEZvb3Rlckdyb3Vwcz1RKCgpPT5bZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRSaWdodEZvb3Rlckdyb3Vwc2ApKSxlLmdldEZsYXRIZWFkZXJzPVEoKCk9PltlLmdldEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0RmxhdEhlYWRlcnNgKSksZS5nZXRMZWZ0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0TGVmdEZsYXRIZWFkZXJzYCkpLGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCldLGU9PmUubWFwKGU9PmUuaGVhZGVycykuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGbGF0SGVhZGVyc2ApKSxlLmdldFJpZ2h0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sZT0+ZS5tYXAoZT0+ZS5oZWFkZXJzKS5mbGF0KCksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0RmxhdEhlYWRlcnNgKSksZS5nZXRDZW50ZXJMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRDZW50ZXJGbGF0SGVhZGVycygpXSxlPT5lLmZpbHRlcihlPT57dmFyIHQ7cmV0dXJuISgodD1lLnN1YkhlYWRlcnMpIT1udWxsJiZ0Lmxlbmd0aCl9KSwkKGUub3B0aW9ucyx3eCxgZ2V0Q2VudGVyTGVhZkhlYWRlcnNgKSksZS5nZXRMZWZ0TGVhZkhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEZsYXRIZWFkZXJzKCldLGU9PmUuZmlsdGVyKGU9Pnt2YXIgdDtyZXR1cm4hKCh0PWUuc3ViSGVhZGVycykhPW51bGwmJnQubGVuZ3RoKX0pLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0TGVhZkhlYWRlcnNgKSksZS5nZXRSaWdodExlYWZIZWFkZXJzPVEoKCk9PltlLmdldFJpZ2h0RmxhdEhlYWRlcnMoKV0sZT0+ZS5maWx0ZXIoZT0+e3ZhciB0O3JldHVybiEoKHQ9ZS5zdWJIZWFkZXJzKSE9bnVsbCYmdC5sZW5ndGgpfSksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0TGVhZkhlYWRlcnNgKSksZS5nZXRMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKSxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCldLChlLHQsbik9PlsuLi5lWzBdPy5oZWFkZXJzPz9bXSwuLi50WzBdPy5oZWFkZXJzPz9bXSwuLi5uWzBdPy5oZWFkZXJzPz9bXV0ubWFwKGU9PmUuZ2V0TGVhZkhlYWRlcnMoKSkuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWFmSGVhZGVyc2ApKX19O2Z1bmN0aW9uIER4KGUsdCxuLHIpe2xldCBpPTAsYT1mdW5jdGlvbihlLHQpe3Q9PT12b2lkIDAmJih0PTEpLGk9TWF0aC5tYXgoaSx0KSxlLmZpbHRlcihlPT5lLmdldElzVmlzaWJsZSgpKS5mb3JFYWNoKGU9Pnt2YXIgbjsobj1lLmNvbHVtbnMpIT1udWxsJiZuLmxlbmd0aCYmYShlLmNvbHVtbnMsdCsxKX0sMCl9O2EoZSk7bGV0IG89W10scz0oZSx0KT0+e2xldCBpPXtkZXB0aDp0LGlkOltyLGAke3R9YF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxoZWFkZXJzOltdfSxhPVtdO2UuZm9yRWFjaChlPT57bGV0IG89Wy4uLmFdLnJldmVyc2UoKVswXSxzPWUuY29sdW1uLmRlcHRoPT09aS5kZXB0aCxjLGw9ITE7aWYocyYmZS5jb2x1bW4ucGFyZW50P2M9ZS5jb2x1bW4ucGFyZW50OihjPWUuY29sdW1uLGw9ITApLG8mJm8/LmNvbHVtbj09PWMpby5zdWJIZWFkZXJzLnB1c2goZSk7ZWxzZXtsZXQgaT1UeChuLGMse2lkOltyLHQsYy5pZCxlPy5pZF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxpc1BsYWNlaG9sZGVyOmwscGxhY2Vob2xkZXJJZDpsP2Ake2EuZmlsdGVyKGU9PmUuY29sdW1uPT09YykubGVuZ3RofWA6dm9pZCAwLGRlcHRoOnQsaW5kZXg6YS5sZW5ndGh9KTtpLnN1YkhlYWRlcnMucHVzaChlKSxhLnB1c2goaSl9aS5oZWFkZXJzLnB1c2goZSksZS5oZWFkZXJHcm91cD1pfSksby5wdXNoKGkpLHQ+MCYmcyhhLHQtMSl9O3ModC5tYXAoKGUsdCk9PlR4KG4sZSx7ZGVwdGg6aSxpbmRleDp0fSkpLGktMSksby5yZXZlcnNlKCk7bGV0IGM9ZT0+ZS5maWx0ZXIoZT0+ZS5jb2x1bW4uZ2V0SXNWaXNpYmxlKCkpLm1hcChlPT57bGV0IHQ9MCxuPTAscj1bMF07ZS5zdWJIZWFkZXJzJiZlLnN1YkhlYWRlcnMubGVuZ3RoPyhyPVtdLGMoZS5zdWJIZWFkZXJzKS5mb3JFYWNoKGU9PntsZXR7Y29sU3BhbjpuLHJvd1NwYW46aX09ZTt0Kz1uLHIucHVzaChpKX0pKTp0PTE7bGV0IGk9TWF0aC5taW4oLi4ucik7cmV0dXJuIG4rPWksZS5jb2xTcGFuPXQsZS5yb3dTcGFuPW4se2NvbFNwYW46dCxyb3dTcGFuOm59fSk7cmV0dXJuIGMob1swXT8uaGVhZGVycz8/W10pLG99dmFyIE94PShlLHQsbixyLGksYSxvKT0+e2xldCBzPXtpZDp0LGluZGV4OnIsb3JpZ2luYWw6bixkZXB0aDppLHBhcmVudElkOm8sX3ZhbHVlc0NhY2hlOnt9LF91bmlxdWVWYWx1ZXNDYWNoZTp7fSxnZXRWYWx1ZTp0PT57aWYocy5fdmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3ZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gcy5fdmFsdWVzQ2FjaGVbdF09bi5hY2Nlc3NvckZuKHMub3JpZ2luYWwscikscy5fdmFsdWVzQ2FjaGVbdF19LGdldFVuaXF1ZVZhbHVlczp0PT57aWYocy5fdW5pcXVlVmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzPyhzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XT1uLmNvbHVtbkRlZi5nZXRVbmlxdWVWYWx1ZXMocy5vcmlnaW5hbCxyKSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSk6KHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdPVtzLmdldFZhbHVlKHQpXSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSl9LHJlbmRlclZhbHVlOnQ9PnMuZ2V0VmFsdWUodCk/P2Uub3B0aW9ucy5yZW5kZXJGYWxsYmFja1ZhbHVlLHN1YlJvd3M6YT8/W10sZ2V0TGVhZlJvd3M6KCk9Pnh4KHMuc3ViUm93cyxlPT5lLnN1YlJvd3MpLGdldFBhcmVudFJvdzooKT0+cy5wYXJlbnRJZD9lLmdldFJvdyhzLnBhcmVudElkLCEwKTp2b2lkIDAsZ2V0UGFyZW50Um93czooKT0+e2xldCBlPVtdLHQ9cztmb3IoOzspe2xldCBuPXQuZ2V0UGFyZW50Um93KCk7aWYoIW4pYnJlYWs7ZS5wdXNoKG4pLHQ9bn1yZXR1cm4gZS5yZXZlcnNlKCl9LGdldEFsbENlbGxzOlEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCldLHQ9PnQubWFwKHQ9PlN4KGUscyx0LHQuaWQpKSwkKGUub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0QWxsQ2VsbHNgKSksX2dldEFsbENlbGxzQnlDb2x1bW5JZDpRKCgpPT5bcy5nZXRBbGxDZWxscygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5jb2x1bW4uaWRdPXQsZSkse30pLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRBbGxDZWxsc0J5Q29sdW1uSWRgKSl9O2ZvcihsZXQgdD0wO3Q8ZS5fZmVhdHVyZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5fZmVhdHVyZXNbdF07bj09bnVsbHx8bi5jcmVhdGVSb3c9PW51bGx8fG4uY3JlYXRlUm93KHMsZSl9cmV0dXJuIHN9LGt4PXtjcmVhdGVDb2x1bW46KGUsdCk9PntlLl9nZXRGYWNldGVkUm93TW9kZWw9dC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmdC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCh0LGUuaWQpLGUuZ2V0RmFjZXRlZFJvd01vZGVsPSgpPT5lLl9nZXRGYWNldGVkUm93TW9kZWw/ZS5fZ2V0RmFjZXRlZFJvd01vZGVsKCk6dC5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCksZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXM9KCk9PmUuX2dldEZhY2V0ZWRVbmlxdWVWYWx1ZXM/ZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcygpOm5ldyBNYXAsZS5fZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXM9KCk9PntpZihlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKXJldHVybiBlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKCl9fX0sQXg9KGUsdCxuKT0+e3ZhciByLGk7bGV0IGE9bj09bnVsbHx8KHI9bi50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpO3JldHVybiEhKChpPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYoaT1pLnRvU3RyaW5nKCkpIT1udWxsJiYoaT1pLnRvTG93ZXJDYXNlKCkpIT1udWxsJiZpLmluY2x1ZGVzKGEpKX07QXguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgang9KGUsdCxuKT0+e3ZhciByO3JldHVybiEhKChyPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYocj1yLnRvU3RyaW5nKCkpIT1udWxsJiZyLmluY2x1ZGVzKG4pKX07anguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgTXg9KGUsdCxuKT0+e3ZhciByO3JldHVybigocj1lLmdldFZhbHVlKHQpKT09bnVsbHx8KHI9ci50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpKT09PW4/LnRvTG93ZXJDYXNlKCl9O014LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIE54PShlLHQsbik9PmUuZ2V0VmFsdWUodCk/LmluY2x1ZGVzKG4pO054LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIFB4PShlLHQsbik9PiFuLnNvbWUobj0+e3ZhciByO3JldHVybiEoKHI9ZS5nZXRWYWx1ZSh0KSkhPW51bGwmJnIuaW5jbHVkZXMobikpfSk7UHguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEZ4PShlLHQsbik9Pm4uc29tZShuPT5lLmdldFZhbHVlKHQpPy5pbmNsdWRlcyhuKSk7RnguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEl4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PT1uO0l4LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIEx4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PW47THguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgUng9KGUsdCxuKT0+e2xldFtyLGldPW4sYT1lLmdldFZhbHVlKHQpO3JldHVybiBhPj1yJiZhPD1pfTtSeC5yZXNvbHZlRmlsdGVyVmFsdWU9ZT0+e2xldFt0LG5dPWUscj10eXBlb2YgdD09YG51bWJlcmA/dDpwYXJzZUZsb2F0KHQpLGk9dHlwZW9mIG49PWBudW1iZXJgP246cGFyc2VGbG9hdChuKSxhPXQ9PT1udWxsfHxOdW1iZXIuaXNOYU4ocik/LTEvMDpyLG89bj09PW51bGx8fE51bWJlci5pc05hTihpKT8xLzA6aTtpZihhPm8pe2xldCBlPWE7YT1vLG89ZX1yZXR1cm5bYSxvXX0sUnguYXV0b1JlbW92ZT1lPT5CeChlKXx8QngoZVswXSkmJkJ4KGVbMV0pO3ZhciB6eD17aW5jbHVkZXNTdHJpbmc6QXgsaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmU6angsZXF1YWxzU3RyaW5nOk14LGFyckluY2x1ZGVzOk54LGFyckluY2x1ZGVzQWxsOlB4LGFyckluY2x1ZGVzU29tZTpGeCxlcXVhbHM6SXgsd2Vha0VxdWFsczpMeCxpbk51bWJlclJhbmdlOlJ4fTtmdW5jdGlvbiBCeChlKXtyZXR1cm4gZT09bnVsbHx8ZT09PWBgfXZhciBWeD17Z2V0RGVmYXVsdENvbHVtbkRlZjooKT0+KHtmaWx0ZXJGbjpgYXV0b2B9KSxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5GaWx0ZXJzOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uQ29sdW1uRmlsdGVyc0NoYW5nZTp2eChgY29sdW1uRmlsdGVyc2AsZSksZmlsdGVyRnJvbUxlYWZSb3dzOiExLG1heExlYWZSb3dGaWx0ZXJEZXB0aDoxMDB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldEF1dG9GaWx0ZXJGbj0oKT0+e2xldCBuPXQuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpO3JldHVybiB0eXBlb2Ygbj09YHN0cmluZ2A/enguaW5jbHVkZXNTdHJpbmc6dHlwZW9mIG49PWBudW1iZXJgP3p4LmluTnVtYmVyUmFuZ2U6dHlwZW9mIG49PWBib29sZWFuYHx8dHlwZW9mIG49PWBvYmplY3RgJiZuP3p4LmVxdWFsczpBcnJheS5pc0FycmF5KG4pP3p4LmFyckluY2x1ZGVzOnp4LndlYWtFcXVhbHN9LGUuZ2V0RmlsdGVyRm49KCk9Pnl4KGUuY29sdW1uRGVmLmZpbHRlckZuKT9lLmNvbHVtbkRlZi5maWx0ZXJGbjplLmNvbHVtbkRlZi5maWx0ZXJGbj09PWBhdXRvYD9lLmdldEF1dG9GaWx0ZXJGbigpOnQub3B0aW9ucy5maWx0ZXJGbnM/LltlLmNvbHVtbkRlZi5maWx0ZXJGbl0/P3p4W2UuY29sdW1uRGVmLmZpbHRlckZuXSxlLmdldENhbkZpbHRlcj0oKT0+KGUuY29sdW1uRGVmLmVuYWJsZUNvbHVtbkZpbHRlcj8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtbkZpbHRlcnM/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJiEhZS5hY2Nlc3NvckZuLGUuZ2V0SXNGaWx0ZXJlZD0oKT0+ZS5nZXRGaWx0ZXJJbmRleCgpPi0xLGUuZ2V0RmlsdGVyVmFsdWU9KCk9Pnt2YXIgbjtyZXR1cm4obj10LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycyk9PW51bGx8fChuPW4uZmluZCh0PT50LmlkPT09ZS5pZCkpPT1udWxsP3ZvaWQgMDpuLnZhbHVlfSxlLmdldEZpbHRlckluZGV4PSgpPT50LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycz8uZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKT8/LTEsZS5zZXRGaWx0ZXJWYWx1ZT1uPT57dC5zZXRDb2x1bW5GaWx0ZXJzKHQ9PntsZXQgcj1lLmdldEZpbHRlckZuKCksaT10Py5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxhPV94KG4saT9pLnZhbHVlOnZvaWQgMCk7aWYoSHgocixhLGUpKXJldHVybiB0Py5maWx0ZXIodD0+dC5pZCE9PWUuaWQpPz9bXTtsZXQgbz17aWQ6ZS5pZCx2YWx1ZTphfTtyZXR1cm4gaT90Py5tYXAodD0+dC5pZD09PWUuaWQ/bzp0KT8/W106dCE9bnVsbCYmdC5sZW5ndGg/Wy4uLnQsb106W29dfSl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLmNvbHVtbkZpbHRlcnM9e30sZS5jb2x1bW5GaWx0ZXJzTWV0YT17fX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Q29sdW1uRmlsdGVycz10PT57bGV0IG49ZS5nZXRBbGxMZWFmQ29sdW1ucygpO2Uub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2UoZT0+X3godCxlKT8uZmlsdGVyKGU9PntsZXQgdD1uLmZpbmQodD0+dC5pZD09PWUuaWQpO3JldHVybiEodCYmSHgodC5nZXRGaWx0ZXJGbigpLGUudmFsdWUsdCkpfSkpfSxlLnJlc2V0Q29sdW1uRmlsdGVycz10PT57ZS5zZXRDb2x1bW5GaWx0ZXJzKHQ/W106ZS5pbml0aWFsU3RhdGU/LmNvbHVtbkZpbHRlcnM/P1tdKX0sZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsPSgpPT5lLmdldENvcmVSb3dNb2RlbCgpLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RmlsdGVyZWRSb3dNb2RlbCYmKGUuX2dldEZpbHRlcmVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZpbHRlcmVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsP2UuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCgpOmUuX2dldEZpbHRlcmVkUm93TW9kZWwoKSl9fTtmdW5jdGlvbiBIeChlLHQsbil7cmV0dXJuKGUmJmUuYXV0b1JlbW92ZT9lLmF1dG9SZW1vdmUodCxuKTohMSl8fHQ9PT12b2lkIDB8fHR5cGVvZiB0PT1gc3RyaW5nYCYmIXR9dmFyIFV4PXtzdW06KGUsdCxuKT0+bi5yZWR1Y2UoKHQsbik9PntsZXQgcj1uLmdldFZhbHVlKGUpO3JldHVybiB0Kyh0eXBlb2Ygcj09YG51bWJlcmA/cjowKX0sMCksbWluOihlLHQsbik9PntsZXQgcjtyZXR1cm4gbi5mb3JFYWNoKHQ9PntsZXQgbj10LmdldFZhbHVlKGUpO24hPW51bGwmJihyPm58fHI9PT12b2lkIDAmJm4+PW4pJiYocj1uKX0pLHJ9LG1heDooZSx0LG4pPT57bGV0IHI7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocjxufHxyPT09dm9pZCAwJiZuPj1uKSYmKHI9bil9KSxyfSxleHRlbnQ6KGUsdCxuKT0+e2xldCByLGk7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocj09PXZvaWQgMD9uPj1uJiYocj1pPW4pOihyPm4mJihyPW4pLGk8biYmKGk9bikpKX0pLFtyLGldfSxtZWFuOihlLHQpPT57bGV0IG49MCxyPTA7aWYodC5mb3JFYWNoKHQ9PntsZXQgaT10LmdldFZhbHVlKGUpO2khPW51bGwmJihpPStpKT49aSYmKCsrbixyKz1pKX0pLG4pcmV0dXJuIHIvbn0sbWVkaWFuOihlLHQpPT57aWYoIXQubGVuZ3RoKXJldHVybjtsZXQgbj10Lm1hcCh0PT50LmdldFZhbHVlKGUpKTtpZighYngobikpcmV0dXJuO2lmKG4ubGVuZ3RoPT09MSlyZXR1cm4gblswXTtsZXQgcj1NYXRoLmZsb29yKG4ubGVuZ3RoLzIpLGk9bi5zb3J0KChlLHQpPT5lLXQpO3JldHVybiBuLmxlbmd0aCUyPT0wPyhpW3ItMV0raVtyXSkvMjppW3JdfSx1bmlxdWU6KGUsdCk9PkFycmF5LmZyb20obmV3IFNldCh0Lm1hcCh0PT50LmdldFZhbHVlKGUpKSkudmFsdWVzKCkpLHVuaXF1ZUNvdW50OihlLHQpPT5uZXcgU2V0KHQubWFwKHQ9PnQuZ2V0VmFsdWUoZSkpKS5zaXplLGNvdW50OihlLHQpPT50Lmxlbmd0aH0sV3g9e2dldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7YWdncmVnYXRlZENlbGw6ZT0+e3ZhciB0O3JldHVybigodD1lLmdldFZhbHVlKCkpPT1udWxsfHx0LnRvU3RyaW5nPT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCkpPz9udWxsfSxhZ2dyZWdhdGlvbkZuOmBhdXRvYH0pLGdldEluaXRpYWxTdGF0ZTplPT4oe2dyb3VwaW5nOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR3JvdXBpbmdDaGFuZ2U6dngoYGdyb3VwaW5nYCxlKSxncm91cGVkQ29sdW1uTW9kZTpgcmVvcmRlcmB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLnRvZ2dsZUdyb3VwaW5nPSgpPT57dC5zZXRHcm91cGluZyh0PT50IT1udWxsJiZ0LmluY2x1ZGVzKGUuaWQpP3QuZmlsdGVyKHQ9PnQhPT1lLmlkKTpbLi4udD8/W10sZS5pZF0pfSxlLmdldENhbkdyb3VwPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlR3JvdXBpbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHcm91cGluZz8/ITApJiYoISFlLmFjY2Vzc29yRm58fCEhZS5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZSksZS5nZXRJc0dyb3VwZWQ9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5jbHVkZXMoZS5pZCksZS5nZXRHcm91cGVkSW5kZXg9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5kZXhPZihlLmlkKSxlLmdldFRvZ2dsZUdyb3VwaW5nSGFuZGxlcj0oKT0+e2xldCB0PWUuZ2V0Q2FuR3JvdXAoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlR3JvdXBpbmcoKX19LGUuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm49KCk9PntsZXQgbj10LmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdPy5nZXRWYWx1ZShlLmlkKTtpZih0eXBlb2Ygbj09YG51bWJlcmApcmV0dXJuIFV4LnN1bTtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobik9PT1gW29iamVjdCBEYXRlXWApcmV0dXJuIFV4LmV4dGVudH0sZS5nZXRBZ2dyZWdhdGlvbkZuPSgpPT57aWYoIWUpdGhyb3cgRXJyb3IoKTtyZXR1cm4geXgoZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbik/ZS5jb2x1bW5EZWYuYWdncmVnYXRpb25GbjplLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuPT09YGF1dG9gP2UuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4oKTp0Lm9wdGlvbnMuYWdncmVnYXRpb25GbnM/LltlLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXT8/VXhbZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbl19fSxjcmVhdGVUYWJsZTplPT57ZS5zZXRHcm91cGluZz10PT5lLm9wdGlvbnMub25Hcm91cGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uR3JvdXBpbmdDaGFuZ2UodCksZS5yZXNldEdyb3VwaW5nPXQ9PntlLnNldEdyb3VwaW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/Lmdyb3VwaW5nPz9bXSl9LGUuZ2V0UHJlR3JvdXBlZFJvd01vZGVsPSgpPT5lLmdldEZpbHRlcmVkUm93TW9kZWwoKSxlLmdldEdyb3VwZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRHcm91cGVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRHcm91cGVkUm93TW9kZWwmJihlLl9nZXRHcm91cGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbEdyb3VwaW5nfHwhZS5fZ2V0R3JvdXBlZFJvd01vZGVsP2UuZ2V0UHJlR3JvdXBlZFJvd01vZGVsKCk6ZS5fZ2V0R3JvdXBlZFJvd01vZGVsKCkpfSxjcmVhdGVSb3c6KGUsdCk9PntlLmdldElzR3JvdXBlZD0oKT0+ISFlLmdyb3VwaW5nQ29sdW1uSWQsZS5nZXRHcm91cGluZ1ZhbHVlPW49PntpZihlLl9ncm91cGluZ1ZhbHVlc0NhY2hlLmhhc093blByb3BlcnR5KG4pKXJldHVybiBlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dO2xldCByPXQuZ2V0Q29sdW1uKG4pO3JldHVybiByIT1udWxsJiZyLmNvbHVtbkRlZi5nZXRHcm91cGluZ1ZhbHVlPyhlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dPXIuY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWUoZS5vcmlnaW5hbCksZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtuXSk6ZS5nZXRWYWx1ZShuKX0sZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZT17fX0sY3JlYXRlQ2VsbDooZSx0LG4scik9PntlLmdldElzR3JvdXBlZD0oKT0+dC5nZXRJc0dyb3VwZWQoKSYmdC5pZD09PW4uZ3JvdXBpbmdDb2x1bW5JZCxlLmdldElzUGxhY2Vob2xkZXI9KCk9PiFlLmdldElzR3JvdXBlZCgpJiZ0LmdldElzR3JvdXBlZCgpLGUuZ2V0SXNBZ2dyZWdhdGVkPSgpPT57dmFyIHQ7cmV0dXJuIWUuZ2V0SXNHcm91cGVkKCkmJiFlLmdldElzUGxhY2Vob2xkZXIoKSYmISEoKHQ9bi5zdWJSb3dzKSE9bnVsbCYmdC5sZW5ndGgpfX19O2Z1bmN0aW9uIEd4KGUsdCxuKXtpZighKHQhPW51bGwmJnQubGVuZ3RoKXx8IW4pcmV0dXJuIGU7bGV0IHI9ZS5maWx0ZXIoZT0+IXQuaW5jbHVkZXMoZS5pZCkpO3JldHVybiBuPT09YHJlbW92ZWA/cjpbLi4udC5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLC4uLnJdfXZhciBLeD17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Y29sdW1uT3JkZXI6W10sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5PcmRlckNoYW5nZTp2eChgY29sdW1uT3JkZXJgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRJbmRleD1RKGU9PltyUyh0LGUpXSx0PT50LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksJCh0Lm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldEluZGV4YCkpLGUuZ2V0SXNGaXJzdENvbHVtbj1uPT5yUyh0LG4pWzBdPy5pZD09PWUuaWQsZS5nZXRJc0xhc3RDb2x1bW49bj0+e2xldCByPXJTKHQsbik7cmV0dXJuIHJbci5sZW5ndGgtMV0/LmlkPT09ZS5pZH19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtbk9yZGVyPXQ9PmUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Db2x1bW5PcmRlckNoYW5nZSh0KSxlLnJlc2V0Q29sdW1uT3JkZXI9dD0+e2Uuc2V0Q29sdW1uT3JkZXIodD9bXTplLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlcj8/W10pfSxlLl9nZXRPcmRlckNvbHVtbnNGbj1RKCgpPT5bZS5nZXRTdGF0ZSgpLmNvbHVtbk9yZGVyLGUuZ2V0U3RhdGUoKS5ncm91cGluZyxlLm9wdGlvbnMuZ3JvdXBlZENvbHVtbk1vZGVdLChlLHQsbik9PnI9PntsZXQgaT1bXTtpZighKGUhPW51bGwmJmUubGVuZ3RoKSlpPXI7ZWxzZXtsZXQgdD1bLi4uZV0sbj1bLi4ucl07Zm9yKDtuLmxlbmd0aCYmdC5sZW5ndGg7KXtsZXQgZT10LnNoaWZ0KCkscj1uLmZpbmRJbmRleCh0PT50LmlkPT09ZSk7cj4tMSYmaS5wdXNoKG4uc3BsaWNlKHIsMSlbMF0pfWk9Wy4uLmksLi4ubl19cmV0dXJuIEd4KGksdCxuKX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBfZ2V0T3JkZXJDb2x1bW5zRm5gKSl9fSxxeD0oKT0+KHtsZWZ0OltdLHJpZ2h0OltdfSksSng9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblBpbm5pbmc6cXgoKSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkNvbHVtblBpbm5pbmdDaGFuZ2U6dngoYGNvbHVtblBpbm5pbmdgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5waW49bj0+e2xldCByPWUuZ2V0TGVhZkNvbHVtbnMoKS5tYXAoZT0+ZS5pZCkuZmlsdGVyKEJvb2xlYW4pO3Quc2V0Q29sdW1uUGlubmluZyhlPT5uPT09YHJpZ2h0YD97bGVmdDooZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSxyaWdodDpbLi4uKGU/LnJpZ2h0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLC4uLnJdfTpuPT09YGxlZnRgP3tsZWZ0OlsuLi4oZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSwuLi5yXSxyaWdodDooZT8ucmlnaHQ/P1tdKS5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUpKSl9OntsZWZ0OihlPy5sZWZ0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLHJpZ2h0OihlPy5yaWdodD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+ZS5nZXRMZWFmQ29sdW1ucygpLnNvbWUoZT0+KGUuY29sdW1uRGVmLmVuYWJsZVBpbm5pbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVDb2x1bW5QaW5uaW5nPz90Lm9wdGlvbnMuZW5hYmxlUGlubmluZz8/ITApKSxlLmdldElzUGlubmVkPSgpPT57bGV0IG49ZS5nZXRMZWFmQ29sdW1ucygpLm1hcChlPT5lLmlkKSx7bGVmdDpyLHJpZ2h0Oml9PXQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLGE9bi5zb21lKGU9PnI/LmluY2x1ZGVzKGUpKSxvPW4uc29tZShlPT5pPy5pbmNsdWRlcyhlKSk7cmV0dXJuIGE/YGxlZnRgOm8/YHJpZ2h0YDohMX0sZS5nZXRQaW5uZWRJbmRleD0oKT0+e3ZhciBuO2xldCByPWUuZ2V0SXNQaW5uZWQoKTtyZXR1cm4gcj8oKG49dC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcpPT1udWxsfHwobj1uW3JdKT09bnVsbD92b2lkIDA6bi5pbmRleE9mKGUuaWQpKT8/LTE6MH19LGNyZWF0ZVJvdzooZSx0KT0+e2UuZ2V0Q2VudGVyVmlzaWJsZUNlbGxzPVEoKCk9PltlLl9nZXRBbGxWaXNpYmxlQ2VsbHMoKSx0LmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0LG4pPT57bGV0IHI9Wy4uLnQ/P1tdLC4uLm4/P1tdXTtyZXR1cm4gZS5maWx0ZXIoZT0+IXIuaW5jbHVkZXMoZS5jb2x1bW4uaWQpKX0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldENlbnRlclZpc2libGVDZWxsc2ApKSxlLmdldExlZnRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5jb2x1bW4uaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLm1hcChlPT4oey4uLmUscG9zaXRpb246YGxlZnRgfSkpLCQodC5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRMZWZ0VmlzaWJsZUNlbGxzYCkpLGUuZ2V0UmlnaHRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuY29sdW1uLmlkPT09dCkpLmZpbHRlcihCb29sZWFuKS5tYXAoZT0+KHsuLi5lLHBvc2l0aW9uOmByaWdodGB9KSksJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFJpZ2h0VmlzaWJsZUNlbGxzYCkpfSxjcmVhdGVUYWJsZTplPT57ZS5zZXRDb2x1bW5QaW5uaW5nPXQ9PmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2UodCksZS5yZXNldENvbHVtblBpbm5pbmc9dD0+ZS5zZXRDb2x1bW5QaW5uaW5nKHQ/cXgoKTplLmluaXRpYWxTdGF0ZT8uY29sdW1uUGlubmluZz8/cXgoKSksZS5nZXRJc1NvbWVDb2x1bW5zUGlubmVkPXQ9PntsZXQgbj1lLmdldFN0YXRlKCkuY29sdW1uUGlubmluZztyZXR1cm4gdD8hIW5bdF0/Lmxlbmd0aDohIShuLmxlZnQ/Lmxlbmd0aHx8bi5yaWdodD8ubGVuZ3RoKX0sZS5nZXRMZWZ0TGVhZkNvbHVtbnM9USgoKT0+W2UuZ2V0QWxsTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRMZWZ0TGVhZkNvbHVtbnNgKSksZS5nZXRSaWdodExlYWZDb2x1bW5zPVEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbiksJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldFJpZ2h0TGVhZkNvbHVtbnNgKSksZS5nZXRDZW50ZXJMZWFmQ29sdW1ucz1RKCgpPT5bZS5nZXRBbGxMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQsbik9PntsZXQgcj1bLi4udD8/W10sLi4ubj8/W11dO3JldHVybiBlLmZpbHRlcihlPT4hci5pbmNsdWRlcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRDZW50ZXJMZWFmQ29sdW1uc2ApKX19O2Z1bmN0aW9uIFl4KGUpe3JldHVybiBlfHwodHlwZW9mIGRvY3VtZW50PGB1YD9kb2N1bWVudDpudWxsKX12YXIgWHg9e3NpemU6MTUwLG1pblNpemU6MjAsbWF4U2l6ZToyKio1My0xfSxaeD0oKT0+KHtzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsaXNSZXNpemluZ0NvbHVtbjohMSxjb2x1bW5TaXppbmdTdGFydDpbXX0pLFF4PXtnZXREZWZhdWx0Q29sdW1uRGVmOigpPT5YeCxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5TaXppbmc6e30sY29sdW1uU2l6aW5nSW5mbzpaeCgpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe2NvbHVtblJlc2l6ZU1vZGU6YG9uRW5kYCxjb2x1bW5SZXNpemVEaXJlY3Rpb246YGx0cmAsb25Db2x1bW5TaXppbmdDaGFuZ2U6dngoYGNvbHVtblNpemluZ2AsZSksb25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlOnZ4KGBjb2x1bW5TaXppbmdJbmZvYCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UuZ2V0U2l6ZT0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdbZS5pZF07cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUuY29sdW1uRGVmLm1pblNpemU/P1h4Lm1pblNpemUsbj8/ZS5jb2x1bW5EZWYuc2l6ZT8/WHguc2l6ZSksZS5jb2x1bW5EZWYubWF4U2l6ZT8/WHgubWF4U2l6ZSl9LGUuZ2V0U3RhcnQ9UShlPT5bZSxyUyh0LGUpLHQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmddLCh0LG4pPT5uLnNsaWNlKDAsZS5nZXRJbmRleCh0KSkucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApLCQodC5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRTdGFydGApKSxlLmdldEFmdGVyPVEoZT0+W2UsclModCxlKSx0LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nXSwodCxuKT0+bi5zbGljZShlLmdldEluZGV4KHQpKzEpLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKSwkKHQub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgZ2V0QWZ0ZXJgKSksZS5yZXNldFNpemU9KCk9Pnt0LnNldENvbHVtblNpemluZyh0PT57bGV0e1tlLmlkXTpuLC4uLnJ9PXQ7cmV0dXJuIHJ9KX0sZS5nZXRDYW5SZXNpemU9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVSZXNpemluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtblJlc2l6aW5nPz8hMCksZS5nZXRJc1Jlc2l6aW5nPSgpPT50LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nSW5mby5pc1Jlc2l6aW5nQ29sdW1uPT09ZS5pZH0sY3JlYXRlSGVhZGVyOihlLHQpPT57ZS5nZXRTaXplPSgpPT57bGV0IHQ9MCxuPWU9PntlLnN1YkhlYWRlcnMubGVuZ3RoP2Uuc3ViSGVhZGVycy5mb3JFYWNoKG4pOnQrPWUuY29sdW1uLmdldFNpemUoKT8/MH07cmV0dXJuIG4oZSksdH0sZS5nZXRTdGFydD0oKT0+e2lmKGUuaW5kZXg+MCl7bGV0IHQ9ZS5oZWFkZXJHcm91cC5oZWFkZXJzW2UuaW5kZXgtMV07cmV0dXJuIHQuZ2V0U3RhcnQoKSt0LmdldFNpemUoKX1yZXR1cm4gMH0sZS5nZXRSZXNpemVIYW5kbGVyPW49PntsZXQgcj10LmdldENvbHVtbihlLmNvbHVtbi5pZCksaT1yPy5nZXRDYW5SZXNpemUoKTtyZXR1cm4gYT0+e2lmKCFyfHwhaXx8KGEucGVyc2lzdD09bnVsbHx8YS5wZXJzaXN0KCksdFMoYSkmJmEudG91Y2hlcyYmYS50b3VjaGVzLmxlbmd0aD4xKSlyZXR1cm47bGV0IG89ZS5nZXRTaXplKCkscz1lP2UuZ2V0TGVhZkhlYWRlcnMoKS5tYXAoZT0+W2UuY29sdW1uLmlkLGUuY29sdW1uLmdldFNpemUoKV0pOltbci5pZCxyLmdldFNpemUoKV1dLGM9dFMoYSk/TWF0aC5yb3VuZChhLnRvdWNoZXNbMF0uY2xpZW50WCk6YS5jbGllbnRYLGw9e30sdT0oZSxuKT0+e3R5cGVvZiBuPT1gbnVtYmVyYCYmKHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT57bGV0IHI9dC5vcHRpb25zLmNvbHVtblJlc2l6ZURpcmVjdGlvbj09PWBydGxgPy0xOjEsaT0obi0oZT8uc3RhcnRPZmZzZXQ/PzApKSpyLGE9TWF0aC5tYXgoaS8oZT8uc3RhcnRTaXplPz8wKSwtLjk5OTk5OSk7cmV0dXJuIGUuY29sdW1uU2l6aW5nU3RhcnQuZm9yRWFjaChlPT57bGV0W3Qsbl09ZTtsW3RdPU1hdGgucm91bmQoTWF0aC5tYXgobituKmEsMCkqMTAwKS8xMDB9KSx7Li4uZSxkZWx0YU9mZnNldDppLGRlbHRhUGVyY2VudGFnZTphfX0pLCh0Lm9wdGlvbnMuY29sdW1uUmVzaXplTW9kZT09PWBvbkNoYW5nZWB8fGU9PT1gZW5kYCkmJnQuc2V0Q29sdW1uU2l6aW5nKGU9Pih7Li4uZSwuLi5sfSkpKX0sZD1lPT51KGBtb3ZlYCxlKSxmPWU9Pnt1KGBlbmRgLGUpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsaXNSZXNpemluZ0NvbHVtbjohMSxzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsY29sdW1uU2l6aW5nU3RhcnQ6W119KSl9LHA9WXgobiksbT17bW92ZUhhbmRsZXI6ZT0+ZChlLmNsaWVudFgpLHVwSGFuZGxlcjplPT57cD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbW91c2Vtb3ZlYCxtLm1vdmVIYW5kbGVyKSxwPy5yZW1vdmVFdmVudExpc3RlbmVyKGBtb3VzZXVwYCxtLnVwSGFuZGxlciksZihlLmNsaWVudFgpfX0saD17bW92ZUhhbmRsZXI6ZT0+KGUuY2FuY2VsYWJsZSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSxkKGUudG91Y2hlc1swXS5jbGllbnRYKSwhMSksdXBIYW5kbGVyOmU9PntwPy5yZW1vdmVFdmVudExpc3RlbmVyKGB0b3VjaG1vdmVgLGgubW92ZUhhbmRsZXIpLHA/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRvdWNoZW5kYCxoLnVwSGFuZGxlciksZS5jYW5jZWxhYmxlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLGYoZS50b3VjaGVzWzBdPy5jbGllbnRYKX19LGc9ZVMoKT97cGFzc2l2ZTohMX06ITE7dFMoYSk/KHA/LmFkZEV2ZW50TGlzdGVuZXIoYHRvdWNobW92ZWAsaC5tb3ZlSGFuZGxlcixnKSxwPy5hZGRFdmVudExpc3RlbmVyKGB0b3VjaGVuZGAsaC51cEhhbmRsZXIsZykpOihwPy5hZGRFdmVudExpc3RlbmVyKGBtb3VzZW1vdmVgLG0ubW92ZUhhbmRsZXIsZykscD8uYWRkRXZlbnRMaXN0ZW5lcihgbW91c2V1cGAsbS51cEhhbmRsZXIsZykpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsc3RhcnRPZmZzZXQ6YyxzdGFydFNpemU6byxkZWx0YU9mZnNldDowLGRlbHRhUGVyY2VudGFnZTowLGNvbHVtblNpemluZ1N0YXJ0OnMsaXNSZXNpemluZ0NvbHVtbjpyLmlkfSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtblNpemluZz10PT5lLm9wdGlvbnMub25Db2x1bW5TaXppbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZSh0KSxlLnNldENvbHVtblNpemluZ0luZm89dD0+ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZSh0KSxlLnJlc2V0Q29sdW1uU2l6aW5nPXQ9PntlLnNldENvbHVtblNpemluZyh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblNpemluZz8/e30pfSxlLnJlc2V0SGVhZGVyU2l6ZUluZm89dD0+e2Uuc2V0Q29sdW1uU2l6aW5nSW5mbyh0P1p4KCk6ZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nSW5mbz8/WngoKSl9LGUuZ2V0VG90YWxTaXplPSgpPT5lLmdldEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldExlZnRUb3RhbFNpemU9KCk9PmUuZ2V0TGVmdEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldENlbnRlclRvdGFsU2l6ZT0oKT0+ZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKVswXT8uaGVhZGVycy5yZWR1Y2UoKGUsdCk9PmUrdC5nZXRTaXplKCksMCk/PzAsZS5nZXRSaWdodFRvdGFsU2l6ZT0oKT0+ZS5nZXRSaWdodEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MH19LCR4PW51bGw7ZnVuY3Rpb24gZVMoKXtpZih0eXBlb2YgJHg9PWBib29sZWFuYClyZXR1cm4gJHg7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX0sbj0oKT0+e307d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHRlc3RgLG4sdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRlc3RgLG4pfWNhdGNoe2U9ITF9cmV0dXJuICR4PWUsJHh9ZnVuY3Rpb24gdFMoZSl7cmV0dXJuIGUudHlwZT09PWB0b3VjaHN0YXJ0YH12YXIgblM9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblZpc2liaWxpdHk6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlOnZ4KGBjb2x1bW5WaXNpYmlsaXR5YCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UudG9nZ2xlVmlzaWJpbGl0eT1uPT57ZS5nZXRDYW5IaWRlKCkmJnQuc2V0Q29sdW1uVmlzaWJpbGl0eSh0PT4oey4uLnQsW2UuaWRdOm4/PyFlLmdldElzVmlzaWJsZSgpfSkpfSxlLmdldElzVmlzaWJsZT0oKT0+e2xldCBuPWUuY29sdW1ucztyZXR1cm4obi5sZW5ndGg/bi5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlKCkpOnQuZ2V0U3RhdGUoKS5jb2x1bW5WaXNpYmlsaXR5Py5bZS5pZF0pPz8hMH0sZS5nZXRDYW5IaWRlPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlSGlkaW5nPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlSGlkaW5nPz8hMCksZS5nZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlVmlzaWJpbGl0eT09bnVsbHx8ZS50b2dnbGVWaXNpYmlsaXR5KHQudGFyZ2V0LmNoZWNrZWQpfX0sY3JlYXRlUm93OihlLHQpPT57ZS5fZ2V0QWxsVmlzaWJsZUNlbGxzPVEoKCk9PltlLmdldEFsbENlbGxzKCksdC5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHldLGU9PmUuZmlsdGVyKGU9PmUuY29sdW1uLmdldElzVmlzaWJsZSgpKSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgX2dldEFsbFZpc2libGVDZWxsc2ApKSxlLmdldFZpc2libGVDZWxscz1RKCgpPT5bZS5nZXRMZWZ0VmlzaWJsZUNlbGxzKCksZS5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMoKSxlLmdldFJpZ2h0VmlzaWJsZUNlbGxzKCldLChlLHQsbik9PlsuLi5lLC4uLnQsLi4ubl0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFZpc2libGVDZWxsc2ApKX0sY3JlYXRlVGFibGU6ZT0+e2xldCB0PSh0LG4pPT5RKCgpPT5bbigpLG4oKS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGUoKSkubWFwKGU9PmUuaWQpLmpvaW4oYF9gKV0sZT0+ZS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGU9PW51bGw/dm9pZCAwOmUuZ2V0SXNWaXNpYmxlKCkpLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLHQpKTtlLmdldFZpc2libGVGbGF0Q29sdW1ucz10KGBnZXRWaXNpYmxlRmxhdENvbHVtbnNgLCgpPT5lLmdldEFsbEZsYXRDb2x1bW5zKCkpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKSksZS5nZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnNgLCgpPT5lLmdldExlZnRMZWFmQ29sdW1ucygpKSxlLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zYCwoKT0+ZS5nZXRSaWdodExlYWZDb2x1bW5zKCkpLGUuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldENlbnRlclZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMoKSksZS5zZXRDb2x1bW5WaXNpYmlsaXR5PXQ9PmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UodCksZS5yZXNldENvbHVtblZpc2liaWxpdHk9dD0+e2Uuc2V0Q29sdW1uVmlzaWJpbGl0eSh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblZpc2liaWxpdHk/P3t9KX0sZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZT10PT57dD8/PSFlLmdldElzQWxsQ29sdW1uc1Zpc2libGUoKSxlLnNldENvbHVtblZpc2liaWxpdHkoZS5nZXRBbGxMZWFmQ29sdW1ucygpLnJlZHVjZSgoZSxuKT0+KHsuLi5lLFtuLmlkXTp0fHwhKG4uZ2V0Q2FuSGlkZSE9bnVsbCYmbi5nZXRDYW5IaWRlKCkpfSkse30pKX0sZS5nZXRJc0FsbENvbHVtbnNWaXNpYmxlPSgpPT4hZS5nZXRBbGxMZWFmQ29sdW1ucygpLnNvbWUoZT0+IShlLmdldElzVmlzaWJsZSE9bnVsbCYmZS5nZXRJc1Zpc2libGUoKSkpLGUuZ2V0SXNTb21lQ29sdW1uc1Zpc2libGU9KCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKS5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlPT1udWxsP3ZvaWQgMDplLmdldElzVmlzaWJsZSgpKSxlLmdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlQWxsQ29sdW1uc1Zpc2libGUodC50YXJnZXQ/LmNoZWNrZWQpfX19O2Z1bmN0aW9uIHJTKGUsdCl7cmV0dXJuIHQ/dD09PWBjZW50ZXJgP2UuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zKCk6dD09PWBsZWZ0YD9lLmdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnMoKTplLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zKCk6ZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKX12YXIgaVM9e2NyZWF0ZVRhYmxlOmU9PntlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbChlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9KCk9PmUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw/ZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCk6ZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsKCksZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz1lLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmZS5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXMoZSxgX19nbG9iYWxfX2ApLGUuZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz0oKT0+ZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz9lLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzKCk6bmV3IE1hcCxlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPWUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzJiZlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyhlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPSgpPT57aWYoZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcylyZXR1cm4gZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcygpfX19LGFTPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtnbG9iYWxGaWx0ZXI6dm9pZCAwLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR2xvYmFsRmlsdGVyQ2hhbmdlOnZ4KGBnbG9iYWxGaWx0ZXJgLGUpLGdsb2JhbEZpbHRlckZuOmBhdXRvYCxnZXRDb2x1bW5DYW5HbG9iYWxGaWx0ZXI6dD0+e3ZhciBuO2xldCByPShuPWUuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0pPT1udWxsfHwobj1uLl9nZXRBbGxDZWxsc0J5Q29sdW1uSWQoKVt0LmlkXSk9PW51bGw/dm9pZCAwOm4uZ2V0VmFsdWUoKTtyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgfHx0eXBlb2Ygcj09YG51bWJlcmB9fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRDYW5HbG9iYWxGaWx0ZXI9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJigodC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcj09bnVsbD92b2lkIDA6dC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcihlKSk/PyEwKSYmISFlLmFjY2Vzc29yRm59LGNyZWF0ZVRhYmxlOmU9PntlLmdldEdsb2JhbEF1dG9GaWx0ZXJGbj0oKT0+enguaW5jbHVkZXNTdHJpbmcsZS5nZXRHbG9iYWxGaWx0ZXJGbj0oKT0+e2xldHtnbG9iYWxGaWx0ZXJGbjp0fT1lLm9wdGlvbnM7cmV0dXJuIHl4KHQpP3Q6dD09PWBhdXRvYD9lLmdldEdsb2JhbEF1dG9GaWx0ZXJGbigpOmUub3B0aW9ucy5maWx0ZXJGbnM/Llt0XT8/enhbdF19LGUuc2V0R2xvYmFsRmlsdGVyPXQ9PntlLm9wdGlvbnMub25HbG9iYWxGaWx0ZXJDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZSh0KX0sZS5yZXNldEdsb2JhbEZpbHRlcj10PT57ZS5zZXRHbG9iYWxGaWx0ZXIodD92b2lkIDA6ZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyKX19fSxvUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7ZXhwYW5kZWQ6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25FeHBhbmRlZENoYW5nZTp2eChgZXhwYW5kZWRgLGUpLHBhZ2luYXRlRXhwYW5kZWRSb3dzOiEwfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0RXhwYW5kZWQ9KCk9PntpZighdCl7ZS5fcXVldWUoKCk9Pnt0PSEwfSk7cmV0dXJufWlmKGUub3B0aW9ucy5hdXRvUmVzZXRBbGw/P2Uub3B0aW9ucy5hdXRvUmVzZXRFeHBhbmRlZD8/IWUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmcpe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0RXhwYW5kZWQoKSxuPSExfSl9fSxlLnNldEV4cGFuZGVkPXQ9PmUub3B0aW9ucy5vbkV4cGFuZGVkQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25FeHBhbmRlZENoYW5nZSh0KSxlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZD10PT57dD8/IWUuZ2V0SXNBbGxSb3dzRXhwYW5kZWQoKT9lLnNldEV4cGFuZGVkKCEwKTplLnNldEV4cGFuZGVkKHt9KX0sZS5yZXNldEV4cGFuZGVkPXQ9PntlLnNldEV4cGFuZGVkKHQ/e306ZS5pbml0aWFsU3RhdGU/LmV4cGFuZGVkPz97fSl9LGUuZ2V0Q2FuU29tZVJvd3NFeHBhbmQ9KCk9PmUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT5lLmdldENhbkV4cGFuZCgpKSxlLmdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZEhhbmRsZXI9KCk9PnQ9Pnt0LnBlcnNpc3Q9PW51bGx8fHQucGVyc2lzdCgpLGUudG9nZ2xlQWxsUm93c0V4cGFuZGVkKCl9LGUuZ2V0SXNTb21lUm93c0V4cGFuZGVkPSgpPT57bGV0IHQ9ZS5nZXRTdGF0ZSgpLmV4cGFuZGVkO3JldHVybiB0PT09ITB8fE9iamVjdC52YWx1ZXModCkuc29tZShCb29sZWFuKX0sZS5nZXRJc0FsbFJvd3NFeHBhbmRlZD0oKT0+e2xldCB0PWUuZ2V0U3RhdGUoKS5leHBhbmRlZDtyZXR1cm4gdHlwZW9mIHQ9PWBib29sZWFuYD90PT09ITA6ISghT2JqZWN0LmtleXModCkubGVuZ3RofHxlLmdldFJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT4hZS5nZXRJc0V4cGFuZGVkKCkpKX0sZS5nZXRFeHBhbmRlZERlcHRoPSgpPT57bGV0IHQ9MDtyZXR1cm4oZS5nZXRTdGF0ZSgpLmV4cGFuZGVkPT09ITA/T2JqZWN0LmtleXMoZS5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKTpPYmplY3Qua2V5cyhlLmdldFN0YXRlKCkuZXhwYW5kZWQpKS5mb3JFYWNoKGU9PntsZXQgbj1lLnNwbGl0KGAuYCk7dD1NYXRoLm1heCh0LG4ubGVuZ3RoKX0pLHR9LGUuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbD0oKT0+ZS5nZXRTb3J0ZWRSb3dNb2RlbCgpLGUuZ2V0RXhwYW5kZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RXhwYW5kZWRSb3dNb2RlbCYmKGUuX2dldEV4cGFuZGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEV4cGFuZGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmd8fCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsP2UuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbCgpOmUuX2dldEV4cGFuZGVkUm93TW9kZWwoKSl9LGNyZWF0ZVJvdzooZSx0KT0+e2UudG9nZ2xlRXhwYW5kZWQ9bj0+e3Quc2V0RXhwYW5kZWQocj0+e2xldCBpPXI9PT0hMHx8ISEociE9bnVsbCYmcltlLmlkXSksYT17fTtpZihyPT09ITA/T2JqZWN0LmtleXModC5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKS5mb3JFYWNoKGU9PnthW2VdPSEwfSk6YT1yLG4/Pz0haSwhaSYmbilyZXR1cm57Li4uYSxbZS5pZF06ITB9O2lmKGkmJiFuKXtsZXR7W2UuaWRdOnQsLi4ubn09YTtyZXR1cm4gbn1yZXR1cm4gcn0pfSxlLmdldElzRXhwYW5kZWQ9KCk9PntsZXQgbj10LmdldFN0YXRlKCkuZXhwYW5kZWQ7cmV0dXJuISEoKHQub3B0aW9ucy5nZXRJc1Jvd0V4cGFuZGVkPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0SXNSb3dFeHBhbmRlZChlKSk/PyhuPT09ITB8fG4/LltlLmlkXSkpfSxlLmdldENhbkV4cGFuZD0oKT0+e3ZhciBuO3JldHVybih0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kKGUpKT8/KCh0Lm9wdGlvbnMuZW5hYmxlRXhwYW5kaW5nPz8hMCkmJiEhKChuPWUuc3ViUm93cykhPW51bGwmJm4ubGVuZ3RoKSl9LGUuZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQ9KCk9PntsZXQgbj0hMCxyPWU7Zm9yKDtuJiZyLnBhcmVudElkOylyPXQuZ2V0Um93KHIucGFyZW50SWQsITApLG49ci5nZXRJc0V4cGFuZGVkKCk7cmV0dXJuIG59LGUuZ2V0VG9nZ2xlRXhwYW5kZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5FeHBhbmQoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlRXhwYW5kZWQoKX19fX0sc1M9MCxjUz0xMCxsUz0oKT0+KHtwYWdlSW5kZXg6c1MscGFnZVNpemU6Y1N9KSx1Uz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Li4uZSxwYWdpbmF0aW9uOnsuLi5sUygpLC4uLmU/LnBhZ2luYXRpb259fSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblBhZ2luYXRpb25DaGFuZ2U6dngoYHBhZ2luYXRpb25gLGUpfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0UGFnZUluZGV4PSgpPT57aWYoIXQpe2UuX3F1ZXVlKCgpPT57dD0hMH0pO3JldHVybn1pZihlLm9wdGlvbnMuYXV0b1Jlc2V0QWxsPz9lLm9wdGlvbnMuYXV0b1Jlc2V0UGFnZUluZGV4Pz8hZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb24pe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0UGFnZUluZGV4KCksbj0hMX0pfX0sZS5zZXRQYWdpbmF0aW9uPXQ9PmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2UoZT0+X3godCxlKSksZS5yZXNldFBhZ2luYXRpb249dD0+e2Uuc2V0UGFnaW5hdGlvbih0P2xTKCk6ZS5pbml0aWFsU3RhdGUucGFnaW5hdGlvbj8/bFMoKSl9LGUuc2V0UGFnZUluZGV4PXQ9PntlLnNldFBhZ2luYXRpb24obj0+e2xldCByPV94KHQsbi5wYWdlSW5kZXgpLGk9ZS5vcHRpb25zLnBhZ2VDb3VudD09PXZvaWQgMHx8ZS5vcHRpb25zLnBhZ2VDb3VudD09PS0xPzIqKjUzLTE6ZS5vcHRpb25zLnBhZ2VDb3VudC0xO3JldHVybiByPU1hdGgubWF4KDAsTWF0aC5taW4ocixpKSksey4uLm4scGFnZUluZGV4OnJ9fSl9LGUucmVzZXRQYWdlSW5kZXg9dD0+e3ZhciBuO2Uuc2V0UGFnZUluZGV4KHQ/c1M6KChuPWUuaW5pdGlhbFN0YXRlKT09bnVsbHx8KG49bi5wYWdpbmF0aW9uKT09bnVsbD92b2lkIDA6bi5wYWdlSW5kZXgpPz9zUyl9LGUucmVzZXRQYWdlU2l6ZT10PT57dmFyIG47ZS5zZXRQYWdlU2l6ZSh0P2NTOigobj1lLmluaXRpYWxTdGF0ZSk9PW51bGx8fChuPW4ucGFnaW5hdGlvbik9PW51bGw/dm9pZCAwOm4ucGFnZVNpemUpPz9jUyl9LGUuc2V0UGFnZVNpemU9dD0+e2Uuc2V0UGFnaW5hdGlvbihlPT57bGV0IG49TWF0aC5tYXgoMSxfeCh0LGUucGFnZVNpemUpKSxyPWUucGFnZVNpemUqZS5wYWdlSW5kZXgsaT1NYXRoLmZsb29yKHIvbik7cmV0dXJuey4uLmUscGFnZUluZGV4OmkscGFnZVNpemU6bn19KX0sZS5zZXRQYWdlQ291bnQ9dD0+ZS5zZXRQYWdpbmF0aW9uKG49PntsZXQgcj1feCh0LGUub3B0aW9ucy5wYWdlQ291bnQ/Py0xKTtyZXR1cm4gdHlwZW9mIHI9PWBudW1iZXJgJiYocj1NYXRoLm1heCgtMSxyKSksey4uLm4scGFnZUNvdW50OnJ9fSksZS5nZXRQYWdlT3B0aW9ucz1RKCgpPT5bZS5nZXRQYWdlQ291bnQoKV0sZT0+e2xldCB0PVtdO3JldHVybiBlJiZlPjAmJih0PVsuLi5BcnJheShlKV0uZmlsbChudWxsKS5tYXAoKGUsdCk9PnQpKSx0fSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFBhZ2VPcHRpb25zYCkpLGUuZ2V0Q2FuUHJldmlvdXNQYWdlPSgpPT5lLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlSW5kZXg+MCxlLmdldENhbk5leHRQYWdlPSgpPT57bGV0e3BhZ2VJbmRleDp0fT1lLmdldFN0YXRlKCkucGFnaW5hdGlvbixuPWUuZ2V0UGFnZUNvdW50KCk7cmV0dXJuIG49PT0tMXx8biE9PTAmJnQ8bi0xfSxlLnByZXZpb3VzUGFnZT0oKT0+ZS5zZXRQYWdlSW5kZXgoZT0+ZS0xKSxlLm5leHRQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlPT5lKzEpLGUuZmlyc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleCgwKSxlLmxhc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlLmdldFBhZ2VDb3VudCgpLTEpLGUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsPSgpPT5lLmdldEV4cGFuZGVkUm93TW9kZWwoKSxlLmdldFBhZ2luYXRpb25Sb3dNb2RlbD0oKT0+KCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwmJmUub3B0aW9ucy5nZXRQYWdpbmF0aW9uUm93TW9kZWwmJihlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw9ZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb258fCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKTplLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwoKSksZS5nZXRQYWdlQ291bnQ9KCk9PmUub3B0aW9ucy5wYWdlQ291bnQ/P01hdGguY2VpbChlLmdldFJvd0NvdW50KCkvZS5nZXRTdGF0ZSgpLnBhZ2luYXRpb24ucGFnZVNpemUpLGUuZ2V0Um93Q291bnQ9KCk9PmUub3B0aW9ucy5yb3dDb3VudD8/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKS5yb3dzLmxlbmd0aH19LGRTPSgpPT4oe3RvcDpbXSxib3R0b206W119KSxmUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7cm93UGlubmluZzpkUygpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uUm93UGlubmluZ0NoYW5nZTp2eChgcm93UGlubmluZ2AsZSl9KSxjcmVhdGVSb3c6KGUsdCk9PntlLnBpbj0obixyLGkpPT57bGV0IGE9cj9lLmdldExlYWZSb3dzKCkubWFwKGU9PntsZXR7aWQ6dH09ZTtyZXR1cm4gdH0pOltdLG89aT9lLmdldFBhcmVudFJvd3MoKS5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSk6W10scz1uZXcgU2V0KFsuLi5vLGUuaWQsLi4uYV0pO3Quc2V0Um93UGlubmluZyhlPT5uPT09YGJvdHRvbWA/e3RvcDooZT8udG9wPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKSxib3R0b206Wy4uLihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLC4uLkFycmF5LmZyb20ocyldfTpuPT09YHRvcGA/e3RvcDpbLi4uKGU/LnRvcD8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSksLi4uQXJyYXkuZnJvbShzKV0sYm90dG9tOihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpfTp7dG9wOihlPy50b3A/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLGJvdHRvbTooZT8uYm90dG9tPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+e2xldHtlbmFibGVSb3dQaW5uaW5nOm4sZW5hYmxlUGlubmluZzpyfT10Lm9wdGlvbnM7cmV0dXJuIHR5cGVvZiBuPT1gZnVuY3Rpb25gP24oZSk6bj8/cj8/ITB9LGUuZ2V0SXNQaW5uZWQ9KCk9PntsZXQgbj1bZS5pZF0se3RvcDpyLGJvdHRvbTppfT10LmdldFN0YXRlKCkucm93UGlubmluZyxhPW4uc29tZShlPT5yPy5pbmNsdWRlcyhlKSksbz1uLnNvbWUoZT0+aT8uaW5jbHVkZXMoZSkpO3JldHVybiBhP2B0b3BgOm8/YGJvdHRvbWA6ITF9LGUuZ2V0UGlubmVkSW5kZXg9KCk9PntsZXQgbj1lLmdldElzUGlubmVkKCk7cmV0dXJuIG4/KChuPT09YHRvcGA/dC5nZXRUb3BSb3dzKCk6dC5nZXRCb3R0b21Sb3dzKCkpPy5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSkpPy5pbmRleE9mKGUuaWQpPz8tMTotMX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFJvd1Bpbm5pbmc9dD0+ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZSh0KSxlLnJlc2V0Um93UGlubmluZz10PT5lLnNldFJvd1Bpbm5pbmcodD9kUygpOmUuaW5pdGlhbFN0YXRlPy5yb3dQaW5uaW5nPz9kUygpKSxlLmdldElzU29tZVJvd3NQaW5uZWQ9dD0+e2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nO3JldHVybiB0PyEhblt0XT8ubGVuZ3RoOiEhKG4udG9wPy5sZW5ndGh8fG4uYm90dG9tPy5sZW5ndGgpfSxlLl9nZXRQaW5uZWRSb3dzPSh0LG4scik9PihlLm9wdGlvbnMua2VlcFBpbm5lZFJvd3M/PyEwPyhuPz9bXSkubWFwKHQ9PntsZXQgbj1lLmdldFJvdyh0LCEwKTtyZXR1cm4gbi5nZXRJc0FsbFBhcmVudHNFeHBhbmRlZCgpP246bnVsbH0pOihuPz9bXSkubWFwKGU9PnQuZmluZCh0PT50LmlkPT09ZSkpKS5maWx0ZXIoQm9vbGVhbikubWFwKGU9Pih7Li4uZSxwb3NpdGlvbjpyfSkpLGUuZ2V0VG9wUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYHRvcGApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRUb3BSb3dzYCkpLGUuZ2V0Qm90dG9tUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcuYm90dG9tXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYGJvdHRvbWApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRCb3R0b21Sb3dzYCkpLGUuZ2V0Q2VudGVyUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wLGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLmJvdHRvbV0sKGUsdCxuKT0+e2xldCByPW5ldyBTZXQoWy4uLnQ/P1tdLC4uLm4/P1tdXSk7cmV0dXJuIGUuZmlsdGVyKGU9PiFyLmhhcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRDZW50ZXJSb3dzYCkpfX0scFM9e2dldEluaXRpYWxTdGF0ZTplPT4oe3Jvd1NlbGVjdGlvbjp7fSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblJvd1NlbGVjdGlvbkNoYW5nZTp2eChgcm93U2VsZWN0aW9uYCxlKSxlbmFibGVSb3dTZWxlY3Rpb246ITAsZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb246ITAsZW5hYmxlU3ViUm93U2VsZWN0aW9uOiEwfSksY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Um93U2VsZWN0aW9uPXQ9PmUub3B0aW9ucy5vblJvd1NlbGVjdGlvbkNoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93U2VsZWN0aW9uQ2hhbmdlKHQpLGUucmVzZXRSb3dTZWxlY3Rpb249dD0+ZS5zZXRSb3dTZWxlY3Rpb24odD97fTplLmluaXRpYWxTdGF0ZS5yb3dTZWxlY3Rpb24/P3t9KSxlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZD10PT57ZS5zZXRSb3dTZWxlY3Rpb24obj0+e3Q9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFJvd3NTZWxlY3RlZCgpOnQ7bGV0IHI9ey4uLm59LGk9ZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4gdD9pLmZvckVhY2goZT0+e2UuZ2V0Q2FuU2VsZWN0KCkmJihyW2UuaWRdPSEwKX0pOmkuZm9yRWFjaChlPT57ZGVsZXRlIHJbZS5pZF19KSxyfSl9LGUudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZD10PT5lLnNldFJvd1NlbGVjdGlvbihuPT57bGV0IHI9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKTp0LGk9ey4uLm59O3JldHVybiBlLmdldFJvd01vZGVsKCkucm93cy5mb3JFYWNoKHQ9PnttUyhpLHQuaWQsciwhMCxlKX0pLGl9KSxlLmdldFByZVNlbGVjdGVkUm93TW9kZWw9KCk9PmUuZ2V0Q29yZVJvd01vZGVsKCksZS5nZXRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0Q29yZVJvd01vZGVsKCldLCh0LG4pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg/aFMoZSxuKTp7cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWw9USgoKT0+W2UuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24sZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWxgKSksZS5nZXRJc0FsbFJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISEodC5sZW5ndGgmJk9iamVjdC5rZXlzKG4pLmxlbmd0aCk7cmV0dXJuIHImJnQuc29tZShlPT5lLmdldENhblNlbGVjdCgpJiYhbltlLmlkXSkmJihyPSExKSxyfSxlLmdldElzQWxsUGFnZVJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0UGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3MuZmlsdGVyKGU9PmUuZ2V0Q2FuU2VsZWN0KCkpLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISF0Lmxlbmd0aDtyZXR1cm4gciYmdC5zb21lKGU9PiFuW2UuaWRdKSYmKHI9ITEpLHJ9LGUuZ2V0SXNTb21lUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9T2JqZWN0LmtleXMoZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbj8/e30pLmxlbmd0aDtyZXR1cm4gdD4wJiZ0PGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLmxlbmd0aH0sZS5nZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9ZS5nZXRQYWdpbmF0aW9uUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKSYmdC5maWx0ZXIoZT0+ZS5nZXRDYW5TZWxlY3QoKSkuc29tZShlPT5lLmdldElzU2VsZWN0ZWQoKXx8ZS5nZXRJc1NvbWVTZWxlY3RlZCgpKX0sZS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyPSgpPT50PT57ZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9LGUuZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZEhhbmRsZXI9KCk9PnQ9PntlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLnRvZ2dsZVNlbGVjdGVkPShuLHIpPT57bGV0IGk9ZS5nZXRJc1NlbGVjdGVkKCk7dC5zZXRSb3dTZWxlY3Rpb24oYT0+e2lmKG49bj09PXZvaWQgMD8haTpuLGUuZ2V0Q2FuU2VsZWN0KCkmJmk9PT1uKXJldHVybiBhO2xldCBvPXsuLi5hfTtyZXR1cm4gbVMobyxlLmlkLG4scj8uc2VsZWN0Q2hpbGRyZW4/PyEwLHQpLG99KX0sZS5nZXRJc1NlbGVjdGVkPSgpPT57bGV0e3Jvd1NlbGVjdGlvbjpufT10LmdldFN0YXRlKCk7cmV0dXJuIGdTKGUsbil9LGUuZ2V0SXNTb21lU2VsZWN0ZWQ9KCk9PntsZXR7cm93U2VsZWN0aW9uOm59PXQuZ2V0U3RhdGUoKTtyZXR1cm4gX1MoZSxuKT09PWBzb21lYH0sZS5nZXRJc0FsbFN1YlJvd3NTZWxlY3RlZD0oKT0+e2xldHtyb3dTZWxlY3Rpb246bn09dC5nZXRTdGF0ZSgpO3JldHVybiBfUyhlLG4pPT09YGFsbGB9LGUuZ2V0Q2FuU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbj09YGZ1bmN0aW9uYD90Lm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKGUpOnQub3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0Q2FuU2VsZWN0U3ViUm93cz0oKT0+dHlwZW9mIHQub3B0aW9ucy5lbmFibGVTdWJSb3dTZWxlY3Rpb249PWBmdW5jdGlvbmA/dC5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uPz8hMCxlLmdldENhbk11bHRpU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uPT1gZnVuY3Rpb25gP3Qub3B0aW9ucy5lbmFibGVNdWx0aVJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0VG9nZ2xlU2VsZWN0ZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5TZWxlY3QoKTtyZXR1cm4gbj0+e3QmJmUudG9nZ2xlU2VsZWN0ZWQobi50YXJnZXQ/LmNoZWNrZWQpfX19fSxtUz0oZSx0LG4scixpKT0+e3ZhciBhO2xldCBvPWkuZ2V0Um93KHQsITApO24/KG8uZ2V0Q2FuTXVsdGlTZWxlY3QoKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCh0PT5kZWxldGUgZVt0XSksby5nZXRDYW5TZWxlY3QoKSYmKGVbdF09ITApKTpkZWxldGUgZVt0XSxyJiYoYT1vLnN1YlJvd3MpIT1udWxsJiZhLmxlbmd0aCYmby5nZXRDYW5TZWxlY3RTdWJSb3dzKCkmJm8uc3ViUm93cy5mb3JFYWNoKHQ9Pm1TKGUsdC5pZCxuLHIsaSkpfTtmdW5jdGlvbiBoUyhlLHQpe2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24scj1bXSxpPXt9LGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoZT0+e3ZhciB0O2xldCBvPWdTKGUsbik7aWYobyYmKHIucHVzaChlKSxpW2UuaWRdPWUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZT17Li4uZSxzdWJSb3dzOmEoZS5zdWJSb3dzKX0pLG8pcmV0dXJuIGV9KS5maWx0ZXIoQm9vbGVhbil9O3JldHVybntyb3dzOmEodC5yb3dzKSxmbGF0Um93czpyLHJvd3NCeUlkOml9fWZ1bmN0aW9uIGdTKGUsdCl7cmV0dXJuIHRbZS5pZF0/PyExfWZ1bmN0aW9uIF9TKGUsdCxuKXt2YXIgcjtpZighKChyPWUuc3ViUm93cykhPW51bGwmJnIubGVuZ3RoKSlyZXR1cm4hMTtsZXQgaT0hMCxhPSExO3JldHVybiBlLnN1YlJvd3MuZm9yRWFjaChlPT57aWYoIShhJiYhaSkmJihlLmdldENhblNlbGVjdCgpJiYoZ1MoZSx0KT9hPSEwOmk9ITEpLGUuc3ViUm93cyYmZS5zdWJSb3dzLmxlbmd0aCkpe2xldCBuPV9TKGUsdCk7bj09PWBhbGxgP2E9ITA6KG49PT1gc29tZWAmJihhPSEwKSxpPSExKX19KSxpP2BhbGxgOmE/YHNvbWVgOiExfXZhciB2Uz0vKFswLTldKykvZ20seVM9KGUsdCxuKT0+RFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxiUz0oZSx0LG4pPT5EUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSkseFM9KGUsdCxuKT0+VFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxTUz0oZSx0LG4pPT5UUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSksQ1M9KGUsdCxuKT0+e2xldCByPWUuZ2V0VmFsdWUobiksaT10LmdldFZhbHVlKG4pO3JldHVybiByPmk/MTpyPGk/LTE6MH0sd1M9KGUsdCxuKT0+VFMoZS5nZXRWYWx1ZShuKSx0LmdldFZhbHVlKG4pKTtmdW5jdGlvbiBUUyhlLHQpe3JldHVybiBlPT09dD8wOmU+dD8xOi0xfWZ1bmN0aW9uIEVTKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmA/aXNOYU4oZSl8fGU9PT0xLzB8fGU9PT0tMS8wP2BgOlN0cmluZyhlKTp0eXBlb2YgZT09YHN0cmluZ2A/ZTpgYH1mdW5jdGlvbiBEUyhlLHQpe2xldCBuPWUuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKSxyPXQuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKTtmb3IoO24ubGVuZ3RoJiZyLmxlbmd0aDspe2xldCBlPW4uc2hpZnQoKSx0PXIuc2hpZnQoKSxpPXBhcnNlSW50KGUsMTApLGE9cGFyc2VJbnQodCwxMCksbz1baSxhXS5zb3J0KCk7aWYoaXNOYU4ob1swXSkpe2lmKGU+dClyZXR1cm4gMTtpZih0PmUpcmV0dXJuLTE7Y29udGludWV9aWYoaXNOYU4ob1sxXSkpcmV0dXJuIGlzTmFOKGkpPy0xOjE7aWYoaT5hKXJldHVybiAxO2lmKGE+aSlyZXR1cm4tMX1yZXR1cm4gbi5sZW5ndGgtci5sZW5ndGh9dmFyIE9TPXthbHBoYW51bWVyaWM6eVMsYWxwaGFudW1lcmljQ2FzZVNlbnNpdGl2ZTpiUyx0ZXh0OnhTLHRleHRDYXNlU2Vuc2l0aXZlOlNTLGRhdGV0aW1lOkNTLGJhc2ljOndTfSxrUz1bRXgsblMsS3gsSngsa3gsVngsaVMsYVMse2dldEluaXRpYWxTdGF0ZTplPT4oe3NvcnRpbmc6W10sLi4uZX0pLGdldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7c29ydGluZ0ZuOmBhdXRvYCxzb3J0VW5kZWZpbmVkOjF9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uU29ydGluZ0NoYW5nZTp2eChgc29ydGluZ2AsZSksaXNNdWx0aVNvcnRFdmVudDplPT5lLnNoaWZ0S2V5fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRBdXRvU29ydGluZ0ZuPSgpPT57bGV0IG49dC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Muc2xpY2UoMTApLHI9ITE7Zm9yKGxldCB0IG9mIG4pe2xldCBuPXQ/LmdldFZhbHVlKGUuaWQpO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PWBbb2JqZWN0IERhdGVdYClyZXR1cm4gT1MuZGF0ZXRpbWU7aWYodHlwZW9mIG49PWBzdHJpbmdgJiYocj0hMCxuLnNwbGl0KHZTKS5sZW5ndGg+MSkpcmV0dXJuIE9TLmFscGhhbnVtZXJpY31yZXR1cm4gcj9PUy50ZXh0Ok9TLmJhc2ljfSxlLmdldEF1dG9Tb3J0RGlyPSgpPT50eXBlb2YgdC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpPT1gc3RyaW5nYD9gYXNjYDpgZGVzY2AsZS5nZXRTb3J0aW5nRm49KCk9PntpZighZSl0aHJvdyBFcnJvcigpO3JldHVybiB5eChlLmNvbHVtbkRlZi5zb3J0aW5nRm4pP2UuY29sdW1uRGVmLnNvcnRpbmdGbjplLmNvbHVtbkRlZi5zb3J0aW5nRm49PT1gYXV0b2A/ZS5nZXRBdXRvU29ydGluZ0ZuKCk6dC5vcHRpb25zLnNvcnRpbmdGbnM/LltlLmNvbHVtbkRlZi5zb3J0aW5nRm5dPz9PU1tlLmNvbHVtbkRlZi5zb3J0aW5nRm5dfSxlLnRvZ2dsZVNvcnRpbmc9KG4scik9PntsZXQgaT1lLmdldE5leHRTb3J0aW5nT3JkZXIoKSxhPW4hPW51bGw7dC5zZXRTb3J0aW5nKG89PntsZXQgcz1vPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxjPW8/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksbD1bXSx1LGQ9YT9uOmk9PT1gZGVzY2A7cmV0dXJuIHU9byE9bnVsbCYmby5sZW5ndGgmJmUuZ2V0Q2FuTXVsdGlTb3J0KCkmJnI/cz9gdG9nZ2xlYDpgYWRkYDpvIT1udWxsJiZvLmxlbmd0aCYmYyE9PW8ubGVuZ3RoLTE/YHJlcGxhY2VgOnM/YHRvZ2dsZWA6YHJlcGxhY2VgLHU9PT1gdG9nZ2xlYCYmKGF8fGl8fCh1PWByZW1vdmVgKSksdT09PWBhZGRgPyhsPVsuLi5vLHtpZDplLmlkLGRlc2M6ZH1dLGwuc3BsaWNlKDAsbC5sZW5ndGgtKHQub3B0aW9ucy5tYXhNdWx0aVNvcnRDb2xDb3VudD8/MioqNTMtMSkpKTpsPXU9PT1gdG9nZ2xlYD9vLm1hcCh0PT50LmlkPT09ZS5pZD97Li4udCxkZXNjOmR9OnQpOnU9PT1gcmVtb3ZlYD9vLmZpbHRlcih0PT50LmlkIT09ZS5pZCk6W3tpZDplLmlkLGRlc2M6ZH1dLGx9KX0sZS5nZXRGaXJzdFNvcnREaXI9KCk9PmUuY29sdW1uRGVmLnNvcnREZXNjRmlyc3Q/P3Qub3B0aW9ucy5zb3J0RGVzY0ZpcnN0Pz9lLmdldEF1dG9Tb3J0RGlyKCk9PT1gZGVzY2A/YGRlc2NgOmBhc2NgLGUuZ2V0TmV4dFNvcnRpbmdPcmRlcj1uPT57bGV0IHI9ZS5nZXRGaXJzdFNvcnREaXIoKSxpPWUuZ2V0SXNTb3J0ZWQoKTtyZXR1cm4gaT9pIT09ciYmKHQub3B0aW9ucy5lbmFibGVTb3J0aW5nUmVtb3ZhbD8/ITApJiYoIW58fCh0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSZW1vdmU/PyEwKSk/ITE6aT09PWBkZXNjYD9gYXNjYDpgZGVzY2A6cn0sZS5nZXRDYW5Tb3J0PSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlU29ydGluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZVNvcnRpbmc/PyEwKSYmISFlLmFjY2Vzc29yRm4sZS5nZXRDYW5NdWx0aVNvcnQ9KCk9PmUuY29sdW1uRGVmLmVuYWJsZU11bHRpU29ydD8/dC5vcHRpb25zLmVuYWJsZU11bHRpU29ydD8/ISFlLmFjY2Vzc29yRm4sZS5nZXRJc1NvcnRlZD0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5zb3J0aW5nPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKTtyZXR1cm4gbj9uLmRlc2M/YGRlc2NgOmBhc2NgOiExfSxlLmdldFNvcnRJbmRleD0oKT0+dC5nZXRTdGF0ZSgpLnNvcnRpbmc/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCk/Py0xLGUuY2xlYXJTb3J0aW5nPSgpPT57dC5zZXRTb3J0aW5nKHQ9PnQhPW51bGwmJnQubGVuZ3RoP3QuZmlsdGVyKHQ9PnQuaWQhPT1lLmlkKTpbXSl9LGUuZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXI9KCk9PntsZXQgbj1lLmdldENhblNvcnQoKTtyZXR1cm4gcj0+e24mJihyLnBlcnNpc3Q9PW51bGx8fHIucGVyc2lzdCgpLGUudG9nZ2xlU29ydGluZz09bnVsbHx8ZS50b2dnbGVTb3J0aW5nKHZvaWQgMCxlLmdldENhbk11bHRpU29ydCgpP3Qub3B0aW9ucy5pc011bHRpU29ydEV2ZW50PT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuaXNNdWx0aVNvcnRFdmVudChyKTohMSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFNvcnRpbmc9dD0+ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZSh0KSxlLnJlc2V0U29ydGluZz10PT57ZS5zZXRTb3J0aW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/LnNvcnRpbmc/P1tdKX0sZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbD0oKT0+ZS5nZXRHcm91cGVkUm93TW9kZWwoKSxlLmdldFNvcnRlZFJvd01vZGVsPSgpPT4oIWUuX2dldFNvcnRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwmJihlLl9nZXRTb3J0ZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxTb3J0aW5nfHwhZS5fZ2V0U29ydGVkUm93TW9kZWw/ZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCgpOmUuX2dldFNvcnRlZFJvd01vZGVsKCkpfX0sV3gsb1MsdVMsZlMscFMsUXhdO2Z1bmN0aW9uIEFTKGUpe2xldCB0PVsuLi5rUywuLi5lLl9mZWF0dXJlcz8/W11dLG49e19mZWF0dXJlczp0fSxyPW4uX2ZlYXR1cmVzLnJlZHVjZSgoZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQuZ2V0RGVmYXVsdE9wdGlvbnM9PW51bGw/dm9pZCAwOnQuZ2V0RGVmYXVsdE9wdGlvbnMobikpLHt9KSxpPWU9Pm4ub3B0aW9ucy5tZXJnZU9wdGlvbnM/bi5vcHRpb25zLm1lcmdlT3B0aW9ucyhyLGUpOnsuLi5yLC4uLmV9LGE9ey4uLmUuaW5pdGlhbFN0YXRlPz97fX07bi5fZmVhdHVyZXMuZm9yRWFjaChlPT57YT0oZS5nZXRJbml0aWFsU3RhdGU9PW51bGw/dm9pZCAwOmUuZ2V0SW5pdGlhbFN0YXRlKGEpKT8/YX0pO2xldCBvPVtdLHM9ITEsYz17X2ZlYXR1cmVzOnQsb3B0aW9uczp7Li4uciwuLi5lfSxpbml0aWFsU3RhdGU6YSxfcXVldWU6ZT0+e28ucHVzaChlKSxzfHwocz0hMCxQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57Zm9yKDtvLmxlbmd0aDspby5zaGlmdCgpKCk7cz0hMX0pLmNhdGNoKGU9PnNldFRpbWVvdXQoKCk9Pnt0aHJvdyBlfSkpKX0scmVzZXQ6KCk9PntuLnNldFN0YXRlKG4uaW5pdGlhbFN0YXRlKX0sc2V0T3B0aW9uczplPT57bGV0IHQ9X3goZSxuLm9wdGlvbnMpO24ub3B0aW9ucz1pKHQpfSxnZXRTdGF0ZTooKT0+bi5vcHRpb25zLnN0YXRlLHNldFN0YXRlOmU9PntuLm9wdGlvbnMub25TdGF0ZUNoYW5nZT09bnVsbHx8bi5vcHRpb25zLm9uU3RhdGVDaGFuZ2UoZSl9LF9nZXRSb3dJZDooZSx0LHIpPT4obi5vcHRpb25zLmdldFJvd0lkPT1udWxsP3ZvaWQgMDpuLm9wdGlvbnMuZ2V0Um93SWQoZSx0LHIpKT8/YCR7cj9bci5pZCx0XS5qb2luKGAuYCk6dH1gLGdldENvcmVSb3dNb2RlbDooKT0+KG4uX2dldENvcmVSb3dNb2RlbHx8PW4ub3B0aW9ucy5nZXRDb3JlUm93TW9kZWwobiksbi5fZ2V0Q29yZVJvd01vZGVsKCkpLGdldFJvd01vZGVsOigpPT5uLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpLGdldFJvdzooZSx0KT0+e2xldCByPSh0P24uZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCk6bi5nZXRSb3dNb2RlbCgpKS5yb3dzQnlJZFtlXTtpZighciYmKHI9bi5nZXRDb3JlUm93TW9kZWwoKS5yb3dzQnlJZFtlXSwhcikpdGhyb3cgRXJyb3IoKTtyZXR1cm4gcn0sX2dldERlZmF1bHRDb2x1bW5EZWY6USgoKT0+W24ub3B0aW9ucy5kZWZhdWx0Q29sdW1uXSxlPT4oZT8/PXt9LHtoZWFkZXI6ZT0+e2xldCB0PWUuaGVhZGVyLmNvbHVtbi5jb2x1bW5EZWY7cmV0dXJuIHQuYWNjZXNzb3JLZXk/dC5hY2Nlc3NvcktleTp0LmFjY2Vzc29yRm4/dC5pZDpudWxsfSxjZWxsOmU9Pnt2YXIgdDtyZXR1cm4oKHQ9ZS5yZW5kZXJWYWx1ZSgpKT09bnVsbHx8dC50b1N0cmluZz09bnVsbD92b2lkIDA6dC50b1N0cmluZygpKT8/bnVsbH0sLi4ubi5fZmVhdHVyZXMucmVkdWNlKChlLHQpPT5PYmplY3QuYXNzaWduKGUsdC5nZXREZWZhdWx0Q29sdW1uRGVmPT1udWxsP3ZvaWQgMDp0LmdldERlZmF1bHRDb2x1bW5EZWYoKSkse30pLC4uLmV9KSwkKGUsYGRlYnVnQ29sdW1uc2AsYF9nZXREZWZhdWx0Q29sdW1uRGVmYCkpLF9nZXRDb2x1bW5EZWZzOigpPT5uLm9wdGlvbnMuY29sdW1ucyxnZXRBbGxDb2x1bW5zOlEoKCk9PltuLl9nZXRDb2x1bW5EZWZzKCldLGU9PntsZXQgdD1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIGk9PT12b2lkIDAmJihpPTApLGUubWFwKGU9PntsZXQgYT1DeChuLGUsaSxyKSxvPWU7cmV0dXJuIGEuY29sdW1ucz1vLmNvbHVtbnM/dChvLmNvbHVtbnMsYSxpKzEpOltdLGF9KX07cmV0dXJuIHQoZSl9LCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsQ29sdW1uc2ApKSxnZXRBbGxGbGF0Q29sdW1uczpRKCgpPT5bbi5nZXRBbGxDb2x1bW5zKCldLGU9PmUuZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpLCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsRmxhdENvbHVtbnNgKSksX2dldEFsbEZsYXRDb2x1bW5zQnlJZDpRKCgpPT5bbi5nZXRBbGxGbGF0Q29sdW1ucygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5pZF09dCxlKSx7fSksJChlLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBbGxGbGF0Q29sdW1uc0J5SWRgKSksZ2V0QWxsTGVhZkNvbHVtbnM6USgoKT0+W24uZ2V0QWxsQ29sdW1ucygpLG4uX2dldE9yZGVyQ29sdW1uc0ZuKCldLChlLHQpPT50KGUuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKSwkKGUsYGRlYnVnQ29sdW1uc2AsYGdldEFsbExlYWZDb2x1bW5zYCkpLGdldENvbHVtbjplPT5uLl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQoKVtlXX07T2JqZWN0LmFzc2lnbihuLGMpO2ZvcihsZXQgZT0wO2U8bi5fZmVhdHVyZXMubGVuZ3RoO2UrKyl7bGV0IHQ9bi5fZmVhdHVyZXNbZV07dD09bnVsbHx8dC5jcmVhdGVUYWJsZT09bnVsbHx8dC5jcmVhdGVUYWJsZShuKX1yZXR1cm4gbn1mdW5jdGlvbiBqUygpe3JldHVybiBlPT5RKCgpPT5bZS5vcHRpb25zLmRhdGFdLHQ9PntsZXQgbj17cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0scj1mdW5jdGlvbih0LGksYSl7aT09PXZvaWQgMCYmKGk9MCk7bGV0IG89W107Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2xldCBsPU94KGUsZS5fZ2V0Um93SWQodFtjXSxjLGEpLHRbY10sYyxpLHZvaWQgMCxhPy5pZCk7aWYobi5mbGF0Um93cy5wdXNoKGwpLG4ucm93c0J5SWRbbC5pZF09bCxvLnB1c2gobCksZS5vcHRpb25zLmdldFN1YlJvd3Mpe3ZhciBzO2wub3JpZ2luYWxTdWJSb3dzPWUub3B0aW9ucy5nZXRTdWJSb3dzKHRbY10sYyksKHM9bC5vcmlnaW5hbFN1YlJvd3MpIT1udWxsJiZzLmxlbmd0aCYmKGwuc3ViUm93cz1yKGwub3JpZ2luYWxTdWJSb3dzLGkrMSxsKSl9fXJldHVybiBvfTtyZXR1cm4gbi5yb3dzPXIodCksbn0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTVMoKXtyZXR1cm4gZT0+USgoKT0+W2UuZ2V0U3RhdGUoKS5zb3J0aW5nLGUuZ2V0UHJlU29ydGVkUm93TW9kZWwoKV0sKHQsbik9PntpZighbi5yb3dzLmxlbmd0aHx8ISh0IT1udWxsJiZ0Lmxlbmd0aCkpcmV0dXJuIG47bGV0IHI9ZS5nZXRTdGF0ZSgpLnNvcnRpbmcsaT1bXSxhPXIuZmlsdGVyKHQ9PmUuZ2V0Q29sdW1uKHQuaWQpPy5nZXRDYW5Tb3J0KCkpLG89e307YS5mb3JFYWNoKHQ9PntsZXQgbj1lLmdldENvbHVtbih0LmlkKTtuJiYob1t0LmlkXT17c29ydFVuZGVmaW5lZDpuLmNvbHVtbkRlZi5zb3J0VW5kZWZpbmVkLGludmVydFNvcnRpbmc6bi5jb2x1bW5EZWYuaW52ZXJ0U29ydGluZyxzb3J0aW5nRm46bi5nZXRTb3J0aW5nRm4oKX0pfSk7bGV0IHM9ZT0+e2xldCB0PWUubWFwKGU9Pih7Li4uZX0pKTtyZXR1cm4gdC5zb3J0KChlLHQpPT57Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKz0xKXtsZXQgcj1hW25dLGk9b1tyLmlkXSxzPWkuc29ydFVuZGVmaW5lZCxjPXI/LmRlc2M/PyExLGw9MDtpZihzKXtsZXQgbj1lLmdldFZhbHVlKHIuaWQpLGk9dC5nZXRWYWx1ZShyLmlkKSxhPW49PT12b2lkIDAsbz1pPT09dm9pZCAwO2lmKGF8fG8pe2lmKHM9PT1gZmlyc3RgKXJldHVybiBhPy0xOjE7aWYocz09PWBsYXN0YClyZXR1cm4gYT8xOi0xO2w9YSYmbz8wOmE/czotc319aWYobD09PTAmJihsPWkuc29ydGluZ0ZuKGUsdCxyLmlkKSksbCE9PTApcmV0dXJuIGMmJihsKj0tMSksaS5pbnZlcnRTb3J0aW5nJiYobCo9LTEpLGx9cmV0dXJuIGUuaW5kZXgtdC5pbmRleH0pLHQuZm9yRWFjaChlPT57dmFyIHQ7aS5wdXNoKGUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZS5zdWJSb3dzPXMoZS5zdWJSb3dzKSl9KSx0fTtyZXR1cm57cm93czpzKG4ucm93cyksZmxhdFJvd3M6aSxyb3dzQnlJZDpuLnJvd3NCeUlkfX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTb3J0ZWRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTlMoKXtyZXR1cm4hMH12YXIgUFM9U3ltYm9sKGBtZXJnZS1wcm94eWApLEZTPXtnZXQoZSx0LG4pe3JldHVybiB0PT09UFM/bjplLmdldCh0KX0saGFzKGUsdCl7cmV0dXJuIGUuaGFzKHQpfSxzZXQ6TlMsZGVsZXRlUHJvcGVydHk6TlMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJue2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiBlLmdldCh0KX0sc2V0Ok5TLGRlbGV0ZVByb3BlcnR5Ok5TfX0sb3duS2V5cyhlKXtyZXR1cm4gZS5rZXlzKCl9fTtmdW5jdGlvbiBJUyhlKXtyZXR1cm5gdmFsdWVgaW4gZT9lLnZhbHVlOmV9ZnVuY3Rpb24gTFMoKXt2YXIgZT1bLi4uYXJndW1lbnRzXTtyZXR1cm4gbmV3IFByb3h5KHtnZXQodCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCByPUlTKGVbbl0pW3RdO2lmKHIhPT12b2lkIDApcmV0dXJuIHJ9fSxoYXModCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0paWYodCBpbiBJUyhlW25dKSlyZXR1cm4hMDtyZXR1cm4hMX0sa2V5cygpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCguLi5PYmplY3Qua2V5cyhJUyhlW25dKSkpO3JldHVyblsuLi5BcnJheS5mcm9tKG5ldyBTZXQodCkpXX19LEZTKX12YXIgUlM9Rih7cHJvcHM6W2ByZW5kZXJgLGBwcm9wc2BdLHNldHVwOmU9PigpPT50eXBlb2YgZS5yZW5kZXI9PWBmdW5jdGlvbmB8fHR5cGVvZiBlLnJlbmRlcj09YG9iamVjdGA/RyhlLnJlbmRlcixlLnByb3BzKTplLnJlbmRlcn0pO2Z1bmN0aW9uIHpTKGUpe3JldHVybiBMUyhlLHtkYXRhOk4oZS5kYXRhKX0pfWZ1bmN0aW9uIEJTKGUpe2xldCB0PWooZS5kYXRhKSxuPUFTKExTKHtzdGF0ZTp7fSxvblN0YXRlQ2hhbmdlOigpPT57fSxyZW5kZXJGYWxsYmFja1ZhbHVlOm51bGwsbWVyZ2VPcHRpb25zKGUsbil7cmV0dXJuIHQ/ey4uLmUsLi4ubn06TFMoZSxuKX19LHQ/elMoZSk6ZSkpO2lmKHQpe2xldCB0PXVuKGUuZGF0YSk7RXIodCwoKT0+e24uc2V0U3RhdGUoZT0+KHsuLi5lLGRhdGE6dC52YWx1ZX0pKX0se2ltbWVkaWF0ZTohMH0pfWxldCByPU0obi5pbml0aWFsU3RhdGUpO3JldHVybiBDcigoKT0+e24uc2V0T3B0aW9ucyhuPT57bGV0IGk9bmV3IFByb3h5KHt9LHtnZXQ6KGUsdCk9PnIudmFsdWVbdF19KTtyZXR1cm4gTFMobix0P3pTKGUpOmUse3N0YXRlOkxTKGksZS5zdGF0ZT8/e30pLG9uU3RhdGVDaGFuZ2U6dD0+e3QgaW5zdGFuY2VvZiBGdW5jdGlvbj9yLnZhbHVlPXQoci52YWx1ZSk6ci52YWx1ZT10LGUub25TdGF0ZUNoYW5nZT09bnVsbHx8ZS5vblN0YXRlQ2hhbmdlKHQpfX0pfSl9KSxufXZhciBWUz1bYGFyaWEtbGFiZWxgXSxIUz1GKHtfX25hbWU6YFNvcnRIZWFkZXJCdXR0b25gLHByb3BzOntoZWFkZXI6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT50LmhlYWRlci5jb2x1bW4uZ2V0SXNTb3J0ZWQoKSkscj1XKCgpPT5uLnZhbHVlPT09YGFzY2A/YV86bi52YWx1ZT09PWBkZXNjYD92XzpkXyksaT1XKCgpPT57bGV0IGU9dC5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXI7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9lOnQuaGVhZGVyLmNvbHVtbi5pZH0pLGE9VygoKT0+e2xldCBlPW4udmFsdWU9PT1gYXNjYD9gYXNjZW5kaW5nYDpuLnZhbHVlPT09YGRlc2NgP2BkZXNjZW5kaW5nYDpgbm9uZWA7cmV0dXJuYFNvcnQgYnkgJHtpLnZhbHVlfSwgY3VycmVudGx5ICR7ZX1gfSk7ZnVuY3Rpb24gbygpe3QuaGVhZGVyLmNvbHVtbi50b2dnbGVTb3J0aW5nKG4udmFsdWU9PT1gYXNjYCl9cmV0dXJuKHQsaSk9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBidXR0b25gLHt0eXBlOmBidXR0b25gLCJhcmlhLWxhYmVsIjphLnZhbHVlLGNsYXNzOmBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBweC0xLjUgcHktMC41IGhvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZ2Asb25DbGljazpvfSxbZS5oZWFkZXIuaXNQbGFjZWhvbGRlcj9UcyhgYCwhMCk6KFIoKSxCKE4oUlMpLHtrZXk6MCxyZW5kZXI6ZS5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5oZWFkZXIuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKSksSChzLHtpY29uOnIudmFsdWUsY2xhc3M6TyhbYHNpemUtMyBzaHJpbmstMGAsbi52YWx1ZT9gdGV4dC1mb3JlZ3JvdW5kYDpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzYwYF0pLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSldLDgsVlMpfX19KSxVUz17ImRhdGEtc2xvdCI6YHRhYmxlLWNvbnRhaW5lcmAsY2xhc3M6YHJlbGF0aXZlIHctZnVsbCBvdmVyZmxvdy14LWF1dG9gfSxXUz1GKHtfX25hbWU6YFRhYmxlYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCxVUyxbVihgdGFibGVgLHsiZGF0YS1zbG90IjpgdGFibGVgLGNsYXNzOk8oTihZdikoYHctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpXSkpfX0pLEdTPUYoe19fbmFtZTpgVGFibGVCb2R5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGJvZHlgLHsiZGF0YS1zbG90IjpgdGFibGUtYm9keWAsY2xhc3M6TyhOKFl2KShgWyZfdHI6bGFzdC1jaGlsZF06Ym9yZGVyLTBgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLEtTPUYoe19fbmFtZTpgVGFibGVDZWxsYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGRgLHsiZGF0YS1zbG90IjpgdGFibGUtY2VsbGAsY2xhc3M6TyhOKFl2KShgcC0yIGFsaWduLW1pZGRsZSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSkscVM9Rih7X19uYW1lOmBUYWJsZVJvd2AscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRyYCx7ImRhdGEtc2xvdCI6YHRhYmxlLXJvd2AsY2xhc3M6TyhOKFl2KShgaG92ZXI6YmctbXV0ZWQvNTAgZGF0YS1bc3RhdGU9c2VsZWN0ZWRdOmJnLW11dGVkIGJvcmRlci1iIHRyYW5zaXRpb24tY29sb3JzIGhhcy1hcmlhLWV4cGFuZGVkOmJnLW11dGVkLzUwYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxKUz17Y2xhc3M6YGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEwYH0sWVM9Rih7X19uYW1lOmBUYWJsZUVtcHR5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sY29sc3Bhbjp7ZGVmYXVsdDoxfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihxUyxudWxsLHtkZWZhdWx0OlAoKCk9PltIKEtTLGtzKHtjbGFzczpOKFl2KShgcC00IHdoaXRlc3BhY2Utbm93cmFwIGFsaWduLW1pZGRsZSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZGAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLEpTLFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldKV0pLF86M30sMTYsW2BjbGFzc2BdKV0pLF86M30pKX19KSxYUz1GKHtfX25hbWU6YFRhYmxlSGVhZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRgLGNsYXNzOk8oTihZdikoYHRleHQtZm9yZWdyb3VuZCBoLTEwIHB4LTIgdGV4dC1sZWZ0IGFsaWduLW1pZGRsZSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWlM9Rih7X19uYW1lOmBUYWJsZUhlYWRlcmAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoZWFkYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRlcmAsY2xhc3M6TyhOKFl2KShgWyZfdHJdOmJvcmRlci1iYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KTtmdW5jdGlvbiBRUyhlLHQpe3QudmFsdWU9dHlwZW9mIGU9PWBmdW5jdGlvbmA/ZSh0LnZhbHVlKTplfXZhciAkUz1GKHtfX25hbWU6YERhdGFUYWJsZWAscHJvcHM6e2NvbHVtbnM6e30sZGF0YTp7fSxyb3dDbGFzczp7dHlwZTpGdW5jdGlvbn0sZW1wdHlNZXNzYWdlOnt9fSxzZXR1cChlKXtsZXQgdD1lLG49TShbXSkscj1CUyh7Z2V0IGRhdGEoKXtyZXR1cm4gdC5kYXRhfSxnZXQgY29sdW1ucygpe3JldHVybiB0LmNvbHVtbnN9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsbiksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIG4udmFsdWV9fX0pO2Z1bmN0aW9uIGkoZSl7aWYoZT09PWBhc2NgKXJldHVybmBhc2NlbmRpbmdgO2lmKGU9PT1gZGVzY2ApcmV0dXJuYGRlc2NlbmRpbmdgfXJldHVybih0LG4pPT4oUigpLEIoTihXUyksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpTKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEoTihyKS5nZXRIZWFkZXJHcm91cHMoKSxlPT4oUigpLEIoTihxUykse2tleTplLmlkfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKGUuaGVhZGVycyxlPT4oUigpLEIoTihYUykse2tleTplLmlkLGNsYXNzOk8oZS5jb2x1bW4uY29sdW1uRGVmLm1ldGE/LmFsaWduPT09YHJpZ2h0YD9gdGV4dC1yaWdodGA6dm9pZCAwKSwiYXJpYS1zb3J0IjplLmNvbHVtbi5nZXRDYW5Tb3J0KCk/aShlLmNvbHVtbi5nZXRJc1NvcnRlZCgpKT8/YG5vbmVgOnZvaWQgMH0se2RlZmF1bHQ6UCgoKT0+W2UuY29sdW1uLmdldENhblNvcnQoKT8oUigpLEIoSFMse2tleTowLGhlYWRlcjplLGNsYXNzOmAtbXgtMS41YH0sbnVsbCw4LFtgaGVhZGVyYF0pKTplLmlzUGxhY2Vob2xkZXI/VHMoYGAsITApOihSKCksQihOKFJTKSx7a2V5OjEscmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5nZXRDb250ZXh0KCl9LG51bGwsOCxbYHJlbmRlcmAsYHByb3BzYF0pKV0pLF86Mn0sMTAzMixbYGNsYXNzYCxgYXJpYS1zb3J0YF0pKSksMTI4KSldKSxfOjJ9LDEwMjQpKSksMTI4KSldKSxfOjF9KSxIKE4oR1MpLG51bGwse2RlZmF1bHQ6UCgoKT0+W04ocikuZ2V0Um93TW9kZWwoKS5yb3dzLmxlbmd0aD09PTA/KFIoKSxCKE4oWVMpLHtrZXk6MCxjb2xzcGFuOmUuY29sdW1ucy5sZW5ndGgsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS5lbXB0eU1lc3NhZ2U/P2Bub25lYCksMSldKSxfOjF9LDgsW2Bjb2xzcGFuYF0pKTpUcyhgYCwhMCksKFIoITApLHooTCxudWxsLG1hKE4ocikuZ2V0Um93TW9kZWwoKS5yb3dzLHQ9PihSKCksQihOKHFTKSx7a2V5OnQuaWQsY2xhc3M6TyhlLnJvd0NsYXNzPy4odC5vcmlnaW5hbCkpfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHQuZ2V0VmlzaWJsZUNlbGxzKCksZT0+KFIoKSxCKE4oS1MpLHtrZXk6ZS5pZCxjbGFzczpPKGUuY29sdW1uLmNvbHVtbkRlZi5tZXRhPy5hbGlnbj09PWByaWdodGA/YHRleHQtcmlnaHQgdGFidWxhci1udW1zYDp2b2lkIDApfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJTKSx7cmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5jZWxsLHByb3BzOmUuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKV0pLF86Mn0sMTAzMixbYGNsYXNzYF0pKSksMTI4KSldKSxfOjJ9LDEwMzIsW2BjbGFzc2BdKSkpLDEyOCkpXSksXzoxfSldKSxfOjF9KSl9fSksZUM9Rih7X19uYW1lOmBCYWRnZWAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sdmFyaWFudDp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKHIsaSk9PihSKCksQihOKG5iKSxrcyh7ImRhdGEtc2xvdCI6YGJhZGdlYCwiZGF0YS12YXJpYW50IjplLnZhcmlhbnQsY2xhc3M6TihZdikoTih0Qykoe3ZhcmlhbnQ6ZS52YXJpYW50fSksdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLHRDPUNfKGBoLTUgZ2FwLTEgcm91bmRlZC00eGwgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTAuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJj5zdmddOnNpemUtMyEgZ3JvdXAvYmFkZ2UgaW5saW5lLWZsZXggdy1maXQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG92ZXJmbG93LWhpZGRlbiB3aGl0ZXNwYWNlLW5vd3JhcCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0zIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmVgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6YmctcHJpbWFyeS84MGAsc2Vjb25kYXJ5OmBiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6Ymctc2Vjb25kYXJ5LzgwYCxkZXN0cnVjdGl2ZTpgYmctZGVzdHJ1Y3RpdmUvMTAgW2FdOmhvdmVyOmJnLWRlc3RydWN0aXZlLzIwIGZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS80MCB0ZXh0LWRlc3RydWN0aXZlIGRhcms6YmctZGVzdHJ1Y3RpdmUvMjBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgdGV4dC1mb3JlZ3JvdW5kIFthXTpob3ZlcjpiZy1tdXRlZCBbYV06aG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCxnaG9zdDpgaG92ZXI6YmctbXV0ZWQgaG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctbXV0ZWQvNTBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7YXN5bmMgZnVuY3Rpb24gbkMoZSx0KXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpdHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlKSxgY29waWVkYH1jYXRjaHt9aWYoIXQpcmV0dXJuYGZhaWxlZGA7bGV0IG49ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtuLnNlbGVjdE5vZGVDb250ZW50cyh0KTtsZXQgcj13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHI/KHIucmVtb3ZlQWxsUmFuZ2VzKCksci5hZGRSYW5nZShuKSxgc2VsZWN0ZWRgKTpgZmFpbGVkYH12YXIgckM9YDAwMDEtMDEtMDFUMDA6MDA6MDBaYDtmdW5jdGlvbiBpQyhlLHQpe3JldHVybmAke2V9LyR7dH1gfWZ1bmN0aW9uIGFDKGUpe3JldHVybmAkJHsoZS8xZTYpLnRvRml4ZWQoNCl9YH1mdW5jdGlvbiBvQyhlKXtyZXR1cm4gZS50b0xvY2FsZVN0cmluZyhgZW4tVVNgKX1mdW5jdGlvbiBzQyhlKXtsZXQgdD1NYXRoLmFicyhlKTtpZih0PDFlNClyZXR1cm4gb0MoZSk7bGV0IG49ZTwwP2AtYDpgYCxbcixpXT10PDFlNj9bMWUzLGBrYF06dDwxZTk/WzFlNixgTWBdOlsxZTksYEJgXSxhPXQvcixvPTMtKE1hdGguZmxvb3IoYSk+PTEwMD8zOk1hdGguZmxvb3IoYSk+PTEwPzI6MSkscz0xMCoqbyxjPShNYXRoLmZsb29yKHQqcy9yKS9zKS50b0ZpeGVkKG8pO3JldHVybiBvPjAmJihjPWMucmVwbGFjZSgvMCskLyxgYCkucmVwbGFjZSgvXC4kLyxgYCkpLGAke259JHtjfSR7aX1gfWZ1bmN0aW9uIGNDKGUpe3JldHVybiBlPjAmJiEoZSZlLTEpfWZ1bmN0aW9uIGxDKGUpe3JldHVybiBlPDEwMjQ/YCR7ZX1gOmNDKGUpP2U8MTA0ODU3Nj9gJHtNYXRoLnJvdW5kKGUvMTAyNCl9a2A6YCR7TWF0aC5yb3VuZChlLzEwNDg1NzYpfU1gOmU8MWU2P2Ake01hdGgucm91bmQoZS8xZTMpfWtgOmAke01hdGgucm91bmQoZS8xZTYpfU1gfWZ1bmN0aW9uIHVDKGUpe3JldHVybmAkJHtlLnRvRml4ZWQoMil9YH1mdW5jdGlvbiBkQyhlLHQpe3JldHVybiBlPT09MCYmdD09PTA/YGZyZWVgOmBpbiAke3VDKGUpfSAvIG91dCAke3VDKHQpfSBwZXIgTVRva2B9ZnVuY3Rpb24gZkMoZSl7cmV0dXJuIGU8MWUzP2Ake01hdGgucm91bmQoZSl9bXNgOmAkeyhlLzFlMykudG9GaXhlZCgxKX1zYH1mdW5jdGlvbiBwQyhlLHQpe2lmKCFlfHxlPT09ckMpcmV0dXJuIG51bGw7bGV0IG49bmV3IERhdGUoZSkuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4obik/bnVsbDpNYXRoLm1heCgwLE1hdGgucm91bmQoKHQtbikvMWUzKSl9ZnVuY3Rpb24gbUMoZSl7bGV0IHQ9cEMoZSxEYXRlLm5vdygpKTtyZXR1cm4gdD09PW51bGw/YGA6YCAoJHt0fXMgYWdvKWB9ZnVuY3Rpb24gaEMoZSx0PURhdGUubm93KCkpe2xldCBuPXBDKGUsdCk7cmV0dXJuIG49PT1udWxsP2BgOmAke259cyBhZ29gfWZ1bmN0aW9uIGdDKGUpe2lmKCFlfHxlPT09ckMpcmV0dXJuYGA7bGV0IHQ9bmV3IERhdGUoZSkuZ2V0VGltZSgpO2lmKE51bWJlci5pc05hTih0KSlyZXR1cm5gYDtsZXQgbj1NYXRoLnJvdW5kKCh0LURhdGUubm93KCkpLzFlMyk7cmV0dXJuIG48PTA/YGA6YGluICR7bn1zYH1mdW5jdGlvbiBfQyhlKXtpZighZXx8ZT09PXJDKXJldHVybmBuZXZlcmA7bGV0IHQ9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTih0LmdldFRpbWUoKSk/ZTp0LnRvTG9jYWxlU3RyaW5nKCl9ZnVuY3Rpb24gdkMoZSx0KXtyZXR1cm4gZT9tQyh0KT9gcmVmcmVzaGVkYDpgcGVuZGluZ2A6YG9mZmB9ZnVuY3Rpb24geUMoZSx0KXtzd2l0Y2godkMoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuYHJlZnJlc2hlZCR7bUModCl9YH19ZnVuY3Rpb24gYkMoZSx0KXtzd2l0Y2godkMoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuIF9DKHQpfX1mdW5jdGlvbiB4QyhlKXtpZighZSlyZXR1cm5gbm9uZWA7bGV0IHQ9W107cmV0dXJuIGUucmVxdWVzdHNQZXJNaW51dGUmJnQucHVzaChgcmVxL21pbiAke2UucmVxdWVzdHNQZXJNaW51dGV9YCksZS5yZXF1ZXN0c1BlckRheSYmdC5wdXNoKGByZXEvZGF5ICR7ZS5yZXF1ZXN0c1BlckRheX1gKSxlLnRva2Vuc1BlckRheSYmdC5wdXNoKGB0b2svZGF5ICR7ZS50b2tlbnNQZXJEYXl9YCksZS50b2tlbnNQZXJNb250aCYmdC5wdXNoKGB0b2svbW9udGggJHtlLnRva2Vuc1Blck1vbnRofWApLGUuY29zdFBlckRheVVTRCYmdC5wdXNoKGBjb3N0L2RheSAkJHtlLmNvc3RQZXJEYXlVU0R9YCksZS5jb3N0UGVyTW9udGhVU0QmJnQucHVzaChgY29zdC9tb250aCAkJHtlLmNvc3RQZXJNb250aFVTRH1gKSx0Lmxlbmd0aD90LmpvaW4oYCwgYCk6YG5vbmVgfWZ1bmN0aW9uIFNDKGUsdCl7c3dpdGNoKHQpe2Nhc2VgaG91cmA6cmV0dXJuYCR7ZS5zbGljZSg4LDEwKX06MDBgO2Nhc2VgZGF5YDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKSxyPU51bWJlcihlLnNsaWNlKDYsOCkpO3JldHVybiBuZXcgRGF0ZSh0LG4tMSxyKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDpgc2hvcnRgLGRheTpgbnVtZXJpY2B9KX1jYXNlYG1vbnRoYDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKTtyZXR1cm4gbmV3IERhdGUodCxuLTEsMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6YHNob3J0YCx5ZWFyOmBudW1lcmljYH0pfX19dmFyIENDPUYoe19fbmFtZTpgTW9kZWxDaGlwYCxwcm9wczp7aWQ6e30sY29udGV4dFRva2Vuczp7fSxpbnB1dFBlck1Ub2tVc2Q6e30sb3V0cHV0UGVyTVRva1VzZDp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXNpKGBsYWJlbGApLHI9TShgaWRsZWApLGk7ZnVuY3Rpb24gYSgpe2NsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKCk9PntyLnZhbHVlPWBpZGxlYH0sMTUwMCl9YXN5bmMgZnVuY3Rpb24gbygpe2xldCBlPWF3YWl0IG5DKHQuaWQsbi52YWx1ZT8/dm9pZCAwKTtyLnZhbHVlPWUsYSgpfWxldCBzPXtpZGxlOmdfLGNvcGllZDp1XyxzZWxlY3RlZDp1XyxmYWlsZWQ6aF99LGM9VygoKT0+KHtpZGxlOmBDb3B5ICR7dC5pZH1gLGNvcGllZDpgQ29waWVkYCxzZWxlY3RlZDpgU2VsZWN0ZWQg4oCUIHByZXNzIEN0cmwvQ21kK0NgLGZhaWxlZDpgQ29weSBmYWlsZWRgfSkpLGw9VygoKT0+e2xldCBlPVtdO3JldHVybiB0LmlucHV0UGVyTVRva1VzZCE9PXZvaWQgMCYmdC5vdXRwdXRQZXJNVG9rVXNkIT09dm9pZCAwJiZlLnB1c2goZEModC5pbnB1dFBlck1Ub2tVc2QsdC5vdXRwdXRQZXJNVG9rVXNkKSksdC5jb250ZXh0VG9rZW5zIT09dm9pZCAwJiZlLnB1c2goYCR7bEModC5jb250ZXh0VG9rZW5zKX0gY29udGV4dGApLGUuam9pbihgIMK3IGApfSksdT1XKCgpPT57bGV0IGU9Yy52YWx1ZVtyLnZhbHVlXTtyZXR1cm4gbC52YWx1ZT9gJHtlfSDCtyAke2wudmFsdWV9YDplfSk7cmV0dXJuIHRhKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSksKHQsbik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oZUMpLHthczpgYnV0dG9uYCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6TyhbYGN1cnNvci1wb2ludGVyIGdhcC0xIGZvbnQtbW9ubyB0ZXh0LXhzIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kYCxyLnZhbHVlPT09YGZhaWxlZGA/YHRleHQtZGVzdHJ1Y3RpdmVgOmBgXSksdGl0bGU6dS52YWx1ZSwiYXJpYS1sYWJlbCI6dS52YWx1ZSxvbkNsaWNrOm99LHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCx7cmVmOmBsYWJlbGAsY2xhc3M6YHNlbGVjdC10ZXh0YH0sayhlLmlkKSw1MTMpLEgoaSx7aWNvbjpzW3IudmFsdWVdLGNsYXNzOmBzaXplLTIuNSBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9LDgsW2BjbGFzc2AsYHRpdGxlYCxgYXJpYS1sYWJlbGBdKX19fSk7ZnVuY3Rpb24gd0MoZSx0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKGUpfHxlPD0wP251bGw6KGUtKE51bWJlci5pc0Zpbml0ZSh0KT90OjApKS9lfWZ1bmN0aW9uIFRDKGUpe3JldHVybiBlPT09bnVsbD9gbm8tdHJhZmZpY2A6ZTwuOT9gc2V2ZXJlYDplPC45OT9gZGVncmFkZWRgOmBoZWFsdGh5YH1mdW5jdGlvbiBFQyhlLHQpe2xldCBuPXdDKGUsdCk7cmV0dXJuIG4hPT1udWxsJiZuPC45OX1mdW5jdGlvbiBEQyhlKXtyZXR1cm4gZT49MT9gMTAwJWA6YCR7TWF0aC5mbG9vcihlKjEwMCl9JWB9ZnVuY3Rpb24gT0MoZSx0LG4pe3JldHVybiBlPT09MT90Om59ZnVuY3Rpb24ga0MoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIGluIHRoZSBsYXN0IG1pbnV0ZWA7bGV0IG49d0MoZSx0KSxyPW49PT1udWxsP2BgOmAgKCR7REMobil9KWA7cmV0dXJuYCR7ZX0gJHtPQyhlLGBhdHRlbXB0YCxgYXR0ZW1wdHNgKX0sICR7dH0gJHtPQyh0LGBmYWlsdXJlYCxgZmFpbHVyZXNgKX0gaW4gdGhlIGxhc3QgbWludXRlJHtyfWB9ZnVuY3Rpb24gQUMoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIHRvZGF5YDtsZXQgbj13QyhlLHQpLHI9bj09PW51bGw/YGA6YCAoJHtEQyhuKX0pYDtyZXR1cm5gJHtlfSAke09DKGUsYGF0dGVtcHRgLGBhdHRlbXB0c2ApfSwgJHt0fSAke09DKHQsYGZhaWx1cmVgLGBmYWlsdXJlc2ApfSB0b2RheSR7cn1gfXZhciBqQz17ImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LE1DPXtjbGFzczpgc3Itb25seWB9LE5DPUYoe19fbmFtZTpgUHJvdmlkZXJSYXRlQmFkZ2VgLHByb3BzOnthdHRlbXB0c0RheTp7fSxmYWlsdXJlc0RheTp7fSxhdHRlbXB0c01pbnV0ZTp7fSxmYWlsdXJlc01pbnV0ZTp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVcoKCk9PndDKHQuYXR0ZW1wdHNEYXksdC5mYWlsdXJlc0RheSkpLHI9VygoKT0+VEMobi52YWx1ZSkpLGk9VygoKT0+ci52YWx1ZT09PWBuby10cmFmZmljYD9gbm8gdHJhZmZpY2A6REMobi52YWx1ZSkpLGE9VygoKT0+dC5hdHRlbXB0c01pbnV0ZT09PXZvaWQgMHx8dC5mYWlsdXJlc01pbnV0ZT09PXZvaWQgMD9BQyh0LmF0dGVtcHRzRGF5LHQuZmFpbHVyZXNEYXkpOmtDKHQuYXR0ZW1wdHNNaW51dGUsdC5mYWlsdXJlc01pbnV0ZSkpLG89VygoKT0+ci52YWx1ZT09PWBzZXZlcmVgP2BkZXN0cnVjdGl2ZWA6ci52YWx1ZT09PWBoZWFsdGh5YD9gc2Vjb25kYXJ5YDpgb3V0bGluZWApLHM9VygoKT0+ci52YWx1ZT09PWBkZWdyYWRlZGA/YGJvcmRlci1zdGF0dXMtd2Fybi80MCB0ZXh0LXN0YXR1cy13YXJuYDpyLnZhbHVlPT09YG5vLXRyYWZmaWNgP2B0ZXh0LW11dGVkLWZvcmVncm91bmRgOmBgKTtyZXR1cm4oZSx0KT0+KFIoKSxCKE4oZUMpLHthczpgc3BhbmAsdmFyaWFudDpvLnZhbHVlLGNsYXNzOk8oW3MudmFsdWUsYGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2BdKSx0aXRsZTphLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bVihgc3BhbmAsakMsayhpLnZhbHVlKSwxKSxWKGBzcGFuYCxNQyxrKGEudmFsdWUpLDEpXSksXzoxfSw4LFtgdmFyaWFudGAsYGNsYXNzYCxgdGl0bGVgXSkpfX0pLFBDPUYoe19fbmFtZTpgU2VhcmNoSW5wdXRgLHByb3BzOnttb2RlbFZhbHVlOnt9LHBsYWNlaG9sZGVyOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1XKCgpPT5uLm1vZGVsVmFsdWUubGVuZ3RoPjApO2Z1bmN0aW9uIGEoZSl7cihgdXBkYXRlOm1vZGVsVmFsdWVgLFN0cmluZyhlKSl9ZnVuY3Rpb24gbygpe3IoYHVwZGF0ZTptb2RlbFZhbHVlYCxgYCl9cmV0dXJuKHQscik9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLHtjbGFzczpPKE4oWXYpKGByZWxhdGl2ZWAsbi5jbGFzcykpfSxbSChzLHtpY29uOk4ocl8pLGNsYXNzOmBwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0xLzIgbGVmdC0yLjUgc2l6ZS0zLjUgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LW11dGVkLWZvcmVncm91bmRgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLEgoTihRYikseyJtb2RlbC12YWx1ZSI6ZS5tb2RlbFZhbHVlLHR5cGU6YHRleHRgLHBsYWNlaG9sZGVyOmUucGxhY2Vob2xkZXIsImFyaWEtbGFiZWwiOmUucGxhY2Vob2xkZXIsY2xhc3M6YHByLTggcGwtOGAsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmF9LG51bGwsOCxbYG1vZGVsLXZhbHVlYCxgcGxhY2Vob2xkZXJgLGBhcmlhLWxhYmVsYF0pLGkudmFsdWU/KFIoKSxCKE4oV2IpLHtrZXk6MCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YGdob3N0YCxzaXplOmBpY29uLXhzYCwiYXJpYS1sYWJlbCI6YENsZWFyIHNlYXJjaGAsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMSAtdHJhbnNsYXRlLXktMS8yIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRgLG9uQ2xpY2s6b30se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKGZfKSxjbGFzczpgc2l6ZS0zLjVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSkpOlRzKGBgLCEwKV0sMil9fX0pLEZDPUYoe19fbmFtZTpgQWNjb3JkaW9uYCxwcm9wczp7Y29sbGFwc2libGU6e3R5cGU6Qm9vbGVhbn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sZGlyOnt9LG9yaWVudGF0aW9uOnt9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSx0eXBlOnt9LG1vZGVsVmFsdWU6e30sZGVmYXVsdFZhbHVlOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihoYiksa3MoeyJkYXRhLXNsb3QiOmBhY2NvcmRpb25gfSxOKGkpLHtjbGFzczpOKFl2KShgZmxleCB3LWZ1bGwgZmxleC1jb2xgLG4uY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksSUM9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oYmIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWNvbnRlbnRgfSxOKG4pLHtjbGFzczpgZGF0YS1vcGVuOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24gZGF0YS1jbG9zZWQ6YW5pbWF0ZS1hY2NvcmRpb24tdXAgdGV4dC1zbSBvdmVyZmxvdy1oaWRkZW5gfSkse2RlZmF1bHQ6UCgoKT0+W1YoYGRpdmAse2NsYXNzOk8oTihZdikoYHB0LTAgcGItMi41IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kIFsmX3A6bm90KDpsYXN0LWNoaWxkKV06bWItNGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKV0pLF86M30sMTYpKX19KSxMQz1GKHtfX25hbWU6YEFjY29yZGlvbkl0ZW1gLHByb3BzOntkaXNhYmxlZDp7dHlwZTpCb29sZWFufSx2YWx1ZTp7fSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1LeShDeSh0LGBjbGFzc2ApKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oeWIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWl0ZW1gfSxOKG4pLHtjbGFzczpOKFl2KShgbm90LWxhc3Q6Ym9yZGVyLWJgLHQuY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksUkM9Rih7X19uYW1lOmBBY2NvcmRpb25UcmlnZ2VyYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oeGIpLHtjbGFzczpgZmxleGB9LHtkZWZhdWx0OlAoKCk9PltIKE4oU2IpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLXRyaWdnZXJgfSxOKG4pLHtjbGFzczpOKFl2KShgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOmFmdGVyOmJvcmRlci1yaW5nICoqOmRhdGEtW3Nsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbGcgcHktMi41IHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnVuZGVybGluZSBmb2N1cy12aXNpYmxlOnJpbmctMyAqKjpkYXRhLVtzbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25dOm1sLWF1dG8gKio6ZGF0YS1bc2xvdD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXTpzaXplLTQgZ3JvdXAvYWNjb3JkaW9uLXRyaWdnZXIgcmVsYXRpdmUgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1hbGwgb3V0bGluZS1ub25lIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApLEkoZS4kc2xvdHMsYGljb25gLHt9LCgpPT5bSChpLHtpY29uOk4obV8pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaHJpbmstMCBncm91cC1hcmlhLWV4cGFuZGVkL2FjY29yZGlvbi10cmlnZ2VyOmhpZGRlbmB9LG51bGwsOCxbYGljb25gXSksSChpLHtpY29uOk4oc18pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBoaWRkZW4gc2hyaW5rLTAgZ3JvdXAtYXJpYS1leHBhbmRlZC9hY2NvcmRpb24tdHJpZ2dlcjppbmxpbmVgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSldKSxfOjN9KX19fSk7ZnVuY3Rpb24gekMoKXtsZXQgZT1NKGBgKSx0PVcoKCk9PmUudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpO3JldHVybntxdWVyeTplLG5vcm1hbGl6ZWQ6dCxoYXNRdWVyeTpXKCgpPT50LnZhbHVlLmxlbmd0aD4wKX19ZnVuY3Rpb24gQkMoZSx0LG4pe2lmKCF0KXJldHVybiBuZXcgU2V0KGUubWFudWFsbHlFeHBhbmRlZCk7bGV0IHI9bmV3IFNldChlLm1hbnVhbGx5RXhwYW5kZWQpO2ZvcihsZXQgdCBvZiBuKWUubWFudWFsbHlDb2xsYXBzZWQuaGFzKHQpfHxyLmFkZCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBWQyhlLHQsbil7bj8oZS5tYW51YWxseUV4cGFuZGVkLmRlbGV0ZSh0KSxlLm1hbnVhbGx5Q29sbGFwc2VkLmFkZCh0KSk6KGUubWFudWFsbHlDb2xsYXBzZWQuZGVsZXRlKHQpLGUubWFudWFsbHlFeHBhbmRlZC5hZGQodCkpfWZ1bmN0aW9uIEhDKGUpe2UubWFudWFsbHlDb2xsYXBzZWQuY2xlYXIoKX12YXIgVUM9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sV0M9e2NsYXNzOmBncmlkIGdhcC00IHNtOmdyaWQtY29scy0zYH0sR0M9e2NsYXNzOmBmb250LW1lZGl1bWB9LEtDPXtrZXk6MCxjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41IHRleHQtZGVzdHJ1Y3RpdmVgfSxxQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sSkM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxZQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sWEM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxaQz17a2V5OjAsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxRQz17a2V5OjEsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSwkQz17Y2xhc3M6YGZsZXggZmxleC0xIGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLXgtMyBnYXAteS0xIHByLTIgdGV4dC1sZWZ0YH0sZXc9e2NsYXNzOmBmb250LW1lZGl1bWB9LHR3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sbnc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHJ3PXtjbGFzczpgbWItMyBncmlkIGdyaWQtY29scy0yIGdhcC14LTYgZ2FwLXktMS41IHRleHQtc20gc206Z3JpZC1jb2xzLTNgfSxpdz17Y2xhc3M6YGJyZWFrLWFsbGB9LGF3PXtrZXk6MH0sb3c9e2tleToxfSxzdz17Y2xhc3M6YHRleHQtZGVzdHJ1Y3RpdmVgfSxjdz17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxsdz17a2V5OjAsdGl0bGU6YGNvbnRleHQgd2luZG93YCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sdXc9e2tleToxLGNsYXNzOmB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGR3PXtrZXk6MCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxmdz1gUGVyLXJlcGxpY2EsIGluLXByb2Nlc3Mgb25seSDigJQgbm90IGEgZmxlZXQtd2lkZSBhdmVyYWdlIGFjcm9zcyB0aGlzIGRlcGxveW1lbnTigJlzIHJlcGxpY2FzLmAscHc9Rih7X19uYW1lOmBQcm92aWRlcnNWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC5vdmVydmlldykscj1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSx7cXVlcnk6aSxub3JtYWxpemVkOmEsaGFzUXVlcnk6b309ekMoKTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGlDKGUsdCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhhLnZhbHVlKX1mdW5jdGlvbiBjKGUpe3JldHVybiBlLm1vZGVscy5zb21lKHQ9PnMoZS5uYW1lLHQpKX1mdW5jdGlvbiBsKGUpe3JldHVybiBlLmFsaWFzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl8fGUudGFyZ2V0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl9bGV0IHU9VygoKT0+e2xldCBlPW4udmFsdWU/LnByb3ZpZGVycz8/W107cmV0dXJuIG8udmFsdWU/ZS5maWx0ZXIoYyk6ZX0pLGQ9VygoKT0+e2xldCBlPW4udmFsdWU/LmFsaWFzZXM/P1tdO3JldHVybiBvLnZhbHVlP2UuZmlsdGVyKGwpOmV9KSxmPVcoKCk9PkJDKHIsby52YWx1ZSx1LnZhbHVlLm1hcChlPT5lLm5hbWUpKSk7ZnVuY3Rpb24gcChlKXtWQyhyLGUsZi52YWx1ZS5oYXMoZSkpfWxldCBtPVcoe2dldDooKT0+QXJyYXkuZnJvbShmLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIGYudmFsdWUpdC5oYXMoZSl8fHAoZSk7Zm9yKGxldCBlIG9mIHQpZi52YWx1ZS5oYXMoZSl8fHAoZSl9fSk7RXIoaSxlPT57ZS50cmltKCk9PT1gYCYmSEMocil9KTtmdW5jdGlvbiBoKGUpe3JldHVybiBvLnZhbHVlP2UubW9kZWxzLmZpbHRlcih0PT5zKGUubmFtZSx0KSk6ZS5tb2RlbHN9bGV0IGc9e2F0dGVtcHRzRGF5OjAsZmFpbHVyZXNEYXk6MH07ZnVuY3Rpb24gXyhlLHQpe3JldHVybiBlLm1vZGVsUmF0ZXM/Llt0XT8/Z31mdW5jdGlvbiB2KGUsdCl7bGV0IG49XyhlLHQpO3JldHVybiBFQyhuLmF0dGVtcHRzRGF5LG4uZmFpbHVyZXNEYXkpfWxldCB5PXt9O2Z1bmN0aW9uIGIoZSx0KXtyZXR1cm4gZS5tb2RlbE1ldGE/Llt0XT8/eX1mdW5jdGlvbiB4KGUpe3N3aXRjaChlKXtjYXNlYG9wZW5gOnJldHVybmBkZXN0cnVjdGl2ZWA7Y2FzZWBoYWxmLW9wZW5gOnJldHVybmBzZWNvbmRhcnlgO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBTKGUpe2xldCB0PWdDKGUub3BlblVudGlsKTtyZXR1cm4gdD9gJHtlLmhlYWx0aFN0YXRlfSAoJHt0fSlgOmUuaGVhbHRoU3RhdGV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZT09PWBvcGVuYD9gdGV4dC1kZXN0cnVjdGl2ZWA6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gZS5sYXRlbmN5Py5zdHJlYW1pbmd9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuIGUubGF0ZW5jeT8uW2Bub24tc3RyZWFtaW5nYF19ZnVuY3Rpb24gdGUoZSl7cmV0dXJuIGUuY291bnQ9PT12b2lkIDA/YG5vIG9ic2VydmF0aW9ucyBjb3VudGVkYDpgJHtlLmNvdW50fSAke2UuY291bnQ9PT0xP2BvYnNlcnZhdGlvbmA6YG9ic2VydmF0aW9uc2B9IG9uIHRoaXMgcmVwbGljYWB9ZnVuY3Rpb24gVChlKXtyZXR1cm5gQXZlcmFnZSB0aW1lIHRvIGZpcnN0IGJ5dGUsIHRoZSBsb2FkLXNlbnNpdGl2ZSByZWFkaW5nIGZvciBzdHJlYW1pbmcgdHJhZmZpYy4gJHt0ZShlKX0uICR7Znd9YH1mdW5jdGlvbiBuZShlKXtyZXR1cm5gQXZlcmFnZSB0b3RhbCByZXNwb25zZSB0aW1lLCBpbmNsdWRpbmcgZ2VuZXJhdGlvbiDigJQgbm90IGEgbG9hZC1zZW5zaXRpdmUgc2lnbmFsIGxpa2Ugc3RyZWFtaW5nIHR0ZmIsIHNpbmNlIHRoaXMgcHJvdmlkZXIgYnVmZmVycyB0aGUgd2hvbGUgY29tcGxldGlvbiBiZWZvcmUgc2VuZGluZyBhbnl0aGluZy4gJHt0ZShlKX0uICR7Znd9YH1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5wcm92ZW5hbmNlPy5lc3RpbWF0ZWR9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIGUucHJvdmVuYW5jZT8udW5iaWxsZWR9ZnVuY3Rpb24gRShlKXtsZXQgdD1lLnJlcXVlc3RzPT09MT9gYDpgc2A7cmV0dXJuYCR7ZS5yZXF1ZXN0c30gbm9uLXN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgcHJvbXB0IHRva2VucyB3ZXJlIGVzdGltYXRlZCBmcm9tIHJlcXVlc3QgYm9keSBzaXplIGluc3RlYWQgKCR7ZS50b2tlbnN9IHRva2VucyBiaWxsZWQgZnJvbSB0aGUgZXN0aW1hdGUpLCBjb21wbGV0aW9uIGJpbGxlZCBhcyB6ZXJvLiAke2Z3fWB9ZnVuY3Rpb24gYWUoZSl7bGV0IHQ9ZS5yZXF1ZXN0cz09PTE/YGA6YHNgO3JldHVybmAke2UucmVxdWVzdHN9IHN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgdGhlIHJlcXVlc3Qgd2FzIGNvdW50ZWQgYnV0IHplcm8gdG9rZW5zIHdlcmUgYmlsbGVkLiBJZiB0aGlzIGtlZXBzIGhhcHBlbmluZywgdGhpcyBwcm92aWRlciBtYXkgYmUgc2VydmluZyBjb21wbGV0aW9ucyBlbnRpcmVseSBmcmVlIGFnYWluc3QgZXZlcnkgYnVkZ2V0LiAke2Z3fWB9bGV0IG9lPVt7aWQ6YGFsaWFzYCxoZWFkZXI6YEFsaWFzYCxhY2Nlc3NvckZuOmU9PmUuYWxpYXMsY2VsbDooe3JvdzplfSk9PkcoQ0Mse2lkOmUub3JpZ2luYWwuYWxpYXMsY29udGV4dFRva2VuczplLm9yaWdpbmFsLm1vZGVsTWV0YT8uY29udGV4dFRva2VucyxpbnB1dFBlck1Ub2tVc2Q6ZS5vcmlnaW5hbC5tb2RlbE1ldGE/LmlucHV0UGVyTVRva1VzZCxvdXRwdXRQZXJNVG9rVXNkOmUub3JpZ2luYWwubW9kZWxNZXRhPy5vdXRwdXRQZXJNVG9rVXNkfSl9LHtpZDpgdGFyZ2V0YCxoZWFkZXI6YFRhcmdldGAsYWNjZXNzb3JGbjplPT5lLnRhcmdldCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxlLm9yaWdpbmFsLnRhcmdldCl9XSxzZT1XKCgpPT5uLnZhbHVlPy5hbGlhc2VzLmxlbmd0aD9vLnZhbHVlP2BubyBhbGlhc2VzIG1hdGNoICIke2kudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgKTtyZXR1cm4oZSx0KT0+e2xldCByPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsVUMsW1YoYGRpdmAsV0MsW0goTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmVkaXMuY29uZmlndXJlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFsyXXx8PVUoYCBSZWRpcyBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1zbWB9LHtkZWZhdWx0OlAoKCk9PltWKGBwYCxHQyxrKG4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/YENvbmZpZ3VyZWRgOmBOb3QgY29uZmlndXJlZGApLDEpLG4udmFsdWU/LnJlZGlzLmxhc3RFcnI/KFIoKSx6KGBwYCxLQyxbSChyLHtpY29uOk4oaF8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zLjUgc2hyaW5rLTBgfSxudWxsLDgsW2BpY29uYF0pLFYoYHNwYW5gLG51bGwsayhuLnZhbHVlLnJlZGlzLmxhc3RFcnIpK2soTihtQykobi52YWx1ZS5yZWRpcy5sYXN0RXJyQXQpKSwxKV0pKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LmNhY2hlLmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8uY2FjaGUuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFszXXx8PVUoYCBSZXNwb25zZSBjYWNoZSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAscUMsayhuLnZhbHVlPy5jYWNoZS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5jYWNoZS5lbmFibGVkPyhSKCkseihgcGAsSkMsYHR0bCBgK2sobi52YWx1ZS5jYWNoZS50dGwpLDEpKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJldHJ5LmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmV0cnkuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFs0XXx8PVUoYCBSZXRyeSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAsWUMsayhuLnZhbHVlPy5yZXRyeS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5yZXRyeS5lbmFibGVkPyhSKCkseihgcGAsWEMsYCBhdHRlbXB0cyBgK2sobi52YWx1ZS5yZXRyeS5hdHRlbXB0cykrYCwgYmFja29mZiBgK2sobi52YWx1ZS5yZXRyeS5iYWNrb2ZmKSwxKSk6VHMoYGAsITApXSksXzoxfSldKSxfOjF9KV0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbNV18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzZdfHw9W1UoYCBFdmVyeSBjb25maWd1cmVkIHVwc3RyZWFtIGFuZCBpdHMgbGFzdCBkaXNjb3ZlcnkgcmVmcmVzaC4gU2VhcmNoIGZpbHRlcnMgcHJvdmlkZXJzIGFuZCBhbGlhc2VzIGJ5IG1vZGVsIGlkLiBgLC0xKV1dKSxfOjF9KSxIKFBDLHttb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBTZWFyY2ggbW9kZWxzIG9yIGFsaWFzZXMuLi5gLGNsYXNzOmBtdC0yIG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bbi52YWx1ZT8ucHJvdmlkZXJzLmxlbmd0aD9OKG8pJiZ1LnZhbHVlLmxlbmd0aD09PTA/KFIoKSx6KGBwYCxRQyxgIG5vIHByb3ZpZGVycyBtYXRjaCAiYCtrKE4oaSkpK2AiIGAsMSkpOihSKCksQihOKEZDKSx7a2V5OjIsbW9kZWxWYWx1ZTptLnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzFdfHw9ZT0+bS52YWx1ZT1lLHR5cGU6YG11bHRpcGxlYCxjbGFzczpgcm91bmRlZC1tZCBib3JkZXIgcHgtM2B9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodS52YWx1ZSxlPT4oUigpLEIoTihMQykse2tleTplLm5hbWUsdmFsdWU6ZS5uYW1lfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCwkQyxbVihgc3BhbmAsZXcsayhlLm5hbWUpLDEpLEgoTihlQykse2FzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS50eXBlKSwxKV0pLF86Mn0sMTAyNCksVihgc3BhbmAsdHcsayhlLm1vZGVsQ291bnQpK2AgbW9kZWxzYCwxKSxIKE5DLHsiYXR0ZW1wdHMtZGF5IjplLmF0dGVtcHRzRGF5LCJmYWlsdXJlcy1kYXkiOmUuZmFpbHVyZXNEYXksImF0dGVtcHRzLW1pbnV0ZSI6ZS5hdHRlbXB0c01pbnV0ZSwiZmFpbHVyZXMtbWludXRlIjplLmZhaWx1cmVzTWludXRlfSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgLGBhdHRlbXB0cy1taW51dGVgLGBmYWlsdXJlcy1taW51dGVgXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLEIoTihlQykse2tleTowLGFzOmBzcGFuYCx2YXJpYW50OngoZS5oZWFsdGhTdGF0ZSksY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTplLmhlYWx0aFN0YXRlPT09YG9wZW5gP2BkaXNjb3ZlcnkgaXMgYmFja2luZyBvZmYgYWZ0ZXIgcmVwZWF0ZWQgZmFpbHVyZXNgOmBhIGRpc2NvdmVyeSBwcm9iZSBpcyBkZWNpZGluZyB3aGV0aGVyIHRvIHJlY292ZXJgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKFMoZSkpLDEpXSksXzoyfSwxMDMyLFtgdmFyaWFudGAsYHRpdGxlYF0pKSx3KGUpPy5hdmdUdGZiTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOlQodyhlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgc3RyZWFtaW5nIHR0ZmIgYCtrKE4oZkMpKHcoZSkuYXZnVHRmYk1zKSksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSksZWUoZSk/LmF2Z0R1cmF0aW9uTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjIsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOm5lKGVlKGUpKX0se2RlZmF1bHQ6UCgoKT0+W1UoYCBub24tc3RyZWFtaW5nIGF2ZyBgK2soTihmQykoZWUoZSkuYXZnRHVyYXRpb25NcykpLDEpXSksXzoyfSwxMDMyLFtgdGl0bGVgXSkpLHJlKGUpPyhSKCksQihOKGVDKSx7a2V5OjMsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2AsdGl0bGU6RShyZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgZXN0aW1hdGVkIGArayhyZShlKS5yZXF1ZXN0cyksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSk6VHMoYGAsITApLGllKGUpPyhSKCksQihOKGVDKSx7a2V5OjQsYXM6YHNwYW5gLHZhcmlhbnQ6YGRlc3RydWN0aXZlYCxjbGFzczpgZm9udC1ub3JtYWwgdGFidWxhci1udW1zYCx0aXRsZTphZShpZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgdW5iaWxsZWQgYCtrKGllKGUpLnJlcXVlc3RzKSwxKV0pLF86Mn0sMTAzMixbYHRpdGxlYF0pKTpUcyhgYCwhMCksZS5sYXN0RXJyPyhSKCksQihyLHtrZXk6NSxpY29uOk4oaF8pLGNsYXNzOmBzaXplLTMuNSBzaHJpbmstMCB0ZXh0LWRlc3RydWN0aXZlYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSk6VHMoYGAsITApLFYoYHNwYW5gLG53LGsoTih5QykoZS5kaXNjb3ZlcnlFbmFibGVkLGUubGFzdFJlZnJlc2gpKSwxKV0pXSksXzoyfSwxMDI0KSxIKE4oSUMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYGRsYCxydyxbVihgZGl2YCxudWxsLFt0WzddfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQmFzZSBVUkxgLC0xKSxWKGBkZGAsaXcsayhlLmJhc2VVcmwpLDEpXSksVihgZGl2YCxudWxsLFt0WzhdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCByZWZyZXNoYCwtMSksVihgZGRgLG51bGwsayhOKGJDKShlLmRpc2NvdmVyeUVuYWJsZWQsZS5sYXN0UmVmcmVzaCkpLDEpXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLHooYGRpdmAsYXcsW3RbOV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBEaXNjb3ZlcnkgaGVhbHRoYCwtMSksVihgZGRgLHtjbGFzczpPKEMoZS5oZWFsdGhTdGF0ZSkpfSxrKFMoZSkpLDMpXSkpLGUubGFzdEVycj8oUigpLHooYGRpdmAsb3csW3RbMTBdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCBlcnJvcmAsLTEpLFYoYGRkYCxzdyxrKGUubGFzdEVyciksMSldKSk6VHMoYGAsITApXSksaChlKS5sZW5ndGg/KFIoKSx6KGBkaXZgLGN3LFsoUighMCkseihMLG51bGwsbWEoaChlKSx0PT4oUigpLHooYHNwYW5gLHtrZXk6dCxjbGFzczpgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xYH0sW0goQ0Mse2lkOk4oaUMpKGUubmFtZSx0KSwiY29udGV4dC10b2tlbnMiOmIoZSx0KS5jb250ZXh0VG9rZW5zLCJpbnB1dC1wZXItbS10b2stdXNkIjpiKGUsdCkuaW5wdXRQZXJNVG9rVXNkLCJvdXRwdXQtcGVyLW0tdG9rLXVzZCI6YihlLHQpLm91dHB1dFBlck1Ub2tVc2R9LG51bGwsOCxbYGlkYCxgY29udGV4dC10b2tlbnNgLGBpbnB1dC1wZXItbS10b2stdXNkYCxgb3V0cHV0LXBlci1tLXRvay11c2RgXSksYihlLHQpLmNvbnRleHRUb2tlbnM9PT12b2lkIDA/VHMoYGAsITApOihSKCkseihgc3BhbmAsbHcsayhOKGxDKShiKGUsdCkuY29udGV4dFRva2VucykpLDEpKSx2KGUsdCk/KFIoKSxCKE5DLHtrZXk6MSwiYXR0ZW1wdHMtZGF5IjpfKGUsdCkuYXR0ZW1wdHNEYXksImZhaWx1cmVzLWRheSI6XyhlLHQpLmZhaWx1cmVzRGF5fSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgXSkpOlRzKGBgLCEwKV0pKSksMTI4KSldKSk6KFIoKSx6KGBwYCx1dyxgbm8gbW9kZWxzIGtub3duIHlldGApKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxaQyxgbm9uZWApKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMV18fD1bVShgTW9kZWwgYWxpYXNlc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMl18fD1bVShgT3BlcmF0b3ItZGVmaW5lZCBhbGlhcyDihpIgdGFyZ2V0IG1vZGVsIG1hcHBpbmdzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOm9lLGRhdGE6ZC52YWx1ZSwiZW1wdHktbWVzc2FnZSI6c2UudmFsdWV9LG51bGwsOCxbYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KSxuLnZhbHVlPy52ZXJzaW9uPyhSKCkseihgcGAsZHcsYFZlcnNpb246IGArayhuLnZhbHVlLnZlcnNpb24pLDEpKTpUcyhgYCwhMCldKX19fSksbXc9W2B0aXRsZWBdLGh3PXsiYXJpYS1oaWRkZW4iOmB0cnVlYH0sZ3c9e2NsYXNzOmBzci1vbmx5YH0sX3c9Rih7X19uYW1lOmBDb21wYWN0TnVtYmVyYCxwcm9wczp7dmFsdWU6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5zQyh0LnZhbHVlKSkscj1XKCgpPT5vQyh0LnZhbHVlKSk7cmV0dXJuKGUsdCk9PihSKCkseihgc3BhbmAse3RpdGxlOnIudmFsdWV9LFtWKGBzcGFuYCxodyxrKG4udmFsdWUpLDEpLFYoYHNwYW5gLGd3LGsoci52YWx1ZSksMSldLDgsbXcpKX19KTtmdW5jdGlvbiB2dyhlLHQsbil7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT5HKF93LHt2YWx1ZTpuKGUub3JpZ2luYWwpfSl9fXZhciB5dz1gbm90IG9ic2VydmVkIHlldCDigJQgbm8gdHJhZmZpYyBhbmQgcHJvYmVzIGRpc2FibGVkIG9yIG5vdCB5ZXQgcnVuYDtmdW5jdGlvbiBidyhlKXtsZXQgdD1oQyhlLmxhc3RDaGVjayk7cmV0dXJuIHQ/YHVuaGVhbHRoeSAoJHt0fSlgOmB1bmhlYWx0aHlgfWZ1bmN0aW9uIHh3KGUpe2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlICR7dH0ke259YDtyZXR1cm4gZS5sYXN0RXJyb3I/YCR7cn06ICR7ZS5sYXN0RXJyb3J9YDpyfWZ1bmN0aW9uIFN3KGUpe2xldCB0PWhDKGUubGFzdENoZWNrKTtyZXR1cm4gdD9lLnNvdXJjZT9gJHt0fSB2aWEgJHtlLnNvdXJjZX1gOnQ6ZS5zb3VyY2U/YHZpYSAke2Uuc291cmNlfWA6YGB9ZnVuY3Rpb24gQ3coZSl7aWYoZS5jb25zZWN1dGl2ZUZhaWx1cmVzPD0wJiYhZS5sYXN0RXJyb3IpcmV0dXJuIHl3O2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9ICR7dH0gc28gZmFyJHtufWA7cmV0dXJuIGUubGFzdEVycm9yP2Ake3J9OiAke2UubGFzdEVycm9yfWA6cn1mdW5jdGlvbiB3dyhlKXtpZihlLnN0YXRlPT09YHVuaGVhbHRoeWApcmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBkZXN0cnVjdGl2ZWAsY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTp4dyhlKX0sKCk9PmJ3KGUpKTtpZihlLnN0YXRlPT09YGhlYWx0aHlgKXtsZXQgdD1lLmxhdGVuY3lNcz09PXZvaWQgMD9gYDpgIMK3ICR7ZkMoZS5sYXRlbmN5TXMpfWA7cmV0dXJuIEcoYHNwYW5gLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTpTdyhlKX0sYGhlYWx0aHkke3R9YCl9cmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBvdXRsaW5lYCxjbGFzczpgZm9udC1ub3JtYWxgLHRpdGxlOkN3KGUpfSwoKT0+YHVua25vd25gKX1mdW5jdGlvbiBUdygpe3JldHVyblt7aWQ6YG5hbWVgLGhlYWRlcjpgTmFtZWAsYWNjZXNzb3JGbjplPT5lLm5hbWUsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgZm9udC1tZWRpdW1gfSxlLm9yaWdpbmFsLm5hbWUpfSx7aWQ6YHVybGAsaGVhZGVyOmBVUkxgLGFjY2Vzc29yRm46ZT0+ZS51cmwsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgYmxvY2sgbWF4LXcteHMgdHJ1bmNhdGUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTplLm9yaWdpbmFsLnVybH0sZS5vcmlnaW5hbC51cmwpfSx7aWQ6YGhlYWx0aGAsaGVhZGVyOmBIZWFsdGhgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT5lLmhlYWx0aC5zdGF0ZSxjZWxsOih7cm93OmV9KT0+d3coZS5vcmlnaW5hbC5oZWFsdGgpfSx7aWQ6YGFjY2Vzc2AsaGVhZGVyOmBBY2Nlc3NgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT4oZS5hY2Nlc3M/P1tdKS5qb2luKGAsIGApLGNlbGw6KHtyb3c6ZX0pPT57bGV0IHQ9ZS5vcmlnaW5hbC5hY2Nlc3M7cmV0dXJuIHQ/Lmxlbmd0aD9HKGBkaXZgLHtjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LHQubWFwKGU9PkcoZUMse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSwoKT0+ZSkpKTpHKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBBbGwgZ3JvdXBzYCl9fSx2dyhgcmVxTWluYCxgcmVxL21pbmAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1pbnV0ZSksdncoYHJlcURheWAsYHJlcS9kYXlgLGU9PmUuY291bnRlcnMucmVxdWVzdHNQZXJEYXkpLHZ3KGByZXFNb250aGAsYHJlcS9tb250aGAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1vbnRoKV19dmFyIEV3PXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtNmB9LER3PUYoe19fbmFtZTpgVGFyZ2V0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXN4KCksbj1XKCgpPT50LnRhcmdldHMpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT16QygpO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGkudmFsdWUpfWxldCBzPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5tY3BTZXJ2ZXJzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSksYz1XKCgpPT57bGV0IGU9bi52YWx1ZT8uYWdlbnRzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSk7ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlP2EudmFsdWUmJnQ9PT0wP2BubyB0YXJnZXRzIG1hdGNoICIke3IudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgfWxldCB1PVcoKCk9Pmwobi52YWx1ZT8ubWNwU2VydmVycy5sZW5ndGg/PzAscy52YWx1ZS5sZW5ndGgpKSxkPVcoKCk9Pmwobi52YWx1ZT8uYWdlbnRzLmxlbmd0aD8/MCxjLnZhbHVlLmxlbmd0aCkpLGY9VHcoKTtyZXR1cm4oZSx0KT0+KFIoKSx6KGBkaXZgLEV3LFtIKFBDLHttb2RlbFZhbHVlOk4ociksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBGaWx0ZXIgTUNQIHNlcnZlcnMgb3IgYWdlbnRzYCxjbGFzczpgbWF4LXctc21gfSxudWxsLDgsW2Btb2RlbFZhbHVlYF0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMV18fD1bVShgTUNQIHNlcnZlcnNgLC0xKV1dKSxfOjF9KSxIKE4oWWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMl18fD1bVShgQ29uZmlndXJlZCBNQ1AgcHJveHkgdGFyZ2V0cywgdGhlIGdyb3VwcyBhbGxvd2VkIHRvIHJlYWNoIHRoZW0sIGFuZCB0aGVpciByZXF1ZXN0IGNvdW50ZXJzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOk4oZiksZGF0YTpzLnZhbHVlLCJlbXB0eS1tZXNzYWdlIjp1LnZhbHVlfSxudWxsLDgsW2Bjb2x1bW5zYCxgZGF0YWAsYGVtcHR5LW1lc3NhZ2VgXSldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbM118fD1bVShgQWdlbnRzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzRdfHw9W1UoYENvbmZpZ3VyZWQgQTJBIGFnZW50IHByb3h5IHRhcmdldHMsIHRoZSBncm91cHMgYWxsb3dlZCB0byByZWFjaCB0aGVtLCBhbmQgdGhlaXIgcmVxdWVzdCBjb3VudGVycy5gLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSCgkUyx7Y29sdW1uczpOKGYpLGRhdGE6Yy52YWx1ZSwiZW1wdHktbWVzc2FnZSI6ZC52YWx1ZX0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KSxPdz1GKHtfX25hbWU6YFRhYnNgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sb3JpZW50YXRpb246e30sZGlyOnt9LGFjdGl2YXRpb25Nb2RlOnt9LG1vZGVsVmFsdWU6e30sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihSYiksa3MoeyJkYXRhLXNsb3QiOmB0YWJzYCwiZGF0YS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbnx8YGhvcml6b250YWxgfSxOKGkpLHtjbGFzczpOKFl2KShgZ2FwLTIgZ3JvdXAvdGFicyBmbGV4IGRhdGEtaG9yaXpvbnRhbDpmbGV4LWNvbGAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpQKHQ9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx4ZShTcyh0KSkpXSksXzozfSwxNixbYGRhdGEtb3JpZW50YXRpb25gLGBjbGFzc2BdKSl9fSksa3c9Rih7X19uYW1lOmBUYWJzQ29udGVudGAscHJvcHM6e3ZhbHVlOnt9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihOKFZiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtY29udGVudGAsY2xhc3M6TihZdikoYHRleHQtc20gZmxleC0xIG91dGxpbmUtbm9uZWAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLEF3PUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sdmFyaWFudDp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgLGB2YXJpYW50YCk7cmV0dXJuKHIsaSk9PihSKCksQihOKEhiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtbGlzdGAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50fSxOKG4pLHtjbGFzczpOKFl2KShOKE13KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKX0pLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLGp3PUYoe19fbmFtZTpgVGFic1RyaWdnZXJgLHByb3BzOnt2YWx1ZTp7fSxkaXNhYmxlZDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49S3koQ3kodCxgY2xhc3NgKSk7cmV0dXJuKGUscik9PihSKCksQihOKFViKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtdHJpZ2dlcmAsY2xhc3M6TihZdikoYGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IHB4LTEuNSBweS0wLjUgdGV4dC1zbSBmb250LW1lZGl1bSBncm91cC1kYXRhLVt2YXJpYW50PWRlZmF1bHRdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpzaGFkb3ctc20gZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6c2hhZG93LW5vbmUgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0xIGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMSByZWxhdGl2ZSBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWZvcmVncm91bmQvNjAgdHJhbnNpdGlvbi1hbGwgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOnctZnVsbCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6anVzdGlmeS1zdGFydCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgZGFyazp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpob3Zlcjp0ZXh0LWZvcmVncm91bmQgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTBgLGBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpiZy10cmFuc3BhcmVudCBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpiZy10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJvcmRlci10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJnLXRyYW5zcGFyZW50YCxgZGF0YS1hY3RpdmU6YmctYmFja2dyb3VuZCBkYXRhLWFjdGl2ZTp0ZXh0LWZvcmVncm91bmQgZGFyazpkYXRhLWFjdGl2ZTpib3JkZXItaW5wdXQgZGFyazpkYXRhLWFjdGl2ZTpiZy1pbnB1dC8zMCBkYXJrOmRhdGEtYWN0aXZlOnRleHQtZm9yZWdyb3VuZGAsYGFmdGVyOmFic29sdXRlIGFmdGVyOmJnLWZvcmVncm91bmQgYWZ0ZXI6b3BhY2l0eS0wIGFmdGVyOnRyYW5zaXRpb24tb3BhY2l0eSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjppbnNldC14LTAgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6YWZ0ZXI6Ym90dG9tLVstNXB4XSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjpoLTAuNSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6aW5zZXQteS0wIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczphZnRlcjotcmlnaHQtMSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6dy0wLjUgZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6YWZ0ZXI6b3BhY2l0eS0xMDBgLHQuY2xhc3MpfSxOKG4pKSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGNsYXNzYF0pKX19KSxNdz1DXyhgcm91bmRlZC1sZyBwLTAuNzUgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6aC04IGRhdGEtW3ZhcmlhbnQ9bGluZV06cm91bmRlZC1ub25lIGdyb3VwL3RhYnMtbGlzdCBpbmxpbmUtZmxleCB3LWZpdCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczpoLWZpdCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6ZmxleC1jb2xgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctbXV0ZWRgLGxpbmU6YGdhcC0xIGJnLXRyYW5zcGFyZW50YH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7ZnVuY3Rpb24gTncoZSx0LG4scj1TdHJpbmcsaT0hMCl7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT57aWYoZS5vcmlnaW5hbC5zdG9yZURvd24pcmV0dXJuYD9gO2xldCB0PW4oZS5vcmlnaW5hbCk7cmV0dXJuIGk/Ryhfdyx7dmFsdWU6dH0pOnIodCl9fX1mdW5jdGlvbiBQdyhlLHQsbil7cmV0dXJuW3tpZDpgaWRgLGhlYWRlcjplLGFjY2Vzc29yRm46ZT0+ZS5pZCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmBmb250LW1lZGl1bWB9LGUub3JpZ2luYWwuaWQpfSx7aWQ6YHNlY29uZGFyeWAsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LG4oZS5vcmlnaW5hbCkpfSx7aWQ6YGxpbWl0c2AsaGVhZGVyOmBMaW1pdHNgLGFjY2Vzc29yRm46ZT0+eEMoZS5saW1pdHMpLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHhDKGUub3JpZ2luYWwubGltaXRzKSl9LE53KGByZXFNaW5gLGByZXEvbWluYCxlPT5lLnJlcXVlc3RzUGVyTWludXRlKSxOdyhgcmVxRGF5YCxgcmVxL2RheWAsZT0+ZS5yZXF1ZXN0c1BlckRheSksTncoYHRva0luRGF5YCxgdG9rSW4vZGF5YCxlPT5lLnRva2Vuc0luUGVyRGF5KSxOdyhgdG9rT3V0RGF5YCxgdG9rT3V0L2RheWAsZT0+ZS50b2tlbnNPdXRQZXJEYXkpLE53KGB0b2tJbk1vbnRoYCxgdG9rSW4vbW9udGhgLGU9PmUudG9rZW5zSW5QZXJNb250aCksTncoYHRva091dE1vbnRoYCxgdG9rT3V0L21vbnRoYCxlPT5lLnRva2Vuc091dFBlck1vbnRoKSxOdyhgY29zdERheWAsYGNvc3QvZGF5YCxlPT5lLmNvc3RQZXJEYXlNaWNyb1VzZCxhQywhMSksTncoYGNvc3RNb250aGAsYGNvc3QvbW9udGhgLGU9PmUuY29zdFBlck1vbnRoTWljcm9Vc2QsYUMsITEpXX12YXIgRnc9Rih7X19uYW1lOmBVc2FnZVRhYmxlYCxwcm9wczp7aWRMYWJlbDp7fSxlbnRyaWVzOnt9LHNlY29uZGFyeUNvbHVtbkxhYmVsOnt9LHNlY29uZGFyeVZhbHVlOnt0eXBlOkZ1bmN0aW9ufSxlbXB0eU1lc3NhZ2U6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5Qdyh0LmlkTGFiZWwsdC5zZWNvbmRhcnlDb2x1bW5MYWJlbCx0LnNlY29uZGFyeVZhbHVlKSk7cmV0dXJuKHQscik9PihSKCksQigkUyx7Y29sdW1uczpuLnZhbHVlLGRhdGE6ZS5lbnRyaWVzLCJlbXB0eS1tZXNzYWdlIjplLmVtcHR5TWVzc2FnZSwicm93LWNsYXNzIjplPT5lLnN0b3JlRG93bj9gYmctZGVzdHJ1Y3RpdmUvMTBgOnZvaWQgMH0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYCxgcm93LWNsYXNzYF0pKX19KTtmdW5jdGlvbiBJdyhlLHQpe3JldHVybiBlLmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModCl9ZnVuY3Rpb24gTHcoZSx0KXtyZXR1cm4gZS5pZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIFJ3KGUsdCl7cmV0dXJuIHQuZmlsdGVyKHQ9PnQuZ3JvdXBOYW1lPT09ZS5pZCl9ZnVuY3Rpb24gencoZSx0LG4pe3JldHVybiBSdyhlLHQpLmZpbHRlcihlPT5JdyhlLG4pKX1mdW5jdGlvbiBCdyhlLHQsbil7cmV0dXJuIEx3KGUsbil8fHp3KGUsdCxuKS5sZW5ndGg+MH12YXIgVnc9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sSHc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sVXc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sV3c9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sR3c9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sS3c9e2tleTowLGNsYXNzOmBtYi0zIGZsZXggZmxleC13cmFwIGdhcC14LTQgZ2FwLXktMSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHF3PXtjbGFzczpgZmxleCBmbGV4LTEgZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAteC00IGdhcC15LTEgcHItMiB0ZXh0LWxlZnRgfSxKdz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sWXc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0YWJ1bGFyLW51bXNgfSxYdz17Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LFp3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sUXc9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LCR3PXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LGVUPXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sdFQ9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sblQ9e2tleToxLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxyVD17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxpVD17a2V5OjEsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGFUPXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LG9UPXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sc1Q9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LGNUPXtjbGFzczpgdGFidWxhci1udW1zYH0sbFQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSx1VD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LGRUPXtjbGFzczpgdGFidWxhci1udW1zYH0sZlQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSxwVD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LG1UPXtrZXk6MixjbGFzczpgcHktNiB0ZXh0LWNlbnRlciB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGhUPWBHbG9iIHBhdHRlcm4g4oCUIG1hdGNoZXMgbGlrZSBhIHNoZWxsIHdpbGRjYXJkICgqLCA/LCBbLi4uXSlgLGdUPUYoe19fbmFtZTpgVXNhZ2VWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC51c2FnZSkscj1XKCgpPT57bGV0IGU9e307Zm9yKGxldCBuIG9mIHQub3ZlcnZpZXc/Lmdyb3Vwcz8/W10pZVtuLm5hbWVdPW4ubWVtYmVyQ291bnQ7cmV0dXJuIGV9KTtmdW5jdGlvbiBpKGUpe3JldHVybiBlLmdyb3VwTmFtZT8/YGB9ZnVuY3Rpb24gYShlKXtsZXQgdD1yLnZhbHVlW2UuaWRdO3JldHVybiB0PT09dm9pZCAwP2BgOlN0cmluZyh0KX1sZXR7cXVlcnk6byxub3JtYWxpemVkOnMsaGFzUXVlcnk6Y309ekMoKSxsPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5ncm91cHM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4gZS5maWx0ZXIoZT0+QncoZSx0LHMudmFsdWUpKX0pLHU9VygoKT0+Yy52YWx1ZT9sLnZhbHVlLmZpbHRlcihlPT4hTHcoZSxzLnZhbHVlKSkubWFwKGU9PmUuaWQpOltdKTtmdW5jdGlvbiBkKGUpe2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4hYy52YWx1ZXx8THcoZSxzLnZhbHVlKT9SdyhlLHQpOnp3KGUsdCxzLnZhbHVlKX1sZXQgZj1XKCgpPT5uLnZhbHVlPy5ncm91cHMubGVuZ3RoP2MudmFsdWU/YG5vIGdyb3VwcyBtYXRjaCAiJHtvLnZhbHVlfSJgOmBub25lYDpgbm9uZSBjb25maWd1cmVkYCkscD1XKCgpPT57bGV0IGU9bi52YWx1ZT8udXNlcnM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/Lmdyb3Vwcz8/W10scj1uZXcgU2V0KHQuZmlsdGVyKGU9Pkx3KGUscy52YWx1ZSkpLm1hcChlPT5lLmlkKSk7cmV0dXJuIGUuZmlsdGVyKGU9Pkl3KGUscy52YWx1ZSl8fGUuZ3JvdXBOYW1lIT09dm9pZCAwJiZyLmhhcyhlLmdyb3VwTmFtZSkpfSksbT1XKCgpPT5uLnZhbHVlPy51c2Vycy5sZW5ndGg/Yy52YWx1ZT9gbm8gdXNlcnMgbWF0Y2ggIiR7by52YWx1ZX0iYDpgbm9uZWA6YG5vbmUgY29uZmlndXJlZGApLGg9UHcoYE5hbWVgLGBNZW1iZXJzYCxhKSxnPU0oW10pLF89QlMoe2dldCBkYXRhKCl7cmV0dXJuIGwudmFsdWV9LGdldCBjb2x1bW5zKCl7cmV0dXJuIGh9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsZyksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIGcudmFsdWV9fX0pLHY9VygoKT0+Xy5nZXRSb3dNb2RlbCgpLnJvd3MpLHk9bmV3IFNldChbYGlkYCxgc2Vjb25kYXJ5YCxgcmVxRGF5YCxgY29zdERheWBdKSxiPVcoKCk9Pl8uZ2V0SGVhZGVyR3JvdXBzKClbMF0uaGVhZGVycy5maWx0ZXIoZT0+eS5oYXMoZS5jb2x1bW4uaWQpKSkseD1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSxTPVcoKCk9PkJDKHgsYy52YWx1ZSx1LnZhbHVlKSk7ZnVuY3Rpb24gQyhlKXtWQyh4LGUsUy52YWx1ZS5oYXMoZSkpfWxldCB3PVcoe2dldDooKT0+QXJyYXkuZnJvbShTLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIFMudmFsdWUpdC5oYXMoZSl8fEMoZSk7Zm9yKGxldCBlIG9mIHQpUy52YWx1ZS5oYXMoZSl8fEMoZSl9fSk7RXIobyxlPT57ZS50cmltKCk9PT1gYCYmSEMoeCl9KTtmdW5jdGlvbiBlZShlKXtyZXR1cm4vWyo/W10vLnRlc3QoZSl9cmV0dXJuKGUsdCk9PihSKCkseihgZGl2YCxWdyxbSChQQyx7bW9kZWxWYWx1ZTpOKG8pLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+aihvKT9vLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzIG9yIGdyb3Vwc2AsY2xhc3M6YG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKSxuLnZhbHVlPyhSKCksQihOKHFiKSx7a2V5OjB9LHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsyXXx8PVtVKGBUb3RhbGAsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFszXXx8PVtVKGBVc2FnZSBzdW1tZWQgYWNyb3NzIGV2ZXJ5IHVzZXIgYW5kIGdyb3VwIGNvbWJpbmVkLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTQgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLG51bGwsW3RbNF18fD1WKGBwYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBSZXF1ZXN0cy9kYXlgLC0xKSxWKGBwYCxIdyxbSChfdyx7dmFsdWU6bi52YWx1ZS50b3RhbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs1XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBpbi9kYXlgLC0xKSxWKGBwYCxVdyxbSChfdyx7dmFsdWU6bi52YWx1ZS50b3RhbC50b2tlbnNJblBlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs2XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBvdXQvZGF5YCwtMSksVihgcGAsV3csW0goX3cse3ZhbHVlOm4udmFsdWUudG90YWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKV0pXSksVihgZGl2YCxudWxsLFt0WzddfHw9VihgcGAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQ29zdC9kYXlgLC0xKSxWKGBwYCxHdyxrKE4oYUMpKG4udmFsdWUudG90YWwuY29zdFBlckRheU1pY3JvVXNkKSksMSldKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKSxIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzhdfHw9W1UoYEdyb3Vwc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFs5XXx8PVtVKGBFeHBhbmQgYSBncm91cCB0byBzZWUgaXRzIG1lbWJlciB1c2Vycycgb3duIHVzYWdlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9Plt2LnZhbHVlLmxlbmd0aD8oUigpLHooYGRpdmAsS3csWyhSKCEwKSx6KEwsbnVsbCxtYShiLnZhbHVlLGU9PihSKCksQihIUyx7a2V5OmUuaWQsaGVhZGVyOmV9LG51bGwsOCxbYGhlYWRlcmBdKSkpLDEyOCkpXSkpOlRzKGBgLCEwKSx2LnZhbHVlLmxlbmd0aD8oUigpLEIoTihGQykse2tleToxLG1vZGVsVmFsdWU6dy52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFsxXXx8PWU9PncudmFsdWU9ZSx0eXBlOmBtdWx0aXBsZWAsY2xhc3M6YHJvdW5kZWQtbWQgYm9yZGVyIHB4LTNgfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHYudmFsdWUsZT0+KFIoKSxCKE4oTEMpLHtrZXk6ZS5vcmlnaW5hbC5pZCx2YWx1ZTplLm9yaWdpbmFsLmlkfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCxxdyxbVihgc3BhbmAsSncsayhlLm9yaWdpbmFsLmlkKSwxKSxWKGBzcGFuYCxZdyxrKGEoZS5vcmlnaW5hbCl8fGAwYCkrYCBtZW1iZXJzYCwxKSxWKGBzcGFuYCxYdyxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihfdyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSkpLHRbMTBdfHw9VShgIHJlcS9kYXkgYCwtMSldKSxWKGBzcGFuYCxadyxrKGUub3JpZ2luYWwuc3RvcmVEb3duP2A/YDpOKGFDKShlLm9yaWdpbmFsLmNvc3RQZXJEYXlNaWNyb1VzZCkpK2AvZGF5IGAsMSldKV0pLF86Mn0sMTAyNCksSChOKElDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBkbGAsUXcsW1YoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOmhUfSxgUHJvdmlkZXJzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwucHJvdmlkZXJzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLCR3LFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5wcm92aWRlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLGVULGBBbGwgcHJvdmlkZXJzYCkpXSldKSxWKGBkaXZgLG51bGwsW1YoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTpoVH0sYE1vZGVsc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1vZGVscz8ubGVuZ3RoPyhSKCkseihgZGl2YCx0VCxbKFIoITApLHooTCxudWxsLG1hKGUub3JpZ2luYWwubW9kZWxzLGU9PihSKCkseihMLHtrZXk6ZX0sW2VlKGUpPyhSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbW9ubyBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZSksMSldKSxfOjJ9LDEwMjQpKTooUigpLEIoQ0Mse2tleTowLGlkOmV9LG51bGwsOCxbYGlkYF0pKV0sNjQpKSksMTI4KSldKSk6KFIoKSx6KGBzcGFuYCxuVCxgQWxsIG1vZGVsc2ApKV0pXSksVihgZGl2YCxudWxsLFtWKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsdGl0bGU6aFR9LGBNQ1Agc2VydmVyc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1jcFNlcnZlcnM/Lmxlbmd0aD8oUigpLHooYGRpdmAsclQsWyhSKCEwKSx6KEwsbnVsbCxtYShlLm9yaWdpbmFsLm1jcFNlcnZlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLGlULGBBbGwgTUNQIHNlcnZlcnNgKSldKV0pLFYoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOmhUfSxgQWdlbnRzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwuYWdlbnRzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLGFULFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5hZ2VudHMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLG9ULGBBbGwgYWdlbnRzYCkpXSldKV0pLFYoYGRsYCxzVCxbVihgZGl2YCxudWxsLFt0WzExXXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYExpbWl0c2AsLTEpLFYoYGRkYCxudWxsLGsoTih4QykoZS5vcmlnaW5hbC5saW1pdHMpKSwxKV0pLFYoYGRpdmAsbnVsbCxbdFsxMl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGByZXEvbWluYCwtMSksVihgZGRgLGNULFtlLm9yaWdpbmFsLnN0b3JlRG93bj8oUigpLHooTCx7a2V5OjB9LFtVKGA/YCldLDY0KSk6KFIoKSxCKF93LHtrZXk6MSx2YWx1ZTplLm9yaWdpbmFsLnJlcXVlc3RzUGVyTWludXRlfSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxM118fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9kYXlgLC0xKSxWKGBkZGAsbFQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zSW5QZXJEYXl9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE0XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva091dC9kYXlgLC0xKSxWKGBkZGAsdVQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9tb250aGAsLTEpLFYoYGRkYCxkVCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihfdyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNJblBlck1vbnRofSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tPdXQvbW9udGhgLC0xKSxWKGBkZGAsZlQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoX3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyTW9udGh9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE3XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYGNvc3QvbW9udGhgLC0xKSxWKGBkZGAscFQsayhlLm9yaWdpbmFsLnN0b3JlRG93bj9gP2A6TihhQykoZS5vcmlnaW5hbC5jb3N0UGVyTW9udGhNaWNyb1VzZCkpLDEpXSldKSx0WzE4XXx8PVYoYHBgLHtjbGFzczpgbWItMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYE1lbWJlcnNgLC0xKSxIKEZ3LHsiaWQtbGFiZWwiOmBOYW1lYCwic2Vjb25kYXJ5LWNvbHVtbi1sYWJlbCI6YEdyb3VwYCxlbnRyaWVzOmQoZS5vcmlnaW5hbCksInNlY29uZGFyeS12YWx1ZSI6aX0sbnVsbCw4LFtgZW50cmllc2BdKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxtVCxrKGYudmFsdWUpLDEpKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxOV18fD1bVShgVXNlcnNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChGdyx7ImlkLWxhYmVsIjpgTmFtZWAsInNlY29uZGFyeS1jb2x1bW4tbGFiZWwiOmBHcm91cGAsZW50cmllczpwLnZhbHVlLCJzZWNvbmRhcnktdmFsdWUiOmksImVtcHR5LW1lc3NhZ2UiOm0udmFsdWV9LG51bGwsOCxbYGVudHJpZXNgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KTtmdW5jdGlvbiBfVChlLHQsbil7bGV0IHI9ZS5zdGFydHNXaXRoKGAjYCk/ZS5zbGljZSgxKTplO3JldHVybiB0LmluY2x1ZGVzKHIpP3I6bn1mdW5jdGlvbiB2VChlKXtyZXR1cm5gIyR7ZX1gfWZ1bmN0aW9uIHlUKHt2YWxpZFRhYnM6ZSxkZWZhdWx0VGFiOnR9KXtsZXQgbj10eXBlb2Ygd2luZG93PGB1YCxyPU0obj9fVCh3aW5kb3cubG9jYXRpb24uaGFzaCxlLHQpOnQpO0VyKHIsZT0+e2lmKCFuKXJldHVybjtsZXQgdD12VChlKTt3aW5kb3cubG9jYXRpb24uaGFzaCE9PXQmJndpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLGBgLHQpfSk7ZnVuY3Rpb24gaSgpe3IudmFsdWU9X1Qod2luZG93LmxvY2F0aW9uLmhhc2gsZSx0KX1yZXR1cm4gbiYmKFppKCgpPT53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpLHRhKCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpKSxyfXZhciBiVD0oZnVuY3Rpb24oKXtsZXQgZT10eXBlb2YgZG9jdW1lbnQ8YHVgJiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYCkucmVsTGlzdDtyZXR1cm4gZSYmZS5zdXBwb3J0cyYmZS5zdXBwb3J0cyhgbW9kdWxlcHJlbG9hZGApP2Btb2R1bGVwcmVsb2FkYDpgcHJlbG9hZGB9KSgpLHhUPWZ1bmN0aW9uKGUpe3JldHVybmAvYWRtaW4vYCtlfSxTVD17fSxDVD1mdW5jdGlvbihlLHQsbil7bGV0IHI9UHJvbWlzZS5yZXNvbHZlKCk7aWYodCYmdC5sZW5ndGg+MCl7bGV0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYGxpbmtgKSxpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXWApLGE9aT8ubm9uY2V8fGk/LmdldEF0dHJpYnV0ZShgbm9uY2VgKTtmdW5jdGlvbiBvKGUpe3JldHVybiBQcm9taXNlLmFsbChlLm1hcChlPT5Qcm9taXNlLnJlc29sdmUoZSkudGhlbihlPT4oe3N0YXR1czpgZnVsZmlsbGVkYCx2YWx1ZTplfSksZT0+KHtzdGF0dXM6YHJlamVjdGVkYCxyZWFzb246ZX0pKSkpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGltcG9ydC5tZXRhLnJlc29sdmU/aW1wb3J0Lm1ldGEucmVzb2x2ZShlKTpuZXcgVVJMKGUsaW1wb3J0Lm1ldGEudXJsKS5ocmVmfXI9byh0Lm1hcCh0PT57aWYodD14VCh0LG4pLHQ9cyh0KSx0IGluIFNUKXJldHVybjtTVFt0XT0hMDtsZXQgcj10LmVuZHNXaXRoKGAuY3NzYCk7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCBpPWVbbl07aWYoaS5ocmVmPT09dCYmKCFyfHxpLnJlbD09PWBzdHlsZXNoZWV0YCkpcmV0dXJufWxldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGxpbmtgKTtpZihpLnJlbD1yP2BzdHlsZXNoZWV0YDpiVCxyfHwoaS5hcz1gc2NyaXB0YCksaS5jcm9zc09yaWdpbj1gYCxpLmhyZWY9dCxhJiZpLnNldEF0dHJpYnV0ZShgbm9uY2VgLGEpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSkscilyZXR1cm4gbmV3IFByb21pc2UoKGUsbik9PntpLmFkZEV2ZW50TGlzdGVuZXIoYGxvYWRgLGUpLGkuYWRkRXZlbnRMaXN0ZW5lcihgZXJyb3JgLCgpPT5uKEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7dH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShlKXtsZXQgdD1uZXcgRXZlbnQoYHZpdGU6cHJlbG9hZEVycm9yYCx7Y2FuY2VsYWJsZTohMH0pO2lmKHQucGF5bG9hZD1lLHdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpLCF0LmRlZmF1bHRQcmV2ZW50ZWQpdGhyb3cgZX1yZXR1cm4gci50aGVuKHQ9Pntmb3IobGV0IGUgb2YgdHx8W10pZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZpKGUucmVhc29uKTtyZXR1cm4gZSgpLmNhdGNoKGkpfSl9LHdUPXtjbGFzczpgZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTYgcHgtNCBweS04IHNtOnB4LTYgbGc6cHgtOGB9LFRUPXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMWB9LEVUPXtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yYH0sRFQ9e2NsYXNzOmBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sT1Q9YGh0dHBzOi8vZ2l0aHViLmNvbS9sdWthc3pyYWN6eWxvL3RyYWVmaWstbGxtZ2F0ZXdheWAsa1Q9bXUoRih7X19uYW1lOmBBcHBgLHNldHVwKGUpe2xldCB0PUxpKCgpPT5DVCgoKT0+aW1wb3J0KGAuL0NoYXJ0c1ZpZXctLTVQZ0tiVjkuanNgKSxbXSkpLG49cngoKSxyPXN4KCksaT15VCh7dmFsaWRUYWJzOltgcHJvdmlkZXJzYCxgdXNhZ2VgLGBjaGFydHNgLGB0YXJnZXRzYF0sZGVmYXVsdFRhYjpgcHJvdmlkZXJzYH0pLGE9VygoKT0+ci5lcnJvcj9gcmVmcmVzaCBmYWlsZWQ6ICR7ci5lcnJvcn1gOnIubGFzdFVwZGF0ZWQ/YGxhc3QgdXBkYXRlZCAke3IubGFzdFVwZGF0ZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDpgbG9hZGluZy4uLmApO3JldHVybiBaaSgoKT0+e3Iuc3RhcnRQb2xsaW5nKCl9KSwoZSxvKT0+e2xldCBzPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsd1QsW1YoYGhlYWRlcmAsVFQsW1YoYGRpdmAsRVQsW29bMV18fD1WKGBoMWAse2NsYXNzOmB0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRgfSxgTExNIEdhdGV3YXkg4oCUIEFkbWluYCwtMSksSChOKFdiKSx7YXM6YGFgLGhyZWY6T1QsdGFyZ2V0OmBfYmxhbmtgLHJlbDpgbm9vcGVuZXIgbm9yZWZlcnJlcmAsdmFyaWFudDpgZ2hvc3RgLHNpemU6YGljb25gLCJhcmlhLWxhYmVsIjpgR2l0SHViIHJlcG9zaXRvcnlgLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kYH0se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKG5fKSxjbGFzczpgc2l6ZS00YCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKV0pLF86MX0pXSksVihgcGAsRFQsW04ocikuZXJyb3I/KFIoKSxCKHMse2tleTowLGljb246TihsXyksY2xhc3M6YHNpemUtMy41IHRleHQtZGVzdHJ1Y3RpdmVgfSxudWxsLDgsW2BpY29uYF0pKTpUcyhgYCwhMCksVihgc3BhbmAse2NsYXNzOk8oTihyKS5lcnJvcj9gdGV4dC1kZXN0cnVjdGl2ZWA6dm9pZCAwKX0sayhhLnZhbHVlKSwzKV0pXSksTihuKS5pc0F1dGhlbnRpY2F0ZWQ/KFIoKSxCKE4oT3cpLHtrZXk6MSxtb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOm9bMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsfSx7ZGVmYXVsdDpQKCgpPT5bSChOKEF3KSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oancpLHt2YWx1ZTpgcHJvdmlkZXJzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bMl18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKGp3KSx7dmFsdWU6YHVzYWdlYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bM118fD1bVShgVXNhZ2VgLC0xKV1dKSxfOjF9KSxIKE4oancpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bNF18fD1bVShgQ2hhcnRzYCwtMSldXSksXzoxfSksSChOKGp3KSx7dmFsdWU6YHRhcmdldHNgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1s1XXx8PVtVKGBNQ1AgJiBBZ2VudHNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihrdykse3ZhbHVlOmBwcm92aWRlcnNgfSx7ZGVmYXVsdDpQKCgpPT5bSChwdyldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgdXNhZ2VgfSx7ZGVmYXVsdDpQKCgpPT5bSChnVCldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+W0goTih0KSldKSxfOjF9KSxIKE4oa3cpLHt2YWx1ZTpgdGFyZ2V0c2B9LHtkZWZhdWx0OlAoKCk9PltIKER3KV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSxCKGd4LHtrZXk6MH0pKV0pfX19KSk7a1QudXNlKFZnKCkpLGtULmNvbXBvbmVudChgRm9udEF3ZXNvbWVJY29uYCxDZyksa1QubW91bnQoYCNhcHBgKTtleHBvcnR7VnIgYXMgJCxreSBhcyBBLFp0IGFzIEF0LFR5IGFzIEIsZ2UgYXMgQnQscXkgYXMgQyx3ciBhcyBDdCxWeSBhcyBELG9uIGFzIER0LFV5IGFzIEUsRmUgYXMgRXQsYnkgYXMgRix5biBhcyBGdCxZdiBhcyBHLHN5IGFzIEgsZnkgYXMgSSxtbiBhcyBJdCxzXyBhcyBKLHVfIGFzIEssZ3kgYXMgTCxOIGFzIEx0LEZ5IGFzIE0sZW4gYXMgTXQsSXkgYXMgTix1biBhcyBOdCxOeSBhcyBPLGogYXMgT3QsZHkgYXMgUCxBIGFzIFB0LEwgYXMgUSxDeSBhcyBSLE8gYXMgUnQsWXkgYXMgUyxDciBhcyBTdCxHeSBhcyBULG5jIGFzIFR0LG95IGFzIFUsY3kgYXMgVixrIGFzIFZ0LGF5IGFzIFcsQ2cgYXMgWCx0XyBhcyBZLGl1IGFzIFosSmIgYXMgXyxtYSBhcyBfdCxPdyBhcyBhLFUgYXMgYXQsbmIgYXMgYixpYyBhcyBidCxTQyBhcyBjLFNzIGFzIGN0LHN4IGFzIGQsa3MgYXMgZHQsVyBhcyBldCxpeCBhcyBmLFFuIGFzIGZ0LFhiIGFzIGcsUiBhcyBndCxaYiBhcyBoLHRhIGFzIGh0LEF3IGFzIGkseiBhcyBpdCxBeSBhcyBqLE0gYXMganQsT3kgYXMgayxJZSBhcyBrdCxzQyBhcyBsLEcgYXMgbHQscnggYXMgbSxaaSBhcyBtdCxJdyBhcyBuLEIgYXMgbnQsekMgYXMgbyxIIGFzIG90LGF4IGFzIHAsZWEgYXMgcHQsbV8gYXMgcSxqdyBhcyByLFRzIGFzIHJ0LFBDIGFzIHMsRiBhcyBzdCxCdyBhcyB0LFYgYXMgdHQsb0MgYXMgdSxQYSBhcyB1dCxxYiBhcyB2LEkgYXMgdnQsS3kgYXMgdyxQIGFzIHd0LCR5IGFzIHgsRXIgYXMgeHQsd2IgYXMgeSx1YSBhcyB5dCx3eSBhcyB6LHhlIGFzIHp0fTs=", + "dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5LHQ9KHQsbik9PntsZXQgcj17fTtmb3IodmFyIGkgaW4gdCllKHIsaSx7Z2V0OnRbaV0sZW51bWVyYWJsZTohMH0pO3JldHVybiBufHxlKHIsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpgTW9kdWxlYH0pLHJ9O2Z1bmN0aW9uIG4oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG4gb2YgZS5zcGxpdChgLGApKXRbbl09MTtyZXR1cm4gZT0+ZSBpbiB0fXZhciByPXt9LGk9W10sYT0oKT0+e30sbz0oKT0+ITEscz1lPT5lLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmUuY2hhckNvZGVBdCgxKT09PTExMCYmKGUuY2hhckNvZGVBdCgyKT4xMjJ8fGUuY2hhckNvZGVBdCgyKTw5NyksYz1lPT5lLnN0YXJ0c1dpdGgoYG9uVXBkYXRlOmApLGw9T2JqZWN0LmFzc2lnbix1PShlLHQpPT57bGV0IG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9LGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmPShlLHQpPT5kLmNhbGwoZSx0KSxwPUFycmF5LmlzQXJyYXksbT1lPT53KGUpPT09YFtvYmplY3QgTWFwXWAsaD1lPT53KGUpPT09YFtvYmplY3QgU2V0XWAsZz1lPT53KGUpPT09YFtvYmplY3QgRGF0ZV1gLF89ZT0+dyhlKT09PWBbb2JqZWN0IFJlZ0V4cF1gLHY9ZT0+dHlwZW9mIGU9PWBmdW5jdGlvbmAseT1lPT50eXBlb2YgZT09YHN0cmluZ2AsYj1lPT50eXBlb2YgZT09YHN5bWJvbGAseD1lPT50eXBlb2YgZT09YG9iamVjdGAmJiEhZSxTPWU9Pih4KGUpfHx2KGUpKSYmdihlLnRoZW4pJiZ2KGUuY2F0Y2gpLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx3PWU9PkMuY2FsbChlKSxlZT1lPT53KGUpLnNsaWNlKDgsLTEpLHRlPWU9PncoZSk9PT1gW29iamVjdCBPYmplY3RdYCxUPWU9PnkoZSkmJmUhPT1gTmFOYCYmZVswXSE9PWAtYCYmYGArcGFyc2VJbnQoZSwxMCk9PT1lLG5lPW4oYCxrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkYCkscmU9ZT0+e2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuKG49PnRbbl18fCh0W25dPWUobikpKX0saWU9Ly1cdy9nLEU9cmUoZT0+ZS5yZXBsYWNlKGllLGU9PmUuc2xpY2UoMSkudG9VcHBlckNhc2UoKSkpLGFlPS9cQihbQS1aXSkvZyxvZT1yZShlPT5lLnJlcGxhY2UoYWUsYC0kMWApLnRvTG93ZXJDYXNlKCkpLHNlPXJlKGU9PmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSksY2U9cmUoZT0+ZT9gb24ke3NlKGUpfWA6YGApLEQ9KGUsdCk9PiFPYmplY3QuaXMoZSx0KSxsZT0oZSwuLi50KT0+e2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oLi4udCl9LHVlPShlLHQsbixyPSExKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOnIsdmFsdWU6bn0pfSxkZT1lPT57bGV0IHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fSxmZT1lPT57bGV0IHQ9eShlKT9OdW1iZXIoZSk6TmFOO3JldHVybiBpc05hTih0KT9lOnR9LHBlLG1lPSgpPT5wZXx8PXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPGB1YD9zZWxmOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6e30saGU9bihgSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3IsU3ltYm9sYCk7ZnVuY3Rpb24gZ2UoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0saT15KHIpP2JlKHIpOmdlKHIpO2lmKGkpZm9yKGxldCBlIGluIGkpdFtlXT1pW2VdfXJldHVybiB0fWlmKHkoZSl8fHgoZSkpcmV0dXJuIGV9dmFyIF9lPS87KD8hW14oXSpcKSkvZyx2ZT0vOihbXl0rKS8seWU9L1wvXCpbXl0qP1wqXC8vZztmdW5jdGlvbiBiZShlKXtsZXQgdD17fTtyZXR1cm4gZS5yZXBsYWNlKHllLGBgKS5zcGxpdChfZSkuZm9yRWFjaChlPT57aWYoZSl7bGV0IG49ZS5zcGxpdCh2ZSk7bi5sZW5ndGg+MSYmKHRbblswXS50cmltKCldPW5bMV0udHJpbSgpKX19KSx0fWZ1bmN0aW9uIE8oZSl7bGV0IHQ9YGA7aWYoeShlKSl0PWU7ZWxzZSBpZihwKGUpKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1PKGVbbl0pO3ImJih0Kz1yK2AgYCl9ZWxzZSBpZih4KGUpKWZvcihsZXQgbiBpbiBlKWVbbl0mJih0Kz1uK2AgYCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIHhlKGUpe2lmKCFlKXJldHVybiBudWxsO2xldHtjbGFzczp0LHN0eWxlOm59PWU7cmV0dXJuIHQmJiF5KHQpJiYoZS5jbGFzcz1PKHQpKSxuJiYoZS5zdHlsZT1nZShuKSksZX12YXIgU2U9YGl0ZW1zY29wZSxhbGxvd2Z1bGxzY3JlZW4sZm9ybW5vdmFsaWRhdGUsaXNtYXAsbm9tb2R1bGUsbm92YWxpZGF0ZSxyZWFkb25seWAsQ2U9bihTZSk7U2UrYGA7ZnVuY3Rpb24gd2UoZSl7cmV0dXJuISFlfHxlPT09YGB9ZnVuY3Rpb24gVGUoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2xldCBuPSEwO2ZvcihsZXQgcj0wO24mJnI8ZS5sZW5ndGg7cisrKW49RWUoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBFZShlLHQpe2lmKGU9PT10KXJldHVybiEwO2xldCBuPWcoZSkscj1nKHQpO2lmKG58fHIpcmV0dXJuIG4mJnI/ZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTohMTtpZihuPWIoZSkscj1iKHQpLG58fHIpcmV0dXJuIGU9PT10O2lmKG49cChlKSxyPXAodCksbnx8cilyZXR1cm4gbiYmcj9UZShlLHQpOiExO2lmKG49eChlKSxyPXgodCksbnx8cil7aWYoIW58fCFyfHxPYmplY3Qua2V5cyhlKS5sZW5ndGghPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuIGluIGUpe2xldCByPWUuaGFzT3duUHJvcGVydHkobiksaT10Lmhhc093blByb3BlcnR5KG4pO2lmKHImJiFpfHwhciYmaXx8IUVlKGVbbl0sdFtuXSkpcmV0dXJuITF9fXJldHVybiBTdHJpbmcoZSk9PT1TdHJpbmcodCl9ZnVuY3Rpb24gRGUoZSx0KXtyZXR1cm4gZS5maW5kSW5kZXgoZT0+RWUoZSx0KSl9dmFyIE9lPWU9PiEhKGUmJmUuX192X2lzUmVmPT09ITApLGs9ZT0+eShlKT9lOmU9PW51bGw/YGA6cChlKXx8eChlKSYmKGUudG9TdHJpbmc9PT1DfHwhdihlLnRvU3RyaW5nKSk/T2UoZSk/ayhlLnZhbHVlKTpKU09OLnN0cmluZ2lmeShlLGtlLDIpOlN0cmluZyhlKSxrZT0oZSx0KT0+T2UodCk/a2UoZSx0LnZhbHVlKTptKHQpP3tbYE1hcCgke3Quc2l6ZX0pYF06Wy4uLnQuZW50cmllcygpXS5yZWR1Y2UoKGUsW3Qsbl0scik9PihlW0FlKHQscikrYCA9PmBdPW4sZSkse30pfTpoKHQpP3tbYFNldCgke3Quc2l6ZX0pYF06Wy4uLnQudmFsdWVzKCldLm1hcChlPT5BZShlKSl9OmIodCk/QWUodCk6eCh0KSYmIXAodCkmJiF0ZSh0KT9TdHJpbmcodCk6dCxBZT0oZSx0PWBgKT0+YihlKT9gU3ltYm9sKCR7ZS5kZXNjcmlwdGlvbj8/dH0pYDplO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlPT1udWxsP2Bpbml0aWFsYDp0eXBlb2YgZT09YHN0cmluZ2A/ZT09PWBgP2AgYDplOlN0cmluZyhlKX12YXIgTWUsTmU9Y2xhc3N7Y29uc3RydWN0b3IoZT0hMSl7dGhpcy5kZXRhY2hlZD1lLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9vbj0wLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMuX2lzUGF1c2VkPSExLHRoaXMuX3dhcm5PblJ1bj0hMCx0aGlzLl9fdl9za2lwPSEwLCFlJiZNZSYmKE1lLmFjdGl2ZT8odGhpcy5wYXJlbnQ9TWUsdGhpcy5pbmRleD0oTWUuc2NvcGVzfHwoTWUuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKToodGhpcy5fYWN0aXZlPSExLHRoaXMuX3dhcm5PblJ1bj0hMSkpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXBhdXNlKCl7aWYodGhpcy5fYWN0aXZlKXt0aGlzLl9pc1BhdXNlZD0hMDtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucGF1c2UoKX1mb3IoZT0wLHQ9dGhpcy5lZmZlY3RzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZWZmZWN0c1tlXS5wYXVzZSgpfX1yZXN1bWUoKXtpZih0aGlzLl9hY3RpdmUmJnRoaXMuX2lzUGF1c2VkKXt0aGlzLl9pc1BhdXNlZD0hMTtsZXQgZSx0O2lmKHRoaXMuc2NvcGVzKXtsZXQgbj10aGlzLnNjb3Blcy5zbGljZSgpO2ZvcihlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV0ucmVzdW1lKCl9bGV0IG49dGhpcy5lZmZlY3RzLnNsaWNlKCk7Zm9yKGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspbltlXS5yZXN1bWUoKX19cnVuKGUpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IHQ9TWU7dHJ5e3JldHVybiBNZT10aGlzLGUoKX1maW5hbGx5e01lPXR9fX1vbigpeysrdGhpcy5fb249PT0xJiYodGhpcy5wcmV2U2NvcGU9TWUsTWU9dGhpcyl9b2ZmKCl7aWYodGhpcy5fb24+MCYmLS10aGlzLl9vbj09PTApe2lmKE1lPT09dGhpcylNZT10aGlzLnByZXZTY29wZTtlbHNle2xldCBlPU1lO2Zvcig7ZTspe2lmKGUucHJldlNjb3BlPT09dGhpcyl7ZS5wcmV2U2NvcGU9dGhpcy5wcmV2U2NvcGU7YnJlYWt9ZT1lLnByZXZTY29wZX19dGhpcy5wcmV2U2NvcGU9dm9pZCAwfX1zdG9wKGUpe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fYWN0aXZlPSExO2xldCB0LG47Zm9yKHQ9MCxuPXRoaXMuZWZmZWN0cy5sZW5ndGg7dDxuO3QrKyl0aGlzLmVmZmVjdHNbdF0uc3RvcCgpO2Zvcih0aGlzLmVmZmVjdHMubGVuZ3RoPTAsdD0wLG49dGhpcy5jbGVhbnVwcy5sZW5ndGg7dDxuO3QrKyl0aGlzLmNsZWFudXBzW3RdKCk7aWYodGhpcy5jbGVhbnVwcy5sZW5ndGg9MCx0aGlzLnNjb3Blcyl7bGV0IGU9dGhpcy5zY29wZXMuc2xpY2UoKTtmb3IodD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnN0b3AoITApO3RoaXMuc2NvcGVzLmxlbmd0aD0wfWlmKCF0aGlzLmRldGFjaGVkJiZ0aGlzLnBhcmVudCYmIWUpe2xldCBlPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtlJiZlIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1lLGUuaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwfX19O2Z1bmN0aW9uIFBlKGUpe3JldHVybiBuZXcgTmUoZSl9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gTWV9ZnVuY3Rpb24gSWUoZSx0PSExKXtNZSYmTWUuY2xlYW51cHMucHVzaChlKX12YXIgTGUsUmU9bmV3IFdlYWtTZXQsemU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5mbj1lLHRoaXMuZGVwcz12b2lkIDAsdGhpcy5kZXBzVGFpbD12b2lkIDAsdGhpcy5mbGFncz01LHRoaXMubmV4dD12b2lkIDAsdGhpcy5jbGVhbnVwPXZvaWQgMCx0aGlzLnNjaGVkdWxlcj12b2lkIDAsTWUmJihNZS5hY3RpdmU/TWUuZWZmZWN0cy5wdXNoKHRoaXMpOnRoaXMuZmxhZ3MmPS0yKX1wYXVzZSgpe3RoaXMuZmxhZ3N8PTY0fXJlc3VtZSgpe3RoaXMuZmxhZ3MmNjQmJih0aGlzLmZsYWdzJj0tNjUsUmUuaGFzKHRoaXMpJiYoUmUuZGVsZXRlKHRoaXMpLHRoaXMudHJpZ2dlcigpKSl9bm90aWZ5KCl7dGhpcy5mbGFncyYyJiYhKHRoaXMuZmxhZ3MmMzIpfHx0aGlzLmZsYWdzJjh8fFVlKHRoaXMpfXJ1bigpe2lmKCEodGhpcy5mbGFncyYxKSlyZXR1cm4gdGhpcy5mbigpO3RoaXMuZmxhZ3N8PTIsaXQodGhpcyksS2UodGhpcyk7bGV0IGU9TGUsdD1ldDtMZT10aGlzLGV0PSEwO3RyeXtyZXR1cm4gdGhpcy5mbigpfWZpbmFsbHl7cWUodGhpcyksTGU9ZSxldD10LHRoaXMuZmxhZ3MmPS0zfX1zdG9wKCl7aWYodGhpcy5mbGFncyYxKXtmb3IobGV0IGU9dGhpcy5kZXBzO2U7ZT1lLm5leHREZXApWGUoZSk7dGhpcy5kZXBzPXRoaXMuZGVwc1RhaWw9dm9pZCAwLGl0KHRoaXMpLHRoaXMub25TdG9wJiZ0aGlzLm9uU3RvcCgpLHRoaXMuZmxhZ3MmPS0yfX10cmlnZ2VyKCl7dGhpcy5mbGFncyY2ND9SZS5hZGQodGhpcyk6dGhpcy5zY2hlZHVsZXI/dGhpcy5zY2hlZHVsZXIoKTp0aGlzLnJ1bklmRGlydHkoKX1ydW5JZkRpcnR5KCl7SmUodGhpcykmJnRoaXMucnVuKCl9Z2V0IGRpcnR5KCl7cmV0dXJuIEplKHRoaXMpfX0sQmU9MCxWZSxIZTtmdW5jdGlvbiBVZShlLHQ9ITEpe2lmKGUuZmxhZ3N8PTgsdCl7ZS5uZXh0PUhlLEhlPWU7cmV0dXJufWUubmV4dD1WZSxWZT1lfWZ1bmN0aW9uIFdlKCl7QmUrK31mdW5jdGlvbiBHZSgpe2lmKC0tQmU+MClyZXR1cm47aWYoSGUpe2xldCBlPUhlO2ZvcihIZT12b2lkIDA7ZTspe2xldCB0PWUubmV4dDtlLm5leHQ9dm9pZCAwLGUuZmxhZ3MmPS05LGU9dH19bGV0IGU7Zm9yKDtWZTspe2xldCB0PVZlO2ZvcihWZT12b2lkIDA7dDspe2xldCBuPXQubmV4dDtpZih0Lm5leHQ9dm9pZCAwLHQuZmxhZ3MmPS05LHQuZmxhZ3MmMSl0cnl7dC50cmlnZ2VyKCl9Y2F0Y2godCl7ZXx8PXR9dD1ufX1pZihlKXRocm93IGV9ZnVuY3Rpb24gS2UoZSl7Zm9yKGxldCB0PWUuZGVwczt0O3Q9dC5uZXh0RGVwKXQudmVyc2lvbj0tMSx0LnByZXZBY3RpdmVMaW5rPXQuZGVwLmFjdGl2ZUxpbmssdC5kZXAuYWN0aXZlTGluaz10fWZ1bmN0aW9uIHFlKGUpe2xldCB0LG49ZS5kZXBzVGFpbCxyPW47Zm9yKDtyOyl7bGV0IGU9ci5wcmV2RGVwO3IudmVyc2lvbj09PS0xPyhyPT09biYmKG49ZSksWGUociksWmUocikpOnQ9cixyLmRlcC5hY3RpdmVMaW5rPXIucHJldkFjdGl2ZUxpbmssci5wcmV2QWN0aXZlTGluaz12b2lkIDAscj1lfWUuZGVwcz10LGUuZGVwc1RhaWw9bn1mdW5jdGlvbiBKZShlKXtmb3IobGV0IHQ9ZS5kZXBzO3Q7dD10Lm5leHREZXApaWYodC5kZXAudmVyc2lvbiE9PXQudmVyc2lvbnx8dC5kZXAuY29tcHV0ZWQmJihZZSh0LmRlcC5jb21wdXRlZCl8fHQuZGVwLnZlcnNpb24hPT10LnZlcnNpb24pKXJldHVybiEwO3JldHVybiEhZS5fZGlydHl9ZnVuY3Rpb24gWWUoZSl7aWYoZS5mbGFncyY0JiYhKGUuZmxhZ3MmMTYpfHwoZS5mbGFncyY9LTE3LGUuZ2xvYmFsVmVyc2lvbj09PWF0KXx8KGUuZ2xvYmFsVmVyc2lvbj1hdCwhZS5pc1NTUiYmZS5mbGFncyYxMjgmJighZS5kZXBzJiYhZS5fZGlydHl8fCFKZShlKSkpKXJldHVybjtlLmZsYWdzfD0yO2xldCB0PWUuZGVwLG49TGUscj1ldDtMZT1lLGV0PSEwO3RyeXtLZShlKTtsZXQgbj1lLmZuKGUuX3ZhbHVlKTsodC52ZXJzaW9uPT09MHx8RChuLGUuX3ZhbHVlKSkmJihlLmZsYWdzfD0xMjgsZS5fdmFsdWU9bix0LnZlcnNpb24rKyl9Y2F0Y2goZSl7dGhyb3cgdC52ZXJzaW9uKyssZX1maW5hbGx5e0xlPW4sZXQ9cixxZShlKSxlLmZsYWdzJj0tM319ZnVuY3Rpb24gWGUoZSx0PSExKXtsZXR7ZGVwOm4scHJldlN1YjpyLG5leHRTdWI6aX09ZTtpZihyJiYoci5uZXh0U3ViPWksZS5wcmV2U3ViPXZvaWQgMCksaSYmKGkucHJldlN1Yj1yLGUubmV4dFN1Yj12b2lkIDApLG4uc3Vicz09PWUmJihuLnN1YnM9ciwhciYmbi5jb21wdXRlZCkpe24uY29tcHV0ZWQuZmxhZ3MmPS01O2ZvcihsZXQgZT1uLmNvbXB1dGVkLmRlcHM7ZTtlPWUubmV4dERlcClYZShlLCEwKX0hdCYmIS0tbi5zYyYmbi5tYXAmJm4ubWFwLmRlbGV0ZShuLmtleSl9ZnVuY3Rpb24gWmUoZSl7bGV0e3ByZXZEZXA6dCxuZXh0RGVwOm59PWU7dCYmKHQubmV4dERlcD1uLGUucHJldkRlcD12b2lkIDApLG4mJihuLnByZXZEZXA9dCxlLm5leHREZXA9dm9pZCAwKX1mdW5jdGlvbiBRZShlLHQpe2UuZWZmZWN0IGluc3RhbmNlb2YgemUmJihlPWUuZWZmZWN0LmZuKTtsZXQgbj1uZXcgemUoZSk7dCYmbChuLHQpO3RyeXtuLnJ1bigpfWNhdGNoKGUpe3Rocm93IG4uc3RvcCgpLGV9bGV0IHI9bi5ydW4uYmluZChuKTtyZXR1cm4gci5lZmZlY3Q9bixyfWZ1bmN0aW9uICRlKGUpe2UuZWZmZWN0LnN0b3AoKX12YXIgZXQ9ITAsdHQ9W107ZnVuY3Rpb24gbnQoKXt0dC5wdXNoKGV0KSxldD0hMX1mdW5jdGlvbiBydCgpe2xldCBlPXR0LnBvcCgpO2V0PWU9PT12b2lkIDB8fGV9ZnVuY3Rpb24gaXQoZSl7bGV0e2NsZWFudXA6dH09ZTtpZihlLmNsZWFudXA9dm9pZCAwLHQpe2xldCBlPUxlO0xlPXZvaWQgMDt0cnl7dCgpfWZpbmFsbHl7TGU9ZX19fXZhciBhdD0wLG90PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zdWI9ZSx0aGlzLmRlcD10LHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5uZXh0RGVwPXRoaXMucHJldkRlcD10aGlzLm5leHRTdWI9dGhpcy5wcmV2U3ViPXRoaXMucHJldkFjdGl2ZUxpbms9dm9pZCAwfX0sc3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jb21wdXRlZD1lLHRoaXMudmVyc2lvbj0wLHRoaXMuYWN0aXZlTGluaz12b2lkIDAsdGhpcy5zdWJzPXZvaWQgMCx0aGlzLm1hcD12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMuc2M9MCx0aGlzLl9fdl9za2lwPSEwfXRyYWNrKGUpe2lmKCFMZXx8IWV0fHxMZT09PXRoaXMuY29tcHV0ZWQpcmV0dXJuO2xldCB0PXRoaXMuYWN0aXZlTGluaztpZih0PT09dm9pZCAwfHx0LnN1YiE9PUxlKXQ9dGhpcy5hY3RpdmVMaW5rPW5ldyBvdChMZSx0aGlzKSxMZS5kZXBzPyh0LnByZXZEZXA9TGUuZGVwc1RhaWwsTGUuZGVwc1RhaWwubmV4dERlcD10LExlLmRlcHNUYWlsPXQpOkxlLmRlcHM9TGUuZGVwc1RhaWw9dCxjdCh0KTtlbHNlIGlmKHQudmVyc2lvbj09PS0xJiYodC52ZXJzaW9uPXRoaXMudmVyc2lvbix0Lm5leHREZXApKXtsZXQgZT10Lm5leHREZXA7ZS5wcmV2RGVwPXQucHJldkRlcCx0LnByZXZEZXAmJih0LnByZXZEZXAubmV4dERlcD1lKSx0LnByZXZEZXA9TGUuZGVwc1RhaWwsdC5uZXh0RGVwPXZvaWQgMCxMZS5kZXBzVGFpbC5uZXh0RGVwPXQsTGUuZGVwc1RhaWw9dCxMZS5kZXBzPT09dCYmKExlLmRlcHM9ZSl9cmV0dXJuIHR9dHJpZ2dlcihlKXt0aGlzLnZlcnNpb24rKyxhdCsrLHRoaXMubm90aWZ5KGUpfW5vdGlmeShlKXtXZSgpO3RyeXtmb3IobGV0IGU9dGhpcy5zdWJzO2U7ZT1lLnByZXZTdWIpZS5zdWIubm90aWZ5KCkmJmUuc3ViLmRlcC5ub3RpZnkoKX1maW5hbGx5e0dlKCl9fX07ZnVuY3Rpb24gY3QoZSl7aWYoZS5kZXAuc2MrKyxlLnN1Yi5mbGFncyY0KXtsZXQgdD1lLmRlcC5jb21wdXRlZDtpZih0JiYhZS5kZXAuc3Vicyl7dC5mbGFnc3w9MjA7Zm9yKGxldCBlPXQuZGVwcztlO2U9ZS5uZXh0RGVwKWN0KGUpfWxldCBuPWUuZGVwLnN1YnM7biE9PWUmJihlLnByZXZTdWI9bixuJiYobi5uZXh0U3ViPWUpKSxlLmRlcC5zdWJzPWV9fXZhciBsdD1uZXcgV2Vha01hcCx1dD1TeW1ib2woYGApLGR0PVN5bWJvbChgYCksZnQ9U3ltYm9sKGBgKTtmdW5jdGlvbiBwdChlLHQsbil7aWYoZXQmJkxlKXtsZXQgdD1sdC5nZXQoZSk7dHx8bHQuc2V0KGUsdD1uZXcgTWFwKTtsZXQgcj10LmdldChuKTtyfHwodC5zZXQobixyPW5ldyBzdCksci5tYXA9dCxyLmtleT1uKSxyLnRyYWNrKCl9fWZ1bmN0aW9uIG10KGUsdCxuLHIsaSxhKXtsZXQgbz1sdC5nZXQoZSk7aWYoIW8pe2F0Kys7cmV0dXJufWxldCBzPWU9PntlJiZlLnRyaWdnZXIoKX07aWYoV2UoKSx0PT09YGNsZWFyYClvLmZvckVhY2gocyk7ZWxzZXtsZXQgaT1wKGUpLGE9aSYmVChuKTtpZihpJiZuPT09YGxlbmd0aGApe2xldCBlPU51bWJlcihyKTtvLmZvckVhY2goKHQsbik9Pnsobj09PWBsZW5ndGhgfHxuPT09ZnR8fCFiKG4pJiZuPj1lKSYmcyh0KX0pfWVsc2Ugc3dpdGNoKChuIT09dm9pZCAwfHxvLmhhcyh2b2lkIDApKSYmcyhvLmdldChuKSksYSYmcyhvLmdldChmdCkpLHQpe2Nhc2VgYWRkYDppP2EmJnMoby5nZXQoYGxlbmd0aGApKToocyhvLmdldCh1dCkpLG0oZSkmJnMoby5nZXQoZHQpKSk7YnJlYWs7Y2FzZWBkZWxldGVgOml8fChzKG8uZ2V0KHV0KSksbShlKSYmcyhvLmdldChkdCkpKTticmVhaztjYXNlYHNldGA6bShlKSYmcyhvLmdldCh1dCkpfX1HZSgpfWZ1bmN0aW9uIGh0KGUsdCl7bGV0IG49bHQuZ2V0KGUpO3JldHVybiBuJiZuLmdldCh0KX1mdW5jdGlvbiBndChlKXtsZXQgdD1BKGUpO3JldHVybiB0PT09ZT90OihwdCh0LGBpdGVyYXRlYCxmdCksYW4oZSk/dDp0Lm1hcChjbikpfWZ1bmN0aW9uIF90KGUpe3JldHVybiBwdChlPUEoZSksYGl0ZXJhdGVgLGZ0KSxlfWZ1bmN0aW9uIHZ0KGUsdCl7cmV0dXJuIHJuKGUpP2xuKG5uKGUpP2NuKHQpOnQpOmNuKHQpfXZhciB5dD17X19wcm90b19fOm51bGwsW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gYnQodGhpcyxTeW1ib2wuaXRlcmF0b3IsZT0+dnQodGhpcyxlKSl9LGNvbmNhdCguLi5lKXtyZXR1cm4gZ3QodGhpcykuY29uY2F0KC4uLmUubWFwKGU9PnAoZSk/Z3QoZSk6ZSkpfSxlbnRyaWVzKCl7cmV0dXJuIGJ0KHRoaXMsYGVudHJpZXNgLGU9PihlWzFdPXZ0KHRoaXMsZVsxXSksZSkpfSxldmVyeShlLHQpe3JldHVybiBTdCh0aGlzLGBldmVyeWAsZSx0LHZvaWQgMCxhcmd1bWVudHMpfSxmaWx0ZXIoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmlsdGVyYCxlLHQsZT0+ZS5tYXAoZT0+dnQodGhpcyxlKSksYXJndW1lbnRzKX0sZmluZChlLHQpe3JldHVybiBTdCh0aGlzLGBmaW5kYCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kSW5kZXgoZSx0KXtyZXR1cm4gU3QodGhpcyxgZmluZEluZGV4YCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGZpbmRMYXN0KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0YCxlLHQsZT0+dnQodGhpcyxlKSxhcmd1bWVudHMpfSxmaW5kTGFzdEluZGV4KGUsdCl7cmV0dXJuIFN0KHRoaXMsYGZpbmRMYXN0SW5kZXhgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sZm9yRWFjaChlLHQpe3JldHVybiBTdCh0aGlzLGBmb3JFYWNoYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LGluY2x1ZGVzKC4uLmUpe3JldHVybiB3dCh0aGlzLGBpbmNsdWRlc2AsZSl9LGluZGV4T2YoLi4uZSl7cmV0dXJuIHd0KHRoaXMsYGluZGV4T2ZgLGUpfSxqb2luKGUpe3JldHVybiBndCh0aGlzKS5qb2luKGUpfSxsYXN0SW5kZXhPZiguLi5lKXtyZXR1cm4gd3QodGhpcyxgbGFzdEluZGV4T2ZgLGUpfSxtYXAoZSx0KXtyZXR1cm4gU3QodGhpcyxgbWFwYCxlLHQsdm9pZCAwLGFyZ3VtZW50cyl9LHBvcCgpe3JldHVybiBUdCh0aGlzLGBwb3BgKX0scHVzaCguLi5lKXtyZXR1cm4gVHQodGhpcyxgcHVzaGAsZSl9LHJlZHVjZShlLC4uLnQpe3JldHVybiBDdCh0aGlzLGByZWR1Y2VgLGUsdCl9LHJlZHVjZVJpZ2h0KGUsLi4udCl7cmV0dXJuIEN0KHRoaXMsYHJlZHVjZVJpZ2h0YCxlLHQpfSxzaGlmdCgpe3JldHVybiBUdCh0aGlzLGBzaGlmdGApfSxzb21lKGUsdCl7cmV0dXJuIFN0KHRoaXMsYHNvbWVgLGUsdCx2b2lkIDAsYXJndW1lbnRzKX0sc3BsaWNlKC4uLmUpe3JldHVybiBUdCh0aGlzLGBzcGxpY2VgLGUpfSx0b1JldmVyc2VkKCl7cmV0dXJuIGd0KHRoaXMpLnRvUmV2ZXJzZWQoKX0sdG9Tb3J0ZWQoZSl7cmV0dXJuIGd0KHRoaXMpLnRvU29ydGVkKGUpfSx0b1NwbGljZWQoLi4uZSl7cmV0dXJuIGd0KHRoaXMpLnRvU3BsaWNlZCguLi5lKX0sdW5zaGlmdCguLi5lKXtyZXR1cm4gVHQodGhpcyxgdW5zaGlmdGAsZSl9LHZhbHVlcygpe3JldHVybiBidCh0aGlzLGB2YWx1ZXNgLGU9PnZ0KHRoaXMsZSkpfX07ZnVuY3Rpb24gYnQoZSx0LG4pe2xldCByPV90KGUpLGk9clt0XSgpO3JldHVybiByIT09ZSYmIWFuKGUpJiYoaS5fbmV4dD1pLm5leHQsaS5uZXh0PSgpPT57bGV0IGU9aS5fbmV4dCgpO3JldHVybiBlLmRvbmV8fChlLnZhbHVlPW4oZS52YWx1ZSkpLGV9KSxpfXZhciB4dD1BcnJheS5wcm90b3R5cGU7ZnVuY3Rpb24gU3QoZSx0LG4scixpLGEpe2xldCBvPV90KGUpLHM9byE9PWUmJiFhbihlKSxjPW9bdF07aWYoYyE9PXh0W3RdKXtsZXQgdD1jLmFwcGx5KGUsYSk7cmV0dXJuIHM/Y24odCk6dH1sZXQgbD1uO28hPT1lJiYocz9sPWZ1bmN0aW9uKHQscil7cmV0dXJuIG4uY2FsbCh0aGlzLHZ0KGUsdCkscixlKX06bi5sZW5ndGg+MiYmKGw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCxyLGUpfSkpO2xldCB1PWMuY2FsbChvLGwscik7cmV0dXJuIHMmJmk/aSh1KTp1fWZ1bmN0aW9uIEN0KGUsdCxuLHIpe2xldCBpPV90KGUpLGE9aSE9PWUmJiFhbihlKSxvPW4scz0hMTtpIT09ZSYmKGE/KHM9ci5sZW5ndGg9PT0wLG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBzJiYocz0hMSx0PXZ0KGUsdCkpLG4uY2FsbCh0aGlzLHQsdnQoZSxyKSxpLGUpfSk6bi5sZW5ndGg+MyYmKG89ZnVuY3Rpb24odCxyLGkpe3JldHVybiBuLmNhbGwodGhpcyx0LHIsaSxlKX0pKTtsZXQgYz1pW3RdKG8sLi4ucik7cmV0dXJuIHM/dnQoZSxjKTpjfWZ1bmN0aW9uIHd0KGUsdCxuKXtsZXQgcj1BKGUpO3B0KHIsYGl0ZXJhdGVgLGZ0KTtsZXQgaT1yW3RdKC4uLm4pO3JldHVybihpPT09LTF8fGk9PT0hMSkmJm9uKG5bMF0pPyhuWzBdPUEoblswXSksclt0XSguLi5uKSk6aX1mdW5jdGlvbiBUdChlLHQsbj1bXSl7bnQoKSxXZSgpO2xldCByPUEoZSlbdF0uYXBwbHkoZSxuKTtyZXR1cm4gR2UoKSxydCgpLHJ9dmFyIEV0PW4oYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApLER0PW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoZT0+ZSE9PWBhcmd1bWVudHNgJiZlIT09YGNhbGxlcmApLm1hcChlPT5TeW1ib2xbZV0pLmZpbHRlcihiKSk7ZnVuY3Rpb24gT3QoZSl7YihlKXx8KGU9U3RyaW5nKGUpKTtsZXQgdD1BKHRoaXMpO3JldHVybiBwdCh0LGBoYXNgLGUpLHQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGt0PWNsYXNze2NvbnN0cnVjdG9yKGU9ITEsdD0hMSl7dGhpcy5faXNSZWFkb25seT1lLHRoaXMuX2lzU2hhbGxvdz10fWdldChlLHQsbil7aWYodD09PWBfX3Zfc2tpcGApcmV0dXJuIGUuX192X3NraXA7bGV0IHI9dGhpcy5faXNSZWFkb25seSxpPXRoaXMuX2lzU2hhbGxvdztpZih0PT09YF9fdl9pc1JlYWN0aXZlYClyZXR1cm4hcjtpZih0PT09YF9fdl9pc1JlYWRvbmx5YClyZXR1cm4gcjtpZih0PT09YF9fdl9pc1NoYWxsb3dgKXJldHVybiBpO2lmKHQ9PT1gX192X3Jhd2ApcmV0dXJuIG49PT0ocj9pP1l0Okp0Omk/cXQ6S3QpLmdldChlKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pP2U6dm9pZCAwO2xldCBhPXAoZSk7aWYoIXIpe2xldCBlO2lmKGEmJihlPXl0W3RdKSlyZXR1cm4gZTtpZih0PT09YGhhc093blByb3BlcnR5YClyZXR1cm4gT3R9bGV0IG89UmVmbGVjdC5nZXQoZSx0LGooZSk/ZTpuKTtpZigoYih0KT9EdC5oYXModCk6RXQodCkpfHwocnx8cHQoZSxgZ2V0YCx0KSxpKSlyZXR1cm4gbztpZihqKG8pKXtsZXQgZT1hJiZUKHQpP286by52YWx1ZTtyZXR1cm4gciYmeChlKT8kdChlKTplfXJldHVybiB4KG8pP3I/JHQobyk6WnQobyk6b319LEF0PWNsYXNzIGV4dGVuZHMga3R7Y29uc3RydWN0b3IoZT0hMSl7c3VwZXIoITEsZSl9c2V0KGUsdCxuLHIpe2xldCBpPWVbdF0sYT1wKGUpJiZUKHQpO2lmKCF0aGlzLl9pc1NoYWxsb3cpe2xldCBlPXJuKGkpO2lmKCFhbihuKSYmIXJuKG4pJiYoaT1BKGkpLG49QShuKSksIWEmJmooaSkmJiFqKG4pKXJldHVybiBlfHwoaS52YWx1ZT1uKSwhMH1sZXQgbz1hP051bWJlcih0KTxlLmxlbmd0aDpmKGUsdCkscz1SZWZsZWN0LnNldChlLHQsbixqKGUpP2U6cik7cmV0dXJuIGU9PT1BKHIpJiZzJiYobz9EKG4saSkmJm10KGUsYHNldGAsdCxuLGkpOm10KGUsYGFkZGAsdCxuKSksc31kZWxldGVQcm9wZXJ0eShlLHQpe2xldCBuPWYoZSx0KSxyPWVbdF0saT1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsdCk7cmV0dXJuIGkmJm4mJm10KGUsYGRlbGV0ZWAsdCx2b2lkIDAsciksaX1oYXMoZSx0KXtsZXQgbj1SZWZsZWN0LmhhcyhlLHQpO3JldHVybighYih0KXx8IUR0Lmhhcyh0KSkmJnB0KGUsYGhhc2AsdCksbn1vd25LZXlzKGUpe3JldHVybiBwdChlLGBpdGVyYXRlYCxwKGUpP2BsZW5ndGhgOnV0KSxSZWZsZWN0Lm93bktleXMoZSl9fSxqdD1jbGFzcyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKGU9ITEpe3N1cGVyKCEwLGUpfXNldChlLHQpe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KGUsdCl7cmV0dXJuITB9fSxNdD1uZXcgQXQsTnQ9bmV3IGp0LFB0PW5ldyBBdCghMCksRnQ9bmV3IGp0KCEwKSxJdD1lPT5lLEx0PWU9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSk7ZnVuY3Rpb24gUnQoZSx0LG4pe3JldHVybiBmdW5jdGlvbiguLi5yKXtsZXQgaT10aGlzLl9fdl9yYXcsYT1BKGkpLG89bShhKSxzPWU9PT1gZW50cmllc2B8fGU9PT1TeW1ib2wuaXRlcmF0b3ImJm8sYz1lPT09YGtleXNgJiZvLHU9aVtlXSguLi5yKSxkPW4/SXQ6dD9sbjpjbjtyZXR1cm4hdCYmcHQoYSxgaXRlcmF0ZWAsYz9kdDp1dCksbChPYmplY3QuY3JlYXRlKHUpLHtuZXh0KCl7bGV0e3ZhbHVlOmUsZG9uZTp0fT11Lm5leHQoKTtyZXR1cm4gdD97dmFsdWU6ZSxkb25lOnR9Ont2YWx1ZTpzP1tkKGVbMF0pLGQoZVsxXSldOmQoZSksZG9uZTp0fX19KX19ZnVuY3Rpb24genQoZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLnQpe3JldHVybiBlPT09YGRlbGV0ZWA/ITE6ZT09PWBjbGVhcmA/dm9pZCAwOnRoaXN9fWZ1bmN0aW9uIEJ0KGUsdCl7bGV0IG49e2dldChuKXtsZXQgcj10aGlzLl9fdl9yYXcsaT1BKHIpLGE9QShuKTtlfHwoRChuLGEpJiZwdChpLGBnZXRgLG4pLHB0KGksYGdldGAsYSkpO2xldHtoYXM6b309THQoaSkscz10P0l0OmU/bG46Y247aWYoby5jYWxsKGksbikpcmV0dXJuIHMoci5nZXQobikpO2lmKG8uY2FsbChpLGEpKXJldHVybiBzKHIuZ2V0KGEpKTtyIT09aSYmci5nZXQobil9LGdldCBzaXplKCl7bGV0IHQ9dGhpcy5fX3ZfcmF3O3JldHVybiFlJiZwdChBKHQpLGBpdGVyYXRlYCx1dCksdC5zaXplfSxoYXModCl7bGV0IG49dGhpcy5fX3ZfcmF3LHI9QShuKSxpPUEodCk7cmV0dXJuIGV8fChEKHQsaSkmJnB0KHIsYGhhc2AsdCkscHQocixgaGFzYCxpKSksdD09PWk/bi5oYXModCk6bi5oYXModCl8fG4uaGFzKGkpfSxmb3JFYWNoKG4scil7bGV0IGk9dGhpcyxhPWkuX192X3JhdyxvPUEoYSkscz10P0l0OmU/bG46Y247cmV0dXJuIWUmJnB0KG8sYGl0ZXJhdGVgLHV0KSxhLmZvckVhY2goKGUsdCk9Pm4uY2FsbChyLHMoZSkscyh0KSxpKSl9fTtyZXR1cm4gbChuLGU/e2FkZDp6dChgYWRkYCksc2V0Onp0KGBzZXRgKSxkZWxldGU6enQoYGRlbGV0ZWApLGNsZWFyOnp0KGBjbGVhcmApfTp7YWRkKGUpe2xldCBuPUEodGhpcykscj1MdChuKSxpPUEoZSksYT0hdCYmIWFuKGUpJiYhcm4oZSk/aTplO3JldHVybiByLmhhcy5jYWxsKG4sYSl8fEQoZSxhKSYmci5oYXMuY2FsbChuLGUpfHxEKGksYSkmJnIuaGFzLmNhbGwobixpKXx8KG4uYWRkKGEpLG10KG4sYGFkZGAsYSxhKSksdGhpc30sc2V0KGUsbil7IXQmJiFhbihuKSYmIXJuKG4pJiYobj1BKG4pKTtsZXQgcj1BKHRoaXMpLHtoYXM6aSxnZXQ6YX09THQociksbz1pLmNhbGwocixlKTtvfHw9KGU9QShlKSxpLmNhbGwocixlKSk7bGV0IHM9YS5jYWxsKHIsZSk7cmV0dXJuIHIuc2V0KGUsbiksbz9EKG4scykmJm10KHIsYHNldGAsZSxuLHMpOm10KHIsYGFkZGAsZSxuKSx0aGlzfSxkZWxldGUoZSl7bGV0IHQ9QSh0aGlzKSx7aGFzOm4sZ2V0OnJ9PUx0KHQpLGk9bi5jYWxsKHQsZSk7aXx8PShlPUEoZSksbi5jYWxsKHQsZSkpO2xldCBhPXI/ci5jYWxsKHQsZSk6dm9pZCAwLG89dC5kZWxldGUoZSk7cmV0dXJuIGkmJm10KHQsYGRlbGV0ZWAsZSx2b2lkIDAsYSksb30sY2xlYXIoKXtsZXQgZT1BKHRoaXMpLHQ9ZS5zaXplIT09MCxuPWUuY2xlYXIoKTtyZXR1cm4gdCYmbXQoZSxgY2xlYXJgLHZvaWQgMCx2b2lkIDAsdm9pZCAwKSxufX0pLFtga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChyPT57bltyXT1SdChyLGUsdCl9KSxufWZ1bmN0aW9uIFZ0KGUsdCl7bGV0IG49QnQoZSx0KTtyZXR1cm4odCxyLGkpPT5yPT09YF9fdl9pc1JlYWN0aXZlYD8hZTpyPT09YF9fdl9pc1JlYWRvbmx5YD9lOnI9PT1gX192X3Jhd2A/dDpSZWZsZWN0LmdldChmKG4scikmJnIgaW4gdD9uOnQscixpKX12YXIgSHQ9e2dldDpWdCghMSwhMSl9LFV0PXtnZXQ6VnQoITEsITApfSxXdD17Z2V0OlZ0KCEwLCExKX0sR3Q9e2dldDpWdCghMCwhMCl9LEt0PW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLEp0PW5ldyBXZWFrTWFwLFl0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFh0KGUpe3N3aXRjaChlKXtjYXNlYE9iamVjdGA6Y2FzZWBBcnJheWA6cmV0dXJuIDE7Y2FzZWBNYXBgOmNhc2VgU2V0YDpjYXNlYFdlYWtNYXBgOmNhc2VgV2Vha1NldGA6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gWnQoZSl7cmV0dXJuIHJuKGUpP2U6dG4oZSwhMSxNdCxIdCxLdCl9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIHRuKGUsITEsUHQsVXQscXQpfWZ1bmN0aW9uICR0KGUpe3JldHVybiB0bihlLCEwLE50LFd0LEp0KX1mdW5jdGlvbiBlbihlKXtyZXR1cm4gdG4oZSwhMCxGdCxHdCxZdCl9ZnVuY3Rpb24gdG4oZSx0LG4scixpKXtpZigheChlKXx8ZS5fX3ZfcmF3JiYhKHQmJmUuX192X2lzUmVhY3RpdmUpfHxlLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSlyZXR1cm4gZTtsZXQgYT1pLmdldChlKTtpZihhKXJldHVybiBhO2xldCBvPVh0KGVlKGUpKTtpZihvPT09MClyZXR1cm4gZTtsZXQgcz1uZXcgUHJveHkoZSxvPT09Mj9yOm4pO3JldHVybiBpLnNldChlLHMpLHN9ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIHJuKGUpP25uKGUuX192X3Jhdyk6ISEoZSYmZS5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gcm4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuISEoZSYmZS5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZT8hIWUuX192X3JhdzohMX1mdW5jdGlvbiBBKGUpe2xldCB0PWUmJmUuX192X3JhdztyZXR1cm4gdD9BKHQpOmV9ZnVuY3Rpb24gc24oZSl7cmV0dXJuIWYoZSxgX192X3NraXBgKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmdWUoZSxgX192X3NraXBgLCEwKSxlfXZhciBjbj1lPT54KGUpP1p0KGUpOmUsbG49ZT0+eChlKT8kdChlKTplO2Z1bmN0aW9uIGooZSl7cmV0dXJuIGU/ZS5fX3ZfaXNSZWY9PT0hMDohMX1mdW5jdGlvbiBNKGUpe3JldHVybiBkbihlLCExKX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZG4oZSwhMCl9ZnVuY3Rpb24gZG4oZSx0KXtyZXR1cm4gaihlKT9lOm5ldyBmbihlLHQpfXZhciBmbj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVwPW5ldyBzdCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1NoYWxsb3c9ITEsdGhpcy5fcmF3VmFsdWU9dD9lOkEoZSksdGhpcy5fdmFsdWU9dD9lOmNuKGUpLHRoaXMuX192X2lzU2hhbGxvdz10fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLmRlcC50cmFjaygpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShlKXtsZXQgdD10aGlzLl9yYXdWYWx1ZSxuPXRoaXMuX192X2lzU2hhbGxvd3x8YW4oZSl8fHJuKGUpO2U9bj9lOkEoZSksRChlLHQpJiYodGhpcy5fcmF3VmFsdWU9ZSx0aGlzLl92YWx1ZT1uP2U6Y24oZSksdGhpcy5kZXAudHJpZ2dlcigpKX19O2Z1bmN0aW9uIHBuKGUpe2UuZGVwJiZlLmRlcC50cmlnZ2VyKCl9ZnVuY3Rpb24gTihlKXtyZXR1cm4gaihlKT9lLnZhbHVlOmV9ZnVuY3Rpb24gbW4oZSl7cmV0dXJuIHYoZSk/ZSgpOk4oZSl9dmFyIGhuPXtnZXQ6KGUsdCxuKT0+dD09PWBfX3ZfcmF3YD9lOk4oUmVmbGVjdC5nZXQoZSx0LG4pKSxzZXQ6KGUsdCxuLHIpPT57bGV0IGk9ZVt0XTtyZXR1cm4gaihpKSYmIWoobik/KGkudmFsdWU9biwhMCk6UmVmbGVjdC5zZXQoZSx0LG4scil9fTtmdW5jdGlvbiBnbihlKXtyZXR1cm4gbm4oZSk/ZTpuZXcgUHJveHkoZSxobil9dmFyIF9uPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMDtsZXQgdD10aGlzLmRlcD1uZXcgc3Qse2dldDpuLHNldDpyfT1lKHQudHJhY2suYmluZCh0KSx0LnRyaWdnZXIuYmluZCh0KSk7dGhpcy5fZ2V0PW4sdGhpcy5fc2V0PXJ9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldCgpfXNldCB2YWx1ZShlKXt0aGlzLl9zZXQoZSl9fTtmdW5jdGlvbiB2bihlKXtyZXR1cm4gbmV3IF9uKGUpfWZ1bmN0aW9uIHluKGUpe2xldCB0PXAoZSk/QXJyYXkoZS5sZW5ndGgpOnt9O2ZvcihsZXQgbiBpbiBlKXRbbl09Q24oZSxuKTtyZXR1cm4gdH12YXIgYm49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX29iamVjdD1lLHRoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9rZXk9Yih0KT90OlN0cmluZyh0KSx0aGlzLl9yYXc9QShlKTtsZXQgcj0hMCxpPWU7aWYoIXAoZSl8fGIodGhpcy5fa2V5KXx8IVQodGhpcy5fa2V5KSlkbyByPSFvbihpKXx8YW4oaSk7d2hpbGUociYmKGk9aS5fX3ZfcmF3KSk7dGhpcy5fc2hhbGxvdz1yfWdldCB2YWx1ZSgpe2xldCBlPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiB0aGlzLl9zaGFsbG93JiYoZT1OKGUpKSx0aGlzLl92YWx1ZT1lPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTplfXNldCB2YWx1ZShlKXtpZih0aGlzLl9zaGFsbG93JiZqKHRoaXMuX3Jhd1t0aGlzLl9rZXldKSl7bGV0IHQ9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07aWYoaih0KSl7dC52YWx1ZT1lO3JldHVybn19dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09ZX1nZXQgZGVwKCl7cmV0dXJuIGh0KHRoaXMuX3Jhdyx0aGlzLl9rZXkpfX0seG49Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fZ2V0dGVyPWUsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMCx0aGlzLl92YWx1ZT12b2lkIDB9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlPXRoaXMuX2dldHRlcigpfX07ZnVuY3Rpb24gU24oZSx0LG4pe3JldHVybiBqKGUpP2U6dihlKT9uZXcgeG4oZSk6eChlKSYmYXJndW1lbnRzLmxlbmd0aD4xP0NuKGUsdCxuKTpNKGUpfWZ1bmN0aW9uIENuKGUsdCxuKXtyZXR1cm4gbmV3IGJuKGUsdCxuKX12YXIgd249Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZm49ZSx0aGlzLnNldHRlcj10LHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLmRlcD1uZXcgc3QodGhpcyksdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5kZXBzPXZvaWQgMCx0aGlzLmRlcHNUYWlsPXZvaWQgMCx0aGlzLmZsYWdzPTE2LHRoaXMuZ2xvYmFsVmVyc2lvbj1hdC0xLHRoaXMubmV4dD12b2lkIDAsdGhpcy5lZmZlY3Q9dGhpcyx0aGlzLl9fdl9pc1JlYWRvbmx5PSF0LHRoaXMuaXNTU1I9bn1ub3RpZnkoKXtpZih0aGlzLmZsYWdzfD0xNiwhKHRoaXMuZmxhZ3MmOCkmJkxlIT09dGhpcylyZXR1cm4gVWUodGhpcywhMCksITB9Z2V0IHZhbHVlKCl7bGV0IGU9dGhpcy5kZXAudHJhY2soKTtyZXR1cm4gWWUodGhpcyksZSYmKGUudmVyc2lvbj10aGlzLmRlcC52ZXJzaW9uKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5zZXR0ZXImJnRoaXMuc2V0dGVyKGUpfX07ZnVuY3Rpb24gVG4oZSx0LG49ITEpe2xldCByLGk7cmV0dXJuIHYoZSk/cj1lOihyPWUuZ2V0LGk9ZS5zZXQpLG5ldyB3bihyLGksbil9dmFyIEVuPXtHRVQ6YGdldGAsSEFTOmBoYXNgLElURVJBVEU6YGl0ZXJhdGVgfSxEbj17U0VUOmBzZXRgLEFERDpgYWRkYCxERUxFVEU6YGRlbGV0ZWAsQ0xFQVI6YGNsZWFyYH0sT249e30sa249bmV3IFdlYWtNYXAsQW49dm9pZCAwO2Z1bmN0aW9uIGpuKCl7cmV0dXJuIEFufWZ1bmN0aW9uIE1uKGUsdD0hMSxuPUFuKXtpZihuKXtsZXQgdD1rbi5nZXQobik7dHx8a24uc2V0KG4sdD1bXSksdC5wdXNoKGUpfX1mdW5jdGlvbiBObihlLHQsbj1yKXtsZXR7aW1tZWRpYXRlOmksZGVlcDpvLG9uY2U6cyxzY2hlZHVsZXI6YyxhdWdtZW50Sm9iOmwsY2FsbDpkfT1uLGY9ZT0+bz9lOmFuKGUpfHxvPT09ITF8fG89PT0wP1BuKGUsMSk6UG4oZSksbSxoLGcsXyx5PSExLGI9ITE7aWYoaihlKT8oaD0oKT0+ZS52YWx1ZSx5PWFuKGUpKTpubihlKT8oaD0oKT0+ZihlKSx5PSEwKTpwKGUpPyhiPSEwLHk9ZS5zb21lKGU9Pm5uKGUpfHxhbihlKSksaD0oKT0+ZS5tYXAoZT0+e2lmKGooZSkpcmV0dXJuIGUudmFsdWU7aWYobm4oZSkpcmV0dXJuIGYoZSk7aWYodihlKSlyZXR1cm4gZD9kKGUsMik6ZSgpfSkpOmg9dihlKT90P2Q/KCk9PmQoZSwyKTplOigpPT57aWYoZyl7bnQoKTt0cnl7ZygpfWZpbmFsbHl7cnQoKX19bGV0IHQ9QW47QW49bTt0cnl7cmV0dXJuIGQ/ZChlLDMsW19dKTplKF8pfWZpbmFsbHl7QW49dH19OmEsdCYmbyl7bGV0IGU9aCx0PW89PT0hMD8xLzA6bztoPSgpPT5QbihlKCksdCl9bGV0IHg9RmUoKSxTPSgpPT57bS5zdG9wKCkseCYmeC5hY3RpdmUmJnUoeC5lZmZlY3RzLG0pfTtpZihzJiZ0KXtsZXQgZT10O3Q9KC4uLnQpPT57bGV0IG49ZSguLi50KTtyZXR1cm4gUygpLG59fWxldCBDPWI/QXJyYXkoZS5sZW5ndGgpLmZpbGwoT24pOk9uLHc9ZT0+e2lmKCEoIShtLmZsYWdzJjEpfHwhbS5kaXJ0eSYmIWUpKXtpZih0KXtsZXQgbj1tLnJ1bigpO2lmKGV8fG98fHl8fChiP24uc29tZSgoZSx0KT0+RChlLENbdF0pKTpEKG4sQykpKXtnJiZnKCk7bGV0IGU9QW47QW49bTt0cnl7bGV0IGU9W24sQz09PU9uP3ZvaWQgMDpiJiZDWzBdPT09T24/W106QyxfXTtDPW4sZD9kKHQsMyxlKTp0KC4uLmUpfWZpbmFsbHl7QW49ZX19fWVsc2UgbS5ydW4oKX19O3JldHVybiBsJiZsKHcpLG09bmV3IHplKGgpLG0uc2NoZWR1bGVyPWM/KCk9PmModywhMSk6dyxfPWU9Pk1uKGUsITEsbSksZz1tLm9uU3RvcD0oKT0+e2xldCBlPWtuLmdldChtKTtpZihlKXtpZihkKWQoZSw0KTtlbHNlIGZvcihsZXQgdCBvZiBlKXQoKTtrbi5kZWxldGUobSl9fSx0P2k/dyghMCk6Qz1tLnJ1bigpOmM/Yyh3LmJpbmQobnVsbCwhMCksITApOm0ucnVuKCksUy5wYXVzZT1tLnBhdXNlLmJpbmQobSksUy5yZXN1bWU9bS5yZXN1bWUuYmluZChtKSxTLnN0b3A9UyxTfWZ1bmN0aW9uIFBuKGUsdD0xLzAsbil7aWYodDw9MHx8IXgoZSl8fGUuX192X3NraXB8fChufHw9bmV3IE1hcCwobi5nZXQoZSl8fDApPj10KSlyZXR1cm4gZTtpZihuLnNldChlLHQpLHQtLSxqKGUpKVBuKGUudmFsdWUsdCxuKTtlbHNlIGlmKHAoZSkpZm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspUG4oZVtyXSx0LG4pO2Vsc2UgaWYoaChlKXx8bShlKSllLmZvckVhY2goZT0+e1BuKGUsdCxuKX0pO2Vsc2UgaWYodGUoZSkpe2ZvcihsZXQgciBpbiBlKVBuKGVbcl0sdCxuKTtmb3IobGV0IHIgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSlPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmUG4oZVtyXSx0LG4pfXJldHVybiBlfXZhciBGbj1bXTtmdW5jdGlvbiBJbihlKXtGbi5wdXNoKGUpfWZ1bmN0aW9uIExuKCl7Rm4ucG9wKCl9ZnVuY3Rpb24gUm4oZSx0KXt9dmFyIHpuPXtTRVRVUF9GVU5DVElPTjowLDA6YFNFVFVQX0ZVTkNUSU9OYCxSRU5ERVJfRlVOQ1RJT046MSwxOmBSRU5ERVJfRlVOQ1RJT05gLE5BVElWRV9FVkVOVF9IQU5ETEVSOjUsNTpgTkFUSVZFX0VWRU5UX0hBTkRMRVJgLENPTVBPTkVOVF9FVkVOVF9IQU5ETEVSOjYsNjpgQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJgLFZOT0RFX0hPT0s6Nyw3OmBWTk9ERV9IT09LYCxESVJFQ1RJVkVfSE9PSzo4LDg6YERJUkVDVElWRV9IT09LYCxUUkFOU0lUSU9OX0hPT0s6OSw5OmBUUkFOU0lUSU9OX0hPT0tgLEFQUF9FUlJPUl9IQU5ETEVSOjEwLDEwOmBBUFBfRVJST1JfSEFORExFUmAsQVBQX1dBUk5fSEFORExFUjoxMSwxMTpgQVBQX1dBUk5fSEFORExFUmAsRlVOQ1RJT05fUkVGOjEyLDEyOmBGVU5DVElPTl9SRUZgLEFTWU5DX0NPTVBPTkVOVF9MT0FERVI6MTMsMTM6YEFTWU5DX0NPTVBPTkVOVF9MT0FERVJgLFNDSEVEVUxFUjoxNCwxNDpgU0NIRURVTEVSYCxDT01QT05FTlRfVVBEQVRFOjE1LDE1OmBDT01QT05FTlRfVVBEQVRFYCxBUFBfVU5NT1VOVF9DTEVBTlVQOjE2LDE2OmBBUFBfVU5NT1VOVF9DTEVBTlVQYH0sQm49e3NwOmBzZXJ2ZXJQcmVmZXRjaCBob29rYCxiYzpgYmVmb3JlQ3JlYXRlIGhvb2tgLGM6YGNyZWF0ZWQgaG9va2AsYm06YGJlZm9yZU1vdW50IGhvb2tgLG06YG1vdW50ZWQgaG9va2AsYnU6YGJlZm9yZVVwZGF0ZSBob29rYCx1OmB1cGRhdGVkYCxidW06YGJlZm9yZVVubW91bnQgaG9va2AsdW06YHVubW91bnRlZCBob29rYCxhOmBhY3RpdmF0ZWQgaG9va2AsZGE6YGRlYWN0aXZhdGVkIGhvb2tgLGVjOmBlcnJvckNhcHR1cmVkIGhvb2tgLHJ0YzpgcmVuZGVyVHJhY2tlZCBob29rYCxydGc6YHJlbmRlclRyaWdnZXJlZCBob29rYCwwOmBzZXR1cCBmdW5jdGlvbmAsMTpgcmVuZGVyIGZ1bmN0aW9uYCwyOmB3YXRjaGVyIGdldHRlcmAsMzpgd2F0Y2hlciBjYWxsYmFja2AsNDpgd2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uYCw1OmBuYXRpdmUgZXZlbnQgaGFuZGxlcmAsNjpgY29tcG9uZW50IGV2ZW50IGhhbmRsZXJgLDc6YHZub2RlIGhvb2tgLDg6YGRpcmVjdGl2ZSBob29rYCw5OmB0cmFuc2l0aW9uIGhvb2tgLDEwOmBhcHAgZXJyb3JIYW5kbGVyYCwxMTpgYXBwIHdhcm5IYW5kbGVyYCwxMjpgcmVmIGZ1bmN0aW9uYCwxMzpgYXN5bmMgY29tcG9uZW50IGxvYWRlcmAsMTQ6YHNjaGVkdWxlciBmbHVzaGAsMTU6YGNvbXBvbmVudCB1cGRhdGVgLDE2OmBhcHAgdW5tb3VudCBjbGVhbnVwIGZ1bmN0aW9uYH07ZnVuY3Rpb24gVm4oZSx0LG4scil7dHJ5e3JldHVybiByP2UoLi4ucik6ZSgpfWNhdGNoKGUpe1VuKGUsdCxuKX19ZnVuY3Rpb24gSG4oZSx0LG4scil7aWYodihlKSl7bGV0IGk9Vm4oZSx0LG4scik7cmV0dXJuIGkmJlMoaSkmJmkuY2F0Y2goZT0+e1VuKGUsdCxuKX0pLGl9aWYocChlKSl7bGV0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspaS5wdXNoKEhuKGVbYV0sdCxuLHIpKTtyZXR1cm4gaX19ZnVuY3Rpb24gVW4oZSx0LG4saT0hMCl7bGV0IGE9dD90LnZub2RlOm51bGwse2Vycm9ySGFuZGxlcjpvLHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb246c309dCYmdC5hcHBDb250ZXh0LmNvbmZpZ3x8cjtpZih0KXtsZXQgcj10LnBhcmVudCxpPXQucHJveHksYT1gaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSR7bn1gO2Zvcig7cjspe2xldCB0PXIuZWM7aWYodCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXShlLGksYSk9PT0hMSlyZXR1cm59cj1yLnBhcmVudH1pZihvKXtudCgpLFZuKG8sbnVsbCwxMCxbZSxpLGFdKSxydCgpO3JldHVybn19V24oZSxuLGEsaSxzKX1mdW5jdGlvbiBXbihlLHQsbixyPSEwLGk9ITEpe2lmKGkpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBHbj1bXSxLbj0tMSxxbj1bXSxKbj1udWxsLFluPTAsWG49UHJvbWlzZS5yZXNvbHZlKCksWm49bnVsbDtmdW5jdGlvbiBRbihlKXtsZXQgdD1abnx8WG47cmV0dXJuIGU/dC50aGVuKHRoaXM/ZS5iaW5kKHRoaXMpOmUpOnR9ZnVuY3Rpb24gJG4oZSl7bGV0IHQ9S24rMSxuPUduLmxlbmd0aDtmb3IoO3Q8bjspe2xldCByPXQrbj4+PjEsaT1HbltyXSxhPWFyKGkpO2E8ZXx8YT09PWUmJmkuZmxhZ3MmMj90PXIrMTpuPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gZXIoZSl7aWYoIShlLmZsYWdzJjEpKXtsZXQgdD1hcihlKSxuPUduW0duLmxlbmd0aC0xXTshbnx8IShlLmZsYWdzJjIpJiZ0Pj1hcihuKT9Hbi5wdXNoKGUpOkduLnNwbGljZSgkbih0KSwwLGUpLGUuZmxhZ3N8PTEsdHIoKX19ZnVuY3Rpb24gdHIoKXtabnx8PVhuLnRoZW4ob3IpfWZ1bmN0aW9uIG5yKGUpe2lmKCFwKGUpKUpuJiZlLmlkPT09LTE/Sm4uc3BsaWNlKFluKzEsMCxlKTplLmZsYWdzJjF8fChxbi5wdXNoKGUpLGUuZmxhZ3N8PTEpO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspcW4ucHVzaChlW3RdKTt0cigpfWZ1bmN0aW9uIHJyKGUsdCxuPUtuKzEpe2Zvcig7bjxHbi5sZW5ndGg7bisrKXtsZXQgdD1HbltuXTtpZih0JiZ0LmZsYWdzJjIpe2lmKGUmJnQuaWQhPT1lLnVpZCljb250aW51ZTtHbi5zcGxpY2UobiwxKSxuLS0sdC5mbGFncyY0JiYodC5mbGFncyY9LTIpLHQoKSx0LmZsYWdzJjR8fCh0LmZsYWdzJj0tMil9fX1mdW5jdGlvbiBpcihlKXtpZihxbi5sZW5ndGgpe2xldCBlPVsuLi5uZXcgU2V0KHFuKV0uc29ydCgoZSx0KT0+YXIoZSktYXIodCkpO2lmKHFuLmxlbmd0aD0wLEpuKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylKbi5wdXNoKGVbdF0pO3JldHVybn1mb3IoSm49ZSxZbj0wO1luPEpuLmxlbmd0aDtZbisrKXtsZXQgZT1KbltZbl07ZS5mbGFncyY0JiYoZS5mbGFncyY9LTIpLGUuZmxhZ3MmOHx8ZSgpLGUuZmxhZ3MmPS0yfUpuPW51bGwsWW49MH19dmFyIGFyPWU9PmUuaWQ9PW51bGw/ZS5mbGFncyYyPy0xOjEvMDplLmlkO2Z1bmN0aW9uIG9yKGUpe3RyeXtmb3IoS249MDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJiEoZS5mbGFncyY4KSYmKGUuZmxhZ3MmNCYmKGUuZmxhZ3MmPS0yKSxWbihlLGUuaSxlLmk/MTU6MTQpLGUuZmxhZ3MmNHx8KGUuZmxhZ3MmPS0yKSl9fWZpbmFsbHl7Zm9yKDtLbjxHbi5sZW5ndGg7S24rKyl7bGV0IGU9R25bS25dO2UmJihlLmZsYWdzJj0tMil9S249LTEsR24ubGVuZ3RoPTAsaXIoZSksWm49bnVsbCwoR24ubGVuZ3RofHxxbi5sZW5ndGgpJiZvcihlKX19dmFyIHNyLGNyPVtdO2Z1bmN0aW9uIGxyKGUsdCl7c3I9ZSxzcj8oc3IuZW5hYmxlZD0hMCxjci5mb3JFYWNoKCh7ZXZlbnQ6ZSxhcmdzOnR9KT0+c3IuZW1pdChlLC4uLnQpKSxjcj1bXSk6dHlwZW9mIHdpbmRvdzxgdWAmJndpbmRvdy5IVE1MRWxlbWVudCYmISh3aW5kb3cubmF2aWdhdG9yPy51c2VyQWdlbnQpPy5pbmNsdWRlcyhganNkb21gKT8oKHQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz10Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdKS5wdXNoKGU9PntscihlLHQpfSksc2V0VGltZW91dCgoKT0+e3NyfHwodC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsY3I9W10pfSwzZTMpKTpjcj1bXX12YXIgdXI9bnVsbCxkcj1udWxsO2Z1bmN0aW9uIGZyKGUpe2xldCB0PXVyO3JldHVybiB1cj1lLGRyPWUmJmUudHlwZS5fX3Njb3BlSWR8fG51bGwsdH1mdW5jdGlvbiBwcihlKXtkcj1lfWZ1bmN0aW9uIG1yKCl7ZHI9bnVsbH12YXIgaHI9ZT0+UDtmdW5jdGlvbiBQKGUsdD11cixuKXtpZighdHx8ZS5fbilyZXR1cm4gZTtsZXQgcj0oLi4ubik9PntyLl9kJiZtcygtMSk7bGV0IGk9ZnIodCksYT11cy5sZW5ndGgsbzt0cnl7bz1lKC4uLm4pfWZpbmFsbHl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPmE7ZS0tKWZzKCk7ZnIoaSksci5fZCYmbXMoMSl9cmV0dXJuIG99O3JldHVybiByLl9uPSEwLHIuX2M9ITAsci5fZD0hMCxyfWZ1bmN0aW9uIGdyKGUsdCl7aWYodXI9PT1udWxsKXJldHVybiBlO2xldCBuPVFzKHVyKSxpPWUuZGlyc3x8PVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXRbYSxvLHMsYz1yXT10W2VdO2EmJih2KGEpJiYoYT17bW91bnRlZDphLHVwZGF0ZWQ6YX0pLGEuZGVlcCYmUG4obyksaS5wdXNoKHtkaXI6YSxpbnN0YW5jZTpuLHZhbHVlOm8sb2xkVmFsdWU6dm9pZCAwLGFyZzpzLG1vZGlmaWVyczpjfSkpfXJldHVybiBlfWZ1bmN0aW9uIF9yKGUsdCxuLHIpe2xldCBpPWUuZGlycyxhPXQmJnQuZGlycztmb3IobGV0IG89MDtvPGkubGVuZ3RoO28rKyl7bGV0IHM9aVtvXTthJiYocy5vbGRWYWx1ZT1hW29dLnZhbHVlKTtsZXQgYz1zLmRpcltyXTtjJiYobnQoKSxIbihjLG4sOCxbZS5lbCxzLGUsdF0pLHJ0KCkpfX1mdW5jdGlvbiB2cihlLHQpe2lmKFBzKXtsZXQgbj1Qcy5wcm92aWRlcyxyPVBzLnBhcmVudCYmUHMucGFyZW50LnByb3ZpZGVzO3I9PT1uJiYobj1Qcy5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHIpKSxuW2VdPXR9fWZ1bmN0aW9uIHlyKGUsdCxuPSExKXtsZXQgcj1GcygpO2lmKHJ8fG5vKXtsZXQgaT1ubz9uby5fY29udGV4dC5wcm92aWRlczpyP3IucGFyZW50PT1udWxsfHxyLmNlP3Iudm5vZGUuYXBwQ29udGV4dCYmci52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnIucGFyZW50LnByb3ZpZGVzOnZvaWQgMDtpZihpJiZlIGluIGkpcmV0dXJuIGlbZV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBuJiZ2KHQpP3QuY2FsbChyJiZyLnByb3h5KTp0fX1mdW5jdGlvbiBicigpe3JldHVybiEhKEZzKCl8fG5vKX12YXIgeHI9U3ltYm9sLmZvcihgdi1zY3hgKSxTcj0oKT0+eXIoeHIpO2Z1bmN0aW9uIENyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx0KX1mdW5jdGlvbiB3cihlLHQpe3JldHVybiBEcihlLG51bGwse2ZsdXNoOmBwb3N0YH0pfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIERyKGUsbnVsbCx7Zmx1c2g6YHN5bmNgfSl9ZnVuY3Rpb24gRXIoZSx0LG4pe3JldHVybiBEcihlLHQsbil9ZnVuY3Rpb24gRHIoZSx0LG49cil7bGV0e2ltbWVkaWF0ZTppLGRlZXA6byxmbHVzaDpzLG9uY2U6Y309bix1PWwoe30sbiksZD10JiZpfHwhdCYmcyE9PWBwb3N0YCxmO2lmKFZzKXtpZihzPT09YHN5bmNgKXtsZXQgZT1TcigpO2Y9ZS5fX3dhdGNoZXJIYW5kbGVzfHw9W119ZWxzZSBpZighZCl7bGV0IGU9KCk9Pnt9O3JldHVybiBlLnN0b3A9YSxlLnJlc3VtZT1hLGUucGF1c2U9YSxlfX1sZXQgcD1Qczt1LmNhbGw9KGUsdCxuKT0+SG4oZSxwLHQsbik7bGV0IG09ITE7cz09PWBwb3N0YD91LnNjaGVkdWxlcj1lPT57SW8oZSxwJiZwLnN1c3BlbnNlKX06cyE9PWBzeW5jYCYmKG09ITAsdS5zY2hlZHVsZXI9KGUsdCk9Pnt0P2UoKTplcihlKX0pLHUuYXVnbWVudEpvYj1lPT57dCYmKGUuZmxhZ3N8PTQpLG0mJihlLmZsYWdzfD0yLHAmJihlLmlkPXAudWlkLGUuaT1wKSl9O2xldCBoPU5uKGUsdCx1KTtyZXR1cm4gVnMmJihmP2YucHVzaChoKTpkJiZoKCkpLGh9ZnVuY3Rpb24gT3IoZSx0LG4pe2xldCByPXRoaXMucHJveHksaT15KGUpP2UuaW5jbHVkZXMoYC5gKT9rcihyLGUpOigpPT5yW2VdOmUuYmluZChyLHIpLGE7dih0KT9hPXQ6KGE9dC5oYW5kbGVyLG49dCk7bGV0IG89UnModGhpcykscz1EcihpLGEuYmluZChyKSxuKTtyZXR1cm4gbygpLHN9ZnVuY3Rpb24ga3IoZSx0KXtsZXQgbj10LnNwbGl0KGAuYCk7cmV0dXJuKCk9PntsZXQgdD1lO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGgmJnQ7ZSsrKXQ9dFtuW2VdXTtyZXR1cm4gdH19dmFyIEFyPW5ldyBXZWFrTWFwLGpyPVN5bWJvbChgX3Z0ZWApLE1yPWU9PmUuX19pc1RlbGVwb3J0LE5yPWU9PmUmJihlLmRpc2FibGVkfHxlLmRpc2FibGVkPT09YGApLFByPWU9PmUmJihlLmRlZmVyfHxlLmRlZmVyPT09YGApLEZyPWU9PnR5cGVvZiBTVkdFbGVtZW50PGB1YCYmZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsSXI9ZT0+dHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50LExyPShlLHQpPT57bGV0IG49ZSYmZS50bztyZXR1cm4geShuKT90P3Qobik6bnVsbDpufSxScj17bmFtZTpgVGVsZXBvcnRgLF9faXNUZWxlcG9ydDohMCxwcm9jZXNzKGUsdCxuLHIsaSxhLG8scyxjLGwpe2xldHttYzp1LHBjOmQscGJjOmYsbzp7aW5zZXJ0OnAscXVlcnlTZWxlY3RvcjptLGNyZWF0ZVRleHQ6aCxjcmVhdGVDb21tZW50OmcscGFyZW50Tm9kZTpffX09bCx2PU5yKHQucHJvcHMpLHtkeW5hbWljQ2hpbGRyZW46eX09dCxiPShlLHQsbik9PntlLnNoYXBlRmxhZyYxNiYmdShlLmNoaWxkcmVuLHQsbixpLGEsbyxzLGMpfSx4PShlPXQpPT57bGV0IG49TnIoZS5wcm9wcykscj1lLnRhcmdldD1McihlLnByb3BzLG0pLGE9VXIocixlLGgscCk7ciYmKG8hPT1gc3ZnYCYmRnIocik/bz1gc3ZnYDpvIT09YG1hdGhtbGAmJklyKHIpJiYobz1gbWF0aG1sYCksaSYmaS5pc0NFJiYoaS5jZS5fdGVsZXBvcnRUYXJnZXRzfHwoaS5jZS5fdGVsZXBvcnRUYXJnZXRzPW5ldyBTZXQpKS5hZGQociksbnx8KGIoZSxyLGEpLEhyKGUsITEpKSl9LFM9ZT0+e2xldCB0PSgpPT57aWYoQXIuZ2V0KGUpPT09dCl7aWYoQXIuZGVsZXRlKGUpLE5yKGUucHJvcHMpKXtsZXQgdD1fKGUuZWwpfHxuO2IoZSx0LGUuYW5jaG9yKSxIcihlLCEwKX14KGUpfX07QXIuc2V0KGUsdCksSW8odCxhKX07aWYoZT09bnVsbCl7bGV0IGU9dC5lbD1oKGBgKSxpPXQuYW5jaG9yPWgoYGApO2lmKHAoZSxuLHIpLHAoaSxuLHIpLFByKHQucHJvcHMpfHxhJiZhLnBlbmRpbmdCcmFuY2gpe1ModCk7cmV0dXJufXYmJihiKHQsbixpKSxIcih0LCEwKSkseCgpfWVsc2V7dC5lbD1lLmVsO2xldCByPXQuYW5jaG9yPWUuYW5jaG9yLHU9QXIuZ2V0KGUpO2lmKHUpe3UuZmxhZ3N8PTgsQXIuZGVsZXRlKGUpLFModCk7cmV0dXJufXQudGFyZ2V0U3RhcnQ9ZS50YXJnZXRTdGFydDtsZXQgcD10LnRhcmdldD1lLnRhcmdldCxoPXQudGFyZ2V0QW5jaG9yPWUudGFyZ2V0QW5jaG9yLGc9TnIoZS5wcm9wcyksXz1nP246cCxiPWc/cjpoO2lmKG89PT1gc3ZnYHx8RnIocCk/bz1gc3ZnYDoobz09PWBtYXRobWxgfHxJcihwKSkmJihvPWBtYXRobWxgKSx5PyhmKGUuZHluYW1pY0NoaWxkcmVuLHksXyxpLGEsbyxzKSxVbyhlLHQsITApKTpjfHxkKGUsdCxfLGIsaSxhLG8scywhMSksdilnP3QucHJvcHMmJmUucHJvcHMmJnQucHJvcHMudG8hPT1lLnByb3BzLnRvJiYodC5wcm9wcy50bz1lLnByb3BzLnRvKTp6cih0LG4scixsLDEpO2Vsc2UgaWYoKHQucHJvcHMmJnQucHJvcHMudG8pIT09KGUucHJvcHMmJmUucHJvcHMudG8pKXtsZXQgZT1Mcih0LnByb3BzLG0pO2UmJih0LnRhcmdldD1lLHpyKHQsZSxudWxsLGwsMCkpfWVsc2UgZyYmenIodCxwLGgsbCwxKTtIcih0LHYpfX0scmVtb3ZlKGUsdCxuLHt1bTpyLG86e3JlbW92ZTppfX0sYSl7bGV0e3NoYXBlRmxhZzpvLGNoaWxkcmVuOnMsYW5jaG9yOmMsdGFyZ2V0U3RhcnQ6bCx0YXJnZXRBbmNob3I6dSx0YXJnZXQ6ZCxwcm9wczpmfT1lLHA9TnIoZiksbT1hfHwhcCxoPUFyLmdldChlKTtpZihoJiYoaC5mbGFnc3w9OCxBci5kZWxldGUoZSkpLGQmJihpKGwpLGkodSkpLGEmJmkoYyksIWgmJihwfHxkKSYmbyYxNilmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IGk9c1tlXTtyKGksdCxuLG0sISFpLmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOnpyLGh5ZHJhdGU6QnJ9O2Z1bmN0aW9uIHpyKGUsdCxuLHtvOntpbnNlcnQ6cn0sbTppfSxhPTIpe2E9PT0wJiZyKGUudGFyZ2V0QW5jaG9yLHQsbik7bGV0e2VsOm8sYW5jaG9yOnMsc2hhcGVGbGFnOmMsY2hpbGRyZW46bCxwcm9wczp1fT1lLGQ9YT09PTI7aWYoZCYmcihvLHQsbiksIUFyLmhhcyhlKSYmKCFkfHxOcih1KSkmJmMmMTYpZm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaShsW2VdLHQsbiwyKTtkJiZyKHMsdCxuKX1mdW5jdGlvbiBCcihlLHQsbixyLGksYSx7bzp7bmV4dFNpYmxpbmc6byxwYXJlbnROb2RlOnMscXVlcnlTZWxlY3RvcjpjLGluc2VydDpsLGNyZWF0ZVRleHQ6dX19LGQpe2Z1bmN0aW9uIGYoZSxuKXtsZXQgcj1uO2Zvcig7cjspe2lmKHImJnIubm9kZVR5cGU9PT04KXtpZihyLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnQgYW5jaG9yYCl0LnRhcmdldFN0YXJ0PXI7ZWxzZSBpZihyLmRhdGE9PT1gdGVsZXBvcnQgYW5jaG9yYCl7dC50YXJnZXRBbmNob3I9cixlLl9scGE9dC50YXJnZXRBbmNob3ImJm8odC50YXJnZXRBbmNob3IpO2JyZWFrfX1yPW8ocil9fWZ1bmN0aW9uIHAoZSx0KXt0LmFuY2hvcj1kKG8oZSksdCxzKGUpLG4scixpLGEpfWxldCBtPXQudGFyZ2V0PUxyKHQucHJvcHMsYyksaD1Ocih0LnByb3BzKTtpZihtKXtsZXQgYz1tLl9scGF8fG0uZmlyc3RDaGlsZDt0LnNoYXBlRmxhZyYxNiYmKGg/KHAoZSx0KSxmKG0sYyksdC50YXJnZXRBbmNob3J8fFVyKG0sdCx1LGwscyhlKT09PW0/ZTpudWxsKSk6KHQuYW5jaG9yPW8oZSksZihtLGMpLHQudGFyZ2V0QW5jaG9yfHxVcihtLHQsdSxsKSxkKGMmJm8oYyksdCxtLG4scixpLGEpKSksSHIodCxoKX1lbHNlIGgmJnQuc2hhcGVGbGFnJjE2JiYocChlLHQpLHQudGFyZ2V0U3RhcnQ9ZSx0LnRhcmdldEFuY2hvcj1vKGUpKTtyZXR1cm4gdC5hbmNob3ImJm8odC5hbmNob3IpfXZhciBWcj1ScjtmdW5jdGlvbiBIcihlLHQpe2xldCBuPWUuY3R4O2lmKG4mJm4udXQpe2xldCByLGk7Zm9yKHQ/KHI9ZS5lbCxpPWUuYW5jaG9yKToocj1lLnRhcmdldFN0YXJ0LGk9ZS50YXJnZXRBbmNob3IpO3ImJnIhPT1pOylyLm5vZGVUeXBlPT09MSYmci5zZXRBdHRyaWJ1dGUoYGRhdGEtdi1vd25lcmAsbi51aWQpLHI9ci5uZXh0U2libGluZztuLnV0KCl9fWZ1bmN0aW9uIFVyKGUsdCxuLHIsaT1udWxsKXtsZXQgYT10LnRhcmdldFN0YXJ0PW4oYGApLG89dC50YXJnZXRBbmNob3I9bihgYCk7cmV0dXJuIGFbanJdPW8sZSYmKHIoYSxlLGkpLHIobyxlLGkpKSxvfXZhciBXcj1TeW1ib2woYF9sZWF2ZUNiYCksR3I9U3ltYm9sKGBfZW50ZXJDYmApO2Z1bmN0aW9uIEtyKCl7bGV0IGU9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIFppKCgpPT57ZS5pc01vdW50ZWQ9ITB9KSxlYSgoKT0+e2UuaXNVbm1vdW50aW5nPSEwfSksZX12YXIgcXI9W0Z1bmN0aW9uLEFycmF5XSxKcj17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpxcixvbkVudGVyOnFyLG9uQWZ0ZXJFbnRlcjpxcixvbkVudGVyQ2FuY2VsbGVkOnFyLG9uQmVmb3JlTGVhdmU6cXIsb25MZWF2ZTpxcixvbkFmdGVyTGVhdmU6cXIsb25MZWF2ZUNhbmNlbGxlZDpxcixvbkJlZm9yZUFwcGVhcjpxcixvbkFwcGVhcjpxcixvbkFmdGVyQXBwZWFyOnFyLG9uQXBwZWFyQ2FuY2VsbGVkOnFyfSxZcj1lPT57bGV0IHQ9ZS5zdWJUcmVlO3JldHVybiB0LmNvbXBvbmVudD9Zcih0LmNvbXBvbmVudCk6dH0sWHI9e25hbWU6YEJhc2VUcmFuc2l0aW9uYCxwcm9wczpKcixzZXR1cChlLHtzbG90czp0fSl7bGV0IG49RnMoKSxyPUtyKCk7cmV0dXJuKCk9PntsZXQgaT10LmRlZmF1bHQmJmlpKHQuZGVmYXVsdCgpLCEwKSxhPWkmJmkubGVuZ3RoP1pyKGkpOm4uc3ViVHJlZT9UcygpOnZvaWQgMDtpZighYSlyZXR1cm47bGV0IG89QShlKSx7bW9kZTpzfT1vO2lmKHIuaXNMZWF2aW5nKXJldHVybiB0aShhKTtsZXQgYz1uaShhKTtpZighYylyZXR1cm4gdGkoYSk7bGV0IGw9ZWkoYyxvLHIsbixlPT5sPWUpO2MudHlwZSE9PWNzJiZyaShjLGwpO2xldCB1PW4uc3ViVHJlZSYmbmkobi5zdWJUcmVlKTtpZih1JiZ1LnR5cGUhPT1jcyYmIV9zKHUsYykmJllyKG4pLnR5cGUhPT1jcyl7bGV0IGU9ZWkodSxvLHIsbik7aWYocmkodSxlKSxzPT09YG91dC1pbmAmJmMudHlwZSE9PWNzKXJldHVybiByLmlzTGVhdmluZz0hMCxlLmFmdGVyTGVhdmU9KCk9PntyLmlzTGVhdmluZz0hMSxuLmpvYi5mbGFncyY4fHxuLnVwZGF0ZSgpLGRlbGV0ZSBlLmFmdGVyTGVhdmUsdT12b2lkIDB9LHRpKGEpO3M9PT1gaW4tb3V0YCYmYy50eXBlIT09Y3M/ZS5kZWxheUxlYXZlPShlLHQsbik9PntsZXQgaT0kcihyLHUpO2lbU3RyaW5nKHUua2V5KV09dSxlW1dyXT0oKT0+e3QoKSxlW1dyXT12b2lkIDAsZGVsZXRlIGwuZGVsYXllZExlYXZlLHU9dm9pZCAwfSxsLmRlbGF5ZWRMZWF2ZT0oKT0+e24oKSxkZWxldGUgbC5kZWxheWVkTGVhdmUsdT12b2lkIDB9fTp1PXZvaWQgMH1lbHNlIHUmJj12b2lkIDA7cmV0dXJuIGF9fX07ZnVuY3Rpb24gWnIoZSl7bGV0IHQ9ZVswXTtpZihlLmxlbmd0aD4xKXtmb3IobGV0IG4gb2YgZSlpZihuLnR5cGUhPT1jcyl7dD1uO2JyZWFrfX1yZXR1cm4gdH12YXIgUXI9WHI7ZnVuY3Rpb24gJHIoZSx0KXtsZXR7bGVhdmluZ1ZOb2RlczpufT1lLHI9bi5nZXQodC50eXBlKTtyZXR1cm4gcnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuLnNldCh0LnR5cGUscikpLHJ9ZnVuY3Rpb24gZWkoZSx0LG4scixpKXtsZXR7YXBwZWFyOmEsbW9kZTpvLHBlcnNpc3RlZDpzPSExLG9uQmVmb3JlRW50ZXI6YyxvbkVudGVyOmwsb25BZnRlckVudGVyOnUsb25FbnRlckNhbmNlbGxlZDpkLG9uQmVmb3JlTGVhdmU6ZixvbkxlYXZlOm0sb25BZnRlckxlYXZlOmgsb25MZWF2ZUNhbmNlbGxlZDpnLG9uQmVmb3JlQXBwZWFyOl8sb25BcHBlYXI6dixvbkFmdGVyQXBwZWFyOnksb25BcHBlYXJDYW5jZWxsZWQ6Yn09dCx4PVN0cmluZyhlLmtleSksUz0kcihuLGUpLEM9KGUsdCk9PntlJiZIbihlLHIsOSx0KX0sdz0oZSx0KT0+e2xldCBuPXRbMV07QyhlLHQpLHAoZSk/ZS5ldmVyeShlPT5lLmxlbmd0aDw9MSkmJm4oKTplLmxlbmd0aDw9MSYmbigpfSxlZT17bW9kZTpvLHBlcnNpc3RlZDpzLGJlZm9yZUVudGVyKHQpe2xldCByPWM7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9X3x8YztlbHNlIHJldHVybn10W1dyXSYmdFtXcl0oITApO2xldCBpPVNbeF07aSYmX3MoZSxpKSYmaS5lbFtXcl0mJmkuZWxbV3JdKCksQyhyLFt0XSl9LGVudGVyKHQpe2lmKFNbeF09PT1lKXJldHVybjtsZXQgcj1sLGk9dSxvPWQ7aWYoIW4uaXNNb3VudGVkKXtpZihhKXI9dnx8bCxpPXl8fHUsbz1ifHxkO2Vsc2UgcmV0dXJufWxldCBzPSExO3RbR3JdPWU9PntzfHwocz0hMCxDKGU/bzppLFt0XSksZWUuZGVsYXllZExlYXZlJiZlZS5kZWxheWVkTGVhdmUoKSx0W0dyXT12b2lkIDApfTtsZXQgYz10W0dyXS5iaW5kKG51bGwsITEpO3I/dyhyLFt0LGNdKTpjKCl9LGxlYXZlKHQscil7bGV0IGk9U3RyaW5nKGUua2V5KTtpZih0W0dyXSYmdFtHcl0oITApLG4uaXNVbm1vdW50aW5nKXJldHVybiByKCk7QyhmLFt0XSk7bGV0IGE9ITE7dFtXcl09bj0+e2F8fChhPSEwLHIoKSxDKG4/ZzpoLFt0XSksdFtXcl09dm9pZCAwLFNbaV09PT1lJiZkZWxldGUgU1tpXSl9O2xldCBvPXRbV3JdLmJpbmQobnVsbCwhMSk7U1tpXT1lLG0/dyhtLFt0LG9dKTpvKCl9LGNsb25lKGUpe2xldCBhPWVpKGUsdCxuLHIsaSk7cmV0dXJuIGkmJmkoYSksYX19O3JldHVybiBlZX1mdW5jdGlvbiB0aShlKXtpZih6aShlKSlyZXR1cm4gZT1DcyhlKSxlLmNoaWxkcmVuPW51bGwsZX1mdW5jdGlvbiBuaShlKXtpZighemkoZSkpcmV0dXJuIE1yKGUudHlwZSkmJmUuY2hpbGRyZW4/WnIoZS5jaGlsZHJlbik6ZTtpZihlLmNvbXBvbmVudClyZXR1cm4gZS5jb21wb25lbnQuc3ViVHJlZTtsZXR7c2hhcGVGbGFnOnQsY2hpbGRyZW46bn09ZTtpZihuKXtpZih0JjE2KXJldHVybiBuWzBdO2lmKHQmMzImJnYobi5kZWZhdWx0KSlyZXR1cm4gbi5kZWZhdWx0KCl9fWZ1bmN0aW9uIHJpKGUsdCl7aWYoZS5zaGFwZUZsYWcmNiYmZS5jb21wb25lbnQpe2UudHJhbnNpdGlvbj10O2xldCBuPWUuY29tcG9uZW50LnN1YlRyZWU7cmkoTXIobi50eXBlKSYmbmkobil8fG4sdCl9ZWxzZSBlLnNoYXBlRmxhZyYxMjg/KGUuc3NDb250ZW50LnRyYW5zaXRpb249dC5jbG9uZShlLnNzQ29udGVudCksZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249dC5jbG9uZShlLnNzRmFsbGJhY2spKTplLnRyYW5zaXRpb249dH1mdW5jdGlvbiBpaShlLHQ9ITEsbil7bGV0IHI9W10saT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgbz1lW2FdLHM9bj09bnVsbD9vLmtleTpTdHJpbmcobikrU3RyaW5nKG8ua2V5PT1udWxsP2E6by5rZXkpO28udHlwZT09PUw/KG8ucGF0Y2hGbGFnJjEyOCYmaSsrLHI9ci5jb25jYXQoaWkoby5jaGlsZHJlbix0LHMpKSk6KHR8fG8udHlwZSE9PWNzKSYmci5wdXNoKHM9PW51bGw/bzpDcyhvLHtrZXk6c30pKX1pZihpPjEpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspcltlXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHJ9ZnVuY3Rpb24gRihlLHQpe3JldHVybiB2KGUpP2woe25hbWU6ZS5uYW1lfSx0LHtzZXR1cDplfSk6ZX1mdW5jdGlvbiBhaSgpe2xldCBlPUZzKCk7cmV0dXJuIGU/KGUuYXBwQ29udGV4dC5jb25maWcuaWRQcmVmaXh8fGB2YCkrYC1gK2UuaWRzWzBdK2UuaWRzWzFdKys6YGB9ZnVuY3Rpb24gb2koZSl7ZS5pZHM9W2UuaWRzWzBdK2UuaWRzWzJdKysrYC1gLDAsMF19ZnVuY3Rpb24gc2koZSl7bGV0IHQ9RnMoKSxuPXVuKG51bGwpO2lmKHQpe2xldCBpPXQucmVmcz09PXI/dC5yZWZzPXt9OnQucmVmcztPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxlLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+bi52YWx1ZSxzZXQ6ZT0+bi52YWx1ZT1lfSl9cmV0dXJuIG59ZnVuY3Rpb24gY2koZSx0KXtsZXQgbjtyZXR1cm4hISgobj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkpJiYhbi5jb25maWd1cmFibGUpfXZhciBsaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB1aShlLHQsbixpLGE9ITEpe2lmKHAoZSkpe2UuZm9yRWFjaCgoZSxyKT0+dWkoZSx0JiYocCh0KT90W3JdOnQpLG4saSxhKSk7cmV0dXJufWlmKElpKGkpJiYhYSl7aS5zaGFwZUZsYWcmNTEyJiZpLnR5cGUuX19hc3luY1Jlc29sdmVkJiZpLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCYmdWkoZSx0LG4saS5jb21wb25lbnQuc3ViVHJlZSk7cmV0dXJufWxldCBzPWkuc2hhcGVGbGFnJjQ/UXMoaS5jb21wb25lbnQpOmkuZWwsYz1hP251bGw6cyx7aTpsLHI6ZH09ZSxtPXQmJnQucixoPWwucmVmcz09PXI/bC5yZWZzPXt9OmwucmVmcyxnPWwuc2V0dXBTdGF0ZSxfPUEoZyksYj1nPT09cj9vOmU9PiFjaShoLGUpJiZmKF8sZSkseD0oZSx0KT0+ISh0JiZjaShoLHQpKTtpZihtIT1udWxsJiZtIT09ZCl7aWYoZGkodCkseShtKSloW21dPW51bGwsYihtKSYmKGdbbV09bnVsbCk7ZWxzZSBpZihqKG0pKXtsZXQgZT10O3gobSxlLmspJiYobS52YWx1ZT1udWxsKSxlLmsmJihoW2Uua109bnVsbCl9fWlmKHYoZCkpVm4oZCxsLDEyLFtjLGhdKTtlbHNle2xldCB0PXkoZCkscj1qKGQpO2lmKHR8fHIpe2xldCBpPSgpPT57aWYoZS5mKXtsZXQgbj10P2IoZCk/Z1tkXTpoW2RdOngoZCl8fCFlLms/ZC52YWx1ZTpoW2Uua107aWYoYSlwKG4pJiZ1KG4scyk7ZWxzZSBpZihwKG4pKW4uaW5jbHVkZXMocyl8fG4ucHVzaChzKTtlbHNlIGlmKHQpaFtkXT1bc10sYihkKSYmKGdbZF09aFtkXSk7ZWxzZXtsZXQgdD1bc107eChkLGUuaykmJihkLnZhbHVlPXQpLGUuayYmKGhbZS5rXT10KX19ZWxzZSB0PyhoW2RdPWMsYihkKSYmKGdbZF09YykpOnImJih4KGQsZS5rKSYmKGQudmFsdWU9YyksZS5rJiYoaFtlLmtdPWMpKX07aWYoYyl7bGV0IHQ9KCk9PntpKCksbGkuZGVsZXRlKGUpfTt0LmlkPS0xLGxpLnNldChlLHQpLElvKHQsbil9ZWxzZSBkaShlKSxpKCl9fX1mdW5jdGlvbiBkaShlKXtsZXQgdD1saS5nZXQoZSk7dCYmKHQuZmxhZ3N8PTgsbGkuZGVsZXRlKGUpKX12YXIgZmk9ITEscGk9KCk9PntmaXx8PShjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApLCEwKX0sbWk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYHN2Z2ApJiZlLnRhZ05hbWUhPT1gZm9yZWlnbk9iamVjdGAsaGk9ZT0+ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApLGdpPWU9PntpZihlLm5vZGVUeXBlPT09MSl7aWYobWkoZSkpcmV0dXJuYHN2Z2A7aWYoaGkoZSkpcmV0dXJuYG1hdGhtbGB9fSxfaT1lPT5lLm5vZGVUeXBlPT09ODtmdW5jdGlvbiB2aShlKXtsZXR7bXQ6dCxwOm4sbzp7cGF0Y2hQcm9wOnIsY3JlYXRlVGV4dDppLG5leHRTaWJsaW5nOmEscGFyZW50Tm9kZTpvLHJlbW92ZTpjLGluc2VydDpsLGNyZWF0ZUNvbW1lbnQ6dX19PWUsZD0oZSx0KT0+e2lmKCF0Lmhhc0NoaWxkTm9kZXMoKSl7bihudWxsLGUsdCksaXIoKSx0Ll92bm9kZT1lO3JldHVybn1mKHQuZmlyc3RDaGlsZCxlLG51bGwsbnVsbCxudWxsKSxpcigpLHQuX3Zub2RlPWV9LGY9KG4scixzLGMsdSxkPSExKT0+e2R8fD0hIXIuZHluYW1pY0NoaWxkcmVuO2xldCBiPV9pKG4pJiZuLmRhdGE9PT1gW2AseD0oKT0+ZyhuLHIscyxjLHUsYikse3R5cGU6UyxyZWY6QyxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6ZWV9PXIsdGU9bi5ub2RlVHlwZTtyLmVsPW4sZWU9PT0tMiYmKGQ9ITEsci5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0IFQ9bnVsbDtzd2l0Y2goUyl7Y2FzZSBzczp0ZT09PTM/KG4uZGF0YSE9PXIuY2hpbGRyZW4mJihwaSgpLG4uZGF0YT1yLmNoaWxkcmVuKSxUPWEobikpOnIuY2hpbGRyZW49PT1gYD8obChyLmVsPWkoYGApLG8obiksbiksVD1uKTpUPXgoKTticmVhaztjYXNlIGNzOnkobik/KFQ9YShuKSx2KHIuZWw9bi5jb250ZW50LmZpcnN0Q2hpbGQsbixzKSk6VD10ZSE9PTh8fGI/eCgpOmEobik7YnJlYWs7Y2FzZSBsczppZihiJiYobj1hKG4pLHRlPW4ubm9kZVR5cGUpLHRlPT09MXx8dGU9PT0zKXtUPW47bGV0IGU9IXIuY2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8ci5zdGF0aWNDb3VudDt0KyspZSYmKHIuY2hpbGRyZW4rPVQubm9kZVR5cGU9PT0xP1Qub3V0ZXJIVE1MOlQuZGF0YSksdD09PXIuc3RhdGljQ291bnQtMSYmKHIuYW5jaG9yPVQpLFQ9YShUKTtyZXR1cm4gYj9hKFQpOlR9eCgpO2JyZWFrO2Nhc2UgTDpUPWI/aChuLHIscyxjLHUsZCk6eCgpO2JyZWFrO2RlZmF1bHQ6aWYodyYxKVQ9KHRlIT09MXx8ci50eXBlLnRvTG93ZXJDYXNlKCkhPT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkmJiF5KG4pP3goKTpwKG4scixzLGMsdSxkKTtlbHNlIGlmKHcmNil7ci5zbG90U2NvcGVJZHM9dTtsZXQgZT1vKG4pO2lmKFQ9Yj9fKG4pOl9pKG4pJiZuLmRhdGE9PT1gdGVsZXBvcnQgc3RhcnRgP18obixuLmRhdGEsYHRlbGVwb3J0IGVuZGApOmEobiksdChyLGUsbnVsbCxzLGMsZ2koZSksZCksSWkocikmJiFyLnR5cGUuX19hc3luY1Jlc29sdmVkKXtsZXQgdDtiPyh0PUgoTCksdC5hbmNob3I9VD9ULnByZXZpb3VzU2libGluZzplLmxhc3RDaGlsZCk6dD1uLm5vZGVUeXBlPT09Mz9VKGBgKTpIKGBkaXZgKSx0LmVsPW4sci5jb21wb25lbnQuc3ViVHJlZT10fX1lbHNlIHcmNjQ/VD10ZT09PTg/ci50eXBlLmh5ZHJhdGUobixyLHMsYyx1LGQsZSxtKTp4KCk6dyYxMjgmJihUPXIudHlwZS5oeWRyYXRlKG4scixzLGMsZ2kobyhuKSksdSxkLGUsZikpfXJldHVybiBDIT1udWxsJiZ1aShDLG51bGwsYyxyKSxUfSxwPShlLHQsbixpLGEsbyk9PntvfHw9ISF0LmR5bmFtaWNDaGlsZHJlbjtsZXR7dHlwZTpsLGR5bmFtaWNQcm9wczp1LHByb3BzOmQscGF0Y2hGbGFnOmYsc2hhcGVGbGFnOnAsZGlyczpoLHRyYW5zaXRpb246Z309dCxfPWw9PT1gaW5wdXRgfHxsPT09YG9wdGlvbmAsYj0hIXU7aWYoX3x8Ynx8ZiE9PS0xKXtoJiZfcih0LG51bGwsbixgY3JlYXRlZGApO2xldCBsPSExO2lmKHkoZSkpe2w9SG8obnVsbCxnKSYmbiYmbi52bm9kZS5wcm9wcyYmbi52bm9kZS5wcm9wcy5hcHBlYXI7bGV0IHI9ZS5jb250ZW50LmZpcnN0Q2hpbGQ7aWYobCl7bGV0IGU9ci5nZXRBdHRyaWJ1dGUoYGNsYXNzYCk7ZSYmKHIuJGNscz1lKSxnLmJlZm9yZUVudGVyKHIpfXYocixlLG4pLHQuZWw9ZT1yfWlmKHAmMTYmJiEoZCYmKGQuaW5uZXJIVE1MfHxkLnRleHRDb250ZW50KSkpe2xldCByPW0oZS5maXJzdENoaWxkLHQsZSxuLGksYSxvKTtmb3IociYmIUNpKGUsMSkmJnBpKCk7cjspe2xldCBlPXI7cj1yLm5leHRTaWJsaW5nLGMoZSl9fWVsc2UgaWYocCY4KXtsZXQgbj10LmNoaWxkcmVuO25bMF09PT1gCmAmJihlLnRhZ05hbWU9PT1gUFJFYHx8ZS50YWdOYW1lPT09YFRFWFRBUkVBYCkmJihuPW4uc2xpY2UoMSkpO2xldHt0ZXh0Q29udGVudDpyfT1lO3IhPT1uJiZyIT09bi5yZXBsYWNlKC9cclxufFxyL2csYApgKSYmKENpKGUsMCl8fHBpKCksZS50ZXh0Q29udGVudD10LmNoaWxkcmVuKX1pZihkKXtpZihffHxifHwhb3x8ZiY0OCl7bGV0IHQ9ZS50YWdOYW1lLmluY2x1ZGVzKGAtYCksaT1lLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhgc3ZnYCk/YHN2Z2A6ZS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoYE1hdGhNTGApP2BtYXRobWxgOnZvaWQgMDtmb3IobGV0IGEgaW4gZClpZihfJiYoYS5lbmRzV2l0aChgdmFsdWVgKXx8YT09PWBpbmRldGVybWluYXRlYCl8fHMoYSkmJiFuZShhKXx8YVswXT09PWAuYHx8dCYmIW5lKGEpfHx1JiZ1LmluY2x1ZGVzKGEpKXtpZihiaShlLGEsZFthXSkpY29udGludWU7cihlLGEsbnVsbCxkW2FdLGksbil9fWVsc2UgaWYoZC5vbkNsaWNrKXIoZSxgb25DbGlja2AsbnVsbCxkLm9uQ2xpY2ssdm9pZCAwLG4pO2Vsc2UgaWYoZiY0JiZubihkLnN0eWxlKSlmb3IobGV0IGUgaW4gZC5zdHlsZSlkLnN0eWxlW2VdfWxldCB4Oyh4PWQmJmQub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoeCxuLHQpLGgmJl9yKHQsbnVsbCxuLGBiZWZvcmVNb3VudGApLCgoeD1kJiZkLm9uVm5vZGVNb3VudGVkKXx8aHx8bCkmJmlzKCgpPT57eCYmQXMoeCxuLHQpLGwmJmcuZW50ZXIoZSksaCYmX3IodCxudWxsLG4sYG1vdW50ZWRgKX0saSl9cmV0dXJuIGUubmV4dFNpYmxpbmd9LG09KGUsdCxyLG8scyxjLHUpPT57dXx8PSEhdC5keW5hbWljQ2hpbGRyZW47bGV0IGQ9dC5jaGlsZHJlbixwPWQubGVuZ3RoLG09ITE7Zm9yKGxldCB0PTA7dDxwO3QrKyl7bGV0IGg9dT9kW3RdOmRbdF09RXMoZFt0XSksZz1oLnR5cGU9PT1zcztlPyhnJiYhdSYmdCsxPHAmJkVzKGRbdCsxXSkudHlwZT09PXNzJiYobChpKGUuZGF0YS5zbGljZShoLmNoaWxkcmVuLmxlbmd0aCkpLHIsYShlKSksZS5kYXRhPWguY2hpbGRyZW4pLGU9ZihlLGgsbyxzLGMsdSkpOmcmJiFoLmNoaWxkcmVuP2woaC5lbD1pKGBgKSxyKToobXx8KG09ITAsQ2kociwxKXx8cGkoKSksbihudWxsLGgscixudWxsLG8scyxnaShyKSxjKSl9cmV0dXJuIGV9LGg9KGUsdCxuLHIsaSxzKT0+e2xldHtzbG90U2NvcGVJZHM6Y309dDtjJiYoaT1pP2kuY29uY2F0KGMpOmMpO2xldCBkPW8oZSksZj1tKGEoZSksdCxkLG4scixpLHMpO3JldHVybiBmJiZfaShmKSYmZi5kYXRhPT09YF1gP2EodC5hbmNob3I9Zik6KHBpKCksbCh0LmFuY2hvcj11KGBdYCksZCxmKSxmKX0sZz0oZSx0LHIsaSxzLGwpPT57aWYoVGkoZSx0KXx8cGkoKSx0LmVsPW51bGwsbCl7bGV0IHQ9XyhlKTtmb3IoOzspe2xldCBuPWEoZSk7aWYobiYmbiE9PXQpYyhuKTtlbHNlIGJyZWFrfX1sZXQgdT1hKGUpLGQ9byhlKTtyZXR1cm4gYyhlKSxuKG51bGwsdCxkLHUscixpLGdpKGQpLHMpLHImJihyLnZub2RlLmVsPXQuZWwsX28ocix0LmVsKSksdX0sXz0oZSx0PWBbYCxuPWBdYCk9PntsZXQgcj0wO2Zvcig7ZTspaWYoZT1hKGUpLGUmJl9pKGUpJiYoZS5kYXRhPT09dCYmcisrLGUuZGF0YT09PW4pKXtpZihyPT09MClyZXR1cm4gYShlKTtyLS19cmV0dXJuIGV9LHY9KGUsdCxuKT0+e2xldCByPXQucGFyZW50Tm9kZTtyJiZyLnJlcGxhY2VDaGlsZChlLHQpO2xldCBpPW47Zm9yKDtpOylpLnZub2RlLmVsPT09dCYmKGkudm5vZGUuZWw9aS5zdWJUcmVlLmVsPWUpLGk9aS5wYXJlbnR9LHk9ZT0+ZS5ub2RlVHlwZT09PTEmJmUudGFnTmFtZT09PWBURU1QTEFURWA7cmV0dXJuW2QsZl19dmFyIHlpPW5ldyBTZXQoW2BzcmNgLGBzcmNzZXRgLGBocmVmYCxgcG9zdGVyYF0pO2Z1bmN0aW9uIGJpKGUsdCxuKXtyZXR1cm4geWkuaGFzKHQpP2UuZ2V0QXR0cmlidXRlKHQpPT09KG49PW51bGw/bnVsbDpgJHtufWApOiExfXZhciB4aT1gZGF0YS1hbGxvdy1taXNtYXRjaGAsU2k9ezA6YHRleHRgLDE6YGNoaWxkcmVuYCwyOmBjbGFzc2AsMzpgc3R5bGVgLDQ6YGF0dHJpYnV0ZWB9O2Z1bmN0aW9uIENpKGUsdCl7aWYodD09PTB8fHQ9PT0xKWZvcig7ZSYmIWUuaGFzQXR0cmlidXRlKHhpKTspZT1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIHdpKGUmJmUuZ2V0QXR0cmlidXRlKHhpKSx0KX1mdW5jdGlvbiB3aShlLHQpe2lmKGU9PW51bGwpcmV0dXJuITE7aWYoZT09PWBgKXJldHVybiEwO3tsZXQgbj1lLnNwbGl0KGAsYCk7cmV0dXJuIHQ9PT0wJiZuLmluY2x1ZGVzKGBjaGlsZHJlbmApPyEwOm4uaW5jbHVkZXMoU2lbdF0pfX1mdW5jdGlvbiBUaShlLHQpe3JldHVybiBDaShlLnBhcmVudEVsZW1lbnQsMSl8fEVpKGUpfHxEaSh0KX1mdW5jdGlvbiBFaShlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTEmJndpKGUuZ2V0QXR0cmlidXRlKHhpKSwxKX1mdW5jdGlvbiBEaSh7cHJvcHM6ZX0pe2xldCB0PWUmJmVbeGldO3JldHVybiB0eXBlb2YgdD09YHN0cmluZ2AmJndpKHQsMSl9dmFyIE9pPW1lKCkucmVxdWVzdElkbGVDYWxsYmFja3x8KGU9PnNldFRpbWVvdXQoZSwxKSksa2k9bWUoKS5jYW5jZWxJZGxlQ2FsbGJhY2t8fChlPT5jbGVhclRpbWVvdXQoZSkpLEFpPShlPTFlNCk9PnQ9PntsZXQgbj1PaSh0LHt0aW1lb3V0OmV9KTtyZXR1cm4oKT0+a2kobil9O2Z1bmN0aW9uIGppKGUpe2xldHt0b3A6dCxsZWZ0Om4sYm90dG9tOnIscmlnaHQ6aX09ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7aW5uZXJIZWlnaHQ6YSxpbm5lcldpZHRoOm99PXdpbmRvdztyZXR1cm4odD4wJiZ0PGF8fHI+MCYmcjxhKSYmKG4+MCYmbjxvfHxpPjAmJmk8byl9dmFyIE1pPWU9Pih0LG4pPT57bGV0IHI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGU9Pntmb3IobGV0IG4gb2YgZSlpZihuLmlzSW50ZXJzZWN0aW5nKXtyLmRpc2Nvbm5lY3QoKSx0KCk7YnJlYWt9fSxlKTtyZXR1cm4gbihlPT57aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpe2lmKGppKGUpKXJldHVybiB0KCksci5kaXNjb25uZWN0KCksITE7ci5vYnNlcnZlKGUpfX0pLCgpPT5yLmRpc2Nvbm5lY3QoKX0sTmk9ZT0+dD0+e2lmKGUpe2xldCBuPW1hdGNoTWVkaWEoZSk7aWYobi5tYXRjaGVzKXQoKTtlbHNlIHJldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCx7b25jZTohMH0pLCgpPT5uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGNoYW5nZWAsdCl9fSxQaT0oZT1bXSk9Pih0LG4pPT57eShlKSYmKGU9W2VdKTtsZXQgcj0hMSxpPWU9PntyfHwocj0hMCxhKCksdCgpLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLGUpKSl9LGE9KCk9PntuKHQ9Pntmb3IobGV0IG4gb2YgZSl0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpKX0pfTtyZXR1cm4gbih0PT57Zm9yKGxldCBuIG9mIGUpdC5hZGRFdmVudExpc3RlbmVyKG4saSx7b25jZTohMH0pfSksYX07ZnVuY3Rpb24gRmkoZSx0KXtpZihfaShlKSYmZS5kYXRhPT09YFtgKXtsZXQgbj0xLHI9ZS5uZXh0U2libGluZztmb3IoO3I7KXtpZihyLm5vZGVUeXBlPT09MSl7aWYodChyKT09PSExKWJyZWFrfWVsc2UgaWYoX2kocikpe2lmKHIuZGF0YT09PWBdYCl7aWYoLS1uPT09MClicmVha31lbHNlIHIuZGF0YT09PWBbYCYmbisrfXI9ci5uZXh0U2libGluZ319ZWxzZSB0KGUpfXZhciBJaT1lPT4hIWUudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIExpKGUpe3YoZSkmJihlPXtsb2FkZXI6ZX0pO2xldHtsb2FkZXI6dCxsb2FkaW5nQ29tcG9uZW50Om4sZXJyb3JDb21wb25lbnQ6cixkZWxheTppPTIwMCxoeWRyYXRlOmEsdGltZW91dDpvLHN1c3BlbnNpYmxlOnM9ITAsb25FcnJvcjpjfT1lLGw9bnVsbCx1LGQ9MCxmPSgpPT4oZCsrLGw9bnVsbCxwKCkpLHA9KCk9PntsZXQgZTtyZXR1cm4gbHx8KGU9bD10KCkuY2F0Y2goZT0+e2lmKGU9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKSxjKXJldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2MoZSwoKT0+dChmKCkpLCgpPT5uKGUpLGQrMSl9KTt0aHJvdyBlfSkudGhlbih0PT5lIT09bCYmbD9sOih0JiYodC5fX2VzTW9kdWxlfHx0W1N5bWJvbC50b1N0cmluZ1RhZ109PT1gTW9kdWxlYCkmJih0PXQuZGVmYXVsdCksdT10LHQpKSl9O3JldHVybiBGKHtuYW1lOmBBc3luY0NvbXBvbmVudFdyYXBwZXJgLF9fYXN5bmNMb2FkZXI6cCxfX2FzeW5jSHlkcmF0ZShlLHQsbil7bGV0IHI9ZS5pc0Nvbm5lY3RlZCxpPSExOyh0LmJ1fHw9W10pLnB1c2goKCk9Pmk9ITApO2xldCBvPSgpPT57aXx8IWUucGFyZW50Tm9kZXx8ciYmIWUuaXNDb25uZWN0ZWR8fG4oKX0scz1hPygpPT57bGV0IG49YShvLHQ9PkZpKGUsdCkpO24mJih0LmJ1bXx8PVtdKS5wdXNoKG4pfTpvO3U/cygpOnAoKS50aGVuKCgpPT4hdC5pc1VubW91bnRlZCYmcygpKX0sZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiB1fSxzZXR1cCgpe2xldCBlPVBzO2lmKG9pKGUpLHUpcmV0dXJuKCk9PlJpKHUsZSk7bGV0IHQ9dD0+e2w9bnVsbCxVbih0LGUsMTMsIXIpfTtpZihzJiZlLnN1c3BlbnNlfHxWcylyZXR1cm4gcCgpLnRoZW4odD0+KCk9PlJpKHQsZSkpLmNhdGNoKGU9Pih0KGUpLCgpPT5yP0gocix7ZXJyb3I6ZX0pOm51bGwpKTtsZXQgYT1NKCExKSxjPU0oKSxkPU0oISFpKSxmLG07cmV0dXJuIHRhKCgpPT57ZiE9bnVsbCYmY2xlYXJUaW1lb3V0KGYpLG0hPW51bGwmJmNsZWFyVGltZW91dChtKX0pLGkmJihtPXNldFRpbWVvdXQoKCk9PntlLmlzVW5tb3VudGVkfHwoZC52YWx1ZT0hMSl9LGkpKSxvIT1udWxsJiYoZj1zZXRUaW1lb3V0KCgpPT57aWYoIWUuaXNVbm1vdW50ZWQmJiFhLnZhbHVlJiYhYy52YWx1ZSl7bGV0IGU9RXJyb3IoYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHtvfW1zLmApO3QoZSksYy52YWx1ZT1lfX0sbykpLHAoKS50aGVuKCgpPT57ZS5pc1VubW91bnRlZHx8KGEudmFsdWU9ITAsZS5wYXJlbnQmJnppKGUucGFyZW50LnZub2RlKSYmZS5wYXJlbnQudXBkYXRlKCkpfSkuY2F0Y2gobj0+e2lmKGUuaXNVbm1vdW50ZWQpe2w9bnVsbDtyZXR1cm59dChuKSxjLnZhbHVlPW59KSwoKT0+e2lmKGEudmFsdWUmJnUpcmV0dXJuIFJpKHUsZSk7aWYoYy52YWx1ZSYmcilyZXR1cm4gSChyLHtlcnJvcjpjLnZhbHVlfSk7aWYobiYmIWQudmFsdWUpcmV0dXJuIFJpKG4sZSl9fX0pfWZ1bmN0aW9uIFJpKGUsdCl7bGV0e3JlZjpuLHByb3BzOnIsY2hpbGRyZW46aSxjZTphfT10LnZub2RlLG89SChlLHIsaSk7cmV0dXJuIG8ucmVmPW4sby5jZT1hLGRlbGV0ZSB0LnZub2RlLmNlLG99dmFyIHppPWU9PmUudHlwZS5fX2lzS2VlcEFsaXZlLEJpPXtuYW1lOmBLZWVwQWxpdmVgLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9bi5jdHg7aWYoIXIucmVuZGVyZXIpcmV0dXJuKCk9PntsZXQgZT10LmRlZmF1bHQmJnQuZGVmYXVsdCgpO3JldHVybiBlJiZlLmxlbmd0aD09PTE/ZVswXTplfTtsZXQgaT1uZXcgTWFwLGE9bmV3IFNldCxvPW51bGwscz1uLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpjLG06bCx1bTp1LG86e2NyZWF0ZUVsZW1lbnQ6ZH19fT1yLGY9ZChgZGl2YCk7ci5hY3RpdmF0ZT0oZSx0LG4scixpKT0+e2xldCBhPWUuY29tcG9uZW50O2woZSx0LG4sMCxzKSxjKGEudm5vZGUsZSx0LG4sYSxzLHIsZS5zbG90U2NvcGVJZHMsaSksSW8oKCk9PnthLmlzRGVhY3RpdmF0ZWQ9ITEsYS5hJiZsZShhLmEpO2xldCB0PWUucHJvcHMmJmUucHJvcHMub25Wbm9kZU1vdW50ZWQ7dCYmQXModCxhLnBhcmVudCxlKX0scyl9LHIuZGVhY3RpdmF0ZT1lPT57bGV0IHQ9ZS5jb21wb25lbnQ7S28odC5tKSxLbyh0LmEpLGwoZSxmLG51bGwsMSxzKSxJbygoKT0+e3QuZGEmJmxlKHQuZGEpO2xldCBuPWUucHJvcHMmJmUucHJvcHMub25Wbm9kZVVubW91bnRlZDtuJiZBcyhuLHQucGFyZW50LGUpLHQuaXNEZWFjdGl2YXRlZD0hMH0scyl9O2Z1bmN0aW9uIHAoZSl7S2koZSksdShlLG4scywhMCl9ZnVuY3Rpb24gbShlKXtpLmZvckVhY2goKHQsbik9PntsZXQgcj0kcyhJaSh0KT90LnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTp0LnR5cGUpO3ImJiFlKHIpJiZoKG4pfSl9ZnVuY3Rpb24gaChlKXtsZXQgdD1pLmdldChlKTt0JiYoIW98fCFfcyh0LG8pKT9wKHQpOm8mJktpKG8pLGkuZGVsZXRlKGUpLGEuZGVsZXRlKGUpfUVyKCgpPT5bZS5pbmNsdWRlLGUuZXhjbHVkZV0sKFtlLHRdKT0+e2UmJm0odD0+VmkoZSx0KSksdCYmbShlPT4hVmkodCxlKSl9LHtmbHVzaDpgcG9zdGAsZGVlcDohMH0pO2xldCBnPW51bGwsXz0oKT0+e2chPW51bGwmJihKbyhuLnN1YlRyZWUudHlwZSk/SW8oKCk9PntpLnNldChnLHFpKG4uc3ViVHJlZSkpfSxuLnN1YlRyZWUuc3VzcGVuc2UpOmkuc2V0KGcscWkobi5zdWJUcmVlKSkpfTtyZXR1cm4gWmkoXyksJGkoXyksZWEoKCk9PntpLmZvckVhY2goZT0+e2xldHtzdWJUcmVlOnQsc3VzcGVuc2U6cn09bixpPXFpKHQpO2lmKGUudHlwZT09PWkudHlwZSYmZS5rZXk9PT1pLmtleSl7S2koaSk7bGV0IGU9aS5jb21wb25lbnQuZGE7ZSYmSW8oZSxyKTtyZXR1cm59cChlKX0pfSksKCk9PntpZihnPW51bGwsIXQuZGVmYXVsdClyZXR1cm4gbz1udWxsO2xldCBuPXQuZGVmYXVsdCgpLHI9blswXTtpZihuLmxlbmd0aD4xKXJldHVybiBvPW51bGwsbjtpZighZ3Mocil8fCEoci5zaGFwZUZsYWcmNCkmJiEoci5zaGFwZUZsYWcmMTI4KSlyZXR1cm4gbz1udWxsLHI7bGV0IHM9cWkocik7aWYocy50eXBlPT09Y3MpcmV0dXJuIG89bnVsbCxzO2xldCBjPXMudHlwZSxsPSRzKElpKHMpP3MudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OmMpLHtpbmNsdWRlOnUsZXhjbHVkZTpkLG1heDpmfT1lO2lmKHUmJighbHx8IVZpKHUsbCkpfHxkJiZsJiZWaShkLGwpKXJldHVybiBzLnNoYXBlRmxhZyY9LTI1NyxvPXMscjtsZXQgcD1zLmtleT09bnVsbD9jOnMua2V5LG09aS5nZXQocCk7cmV0dXJuIHMuZWwmJihzPUNzKHMpLHIuc2hhcGVGbGFnJjEyOCYmKHIuc3NDb250ZW50PXMpKSxnPXAsbT8ocy5lbD1tLmVsLHMuY29tcG9uZW50PW0uY29tcG9uZW50LHMudHJhbnNpdGlvbiYmcmkocyxzLnRyYW5zaXRpb24pLHMuc2hhcGVGbGFnfD01MTIsYS5kZWxldGUocCksYS5hZGQocCkpOihhLmFkZChwKSxmJiZhLnNpemU+cGFyc2VJbnQoZiwxMCkmJmgoYS52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxzLnNoYXBlRmxhZ3w9MjU2LG89cyxKbyhyLnR5cGUpP3I6c319fTtmdW5jdGlvbiBWaShlLHQpe3JldHVybiBwKGUpP2Uuc29tZShlPT5WaShlLHQpKTp5KGUpP2Uuc3BsaXQoYCxgKS5pbmNsdWRlcyh0KTpfKGUpPyhlLmxhc3RJbmRleD0wLGUudGVzdCh0KSk6ITF9ZnVuY3Rpb24gSGkoZSx0KXtXaShlLGBhYCx0KX1mdW5jdGlvbiBVaShlLHQpe1dpKGUsYGRhYCx0KX1mdW5jdGlvbiBXaShlLHQsbj1Qcyl7bGV0IHI9ZS5fX3dkY3x8PSgpPT57bGV0IHQ9bjtmb3IoO3Q7KXtpZih0LmlzRGVhY3RpdmF0ZWQpcmV0dXJuO3Q9dC5wYXJlbnR9cmV0dXJuIGUoKX07aWYoSmkodCxyLG4pLG4pe2xldCBlPW4ucGFyZW50O2Zvcig7ZSYmZS5wYXJlbnQ7KXppKGUucGFyZW50LnZub2RlKSYmR2kocix0LG4sZSksZT1lLnBhcmVudH19ZnVuY3Rpb24gR2koZSx0LG4scil7bGV0IGk9SmkodCxlLHIsITApO3RhKCgpPT57dShyW3RdLGkpfSxuKX1mdW5jdGlvbiBLaShlKXtlLnNoYXBlRmxhZyY9LTI1NyxlLnNoYXBlRmxhZyY9LTUxM31mdW5jdGlvbiBxaShlKXtyZXR1cm4gZS5zaGFwZUZsYWcmMTI4P2Uuc3NDb250ZW50OmV9ZnVuY3Rpb24gSmkoZSx0LG49UHMscj0hMSl7aWYobil7bGV0IGk9bltlXXx8KG5bZV09W10pLGE9dC5fX3dlaHx8PSguLi5yKT0+e250KCk7bGV0IGk9UnMobiksYT1Ibih0LG4sZSxyKTtyZXR1cm4gaSgpLHJ0KCksYX07cmV0dXJuIHI/aS51bnNoaWZ0KGEpOmkucHVzaChhKSxhfX12YXIgWWk9ZT0+KHQsbj1Qcyk9PnsoIVZzfHxlPT09YHNwYCkmJkppKGUsKC4uLmUpPT50KC4uLmUpLG4pfSxYaT1ZaShgYm1gKSxaaT1ZaShgbWApLFFpPVlpKGBidWApLCRpPVlpKGB1YCksZWE9WWkoYGJ1bWApLHRhPVlpKGB1bWApLG5hPVlpKGBzcGApLHJhPVlpKGBydGdgKSxpYT1ZaShgcnRjYCk7ZnVuY3Rpb24gYWEoZSx0PVBzKXtKaShgZWNgLGUsdCl9dmFyIG9hPWBjb21wb25lbnRzYCxzYT1gZGlyZWN0aXZlc2A7ZnVuY3Rpb24gY2EoZSx0KXtyZXR1cm4gZmEob2EsZSwhMCx0KXx8ZX12YXIgbGE9U3ltYm9sLmZvcihgdi1uZGNgKTtmdW5jdGlvbiB1YShlKXtyZXR1cm4geShlKT9mYShvYSxlLCExKXx8ZTplfHxsYX1mdW5jdGlvbiBkYShlKXtyZXR1cm4gZmEoc2EsZSl9ZnVuY3Rpb24gZmEoZSx0LG49ITAscj0hMSl7bGV0IGk9dXJ8fFBzO2lmKGkpe2xldCBuPWkudHlwZTtpZihlPT09b2Epe2xldCBlPSRzKG4sITEpO2lmKGUmJihlPT09dHx8ZT09PUUodCl8fGU9PT1zZShFKHQpKSkpcmV0dXJuIG59bGV0IGE9cGEoaVtlXXx8bltlXSx0KXx8cGEoaS5hcHBDb250ZXh0W2VdLHQpO3JldHVybiFhJiZyP246YX19ZnVuY3Rpb24gcGEoZSx0KXtyZXR1cm4gZSYmKGVbdF18fGVbRSh0KV18fGVbc2UoRSh0KSldKX1mdW5jdGlvbiBtYShlLHQsbixyKXtsZXQgaSxhPW4mJm5bcl0sbz1wKGUpO2lmKG98fHkoZSkpe2xldCBuPW8mJm5uKGUpLHI9ITEscz0hMTtuJiYocj0hYW4oZSkscz1ybihlKSxlPV90KGUpKSxpPUFycmF5KGUubGVuZ3RoKTtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspaVtuXT10KHI/cz9sbihjbihlW25dKSk6Y24oZVtuXSk6ZVtuXSxuLHZvaWQgMCxhJiZhW25dKX1lbHNlIGlmKHR5cGVvZiBlPT1gbnVtYmVyYCl7aT1BcnJheShlKTtmb3IobGV0IG49MDtuPGU7bisrKWlbbl09dChuKzEsbix2b2lkIDAsYSYmYVtuXSl9ZWxzZSBpZih4KGUpKXtpZihlW1N5bWJvbC5pdGVyYXRvcl0paT1BcnJheS5mcm9tKGUsKGUsbik9PnQoZSxuLHZvaWQgMCxhJiZhW25dKSk7ZWxzZXtsZXQgbj1PYmplY3Qua2V5cyhlKTtpPUFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2xldCBvPW5bcl07aVtyXT10KGVbb10sbyxyLGEmJmFbcl0pfX19ZWxzZSBpPVtdO3JldHVybiBuJiYobltyXT1pKSxpfWZ1bmN0aW9uIGhhKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07aWYocChyKSlmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllW3JbdF0ubmFtZV09clt0XS5mbjtlbHNlIHImJihlW3IubmFtZV09ci5rZXk/KC4uLmUpPT57bGV0IHQ9ci5mbiguLi5lKTtyZXR1cm4gdCYmKHQua2V5PXIua2V5KSx0fTpyLmZuKX1yZXR1cm4gZX1mdW5jdGlvbiBJKGUsdCxuLHIsaSxhKXtpZihuPz89e30sdXIuY2V8fHVyLnBhcmVudCYmSWkodXIucGFyZW50KSYmdXIucGFyZW50LmNlKXtsZXQgZT1hIT1udWxsJiZuLmtleT09bnVsbD9sKHt9LG4se2tleTphfSk6bixpPU9iamVjdC5rZXlzKGUpLmxlbmd0aD4wO3JldHVybiB0IT09ImRlZmF1bHQiJiYoZS5uYW1lPXQpLFIoKSxCKEwsbnVsbCxbSChgc2xvdGAsZSxyJiZyKCkpXSxpPy0yOjY0KX1sZXQgbz1lW3RdO28mJm8uX2MmJihvLl9kPSExKTtsZXQgcz11cy5sZW5ndGg7UigpO2xldCBjO3RyeXtsZXQgaT1vJiZnYShvKG4pKSxzPW4ua2V5fHxhfHxpJiZpLmtleTtjPUIoTCx7a2V5OihzJiYhYihzKT9zOmBfJHt0fWApKyghaSYmcj9gX2ZiYDpgYCl9LGl8fChyP3IoKTpbXSksaSYmZS5fPT09MT82NDotMil9Y2F0Y2goZSl7Zm9yKGxldCBlPXVzLmxlbmd0aDtlPnM7ZS0tKWZzKCk7dGhyb3cgZX1maW5hbGx5e28mJm8uX2MmJihvLl9kPSEwKX1yZXR1cm4haSYmYy5zY29wZUlkJiYoYy5zbG90U2NvcGVJZHM9W2Muc2NvcGVJZCtgLXNgXSksY31mdW5jdGlvbiBnYShlKXtyZXR1cm4gZS5zb21lKGU9PiFncyhlKXx8IShlLnR5cGU9PT1jc3x8ZS50eXBlPT09TCYmIWdhKGUuY2hpbGRyZW4pKSk/ZTpudWxsfWZ1bmN0aW9uIF9hKGUsdCl7bGV0IG49e307Zm9yKGxldCByIGluIGUpblt0JiYvW0EtWl0vLnRlc3Qocik/YG9uOiR7cn1gOmNlKHIpXT1lW3JdO3JldHVybiBufXZhciB2YT1lPT5lP0JzKGUpP1FzKGUpOnZhKGUucGFyZW50KTpudWxsLHlhPWwoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDplPT5lLCRlbDplPT5lLnZub2RlLmVsLCRkYXRhOmU9PmUuZGF0YSwkcHJvcHM6ZT0+ZS5wcm9wcywkYXR0cnM6ZT0+ZS5hdHRycywkc2xvdHM6ZT0+ZS5zbG90cywkcmVmczplPT5lLnJlZnMsJHBhcmVudDplPT52YShlLnBhcmVudCksJHJvb3Q6ZT0+dmEoZS5yb290KSwkaG9zdDplPT5lLmNlLCRlbWl0OmU9PmUuZW1pdCwkb3B0aW9uczplPT5VYShlKSwkZm9yY2VVcGRhdGU6ZT0+ZS5mfHw9KCk9PntlcihlLnVwZGF0ZSl9LCRuZXh0VGljazplPT5lLm58fD1Rbi5iaW5kKGUucHJveHkpLCR3YXRjaDplPT5Pci5iaW5kKGUpfSksYmE9KGUsdCk9PmUhPT1yJiYhZS5fX2lzU2NyaXB0U2V0dXAmJmYoZSx0KSx4YT17Z2V0KHtfOmV9LHQpe2lmKHQ9PT1gX192X3NraXBgKXJldHVybiEwO2xldHtjdHg6bixzZXR1cFN0YXRlOmksZGF0YTphLHByb3BzOm8sYWNjZXNzQ2FjaGU6cyx0eXBlOmMsYXBwQ29udGV4dDpsfT1lO2lmKHRbMF0hPT1gJGApe2xldCBlPXNbdF07aWYoZSE9PXZvaWQgMClzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBpW3RdO2Nhc2UgMjpyZXR1cm4gYVt0XTtjYXNlIDQ6cmV0dXJuIG5bdF07Y2FzZSAzOnJldHVybiBvW3RdfWVsc2UgaWYoYmEoaSx0KSlyZXR1cm4gc1t0XT0xLGlbdF07ZWxzZSBpZihhIT09ciYmZihhLHQpKXJldHVybiBzW3RdPTIsYVt0XTtlbHNlIGlmKGYobyx0KSlyZXR1cm4gc1t0XT0zLG9bdF07ZWxzZSBpZihuIT09ciYmZihuLHQpKXJldHVybiBzW3RdPTQsblt0XTtlbHNlIFJhJiYoc1t0XT0wKX1sZXQgdT15YVt0XSxkLHA7aWYodSlyZXR1cm4gdD09PWAkYXR0cnNgJiZwdChlLmF0dHJzLGBnZXRgLGBgKSx1KGUpO2lmKChkPWMuX19jc3NNb2R1bGVzKSYmKGQ9ZFt0XSkpcmV0dXJuIGQ7aWYobiE9PXImJmYobix0KSlyZXR1cm4gc1t0XT00LG5bdF07aWYocD1sLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGYocCx0KSlyZXR1cm4gcFt0XX0sc2V0KHtfOmV9LHQsbil7bGV0e2RhdGE6aSxzZXR1cFN0YXRlOmEsY3R4Om99PWU7cmV0dXJuIGJhKGEsdCk/KGFbdF09biwhMCk6aSE9PXImJmYoaSx0KT8oaVt0XT1uLCEwKTpmKGUucHJvcHMsdCl8fHRbMF09PT1gJGAmJnQuc2xpY2UoMSlpbiBlPyExOihvW3RdPW4sITApfSxoYXMoe186e2RhdGE6ZSxzZXR1cFN0YXRlOnQsYWNjZXNzQ2FjaGU6bixjdHg6aSxhcHBDb250ZXh0OmEscHJvcHM6byx0eXBlOnN9fSxjKXtsZXQgbDtyZXR1cm4hIShuW2NdfHxlIT09ciYmY1swXSE9PWAkYCYmZihlLGMpfHxiYSh0LGMpfHxmKG8sYyl8fGYoaSxjKXx8Zih5YSxjKXx8ZihhLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGMpfHwobD1zLl9fY3NzTW9kdWxlcykmJmxbY10pfSxkZWZpbmVQcm9wZXJ0eShlLHQsbil7cmV0dXJuIG4uZ2V0PT1udWxsP2YobixgdmFsdWVgKSYmdGhpcy5zZXQoZSx0LG4udmFsdWUsbnVsbCk6ZS5fLmFjY2Vzc0NhY2hlW3RdPTAsUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbil9fSxTYT1sKHt9LHhhLHtnZXQoZSx0KXtpZih0IT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB4YS5nZXQoZSx0LGUpfSxoYXMoZSx0KXtyZXR1cm4gdFswXSE9PWBfYCYmIWhlKHQpfX0pO2Z1bmN0aW9uIENhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gd2EoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUYShlKXt9ZnVuY3Rpb24gRWEoZSl7fWZ1bmN0aW9uIERhKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gT2EoKXt9ZnVuY3Rpb24ga2EoZSx0KXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBBYSgpe3JldHVybiBNYShgdXNlU2xvdHNgKS5zbG90c31mdW5jdGlvbiBqYSgpe3JldHVybiBNYShgdXNlQXR0cnNgKS5hdHRyc31mdW5jdGlvbiBNYShlKXtsZXQgdD1GcygpO3JldHVybiB0LnNldHVwQ29udGV4dHx8PVpzKHQpfWZ1bmN0aW9uIE5hKGUpe3JldHVybiBwKGUpP2UucmVkdWNlKChlLHQpPT4oZVt0XT1udWxsLGUpLHt9KTplfWZ1bmN0aW9uIFBhKGUsdCl7bGV0IG49TmEoZSk7Zm9yKGxldCBlIGluIHQpe2lmKGUuc3RhcnRzV2l0aChgX19za2lwYCkpY29udGludWU7bGV0IHI9bltlXTtyP3Aocil8fHYocik/cj1uW2VdPXt0eXBlOnIsZGVmYXVsdDp0W2VdfTpyLmRlZmF1bHQ9dFtlXTpyPT09bnVsbCYmKHI9bltlXT17ZGVmYXVsdDp0W2VdfSksciYmdFtgX19za2lwXyR7ZX1gXSYmKHIuc2tpcEZhY3Rvcnk9ITApfXJldHVybiBufWZ1bmN0aW9uIEZhKGUsdCl7cmV0dXJuIWV8fCF0P2V8fHQ6cChlKSYmcCh0KT9lLmNvbmNhdCh0KTpsKHt9LE5hKGUpLE5hKHQpKX1mdW5jdGlvbiBJYShlLHQpe2xldCBuPXt9O2ZvcihsZXQgciBpbiBlKXQuaW5jbHVkZXMocil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5lW3JdfSk7cmV0dXJuIG59ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9RnMoKSxuPVZzLHI9ZSgpO3pzKCksbiYmTHMoITEpO2xldCBpPSgpPT57UnModCksbiYmTHMoITApfSxhPSgpPT57RnMoKSE9PXQmJnQuc2NvcGUub2ZmKCksenMoKSxuJiZMcyghMSl9O3JldHVybiBTKHIpJiYocj1yLmNhdGNoKGU9Pnt0aHJvdyBpKCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhKSksZX0pKSxbciwoKT0+e2koKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfV19dmFyIFJhPSEwO2Z1bmN0aW9uIHphKGUpe2xldCB0PVVhKGUpLG49ZS5wcm94eSxyPWUuY3R4O1JhPSExLHQuYmVmb3JlQ3JlYXRlJiZWYSh0LmJlZm9yZUNyZWF0ZSxlLGBiY2ApO2xldHtkYXRhOmksY29tcHV0ZWQ6byxtZXRob2RzOnMsd2F0Y2g6Yyxwcm92aWRlOmwsaW5qZWN0OnUsY3JlYXRlZDpkLGJlZm9yZU1vdW50OmYsbW91bnRlZDptLGJlZm9yZVVwZGF0ZTpoLHVwZGF0ZWQ6ZyxhY3RpdmF0ZWQ6XyxkZWFjdGl2YXRlZDp5LGJlZm9yZURlc3Ryb3k6YixiZWZvcmVVbm1vdW50OlMsZGVzdHJveWVkOkMsdW5tb3VudGVkOncscmVuZGVyOmVlLHJlbmRlclRyYWNrZWQ6dGUscmVuZGVyVHJpZ2dlcmVkOlQsZXJyb3JDYXB0dXJlZDpuZSxzZXJ2ZXJQcmVmZXRjaDpyZSxleHBvc2U6aWUsaW5oZXJpdEF0dHJzOkUsY29tcG9uZW50czphZSxkaXJlY3RpdmVzOm9lLGZpbHRlcnM6c2V9PXQ7aWYodSYmQmEodSxyLG51bGwpLHMpZm9yKGxldCBlIGluIHMpe2xldCB0PXNbZV07dih0KSYmKHJbZV09dC5iaW5kKG4pKX1pZihpKXtsZXQgdD1pLmNhbGwobixuKTt4KHQpJiYoZS5kYXRhPVp0KHQpKX1pZihSYT0hMCxvKWZvcihsZXQgZSBpbiBvKXtsZXQgdD1vW2VdLGk9Vyh7Z2V0OnYodCk/dC5iaW5kKG4sbik6dih0LmdldCk/dC5nZXQuYmluZChuLG4pOmEsc2V0OiF2KHQpJiZ2KHQuc2V0KT90LnNldC5iaW5kKG4pOmF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmkudmFsdWUsc2V0OmU9PmkudmFsdWU9ZX0pfWlmKGMpZm9yKGxldCBlIGluIGMpSGEoY1tlXSxyLG4sZSk7aWYobCl7bGV0IGU9dihsKT9sLmNhbGwobik6bDtSZWZsZWN0Lm93bktleXMoZSkuZm9yRWFjaCh0PT57dnIodCxlW3RdKX0pfWQmJlZhKGQsZSxgY2ApO2Z1bmN0aW9uIGNlKGUsdCl7cCh0KT90LmZvckVhY2godD0+ZSh0LmJpbmQobikpKTp0JiZlKHQuYmluZChuKSl9aWYoY2UoWGksZiksY2UoWmksbSksY2UoUWksaCksY2UoJGksZyksY2UoSGksXyksY2UoVWkseSksY2UoYWEsbmUpLGNlKGlhLHRlKSxjZShyYSxUKSxjZShlYSxTKSxjZSh0YSx3KSxjZShuYSxyZSkscChpZSkpe2lmKGllLmxlbmd0aCl7bGV0IHQ9ZS5leHBvc2VkfHw9e307aWUuZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OigpPT5uW2VdLHNldDp0PT5uW2VdPXQsZW51bWVyYWJsZTohMH0pfSl9ZWxzZSBlLmV4cG9zZWR8fD17fX1lZSYmZS5yZW5kZXI9PT1hJiYoZS5yZW5kZXI9ZWUpLEUhPW51bGwmJihlLmluaGVyaXRBdHRycz1FKSxhZSYmKGUuY29tcG9uZW50cz1hZSksb2UmJihlLmRpcmVjdGl2ZXM9b2UpLHJlJiZvaShlKX1mdW5jdGlvbiBCYShlLHQsbj1hKXtwKGUpJiYoZT1KYShlKSk7Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl0saTtpPXgocik/YGRlZmF1bHRgaW4gcj95cihyLmZyb218fG4sci5kZWZhdWx0LCEwKTp5cihyLmZyb218fG4pOnlyKHIpLGooaSk/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pLnZhbHVlLHNldDplPT5pLnZhbHVlPWV9KTp0W25dPWl9fWZ1bmN0aW9uIFZhKGUsdCxuKXtIbihwKGUpP2UubWFwKGU9PmUuYmluZCh0LnByb3h5KSk6ZS5iaW5kKHQucHJveHkpLHQsbil9ZnVuY3Rpb24gSGEoZSx0LG4scil7bGV0IGk9ci5pbmNsdWRlcyhgLmApP2tyKG4scik6KCk9Pm5bcl07aWYoeShlKSl7bGV0IG49dFtlXTt2KG4pJiZFcihpLG4pfWVsc2UgaWYodihlKSlFcihpLGUuYmluZChuKSk7ZWxzZSBpZih4KGUpKXtpZihwKGUpKWUuZm9yRWFjaChlPT5IYShlLHQsbixyKSk7ZWxzZXtsZXQgcj12KGUuaGFuZGxlcik/ZS5oYW5kbGVyLmJpbmQobik6dFtlLmhhbmRsZXJdO3YocikmJkVyKGkscixlKX19fWZ1bmN0aW9uIFVhKGUpe2xldCB0PWUudHlwZSx7bWl4aW5zOm4sZXh0ZW5kczpyfT10LHttaXhpbnM6aSxvcHRpb25zQ2FjaGU6YSxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpvfX09ZS5hcHBDb250ZXh0LHM9YS5nZXQodCksYztyZXR1cm4gcz9jPXM6IWkubGVuZ3RoJiYhbiYmIXI/Yz10OihjPXt9LGkubGVuZ3RoJiZpLmZvckVhY2goZT0+V2EoYyxlLG8sITApKSxXYShjLHQsbykpLHgodCkmJmEuc2V0KHQsYyksY31mdW5jdGlvbiBXYShlLHQsbixyPSExKXtsZXR7bWl4aW5zOmksZXh0ZW5kczphfT10O2EmJldhKGUsYSxuLCEwKSxpJiZpLmZvckVhY2godD0+V2EoZSx0LG4sITApKTtmb3IobGV0IGkgaW4gdClpZighKHImJmk9PT1gZXhwb3NlYCkpe2xldCByPUdhW2ldfHxuJiZuW2ldO2VbaV09cj9yKGVbaV0sdFtpXSk6dFtpXX1yZXR1cm4gZX12YXIgR2E9e2RhdGE6S2EscHJvcHM6WmEsZW1pdHM6WmEsbWV0aG9kczpYYSxjb21wdXRlZDpYYSxiZWZvcmVDcmVhdGU6WWEsY3JlYXRlZDpZYSxiZWZvcmVNb3VudDpZYSxtb3VudGVkOllhLGJlZm9yZVVwZGF0ZTpZYSx1cGRhdGVkOllhLGJlZm9yZURlc3Ryb3k6WWEsYmVmb3JlVW5tb3VudDpZYSxkZXN0cm95ZWQ6WWEsdW5tb3VudGVkOllhLGFjdGl2YXRlZDpZYSxkZWFjdGl2YXRlZDpZYSxlcnJvckNhcHR1cmVkOllhLHNlcnZlclByZWZldGNoOllhLGNvbXBvbmVudHM6WGEsZGlyZWN0aXZlczpYYSx3YXRjaDpRYSxwcm92aWRlOkthLGluamVjdDpxYX07ZnVuY3Rpb24gS2EoZSx0KXtyZXR1cm4gdD9lP2Z1bmN0aW9uKCl7cmV0dXJuIGwodihlKT9lLmNhbGwodGhpcyx0aGlzKTplLHYodCk/dC5jYWxsKHRoaXMsdGhpcyk6dCl9OnQ6ZX1mdW5jdGlvbiBxYShlLHQpe3JldHVybiBYYShKYShlKSxKYSh0KSl9ZnVuY3Rpb24gSmEoZSl7aWYocChlKSl7bGV0IHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT1lW25dO3JldHVybiB0fXJldHVybiBlfWZ1bmN0aW9uIFlhKGUsdCl7cmV0dXJuIGU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGUsdCkpXTp0fWZ1bmN0aW9uIFhhKGUsdCl7cmV0dXJuIGU/bChPYmplY3QuY3JlYXRlKG51bGwpLGUsdCk6dH1mdW5jdGlvbiBaYShlLHQpe3JldHVybiBlP3AoZSkmJnAodCk/Wy4uLm5ldyBTZXQoWy4uLmUsLi4udF0pXTpsKE9iamVjdC5jcmVhdGUobnVsbCksTmEoZSksTmEodD8/e30pKTp0fWZ1bmN0aW9uIFFhKGUsdCl7aWYoIWUpcmV0dXJuIHQ7aWYoIXQpcmV0dXJuIGU7bGV0IG49bChPYmplY3QuY3JlYXRlKG51bGwpLGUpO2ZvcihsZXQgciBpbiB0KW5bcl09WWEoZVtyXSx0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiAkYSgpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOm8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIGVvPTA7ZnVuY3Rpb24gdG8oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyPW51bGwpe3Yobil8fChuPWwoe30sbikpLHIhPW51bGwmJiF4KHIpJiYocj1udWxsKTtsZXQgaT0kYSgpLGE9bmV3IFdlYWtTZXQsbz1bXSxzPSExLGM9aS5hcHA9e191aWQ6ZW8rKyxfY29tcG9uZW50Om4sX3Byb3BzOnIsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OmksX2luc3RhbmNlOm51bGwsdmVyc2lvbjppYyxnZXQgY29uZmlnKCl7cmV0dXJuIGkuY29uZmlnfSxzZXQgY29uZmlnKGUpe30sdXNlKGUsLi4udCl7cmV0dXJuIGEuaGFzKGUpfHwoZSYmdihlLmluc3RhbGwpPyhhLmFkZChlKSxlLmluc3RhbGwoYywuLi50KSk6dihlKSYmKGEuYWRkKGUpLGUoYywuLi50KSkpLGN9LG1peGluKGUpe3JldHVybiBpLm1peGlucy5pbmNsdWRlcyhlKXx8aS5taXhpbnMucHVzaChlKSxjfSxjb21wb25lbnQoZSx0KXtyZXR1cm4gdD8oaS5jb21wb25lbnRzW2VdPXQsYyk6aS5jb21wb25lbnRzW2VdfSxkaXJlY3RpdmUoZSx0KXtyZXR1cm4gdD8oaS5kaXJlY3RpdmVzW2VdPXQsYyk6aS5kaXJlY3RpdmVzW2VdfSxtb3VudChhLG8sbCl7aWYoIXMpe2xldCB1PWMuX2NlVk5vZGV8fEgobixyKTtyZXR1cm4gdS5hcHBDb250ZXh0PWksbD09PSEwP2w9YHN2Z2A6bD09PSExJiYobD12b2lkIDApLG8mJnQ/dCh1LGEpOmUodSxhLGwpLHM9ITAsYy5fY29udGFpbmVyPWEsYS5fX3Z1ZV9hcHBfXz1jLFFzKHUuY29tcG9uZW50KX19LG9uVW5tb3VudChlKXtvLnB1c2goZSl9LHVubW91bnQoKXtzJiYoSG4obyxjLl9pbnN0YW5jZSwxNiksZShudWxsLGMuX2NvbnRhaW5lciksZGVsZXRlIGMuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUoZSx0KXtyZXR1cm4gaS5wcm92aWRlc1tlXT10LGN9LHJ1bldpdGhDb250ZXh0KGUpe2xldCB0PW5vO25vPWM7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtubz10fX19O3JldHVybiBjfX12YXIgbm89bnVsbDtmdW5jdGlvbiBybyhlLHQsbj1yKXtsZXQgaT1GcygpLGE9RSh0KSxvPW9lKHQpLHM9aW8oZSxhKSxjPXZuKChzLGMpPT57bGV0IGwsdT1yLGQ7cmV0dXJuIFRyKCgpPT57bGV0IHQ9ZVthXTtEKGwsdCkmJihsPXQsYygpKX0pLHtnZXQoKXtyZXR1cm4gcygpLG4uZ2V0P24uZ2V0KGwpOmx9LHNldChlKXtsZXQgcz1uLnNldD9uLnNldChlKTplO2lmKCFEKHMsbCkmJiEodSE9PXImJkQoZSx1KSkpcmV0dXJuO2xldCBmPWkudm5vZGUucHJvcHMscD0hIShmJiYodCBpbiBmfHxhIGluIGZ8fG8gaW4gZikmJihgb25VcGRhdGU6JHt0fWBpbiBmfHxgb25VcGRhdGU6JHthfWBpbiBmfHxgb25VcGRhdGU6JHtvfWBpbiBmKSk7cHx8KGw9ZSxjKCkpLGkuZW1pdChgdXBkYXRlOiR7dH1gLHMpLEQoZSx1KSYmKEQoZSxzKSYmIUQocyxkKXx8cCYmdSE9PXImJiFEKHMsbCkpJiZjKCksdT1lLGQ9c319fSk7cmV0dXJuIGNbU3ltYm9sLml0ZXJhdG9yXT0oKT0+e2xldCBlPTA7cmV0dXJue25leHQoKXtyZXR1cm4gZTwyP3t2YWx1ZTplKys/c3x8cjpjLGRvbmU6ITF9Ontkb25lOiEwfX19fSxjfXZhciBpbz0oZSx0KT0+dD09PWBtb2RlbFZhbHVlYHx8dD09PWBtb2RlbC12YWx1ZWA/ZS5tb2RlbE1vZGlmaWVyczplW2Ake3R9TW9kaWZpZXJzYF18fGVbYCR7RSh0KX1Nb2RpZmllcnNgXXx8ZVtgJHtvZSh0KX1Nb2RpZmllcnNgXTtmdW5jdGlvbiBhbyhlLHQsLi4ubil7aWYoZS5pc1VubW91bnRlZClyZXR1cm47bGV0IGk9ZS52bm9kZS5wcm9wc3x8cixhPW4sbz10LnN0YXJ0c1dpdGgoYHVwZGF0ZTpgKSxzPW8mJmlvKGksdC5zbGljZSg3KSk7cyYmKHMudHJpbSYmKGE9bi5tYXAoZT0+eShlKT9lLnRyaW0oKTplKSkscy5udW1iZXImJihhPW4ubWFwKGRlKSkpO2xldCBjLGw9aVtjPWNlKHQpXXx8aVtjPWNlKEUodCkpXTshbCYmbyYmKGw9aVtjPWNlKG9lKHQpKV0pLGwmJkhuKGwsZSw2LGEpO2xldCB1PWlbYytgT25jZWBdO2lmKHUpe2lmKCFlLmVtaXR0ZWQpZS5lbWl0dGVkPXt9O2Vsc2UgaWYoZS5lbWl0dGVkW2NdKXJldHVybjtlLmVtaXR0ZWRbY109ITAsSG4odSxlLDYsYSl9fXZhciBvbz1uZXcgV2Vha01hcDtmdW5jdGlvbiBzbyhlLHQsbj0hMSl7bGV0IHI9bj9vbzp0LmVtaXRzQ2FjaGUsaT1yLmdldChlKTtpZihpIT09dm9pZCAwKXJldHVybiBpO2xldCBhPWUuZW1pdHMsbz17fSxzPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57bGV0IG49c28oZSx0LCEwKTtuJiYocz0hMCxsKG8sbikpfTshbiYmdC5taXhpbnMubGVuZ3RoJiZ0Lm1peGlucy5mb3JFYWNoKHIpLGUuZXh0ZW5kcyYmcihlLmV4dGVuZHMpLGUubWl4aW5zJiZlLm1peGlucy5mb3JFYWNoKHIpfXJldHVybiFhJiYhcz8oeChlKSYmci5zZXQoZSxudWxsKSxudWxsKToocChhKT9hLmZvckVhY2goZT0+b1tlXT1udWxsKTpsKG8sYSkseChlKSYmci5zZXQoZSxvKSxvKX1mdW5jdGlvbiBjbyhlLHQpe3JldHVybiFlfHwhcyh0KT8hMToodD10LnNsaWNlKDIpLHQ9dD09PWBPbmNlYD90OnQucmVwbGFjZSgvT25jZSQvLGBgKSxmKGUsdFswXS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSkpfHxmKGUsb2UodCkpfHxmKGUsdCkpfWZ1bmN0aW9uIGxvKGUpe2xldHt0eXBlOnQsdm5vZGU6bixwcm94eTpyLHdpdGhQcm94eTppLHByb3BzT3B0aW9uczpbYV0sc2xvdHM6byxhdHRyczpzLGVtaXQ6bCxyZW5kZXI6dSxyZW5kZXJDYWNoZTpkLHByb3BzOmYsZGF0YTpwLHNldHVwU3RhdGU6bSxjdHg6aCxpbmhlcml0QXR0cnM6Z309ZSxfPWZyKGUpLHYseTt0cnl7aWYobi5zaGFwZUZsYWcmNCl7bGV0IGU9aXx8cix0PWU7dj1Fcyh1LmNhbGwodCxlLGQsZixtLHAsaCkpLHk9c31lbHNle2xldCBlPXQ7dj1FcyhlLmxlbmd0aD4xP2UoZix7YXR0cnM6cyxzbG90czpvLGVtaXQ6bH0pOmUoZixudWxsKSkseT10LnByb3BzP3M6Zm8ocyl9fWNhdGNoKHQpe3VzLmxlbmd0aD0wLFVuKHQsZSwxKSx2PUgoY3MpfWxldCBiPXY7aWYoeSYmZyE9PSExKXtsZXQgZT1PYmplY3Qua2V5cyh5KSx7c2hhcGVGbGFnOnR9PWI7ZS5sZW5ndGgmJnQmNyYmKGEmJmUuc29tZShjKSYmKHk9cG8oeSxhKSksYj1DcyhiLHksITEsITApKX1yZXR1cm4gbi5kaXJzJiYoYj1DcyhiLG51bGwsITEsITApLGIuZGlycz1iLmRpcnM/Yi5kaXJzLmNvbmNhdChuLmRpcnMpOm4uZGlycyksbi50cmFuc2l0aW9uJiZyaShNcihiLnR5cGUpJiZuaShiKXx8YixuLnRyYW5zaXRpb24pLHY9YixmcihfKSx2fWZ1bmN0aW9uIHVvKGUsdD0hMCl7bGV0IG47Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF07aWYoZ3Mocikpe2lmKHIudHlwZSE9PWNzfHxyLmNoaWxkcmVuPT09YHYtaWZgKXtpZihuKXJldHVybjtuPXJ9fWVsc2UgcmV0dXJufXJldHVybiBufXZhciBmbz1lPT57bGV0IHQ7Zm9yKGxldCBuIGluIGUpKG49PT1gY2xhc3NgfHxuPT09YHN0eWxlYHx8cyhuKSkmJigodHx8PXt9KVtuXT1lW25dKTtyZXR1cm4gdH0scG89KGUsdCk9PntsZXQgbj17fTtmb3IobGV0IHIgaW4gZSkoIWMocil8fCEoci5zbGljZSg5KWluIHQpKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59O2Z1bmN0aW9uIG1vKGUsdCxuKXtsZXR7cHJvcHM6cixjaGlsZHJlbjppLGNvbXBvbmVudDphfT1lLHtwcm9wczpvLGNoaWxkcmVuOnMscGF0Y2hGbGFnOmN9PXQsbD1hLmVtaXRzT3B0aW9ucztpZih0LmRpcnN8fHQudHJhbnNpdGlvbilyZXR1cm4hMDtpZihuJiZjPj0wKXtpZihjJjEwMjQpcmV0dXJuITA7aWYoYyYxNilyZXR1cm4gcj9obyhyLG8sbCk6ISFvO2lmKGMmOCl7bGV0IGU9dC5keW5hbWljUHJvcHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPWVbdF07aWYoZ28obyxyLG4pJiYhY28obCxuKSlyZXR1cm4hMH19fWVsc2UgcmV0dXJuKGl8fHMpJiYoIXN8fCFzLiRzdGFibGUpPyEwOnI9PT1vPyExOnI/IW98fGhvKHIsbyxsKTohIW87cmV0dXJuITF9ZnVuY3Rpb24gaG8oZSx0LG4pe2xldCByPU9iamVjdC5rZXlzKHQpO2lmKHIubGVuZ3RoIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXJldHVybiEwO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKXtsZXQgYT1yW2ldO2lmKGdvKHQsZSxhKSYmIWNvKG4sYSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZ28oZSx0LG4pe2xldCByPWVbbl0saT10W25dO3JldHVybiBuPT09YHN0eWxlYCYmeChyKSYmeChpKT8hRWUocixpKTpyIT09aX1mdW5jdGlvbiBfbyh7dm5vZGU6ZSxwYXJlbnQ6dCxzdXNwZW5zZTpufSxyKXtmb3IoO3Q7KXtsZXQgbj10LnN1YlRyZWU7aWYobi5zdXNwZW5zZSYmbi5zdXNwZW5zZS5hY3RpdmVCcmFuY2g9PT1lJiYobi5zdXNwZW5zZS52bm9kZS5lbD1uLmVsPXIsZT1uKSxuPT09ZSkoZT10LnZub2RlKS5lbD1yLHQ9dC5wYXJlbnQ7ZWxzZSBicmVha31uJiZuLmFjdGl2ZUJyYW5jaD09PWUmJihuLnZub2RlLmVsPXIpfXZhciB2bz17fSx5bz0oKT0+T2JqZWN0LmNyZWF0ZSh2byksYm89ZT0+T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09dm87ZnVuY3Rpb24geG8oZSx0LG4scj0hMSl7bGV0IGk9e30sYT15bygpO2UucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLENvKGUsdCxpLGEpO2ZvcihsZXQgdCBpbiBlLnByb3BzT3B0aW9uc1swXSl0IGluIGl8fChpW3RdPXZvaWQgMCk7ZS5wcm9wcz1uP3I/aTpRdChpKTplLnR5cGUucHJvcHM/aTphLGUuYXR0cnM9YX1mdW5jdGlvbiBTbyhlLHQsbixyKXtsZXR7cHJvcHM6aSxhdHRyczphLHZub2RlOntwYXRjaEZsYWc6b319PWUscz1BKGkpLFtjXT1lLnByb3BzT3B0aW9ucyxsPSExO2lmKChyfHxvPjApJiYhKG8mMTYpKXtpZihvJjgpe2xldCBuPWUudm5vZGUuZHluYW1pY1Byb3BzO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtsZXQgbz1uW3JdO2lmKGNvKGUuZW1pdHNPcHRpb25zLG8pKWNvbnRpbnVlO2xldCB1PXRbb107aWYoYyl7aWYoZihhLG8pKXUhPT1hW29dJiYoYVtvXT11LGw9ITApO2Vsc2V7bGV0IHQ9RShvKTtpW3RdPXdvKGMscyx0LHUsZSwhMSl9fWVsc2UgdSE9PWFbb10mJihhW29dPXUsbD0hMCl9fX1lbHNle0NvKGUsdCxpLGEpJiYobD0hMCk7bGV0IHI7Zm9yKGxldCBhIGluIHMpKCF0fHwhZih0LGEpJiYoKHI9b2UoYSkpPT09YXx8IWYodCxyKSkpJiYoYz9uJiYoblthXSE9PXZvaWQgMHx8bltyXSE9PXZvaWQgMCkmJihpW2FdPXdvKGMscyxhLHZvaWQgMCxlLCEwKSk6ZGVsZXRlIGlbYV0pO2lmKGEhPT1zKWZvcihsZXQgZSBpbiBhKSghdHx8IWYodCxlKSkmJihkZWxldGUgYVtlXSxsPSEwKX1sJiZtdChlLmF0dHJzLGBzZXRgLGBgKX1mdW5jdGlvbiBDbyhlLHQsbixpKXtsZXRbYSxvXT1lLnByb3BzT3B0aW9ucyxzPSExLGM7aWYodClmb3IobGV0IHIgaW4gdCl7aWYobmUocikpY29udGludWU7bGV0IGw9dFtyXSx1O2EmJmYoYSx1PUUocikpPyFvfHwhby5pbmNsdWRlcyh1KT9uW3VdPWw6KGN8fD17fSlbdV09bDpjbyhlLmVtaXRzT3B0aW9ucyxyKXx8KCEociBpbiBpKXx8bCE9PWlbcl0pJiYoaVtyXT1sLHM9ITApfWlmKG8pe2xldCB0PUEobiksaT1jfHxyO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKXtsZXQgcz1vW3JdO25bc109d28oYSx0LHMsaVtzXSxlLCFmKGkscykpfX1yZXR1cm4gc31mdW5jdGlvbiB3byhlLHQsbixyLGksYSl7bGV0IG89ZVtuXTtpZihvIT1udWxsKXtsZXQgZT1mKG8sYGRlZmF1bHRgKTtpZihlJiZyPT09dm9pZCAwKXtsZXQgZT1vLmRlZmF1bHQ7aWYoby50eXBlIT09RnVuY3Rpb24mJiFvLnNraXBGYWN0b3J5JiZ2KGUpKXtsZXR7cHJvcHNEZWZhdWx0czphfT1pO2lmKG4gaW4gYSlyPWFbbl07ZWxzZXtsZXQgbz1ScyhpKTtyPWFbbl09ZS5jYWxsKG51bGwsdCksbygpfX1lbHNlIHI9ZTtpLmNlJiZpLmNlLl9zZXRQcm9wKG4scil9b1swXSYmKGEmJiFlP3I9ITE6b1sxXSYmKHI9PT1gYHx8cj09PW9lKG4pKSYmKHI9ITApKX1yZXR1cm4gcn12YXIgVG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRW8oZSx0LG49ITEpe2xldCBhPW4/VG86dC5wcm9wc0NhY2hlLG89YS5nZXQoZSk7aWYobylyZXR1cm4gbztsZXQgcz1lLnByb3BzLGM9e30sdT1bXSxkPSExO2lmKCF2KGUpKXtsZXQgcj1lPT57ZD0hMDtsZXRbbixyXT1FbyhlLHQsITApO2woYyxuKSxyJiZ1LnB1c2goLi4ucil9OyFuJiZ0Lm1peGlucy5sZW5ndGgmJnQubWl4aW5zLmZvckVhY2gociksZS5leHRlbmRzJiZyKGUuZXh0ZW5kcyksZS5taXhpbnMmJmUubWl4aW5zLmZvckVhY2gocil9aWYoIXMmJiFkKXJldHVybiB4KGUpJiZhLnNldChlLGkpLGk7aWYocChzKSlmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IHQ9RShzW2VdKTtEbyh0KSYmKGNbdF09cil9ZWxzZSBpZihzKWZvcihsZXQgZSBpbiBzKXtsZXQgdD1FKGUpO2lmKERvKHQpKXtsZXQgbj1zW2VdLHI9Y1t0XT1wKG4pfHx2KG4pP3t0eXBlOm59Omwoe30sbiksaT1yLnR5cGUsYT0hMSxvPSEwO2lmKHAoaSkpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDsrK2Upe2xldCB0PWlbZV0sbj12KHQpJiZ0Lm5hbWU7aWYobj09PWBCb29sZWFuYCl7YT0hMDticmVha31uPT09YFN0cmluZ2AmJihvPSExKX1lbHNlIGE9dihpKSYmaS5uYW1lPT09YEJvb2xlYW5gO3JbMF09YSxyWzFdPW8sKGF8fGYocixgZGVmYXVsdGApKSYmdS5wdXNoKHQpfX1sZXQgbT1bYyx1XTtyZXR1cm4geChlKSYmYS5zZXQoZSxtKSxtfWZ1bmN0aW9uIERvKGUpe3JldHVybiBlWzBdIT09YCRgJiYhbmUoZSl9dmFyIE9vPWU9PmU9PT1gX2B8fGU9PT1gX2N0eGB8fGU9PT1gJHN0YWJsZWAsa289ZT0+cChlKT9lLm1hcChFcyk6W0VzKGUpXSxBbz0oZSx0LG4pPT57aWYodC5fbilyZXR1cm4gdDtsZXQgcj1QKCguLi5lKT0+a28odCguLi5lKSksbik7cmV0dXJuIHIuX2M9ITEscn0sam89KGUsdCxuKT0+e2xldCByPWUuX2N0eDtmb3IobGV0IG4gaW4gZSl7aWYoT28obikpY29udGludWU7bGV0IGk9ZVtuXTtpZih2KGkpKXRbbl09QW8obixpLHIpO2Vsc2UgaWYoaSE9bnVsbCl7bGV0IGU9a28oaSk7dFtuXT0oKT0+ZX19fSxNbz0oZSx0KT0+e2xldCBuPWtvKHQpO2Uuc2xvdHMuZGVmYXVsdD0oKT0+bn0sTm89KGUsdCxuKT0+e2ZvcihsZXQgciBpbiB0KShufHwhT28ocikpJiYoZVtyXT10W3JdKX0sUG89KGUsdCxuKT0+e2xldCByPWUuc2xvdHM9eW8oKTtpZihlLnZub2RlLnNoYXBlRmxhZyYzMil7bGV0IGU9dC5fO2U/KE5vKHIsdCxuKSxuJiZ1ZShyLGBfYCxlLCEwKSk6am8odCxyKX1lbHNlIHQmJk1vKGUsdCl9LEZvPShlLHQsbik9PntsZXR7dm5vZGU6aSxzbG90czphfT1lLG89ITAscz1yO2lmKGkuc2hhcGVGbGFnJjMyKXtsZXQgZT10Ll87ZT9uJiZlPT09MT9vPSExOk5vKGEsdCxuKToobz0hdC4kc3RhYmxlLGpvKHQsYSkpLHM9dH1lbHNlIHQmJihNbyhlLHQpLHM9e2RlZmF1bHQ6MX0pO2lmKG8pZm9yKGxldCBlIGluIGEpIU9vKGUpJiZzW2VdPT1udWxsJiZkZWxldGUgYVtlXX0sSW89aXM7ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIHpvKGUpfWZ1bmN0aW9uIFJvKGUpe3JldHVybiB6byhlLHZpKX1mdW5jdGlvbiB6byhlLHQpe2xldCBuPW1lKCk7bi5fX1ZVRV9fPSEwO2xldHtpbnNlcnQ6byxyZW1vdmU6cyxwYXRjaFByb3A6YyxjcmVhdGVFbGVtZW50OmwsY3JlYXRlVGV4dDp1LGNyZWF0ZUNvbW1lbnQ6ZCxzZXRUZXh0OmYsc2V0RWxlbWVudFRleHQ6cCxwYXJlbnROb2RlOm0sbmV4dFNpYmxpbmc6aCxzZXRTY29wZUlkOmc9YSxpbnNlcnRTdGF0aWNDb250ZW50Ol99PWUsdj0oZSx0LG4scj1udWxsLGk9bnVsbCxhPW51bGwsbz12b2lkIDAscz1udWxsLGM9ISF0LmR5bmFtaWNDaGlsZHJlbik9PntpZihlPT09dClyZXR1cm47ZSYmIV9zKGUsdCkmJihyPU8oZSksZ2UoZSxpLGEsITApLGU9bnVsbCksdC5wYXRjaEZsYWc9PT0tMiYmKGM9ITEsdC5keW5hbWljQ2hpbGRyZW49bnVsbCk7bGV0e3R5cGU6bCxyZWY6dSxzaGFwZUZsYWc6ZH09dDtzd2l0Y2gobCl7Y2FzZSBzczp5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgY3M6YihlLHQsbixyKTticmVhaztjYXNlIGxzOmU/P3godCxuLHIsbyk7YnJlYWs7Y2FzZSBMOmFlKGUsdCxuLHIsaSxhLG8scyxjKTticmVhaztkZWZhdWx0OmQmMT93KGUsdCxuLHIsaSxhLG8scyxjKTpkJjY/b2UoZSx0LG4scixpLGEsbyxzLGMpOihkJjY0fHxkJjEyOCkmJmwucHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxDZSl9dSE9bnVsbCYmaT91aSh1LGUmJmUucmVmLGEsdHx8ZSwhdCk6dT09bnVsbCYmZSYmZS5yZWYhPW51bGwmJnVpKGUucmVmLG51bGwsYSxlLCEwKX0seT0oZSx0LG4scik9PntpZihlPT1udWxsKW8odC5lbD11KHQuY2hpbGRyZW4pLG4scik7ZWxzZXtsZXQgbj10LmVsPWUuZWw7dC5jaGlsZHJlbiE9PWUuY2hpbGRyZW4mJmYobix0LmNoaWxkcmVuKX19LGI9KGUsdCxuLHIpPT57ZT09bnVsbD9vKHQuZWw9ZCh0LmNoaWxkcmVufHxgYCksbixyKTp0LmVsPWUuZWx9LHg9KGUsdCxuLHIpPT57W2UuZWwsZS5hbmNob3JdPV8oZS5jaGlsZHJlbix0LG4scixlLmVsLGUuYW5jaG9yKX0sUz0oe2VsOmUsYW5jaG9yOnR9LG4scik9PntsZXQgaTtmb3IoO2UmJmUhPT10OylpPWgoZSksbyhlLG4sciksZT1pO28odCxuLHIpfSxDPSh7ZWw6ZSxhbmNob3I6dH0pPT57bGV0IG47Zm9yKDtlJiZlIT09dDspbj1oKGUpLHMoZSksZT1uO3ModCl9LHc9KGUsdCxuLHIsaSxhLG8scyxjKT0+e2lmKHQudHlwZT09PWBzdmdgP289YHN2Z2A6dC50eXBlPT09YG1hdGhgJiYobz1gbWF0aG1sYCksZT09bnVsbCllZSh0LG4scixpLGEsbyxzLGMpO2Vsc2V7bGV0IG49ZS5lbCYmZS5lbC5faXNWdWVDRT9lLmVsOm51bGw7dHJ5e24mJm4uX2JlZ2luUGF0Y2goKSxyZShlLHQsaSxhLG8scyxjKX1maW5hbGx5e24mJm4uX2VuZFBhdGNoKCl9fX0sZWU9KGUsdCxuLHIsaSxhLHMsdSk9PntsZXQgZCxmLHtwcm9wczptLHNoYXBlRmxhZzpoLHRyYW5zaXRpb246ZyxkaXJzOl99PWU7aWYoZD1lLmVsPWwoZS50eXBlLGEsbSYmbS5pcyxtKSxoJjg/cChkLGUuY2hpbGRyZW4pOmgmMTYmJlQoZS5jaGlsZHJlbixkLG51bGwscixpLEJvKGUsYSkscyx1KSxfJiZfcihlLG51bGwscixgY3JlYXRlZGApLHRlKGQsZSxlLnNjb3BlSWQscyxyKSxtKXtmb3IobGV0IGUgaW4gbSllIT09YHZhbHVlYCYmIW5lKGUpJiZjKGQsZSxudWxsLG1bZV0sYSxyKTtgdmFsdWVgaW4gbSYmYyhkLGB2YWx1ZWAsbnVsbCxtLnZhbHVlLGEpLChmPW0ub25Wbm9kZUJlZm9yZU1vdW50KSYmQXMoZixyLGUpfV8mJl9yKGUsbnVsbCxyLGBiZWZvcmVNb3VudGApO2xldCB2PUhvKGksZyk7diYmZy5iZWZvcmVFbnRlcihkKSxvKGQsdCxuKSwoKGY9bSYmbS5vblZub2RlTW91bnRlZCl8fHZ8fF8pJiZJbygoKT0+e3RyeXtmJiZBcyhmLHIsZSksdiYmZy5lbnRlcihkKSxfJiZfcihlLG51bGwscixgbW91bnRlZGApfWZpbmFsbHl7fX0saSl9LHRlPShlLHQsbixyLGkpPT57aWYobiYmZyhlLG4pLHIpZm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspZyhlLHJbdF0pO2lmKGkpe2xldCBuPWkuc3ViVHJlZTtpZih0PT09bnx8Sm8obi50eXBlKSYmKG4uc3NDb250ZW50PT09dHx8bi5zc0ZhbGxiYWNrPT09dCkpe2xldCB0PWkudm5vZGU7dGUoZSx0LHQuc2NvcGVJZCx0LnNsb3RTY29wZUlkcyxpLnBhcmVudCl9fX0sVD0oZSx0LG4scixpLGEsbyxzLGM9MCk9Pntmb3IobGV0IGw9YztsPGUubGVuZ3RoO2wrKyl7bGV0IGM9ZVtsXT1zP0RzKGVbbF0pOkVzKGVbbF0pO3YobnVsbCxjLHQsbixyLGksYSxvLHMpfX0scmU9KGUsdCxuLGksYSxvLHMpPT57bGV0IGw9dC5lbD1lLmVsLHtwYXRjaEZsYWc6dSxkeW5hbWljQ2hpbGRyZW46ZCxkaXJzOmZ9PXQ7dXw9ZS5wYXRjaEZsYWcmMTY7bGV0IG09ZS5wcm9wc3x8cixoPXQucHJvcHN8fHIsZztpZihuJiZWbyhuLCExKSwoZz1oLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZBcyhnLG4sdCxlKSxmJiZfcih0LGUsbixgYmVmb3JlVXBkYXRlYCksbiYmVm8obiwhMCksZCYmKCFlLmR5bmFtaWNDaGlsZHJlbnx8ZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoIT09ZC5sZW5ndGgpJiYodT0wLHM9ITEsZD1udWxsKSwobS5pbm5lckhUTUwmJmguaW5uZXJIVE1MPT1udWxsfHxtLnRleHRDb250ZW50JiZoLnRleHRDb250ZW50PT1udWxsKSYmcChsLGBgKSxkP2llKGUuZHluYW1pY0NoaWxkcmVuLGQsbCxuLGksQm8odCxhKSxvKTpzfHxkZShlLHQsbCxudWxsLG4saSxCbyh0LGEpLG8sITEpLHU+MCl7aWYodSYxNilFKGwsbSxoLG4sYSk7ZWxzZSBpZih1JjImJm0uY2xhc3MhPT1oLmNsYXNzJiZjKGwsYGNsYXNzYCxudWxsLGguY2xhc3MsYSksdSY0JiZjKGwsYHN0eWxlYCxtLnN0eWxlLGguc3R5bGUsYSksdSY4KXtsZXQgZT10LmR5bmFtaWNQcm9wcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxpPW1bcl0sbz1oW3JdOyhvIT09aXx8cj09PWB2YWx1ZWApJiZjKGwscixpLG8sYSxuKX19dSYxJiZlLmNoaWxkcmVuIT09dC5jaGlsZHJlbiYmcChsLHQuY2hpbGRyZW4pfWVsc2UhcyYmZD09bnVsbCYmRShsLG0saCxuLGEpOygoZz1oLm9uVm5vZGVVcGRhdGVkKXx8ZikmJklvKCgpPT57ZyYmQXMoZyxuLHQsZSksZiYmX3IodCxlLG4sYHVwZGF0ZWRgKX0saSl9LGllPShlLHQsbixyLGksYSxvKT0+e2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgYz1lW3NdLGw9dFtzXSx1PWMuZWwmJihjLnR5cGU9PT1MfHwhX3MoYyxsKXx8Yy5zaGFwZUZsYWcmMTk4KT9tKGMuZWwpOm47dihjLGwsdSxudWxsLHIsaSxhLG8sITApfX0sRT0oZSx0LG4saSxhKT0+e2lmKHQhPT1uKXtpZih0IT09cilmb3IobGV0IHIgaW4gdCkhbmUocikmJiEociBpbiBuKSYmYyhlLHIsdFtyXSxudWxsLGEsaSk7Zm9yKGxldCByIGluIG4pe2lmKG5lKHIpKWNvbnRpbnVlO2xldCBvPW5bcl0scz10W3JdO28hPT1zJiZyIT09YHZhbHVlYCYmYyhlLHIscyxvLGEsaSl9YHZhbHVlYGluIG4mJmMoZSxgdmFsdWVgLHQudmFsdWUsbi52YWx1ZSxhKX19LGFlPShlLHQsbixyLGksYSxzLGMsbCk9PntsZXQgZD10LmVsPWU/ZS5lbDp1KGBgKSxmPXQuYW5jaG9yPWU/ZS5hbmNob3I6dShgYCkse3BhdGNoRmxhZzpwLGR5bmFtaWNDaGlsZHJlbjptLHNsb3RTY29wZUlkczpofT10O2gmJihjPWM/Yy5jb25jYXQoaCk6aCksZT09bnVsbD8obyhkLG4sciksbyhmLG4sciksVCh0LmNoaWxkcmVufHxbXSxuLGYsaSxhLHMsYyxsKSk6cD4wJiZwJjY0JiZtJiZlLmR5bmFtaWNDaGlsZHJlbiYmZS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoPT09bS5sZW5ndGg/KGllKGUuZHluYW1pY0NoaWxkcmVuLG0sbixpLGEscyxjKSwodC5rZXkhPW51bGx8fGkmJnQ9PT1pLnN1YlRyZWUpJiZVbyhlLHQsITApKTpkZShlLHQsbixmLGksYSxzLGMsbCl9LG9lPShlLHQsbixyLGksYSxvLHMsYyk9Pnt0LnNsb3RTY29wZUlkcz1zLGU9PW51bGw/dC5zaGFwZUZsYWcmNTEyP2kuY3R4LmFjdGl2YXRlKHQsbixyLG8sYyk6c2UodCxuLHIsaSxhLG8sYyk6Y2UoZSx0LGMpfSxzZT0oZSx0LG4scixpLGEsbyk9PntsZXQgcz1lLmNvbXBvbmVudD1OcyhlLHIsaSk7aWYoemkoZSkmJihzLmN0eC5yZW5kZXJlcj1DZSksSHMocywhMSxvKSxzLmFzeW5jRGVwKXtpZihpJiZpLnJlZ2lzdGVyRGVwKHMsRCxvKSwhZS5lbCl7bGV0IHI9cy5zdWJUcmVlPUgoY3MpO2IobnVsbCxyLHQsbiksZS5wbGFjZWhvbGRlcj1yLmVsfX1lbHNlIEQocyxlLHQsbixpLGEsbyl9LGNlPShlLHQsbik9PntsZXQgcj10LmNvbXBvbmVudD1lLmNvbXBvbmVudDtpZihtbyhlLHQsbikpe2lmKHIuYXN5bmNEZXAmJiFyLmFzeW5jUmVzb2x2ZWQpe3VlKHIsdCxuKTtyZXR1cm59ci5uZXh0PXQsci51cGRhdGUoKX1lbHNlIHQuZWw9ZS5lbCxyLnZub2RlPXR9LEQ9KGUsdCxuLHIsaSxhLG8pPT57bGV0IHM9KCk9PntpZihlLmlzTW91bnRlZCl7bGV0e25leHQ6dCxidTpuLHU6cixwYXJlbnQ6cyx2bm9kZTpjfT1lO3tsZXQgbj1HbyhlKTtpZihuKXt0JiYodC5lbD1jLmVsLHVlKGUsdCxvKSksbi5hc3luY0RlcC50aGVuKCgpPT57SW8oKCk9PntlLmlzVW5tb3VudGVkfHxsKCl9LGkpfSk7cmV0dXJufX1sZXQgdT10LGQ7Vm8oZSwhMSksdD8odC5lbD1jLmVsLHVlKGUsdCxvKSk6dD1jLG4mJmxlKG4pLChkPXQucHJvcHMmJnQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkFzKGQscyx0LGMpLFZvKGUsITApO2xldCBmPWxvKGUpLHA9ZS5zdWJUcmVlO2Uuc3ViVHJlZT1mLHYocCxmLG0ocC5lbCksTyhwKSxlLGksYSksdC5lbD1mLmVsLHU9PT1udWxsJiZfbyhlLGYuZWwpLHImJklvKHIsaSksKGQ9dC5wcm9wcyYmdC5wcm9wcy5vblZub2RlVXBkYXRlZCkmJklvKCgpPT5BcyhkLHMsdCxjKSxpKX1lbHNle2xldCBvLHtlbDpzLHByb3BzOmN9PXQse2JtOmwsbTp1LHBhcmVudDpkLHJvb3Q6Zix0eXBlOnB9PWUsbT1JaSh0KTtpZihWbyhlLCExKSxsJiZsZShsKSwhbSYmKG89YyYmYy5vblZub2RlQmVmb3JlTW91bnQpJiZBcyhvLGQsdCksVm8oZSwhMCkscyYmVGUpe2xldCB0PSgpPT57ZS5zdWJUcmVlPWxvKGUpLFRlKHMsZS5zdWJUcmVlLGUsaSxudWxsKX07bSYmcC5fX2FzeW5jSHlkcmF0ZT9wLl9fYXN5bmNIeWRyYXRlKHMsZSx0KTp0KCl9ZWxzZXtmLmNlJiZmLmNlLl9oYXNTaGFkb3dSb290KCkmJmYuY2UuX2luamVjdENoaWxkU3R5bGUocCxlLnBhcmVudD9lLnBhcmVudC50eXBlOnZvaWQgMCk7bGV0IG89ZS5zdWJUcmVlPWxvKGUpO3YobnVsbCxvLG4scixlLGksYSksdC5lbD1vLmVsfWlmKHUmJklvKHUsaSksIW0mJihvPWMmJmMub25Wbm9kZU1vdW50ZWQpKXtsZXQgZT10O0lvKCgpPT5BcyhvLGQsZSksaSl9KHQuc2hhcGVGbGFnJjI1Nnx8ZCYmSWkoZC52bm9kZSkmJmQudm5vZGUuc2hhcGVGbGFnJjI1NikmJmUuYSYmSW8oZS5hLGkpLGUuaXNNb3VudGVkPSEwLHQ9bj1yPW51bGx9fTtlLnNjb3BlLm9uKCk7bGV0IGM9ZS5lZmZlY3Q9bmV3IHplKHMpO2Uuc2NvcGUub2ZmKCk7bGV0IGw9ZS51cGRhdGU9Yy5ydW4uYmluZChjKSx1PWUuam9iPWMucnVuSWZEaXJ0eS5iaW5kKGMpO3UuaT1lLHUuaWQ9ZS51aWQsYy5zY2hlZHVsZXI9KCk9PmVyKHUpLFZvKGUsITApLGwoKX0sdWU9KGUsdCxuKT0+e3QuY29tcG9uZW50PWU7bGV0IHI9ZS52bm9kZS5wcm9wcztlLnZub2RlPXQsZS5uZXh0PW51bGwsU28oZSx0LnByb3BzLHIsbiksRm8oZSx0LmNoaWxkcmVuLG4pLG50KCkscnIoZSkscnQoKX0sZGU9KGUsdCxuLHIsaSxhLG8scyxjPSExKT0+e2xldCBsPWUmJmUuY2hpbGRyZW4sdT1lP2Uuc2hhcGVGbGFnOjAsZD10LmNoaWxkcmVuLHtwYXRjaEZsYWc6ZixzaGFwZUZsYWc6bX09dDtpZihmPjApe2lmKGYmMTI4KXtwZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufWlmKGYmMjU2KXtmZShsLGQsbixyLGksYSxvLHMsYyk7cmV0dXJufX1tJjg/KHUmMTYmJmJlKGwsaSxhKSxkIT09bCYmcChuLGQpKTp1JjE2P20mMTY/cGUobCxkLG4scixpLGEsbyxzLGMpOmJlKGwsaSxhLCEwKToodSY4JiZwKG4sYGApLG0mMTYmJlQoZCxuLHIsaSxhLG8scyxjKSl9LGZlPShlLHQsbixyLGEsbyxzLGMsbCk9PntlfHw9aSx0fHw9aTtsZXQgdT1lLmxlbmd0aCxkPXQubGVuZ3RoLGY9TWF0aC5taW4odSxkKSxwO2ZvcihwPTA7cDxmO3ArKyl7bGV0IHI9dFtwXT1sP0RzKHRbcF0pOkVzKHRbcF0pO3YoZVtwXSxyLG4sbnVsbCxhLG8scyxjLGwpfXU+ZD9iZShlLGEsbywhMCwhMSxmKTpUKHQsbixyLGEsbyxzLGMsbCxmKX0scGU9KGUsdCxuLHIsYSxvLHMsYyxsKT0+e2xldCB1PTAsZD10Lmxlbmd0aCxmPWUubGVuZ3RoLTEscD1kLTE7Zm9yKDt1PD1mJiZ1PD1wOyl7bGV0IHI9ZVt1XSxpPXRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKTtpZihfcyhyLGkpKXYocixpLG4sbnVsbCxhLG8scyxjLGwpO2Vsc2UgYnJlYWs7dSsrfWZvcig7dTw9ZiYmdTw9cDspe2xldCByPWVbZl0saT10W3BdPWw/RHModFtwXSk6RXModFtwXSk7aWYoX3MocixpKSl2KHIsaSxuLG51bGwsYSxvLHMsYyxsKTtlbHNlIGJyZWFrO2YtLSxwLS19aWYodT5mKXtpZih1PD1wKXtsZXQgZT1wKzEsaT1lPGQ/dFtlXS5lbDpyO2Zvcig7dTw9cDspdihudWxsLHRbdV09bD9Ecyh0W3VdKTpFcyh0W3VdKSxuLGksYSxvLHMsYyxsKSx1Kyt9fWVsc2UgaWYodT5wKWZvcig7dTw9ZjspZ2UoZVt1XSxhLG8sITApLHUrKztlbHNle2xldCBtPXUsaD11LGc9bmV3IE1hcDtmb3IodT1oO3U8PXA7dSsrKXtsZXQgZT10W3VdPWw/RHModFt1XSk6RXModFt1XSk7ZS5rZXkhPW51bGwmJmcuc2V0KGUua2V5LHUpfWxldCBfLHk9MCxiPXAtaCsxLHg9ITEsUz0wLEM9QXJyYXkoYik7Zm9yKHU9MDt1PGI7dSsrKUNbdV09MDtmb3IodT1tO3U8PWY7dSsrKXtsZXQgcj1lW3VdO2lmKHk+PWIpe2dlKHIsYSxvLCEwKTtjb250aW51ZX1sZXQgaTtpZihyLmtleSE9bnVsbClpPWcuZ2V0KHIua2V5KTtlbHNlIGZvcihfPWg7Xzw9cDtfKyspaWYoQ1tfLWhdPT09MCYmX3Mocix0W19dKSl7aT1fO2JyZWFrfWk9PT12b2lkIDA/Z2UocixhLG8sITApOihDW2ktaF09dSsxLGk+PVM/Uz1pOng9ITAsdihyLHRbaV0sbixudWxsLGEsbyxzLGMsbCkseSsrKX1sZXQgdz14P1dvKEMpOmk7Zm9yKF89dy5sZW5ndGgtMSx1PWItMTt1Pj0wO3UtLSl7bGV0IGU9aCt1LGk9dFtlXSxmPXRbZSsxXSxwPWUrMTxkP2YuZWx8fHFvKGYpOnI7Q1t1XT09PTA/dihudWxsLGksbixwLGEsbyxzLGMsbCk6eCYmKF88MHx8dSE9PXdbX10/aGUoaSxuLHAsMik6Xy0tKX19fSxoZT0oZSx0LG4scixpPW51bGwpPT57bGV0e2VsOmEsdHlwZTpjLHRyYW5zaXRpb246bCxjaGlsZHJlbjp1LHNoYXBlRmxhZzpkfT1lO2lmKGQmNil7aGUoZS5jb21wb25lbnQuc3ViVHJlZSx0LG4scik7cmV0dXJufWlmKGQmMTI4KXtlLnN1c3BlbnNlLm1vdmUodCxuLHIpO3JldHVybn1pZihkJjY0KXtjLm1vdmUoZSx0LG4sQ2UpO3JldHVybn1pZihjPT09TCl7byhhLHQsbik7Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspaGUodVtlXSx0LG4scik7byhlLmFuY2hvcix0LG4pO3JldHVybn1pZihjPT09bHMpe1MoZSx0LG4pO3JldHVybn1pZihyIT09MiYmZCYxJiZsKXtpZihyPT09MClsLnBlcnNpc3RlZCYmIWFbV3JdP28oYSx0LG4pOihsLmJlZm9yZUVudGVyKGEpLG8oYSx0LG4pLElvKCgpPT5sLmVudGVyKGEpLGkpKTtlbHNle2xldHtsZWF2ZTpyLGRlbGF5TGVhdmU6aSxhZnRlckxlYXZlOmN9PWwsdT0oKT0+e2UuY3R4LmlzVW5tb3VudGVkP3MoYSk6byhhLHQsbil9LGQ9KCk9PntsZXQgZT1hLl9pc0xlYXZpbmd8fCEhYVtXcl07YS5faXNMZWF2aW5nJiZhW1dyXSghMCksbC5wZXJzaXN0ZWQmJiFlP3UoKTpyKGEsKCk9Pnt1KCksYyYmYygpfSl9O2k/aShhLHUsZCk6ZCgpfX1lbHNlIG8oYSx0LG4pfSxnZT0oZSx0LG4scj0hMSxpPSExKT0+e2xldHt0eXBlOmEscHJvcHM6byxyZWY6cyxjaGlsZHJlbjpjLGR5bmFtaWNDaGlsZHJlbjpsLHNoYXBlRmxhZzp1LHBhdGNoRmxhZzpkLGRpcnM6ZixjYWNoZUluZGV4OnAsbWVtbzptfT1lO2lmKGQ9PT0tMiYmKGk9ITEpLHMhPW51bGwmJihudCgpLHVpKHMsbnVsbCxuLGUsITApLHJ0KCkpLHAhPW51bGwmJih0LnJlbmRlckNhY2hlW3BdPXZvaWQgMCksdSYyNTYpe3QuY3R4LmRlYWN0aXZhdGUoZSk7cmV0dXJufWxldCBoPXUmMSYmZixnPSFJaShlKSxfO2lmKGcmJihfPW8mJm8ub25Wbm9kZUJlZm9yZVVubW91bnQpJiZBcyhfLHQsZSksdSY2KXllKGUuY29tcG9uZW50LG4scik7ZWxzZXtpZih1JjEyOCl7ZS5zdXNwZW5zZS51bm1vdW50KG4scik7cmV0dXJufWgmJl9yKGUsbnVsbCx0LGBiZWZvcmVVbm1vdW50YCksdSY2ND9lLnR5cGUucmVtb3ZlKGUsdCxuLENlLHIpOmwmJiFsLmhhc09uY2UmJihhIT09THx8ZD4wJiZkJjY0KT9iZShsLHQsbiwhMSwhMCk6KGE9PT1MJiZkJjM4NHx8IWkmJnUmMTYpJiZiZShjLHQsbiksciYmX2UoZSl9bGV0IHY9bSE9bnVsbCYmcD09bnVsbDsoZyYmKF89byYmby5vblZub2RlVW5tb3VudGVkKXx8aHx8dikmJklvKCgpPT57XyYmQXMoXyx0LGUpLGgmJl9yKGUsbnVsbCx0LGB1bm1vdW50ZWRgKSx2JiYoZS5lbD1udWxsKX0sbil9LF9lPWU9PntsZXR7dHlwZTp0LGVsOm4sYW5jaG9yOnIsdHJhbnNpdGlvbjppfT1lO2lmKHQ9PT1MKXt2ZShuLHIpO3JldHVybn1pZih0PT09bHMpe0MoZSk7cmV0dXJufWxldCBhPSgpPT57cyhuKSxpJiYhaS5wZXJzaXN0ZWQmJmkuYWZ0ZXJMZWF2ZSYmaS5hZnRlckxlYXZlKCl9O2lmKGUuc2hhcGVGbGFnJjEmJmkmJiFpLnBlcnNpc3RlZCl7bGV0e2xlYXZlOnQsZGVsYXlMZWF2ZTpyfT1pLG89KCk9PnQobixhKTtyP3IoZS5lbCxhLG8pOm8oKX1lbHNlIGEoKX0sdmU9KGUsdCk9PntsZXQgbjtmb3IoO2UhPT10OyluPWgoZSkscyhlKSxlPW47cyh0KX0seWU9KGUsdCxuKT0+e2xldHtidW06cixzY29wZTppLGpvYjphLHN1YlRyZWU6byx1bTpzLG06YyxhOmx9PWU7S28oYyksS28obCksciYmbGUociksaS5zdG9wKCksYSYmKGEuZmxhZ3N8PTgsZ2UobyxlLHQsbikpLHMmJklvKHMsdCksSW8oKCk9PntlLmlzVW5tb3VudGVkPSEwfSx0KX0sYmU9KGUsdCxuLHI9ITEsaT0hMSxhPTApPT57Zm9yKGxldCBvPWE7bzxlLmxlbmd0aDtvKyspZ2UoZVtvXSx0LG4scixpKX0sTz1lPT57aWYoZS5zaGFwZUZsYWcmNilyZXR1cm4gTyhlLmNvbXBvbmVudC5zdWJUcmVlKTtpZihlLnNoYXBlRmxhZyYxMjgpcmV0dXJuIGUuc3VzcGVuc2UubmV4dCgpO2xldCB0PWgoZS5hbmNob3J8fGUuZWwpLG49dCYmdFtqcl07cmV0dXJuIG4/aChuKTp0fSx4ZT0hMSxTZT0oZSx0LG4pPT57bGV0IHI7ZT09bnVsbD90Ll92bm9kZSYmKGdlKHQuX3Zub2RlLG51bGwsbnVsbCwhMCkscj10Ll92bm9kZS5jb21wb25lbnQpOnYodC5fdm5vZGV8fG51bGwsZSx0LG51bGwsbnVsbCxudWxsLG4pLHQuX3Zub2RlPWUseGV8fD0oeGU9ITAscnIociksaXIoKSwhMSl9LENlPXtwOnYsdW06Z2UsbTpoZSxyOl9lLG10OnNlLG1jOlQscGM6ZGUscGJjOmllLG46TyxvOmV9LHdlLFRlO3JldHVybiB0JiYoW3dlLFRlXT10KENlKSkse3JlbmRlcjpTZSxoeWRyYXRlOndlLGNyZWF0ZUFwcDp0byhTZSx3ZSl9fWZ1bmN0aW9uIEJvKHt0eXBlOmUscHJvcHM6dH0sbil7cmV0dXJuIG49PT1gc3ZnYCYmZT09PWBmb3JlaWduT2JqZWN0YHx8bj09PWBtYXRobWxgJiZlPT09YGFubm90YXRpb24teG1sYCYmdCYmdC5lbmNvZGluZyYmdC5lbmNvZGluZy5pbmNsdWRlcyhgaHRtbGApP3ZvaWQgMDpufWZ1bmN0aW9uIFZvKHtlZmZlY3Q6ZSxqb2I6dH0sbil7bj8oZS5mbGFnc3w9MzIsdC5mbGFnc3w9NCk6KGUuZmxhZ3MmPS0zMyx0LmZsYWdzJj0tNSl9ZnVuY3Rpb24gSG8oZSx0KXtyZXR1cm4oIWV8fGUmJiFlLnBlbmRpbmdCcmFuY2gpJiZ0JiYhdC5wZXJzaXN0ZWR9ZnVuY3Rpb24gVW8oZSx0LG49ITEpe2xldCByPWUuY2hpbGRyZW4saT10LmNoaWxkcmVuO2lmKHAocikmJnAoaSkpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCB0PXJbZV0sYT1pW2VdO2Euc2hhcGVGbGFnJjEmJiFhLmR5bmFtaWNDaGlsZHJlbiYmKChhLnBhdGNoRmxhZzw9MHx8YS5wYXRjaEZsYWc9PT0zMikmJihhPWlbZV09RHMoaVtlXSksYS5lbD10LmVsKSwhbiYmYS5wYXRjaEZsYWchPT0tMiYmVW8odCxhKSksYS50eXBlPT09c3MmJihhLnBhdGNoRmxhZz09PS0xJiYoYT1pW2VdPURzKGEpKSxhLmVsPXQuZWwpLGEudHlwZT09PWNzJiYhYS5lbCYmKGEuZWw9dC5lbCl9fWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKSxuPVswXSxyLGksYSxvLHMsYz1lLmxlbmd0aDtmb3Iocj0wO3I8YztyKyspe2xldCBjPWVbcl07aWYoYyE9PTApe2lmKGk9bltuLmxlbmd0aC0xXSxlW2ldPGMpe3Rbcl09aSxuLnB1c2gocik7Y29udGludWV9Zm9yKGE9MCxvPW4ubGVuZ3RoLTE7YTxvOylzPWErbz4+MSxlW25bc11dPGM/YT1zKzE6bz1zO2M8ZVtuW2FdXSYmKGE+MCYmKHRbcl09blthLTFdKSxuW2FdPXIpfX1mb3IoYT1uLmxlbmd0aCxvPW5bYS0xXTthLS0+MDspblthXT1vLG89dFtvXTtyZXR1cm4gbn1mdW5jdGlvbiBHbyhlKXtsZXQgdD1lLnN1YlRyZWUuY29tcG9uZW50O2lmKHQpcmV0dXJuIHQuYXN5bmNEZXAmJiF0LmFzeW5jUmVzb2x2ZWQ/dDpHbyh0KX1mdW5jdGlvbiBLbyhlKXtpZihlKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmxhZ3N8PTh9ZnVuY3Rpb24gcW8oZSl7aWYoZS5wbGFjZWhvbGRlcilyZXR1cm4gZS5wbGFjZWhvbGRlcjtsZXQgdD1lLmNvbXBvbmVudDtyZXR1cm4gdD9xbyh0LnN1YlRyZWUpOm51bGx9dmFyIEpvPWU9PmUuX19pc1N1c3BlbnNlLFlvPTAsWG89e25hbWU6YFN1c3BlbnNlYCxfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhlLHQsbixyLGksYSxvLHMsYyxsKXtpZihlPT1udWxsKVFvKHQsbixyLGksYSxvLHMsYyxsKTtlbHNle2lmKGEmJmEuZGVwcz4wJiYhZS5zdXNwZW5zZS5pc0luRmFsbGJhY2spe3Quc3VzcGVuc2U9ZS5zdXNwZW5zZSx0LnN1c3BlbnNlLnZub2RlPXQsdC5lbD1lLmVsO3JldHVybn0kbyhlLHQsbixyLGksbyxzLGMsbCl9fSxoeWRyYXRlOnRzLG5vcm1hbGl6ZTpuc307ZnVuY3Rpb24gWm8oZSx0KXtsZXQgbj1lLnByb3BzJiZlLnByb3BzW3RdO3YobikmJm4oKX1mdW5jdGlvbiBRbyhlLHQsbixyLGksYSxvLHMsYyl7bGV0e3A6bCxvOntjcmVhdGVFbGVtZW50OnV9fT1jLGQ9dShgZGl2YCksZj1lLnN1c3BlbnNlPWVzKGUsaSxyLHQsZCxuLGEsbyxzLGMpO2wobnVsbCxmLnBlbmRpbmdCcmFuY2g9ZS5zc0NvbnRlbnQsZCxudWxsLHIsZixhLG8pLGYuZGVwcz4wPyhabyhlLGBvblBlbmRpbmdgKSxabyhlLGBvbkZhbGxiYWNrYCksbChudWxsLGUuc3NGYWxsYmFjayx0LG4scixudWxsLGEsbyksYXMoZixlLnNzRmFsbGJhY2spKTpmLnJlc29sdmUoITEsITApfWZ1bmN0aW9uICRvKGUsdCxuLHIsaSxhLG8scyx7cDpjLHVtOmwsbzp7Y3JlYXRlRWxlbWVudDp1fX0pe2xldCBkPXQuc3VzcGVuc2U9ZS5zdXNwZW5zZTtkLnZub2RlPXQsdC5lbD1lLmVsO2xldCBmPXQuc3NDb250ZW50LHA9dC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6bSxwZW5kaW5nQnJhbmNoOmgsaXNJbkZhbGxiYWNrOmcsaXNIeWRyYXRpbmc6X309ZDtpZihoKWQucGVuZGluZ0JyYW5jaD1mLF9zKGgsZik/KGMoaCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6ZyYmKF98fChjKG0scCxuLHIsaSxudWxsLGEsbyxzKSxhcyhkLHApKSkpOihkLnBlbmRpbmdJZD1ZbysrLF8/KGQuaXNIeWRyYXRpbmc9ITEsZC5hY3RpdmVCcmFuY2g9aCk6bChoLGksZCksZC5kZXBzPTAsZC5lZmZlY3RzLmxlbmd0aD0wLGQuaGlkZGVuQ29udGFpbmVyPXUoYGRpdmApLGc/KGMobnVsbCxmLGQuaGlkZGVuQ29udGFpbmVyLG51bGwsaSxkLGEsbyxzKSxkLmRlcHM8PTA/ZC5yZXNvbHZlKCk6KGMobSxwLG4scixpLG51bGwsYSxvLHMpLGFzKGQscCkpKTptJiZfcyhtLGYpPyhjKG0sZixuLHIsaSxkLGEsbyxzKSxkLnJlc29sdmUoITApKTooYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MCYmZC5yZXNvbHZlKCkpKTtlbHNlIGlmKG0mJl9zKG0sZikpYyhtLGYsbixyLGksZCxhLG8scyksYXMoZCxmKTtlbHNlIGlmKFpvKHQsYG9uUGVuZGluZ2ApLGQucGVuZGluZ0JyYW5jaD1mLGQucGVuZGluZ0lkPWYuc2hhcGVGbGFnJjUxMj9mLmNvbXBvbmVudC5zdXNwZW5zZUlkOllvKyssYyhudWxsLGYsZC5oaWRkZW5Db250YWluZXIsbnVsbCxpLGQsYSxvLHMpLGQuZGVwczw9MClkLnJlc29sdmUoKTtlbHNle2xldHt0aW1lb3V0OmUscGVuZGluZ0lkOnR9PWQ7ZT4wP3NldFRpbWVvdXQoKCk9PntkLnBlbmRpbmdJZD09PXQmJmQuZmFsbGJhY2socCl9LGUpOmU9PT0wJiZkLmZhbGxiYWNrKHApfX1mdW5jdGlvbiBlcyhlLHQsbixyLGksYSxvLHMsYyxsLHU9ITEpe2xldHtwOmQsbTpmLHVtOnAsbjptLG86e3BhcmVudE5vZGU6aCxyZW1vdmU6Z319PWwsXyx2PW9zKGUpO3YmJnQmJnQucGVuZGluZ0JyYW5jaCYmKF89dC5wZW5kaW5nSWQsdC5kZXBzKyspO2xldCB5PWUucHJvcHM/ZmUoZS5wcm9wcy50aW1lb3V0KTp2b2lkIDAsYj1hLHg9e3Zub2RlOmUscGFyZW50OnQscGFyZW50Q29tcG9uZW50Om4sbmFtZXNwYWNlOm8sY29udGFpbmVyOnIsaGlkZGVuQ29udGFpbmVyOmksZGVwczowLHBlbmRpbmdJZDpZbysrLHRpbWVvdXQ6dHlwZW9mIHk9PWBudW1iZXJgP3k6LTEsYWN0aXZlQnJhbmNoOm51bGwsaXNGYWxsYmFja01vdW50UGVuZGluZzohMSxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiF1LGlzSHlkcmF0aW5nOnUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKGU9ITEsbj0hMSl7bGV0e3Zub2RlOnIsYWN0aXZlQnJhbmNoOmkscGVuZGluZ0JyYW5jaDpvLHBlbmRpbmdJZDpzLGVmZmVjdHM6YyxwYXJlbnRDb21wb25lbnQ6bCxjb250YWluZXI6dSxpc0luRmFsbGJhY2s6ZH09eCxnPSExO2lmKHguaXNIeWRyYXRpbmcpeC5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFlKXtnPWkmJm8udHJhbnNpdGlvbiYmby50cmFuc2l0aW9uLm1vZGU9PT1gb3V0LWluYDtsZXQgZT0hMTtnJiYoaS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntzPT09eC5wZW5kaW5nSWQmJihmKG8sdSxhPT09YiYmIWU/bShpKTphLDApLG5yKGMpLGQmJnIuc3NGYWxsYmFjayYmKHIuc3NGYWxsYmFjay5lbD1udWxsKSl9KSxpJiYheC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nJiYoaChpLmVsKT09PXUmJihhPW0oaSksZT0hMCkscChpLGwseCwhMCksIWcmJmQmJnIuc3NGYWxsYmFjayYmSW8oKCk9PnIuc3NGYWxsYmFjay5lbD1udWxsLHgpKSxnfHxmKG8sdSxhLDApfXguaXNGYWxsYmFja01vdW50UGVuZGluZz0hMSxhcyh4LG8pLHgucGVuZGluZ0JyYW5jaD1udWxsLHguaXNJbkZhbGxiYWNrPSExO2xldCB5PXgucGFyZW50LFM9ITE7Zm9yKDt5Oyl7aWYoeS5wZW5kaW5nQnJhbmNoKXtmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKyl5LmVmZmVjdHMucHVzaChjW2VdKTtTPSEwO2JyZWFrfXk9eS5wYXJlbnR9IVMmJiFnJiZucihjKSx4LmVmZmVjdHM9W10sdiYmdCYmdC5wZW5kaW5nQnJhbmNoJiZfPT09dC5wZW5kaW5nSWQmJih0LmRlcHMtLSx0LmRlcHM9PT0wJiYhbiYmdC5yZXNvbHZlKCkpLFpvKHIsYG9uUmVzb2x2ZWApfSxmYWxsYmFjayhlKXtpZigheC5wZW5kaW5nQnJhbmNoKXJldHVybjtsZXR7dm5vZGU6dCxhY3RpdmVCcmFuY2g6bixwYXJlbnRDb21wb25lbnQ6cixjb250YWluZXI6aSxuYW1lc3BhY2U6YX09eDtabyh0LGBvbkZhbGxiYWNrYCk7bGV0IG89bShuKSxsPSgpPT57eC5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nPSExLHguaXNJbkZhbGxiYWNrJiYoZChudWxsLGUsaSxvLHIsbnVsbCxhLHMsYyksYXMoeCxlKSl9LHU9ZS50cmFuc2l0aW9uJiZlLnRyYW5zaXRpb24ubW9kZT09PWBvdXQtaW5gO3UmJih4LmlzRmFsbGJhY2tNb3VudFBlbmRpbmc9ITAsbi50cmFuc2l0aW9uLmFmdGVyTGVhdmU9bCkseC5pc0luRmFsbGJhY2s9ITAscChuLHIsbnVsbCwhMCksdXx8bCgpfSxtb3ZlKGUsdCxuKXt4LmFjdGl2ZUJyYW5jaCYmZih4LmFjdGl2ZUJyYW5jaCxlLHQsbikseC5jb250YWluZXI9ZX0sbmV4dCgpe3JldHVybiB4LmFjdGl2ZUJyYW5jaCYmbSh4LmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKGUsdCxuKXtsZXQgcj0hIXgucGVuZGluZ0JyYW5jaDtyJiZ4LmRlcHMrKztsZXQgaT1lLnZub2RlLmVsO2UuYXN5bmNEZXAuY2F0Y2godD0+e1VuKHQsZSwwKX0pLnRoZW4oYT0+e2lmKGUuaXNVbm1vdW50ZWR8fHguaXNVbm1vdW50ZWR8fHgucGVuZGluZ0lkIT09ZS5zdXNwZW5zZUlkKXJldHVybjt6cygpLGUuYXN5bmNSZXNvbHZlZD0hMDtsZXR7dm5vZGU6c309ZTtXcyhlLGEsITEpLGkmJihzLmVsPWkpO2xldCBjPSFpJiZlLnN1YlRyZWUuZWw7dChlLHMsaChpfHxlLnN1YlRyZWUuZWwpLGk/bnVsbDptKGUuc3ViVHJlZSkseCxvLG4pLGMmJihzLnBsYWNlaG9sZGVyPW51bGwsZyhjKSksX28oZSxzLmVsKSxyJiYtLXguZGVwcz09PTAmJngucmVzb2x2ZSgpfSl9LHVubW91bnQoZSx0KXt4LmlzVW5tb3VudGVkPSEwLHguYWN0aXZlQnJhbmNoJiZwKHguYWN0aXZlQnJhbmNoLG4sZSx0KSx4LnBlbmRpbmdCcmFuY2gmJnAoeC5wZW5kaW5nQnJhbmNoLG4sZSx0KX19O3JldHVybiB4fWZ1bmN0aW9uIHRzKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD10LnN1c3BlbnNlPWVzKHQscixuLGUucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBkaXZgKSxudWxsLGksYSxvLHMsITApLHU9YyhlLGwucGVuZGluZ0JyYW5jaD10LnNzQ29udGVudCxuLGwsYSxvKTtyZXR1cm4gbC5kZXBzPT09MCYmbC5yZXNvbHZlKCExLCEwKSx1fWZ1bmN0aW9uIG5zKGUpe2xldHtzaGFwZUZsYWc6dCxjaGlsZHJlbjpufT1lLHI9dCYzMjtlLnNzQ29udGVudD1ycyhyP24uZGVmYXVsdDpuKSxlLnNzRmFsbGJhY2s9cj9ycyhuLmZhbGxiYWNrKTpIKGNzKX1mdW5jdGlvbiBycyhlKXtsZXQgdDtpZih2KGUpKXtsZXQgbj1wcyYmZS5fYztuJiYoZS5fZD0hMSxSKCkpLGU9ZSgpLG4mJihlLl9kPSEwLHQ9ZHMsZnMoKSl9cmV0dXJuIHAoZSkmJihlPXVvKGUpKSxlPUVzKGUpLHQmJiFlLmR5bmFtaWNDaGlsZHJlbiYmKGUuZHluYW1pY0NoaWxkcmVuPXQuZmlsdGVyKHQ9PnQhPT1lKSksZX1mdW5jdGlvbiBpcyhlLHQpe3QmJnQucGVuZGluZ0JyYW5jaD9wKGUpP3QuZWZmZWN0cy5wdXNoKC4uLmUpOnQuZWZmZWN0cy5wdXNoKGUpOm5yKGUpfWZ1bmN0aW9uIGFzKGUsdCl7ZS5hY3RpdmVCcmFuY2g9dDtsZXR7dm5vZGU6bixwYXJlbnRDb21wb25lbnQ6cn09ZSxpPXQuZWw7Zm9yKDshaSYmdC5jb21wb25lbnQ7KXQ9dC5jb21wb25lbnQuc3ViVHJlZSxpPXQuZWw7bi5lbD1pLHImJnIuc3ViVHJlZT09PW4mJihyLnZub2RlLmVsPWksX28ocixpKSl9ZnVuY3Rpb24gb3MoZSl7bGV0IHQ9ZS5wcm9wcyYmZS5wcm9wcy5zdXNwZW5zaWJsZTtyZXR1cm4gdCE9bnVsbCYmdCE9PSExfXZhciBMPVN5bWJvbC5mb3IoYHYtZmd0YCksc3M9U3ltYm9sLmZvcihgdi10eHRgKSxjcz1TeW1ib2wuZm9yKGB2LWNtdGApLGxzPVN5bWJvbC5mb3IoYHYtc3RjYCksdXM9W10sZHM9bnVsbDtmdW5jdGlvbiBSKGU9ITEpe3VzLnB1c2goZHM9ZT9udWxsOltdKX1mdW5jdGlvbiBmcygpe3VzLnBvcCgpLGRzPXVzW3VzLmxlbmd0aC0xXXx8bnVsbH12YXIgcHM9MTtmdW5jdGlvbiBtcyhlLHQ9ITEpe3BzKz1lLGU8MCYmZHMmJnQmJihkcy5oYXNPbmNlPSEwKX1mdW5jdGlvbiBocyhlKXtyZXR1cm4gZS5keW5hbWljQ2hpbGRyZW49cHM+MD9kc3x8aTpudWxsLGZzKCkscHM+MCYmZHMmJmRzLnB1c2goZSksZX1mdW5jdGlvbiB6KGUsdCxuLHIsaSxhKXtyZXR1cm4gaHMoVihlLHQsbixyLGksYSwhMCkpfWZ1bmN0aW9uIEIoZSx0LG4scixpKXtyZXR1cm4gaHMoSChlLHQsbixyLGksITApKX1mdW5jdGlvbiBncyhlKXtyZXR1cm4gZT9lLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gX3MoZSx0KXtyZXR1cm4gZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQua2V5fWZ1bmN0aW9uIHZzKGUpe312YXIgeXM9KHtrZXk6ZX0pPT5lPz9udWxsLGJzPSh7cmVmOmUscmVmX2tleTp0LHJlZl9mb3I6bn0pPT4odHlwZW9mIGU9PWBudW1iZXJgJiYoZT1gYCtlKSxlPT1udWxsP251bGw6eShlKXx8aihlKXx8dihlKT97aTp1cixyOmUsazp0LGY6ISFufTplKTtmdW5jdGlvbiBWKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ZT09PUw/MDoxLG89ITEscz0hMSl7bGV0IGM9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6ZSxwcm9wczp0LGtleTp0JiZ5cyh0KSxyZWY6dCYmYnModCksc2NvcGVJZDpkcixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpuLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRTdGFydDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOmEscGF0Y2hGbGFnOnIsZHluYW1pY1Byb3BzOmksZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDp1cn07cmV0dXJuIHM/KE9zKGMsbiksYSYxMjgmJmUubm9ybWFsaXplKGMpKTpuJiYoYy5zaGFwZUZsYWd8PXkobik/ODoxNikscHM+MCYmIW8mJmRzJiYoYy5wYXRjaEZsYWc+MHx8YSY2KSYmYy5wYXRjaEZsYWchPT0zMiYmZHMucHVzaChjKSxjfXZhciBIPXhzO2Z1bmN0aW9uIHhzKGUsdD1udWxsLG49bnVsbCxyPTAsaT1udWxsLGE9ITEpe2lmKCghZXx8ZT09PWxhKSYmKGU9Y3MpLGdzKGUpKXtsZXQgcj1DcyhlLHQsITApO3JldHVybiBuJiZPcyhyLG4pLHBzPjAmJiFhJiZkcyYmKHIuc2hhcGVGbGFnJjY/ZHNbZHMuaW5kZXhPZihlKV09cjpkcy5wdXNoKHIpKSxyLnBhdGNoRmxhZz0tMixyfWlmKGVjKGUpJiYoZT1lLl9fdmNjT3B0cyksdCl7dD1Tcyh0KTtsZXR7Y2xhc3M6ZSxzdHlsZTpufT10O2UmJiF5KGUpJiYodC5jbGFzcz1PKGUpKSx4KG4pJiYob24obikmJiFwKG4pJiYobj1sKHt9LG4pKSx0LnN0eWxlPWdlKG4pKX1sZXQgbz15KGUpPzE6Sm8oZSk/MTI4Ok1yKGUpPzY0OngoZSk/NDp2KGUpPzI6MDtyZXR1cm4gVihlLHQsbixyLGksbyxhLCEwKX1mdW5jdGlvbiBTcyhlKXtyZXR1cm4gZT9vbihlKXx8Ym8oZSk/bCh7fSxlKTplOm51bGx9ZnVuY3Rpb24gQ3MoZSx0LG49ITEscj0hMSl7bGV0e3Byb3BzOmkscmVmOmEscGF0Y2hGbGFnOm8sY2hpbGRyZW46cyx0cmFuc2l0aW9uOmN9PWUsbD10P2tzKGl8fHt9LHQpOmksdT17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTplLnR5cGUscHJvcHM6bCxrZXk6bCYmeXMobCkscmVmOnQmJnQucmVmP24mJmE/cChhKT9hLmNvbmNhdChicyh0KSk6W2EsYnModCldOmJzKHQpOmEsc2NvcGVJZDplLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmUuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOnMsdGFyZ2V0OmUudGFyZ2V0LHRhcmdldFN0YXJ0OmUudGFyZ2V0U3RhcnQsdGFyZ2V0QW5jaG9yOmUudGFyZ2V0QW5jaG9yLHN0YXRpY0NvdW50OmUuc3RhdGljQ291bnQsc2hhcGVGbGFnOmUuc2hhcGVGbGFnLHBhdGNoRmxhZzp0JiZlLnR5cGUhPT1MP289PT0tMT8xNjpvfDE2Om8sZHluYW1pY1Byb3BzOmUuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjplLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmUuYXBwQ29udGV4dCxkaXJzOmUuZGlycyx0cmFuc2l0aW9uOmMsY29tcG9uZW50OmUuY29tcG9uZW50LHN1c3BlbnNlOmUuc3VzcGVuc2Usc3NDb250ZW50OmUuc3NDb250ZW50JiZDcyhlLnNzQ29udGVudCksc3NGYWxsYmFjazplLnNzRmFsbGJhY2smJkNzKGUuc3NGYWxsYmFjaykscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcixlbDplLmVsLGFuY2hvcjplLmFuY2hvcixjdHg6ZS5jdHgsY2U6ZS5jZX07cmV0dXJuIGMmJnImJnJpKHUsYy5jbG9uZSh1KSksdX1mdW5jdGlvbiBVKGU9YCBgLHQ9MCl7cmV0dXJuIEgoc3MsbnVsbCxlLHQpfWZ1bmN0aW9uIHdzKGUsdCl7bGV0IG49SChscyxudWxsLGUpO3JldHVybiBuLnN0YXRpY0NvdW50PXQsbn1mdW5jdGlvbiBUcyhlPWBgLHQ9ITEpe3JldHVybiB0PyhSKCksQihjcyxudWxsLGUpKTpIKGNzLG51bGwsZSl9ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIGU9PW51bGx8fHR5cGVvZiBlPT1gYm9vbGVhbmA/SChjcyk6cChlKT9IKEwsbnVsbCxlLnNsaWNlKCkpOmdzKGUpP0RzKGUpOkgoc3MsbnVsbCxTdHJpbmcoZSkpfWZ1bmN0aW9uIERzKGUpe3JldHVybiBlLmVsPT09bnVsbCYmZS5wYXRjaEZsYWchPT0tMXx8ZS5tZW1vP2U6Q3MoZSl9ZnVuY3Rpb24gT3MoZSx0KXtsZXQgbj0wLHtzaGFwZUZsYWc6cn09ZTtpZih0PT1udWxsKXQ9bnVsbDtlbHNlIGlmKHAodCkpbj0xNjtlbHNlIGlmKHR5cGVvZiB0PT1gb2JqZWN0YCl7aWYociY2NSl7bGV0IG49dC5kZWZhdWx0O24mJihuLl9jJiYobi5fZD0hMSksT3MoZSxuKCkpLG4uX2MmJihuLl9kPSEwKSk7cmV0dXJufXtuPTMyO2xldCByPXQuXzshciYmIWJvKHQpP3QuX2N0eD11cjpyPT09MyYmdXImJih1ci5zbG90cy5fPT09MT90Ll89MToodC5fPTIsZS5wYXRjaEZsYWd8PTEwMjQpKX19ZWxzZSBpZih2KHQpKXtpZihyJjY1KXtPcyhlLHtkZWZhdWx0OnR9KTtyZXR1cm59dD17ZGVmYXVsdDp0LF9jdHg6dXJ9LG49MzJ9ZWxzZSB0PVN0cmluZyh0KSxyJjY0PyhuPTE2LHQ9W1UodCldKTpuPTg7ZS5jaGlsZHJlbj10LGUuc2hhcGVGbGFnfD1ufWZ1bmN0aW9uIGtzKC4uLmUpe2xldCB0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2ZvcihsZXQgZSBpbiByKWlmKGU9PT1gY2xhc3NgKXQuY2xhc3MhPT1yLmNsYXNzJiYodC5jbGFzcz1PKFt0LmNsYXNzLHIuY2xhc3NdKSk7ZWxzZSBpZihlPT09YHN0eWxlYCl0LnN0eWxlPWdlKFt0LnN0eWxlLHIuc3R5bGVdKTtlbHNlIGlmKHMoZSkpe2xldCBuPXRbZV0saT1yW2VdO2kmJm4hPT1pJiYhKHAobikmJm4uaW5jbHVkZXMoaSkpP3RbZV09bj9bXS5jb25jYXQobixpKTppOmk9PW51bGwmJm49PW51bGwmJiFjKGUpJiYodFtlXT1pKX1lbHNlIGUhPT1gYCYmKHRbZV09cltlXSl9cmV0dXJuIHR9ZnVuY3Rpb24gQXMoZSx0LG4scj1udWxsKXtIbihlLHQsNyxbbixyXSl9dmFyIGpzPSRhKCksTXM9MDtmdW5jdGlvbiBOcyhlLHQsbil7bGV0IGk9ZS50eXBlLGE9KHQ/dC5hcHBDb250ZXh0OmUuYXBwQ29udGV4dCl8fGpzLG89e3VpZDpNcysrLHZub2RlOmUsdHlwZTppLHBhcmVudDp0LGFwcENvbnRleHQ6YSxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxqb2I6bnVsbCxzY29wZTpuZXcgTmUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dD90LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoYS5wcm92aWRlcyksaWRzOnQ/dC5pZHM6W2BgLDAsMF0sYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpFbyhpLGEpLGVtaXRzT3B0aW9uczpzbyhpLGEpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpyLGluaGVyaXRBdHRyczppLmluaGVyaXRBdHRycyxjdHg6cixkYXRhOnIscHJvcHM6cixhdHRyczpyLHNsb3RzOnIscmVmczpyLHNldHVwU3RhdGU6cixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpuLHN1c3BlbnNlSWQ6bj9uLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIG8uY3R4PXtfOm99LG8ucm9vdD10P3Qucm9vdDpvLG8uZW1pdD1hby5iaW5kKG51bGwsbyksZS5jZSYmZS5jZShvKSxvfXZhciBQcz1udWxsLEZzPSgpPT5Qc3x8dXIsSXMsTHM7e2xldCBlPW1lKCksdD0odCxuKT0+e2xldCByO3JldHVybihyPWVbdF0pfHwocj1lW3RdPVtdKSxyLnB1c2gobiksZT0+e3IubGVuZ3RoPjE/ci5mb3JFYWNoKHQ9PnQoZSkpOnJbMF0oZSl9fTtJcz10KGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLGU9PlBzPWUpLExzPXQoYF9fVlVFX1NTUl9TRVRURVJTX19gLGU9PlZzPWUpfXZhciBScz1lPT57bGV0IHQ9UHM7cmV0dXJuIElzKGUpLGUuc2NvcGUub24oKSwoKT0+e2Uuc2NvcGUub2ZmKCksSXModCl9fSx6cz0oKT0+e1BzJiZQcy5zY29wZS5vZmYoKSxJcyhudWxsKX07ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIGUudm5vZGUuc2hhcGVGbGFnJjR9dmFyIFZzPSExO2Z1bmN0aW9uIEhzKGUsdD0hMSxuPSExKXt0JiZMcyh0KTtsZXR7cHJvcHM6cixjaGlsZHJlbjppfT1lLnZub2RlLGE9QnMoZSk7eG8oZSxyLGEsdCksUG8oZSxpLG58fHQpO2xldCBvPWE/VXMoZSx0KTp2b2lkIDA7cmV0dXJuIHQmJkxzKCExKSxvfWZ1bmN0aW9uIFVzKGUsdCl7bGV0IG49ZS50eXBlO2UuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLnByb3h5PW5ldyBQcm94eShlLmN0eCx4YSk7bGV0e3NldHVwOnJ9PW47aWYocil7bnQoKTtsZXQgbj1lLnNldHVwQ29udGV4dD1yLmxlbmd0aD4xP1pzKGUpOm51bGwsaT1ScyhlKSxhPVZuKHIsZSwwLFtlLnByb3BzLG5dKSxvPVMoYSk7aWYocnQoKSxpKCksKG98fGUuc3ApJiYhSWkoZSkmJm9pKGUpLG8pe2lmKGEudGhlbih6cyx6cyksdClyZXR1cm4gYS50aGVuKG49PntMcyghMCk7dHJ5e1dzKGUsbix0KX1maW5hbGx5e0xzKCExKX19KS5jYXRjaCh0PT57VW4odCxlLDApfSk7ZS5hc3luY0RlcD1hfWVsc2UgV3MoZSxhLHQpfWVsc2UgWXMoZSx0KX1mdW5jdGlvbiBXcyhlLHQsbil7dih0KT9lLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/ZS5zc3JSZW5kZXI9dDplLnJlbmRlcj10OngodCkmJihlLnNldHVwU3RhdGU9Z24odCkpLFlzKGUsbil9dmFyIEdzLEtzO2Z1bmN0aW9uIHFzKGUpe0dzPWUsS3M9ZT0+e2UucmVuZGVyLl9yYyYmKGUud2l0aFByb3h5PW5ldyBQcm94eShlLmN0eCxTYSkpfX12YXIgSnM9KCk9PiFHcztmdW5jdGlvbiBZcyhlLHQsbil7bGV0IHI9ZS50eXBlO2lmKCFlLnJlbmRlcil7aWYoIXQmJkdzJiYhci5yZW5kZXIpe2xldCB0PXIudGVtcGxhdGV8fFVhKGUpLnRlbXBsYXRlO2lmKHQpe2xldHtpc0N1c3RvbUVsZW1lbnQ6bixjb21waWxlck9wdGlvbnM6aX09ZS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczphLGNvbXBpbGVyT3B0aW9uczpvfT1yLHM9bChsKHtpc0N1c3RvbUVsZW1lbnQ6bixkZWxpbWl0ZXJzOmF9LGkpLG8pO3IucmVuZGVyPUdzKHQscyl9fWUucmVuZGVyPXIucmVuZGVyfHxhLEtzJiZLcyhlKX17bGV0IHQ9UnMoZSk7bnQoKTt0cnl7emEoZSl9ZmluYWxseXtydCgpLHQoKX19fXZhciBYcz17Z2V0KGUsdCl7cmV0dXJuIHB0KGUsYGdldGAsYGApLGVbdF19fTtmdW5jdGlvbiBacyhlKXtyZXR1cm57YXR0cnM6bmV3IFByb3h5KGUuYXR0cnMsWHMpLHNsb3RzOmUuc2xvdHMsZW1pdDplLmVtaXQsZXhwb3NlOnQ9PntlLmV4cG9zZWQ9dHx8e319fX1mdW5jdGlvbiBRcyhlKXtyZXR1cm4gZS5leHBvc2VkP2UuZXhwb3NlUHJveHl8fD1uZXcgUHJveHkoZ24oc24oZS5leHBvc2VkKSkse2dldCh0LG4pe2lmKG4gaW4gdClyZXR1cm4gdFtuXTtpZihuIGluIHlhKXJldHVybiB5YVtuXShlKX0saGFzKGUsdCl7cmV0dXJuIHQgaW4gZXx8dCBpbiB5YX19KTplLnByb3h5fWZ1bmN0aW9uICRzKGUsdD0hMCl7cmV0dXJuIHYoZSk/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOmUubmFtZXx8dCYmZS5fX25hbWV9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIHYoZSkmJmBfX3ZjY09wdHNgaW4gZX12YXIgVz0oZSx0KT0+VG4oZSx0LFZzKTtmdW5jdGlvbiBHKGUsdCxuKXt0cnl7bXMoLTEpO2xldCByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI9PT0yP3godCkmJiFwKHQpP2dzKHQpP0goZSxudWxsLFt0XSk6SChlLHQpOkgoZSxudWxsLHQpOihyPjM/bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6cj09PTMmJmdzKG4pJiYobj1bbl0pLEgoZSx0LG4pKX1maW5hbGx5e21zKDEpfX1mdW5jdGlvbiB0Yygpe31mdW5jdGlvbiBuYyhlLHQsbixyKXtsZXQgaT1uW3JdO2lmKGkmJnJjKGksZSkpcmV0dXJuIGk7bGV0IGE9dCgpO3JldHVybiBhLm1lbW89ZS5zbGljZSgpLGEuY2FjaGVJbmRleD1yLG5bcl09YX1mdW5jdGlvbiByYyhlLHQpe2xldCBuPWUubWVtbztpZihuLmxlbmd0aCE9dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoRChuW2VdLHRbZV0pKXJldHVybiExO3JldHVybiBwcz4wJiZkcyYmZHMucHVzaChlKSwhMH12YXIgaWM9YDMuNS40MWAsYWM9YSxvYz1CbixzYz1zcixjYz1scixsYz17Y3JlYXRlQ29tcG9uZW50SW5zdGFuY2U6TnMsc2V0dXBDb21wb25lbnQ6SHMscmVuZGVyQ29tcG9uZW50Um9vdDpsbyxzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U6ZnIsaXNWTm9kZTpncyxub3JtYWxpemVWTm9kZTpFcyxnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZTpRcyxlbnN1cmVWYWxpZFZOb2RlOmdhLHB1c2hXYXJuaW5nQ29udGV4dDpJbixwb3BXYXJuaW5nQ29udGV4dDpMbn0sdWM9dm9pZCAwLGRjPXR5cGVvZiB3aW5kb3c8YHVgJiZ3aW5kb3cudHJ1c3RlZFR5cGVzO2lmKGRjKXRyeXt1Yz1kYy5jcmVhdGVQb2xpY3koYHZ1ZWAse2NyZWF0ZUhUTUw6ZT0+ZX0pfWNhdGNoe312YXIgZmM9dWM/ZT0+dWMuY3JlYXRlSFRNTChlKTplPT5lLHBjPWBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsbWM9YGh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxgLGhjPXR5cGVvZiBkb2N1bWVudDxgdWA/ZG9jdW1lbnQ6bnVsbCxnYz1oYyYmaGMuY3JlYXRlRWxlbWVudChgdGVtcGxhdGVgKSxfYz17aW5zZXJ0OihlLHQsbik9Pnt0Lmluc2VydEJlZm9yZShlLG58fG51bGwpfSxyZW1vdmU6ZT0+e2xldCB0PWUucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKGUpfSxjcmVhdGVFbGVtZW50OihlLHQsbixyKT0+e2xldCBpPXQ9PT1gc3ZnYD9oYy5jcmVhdGVFbGVtZW50TlMocGMsZSk6dD09PWBtYXRobWxgP2hjLmNyZWF0ZUVsZW1lbnROUyhtYyxlKTpuP2hjLmNyZWF0ZUVsZW1lbnQoZSx7aXM6bn0pOmhjLmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIGU9PT1gc2VsZWN0YCYmciYmci5tdWx0aXBsZSE9bnVsbCYmaS5zZXRBdHRyaWJ1dGUoYG11bHRpcGxlYCxyLm11bHRpcGxlKSxpfSxjcmVhdGVUZXh0OmU9PmhjLmNyZWF0ZVRleHROb2RlKGUpLGNyZWF0ZUNvbW1lbnQ6ZT0+aGMuY3JlYXRlQ29tbWVudChlKSxzZXRUZXh0OihlLHQpPT57ZS5ub2RlVmFsdWU9dH0sc2V0RWxlbWVudFRleHQ6KGUsdCk9PntlLnRleHRDb250ZW50PXR9LHBhcmVudE5vZGU6ZT0+ZS5wYXJlbnROb2RlLG5leHRTaWJsaW5nOmU9PmUubmV4dFNpYmxpbmcscXVlcnlTZWxlY3RvcjplPT5oYy5xdWVyeVNlbGVjdG9yKGUpLHNldFNjb3BlSWQoZSx0KXtlLnNldEF0dHJpYnV0ZSh0LGBgKX0saW5zZXJ0U3RhdGljQ29udGVudChlLHQsbixyLGksYSl7bGV0IG89bj9uLnByZXZpb3VzU2libGluZzp0Lmxhc3RDaGlsZDtpZihpJiYoaT09PWF8fGkubmV4dFNpYmxpbmcpKWZvcig7dC5pbnNlcnRCZWZvcmUoaS5jbG9uZU5vZGUoITApLG4pLCEoaT09PWF8fCEoaT1pLm5leHRTaWJsaW5nKSk7KTtlbHNle2djLmlubmVySFRNTD1mYyhyPT09YHN2Z2A/YDxzdmc+JHtlfTwvc3ZnPmA6cj09PWBtYXRobWxgP2A8bWF0aD4ke2V9PC9tYXRoPmA6ZSk7bGV0IGk9Z2MuY29udGVudDtpZihyPT09YHN2Z2B8fHI9PT1gbWF0aG1sYCl7bGV0IGU9aS5maXJzdENoaWxkO2Zvcig7ZS5maXJzdENoaWxkOylpLmFwcGVuZENoaWxkKGUuZmlyc3RDaGlsZCk7aS5yZW1vdmVDaGlsZChlKX10Lmluc2VydEJlZm9yZShpLG4pfXJldHVybltvP28ubmV4dFNpYmxpbmc6dC5maXJzdENoaWxkLG4/bi5wcmV2aW91c1NpYmxpbmc6dC5sYXN0Q2hpbGRdfX0sdmM9YHRyYW5zaXRpb25gLHljPWBhbmltYXRpb25gLGJjPVN5bWJvbChgX3Z0Y2ApLHhjPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxTYz1sKHt9LEpyLHhjKSxDYz0oZT0+KGUuZGlzcGxheU5hbWU9YFRyYW5zaXRpb25gLGUucHJvcHM9U2MsZSkpKChlLHtzbG90czp0fSk9PkcoUXIsRWMoZSksdCkpLHdjPShlLHQ9W10pPT57cChlKT9lLmZvckVhY2goZT0+ZSguLi50KSk6ZSYmZSguLi50KX0sVGM9ZT0+ZT9wKGUpP2Uuc29tZShlPT5lLmxlbmd0aD4xKTplLmxlbmd0aD4xOiExO2Z1bmN0aW9uIEVjKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKW4gaW4geGN8fCh0W25dPWVbbl0pO2lmKGUuY3NzPT09ITEpcmV0dXJuIHQ7bGV0e25hbWU6bj1gdmAsdHlwZTpyLGR1cmF0aW9uOmksZW50ZXJGcm9tQ2xhc3M6YT1gJHtufS1lbnRlci1mcm9tYCxlbnRlckFjdGl2ZUNsYXNzOm89YCR7bn0tZW50ZXItYWN0aXZlYCxlbnRlclRvQ2xhc3M6cz1gJHtufS1lbnRlci10b2AsYXBwZWFyRnJvbUNsYXNzOmM9YSxhcHBlYXJBY3RpdmVDbGFzczp1PW8sYXBwZWFyVG9DbGFzczpkPXMsbGVhdmVGcm9tQ2xhc3M6Zj1gJHtufS1sZWF2ZS1mcm9tYCxsZWF2ZUFjdGl2ZUNsYXNzOnA9YCR7bn0tbGVhdmUtYWN0aXZlYCxsZWF2ZVRvQ2xhc3M6bT1gJHtufS1sZWF2ZS10b2B9PWUsaD1EYyhpKSxnPWgmJmhbMF0sXz1oJiZoWzFdLHtvbkJlZm9yZUVudGVyOnYsb25FbnRlcjp5LG9uRW50ZXJDYW5jZWxsZWQ6YixvbkxlYXZlOngsb25MZWF2ZUNhbmNlbGxlZDpTLG9uQmVmb3JlQXBwZWFyOkM9dixvbkFwcGVhcjp3PXksb25BcHBlYXJDYW5jZWxsZWQ6ZWU9Yn09dCx0ZT0oZSx0LG4scik9PntlLl9lbnRlckNhbmNlbGxlZD1yLEFjKGUsdD9kOnMpLEFjKGUsdD91Om8pLG4mJm4oKX0sVD0oZSx0KT0+e2UuX2lzTGVhdmluZz0hMSxBYyhlLGYpLEFjKGUsbSksQWMoZSxwKSx0JiZ0KCl9LG5lPWU9Pih0LG4pPT57bGV0IGk9ZT93Onksbz0oKT0+dGUodCxlLG4pO3djKGksW3Qsb10pLGpjKCgpPT57QWModCxlP2M6YSksa2ModCxlP2Q6cyksVGMoaSl8fE5jKHQscixnLG8pfSl9O3JldHVybiBsKHQse29uQmVmb3JlRW50ZXIoZSl7d2ModixbZV0pLGtjKGUsYSksa2MoZSxvKX0sb25CZWZvcmVBcHBlYXIoZSl7d2MoQyxbZV0pLGtjKGUsYyksa2MoZSx1KX0sb25FbnRlcjpuZSghMSksb25BcHBlYXI6bmUoITApLG9uTGVhdmUoZSx0KXtlLl9pc0xlYXZpbmc9ITA7bGV0IG49KCk9PlQoZSx0KTtrYyhlLGYpLGUuX2VudGVyQ2FuY2VsbGVkPyhrYyhlLHApLExjKGUpKTooTGMoZSksa2MoZSxwKSksamMoKCk9PntlLl9pc0xlYXZpbmcmJihBYyhlLGYpLGtjKGUsbSksVGMoeCl8fE5jKGUscixfLG4pKX0pLHdjKHgsW2Usbl0pfSxvbkVudGVyQ2FuY2VsbGVkKGUpe3RlKGUsITEsdm9pZCAwLCEwKSx3YyhiLFtlXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKGUpe3RlKGUsITAsdm9pZCAwLCEwKSx3YyhlZSxbZV0pfSxvbkxlYXZlQ2FuY2VsbGVkKGUpe1QoZSksd2MoUyxbZV0pfX0pfWZ1bmN0aW9uIERjKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoeChlKSlyZXR1cm5bT2MoZS5lbnRlciksT2MoZS5sZWF2ZSldO3tsZXQgdD1PYyhlKTtyZXR1cm5bdCx0XX19ZnVuY3Rpb24gT2MoZSl7cmV0dXJuIGZlKGUpfWZ1bmN0aW9uIGtjKGUsdCl7dC5zcGxpdCgvXHMrLykuZm9yRWFjaCh0PT50JiZlLmNsYXNzTGlzdC5hZGQodCkpLChlW2JjXXx8KGVbYmNdPW5ldyBTZXQpKS5hZGQodCl9ZnVuY3Rpb24gQWMoZSx0KXt0LnNwbGl0KC9ccysvKS5mb3JFYWNoKHQ9PnQmJmUuY2xhc3NMaXN0LnJlbW92ZSh0KSk7bGV0IG49ZVtiY107biYmKG4uZGVsZXRlKHQpLG4uc2l6ZXx8KGVbYmNdPXZvaWQgMCkpfWZ1bmN0aW9uIGpjKGUpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShlKX0pfXZhciBNYz0wO2Z1bmN0aW9uIE5jKGUsdCxuLHIpe2xldCBpPWUuX2VuZElkPSsrTWMsYT0oKT0+e2k9PT1lLl9lbmRJZCYmcigpfTtpZihuIT1udWxsKXJldHVybiBzZXRUaW1lb3V0KGEsbik7bGV0e3R5cGU6byx0aW1lb3V0OnMscHJvcENvdW50OmN9PVBjKGUsdCk7aWYoIW8pcmV0dXJuIHIoKTtsZXQgbD1vK2BlbmRgLHU9MCxkPSgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKGwsZiksYSgpfSxmPXQ9Pnt0LnRhcmdldD09PWUmJisrdT49YyYmZCgpfTtzZXRUaW1lb3V0KCgpPT57dTxjJiZkKCl9LHMrMSksZS5hZGRFdmVudExpc3RlbmVyKGwsZil9ZnVuY3Rpb24gUGMoZSx0KXtsZXQgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxyPWU9PihuW2VdfHxgYCkuc3BsaXQoYCwgYCksaT1yKGAke3ZjfURlbGF5YCksYT1yKGAke3ZjfUR1cmF0aW9uYCksbz1GYyhpLGEpLHM9cihgJHt5Y31EZWxheWApLGM9cihgJHt5Y31EdXJhdGlvbmApLGw9RmMocyxjKSx1PW51bGwsZD0wLGY9MDt0PT09dmM/bz4wJiYodT12YyxkPW8sZj1hLmxlbmd0aCk6dD09PXljP2w+MCYmKHU9eWMsZD1sLGY9Yy5sZW5ndGgpOihkPU1hdGgubWF4KG8sbCksdT1kPjA/bz5sP3ZjOnljOm51bGwsZj11P3U9PT12Yz9hLmxlbmd0aDpjLmxlbmd0aDowKTtsZXQgcD11PT09dmMmJi9cYig/OnRyYW5zZm9ybXxhbGwpKD86LHwkKS8udGVzdChyKGAke3ZjfVByb3BlcnR5YCkudG9TdHJpbmcoKSk7cmV0dXJue3R5cGU6dSx0aW1lb3V0OmQscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOnB9fWZ1bmN0aW9uIEZjKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXgoLi4udC5tYXAoKHQsbik9PkljKHQpK0ljKGVbbl0pKSl9ZnVuY3Rpb24gSWMoZSl7cmV0dXJuIGU9PT1gYXV0b2A/MDpOdW1iZXIoZS5zbGljZSgwLC0xKS5yZXBsYWNlKGAsYCxgLmApKSoxZTN9ZnVuY3Rpb24gTGMoZSl7cmV0dXJuKGU/ZS5vd25lckRvY3VtZW50OmRvY3VtZW50KS5ib2R5Lm9mZnNldEhlaWdodH1mdW5jdGlvbiBSYyhlLHQsbil7bGV0IHI9ZVtiY107ciYmKHQ9KHQ/W3QsLi4ucl06Wy4uLnJdKS5qb2luKGAgYCkpLHQ9PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6bj9lLnNldEF0dHJpYnV0ZShgY2xhc3NgLHQpOmUuY2xhc3NOYW1lPXR9dmFyIHpjPVN5bWJvbChgX3ZvZGApLEJjPVN5bWJvbChgX3ZzaGApLFZjPXtuYW1lOmBzaG93YCxiZWZvcmVNb3VudChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7ZVt6Y109ZS5zdHlsZS5kaXNwbGF5PT09YG5vbmVgP2BgOmUuc3R5bGUuZGlzcGxheSxuJiZ0P24uYmVmb3JlRW50ZXIoZSk6SGMoZSx0KX0sbW91bnRlZChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7biYmdCYmbi5lbnRlcihlKX0sdXBkYXRlZChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHt0cmFuc2l0aW9uOnJ9KXshdCE9IW4mJihyP3Q/KHIuYmVmb3JlRW50ZXIoZSksSGMoZSwhMCksci5lbnRlcihlKSk6ci5sZWF2ZShlLCgpPT57SGMoZSwhMSl9KTpIYyhlLHQpKX0sYmVmb3JlVW5tb3VudChlLHt2YWx1ZTp0fSl7SGMoZSx0KX19O2Z1bmN0aW9uIEhjKGUsdCl7ZS5zdHlsZS5kaXNwbGF5PXQ/ZVt6Y106YG5vbmVgLGVbQmNdPSF0fWZ1bmN0aW9uIFVjKCl7VmMuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSk9PntpZighZSlyZXR1cm57c3R5bGU6e2Rpc3BsYXk6YG5vbmVgfX19fXZhciBXYz1TeW1ib2woYGApO2Z1bmN0aW9uIEdjKGUpe2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuO2xldCBuPXQudXQ9KG49ZSh0LnByb3h5KSk9PntBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXYtb3duZXI9IiR7dC51aWR9Il1gKSkuZm9yRWFjaChlPT5xYyhlLG4pKX0scj0oKT0+e2xldCByPWUodC5wcm94eSk7dC5jZT9xYyh0LmNlLHIpOktjKHQuc3ViVHJlZSxyKSxuKHIpfTtRaSgoKT0+e25yKHIpfSksWmkoKCk9PntFcihyLGEse2ZsdXNoOmBwb3N0YH0pO2xldCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHIpO2Uub2JzZXJ2ZSh0LnN1YlRyZWUuZWwucGFyZW50Tm9kZSx7Y2hpbGRMaXN0OiEwfSksdGEoKCk9PmUuZGlzY29ubmVjdCgpKX0pfWZ1bmN0aW9uIEtjKGUsdCl7aWYoZS5zaGFwZUZsYWcmMTI4KXtsZXQgbj1lLnN1c3BlbnNlO2U9bi5hY3RpdmVCcmFuY2gsbi5wZW5kaW5nQnJhbmNoJiYhbi5pc0h5ZHJhdGluZyYmbi5lZmZlY3RzLnB1c2goKCk9PntLYyhuLmFjdGl2ZUJyYW5jaCx0KX0pfWZvcig7ZS5jb21wb25lbnQ7KWU9ZS5jb21wb25lbnQuc3ViVHJlZTtpZihlLnNoYXBlRmxhZyYxJiZlLmVsKXFjKGUuZWwsdCk7ZWxzZSBpZihlLnR5cGU9PT1MKWUuY2hpbGRyZW4uZm9yRWFjaChlPT5LYyhlLHQpKTtlbHNlIGlmKGUudHlwZT09PWxzKXtsZXR7ZWw6bixhbmNob3I6cn09ZTtmb3IoO24mJihxYyhuLHQpLG4hPT1yKTspbj1uLm5leHRTaWJsaW5nfX1mdW5jdGlvbiBxYyhlLHQpe2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgbj1lLnN0eWxlLHI9YGA7Zm9yKGxldCBlIGluIHQpe2xldCBpPWplKHRbZV0pO24uc2V0UHJvcGVydHkoYC0tJHtlfWAsaSkscis9YC0tJHtlfTogJHtpfTtgfW5bV2NdPXJ9fXZhciBKYz0vKD86Xnw7KVxzKmRpc3BsYXlccyo6LztmdW5jdGlvbiBZYyhlLHQsbil7bGV0IHI9ZS5zdHlsZSxpPXkobiksYT0hMTtpZihuJiYhaSl7aWYodCl7aWYoeSh0KSlmb3IobGV0IGUgb2YgdC5zcGxpdChgO2ApKXtsZXQgdD1lLnNsaWNlKDAsZS5pbmRleE9mKGA6YCkpLnRyaW0oKTtuW3RdPz9aYyhyLHQsYGApfWVsc2UgZm9yKGxldCBlIGluIHQpbltlXT8/WmMocixlLGBgKX1mb3IobGV0IGkgaW4gbil7aT09PWBkaXNwbGF5YCYmKGE9ITApO2xldCBvPW5baV07bz09bnVsbD9aYyhyLGksYGApOnRsKGUsaSwheSh0KSYmdD90W2ldOnZvaWQgMCxvKXx8WmMocixpLG8pfX1lbHNlIGlmKGkpe2lmKHQhPT1uKXtsZXQgZT1yW1djXTtlJiYobis9YDtgK2UpLHIuY3NzVGV4dD1uLGE9SmMudGVzdChuKX19ZWxzZSB0JiZlLnJlbW92ZUF0dHJpYnV0ZShgc3R5bGVgKTt6YyBpbiBlJiYoZVt6Y109YT9yLmRpc3BsYXk6YGAsZVtCY10mJihyLmRpc3BsYXk9YG5vbmVgKSl9dmFyIFhjPS9ccyohaW1wb3J0YW50JC87ZnVuY3Rpb24gWmMoZSx0LG4pe2lmKHAobikpbi5mb3JFYWNoKG49PlpjKGUsdCxuKSk7ZWxzZSBpZihuPz89YGAsdC5zdGFydHNXaXRoKGAtLWApKWUuc2V0UHJvcGVydHkodCxuKTtlbHNle2xldCByPWVsKGUsdCk7WGMudGVzdChuKT9lLnNldFByb3BlcnR5KG9lKHIpLG4ucmVwbGFjZShYYyxgYCksYGltcG9ydGFudGApOmVbcl09bn19dmFyIFFjPVtgV2Via2l0YCxgTW96YCxgbXNgXSwkYz17fTtmdW5jdGlvbiBlbChlLHQpe2xldCBuPSRjW3RdO2lmKG4pcmV0dXJuIG47bGV0IHI9RSh0KTtpZihyIT09YGZpbHRlcmAmJnIgaW4gZSlyZXR1cm4gJGNbdF09cjtyPXNlKHIpO2ZvcihsZXQgbj0wO248UWMubGVuZ3RoO24rKyl7bGV0IGk9UWNbbl0rcjtpZihpIGluIGUpcmV0dXJuICRjW3RdPWl9cmV0dXJuIHR9ZnVuY3Rpb24gdGwoZSx0LG4scil7cmV0dXJuIGUudGFnTmFtZT09PWBURVhUQVJFQWAmJih0PT09YHdpZHRoYHx8dD09PWBoZWlnaHRgKSYmeShyKSYmbj09PXJ9dmFyIG5sPWBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rYDtmdW5jdGlvbiBybChlLHQsbixyLGksYT1DZSh0KSl7ciYmdC5zdGFydHNXaXRoKGB4bGluazpgKT9uPT1udWxsP2UucmVtb3ZlQXR0cmlidXRlTlMobmwsdC5zbGljZSg2LHQubGVuZ3RoKSk6ZS5zZXRBdHRyaWJ1dGVOUyhubCx0LG4pOm49PW51bGx8fGEmJiF3ZShuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LGE/YGA6YihuKT9TdHJpbmcobik6bil9ZnVuY3Rpb24gaWwoZSx0LG4scixpKXtpZih0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgKXtuIT1udWxsJiYoZVt0XT10PT09YGlubmVySFRNTGA/ZmMobik6bik7cmV0dXJufWxldCBhPWUudGFnTmFtZTtpZih0PT09YHZhbHVlYCYmYSE9PWBQUk9HUkVTU2AmJiFhLmluY2x1ZGVzKGAtYCkpe2xldCByPWE9PT1gT1BUSU9OYD9lLmdldEF0dHJpYnV0ZShgdmFsdWVgKXx8YGA6ZS52YWx1ZSxpPW49PW51bGw/ZS50eXBlPT09YGNoZWNrYm94YD9gb25gOmBgOlN0cmluZyhuKTsociE9PWl8fCEoYF92YWx1ZWBpbiBlKSkmJihlLnZhbHVlPWkpLG4/P2UucmVtb3ZlQXR0cmlidXRlKHQpLGUuX3ZhbHVlPW47cmV0dXJufWxldCBvPSExO2lmKG49PT1gYHx8bj09bnVsbCl7bGV0IHI9dHlwZW9mIGVbdF07cj09PWBib29sZWFuYD9uPXdlKG4pOm49PW51bGwmJnI9PT1gc3RyaW5nYD8obj1gYCxvPSEwKTpyPT09YG51bWJlcmAmJihuPTAsbz0hMCl9dHJ5e2VbdF09bn1jYXRjaHt9byYmZS5yZW1vdmVBdHRyaWJ1dGUoaXx8dCl9ZnVuY3Rpb24gYWwoZSx0LG4scil7ZS5hZGRFdmVudExpc3RlbmVyKHQsbixyKX1mdW5jdGlvbiBvbChlLHQsbixyKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLHIpfXZhciBzbD1TeW1ib2woYF92ZWlgKTtmdW5jdGlvbiBjbChlLHQsbixyLGk9bnVsbCl7bGV0IGE9ZVtzbF18fChlW3NsXT17fSksbz1hW3RdO2lmKHImJm8pby52YWx1ZT1yO2Vsc2V7bGV0W24sc109ZGwodCk7cj9hbChlLG4sYVt0XT1obChyLGkpLHMpOm8mJihvbChlLG4sbyxzKSxhW3RdPXZvaWQgMCl9fXZhciBsbD0vKE9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvLHVsPS9eb246Pyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIGRsKGUpe2xldCB0LG47Zm9yKDsobj1lLm1hdGNoKGxsKSkmJiF1bC50ZXN0KGUpOyl0fHw9e30sZT1lLnNsaWNlKDAsZS5sZW5ndGgtblsxXS5sZW5ndGgpLHRbblsxXS50b0xvd2VyQ2FzZSgpXT0hMDtyZXR1cm5bZVsyXT09PWA6YD9lLnNsaWNlKDMpOm9lKGUuc2xpY2UoMikpLHRdfXZhciBmbD0wLHBsPVByb21pc2UucmVzb2x2ZSgpLG1sPSgpPT5mbHx8PShwbC50aGVuKCgpPT5mbD0wKSxEYXRlLm5vdygpKTtmdW5jdGlvbiBobChlLHQpe2xldCBuPWU9PntpZighZS5fdnRzKWUuX3Z0cz1EYXRlLm5vdygpO2Vsc2UgaWYoZS5fdnRzPD1uLmF0dGFjaGVkKXJldHVybjtsZXQgcj1uLnZhbHVlO2lmKHAocikpe2xldCBuPWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPSgpPT57bi5jYWxsKGUpLGUuX3N0b3BwZWQ9ITB9O2xldCBpPXIuc2xpY2UoKSxhPVtlXTtmb3IobGV0IG49MDtuPGkubGVuZ3RoJiYhZS5fc3RvcHBlZDtuKyspe2xldCBlPWlbbl07ZSYmSG4oZSx0LDUsYSl9fWVsc2UgSG4ocix0LDUsW2VdKX07cmV0dXJuIG4udmFsdWU9ZSxuLmF0dGFjaGVkPW1sKCksbn12YXIgZ2w9ZT0+ZS5jaGFyQ29kZUF0KDApPT09MTExJiZlLmNoYXJDb2RlQXQoMSk9PT0xMTAmJmUuY2hhckNvZGVBdCgyKT45NiYmZS5jaGFyQ29kZUF0KDIpPDEyMyxfbD0oZSx0LG4scixpLGEpPT57bGV0IG89aT09PWBzdmdgO3Q9PT1gY2xhc3NgP1JjKGUscixvKTp0PT09YHN0eWxlYD9ZYyhlLG4scik6cyh0KT9jKHQpfHxjbChlLHQsbixyLGEpOih0WzBdPT09YC5gPyh0PXQuc2xpY2UoMSksITApOnRbMF09PT1gXmA/KHQ9dC5zbGljZSgxKSwhMSk6dmwoZSx0LHIsbykpPyhpbChlLHQsciksIWUudGFnTmFtZS5pbmNsdWRlcyhgLWApJiYodD09PWB2YWx1ZWB8fHQ9PT1gY2hlY2tlZGB8fHQ9PT1gc2VsZWN0ZWRgKSYmcmwoZSx0LHIsbyxhLHQhPT1gdmFsdWVgKSk6ZS5faXNWdWVDRSYmKHlsKGUsdCl8fGUuX2RlZi5fX2FzeW5jTG9hZGVyJiYoL1tBLVpdLy50ZXN0KHQpfHwheShyKSkpP2lsKGUsRSh0KSxyLGEsdCk6KHQ9PT1gdHJ1ZS12YWx1ZWA/ZS5fdHJ1ZVZhbHVlPXI6dD09PWBmYWxzZS12YWx1ZWAmJihlLl9mYWxzZVZhbHVlPXIpLHJsKGUsdCxyLG8pKX07ZnVuY3Rpb24gdmwoZSx0LG4scil7aWYocilyZXR1cm4hISh0PT09YGlubmVySFRNTGB8fHQ9PT1gdGV4dENvbnRlbnRgfHx0IGluIGUmJmdsKHQpJiZ2KG4pKTtpZih0PT09YHNwZWxsY2hlY2tgfHx0PT09YGRyYWdnYWJsZWB8fHQ9PT1gdHJhbnNsYXRlYHx8dD09PWBhdXRvY29ycmVjdGB8fHQ9PT1gc2FuZGJveGAmJmUudGFnTmFtZT09PWBJRlJBTUVgfHx0PT09YGZvcm1gfHx0PT09YGxpc3RgJiZlLnRhZ05hbWU9PT1gSU5QVVRgfHx0PT09YHR5cGVgJiZlLnRhZ05hbWU9PT1gVEVYVEFSRUFgKXJldHVybiExO2lmKHQ9PT1gd2lkdGhgfHx0PT09YGhlaWdodGApe2xldCB0PWUudGFnTmFtZTtpZih0PT09YElNR2B8fHQ9PT1gVklERU9gfHx0PT09YENBTlZBU2B8fHQ9PT1gU09VUkNFYClyZXR1cm4hMX1yZXR1cm4gZ2wodCkmJnkobik/ITE6dCBpbiBlfWZ1bmN0aW9uIHlsKGUsdCl7bGV0IG49ZS5fZGVmLnByb3BzO2lmKCFuKXJldHVybiExO2xldCByPUUodCk7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/bi5zb21lKGU9PkUoZSk9PT1yKTpPYmplY3Qua2V5cyhuKS5zb21lKGU9PkUoZSk9PT1yKX12YXIgYmw9e307ZnVuY3Rpb24geGwoZSx0LG4pe2xldCByPUYoZSx0KTt0ZShyKSYmKHI9bCh7fSxyLHQpKTtjbGFzcyBpIGV4dGVuZHMgd2x7Y29uc3RydWN0b3IoZSl7c3VwZXIocixlLG4pfX1yZXR1cm4gaS5kZWY9cixpfXZhciBTbD0oKGUsdCk9PnhsKGUsdCxodSkpLENsPXR5cGVvZiBIVE1MRWxlbWVudDxgdWA/SFRNTEVsZW1lbnQ6Y2xhc3N7fSx3bD1jbGFzcyBlIGV4dGVuZHMgQ2x7Y29uc3RydWN0b3IoZSx0PXt9LG49bXUpe3N1cGVyKCksdGhpcy5fZGVmPWUsdGhpcy5fcHJvcHM9dCx0aGlzLl9jcmVhdGVBcHA9bix0aGlzLl9pc1Z1ZUNFPSEwLHRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fYXBwPW51bGwsdGhpcy5fbm9uY2U9dGhpcy5fZGVmLm5vbmNlLHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzLl9yZXNvbHZlZD0hMSx0aGlzLl9wYXRjaGluZz0hMSx0aGlzLl9kaXJ0eT0hMSx0aGlzLl9udW1iZXJQcm9wcz1udWxsLHRoaXMuX3N0eWxlQ2hpbGRyZW49bmV3IFdlYWtTZXQsdGhpcy5fc3R5bGVBbmNob3JzPW5ldyBXZWFrTWFwLHRoaXMuX29iPW51bGwsdGhpcy5zaGFkb3dSb290JiZuIT09bXU/dGhpcy5fcm9vdD10aGlzLnNoYWRvd1Jvb3Q6ZS5zaGFkb3dSb290PT09ITE/dGhpcy5fcm9vdD10aGlzOih0aGlzLmF0dGFjaFNoYWRvdyhsKHt9LGUuc2hhZG93Um9vdE9wdGlvbnMse21vZGU6YG9wZW5gfSkpLHRoaXMuX3Jvb3Q9dGhpcy5zaGFkb3dSb290KX1jb25uZWN0ZWRDYWxsYmFjaygpe2lmKCF0aGlzLmlzQ29ubmVjdGVkKXJldHVybjshdGhpcy5zaGFkb3dSb290JiYhdGhpcy5fcmVzb2x2ZWQmJnRoaXMuX3BhcnNlU2xvdHMoKSx0aGlzLl9jb25uZWN0ZWQ9ITA7bGV0IHQ9dGhpcztmb3IoO3QmJj10LmFzc2lnbmVkU2xvdHx8dC5wYXJlbnROb2RlfHx0Lmhvc3Q7KWlmKHQgaW5zdGFuY2VvZiBlKXt0aGlzLl9wYXJlbnQ9dDticmVha310aGlzLl9pbnN0YW5jZXx8KHRoaXMuX3Jlc29sdmVkP3RoaXMuX21vdW50KHRoaXMuX2RlZik6dCYmdC5fcGVuZGluZ1Jlc29sdmU/dGhpcy5fcGVuZGluZ1Jlc29sdmU9dC5fcGVuZGluZ1Jlc29sdmUudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlPXZvaWQgMCx0aGlzLmlzQ29ubmVjdGVkKXJldHVybiB0aGlzLl9yZXNvbHZlRGVmKCl9KTp0aGlzLl9yZXNvbHZlRGVmKCkpfV9zZXRQYXJlbnQoZT10aGlzLl9wYXJlbnQpe2UmJih0aGlzLl9pbnN0YW5jZS5wYXJlbnQ9ZS5faW5zdGFuY2UsdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoZSkpfV9pbmhlcml0UGFyZW50Q29udGV4dChlPXRoaXMuX3BhcmVudCl7ZSYmdGhpcy5fYXBwJiZPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcy5fYXBwLl9jb250ZXh0LnByb3ZpZGVzLGUuX2luc3RhbmNlLnByb3ZpZGVzKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX2Nvbm5lY3RlZD0hMSxRbigoKT0+e3RoaXMuX2Nvbm5lY3RlZHx8KHRoaXMuX29iJiY9KHRoaXMuX29iLmRpc2Nvbm5lY3QoKSxudWxsKSx0aGlzLl9hcHAmJnRoaXMuX2FwcC51bm1vdW50KCksdGhpcy5faW5zdGFuY2UmJih0aGlzLl9pbnN0YW5jZS5jZT12b2lkIDApLHRoaXMuX2FwcD10aGlzLl9pbnN0YW5jZT1udWxsLHRoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmPSh0aGlzLl90ZWxlcG9ydFRhcmdldHMuY2xlYXIoKSx2b2lkIDApKX0pfV9wcm9jZXNzTXV0YXRpb25zKGUpe2ZvcihsZXQgdCBvZiBlKXRoaXMuX3NldEF0dHIodC5hdHRyaWJ1dGVOYW1lKX1fcmVzb2x2ZURlZigpe2lmKHRoaXMuX3BlbmRpbmdSZXNvbHZlKXJldHVybiB0aGlzLl9wZW5kaW5nUmVzb2x2ZTtmb3IobGV0IGU9MDtlPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXRoaXMuX3NldEF0dHIodGhpcy5hdHRyaWJ1dGVzW2VdLm5hbWUpO3RoaXMuX29iPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMuYmluZCh0aGlzKSksdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSk7bGV0IGU9KGUsdD0hMSk9Pnt0aGlzLl9yZXNvbHZlZD0hMCx0aGlzLl9wZW5kaW5nUmVzb2x2ZT12b2lkIDA7bGV0e3Byb3BzOm4sc3R5bGVzOnJ9PWUsaTtpZihuJiYhcChuKSlmb3IobGV0IGUgaW4gbil7bGV0IHQ9bltlXTsodD09PU51bWJlcnx8dCYmdC50eXBlPT09TnVtYmVyKSYmKGUgaW4gdGhpcy5fcHJvcHMmJih0aGlzLl9wcm9wc1tlXT1mZSh0aGlzLl9wcm9wc1tlXSkpLChpfHw9T2JqZWN0LmNyZWF0ZShudWxsKSlbRShlKV09ITApfXRoaXMuX251bWJlclByb3BzPWksdGhpcy5fcmVzb2x2ZVByb3BzKGUpLHRoaXMuc2hhZG93Um9vdCYmdGhpcy5fYXBwbHlTdHlsZXMociksdGhpcy5fbW91bnQoZSl9LHQ9dGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7aWYodClyZXR1cm4gdGhpcy5fcGVuZGluZ1Jlc29sdmU9dCgpLnRoZW4odD0+e3QuY29uZmlndXJlQXBwPXRoaXMuX2RlZi5jb25maWd1cmVBcHAsZSh0aGlzLl9kZWY9dCwhMCl9KSx0aGlzLl9wZW5kaW5nUmVzb2x2ZTtlKHRoaXMuX2RlZil9X21vdW50KGUpe3RoaXMuX2FwcD10aGlzLl9jcmVhdGVBcHAoZSksdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoKSxlLmNvbmZpZ3VyZUFwcCYmZS5jb25maWd1cmVBcHAodGhpcy5fYXBwKSx0aGlzLl9hcHAuX2NlVk5vZGU9dGhpcy5fY3JlYXRlVk5vZGUoKSx0aGlzLl9hcHAubW91bnQodGhpcy5fcm9vdCk7bGV0IHQ9dGhpcy5faW5zdGFuY2UmJnRoaXMuX2luc3RhbmNlLmV4cG9zZWQ7aWYodClmb3IobGV0IGUgaW4gdClmKHRoaXMsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldDooKT0+Tih0W2VdKX0pfV9yZXNvbHZlUHJvcHMoZSl7bGV0e3Byb3BzOnR9PWUsbj1wKHQpP3Q6T2JqZWN0LmtleXModHx8e30pO2ZvcihsZXQgZSBvZiBPYmplY3Qua2V5cyh0aGlzKSllWzBdIT09YF9gJiZuLmluY2x1ZGVzKGUpJiZ0aGlzLl9zZXRQcm9wKGUsdGhpc1tlXSk7Zm9yKGxldCBlIG9mIG4ubWFwKEUpKU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2dldCgpe3JldHVybiB0aGlzLl9nZXRQcm9wKGUpfSxzZXQodCl7dGhpcy5fc2V0UHJvcChlLHQsITAsIXRoaXMuX3BhdGNoaW5nKX19KX1fc2V0QXR0cihlKXtpZihlLnN0YXJ0c1dpdGgoYGRhdGEtdi1gKSlyZXR1cm47bGV0IHQ9dGhpcy5oYXNBdHRyaWJ1dGUoZSksbj10P3RoaXMuZ2V0QXR0cmlidXRlKGUpOmJsLHI9RShlKTt0JiZ0aGlzLl9udW1iZXJQcm9wcyYmdGhpcy5fbnVtYmVyUHJvcHNbcl0mJihuPWZlKG4pKSx0aGlzLl9zZXRQcm9wKHIsbiwhMSwhMCl9X2dldFByb3AoZSl7cmV0dXJuIHRoaXMuX3Byb3BzW2VdfV9zZXRQcm9wKGUsdCxuPSEwLHI9ITEpe2lmKHQhPT10aGlzLl9wcm9wc1tlXSYmKHRoaXMuX2RpcnR5PSEwLHQ9PT1ibD9kZWxldGUgdGhpcy5fcHJvcHNbZV06KHRoaXMuX3Byb3BzW2VdPXQsZT09PWBrZXlgJiZ0aGlzLl9hcHAmJih0aGlzLl9hcHAuX2NlVk5vZGUua2V5PXQpKSxyJiZ0aGlzLl9pbnN0YW5jZSYmdGhpcy5fdXBkYXRlKCksbikpe2xldCBuPXRoaXMuX29iO24mJih0aGlzLl9wcm9jZXNzTXV0YXRpb25zKG4udGFrZVJlY29yZHMoKSksbi5kaXNjb25uZWN0KCkpLHQ9PT0hMD90aGlzLnNldEF0dHJpYnV0ZShvZShlKSxgYCk6dHlwZW9mIHQ9PWBzdHJpbmdgfHx0eXBlb2YgdD09YG51bWJlcmA/dGhpcy5zZXRBdHRyaWJ1dGUob2UoZSksdCtgYCk6dHx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUob2UoZSkpLG4mJm4ub2JzZXJ2ZSh0aGlzLHthdHRyaWJ1dGVzOiEwfSl9fV91cGRhdGUoKXtsZXQgZT10aGlzLl9jcmVhdGVWTm9kZSgpO3RoaXMuX2FwcCYmKGUuYXBwQ29udGV4dD10aGlzLl9hcHAuX2NvbnRleHQpLGZ1KGUsdGhpcy5fcm9vdCl9X2NyZWF0ZVZOb2RlKCl7bGV0IGU9e307dGhpcy5zaGFkb3dSb290fHwoZS5vblZub2RlTW91bnRlZD1lLm9uVm5vZGVVcGRhdGVkPXRoaXMuX3JlbmRlclNsb3RzLmJpbmQodGhpcykpO2xldCB0PUgodGhpcy5fZGVmLGwoZSx0aGlzLl9wcm9wcykpO3JldHVybiB0aGlzLl9pbnN0YW5jZXx8KHQuY2U9ZT0+e3RoaXMuX2luc3RhbmNlPWUsZS5jZT10aGlzLGUuaXNDRT0hMDtsZXQgdD0oZSx0KT0+e3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZSx0ZSh0WzBdKT9sKHtkZXRhaWw6dH0sdFswXSk6e2RldGFpbDp0fSkpfTtlLmVtaXQ9KGUsLi4ubik9Pnt0KGUsbiksb2UoZSkhPT1lJiZ0KG9lKGUpLG4pfSx0aGlzLl9zZXRQYXJlbnQoKX0pLHR9X2FwcGx5U3R5bGVzKGUsdCxuKXtpZighZSlyZXR1cm47aWYodCl7aWYodD09PXRoaXMuX2RlZnx8dGhpcy5fc3R5bGVDaGlsZHJlbi5oYXModCkpcmV0dXJuO3RoaXMuX3N0eWxlQ2hpbGRyZW4uYWRkKHQpfWxldCByPXRoaXMuX25vbmNlLGk9dGhpcy5zaGFkb3dSb290LGE9bj90aGlzLl9nZXRTdHlsZUFuY2hvcihuKXx8dGhpcy5fZ2V0U3R5bGVBbmNob3IodGhpcy5fZGVmKTp0aGlzLl9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoaSksbz1udWxsO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTA7cy0tKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBzdHlsZWApO3ImJmMuc2V0QXR0cmlidXRlKGBub25jZWAsciksYy50ZXh0Q29udGVudD1lW3NdLGkuaW5zZXJ0QmVmb3JlKGMsb3x8YSksbz1jLHM9PT0wJiYobnx8dGhpcy5fc3R5bGVBbmNob3JzLnNldCh0aGlzLl9kZWYsYyksdCYmdGhpcy5fc3R5bGVBbmNob3JzLnNldCh0LGMpKX19X2dldFN0eWxlQW5jaG9yKGUpe2lmKCFlKXJldHVybiBudWxsO2xldCB0PXRoaXMuX3N0eWxlQW5jaG9ycy5nZXQoZSk7cmV0dXJuIHQmJnQucGFyZW50Tm9kZT09PXRoaXMuc2hhZG93Um9vdD90Oih0JiZ0aGlzLl9zdHlsZUFuY2hvcnMuZGVsZXRlKGUpLG51bGwpfV9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3IoZSl7Zm9yKGxldCB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5jaGlsZE5vZGVzW3RdO2lmKCEobiBpbnN0YW5jZW9mIEhUTUxTdHlsZUVsZW1lbnQpKXJldHVybiBufXJldHVybiBudWxsfV9wYXJzZVNsb3RzKCl7bGV0IGU9dGhpcy5fc2xvdHM9e30sdDtmb3IoO3Q9dGhpcy5maXJzdENoaWxkOyl7bGV0IG49dC5ub2RlVHlwZT09PTEmJnQuZ2V0QXR0cmlidXRlKGBzbG90YCl8fGBkZWZhdWx0YDsoZVtuXXx8KGVbbl09W10pKS5wdXNoKHQpLHRoaXMucmVtb3ZlQ2hpbGQodCl9fV9yZW5kZXJTbG90cygpe2xldCBlPXRoaXMuX2dldFNsb3RzKCksdD10aGlzLl9pbnN0YW5jZS50eXBlLl9fc2NvcGVJZDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxpPXIuZ2V0QXR0cmlidXRlKGBuYW1lYCl8fGBkZWZhdWx0YCxhPXRoaXMuX3Nsb3RzW2ldLG89ci5wYXJlbnROb2RlO2lmKGEpZm9yKGxldCBlIG9mIGEpe2lmKHQmJmUubm9kZVR5cGU9PT0xKXtsZXQgbj10K2Atc2Ascj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGUsMSk7ZS5zZXRBdHRyaWJ1dGUobixgYCk7bGV0IGk7Zm9yKDtpPXIubmV4dE5vZGUoKTspaS5zZXRBdHRyaWJ1dGUobixgYCl9by5pbnNlcnRCZWZvcmUoZSxyKX1lbHNlIGZvcig7ci5maXJzdENoaWxkOylvLmluc2VydEJlZm9yZShyLmZpcnN0Q2hpbGQscik7by5yZW1vdmVDaGlsZChyKX19X2dldFNsb3RzKCl7bGV0IGU9W3RoaXNdO3RoaXMuX3RlbGVwb3J0VGFyZ2V0cyYmZS5wdXNoKC4uLnRoaXMuX3RlbGVwb3J0VGFyZ2V0cyk7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgZSl7bGV0IGU9bi5xdWVyeVNlbGVjdG9yQWxsKGBzbG90YCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5hZGQoZVtuXSl9cmV0dXJuIEFycmF5LmZyb20odCl9X2luamVjdENoaWxkU3R5bGUoZSx0KXt0aGlzLl9hcHBseVN0eWxlcyhlLnN0eWxlcyxlLHQpfV9iZWdpblBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITAsdGhpcy5fZGlydHk9ITF9X2VuZFBhdGNoKCl7dGhpcy5fcGF0Y2hpbmc9ITEsdGhpcy5fZGlydHkmJnRoaXMuX2luc3RhbmNlJiZ0aGlzLl91cGRhdGUoKX1faGFzU2hhZG93Um9vdCgpe3JldHVybiB0aGlzLl9kZWYuc2hhZG93Um9vdCE9PSExfV9yZW1vdmVDaGlsZFN0eWxlKGUpe319O2Z1bmN0aW9uIFRsKGUpe2xldCB0PUZzKCk7cmV0dXJuIHQmJnQuY2V8fG51bGx9ZnVuY3Rpb24gRWwoKXtsZXQgZT1UbCgpO3JldHVybiBlJiZlLnNoYWRvd1Jvb3R9ZnVuY3Rpb24gRGwoZT1gJHN0eWxlYCl7e2xldCB0PUZzKCk7aWYoIXQpcmV0dXJuIHI7bGV0IG49dC50eXBlLl9fY3NzTW9kdWxlcztyZXR1cm4gbiYmbltlXXx8cn19dmFyIE9sPW5ldyBXZWFrTWFwLGtsPW5ldyBXZWFrTWFwLEFsPVN5bWJvbChgX21vdmVDYmApLGpsPVN5bWJvbChgX2VudGVyQ2JgKSxNbD0oZT0+KGRlbGV0ZSBlLnByb3BzLm1vZGUsZSkpKHtuYW1lOmBUcmFuc2l0aW9uR3JvdXBgLHByb3BzOmwoe30sU2Mse3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30pLHNldHVwKGUse3Nsb3RzOnR9KXtsZXQgbj1GcygpLHI9S3IoKSxpLGE7cmV0dXJuICRpKCgpPT57aWYoIWkubGVuZ3RoKXJldHVybjtsZXQgdD1lLm1vdmVDbGFzc3x8YCR7ZS5uYW1lfHxgdmB9LW1vdmVgO2lmKCFMbChpWzBdLmVsLG4udm5vZGUuZWwsdCkpe2k9W107cmV0dXJufWkuZm9yRWFjaChObCksaS5mb3JFYWNoKFBsKTtsZXQgcj1pLmZpbHRlcihGbCk7TGMobi52bm9kZS5lbCksci5mb3JFYWNoKGU9PntsZXQgbj1lLmVsLHI9bi5zdHlsZTtrYyhuLHQpLHIudHJhbnNmb3JtPXIud2Via2l0VHJhbnNmb3JtPXIudHJhbnNpdGlvbkR1cmF0aW9uPWBgO2xldCBpPW5bQWxdPWU9PntlJiZlLnRhcmdldCE9PW58fCghZXx8ZS5wcm9wZXJ0eU5hbWUuZW5kc1dpdGgoYHRyYW5zZm9ybWApKSYmKG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdHJhbnNpdGlvbmVuZGAsaSksbltBbF09bnVsbCxBYyhuLHQpKX07bi5hZGRFdmVudExpc3RlbmVyKGB0cmFuc2l0aW9uZW5kYCxpKX0pLGk9W119KSwoKT0+e2xldCBvPUEoZSkscz1FYyhvKSxjPW8udGFnfHxMO2lmKGk9W10sYSlmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKyl7bGV0IHQ9YVtlXTt0LmVsJiZ0LmVsIGluc3RhbmNlb2YgRWxlbWVudCYmIXQuZWxbQmNdJiYoaS5wdXNoKHQpLHJpKHQsZWkodCxzLHIsbikpLE9sLnNldCh0LElsKHQuZWwpKSl9YT10LmRlZmF1bHQ/aWkodC5kZWZhdWx0KCkpOltdO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKXtsZXQgdD1hW2VdO3Qua2V5IT1udWxsJiZyaSh0LGVpKHQscyxyLG4pKX1yZXR1cm4gSChjLG51bGwsYSl9fX0pO2Z1bmN0aW9uIE5sKGUpe2xldCB0PWUuZWw7dFtBbF0mJnRbQWxdKCksdFtqbF0mJnRbamxdKCl9ZnVuY3Rpb24gUGwoZSl7a2wuc2V0KGUsSWwoZS5lbCkpfWZ1bmN0aW9uIEZsKGUpe2xldCB0PU9sLmdldChlKSxuPWtsLmdldChlKSxyPXQubGVmdC1uLmxlZnQsaT10LnRvcC1uLnRvcDtpZihyfHxpKXtsZXQgdD1lLmVsLG49dC5zdHlsZSxhPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz0xLHM9MTtyZXR1cm4gdC5vZmZzZXRXaWR0aCYmKG89YS53aWR0aC90Lm9mZnNldFdpZHRoKSx0Lm9mZnNldEhlaWdodCYmKHM9YS5oZWlnaHQvdC5vZmZzZXRIZWlnaHQpLCghTnVtYmVyLmlzRmluaXRlKG8pfHxvPT09MCkmJihvPTEpLCghTnVtYmVyLmlzRmluaXRlKHMpfHxzPT09MCkmJihzPTEpLE1hdGguYWJzKG8tMSk8LjAxJiYobz0xKSxNYXRoLmFicyhzLTEpPC4wMSYmKHM9MSksbi50cmFuc2Zvcm09bi53ZWJraXRUcmFuc2Zvcm09YHRyYW5zbGF0ZSgke3Ivb31weCwke2kvc31weClgLG4udHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZX19ZnVuY3Rpb24gSWwoZSl7bGV0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDp0LmxlZnQsdG9wOnQudG9wfX1mdW5jdGlvbiBMbChlLHQsbil7bGV0IHI9ZS5jbG9uZU5vZGUoKSxpPWVbYmNdO2kmJmkuZm9yRWFjaChlPT57ZS5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5yZW1vdmUoZSkpfSksbi5zcGxpdCgvXHMrLykuZm9yRWFjaChlPT5lJiZyLmNsYXNzTGlzdC5hZGQoZSkpLHIuc3R5bGUuZGlzcGxheT1gbm9uZWA7bGV0IGE9dC5ub2RlVHlwZT09PTE/dDp0LnBhcmVudE5vZGU7YS5hcHBlbmRDaGlsZChyKTtsZXR7aGFzVHJhbnNmb3JtOm99PVBjKHIpO3JldHVybiBhLnJlbW92ZUNoaWxkKHIpLG99dmFyIFJsPWU9PntsZXQgdD1lLnByb3BzW2BvblVwZGF0ZTptb2RlbFZhbHVlYF18fCExO3JldHVybiBwKHQpP2U9PmxlKHQsZSk6dH07ZnVuY3Rpb24gemwoZSl7ZS50YXJnZXQuY29tcG9zaW5nPSEwfWZ1bmN0aW9uIEJsKGUpe2xldCB0PWUudGFyZ2V0O3QuY29tcG9zaW5nJiYodC5jb21wb3Npbmc9ITEsdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChgaW5wdXRgKSkpfXZhciBWbD1TeW1ib2woYF9hc3NpZ25gKSxIbD1TeW1ib2woYF9pbml0aWFsVmFsdWVgKTtmdW5jdGlvbiBVbChlLHQsbil7cmV0dXJuIHQmJihlPWUudHJpbSgpKSxuJiYoZT1kZShlKSksZX12YXIgV2w9e2NyZWF0ZWQoZSx7bW9kaWZpZXJzOntsYXp5OnQsdHJpbTpuLG51bWJlcjpyfX0saSl7ZS5wYXJlbnROb2RlJiYoZS50eXBlPT09YHRleHRgP2VbSGxdPWUuZGVmYXVsdFZhbHVlLnJlcGxhY2UoL1tcclxuXS9nLGBgKTplLnR5cGU9PT1gdGV4dGFyZWFgJiYoZVtIbF09ZS5kZWZhdWx0VmFsdWUucmVwbGFjZSgvXHJcbj8vZyxgCmApKSksZVtWbF09UmwoaSk7bGV0IGE9cnx8aS5wcm9wcyYmaS5wcm9wcy50eXBlPT09YG51bWJlcmA7YWwoZSx0P2BjaGFuZ2VgOmBpbnB1dGAsdD0+e3QudGFyZ2V0LmNvbXBvc2luZ3x8ZVtWbF0oVWwoZS52YWx1ZSxuLGEpKX0pLChufHxhKSYmYWwoZSxgY2hhbmdlYCwoKT0+e2UudmFsdWU9VWwoZS52YWx1ZSxuLGEpfSksdHx8KGFsKGUsYGNvbXBvc2l0aW9uc3RhcnRgLHpsKSxhbChlLGBjb21wb3NpdGlvbmVuZGAsQmwpLGFsKGUsYGNoYW5nZWAsQmwpKX0sbW91bnRlZChlLHt2YWx1ZTp0LG1vZGlmaWVyczp7dHJpbTpuLG51bWJlcjpyfX0pe2xldCBpPXQ/P2BgLGE9ZVtIbF07ZGVsZXRlIGVbSGxdLGEhPT12b2lkIDAmJihlLnR5cGU9PT1gdGV4dGB8fGUudHlwZT09PWB0ZXh0YXJlYWApJiZlLnZhbHVlIT09YT9lW1ZsXShVbChlLnZhbHVlLG4scikpOmUudmFsdWU9aX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bixtb2RpZmllcnM6e2xhenk6cix0cmltOmksbnVtYmVyOmF9fSxvKXtpZihlW1ZsXT1SbChvKSxlLmNvbXBvc2luZylyZXR1cm47bGV0IHM9KGF8fGUudHlwZT09PWBudW1iZXJgKSYmIS9eMFxkLy50ZXN0KGUudmFsdWUpP2RlKGUudmFsdWUpOmUudmFsdWUsYz10Pz9gYDtpZihzPT09YylyZXR1cm47bGV0IGw9ZS5nZXRSb290Tm9kZSgpOyhsIGluc3RhbmNlb2YgRG9jdW1lbnR8fGwgaW5zdGFuY2VvZiBTaGFkb3dSb290KSYmbC5hY3RpdmVFbGVtZW50PT09ZSYmZS50eXBlIT09YHJhbmdlYCYmKHImJnQ9PT1ufHxpJiZlLnZhbHVlLnRyaW0oKT09PWMpfHwoZS52YWx1ZT1jKX19LEdsPXtkZWVwOiEwLGNyZWF0ZWQoZSx0LG4pe2VbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntsZXQgdD1lLl9tb2RlbFZhbHVlLG49WGwoZSkscj1lLmNoZWNrZWQsaT1lW1ZsXTtpZihwKHQpKXtsZXQgZT1EZSh0LG4pLGE9ZSE9PS0xO2lmKHImJiFhKWkodC5jb25jYXQobikpO2Vsc2UgaWYoIXImJmEpe2xldCBuPVsuLi50XTtuLnNwbGljZShlLDEpLGkobil9fWVsc2UgaWYoaCh0KSl7bGV0IGU9bmV3IFNldCh0KTtyP2UuYWRkKG4pOmUuZGVsZXRlKG4pLGkoZSl9ZWxzZSBpKFpsKGUscikpfSl9LG1vdW50ZWQ6S2wsYmVmb3JlVXBkYXRlKGUsdCxuKXtlW1ZsXT1SbChuKSxLbChlLHQsbil9fTtmdW5jdGlvbiBLbChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHIpe2UuX21vZGVsVmFsdWU9dDtsZXQgaTtpZihwKHQpKWk9RGUodCxyLnByb3BzLnZhbHVlKT4tMTtlbHNlIGlmKGgodCkpaT10LmhhcyhyLnByb3BzLnZhbHVlKTtlbHNle2lmKHQ9PT1uKXJldHVybjtpPUVlKHQsWmwoZSwhMCkpfWUuY2hlY2tlZCE9PWkmJihlLmNoZWNrZWQ9aSl9dmFyIHFsPXtjcmVhdGVkKGUse3ZhbHVlOnR9LG4pe2UuY2hlY2tlZD1FZSh0LG4ucHJvcHMudmFsdWUpLGVbVmxdPVJsKG4pLGFsKGUsYGNoYW5nZWAsKCk9PntlW1ZsXShYbChlKSl9KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsb2xkVmFsdWU6bn0scil7ZVtWbF09UmwociksdCE9PW4mJihlLmNoZWNrZWQ9RWUodCxyLnByb3BzLnZhbHVlKSl9fSxKbD17ZGVlcDohMCxjcmVhdGVkKGUse3ZhbHVlOnQsbW9kaWZpZXJzOntudW1iZXI6bn19LHIpe2UuX21vZGVsVmFsdWU9dCxhbChlLGBjaGFuZ2VgLCgpPT57bGV0IHQ9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUub3B0aW9ucyxlPT5lLnNlbGVjdGVkKS5tYXAoZT0+bj9kZShYbChlKSk6WGwoZSkpO2VbVmxdKGUubXVsdGlwbGU/aChlLl9tb2RlbFZhbHVlKT9uZXcgU2V0KHQpOnQ6dFswXSksZS5fYXNzaWduaW5nPSEwLFFuKCgpPT57ZS5fYXNzaWduaW5nPSExfSl9KSxlW1ZsXT1SbChyKX0sbW91bnRlZChlLHt2YWx1ZTp0fSl7WWwoZSx0KX0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnR9LG4pe2UuX21vZGVsVmFsdWU9dCxlW1ZsXT1SbChuKX0sdXBkYXRlZChlLHt2YWx1ZTp0fSl7ZS5fYXNzaWduaW5nfHxZbChlLHQpfX07ZnVuY3Rpb24gWWwoZSx0KXtsZXQgbj1lLm11bHRpcGxlLHI9cCh0KTtpZighKG4mJiFyJiYhaCh0KSkpe2ZvcihsZXQgaT0wLGE9ZS5vcHRpb25zLmxlbmd0aDtpPGE7aSsrKXtsZXQgYT1lLm9wdGlvbnNbaV0sbz1YbChhKTtpZihuKXtpZihyKXtsZXQgZT10eXBlb2YgbzthLnNlbGVjdGVkPWU9PT1gc3RyaW5nYHx8ZT09PWBudW1iZXJgP3Quc29tZShlPT5TdHJpbmcoZSk9PT1TdHJpbmcobykpOkRlKHQsbyk+LTF9ZWxzZSBhLnNlbGVjdGVkPXQuaGFzKG8pfWVsc2UgaWYoRWUoWGwoYSksdCkpe2Uuc2VsZWN0ZWRJbmRleCE9PWkmJihlLnNlbGVjdGVkSW5kZXg9aSk7cmV0dXJufX0hbiYmZS5zZWxlY3RlZEluZGV4IT09LTEmJihlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBYbChlKXtyZXR1cm5gX3ZhbHVlYGluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBabChlLHQpe2xldCBuPXQ/YF90cnVlVmFsdWVgOmBfZmFsc2VWYWx1ZWA7cmV0dXJuIG4gaW4gZT9lW25dOnR9dmFyIFFsPXtjcmVhdGVkKGUsdCxuKXtldShlLHQsbixudWxsLGBjcmVhdGVkYCl9LG1vdW50ZWQoZSx0LG4pe2V1KGUsdCxuLG51bGwsYG1vdW50ZWRgKX0sYmVmb3JlVXBkYXRlKGUsdCxuLHIpe2V1KGUsdCxuLHIsYGJlZm9yZVVwZGF0ZWApfSx1cGRhdGVkKGUsdCxuLHIpe2V1KGUsdCxuLHIsYHVwZGF0ZWRgKX19O2Z1bmN0aW9uICRsKGUsdCl7c3dpdGNoKGUpe2Nhc2VgU0VMRUNUYDpyZXR1cm4gSmw7Y2FzZWBURVhUQVJFQWA6cmV0dXJuIFdsO2RlZmF1bHQ6c3dpdGNoKHQpe2Nhc2VgY2hlY2tib3hgOnJldHVybiBHbDtjYXNlYHJhZGlvYDpyZXR1cm4gcWw7ZGVmYXVsdDpyZXR1cm4gV2x9fX1mdW5jdGlvbiBldShlLHQsbixyLGkpe2xldCBhPSRsKGUudGFnTmFtZSxuLnByb3BzJiZuLnByb3BzLnR5cGUpW2ldO2EmJmEoZSx0LG4scil9ZnVuY3Rpb24gdHUoKXtXbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9KT0+KHt2YWx1ZTplfSkscWwuZ2V0U1NSUHJvcHM9KHt2YWx1ZTplfSx0KT0+e2lmKHQucHJvcHMmJkVlKHQucHJvcHMudmFsdWUsZSkpcmV0dXJue2NoZWNrZWQ6ITB9fSxHbC5nZXRTU1JQcm9wcz0oe3ZhbHVlOmV9LHQpPT57aWYocChlKSl7aWYodC5wcm9wcyYmRGUoZSx0LnByb3BzLnZhbHVlKT4tMSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihoKGUpKXtpZih0LnByb3BzJiZlLmhhcyh0LnByb3BzLnZhbHVlKSlyZXR1cm57Y2hlY2tlZDohMH19ZWxzZSBpZihlKXJldHVybntjaGVja2VkOiEwfX0sUWwuZ2V0U1NSUHJvcHM9KGUsdCk9PntpZih0eXBlb2YgdC50eXBlIT1gc3RyaW5nYClyZXR1cm47bGV0IG49JGwodC50eXBlLnRvVXBwZXJDYXNlKCksdC5wcm9wcyYmdC5wcm9wcy50eXBlKTtpZihuLmdldFNTUlByb3BzKXJldHVybiBuLmdldFNTUlByb3BzKGUsdCl9fXZhciBudT1bYGN0cmxgLGBzaGlmdGAsYGFsdGAsYG1ldGFgXSxydT17c3RvcDplPT5lLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6ZT0+ZS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6ZT0+ZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQsY3RybDplPT4hZS5jdHJsS2V5LHNoaWZ0OmU9PiFlLnNoaWZ0S2V5LGFsdDplPT4hZS5hbHRLZXksbWV0YTplPT4hZS5tZXRhS2V5LGxlZnQ6ZT0+YGJ1dHRvbmBpbiBlJiZlLmJ1dHRvbiE9PTAsbWlkZGxlOmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0xLHJpZ2h0OmU9PmBidXR0b25gaW4gZSYmZS5idXR0b24hPT0yLGV4YWN0OihlLHQpPT5udS5zb21lKG49PmVbYCR7bn1LZXlgXSYmIXQuaW5jbHVkZXMobikpfSxpdT0oZSx0KT0+e2lmKCFlKXJldHVybiBlO2xldCBuPWUuX3dpdGhNb2RzfHw9e30scj10LmpvaW4oYC5gKTtyZXR1cm4gbltyXXx8KG5bcl09KChuLC4uLnIpPT57Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCByPXJ1W3RbZV1dO2lmKHImJnIobix0KSlyZXR1cm59cmV0dXJuIGUobiwuLi5yKX0pKX0sYXU9e2VzYzpgZXNjYXBlYCxzcGFjZTpgIGAsdXA6YGFycm93LXVwYCxsZWZ0OmBhcnJvdy1sZWZ0YCxyaWdodDpgYXJyb3ctcmlnaHRgLGRvd246YGFycm93LWRvd25gLGRlbGV0ZTpgYmFja3NwYWNlYH0sb3U9KGUsdCk9PntsZXQgbj1lLl93aXRoS2V5c3x8PXt9LHI9dC5qb2luKGAuYCk7cmV0dXJuIG5bcl18fChuW3JdPShuPT57aWYoIShga2V5YGluIG4pKXJldHVybjtsZXQgcj1vZShuLmtleSk7aWYodC5zb21lKGU9PmU9PT1yfHxhdVtlXT09PXIpKXJldHVybiBlKG4pfSkpfSxzdT1sKHtwYXRjaFByb3A6X2x9LF9jKSxjdSxsdT0hMTtmdW5jdGlvbiB1dSgpe3JldHVybiBjdXx8PUxvKHN1KX1mdW5jdGlvbiBkdSgpe3JldHVybiBjdT1sdT9jdTpSbyhzdSksbHU9ITAsY3V9dmFyIGZ1PSgoLi4uZSk9Pnt1dSgpLnJlbmRlciguLi5lKX0pLHB1PSgoLi4uZSk9PntkdSgpLmh5ZHJhdGUoLi4uZSl9KSxtdT0oKC4uLmUpPT57bGV0IHQ9dXUoKS5jcmVhdGVBcHAoLi4uZSkse21vdW50Om59PXQ7cmV0dXJuIHQubW91bnQ9ZT0+e2xldCByPV91KGUpO2lmKCFyKXJldHVybjtsZXQgaT10Ll9jb21wb25lbnQ7IXYoaSkmJiFpLnJlbmRlciYmIWkudGVtcGxhdGUmJihpLnRlbXBsYXRlPXIuaW5uZXJIVE1MKSxyLm5vZGVUeXBlPT09MSYmKHIudGV4dENvbnRlbnQ9YGApO2xldCBhPW4ociwhMSxndShyKSk7cmV0dXJuIHIgaW5zdGFuY2VvZiBFbGVtZW50JiYoci5yZW1vdmVBdHRyaWJ1dGUoYHYtY2xvYWtgKSxyLnNldEF0dHJpYnV0ZShgZGF0YS12LWFwcGAsYGApKSxhfSx0fSksaHU9KCguLi5lKT0+e2xldCB0PWR1KCkuY3JlYXRlQXBwKC4uLmUpLHttb3VudDpufT10O3JldHVybiB0Lm1vdW50PWU9PntsZXQgdD1fdShlKTtpZih0KXJldHVybiBuKHQsITAsZ3UodCkpfSx0fSk7ZnVuY3Rpb24gZ3UoZSl7aWYoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpcmV0dXJuYHN2Z2A7aWYodHlwZW9mIE1hdGhNTEVsZW1lbnQ9PWBmdW5jdGlvbmAmJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KXJldHVybmBtYXRobWxgfWZ1bmN0aW9uIF91KGUpe3JldHVybiB5KGUpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6ZX12YXIgdnU9ITEseXU9KCk9Pnt2dXx8KHZ1PSEwLHR1KCksVWMoKSl9LGJ1PXQoe0Jhc2VUcmFuc2l0aW9uOigpPT5RcixCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yczooKT0+SnIsQ29tbWVudDooKT0+Y3MsRGVwcmVjYXRpb25UeXBlczooKT0+bnVsbCxFZmZlY3RTY29wZTooKT0+TmUsRXJyb3JDb2RlczooKT0+em4sRXJyb3JUeXBlU3RyaW5nczooKT0+b2MsRnJhZ21lbnQ6KCk9PkwsS2VlcEFsaXZlOigpPT5CaSxSZWFjdGl2ZUVmZmVjdDooKT0+emUsU3RhdGljOigpPT5scyxTdXNwZW5zZTooKT0+WG8sVGVsZXBvcnQ6KCk9PlZyLFRleHQ6KCk9PnNzLFRyYWNrT3BUeXBlczooKT0+RW4sVHJhbnNpdGlvbjooKT0+Q2MsVHJhbnNpdGlvbkdyb3VwOigpPT5NbCxUcmlnZ2VyT3BUeXBlczooKT0+RG4sVnVlRWxlbWVudDooKT0+d2wsYXNzZXJ0TnVtYmVyOigpPT5SbixjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZzooKT0+SG4sY2FsbFdpdGhFcnJvckhhbmRsaW5nOigpPT5WbixjYW1lbGl6ZTooKT0+RSxjYXBpdGFsaXplOigpPT5zZSxjbG9uZVZOb2RlOigpPT5Dcyxjb21wYXRVdGlsczooKT0+bnVsbCxjb21waWxlOigpPT54dSxjb21wdXRlZDooKT0+VyxjcmVhdGVBcHA6KCk9Pm11LGNyZWF0ZUJsb2NrOigpPT5CLGNyZWF0ZUNvbW1lbnRWTm9kZTooKT0+VHMsY3JlYXRlRWxlbWVudEJsb2NrOigpPT56LGNyZWF0ZUVsZW1lbnRWTm9kZTooKT0+VixjcmVhdGVIeWRyYXRpb25SZW5kZXJlcjooKT0+Um8sY3JlYXRlUHJvcHNSZXN0UHJveHk6KCk9PklhLGNyZWF0ZVJlbmRlcmVyOigpPT5MbyxjcmVhdGVTU1JBcHA6KCk9Pmh1LGNyZWF0ZVNsb3RzOigpPT5oYSxjcmVhdGVTdGF0aWNWTm9kZTooKT0+d3MsY3JlYXRlVGV4dFZOb2RlOigpPT5VLGNyZWF0ZVZOb2RlOigpPT5ILGN1c3RvbVJlZjooKT0+dm4sZGVmaW5lQXN5bmNDb21wb25lbnQ6KCk9PkxpLGRlZmluZUNvbXBvbmVudDooKT0+RixkZWZpbmVDdXN0b21FbGVtZW50OigpPT54bCxkZWZpbmVFbWl0czooKT0+d2EsZGVmaW5lRXhwb3NlOigpPT5UYSxkZWZpbmVNb2RlbDooKT0+T2EsZGVmaW5lT3B0aW9uczooKT0+RWEsZGVmaW5lUHJvcHM6KCk9PkNhLGRlZmluZVNTUkN1c3RvbUVsZW1lbnQ6KCk9PlNsLGRlZmluZVNsb3RzOigpPT5EYSxkZXZ0b29sczooKT0+c2MsZWZmZWN0OigpPT5RZSxlZmZlY3RTY29wZTooKT0+UGUsZ2V0Q3VycmVudEluc3RhbmNlOigpPT5GcyxnZXRDdXJyZW50U2NvcGU6KCk9PkZlLGdldEN1cnJlbnRXYXRjaGVyOigpPT5qbixnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW46KCk9PmlpLGd1YXJkUmVhY3RpdmVQcm9wczooKT0+U3MsaDooKT0+RyxoYW5kbGVFcnJvcjooKT0+VW4saGFzSW5qZWN0aW9uQ29udGV4dDooKT0+YnIsaHlkcmF0ZTooKT0+cHUsaHlkcmF0ZU9uSWRsZTooKT0+QWksaHlkcmF0ZU9uSW50ZXJhY3Rpb246KCk9PlBpLGh5ZHJhdGVPbk1lZGlhUXVlcnk6KCk9Pk5pLGh5ZHJhdGVPblZpc2libGU6KCk9Pk1pLGluaXRDdXN0b21Gb3JtYXR0ZXI6KCk9PnRjLGluaXREaXJlY3RpdmVzRm9yU1NSOigpPT55dSxpbmplY3Q6KCk9PnlyLGlzTWVtb1NhbWU6KCk9PnJjLGlzUHJveHk6KCk9Pm9uLGlzUmVhY3RpdmU6KCk9Pm5uLGlzUmVhZG9ubHk6KCk9PnJuLGlzUmVmOigpPT5qLGlzUnVudGltZU9ubHk6KCk9PkpzLGlzU2hhbGxvdzooKT0+YW4saXNWTm9kZTooKT0+Z3MsbWFya1JhdzooKT0+c24sbWVyZ2VEZWZhdWx0czooKT0+UGEsbWVyZ2VNb2RlbHM6KCk9PkZhLG1lcmdlUHJvcHM6KCk9PmtzLG5leHRUaWNrOigpPT5Rbixub2RlT3BzOigpPT5fYyxub3JtYWxpemVDbGFzczooKT0+Tyxub3JtYWxpemVQcm9wczooKT0+eGUsbm9ybWFsaXplU3R5bGU6KCk9PmdlLG9uQWN0aXZhdGVkOigpPT5IaSxvbkJlZm9yZU1vdW50OigpPT5YaSxvbkJlZm9yZVVubW91bnQ6KCk9PmVhLG9uQmVmb3JlVXBkYXRlOigpPT5RaSxvbkRlYWN0aXZhdGVkOigpPT5VaSxvbkVycm9yQ2FwdHVyZWQ6KCk9PmFhLG9uTW91bnRlZDooKT0+Wmksb25SZW5kZXJUcmFja2VkOigpPT5pYSxvblJlbmRlclRyaWdnZXJlZDooKT0+cmEsb25TY29wZURpc3Bvc2U6KCk9PkllLG9uU2VydmVyUHJlZmV0Y2g6KCk9Pm5hLG9uVW5tb3VudGVkOigpPT50YSxvblVwZGF0ZWQ6KCk9PiRpLG9uV2F0Y2hlckNsZWFudXA6KCk9Pk1uLG9wZW5CbG9jazooKT0+UixwYXRjaFByb3A6KCk9Pl9sLHBvcFNjb3BlSWQ6KCk9Pm1yLHByb3ZpZGU6KCk9PnZyLHByb3h5UmVmczooKT0+Z24scHVzaFNjb3BlSWQ6KCk9PnByLHF1ZXVlUG9zdEZsdXNoQ2I6KCk9Pm5yLHJlYWN0aXZlOigpPT5adCxyZWFkb25seTooKT0+JHQscmVmOigpPT5NLHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyOigpPT5xcyxyZW5kZXI6KCk9PmZ1LHJlbmRlckxpc3Q6KCk9Pm1hLHJlbmRlclNsb3Q6KCk9PkkscmVzb2x2ZUNvbXBvbmVudDooKT0+Y2EscmVzb2x2ZURpcmVjdGl2ZTooKT0+ZGEscmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ6KCk9PnVhLHJlc29sdmVGaWx0ZXI6KCk9Pm51bGwscmVzb2x2ZVRyYW5zaXRpb25Ib29rczooKT0+ZWksc2V0QmxvY2tUcmFja2luZzooKT0+bXMsc2V0RGV2dG9vbHNIb29rOigpPT5jYyxzZXRUcmFuc2l0aW9uSG9va3M6KCk9PnJpLHNoYWxsb3dSZWFjdGl2ZTooKT0+UXQsc2hhbGxvd1JlYWRvbmx5OigpPT5lbixzaGFsbG93UmVmOigpPT51bixzc3JDb250ZXh0S2V5OigpPT54cixzc3JVdGlsczooKT0+bGMsc3RvcDooKT0+JGUsdG9EaXNwbGF5U3RyaW5nOigpPT5rLHRvSGFuZGxlcktleTooKT0+Y2UsdG9IYW5kbGVyczooKT0+X2EsdG9SYXc6KCk9PkEsdG9SZWY6KCk9PlNuLHRvUmVmczooKT0+eW4sdG9WYWx1ZTooKT0+bW4sdHJhbnNmb3JtVk5vZGVBcmdzOigpPT52cyx0cmlnZ2VyUmVmOigpPT5wbix1bnJlZjooKT0+Tix1c2VBdHRyczooKT0+amEsdXNlQ3NzTW9kdWxlOigpPT5EbCx1c2VDc3NWYXJzOigpPT5HYyx1c2VIb3N0OigpPT5UbCx1c2VJZDooKT0+YWksdXNlTW9kZWw6KCk9PnJvLHVzZVNTUkNvbnRleHQ6KCk9PlNyLHVzZVNoYWRvd1Jvb3Q6KCk9PkVsLHVzZVNsb3RzOigpPT5BYSx1c2VUZW1wbGF0ZVJlZjooKT0+c2ksdXNlVHJhbnNpdGlvblN0YXRlOigpPT5Lcix2TW9kZWxDaGVja2JveDooKT0+R2wsdk1vZGVsRHluYW1pYzooKT0+UWwsdk1vZGVsUmFkaW86KCk9PnFsLHZNb2RlbFNlbGVjdDooKT0+Smwsdk1vZGVsVGV4dDooKT0+V2wsdlNob3c6KCk9PlZjLHZlcnNpb246KCk9PmljLHdhcm46KCk9PmFjLHdhdGNoOigpPT5Fcix3YXRjaEVmZmVjdDooKT0+Q3Isd2F0Y2hQb3N0RWZmZWN0OigpPT53cix3YXRjaFN5bmNFZmZlY3Q6KCk9PlRyLHdpdGhBc3luY0NvbnRleHQ6KCk9PkxhLHdpdGhDdHg6KCk9PlAsd2l0aERlZmF1bHRzOigpPT5rYSx3aXRoRGlyZWN0aXZlczooKT0+Z3Isd2l0aEtleXM6KCk9Pm91LHdpdGhNZW1vOigpPT5uYyx3aXRoTW9kaWZpZXJzOigpPT5pdSx3aXRoU2NvcGVJZDooKT0+aHJ9KSx4dT0oKT0+e307ZnVuY3Rpb24gU3UoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPUFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIEN1KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gd3UoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gU3UoZSl9ZnVuY3Rpb24gVHUoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbmApfWZ1bmN0aW9uIEV1KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsYHZhbHVlYGluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxMdShyLmtleSkscil9fWZ1bmN0aW9uIER1KGUsdCxuKXtyZXR1cm4gdCYmRXUoZS5wcm90b3R5cGUsdCksbiYmRXUoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIE91KGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVtgQEBpdGVyYXRvcmBdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj16dShlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09YG51bWJlcmApe24mJihlPW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6aX19dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgYSxvPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBlPW4ubmV4dCgpO3JldHVybiBvPWUuZG9uZSxlfSxlOmZ1bmN0aW9uKGUpe3M9ITAsYT1lfSxmOmZ1bmN0aW9uKCl7dHJ5e298fG4ucmV0dXJuPT1udWxsfHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX19fWZ1bmN0aW9uIEsoZSx0LG4pe3JldHVybih0PUx1KHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGt1KGUpe2lmKHR5cGVvZiBTeW1ib2w8YHVgJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbYEBAaXRlcmF0b3JgXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBBdShlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPGB1YCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlW2BAQGl0ZXJhdG9yYF07aWYobiE9bnVsbCl7dmFyIHIsaSxhLG8scz1bXSxjPSEwLGw9ITE7dHJ5e2lmKGE9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9YS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXtsPSEwLGk9ZX1maW5hbGx5e3RyeXtpZighYyYmbi5yZXR1cm4hPW51bGwmJihvPW4ucmV0dXJuKCksT2JqZWN0KG8pIT09bykpcmV0dXJufWZpbmFsbHl7aWYobCl0aHJvdyBpfX1yZXR1cm4gc319ZnVuY3Rpb24ganUoKXt0aHJvdyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBNdSgpe3Rocm93IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBOdShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHEoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/TnUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0soZSx0LG5bdF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TnUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfWZ1bmN0aW9uIFB1KGUsdCl7cmV0dXJuIEN1KGUpfHxBdShlLHQpfHx6dShlLHQpfHxqdSgpfWZ1bmN0aW9uIEZ1KGUpe3JldHVybiB3dShlKXx8a3UoZSl8fHp1KGUpfHxNdSgpfWZ1bmN0aW9uIEl1KGUsdCl7aWYodHlwZW9mIGUhPWBvYmplY3RgfHwhZSlyZXR1cm4gZTt2YXIgbj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGUsdHx8YGRlZmF1bHRgKTtpZih0eXBlb2YgciE9YG9iamVjdGApcmV0dXJuIHI7dGhyb3cgVHlwZUVycm9yKGBAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLmApfXJldHVybih0PT09YHN0cmluZ2A/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gTHUoZSl7dmFyIHQ9SXUoZSxgc3RyaW5nYCk7cmV0dXJuIHR5cGVvZiB0PT1gc3ltYm9sYD90OnQrYGB9ZnVuY3Rpb24gUnUoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4gUnU9dHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09YHN5bWJvbGA/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmdHlwZW9mIFN5bWJvbD09YGZ1bmN0aW9uYCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/YHN5bWJvbGA6dHlwZW9mIGV9LFJ1KGUpfWZ1bmN0aW9uIHp1KGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBTdShlLHQpO3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7cmV0dXJuIG49PT1gT2JqZWN0YCYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxuPT09YE1hcGB8fG49PT1gU2V0YD9BcnJheS5mcm9tKGUpOm49PT1gQXJndW1lbnRzYHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/U3UoZSx0KTp2b2lkIDB9fXZhciBCdT1mdW5jdGlvbigpe30sVnU9e30sSHU9e30sVXU9bnVsbCxXdT17bWFyazpCdSxtZWFzdXJlOkJ1fTt0cnl7dHlwZW9mIHdpbmRvdzxgdWAmJihWdT13aW5kb3cpLHR5cGVvZiBkb2N1bWVudDxgdWAmJihIdT1kb2N1bWVudCksdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI8YHVgJiYoVXU9TXV0YXRpb25PYnNlcnZlciksdHlwZW9mIHBlcmZvcm1hbmNlPGB1YCYmKFd1PXBlcmZvcm1hbmNlKX1jYXRjaHt9dmFyIEd1PShWdS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQsS3U9R3U9PT12b2lkIDA/YGA6R3UscXU9VnUsSnU9SHUsWXU9VXUsWHU9V3U7cXUuZG9jdW1lbnQ7dmFyIFp1PSEhSnUuZG9jdW1lbnRFbGVtZW50JiYhIUp1LmhlYWQmJnR5cGVvZiBKdS5hZGRFdmVudExpc3RlbmVyPT1gZnVuY3Rpb25gJiZ0eXBlb2YgSnUuY3JlYXRlRWxlbWVudD09YGZ1bmN0aW9uYCxRdT1+S3UuaW5kZXhPZihgTVNJRWApfHx+S3UuaW5kZXhPZihgVHJpZGVudC9gKSwkdSxlZD0vZmEoa3xrZHxzfHJ8bHx0fGR8ZHJ8ZGx8ZHR8YnxzbHJ8c2xwcnx3c2J8dGx8bnN8bmRzfGVzfGd0fGpyfGpmcnxqZHJ8dXNifHVmc2J8dWRzYnxjcnxzc3xzcnxzbHxzdHxzZHN8c2RyfHNkbHxzZHR8c2xkcnxzbHBkcnxwcnxtc3x2cyk/W1wtXCBdLyx0ZD0vRm9udCA/QXdlc29tZSA/KFs1NjcgXSopKFNvbGlkfFJlZ3VsYXJ8TGlnaHR8VGhpbnxEdW90b25lfEJyYW5kc3xGcmVlfFByb3xTaGFycCBEdW90b25lfFNoYXJwfEtpdHxOb3Rkb2cgRHVvfE5vdGRvZ3xDaGlzZWx8RXRjaHxHcmFwaGl0ZXxUaHVtYnByaW50fEplbGx5IEZpbGx8SmVsbHkgRHVvfEplbGx5fFV0aWxpdHl8VXRpbGl0eSBGaWxsfFV0aWxpdHkgRHVvfFNsYWIgUHJlc3N8U2xhYnxTbGFiIER1b3xTbGFiIFByZXNzIER1b3xQaXhlbHxNb3NhaWN8VmVsbHVtfFdoaXRlYm9hcmQpPy4qL2ksbmQ9e2NsYXNzaWM6e2ZhOmBzb2xpZGAsZmFzOmBzb2xpZGAsImZhLXNvbGlkIjpgc29saWRgLGZhcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWw6YGxpZ2h0YCwiZmEtbGlnaHQiOmBsaWdodGAsZmF0OmB0aGluYCwiZmEtdGhpbiI6YHRoaW5gLGZhYjpgYnJhbmRzYCwiZmEtYnJhbmRzIjpgYnJhbmRzYH0sZHVvdG9uZTp7ZmE6YHNvbGlkYCxmYWQ6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsImZhLWR1b3RvbmUiOmBzb2xpZGAsZmFkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWRsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhZHQ6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LHNoYXJwOntmYTpgc29saWRgLGZhc3M6YHNvbGlkYCwiZmEtc29saWQiOmBzb2xpZGAsZmFzcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNsOmBsaWdodGAsImZhLWxpZ2h0IjpgbGlnaHRgLGZhc3Q6YHRoaW5gLCJmYS10aGluIjpgdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmE6YHNvbGlkYCxmYXNkczpgc29saWRgLCJmYS1zb2xpZCI6YHNvbGlkYCxmYXNkcjpgcmVndWxhcmAsImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNkbDpgbGlnaHRgLCJmYS1saWdodCI6YGxpZ2h0YCxmYXNkdDpgdGhpbmAsImZhLXRoaW4iOmB0aGluYH0sc2xhYjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscjpgcmVndWxhcmB9LCJzbGFiLXByZXNzIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYXNscHI6YHJlZ3VsYXJgfSwic2xhYi1kdW8iOnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhc2xkcjpgcmVndWxhcmB9LCJzbGFiLXByZXNzLWR1byI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFzbHBkcjpgcmVndWxhcmB9LHRodW1icHJpbnQ6eyJmYS1saWdodCI6YGxpZ2h0YCxmYXRsOmBsaWdodGB9LHZlbGx1bTp7ImZhLXNvbGlkIjpgc29saWRgLGZhdnM6YHNvbGlkYH0scGl4ZWw6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFwcjpgcmVndWxhcmB9LG1vc2FpYzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbXM6YHNvbGlkYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhd3NiOmBzZW1pYm9sZGB9LG5vdGRvZzp7ImZhLXNvbGlkIjpgc29saWRgLGZhbnM6YHNvbGlkYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBzb2xpZGAsZmFuZHM6YHNvbGlkYH0sZXRjaDp7ImZhLXNvbGlkIjpgc29saWRgLGZhZXM6YHNvbGlkYH0sZ3JhcGhpdGU6eyJmYS10aGluIjpgdGhpbmAsZmFndDpgdGhpbmB9LGplbGx5OnsiZmEtcmVndWxhciI6YHJlZ3VsYXJgLGZhanI6YHJlZ3VsYXJgfSwiamVsbHktZmlsbCI6eyJmYS1yZWd1bGFyIjpgcmVndWxhcmAsZmFqZnI6YHJlZ3VsYXJgfSwiamVsbHktZHVvIjp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWpkcjpgcmVndWxhcmB9LGNoaXNlbDp7ImZhLXJlZ3VsYXIiOmByZWd1bGFyYCxmYWNyOmByZWd1bGFyYH0sdXRpbGl0eTp7ImZhLXNlbWlib2xkIjpgc2VtaWJvbGRgLGZhdXNiOmBzZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVkc2I6YHNlbWlib2xkYH0sInV0aWxpdHktZmlsbCI6eyJmYS1zZW1pYm9sZCI6YHNlbWlib2xkYCxmYXVmc2I6YHNlbWlib2xkYH19LHJkPXtHUk9VUDpgZHVvdG9uZS1ncm91cGAsU1dBUF9PUEFDSVRZOmBzd2FwLW9wYWNpdHlgLFBSSU1BUlk6YHByaW1hcnlgLFNFQ09OREFSWTpgc2Vjb25kYXJ5YH0saWQ9W2BmYS1jbGFzc2ljYCxgZmEtZHVvdG9uZWAsYGZhLXNoYXJwYCxgZmEtc2hhcnAtZHVvdG9uZWAsYGZhLXRodW1icHJpbnRgLGBmYS13aGl0ZWJvYXJkYCxgZmEtbm90ZG9nYCxgZmEtbm90ZG9nLWR1b2AsYGZhLWNoaXNlbGAsYGZhLWV0Y2hgLGBmYS1ncmFwaGl0ZWAsYGZhLWplbGx5YCxgZmEtamVsbHktZmlsbGAsYGZhLWplbGx5LWR1b2AsYGZhLXNsYWJgLGBmYS1zbGFiLXByZXNzYCxgZmEtc2xhYi1wcmVzcy1kdW9gLGBmYS1zbGFiLWR1b2AsYGZhLW1vc2FpY2AsYGZhLXBpeGVsYCxgZmEtdmVsbHVtYCxgZmEtdXRpbGl0eWAsYGZhLXV0aWxpdHktZHVvYCxgZmEtdXRpbGl0eS1maWxsYF0sYWQ9YGNsYXNzaWNgLG9kPWBkdW90b25lYCxzZD1gc2hhcnBgLGNkPWBzaGFycC1kdW90b25lYCxsZD1gY2hpc2VsYCx1ZD1gZXRjaGAsZGQ9YGdyYXBoaXRlYCxmZD1gamVsbHlgLHBkPWBqZWxseS1kdW9gLG1kPWBqZWxseS1maWxsYCxoZD1gbW9zYWljYCxnZD1gbm90ZG9nYCxfZD1gbm90ZG9nLWR1b2AsdmQ9YHBpeGVsYCx5ZD1gc2xhYmAsYmQ9YHNsYWItZHVvYCx4ZD1gc2xhYi1wcmVzc2AsU2Q9YHNsYWItcHJlc3MtZHVvYCxDZD1gdGh1bWJwcmludGAsd2Q9YHV0aWxpdHlgLFRkPWB1dGlsaXR5LWR1b2AsRWQ9YHV0aWxpdHktZmlsbGAsRGQ9YHZlbGx1bWAsT2Q9YHdoaXRlYm9hcmRgLGtkPWBDbGFzc2ljYCxBZD1gRHVvdG9uZWAsamQ9YFNoYXJwYCxNZD1gU2hhcnAgRHVvdG9uZWAsTmQ9YENoaXNlbGAsUGQ9YEV0Y2hgLEZkPWBHcmFwaGl0ZWAsSWQ9YEplbGx5YCxMZD1gSmVsbHkgRHVvYCxSZD1gSmVsbHkgRmlsbGAsemQ9YE1vc2FpY2AsQmQ9YE5vdGRvZ2AsVmQ9YE5vdGRvZyBEdW9gLEhkPWBQaXhlbGAsVWQ9YFNsYWJgLFdkPWBTbGFiIER1b2AsR2Q9YFNsYWIgUHJlc3NgLEtkPWBTbGFiIFByZXNzIER1b2AscWQ9YFRodW1icHJpbnRgLEpkPWBVdGlsaXR5YCxZZD1gVXRpbGl0eSBEdW9gLFhkPWBVdGlsaXR5IEZpbGxgLFpkPWBWZWxsdW1gLFFkPWBXaGl0ZWJvYXJkYCwkZD1bYWQsb2Qsc2QsY2QsbGQsdWQsZGQsZmQscGQsbWQsaGQsZ2QsX2QsdmQseWQsYmQseGQsU2QsQ2Qsd2QsVGQsRWQsRGQsT2RdOyR1PXt9LEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsYWQsa2QpLG9kLEFkKSxzZCxqZCksY2QsTWQpLGxkLE5kKSx1ZCxQZCksZGQsRmQpLGZkLElkKSxwZCxMZCksbWQsUmQpLEsoSyhLKEsoSyhLKEsoSyhLKEsoJHUsaGQsemQpLGdkLEJkKSxfZCxWZCksdmQsSGQpLHlkLFVkKSxiZCxXZCkseGQsR2QpLFNkLEtkKSxDZCxxZCksd2QsSmQpLEsoSyhLKEsoJHUsVGQsWWQpLEVkLFhkKSxEZCxaZCksT2QsUWQpO3ZhciBlZj17Y2xhc3NpYzp7OTAwOmBmYXNgLDQwMDpgZmFyYCxub3JtYWw6YGZhcmAsMzAwOmBmYWxgLDEwMDpgZmF0YH0sZHVvdG9uZTp7OTAwOmBmYWRgLDQwMDpgZmFkcmAsMzAwOmBmYWRsYCwxMDA6YGZhZHRgfSxzaGFycDp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLDMwMDpgZmFzbGAsMTAwOmBmYXN0YH0sInNoYXJwLWR1b3RvbmUiOns5MDA6YGZhc2RzYCw0MDA6YGZhc2RyYCwzMDA6YGZhc2RsYCwxMDA6YGZhc2R0YH0sc2xhYjp7NDAwOmBmYXNscmB9LCJzbGFiLXByZXNzIjp7NDAwOmBmYXNscHJgfSwic2xhYi1kdW8iOns0MDA6YGZhc2xkcmB9LCJzbGFiLXByZXNzLWR1byI6ezQwMDpgZmFzbHBkcmB9LHZlbGx1bTp7OTAwOmBmYXZzYH0sbW9zYWljOns5MDA6YGZhbXNgfSxwaXhlbDp7NDAwOmBmYXByYH0sd2hpdGVib2FyZDp7NjAwOmBmYXdzYmB9LHRodW1icHJpbnQ6ezMwMDpgZmF0bGB9LG5vdGRvZzp7OTAwOmBmYW5zYH0sIm5vdGRvZy1kdW8iOns5MDA6YGZhbmRzYH0sZXRjaDp7OTAwOmBmYWVzYH0sZ3JhcGhpdGU6ezEwMDpgZmFndGB9LGNoaXNlbDp7NDAwOmBmYWNyYH0samVsbHk6ezQwMDpgZmFqcmB9LCJqZWxseS1maWxsIjp7NDAwOmBmYWpmcmB9LCJqZWxseS1kdW8iOns0MDA6YGZhamRyYH0sdXRpbGl0eTp7NjAwOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6ezYwMDpgZmF1ZHNiYH0sInV0aWxpdHktZmlsbCI6ezYwMDpgZmF1ZnNiYH19LHRmPXsiRm9udCBBd2Vzb21lIDcgRnJlZSI6ezkwMDpgZmFzYCw0MDA6YGZhcmB9LCJGb250IEF3ZXNvbWUgNyBQcm8iOns5MDA6YGZhc2AsNDAwOmBmYXJgLG5vcm1hbDpgZmFyYCwzMDA6YGZhbGAsMTAwOmBmYXRgfSwiRm9udCBBd2Vzb21lIDcgQnJhbmRzIjp7NDAwOmBmYWJgLG5vcm1hbDpgZmFiYH0sIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOns5MDA6YGZhZGAsNDAwOmBmYWRyYCxub3JtYWw6YGZhZHJgLDMwMDpgZmFkbGAsMTAwOmBmYWR0YH0sIkZvbnQgQXdlc29tZSA3IFNoYXJwIjp7OTAwOmBmYXNzYCw0MDA6YGZhc3JgLG5vcm1hbDpgZmFzcmAsMzAwOmBmYXNsYCwxMDA6YGZhc3RgfSwiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI6ezkwMDpgZmFzZHNgLDQwMDpgZmFzZHJgLG5vcm1hbDpgZmFzZHJgLDMwMDpgZmFzZGxgLDEwMDpgZmFzZHRgfSwiRm9udCBBd2Vzb21lIDcgSmVsbHkiOns0MDA6YGZhanJgLG5vcm1hbDpgZmFqcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsIjp7NDAwOmBmYWpmcmAsbm9ybWFsOmBmYWpmcmB9LCJGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8iOns0MDA6YGZhamRyYCxub3JtYWw6YGZhamRyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIiOns0MDA6YGZhc2xyYCxub3JtYWw6YGZhc2xyYH0sIkZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MiOns0MDA6YGZhc2xwcmAsbm9ybWFsOmBmYXNscHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBEdW8iOns0MDA6YGZhc2xkcmAsbm9ybWFsOmBmYXNsZHJgfSwiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyBEdW8iOns0MDA6YGZhc2xwZHJgLG5vcm1hbDpgZmFzbHBkcmB9LCJGb250IEF3ZXNvbWUgNyBQaXhlbCI6ezQwMDpgZmFwcmAsbm9ybWFsOmBmYXByYH0sIkZvbnQgQXdlc29tZSA3IE1vc2FpYyI6ezkwMDpgZmFtc2Asbm9ybWFsOmBmYW1zYH0sIkZvbnQgQXdlc29tZSA3IFZlbGx1bSI6ezkwMDpgZmF2c2Asbm9ybWFsOmBmYXZzYH0sIkZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQiOnszMDA6YGZhdGxgLG5vcm1hbDpgZmF0bGB9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2ciOns5MDA6YGZhbnNgLG5vcm1hbDpgZmFuc2B9LCJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjp7OTAwOmBmYW5kc2Asbm9ybWFsOmBmYW5kc2B9LCJGb250IEF3ZXNvbWUgNyBFdGNoIjp7OTAwOmBmYWVzYCxub3JtYWw6YGZhZXNgfSwiRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUiOnsxMDA6YGZhZ3RgLG5vcm1hbDpgZmFndGB9LCJGb250IEF3ZXNvbWUgNyBDaGlzZWwiOns0MDA6YGZhY3JgLG5vcm1hbDpgZmFjcmB9LCJGb250IEF3ZXNvbWUgNyBXaGl0ZWJvYXJkIjp7NjAwOmBmYXdzYmAsbm9ybWFsOmBmYXdzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5Ijp7NjAwOmBmYXVzYmAsbm9ybWFsOmBmYXVzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byI6ezYwMDpgZmF1ZHNiYCxub3JtYWw6YGZhdWRzYmB9LCJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOns2MDA6YGZhdWZzYmAsbm9ybWFsOmBmYXVmc2JgfX0sbmY9bmV3IE1hcChbW2BjbGFzc2ljYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYCxgcmVndWxhcmAsYGxpZ2h0YCxgdGhpbmAsYGJyYW5kc2BdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZHVvdG9uZWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWRgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc3NgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHNoYXJwLWR1b3RvbmVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzZHNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYGNoaXNlbGAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYWNyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BldGNoYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhZXNgLGRlZmF1bHRTdHlsZUlkOmBzb2xpZGAsc3R5bGVJZHM6W2Bzb2xpZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjkwMH1dLFtgZ3JhcGhpdGVgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFndGAsZGVmYXVsdFN0eWxlSWQ6YHRoaW5gLHN0eWxlSWRzOltgdGhpbmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjEwMH1dLFtgamVsbHlgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFqcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgamVsbHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamRyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2BqZWxseS1maWxsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhamZyYCxkZWZhdWx0U3R5bGVJZDpgcmVndWxhcmAsc3R5bGVJZHM6W2ByZWd1bGFyYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NDAwfV0sW2Btb3NhaWNgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFtc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2dgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFuc2AsZGVmYXVsdFN0eWxlSWQ6YHNvbGlkYCxzdHlsZUlkczpbYHNvbGlkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6OTAwfV0sW2Bub3Rkb2ctZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhbmRzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHBpeGVsYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhcHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWJgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmFzbHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xkcmAsZGVmYXVsdFN0eWxlSWQ6YHJlZ3VsYXJgLHN0eWxlSWRzOltgcmVndWxhcmBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjQwMH1dLFtgc2xhYi1wcmVzc2Ase2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXNscHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHNsYWItcHJlc3MtZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhc2xwZHJgLGRlZmF1bHRTdHlsZUlkOmByZWd1bGFyYCxzdHlsZUlkczpbYHJlZ3VsYXJgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo0MDB9XSxbYHRodW1icHJpbnRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF0bGAsZGVmYXVsdFN0eWxlSWQ6YGxpZ2h0YCxzdHlsZUlkczpbYGxpZ2h0YF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6MzAwfV0sW2B1dGlsaXR5YCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdXNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHV0aWxpdHktZHVvYCx7ZGVmYXVsdFNob3J0UHJlZml4SWQ6YGZhdWRzYmAsZGVmYXVsdFN0eWxlSWQ6YHNlbWlib2xkYCxzdHlsZUlkczpbYHNlbWlib2xkYF0sZnV0dXJlU3R5bGVJZHM6W10sZGVmYXVsdEZvbnRXZWlnaHQ6NjAwfV0sW2B1dGlsaXR5LWZpbGxgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF1ZnNiYCxkZWZhdWx0U3R5bGVJZDpgc2VtaWJvbGRgLHN0eWxlSWRzOltgc2VtaWJvbGRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo2MDB9XSxbYHZlbGx1bWAse2RlZmF1bHRTaG9ydFByZWZpeElkOmBmYXZzYCxkZWZhdWx0U3R5bGVJZDpgc29saWRgLHN0eWxlSWRzOltgc29saWRgXSxmdXR1cmVTdHlsZUlkczpbXSxkZWZhdWx0Rm9udFdlaWdodDo5MDB9XSxbYHdoaXRlYm9hcmRgLHtkZWZhdWx0U2hvcnRQcmVmaXhJZDpgZmF3c2JgLGRlZmF1bHRTdHlsZUlkOmBzZW1pYm9sZGAsc3R5bGVJZHM6W2BzZW1pYm9sZGBdLGZ1dHVyZVN0eWxlSWRzOltdLGRlZmF1bHRGb250V2VpZ2h0OjYwMH1dXSkscmY9e2NoaXNlbDp7cmVndWxhcjpgZmFjcmB9LGNsYXNzaWM6e2JyYW5kczpgZmFiYCxsaWdodDpgZmFsYCxyZWd1bGFyOmBmYXJgLHNvbGlkOmBmYXNgLHRoaW46YGZhdGB9LGR1b3RvbmU6e2xpZ2h0OmBmYWRsYCxyZWd1bGFyOmBmYWRyYCxzb2xpZDpgZmFkYCx0aGluOmBmYWR0YH0sZXRjaDp7c29saWQ6YGZhZXNgfSxncmFwaGl0ZTp7dGhpbjpgZmFndGB9LGplbGx5OntyZWd1bGFyOmBmYWpyYH0sImplbGx5LWR1byI6e3JlZ3VsYXI6YGZhamRyYH0sImplbGx5LWZpbGwiOntyZWd1bGFyOmBmYWpmcmB9LG1vc2FpYzp7c29saWQ6YGZhbXNgfSxub3Rkb2c6e3NvbGlkOmBmYW5zYH0sIm5vdGRvZy1kdW8iOntzb2xpZDpgZmFuZHNgfSxwaXhlbDp7cmVndWxhcjpgZmFwcmB9LHNoYXJwOntsaWdodDpgZmFzbGAscmVndWxhcjpgZmFzcmAsc29saWQ6YGZhc3NgLHRoaW46YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6e2xpZ2h0OmBmYXNkbGAscmVndWxhcjpgZmFzZHJgLHNvbGlkOmBmYXNkc2AsdGhpbjpgZmFzZHRgfSxzbGFiOntyZWd1bGFyOmBmYXNscmB9LCJzbGFiLWR1byI6e3JlZ3VsYXI6YGZhc2xkcmB9LCJzbGFiLXByZXNzIjp7cmVndWxhcjpgZmFzbHByYH0sInNsYWItcHJlc3MtZHVvIjp7cmVndWxhcjpgZmFzbHBkcmB9LHRodW1icHJpbnQ6e2xpZ2h0OmBmYXRsYH0sdXRpbGl0eTp7c2VtaWJvbGQ6YGZhdXNiYH0sInV0aWxpdHktZHVvIjp7c2VtaWJvbGQ6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOntzZW1pYm9sZDpgZmF1ZnNiYH0sdmVsbHVtOntzb2xpZDpgZmF2c2B9LHdoaXRlYm9hcmQ6e3NlbWlib2xkOmBmYXdzYmB9fSxhZj1bYGZha2AsYGZhLWtpdGAsYGZha2RgLGBmYS1raXQtZHVvdG9uZWBdLG9mPXtraXQ6e2Zhazpga2l0YCwiZmEta2l0Ijpga2l0YH0sImtpdC1kdW90b25lIjp7ZmFrZDpga2l0LWR1b3RvbmVgLCJmYS1raXQtZHVvdG9uZSI6YGtpdC1kdW90b25lYH19LHNmPVtga2l0YF07SyhLKHt9LGBraXRgLGBLaXRgKSxga2l0LWR1b3RvbmVgLGBLaXQgRHVvdG9uZWApO3ZhciBjZj17a2l0OnsiZmEta2l0IjpgZmFrYH0sImtpdC1kdW90b25lIjp7ImZhLWtpdC1kdW90b25lIjpgZmFrZGB9fSxsZj17IkZvbnQgQXdlc29tZSBLaXQiOns0MDA6YGZha2Asbm9ybWFsOmBmYWtgfSwiRm9udCBBd2Vzb21lIEtpdCBEdW90b25lIjp7NDAwOmBmYWtkYCxub3JtYWw6YGZha2RgfX0sdWY9e2tpdDp7ZmFrOmBmYS1raXRgfSwia2l0LWR1b3RvbmUiOntmYWtkOmBmYS1raXQtZHVvdG9uZWB9fSxkZj17a2l0OntraXQ6YGZha2B9LCJraXQtZHVvdG9uZSI6eyJraXQtZHVvdG9uZSI6YGZha2RgfX0sZmYscGY9e0dST1VQOmBkdW90b25lLWdyb3VwYCxTV0FQX09QQUNJVFk6YHN3YXAtb3BhY2l0eWAsUFJJTUFSWTpgcHJpbWFyeWAsU0VDT05EQVJZOmBzZWNvbmRhcnlgfSxtZj1bYGZhLWNsYXNzaWNgLGBmYS1kdW90b25lYCxgZmEtc2hhcnBgLGBmYS1zaGFycC1kdW90b25lYCxgZmEtdGh1bWJwcmludGAsYGZhLXdoaXRlYm9hcmRgLGBmYS1ub3Rkb2dgLGBmYS1ub3Rkb2ctZHVvYCxgZmEtY2hpc2VsYCxgZmEtZXRjaGAsYGZhLWdyYXBoaXRlYCxgZmEtamVsbHlgLGBmYS1qZWxseS1maWxsYCxgZmEtamVsbHktZHVvYCxgZmEtc2xhYmAsYGZhLXNsYWItcHJlc3NgLGBmYS1zbGFiLXByZXNzLWR1b2AsYGZhLXNsYWItZHVvYCxgZmEtbW9zYWljYCxgZmEtcGl4ZWxgLGBmYS12ZWxsdW1gLGBmYS11dGlsaXR5YCxgZmEtdXRpbGl0eS1kdW9gLGBmYS11dGlsaXR5LWZpbGxgXTtmZj17fSxLKEsoSyhLKEsoSyhLKEsoSyhLKGZmLGBjbGFzc2ljYCxgQ2xhc3NpY2ApLGBkdW90b25lYCxgRHVvdG9uZWApLGBzaGFycGAsYFNoYXJwYCksYHNoYXJwLWR1b3RvbmVgLGBTaGFycCBEdW90b25lYCksYGNoaXNlbGAsYENoaXNlbGApLGBldGNoYCxgRXRjaGApLGBncmFwaGl0ZWAsYEdyYXBoaXRlYCksYGplbGx5YCxgSmVsbHlgKSxgamVsbHktZHVvYCxgSmVsbHkgRHVvYCksYGplbGx5LWZpbGxgLGBKZWxseSBGaWxsYCksSyhLKEsoSyhLKEsoSyhLKEsoSyhmZixgbW9zYWljYCxgTW9zYWljYCksYG5vdGRvZ2AsYE5vdGRvZ2ApLGBub3Rkb2ctZHVvYCxgTm90ZG9nIER1b2ApLGBwaXhlbGAsYFBpeGVsYCksYHNsYWJgLGBTbGFiYCksYHNsYWItZHVvYCxgU2xhYiBEdW9gKSxgc2xhYi1wcmVzc2AsYFNsYWIgUHJlc3NgKSxgc2xhYi1wcmVzcy1kdW9gLGBTbGFiIFByZXNzIER1b2ApLGB0aHVtYnByaW50YCxgVGh1bWJwcmludGApLGB1dGlsaXR5YCxgVXRpbGl0eWApLEsoSyhLKEsoZmYsYHV0aWxpdHktZHVvYCxgVXRpbGl0eSBEdW9gKSxgdXRpbGl0eS1maWxsYCxgVXRpbGl0eSBGaWxsYCksYHZlbGx1bWAsYFZlbGx1bWApLGB3aGl0ZWJvYXJkYCxgV2hpdGVib2FyZGApLEsoSyh7fSxga2l0YCxgS2l0YCksYGtpdC1kdW90b25lYCxgS2l0IER1b3RvbmVgKTt2YXIgaGY9e2NsYXNzaWM6eyJmYS1icmFuZHMiOmBmYWJgLCJmYS1kdW90b25lIjpgZmFkYCwiZmEtbGlnaHQiOmBmYWxgLCJmYS1yZWd1bGFyIjpgZmFyYCwiZmEtc29saWQiOmBmYXNgLCJmYS10aGluIjpgZmF0YH0sZHVvdG9uZTp7ImZhLXJlZ3VsYXIiOmBmYWRyYCwiZmEtbGlnaHQiOmBmYWRsYCwiZmEtdGhpbiI6YGZhZHRgfSxzaGFycDp7ImZhLXNvbGlkIjpgZmFzc2AsImZhLXJlZ3VsYXIiOmBmYXNyYCwiZmEtbGlnaHQiOmBmYXNsYCwiZmEtdGhpbiI6YGZhc3RgfSwic2hhcnAtZHVvdG9uZSI6eyJmYS1zb2xpZCI6YGZhc2RzYCwiZmEtcmVndWxhciI6YGZhc2RyYCwiZmEtbGlnaHQiOmBmYXNkbGAsImZhLXRoaW4iOmBmYXNkdGB9LHNsYWI6eyJmYS1yZWd1bGFyIjpgZmFzbHJgfSwic2xhYi1wcmVzcyI6eyJmYS1yZWd1bGFyIjpgZmFzbHByYH0sInNsYWItZHVvIjp7ImZhLXJlZ3VsYXIiOmBmYXNsZHJgfSwic2xhYi1wcmVzcy1kdW8iOnsiZmEtcmVndWxhciI6YGZhc2xwZHJgfSxwaXhlbDp7ImZhLXJlZ3VsYXIiOmBmYXByYH0sbW9zYWljOnsiZmEtc29saWQiOmBmYW1zYH0sdmVsbHVtOnsiZmEtc29saWQiOmBmYXZzYH0sd2hpdGVib2FyZDp7ImZhLXNlbWlib2xkIjpgZmF3c2JgfSx0aHVtYnByaW50OnsiZmEtbGlnaHQiOmBmYXRsYH0sbm90ZG9nOnsiZmEtc29saWQiOmBmYW5zYH0sIm5vdGRvZy1kdW8iOnsiZmEtc29saWQiOmBmYW5kc2B9LGV0Y2g6eyJmYS1zb2xpZCI6YGZhZXNgfSxncmFwaGl0ZTp7ImZhLXRoaW4iOmBmYWd0YH0samVsbHk6eyJmYS1yZWd1bGFyIjpgZmFqcmB9LCJqZWxseS1maWxsIjp7ImZhLXJlZ3VsYXIiOmBmYWpmcmB9LCJqZWxseS1kdW8iOnsiZmEtcmVndWxhciI6YGZhamRyYH0sY2hpc2VsOnsiZmEtcmVndWxhciI6YGZhY3JgfSx1dGlsaXR5OnsiZmEtc2VtaWJvbGQiOmBmYXVzYmB9LCJ1dGlsaXR5LWR1byI6eyJmYS1zZW1pYm9sZCI6YGZhdWRzYmB9LCJ1dGlsaXR5LWZpbGwiOnsiZmEtc2VtaWJvbGQiOmBmYXVmc2JgfX0sZ2Y9e2NsYXNzaWM6W2BmYXNgLGBmYXJgLGBmYWxgLGBmYXRgLGBmYWRgXSxkdW90b25lOltgZmFkcmAsYGZhZGxgLGBmYWR0YF0sc2hhcnA6W2BmYXNzYCxgZmFzcmAsYGZhc2xgLGBmYXN0YF0sInNoYXJwLWR1b3RvbmUiOltgZmFzZHNgLGBmYXNkcmAsYGZhc2RsYCxgZmFzZHRgXSxzbGFiOltgZmFzbHJgXSwic2xhYi1wcmVzcyI6W2BmYXNscHJgXSwic2xhYi1kdW8iOltgZmFzbGRyYF0sInNsYWItcHJlc3MtZHVvIjpbYGZhc2xwZHJgXSxwaXhlbDpbYGZhcHJgXSxtb3NhaWM6W2BmYW1zYF0sdmVsbHVtOltgZmF2c2BdLHdoaXRlYm9hcmQ6W2BmYXdzYmBdLHRodW1icHJpbnQ6W2BmYXRsYF0sbm90ZG9nOltgZmFuc2BdLCJub3Rkb2ctZHVvIjpbYGZhbmRzYF0sZXRjaDpbYGZhZXNgXSxncmFwaGl0ZTpbYGZhZ3RgXSxqZWxseTpbYGZhanJgXSwiamVsbHktZmlsbCI6W2BmYWpmcmBdLCJqZWxseS1kdW8iOltgZmFqZHJgXSxjaGlzZWw6W2BmYWNyYF0sdXRpbGl0eTpbYGZhdXNiYF0sInV0aWxpdHktZHVvIjpbYGZhdWRzYmBdLCJ1dGlsaXR5LWZpbGwiOltgZmF1ZnNiYF19LF9mPXtjbGFzc2ljOntmYWI6YGZhLWJyYW5kc2AsZmFkOmBmYS1kdW90b25lYCxmYWw6YGZhLWxpZ2h0YCxmYXI6YGZhLXJlZ3VsYXJgLGZhczpgZmEtc29saWRgLGZhdDpgZmEtdGhpbmB9LGR1b3RvbmU6e2ZhZHI6YGZhLXJlZ3VsYXJgLGZhZGw6YGZhLWxpZ2h0YCxmYWR0OmBmYS10aGluYH0sc2hhcnA6e2Zhc3M6YGZhLXNvbGlkYCxmYXNyOmBmYS1yZWd1bGFyYCxmYXNsOmBmYS1saWdodGAsZmFzdDpgZmEtdGhpbmB9LCJzaGFycC1kdW90b25lIjp7ZmFzZHM6YGZhLXNvbGlkYCxmYXNkcjpgZmEtcmVndWxhcmAsZmFzZGw6YGZhLWxpZ2h0YCxmYXNkdDpgZmEtdGhpbmB9LHNsYWI6e2Zhc2xyOmBmYS1yZWd1bGFyYH0sInNsYWItcHJlc3MiOntmYXNscHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1kdW8iOntmYXNsZHI6YGZhLXJlZ3VsYXJgfSwic2xhYi1wcmVzcy1kdW8iOntmYXNscGRyOmBmYS1yZWd1bGFyYH0scGl4ZWw6e2ZhcHI6YGZhLXJlZ3VsYXJgfSxtb3NhaWM6e2ZhbXM6YGZhLXNvbGlkYH0sdmVsbHVtOntmYXZzOmBmYS1zb2xpZGB9LHdoaXRlYm9hcmQ6e2Zhd3NiOmBmYS1zZW1pYm9sZGB9LHRodW1icHJpbnQ6e2ZhdGw6YGZhLWxpZ2h0YH0sbm90ZG9nOntmYW5zOmBmYS1zb2xpZGB9LCJub3Rkb2ctZHVvIjp7ZmFuZHM6YGZhLXNvbGlkYH0sZXRjaDp7ZmFlczpgZmEtc29saWRgfSxncmFwaGl0ZTp7ZmFndDpgZmEtdGhpbmB9LGplbGx5OntmYWpyOmBmYS1yZWd1bGFyYH0sImplbGx5LWZpbGwiOntmYWpmcjpgZmEtcmVndWxhcmB9LCJqZWxseS1kdW8iOntmYWpkcjpgZmEtcmVndWxhcmB9LGNoaXNlbDp7ZmFjcjpgZmEtcmVndWxhcmB9LHV0aWxpdHk6e2ZhdXNiOmBmYS1zZW1pYm9sZGB9LCJ1dGlsaXR5LWR1byI6e2ZhdWRzYjpgZmEtc2VtaWJvbGRgfSwidXRpbGl0eS1maWxsIjp7ZmF1ZnNiOmBmYS1zZW1pYm9sZGB9fSx2Zj1gZmEuZmFzLmZhci5mYWwuZmF0LmZhZC5mYWRyLmZhZGwuZmFkdC5mYWIuZmFzcy5mYXNyLmZhc2wuZmFzdC5mYXNkcy5mYXNkci5mYXNkbC5mYXNkdC5mYXNsci5mYXNscHIuZmFzbGRyLmZhc2xwZHIuZmFwci5mYW1zLmZhdnMuZmF3c2IuZmF0bC5mYW5zLmZhbmRzLmZhZXMuZmFndC5mYWpyLmZhamZyLmZhamRyLmZhY3IuZmF1c2IuZmF1ZHNiLmZhdWZzYmAuc3BsaXQoYC5gKS5jb25jYXQobWYsW2BmYS1zb2xpZGAsYGZhLXJlZ3VsYXJgLGBmYS1saWdodGAsYGZhLXRoaW5gLGBmYS1kdW90b25lYCxgZmEtYnJhbmRzYCxgZmEtc2VtaWJvbGRgXSkseWY9W2Bzb2xpZGAsYHJlZ3VsYXJgLGBsaWdodGAsYHRoaW5gLGBkdW90b25lYCxgYnJhbmRzYCxgc2VtaWJvbGRgXSxiZj1bMSwyLDMsNCw1LDYsNyw4LDksMTBdLHhmPWJmLmNvbmNhdChbMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdKSxTZj1bXS5jb25jYXQoRnUoT2JqZWN0LmtleXMoZ2YpKSx5ZixbYGF3YCxgZndgLGBwdWxsLWxlZnRgLGBwdWxsLXJpZ2h0YF0sW2AyeHNgLGB4c2AsYHNtYCxgbGdgLGB4bGAsYDJ4bGAsYGJlYXRgLGBiZWF0LWZhZGVgLGBib3JkZXJgLGBib3VuY2VgLGBidXp6YCxgY2FudmFzLXNxdWFyZWAsYGNhbnZhcy1yb29teWAsYGZhZGVgLGBmbGlwLTM2MGAsYGZsaXAtYm90aGAsYGZsaXAtaG9yaXpvbnRhbGAsYGZsaXAtdmVydGljYWxgLGBmbGlwYCxgZmxvYXRgLGBpbnZlcnNlYCxgamVsbG9gLGBsYXllcnNgLGBsYXllcnMtYm90dG9tLWxlZnRgLGBsYXllcnMtYm90dG9tLXJpZ2h0YCxgbGF5ZXJzLWNvdW50ZXJgLGBsYXllcnMtdGV4dGAsYGxheWVycy10b3AtbGVmdGAsYGxheWVycy10b3AtcmlnaHRgLGBsaWAsYHB1bGwtZW5kYCxgcHVsbC1zdGFydGAsYHB1bHNlYCxgcm90YXRlLTE4MGAsYHJvdGF0ZS0yNzBgLGByb3RhdGUtOTBgLGByb3RhdGUtYnlgLGBzaGFrZWAsYHNwaW4tcHVsc2VgLGBzcGluLXJldmVyc2VgLGBzcGluYCxgc3Bpbi1zbmFwYCxgc3Bpbi1zbmFwLTRgLGBzcGluLXNuYXAtOGAsYHN0YWNrLTF4YCxgc3RhY2stMnhgLGBzdGFja2AsYHN3aW5nYCxgdWxgLGB3YWdgLGB3aWR0aC1hdXRvYCxgd2lkdGgtZml4ZWRgLHBmLkdST1VQLHBmLlNXQVBfT1BBQ0lUWSxwZi5QUklNQVJZLHBmLlNFQ09OREFSWV0sYmYubWFwKGZ1bmN0aW9uKGUpe3JldHVybmAke2V9eGB9KSx4Zi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYHctJHtlfWB9KSksQ2Y9eyJGb250IEF3ZXNvbWUgNSBGcmVlIjp7OTAwOmBmYXNgLDQwMDpgZmFyYH0sIkZvbnQgQXdlc29tZSA1IFBybyI6ezkwMDpgZmFzYCw0MDA6YGZhcmAsbm9ybWFsOmBmYXJgLDMwMDpgZmFsYH0sIkZvbnQgQXdlc29tZSA1IEJyYW5kcyI6ezQwMDpgZmFiYCxub3JtYWw6YGZhYmB9LCJGb250IEF3ZXNvbWUgNSBEdW90b25lIjp7OTAwOmBmYWRgfX0sd2Y9YF9fX0ZPTlRfQVdFU09NRV9fX2AsVGY9MTYsRWY9YGZhYCxEZj1gc3ZnLWlubGluZS0tZmFgLE9mPWBkYXRhLWZhLWkyc3ZnYCxrZj1gZGF0YS1mYS1wc2V1ZG8tZWxlbWVudGAsQWY9YGRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZ2AsamY9YGRhdGEtcHJlZml4YCxNZj1gZGF0YS1pY29uYCxOZj1gZm9udGF3ZXNvbWUtaTJzdmdgLFBmPWBhc3luY2AsRmY9W2BIVE1MYCxgSEVBRGAsYFNUWUxFYCxgU0NSSVBUYF0sSWY9W2A6OmJlZm9yZWAsYDo6YWZ0ZXJgLGA6YmVmb3JlYCxgOmFmdGVyYF0sTGY9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuITB9Y2F0Y2h7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIFJmKGUpe3JldHVybiBuZXcgUHJveHkoZSx7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQgaW4gZT9lW3RdOmVbYWRdfX0pfXZhciB6Zj1xKHt9LG5kKTt6ZlthZF09cShxKHEocSh7fSx7ImZhLWR1b3RvbmUiOmBkdW90b25lYH0pLG5kW2FkXSksb2Yua2l0KSxvZltga2l0LWR1b3RvbmVgXSk7dmFyIEJmPVJmKHpmKSxWZj1xKHt9LHJmKTtWZlthZF09cShxKHEocSh7fSx7ZHVvdG9uZTpgZmFkYH0pLFZmW2FkXSksZGYua2l0KSxkZltga2l0LWR1b3RvbmVgXSk7dmFyIEhmPVJmKFZmKSxVZj1xKHt9LF9mKTtVZlthZF09cShxKHt9LFVmW2FkXSksdWYua2l0KTt2YXIgV2Y9UmYoVWYpLEdmPXEoe30saGYpO0dmW2FkXT1xKHEoe30sR2ZbYWRdKSxjZi5raXQpLFJmKEdmKTt2YXIgS2Y9ZWQscWY9YGZhLWxheWVycy10ZXh0YCxKZj10ZDtSZihxKHt9LGVmKSk7dmFyIFlmPVtgY2xhc3NgLGBkYXRhLXByZWZpeGAsYGRhdGEtaWNvbmAsYGRhdGEtZmEtdHJhbnNmb3JtYCxgZGF0YS1mYS1tYXNrYF0sWGY9cmQsWmY9W10uY29uY2F0KEZ1KHNmKSxGdShTZikpLFFmPXF1LkZvbnRBd2Vzb21lQ29uZmlnfHx7fTtmdW5jdGlvbiAkZihlKXt2YXIgdD1KdS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbYCtlK2BdYCk7aWYodClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24gZXAoZSl7cmV0dXJuIGU9PT1gYD8hMDplPT09YGZhbHNlYD8hMTplPT09YHRydWVgfHxlfUp1JiZ0eXBlb2YgSnUucXVlcnlTZWxlY3Rvcj09YGZ1bmN0aW9uYCYmW1tgZGF0YS1mYW1pbHktcHJlZml4YCxgZmFtaWx5UHJlZml4YF0sW2BkYXRhLWNzcy1wcmVmaXhgLGBjc3NQcmVmaXhgXSxbYGRhdGEtZmFtaWx5LWRlZmF1bHRgLGBmYW1pbHlEZWZhdWx0YF0sW2BkYXRhLXN0eWxlLWRlZmF1bHRgLGBzdHlsZURlZmF1bHRgXSxbYGRhdGEtcmVwbGFjZW1lbnQtY2xhc3NgLGByZXBsYWNlbWVudENsYXNzYF0sW2BkYXRhLWF1dG8tcmVwbGFjZS1zdmdgLGBhdXRvUmVwbGFjZVN2Z2BdLFtgZGF0YS1hdXRvLWFkZC1jc3NgLGBhdXRvQWRkQ3NzYF0sW2BkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHNgLGBzZWFyY2hQc2V1ZG9FbGVtZW50c2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLXdhcm5pbmdzYCxgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5nc2BdLFtgZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLWZ1bGwtc2NhbmAsYHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW5gXSxbYGRhdGEtb2JzZXJ2ZS1tdXRhdGlvbnNgLGBvYnNlcnZlTXV0YXRpb25zYF0sW2BkYXRhLW11dGF0ZS1hcHByb2FjaGAsYG11dGF0ZUFwcHJvYWNoYF0sW2BkYXRhLWtlZXAtb3JpZ2luYWwtc291cmNlYCxga2VlcE9yaWdpbmFsU291cmNlYF0sW2BkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2VgLGBtZWFzdXJlUGVyZm9ybWFuY2VgXSxbYGRhdGEtc2hvdy1taXNzaW5nLWljb25zYCxgc2hvd01pc3NpbmdJY29uc2BdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PVB1KGUsMiksbj10WzBdLHI9dFsxXSxpPWVwKCRmKG4pKTtpIT1udWxsJiYoUWZbcl09aSl9KTt2YXIgdHA9e3N0eWxlRGVmYXVsdDpgc29saWRgLGZhbWlseURlZmF1bHQ6YWQsY3NzUHJlZml4OkVmLHJlcGxhY2VtZW50Q2xhc3M6RGYsYXV0b1JlcGxhY2VTdmc6ITAsYXV0b0FkZENzczohMCxzZWFyY2hQc2V1ZG9FbGVtZW50czohMSxzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzOiEwLHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW46ITEsb2JzZXJ2ZU11dGF0aW9uczohMCxtdXRhdGVBcHByb2FjaDpgYXN5bmNgLGtlZXBPcmlnaW5hbFNvdXJjZTohMCxtZWFzdXJlUGVyZm9ybWFuY2U6ITEsc2hvd01pc3NpbmdJY29uczohMH07UWYuZmFtaWx5UHJlZml4JiYoUWYuY3NzUHJlZml4PVFmLmZhbWlseVByZWZpeCk7dmFyIG5wPXEocSh7fSx0cCksUWYpO25wLmF1dG9SZXBsYWNlU3ZnfHwobnAub2JzZXJ2ZU11dGF0aW9ucz0hMSk7dmFyIEo9e307T2JqZWN0LmtleXModHApLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEosZSx7ZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24odCl7bnBbZV09dCxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucFtlXX19KX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKLCJmYW1pbHlQcmVmaXgiLHtlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihlKXtucC5jc3NQcmVmaXg9ZSxycC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKEopfSl9LGdldDpmdW5jdGlvbigpe3JldHVybiBucC5jc3NQcmVmaXh9fSkscXUuRm9udEF3ZXNvbWVDb25maWc9Sjt2YXIgcnA9W107ZnVuY3Rpb24gaXAoZSl7cmV0dXJuIHJwLnB1c2goZSksZnVuY3Rpb24oKXtycC5zcGxpY2UocnAuaW5kZXhPZihlKSwxKX19dmFyIGFwPVRmLG9wPXtzaXplOjE2LHg6MCx5OjAscm90YXRlOjAsZmxpcFg6ITEsZmxpcFk6ITF9O2Z1bmN0aW9uIHNwKGUpe2lmKCEoIWV8fCFadSkpe3ZhciB0PUp1LmNyZWF0ZUVsZW1lbnQoYHN0eWxlYCk7dC5zZXRBdHRyaWJ1dGUoYHR5cGVgLGB0ZXh0L2Nzc2ApLHQuaW5uZXJIVE1MPWU7Zm9yKHZhciBuPUp1LmhlYWQuY2hpbGROb2RlcyxyPW51bGwsaT1uLmxlbmd0aC0xO2k+LTE7aS0tKXt2YXIgYT1uW2ldLG89KGEudGFnTmFtZXx8YGApLnRvVXBwZXJDYXNlKCk7W2BTVFlMRWAsYExJTktgXS5pbmRleE9mKG8pPi0xJiYocj1hKX1yZXR1cm4gSnUuaGVhZC5pbnNlcnRCZWZvcmUodCxyKSxlfX12YXIgY3A9YDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYDtmdW5jdGlvbiBscCgpe2Zvcih2YXIgZT0xMix0PWBgO2UtLT4wOyl0Kz1jcFtNYXRoLnJhbmRvbSgpKjYyfDBdO3JldHVybiB0fWZ1bmN0aW9uIHVwKGUpe2Zvcih2YXIgdD1bXSxuPShlfHxbXSkubGVuZ3RoPj4+MDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBkcChlKXtyZXR1cm4gZS5jbGFzc0xpc3Q/dXAoZS5jbGFzc0xpc3QpOihlLmdldEF0dHJpYnV0ZShgY2xhc3NgKXx8YGApLnNwbGl0KGAgYCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9ZnVuY3Rpb24gZnAoZSl7cmV0dXJuYCR7ZX1gLnJlcGxhY2UoLyYvZyxgJmFtcDtgKS5yZXBsYWNlKC8iL2csYCZxdW90O2ApLnJlcGxhY2UoLycvZyxgJiMzOTtgKS5yZXBsYWNlKC88L2csYCZsdDtgKS5yZXBsYWNlKC8+L2csYCZndDtgKX1mdW5jdGlvbiBwcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259PSIke2ZwKGVbbl0pfSIgYH0sYGApLnRyaW0oKX1mdW5jdGlvbiBtcChlKXtyZXR1cm4gT2JqZWN0LmtleXMoZXx8e30pLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K2Ake259OiAke2Vbbl0udHJpbSgpfTtgfSxgYCl9ZnVuY3Rpb24gaHAoZSl7cmV0dXJuIGUuc2l6ZSE9PW9wLnNpemV8fGUueCE9PW9wLnh8fGUueSE9PW9wLnl8fGUucm90YXRlIT09b3Aucm90YXRlfHxlLmZsaXBYfHxlLmZsaXBZfWZ1bmN0aW9uIGdwKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS5jb250YWluZXJXaWR0aCxyPWUuaWNvbldpZHRoO3JldHVybntvdXRlcjp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtuLzJ9IDI1NilgfSxpbm5lcjp7dHJhbnNmb3JtOmAke2B0cmFuc2xhdGUoJHt0LngqMzJ9LCAke3QueSozMn0pIGB9ICR7YHNjYWxlKCR7dC5zaXplLzE2Kih0LmZsaXBYPy0xOjEpfSwgJHt0LnNpemUvMTYqKHQuZmxpcFk/LTE6MSl9KSBgfSAke2Byb3RhdGUoJHt0LnJvdGF0ZX0gMCAwKWB9YH0scGF0aDp7dHJhbnNmb3JtOmB0cmFuc2xhdGUoJHtyLzIqLTF9IC0yNTYpYH19fWZ1bmN0aW9uIF9wKGUpe3ZhciB0PWUudHJhbnNmb3JtLG49ZS53aWR0aCxyPW49PT12b2lkIDA/VGY6bixpPWUuaGVpZ2h0LGE9aT09PXZvaWQgMD9UZjppLG89ZS5zdGFydENlbnRlcmVkLHM9byE9PXZvaWQgMCYmbyxjPWBgO3JldHVybiBjKz1zJiZRdT9gdHJhbnNsYXRlKCR7dC54L2FwLXIvMn1lbSwgJHt0LnkvYXAtYS8yfWVtKSBgOnM/YHRyYW5zbGF0ZShjYWxjKC01MCUgKyAke3QueC9hcH1lbSksIGNhbGMoLTUwJSArICR7dC55L2FwfWVtKSkgYDpgdHJhbnNsYXRlKCR7dC54L2FwfWVtLCAke3QueS9hcH1lbSkgYCxjKz1gc2NhbGUoJHt0LnNpemUvYXAqKHQuZmxpcFg/LTE6MSl9LCAke3Quc2l6ZS9hcCoodC5mbGlwWT8tMToxKX0pIGAsYys9YHJvdGF0ZSgke3Qucm90YXRlfWRlZykgYCxjfXZhciB2cD1gOnJvb3QsIDpob3N0IHsKICAtLWZhLWZvbnQtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEZyZWUnOwogIC0tZmEtZm9udC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBGcmVlJzsKICAtLWZhLWZvbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7CiAgLS1mYS1mb250LWR1b3RvbmU6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnOwogIC0tZmEtZm9udC1kdW90b25lLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtZHVvdG9uZS10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBEdW90b25lJzsKICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBCcmFuZHMnOwogIC0tZmEtZm9udC1zaGFycC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAnOwogIC0tZmEtZm9udC1zaGFycC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7CiAgLS1mYS1mb250LXNoYXJwLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJzsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUnOwogIC0tZmEtZm9udC1zbGFiLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWInOwogIC0tZmEtZm9udC1zbGFiLXByZXNzLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MnOwogIC0tZmEtZm9udC1zbGFiLWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTbGFiIER1byc7CiAgLS1mYS1mb250LXNsYWItcHJlc3MtZHVvLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWIgUHJlc3MgRHVvJzsKICAtLWZhLWZvbnQtcGl4ZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgUGl4ZWwnOwogIC0tZmEtZm9udC1tb3NhaWMtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE1vc2FpYyc7CiAgLS1mYS1mb250LXZlbGx1bS1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVmVsbHVtJzsKICAtLWZhLWZvbnQtd2hpdGVib2FyZC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgV2hpdGVib2FyZCc7CiAgLS1mYS1mb250LXRodW1icHJpbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQnOwogIC0tZmEtZm9udC1ub3Rkb2ctc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyc7CiAgLS1mYS1mb250LW5vdGRvZy1kdW8tc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyBEdW8nOwogIC0tZmEtZm9udC1ldGNoLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBFdGNoJzsKICAtLWZhLWZvbnQtZ3JhcGhpdGUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUnOwogIC0tZmEtZm9udC1qZWxseS1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSc7CiAgLS1mYS1mb250LWplbGx5LWZpbGwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgSmVsbHkgRmlsbCc7CiAgLS1mYS1mb250LWplbGx5LWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8nOwogIC0tZmEtZm9udC1jaGlzZWwtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgQ2hpc2VsJzsKICAtLWZhLWZvbnQtdXRpbGl0eS1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSc7CiAgLS1mYS1mb250LXV0aWxpdHktZHVvLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byc7CiAgLS1mYS1mb250LXV0aWxpdHktZmlsbC1zZW1pYm9sZDogbm9ybWFsIDYwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBGaWxsJzsKfQoKLnN2Zy1pbmxpbmUtLWZhIHsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBkaXNwbGF5OiB2YXIoLS1mYS1kaXNwbGF5LCBpbmxpbmUtYmxvY2spOwogIGhlaWdodDogMWVtOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgsIDEuMjVlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4cyB7CiAgdmVydGljYWwtYWxpZ246IDAuMWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14cyB7CiAgdmVydGljYWwtYWxpZ246IDBlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtc20gewogIHZlcnRpY2FsLWFsaWduOiAtMC4wNzE0Mjg1NzE0ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMmVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS14bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4bCB7CiAgdmVydGljYWwtYWxpZ246IC0wLjMxMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1sZWZ0LAouc3ZnLWlubGluZS0tZmEgLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXB1bGwtcmlnaHQsCi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxpIHsKICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIGluc2V0LWJsb2NrLXN0YXJ0OiAwLjI1ZW07IC8qIHN5bmNpbmcgdmVydGljYWwgYWxpZ25tZW50IHdpdGggV2ViIEZvbnQgcmVuZGVyaW5nICovCn0KCi5mYS1sYXllcnMtY291bnRlciwgLmZhLWxheWVycy10ZXh0IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZhLWxheWVycyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMWVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCwgMS4yNWVtKTsKfQouZmEtbGF5ZXJzIC5zdmctaW5saW5lLS1mYSB7CiAgaW5zZXQ6IDA7CiAgbWFyZ2luOiBhdXRvOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLXRleHQgewogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwp9CgouZmEtbGF5ZXJzLWNvdW50ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhLWNvdW50ZXItYmFja2dyb3VuZC1jb2xvciwgI2ZmMjUzYSk7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZmEtY291bnRlci1ib3JkZXItcmFkaXVzLCAxZW0pOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS1mYS1jb3VudGVyLWxpbmUtaGVpZ2h0LCAxKTsKICBtYXgtd2lkdGg6IHZhcigtLWZhLWNvdW50ZXItbWF4LXdpZHRoLCA1ZW0pOwogIG1pbi13aWR0aDogdmFyKC0tZmEtY291bnRlci1taW4td2lkdGgsIDEuNWVtKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IHZhcigtLWZhLWNvdW50ZXItcGFkZGluZywgMC4yNWVtIDAuNWVtKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWNvdW50ZXItc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLXJpZ2h0IHsKICBib3R0b206IHZhcigtLWZhLWJvdHRvbSwgMCk7CiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7Cn0KCi5mYS1sYXllcnMtYm90dG9tLWxlZnQgewogIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IGF1dG87CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDsKfQoKLmZhLWxheWVycy10b3AtcmlnaHQgewogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtbGF5ZXJzLXNjYWxlLCAwLjI1KSk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0Owp9CgouZmEtbGF5ZXJzLXRvcC1sZWZ0IHsKICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTsKICByaWdodDogYXV0bzsKICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLmZhLTF4IHsKICBmb250LXNpemU6IDFlbTsKfQoKLmZhLTJ4IHsKICBmb250LXNpemU6IDJlbTsKfQoKLmZhLTN4IHsKICBmb250LXNpemU6IDNlbTsKfQoKLmZhLTR4IHsKICBmb250LXNpemU6IDRlbTsKfQoKLmZhLTV4IHsKICBmb250LXNpemU6IDVlbTsKfQoKLmZhLTZ4IHsKICBmb250LXNpemU6IDZlbTsKfQoKLmZhLTd4IHsKICBmb250LXNpemU6IDdlbTsKfQoKLmZhLTh4IHsKICBmb250LXNpemU6IDhlbTsKfQoKLmZhLTl4IHsKICBmb250LXNpemU6IDllbTsKfQoKLmZhLTEweCB7CiAgZm9udC1zaXplOiAxMGVtOwp9CgouZmEtMnhzIHsKICBmb250LXNpemU6IGNhbGMoMTAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteHMgewogIGZvbnQtc2l6ZTogY2FsYygxMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS1zbSB7CiAgZm9udC1zaXplOiBjYWxjKDE0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDE0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDE0IC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLWxnIHsKICBmb250LXNpemU6IGNhbGMoMjAgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMjBweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAyMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMjAgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEteGwgewogIGZvbnQtc2l6ZTogY2FsYygyNCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyNHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDI0ICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAyNCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS0yeGwgewogIGZvbnQtc2l6ZTogY2FsYygzMiAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAzMnB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDMyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAzMiAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS13aWR0aC1hdXRvIHsKICAtLWZhLXdpZHRoOiBhdXRvOwp9CgouZmEtZncsCi5mYS13aWR0aC1maXhlZCB7CiAgLS1mYS13aWR0aDogMS4yNWVtOwp9CgouZmEtY2FudmFzLXNxdWFyZSB7CiAgcGFkZGluZy1ibG9jazogMC4xMjVlbTsKICBtYXJnaW4tYmxvY2stZW5kOiAtMC4xMjVlbTsKfQoKLmZhLWNhbnZhcy1yb29teSB7CiAgcGFkZGluZy1ibG9jazogMC4yNWVtOwogIHBhZGRpbmctaW5saW5lOiAwLjEyNWVtOwogIG1hcmdpbi1ibG9jay1lbmQ6IC0wLjI1ZW07CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi5mYS11bCB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLWxpLW1hcmdpbiwgMi41ZW0pOwogIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0Owp9CgovKiBIZWFkcyBVcDogQm9yZGVyZWQgSWNvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUhCiAgLSBUaGlzIGZlYXR1cmUgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgRm9udCBBd2Vzb21lICh2OCkhCiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguCiovCi8qIE5vdGVzOgoqIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSkKKiAtLUB7di4kY3NzLXByZWZpeH0tYm9yZGVyLXBhZGRpbmcgPQogICoqIDMvMTYgZm9yIHZlcnRpY2FsIHBhZGRpbmcgKHRvIGdpdmUgfjJweCBvZiB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFyb3VuZCBhbiBpY29uIGNvbnNpZGVyaW5nIGl0J3MgdmVydGljYWwgYWxpZ25tZW50KQogICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbikKKi8KLmZhLWJvcmRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWJvcmRlci1yYWRpdXMsIDAuMWVtKTsKICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpOwogIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7CiAgYm94LXNpemluZzogdmFyKC0tZmEtYm9yZGVyLWJveC1zaXppbmcsIGNvbnRlbnQtYm94KTsKICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4xODc1ZW0gMC4yNWVtKTsKfQoKLmZhLXB1bGwtbGVmdCwKLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1wdWxsLXJpZ2h0LAouZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1iZWF0IHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtYm91bmNlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC4yOCwgMC44NCwgMC40MiwgMSkpOwp9CgouZmEtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKfQoKLmZhLWJlYXQtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZsaXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxLjVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtZmxpcC0zNjAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwLTM2MDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc2hha2UgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zaGFrZTsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuNzVzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtc3BpbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXJldmVyc2UgewogIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsKfQoKLmZhLXB1bHNlLAouZmEtc3Bpbi1wdWxzZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7Cn0KCi5mYS1zcGluLXNuYXAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zcGluLXNuYXA7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtNCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC00OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMi40cyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXNuYXAtOCB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW4tc25hcC04OwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgNHMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpOwp9CgouZmEtYnV6eiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWJ1eno7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjZzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgbGluZWFyKTsKfQoKLmZhLXdhZyB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXdhZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDAuOXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIGNlbnRlcjsKfQoKLmZhLWZsb2F0IHsKICBhbmltYXRpb24tbmFtZTogZmEtZmxvYXQ7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAzcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTsKICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwp9CgouZmEtc3dpbmcgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1zd2luZzsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDEuMnMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLW91dCk7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGNlbnRlcjsKfQoKLmZhLWplbGxvIHsKICBhbmltYXRpb24tbmFtZTogZmEtamVsbG87CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAwLjlzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1vdXQpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogIC5mYS1iZWF0LAogIC5mYS1ib3VuY2UsCiAgLmZhLWZhZGUsCiAgLmZhLWJlYXQtZmFkZSwKICAuZmEtZmxpcCwKICAuZmEtZmxpcC0zNjAsCiAgLmZhLXB1bHNlLAogIC5mYS1zaGFrZSwKICAuZmEtc3BpbiwKICAuZmEtc3Bpbi1wdWxzZSwKICAuZmEtYnV6eiwKICAuZmEtZmxvYXQsCiAgLmZhLWplbGxvLAogIC5mYS1zcGluLXNuYXAsCiAgLmZhLXNwaW4tc25hcC00LAogIC5mYS1zcGluLXNuYXAtOCwKICAuZmEtc3dpbmcsCiAgLmZhLXdhZyB7CiAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9Cn0KQGtleWZyYW1lcyBmYS1iZWF0IHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA0NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjIgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjIyKSkpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMjUgKiB2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSkpOwogIH0KICA5MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1ib3VuY2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcpOwogIH0KICAxNCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteCwgMS4wNiksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjk0KSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtYW50aWNpcGF0aW9uLCAzcHgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45NCksIHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXksIDEuMTIpKSB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAwLjVlbSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLjY2LCAwLjY2LCAxKTsKICB9CiAgNTIlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0tZmEtYm91bmNlLWhlaWdodCwgMC41ZW0pICogMS4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAxLCAwLjUpOwogIH0KICA3MCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA2KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45MikpIHRyYW5zbGF0ZVkoMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC4zMywgMC42NiwgMSk7CiAgfQogIDg1JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgsIDEuMDQpIHRyYW5zbGF0ZVkoY2FsYygtMnB4ICogdmFyKC0tZmEtYm91bmNlLXJlYm91bmQsIDEpKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZhZGUgewogIDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgNDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWZhZGUtb3BhY2l0eSwgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7CiAgMCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC40LCAxKTsKICB9CiAgMjUlIHsKICAgIG9wYWNpdHk6IGNhbGModmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCkgKyAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7CiAgfQogIDQ1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMjUpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICBvcGFjaXR5OiBjYWxjKHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpICsgMC40KTsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjI4KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICAxMDAlIHsKICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbGlwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIDAuNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICA5MiUgewogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyZW0pIHNjYWxlKDEpIHJvdGF0ZTNkKHZhcigtLWZhLWZsaXAteCwgMCksIHZhcigtLWZhLWZsaXAteSwgMSksIHZhcigtLWZhLWZsaXAteiwgMCksIGNhbGModmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykgKiB2YXIoLS1mYS1mbGlwLW92ZXJzaG9vdCwgMS4wNCkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTM2MGRlZykpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZsaXAtMzYwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjQsIDEpOwogIH0KICA4JSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUodmFyKC0tZmEtZmxpcC1hbnRpY2lwYXRpb24tc2NhbGUsIDAuOTUpKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCAwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCBjYWxjKHZhcigtLWZhLWZsaXAtYW5nbGUsIC0zNjBkZWcpICogMC42KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDgwJSB7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDJlbSkgc2NhbGUoMSkgcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgY2FsYyh2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSAqIHZhcigtLWZhLWZsaXAtb3ZlcnNob290LCAxLjA0KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMmVtKSBzY2FsZSgxKSByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMzYwZGVnKSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc2hha2UgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDIwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpIHRyYW5zbGF0ZVgoLTFweCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpIHRyYW5zbGF0ZVgoMXB4KTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA3OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoLTNkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgOTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLXNwaW4tc25hcCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxNi42NyUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDI4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDMzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDYyJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDY2LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDc4LjY3JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDgzLjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDk1LjMzJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtNCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAyNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDY1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zcGluLXNuYXAtOCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDEyLjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAyMS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICAzNCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAzNy41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDQ2LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgNTklIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC44LCAwLCAxLCAxKTsKICB9CiAgNjIuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpOwogIH0KICA3MS41JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDc1JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7CiAgfQogIDg0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzMTVkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuOCwgMCwgMSwgMSk7CiAgfQogIDg3LjUlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDMxNWRlZyk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTsKICB9CiAgOTYuNSUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjgsIDAsIDEsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYnV6eiB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjEsIDAsIDAuOSwgMSk7CiAgfQogIDUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC41ZGVnKTsKICB9CiAgMTAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC41ZGVnKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1mYS1idXp6LWRpc3RhbmNlLCA0cHgpKSByb3RhdGUoMC4zZGVnKTsKICB9CiAgMjAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSkpIHJvdGF0ZSgtMC4zZGVnKTsKICB9CiAgMjUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjcpKSByb3RhdGUoMC4yZGVnKTsKICB9CiAgMzAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtYnV6ei1kaXN0YW5jZSwgNHB4KSAqIDAuNykpIHJvdGF0ZSgtMC4yZGVnKTsKICB9CiAgMzUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLWZhLWJ1enotZGlzdGFuY2UsIDRweCkgKiAwLjQpKSByb3RhdGUoMC4xZGVnKTsKICB9CiAgNDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS13YWcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgMTIlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyZGVnKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIsIDAsIDAuNiwgMSk7CiAgfQogIDM2JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZShjYWxjKHZhcigtLWZhLXdhZy1hbmdsZSwgMTJkZWcpICogMC44NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDFkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGModmFyKC0tZmEtd2FnLWFuZ2xlLCAxMmRlZykgKiAwLjYpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQogIDY4JSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mbG9hdCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHRyYW5zbGF0ZVgoMCkgcm90YXRlKDBkZWcpIHNjYWxlKHZhcigtLWZhLWZsb2F0LXNxdWFzaC14LCAxLjAyKSwgdmFyKC0tZmEtZmxvYXQtc3F1YXNoLXksIDAuOTgpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMzLCAwLCAwLjY2LCAwLjMzKTsKICB9CiAgMTUlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0wLjQgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKHZhcigtLWZhLWZsb2F0LWRyaWZ0LCAxcHgpKSByb3RhdGUodmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpIHNjYWxlKDEsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAuNjYsIDAuNjYsIDEpOwogIH0KICAzNSUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1mYS1mbG9hdC1oZWlnaHQsIDZweCkpKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXgsIDAuOTgpLCB2YXIoLS1mYS1mbG9hdC1zdHJldGNoLXksIDEuMDMpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMCk7CiAgfQogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC45MiAqIHZhcigtLWZhLWZsb2F0LWhlaWdodCwgNnB4KSkpIHRyYW5zbGF0ZVgoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMC41ICogdmFyKC0tZmEtZmxvYXQtdGlsdCwgMWRlZykpKSBzY2FsZSgwLjk5NSwgMS4wMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMCwgMC42NiwgMC4zMyk7CiAgfQogIDcwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMC4zICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWChjYWxjKC0xICogdmFyKC0tZmEtZmxvYXQtZHJpZnQsIDFweCkpKSByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLWZsb2F0LXRpbHQsIDFkZWcpKSkgc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMywgMC42NiwgMC42NiwgMSk7CiAgfQogIDkwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygwLjA1ICogdmFyKC0tZmEtZmxvYXQtaGVpZ2h0LCA2cHgpKSkgdHJhbnNsYXRlWCgwKSByb3RhdGUoMGRlZykgc2NhbGUodmFyKC0tZmEtZmxvYXQtc3F1YXNoLXgsIDEuMDIpLCB2YXIoLS1mYS1mbG9hdC1zcXVhc2gteSwgMC45OCkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzMsIDAsIDAuNjYsIDEpOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgwZGVnKSBzY2FsZSh2YXIoLS1mYS1mbG9hdC1zcXVhc2gteCwgMS4wMiksIHZhcigtLWZhLWZsb2F0LXNxdWFzaC15LCAwLjk4KSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc3dpbmcgewogIDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMiwgMCwgMC44LCAxKTsKICB9CiAgOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tZmEtc3dpbmctYW5nbGUsIDIyZGVnKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAxOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjg1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjcsIDEpOwogIH0KICAyOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC42NSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuNjUsIDEpOwogIH0KICAzOCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYygtMSAqIHZhcigtLWZhLXN3aW5nLWFuZ2xlLCAyMmRlZykgKiAwLjQ1KSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA0OCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4yNSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTYlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKGNhbGMoLTEgKiB2YXIoLS1mYS1zd2luZy1hbmdsZSwgMjJkZWcpICogMC4xKSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpOwogIH0KICA2NCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtamVsbG8gewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yLCAwLCAwLjgsIDEpOwogIH0KICAxMiUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSwgY2FsYygyIC0gdmFyKC0tZmEtamVsbG8tc2NhbGUteCwgMS4xNSkpKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMsIDAsIDAuNywgMSk7CiAgfQogIDI0JSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKGNhbGMoMiAtIHZhcigtLWZhLWplbGxvLXNjYWxlLXksIDEuMTIpKSwgdmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMywgMCwgMC43LCAxKTsKICB9CiAgMzYlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygxICsgKHZhcigtLWZhLWplbGxvLXNjYWxlLXgsIDEuMTUpIC0gMSkgKiAwLjUpLCBjYWxjKDIgLSAoMSArICh2YXIoLS1mYS1qZWxsby1zY2FsZS14LCAxLjE1KSAtIDEpICogMC41KSkpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNDglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoY2FsYygyIC0gKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpLCBjYWxjKDEgKyAodmFyKC0tZmEtamVsbG8tc2NhbGUteSwgMS4xMikgLSAxKSAqIDAuMykpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKTsKICB9CiAgNTglIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMiwgMC45OCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogIH0KICA2OCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpOwogIH0KfQouZmEtcm90YXRlLTkwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KCi5mYS1yb3RhdGUtMTgwIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwp9CgouZmEtcm90YXRlLTI3MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKfQoKLmZhLWZsaXAtaG9yaXpvbnRhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7Cn0KCi5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTsKfQoKLmZhLWZsaXAtYm90aCwKLmZhLWZsaXAtaG9yaXpvbnRhbC5mYS1mbGlwLXZlcnRpY2FsIHsKICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAtMSk7Cn0KCi5mYS1yb3RhdGUtYnkgewogIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgMCkpOwp9Cgouc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkgewogIGZpbGw6IHZhcigtLWZhLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTsKICBvcGFjaXR5OiB2YXIoLS1mYS1zZWNvbmRhcnktb3BhY2l0eSwgMC40KTsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLXN3YXAtb3BhY2l0eSAuZmEtcHJpbWFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXNlY29uZGFyeSB7CiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksCi5zdmctaW5saW5lLS1mYSBtYXNrIC5mYS1zZWNvbmRhcnkgewogIGZpbGw6IGJsYWNrOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtaW52ZXJzZSB7CiAgZmlsbDogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7Cn0KCi5mYS1zdGFjayB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMmVtOwogIGxpbmUtaGVpZ2h0OiAyZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDIuNWVtOwp9CgouZmEtaW52ZXJzZSB7CiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXggewogIC0tZmEtd2lkdGg6IDEuMjVlbTsKICBoZWlnaHQ6IDFlbTsKICB3aWR0aDogdmFyKC0tZmEtd2lkdGgpOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1zdGFjay0yeCB7CiAgLS1mYS13aWR0aDogMi41ZW07CiAgaGVpZ2h0OiAyZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTsKfQoKLmZhLXN0YWNrLTF4LAouZmEtc3RhY2stMnggewogIGluc2V0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogdmFyKC0tZmEtc3RhY2stei1pbmRleCwgYXV0byk7Cn1gO2Z1bmN0aW9uIHlwKCl7dmFyIGU9RWYsdD1EZixuPUouY3NzUHJlZml4LHI9Si5yZXBsYWNlbWVudENsYXNzLGk9dnA7aWYobiE9PWV8fHIhPT10KXt2YXIgYT1SZWdFeHAoYFxcLiR7ZX1cXC1gLGBnYCksbz1SZWdFeHAoYFxcLS0ke2V9XFwtYCxgZ2ApLHM9UmVnRXhwKGBcXC4ke3R9YCxgZ2ApO2k9aS5yZXBsYWNlKGEsYC4ke259LWApLnJlcGxhY2UobyxgLS0ke259LWApLnJlcGxhY2UocyxgLiR7cn1gKX1yZXR1cm4gaX12YXIgYnA9ITE7ZnVuY3Rpb24geHAoKXtKLmF1dG9BZGRDc3MmJiFicCYmKHNwKHlwKCkpLGJwPSEwKX12YXIgU3A9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e2Nzczp5cCxpbnNlcnRDc3M6eHB9fX0saG9va3M6ZnVuY3Rpb24oKXtyZXR1cm57YmVmb3JlRE9NRWxlbWVudENyZWF0aW9uOmZ1bmN0aW9uKCl7eHAoKX0sYmVmb3JlSTJzdmc6ZnVuY3Rpb24oKXt4cCgpfX19fSxDcD1xdXx8e307Q3Bbd2ZdfHwoQ3Bbd2ZdPXt9KSxDcFt3Zl0uc3R5bGVzfHwoQ3Bbd2ZdLnN0eWxlcz17fSksQ3Bbd2ZdLmhvb2tzfHwoQ3Bbd2ZdLmhvb2tzPXt9KSxDcFt3Zl0uc2hpbXN8fChDcFt3Zl0uc2hpbXM9W10pO3ZhciB3cD1DcFt3Zl0sVHA9W10sRXA9ZnVuY3Rpb24oKXtKdS5yZW1vdmVFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCxFcCksRHA9MSxUcC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pfSxEcD0hMTtadSYmKERwPShKdS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/L15sb2FkZWR8XmMvOi9ebG9hZGVkfF5pfF5jLykudGVzdChKdS5yZWFkeVN0YXRlKSxEcHx8SnUuYWRkRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsRXApKTtmdW5jdGlvbiBPcChlKXtadSYmKERwP3NldFRpbWVvdXQoZSwwKTpUcC5wdXNoKGUpKX1mdW5jdGlvbiBrcChlKXt2YXIgdD1lLnRhZyxuPWUuYXR0cmlidXRlcyxyPW49PT12b2lkIDA/e306bixpPWUuY2hpbGRyZW4sYT1pPT09dm9pZCAwP1tdOmk7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9mcChlKTpgPCR7dH0gJHtwcChyKX0+JHthLm1hcChrcCkuam9pbihgYCl9PC8ke3R9PmB9ZnVuY3Rpb24gQXAoZSx0LG4pe2lmKGUmJmVbdF0mJmVbdF1bbl0pcmV0dXJue3ByZWZpeDp0LGljb25OYW1lOm4saWNvbjplW3RdW25dfX12YXIganA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyLGksYSl7cmV0dXJuIGUuY2FsbCh0LG4scixpLGEpfX0sTXA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmtleXMoZSksYT1pLmxlbmd0aCxvPXI9PT12b2lkIDA/dDpqcCh0LHIpLHMsYyxsO2ZvcihuPT09dm9pZCAwPyhzPTEsbD1lW2lbMF1dKToocz0wLGw9bik7czxhO3MrKyljPWlbc10sbD1vKGwsZVtjXSxjLGUpO3JldHVybiBsfTtmdW5jdGlvbiBOcChlKXtyZXR1cm4gRnUoZSkubGVuZ3RoPT09MT9lLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KTpudWxsfWZ1bmN0aW9uIFBwKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXt2YXIgcj1lW25dO3JldHVybiByLmljb24/dFtyLmljb25OYW1lXT1yLmljb246dFtuXT1yLHR9LHt9KX1mdW5jdGlvbiBGcChlLHQpe3ZhciBuPShhcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30pLnNraXBIb29rcyxyPW4hPT12b2lkIDAmJm4saT1QcCh0KTt0eXBlb2Ygd3AuaG9va3MuYWRkUGFjaz09YGZ1bmN0aW9uYCYmIXI/d3AuaG9va3MuYWRkUGFjayhlLFBwKHQpKTp3cC5zdHlsZXNbZV09cShxKHt9LHdwLnN0eWxlc1tlXXx8e30pLGkpLGU9PT1gZmFzYCYmRnAoYGZhYCx0KX12YXIgSXA9d3Auc3R5bGVzLExwPXdwLnNoaW1zLFJwPU9iamVjdC5rZXlzKFdmKSx6cD1ScC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT1PYmplY3Qua2V5cyhXZlt0XSksZX0se30pLEJwPW51bGwsVnA9e30sSHA9e30sVXA9e30sV3A9e30sR3A9e307ZnVuY3Rpb24gS3AoZSl7cmV0dXJuflpmLmluZGV4T2YoZSl9ZnVuY3Rpb24gcXAoZSx0KXt2YXIgbj10LnNwbGl0KGAtYCkscj1uWzBdLGk9bi5zbGljZSgxKS5qb2luKGAtYCk7cmV0dXJuIHI9PT1lJiZpIT09YGAmJiFLcChpKT9pOm51bGx9dmFyIEpwPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE1wKElwLGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtyXT1NcChuLGUse30pLHR9LHt9KX07VnA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRbM10mJihlW3RbM11dPW4pLHRbMl0mJnRbMl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmB9KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdC50b1N0cmluZygxNildPW59KSxlfSksSHA9ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbbl09bix0WzJdJiZ0WzJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSksR3A9ZShmdW5jdGlvbihlLHQsbil7dmFyIHI9dFsyXTtyZXR1cm4gZVtuXT1uLHIuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW59KSxlfSk7dmFyIHQ9YGZhcmBpbiBJcHx8Si5hdXRvRmV0Y2hTdmcsbj1NcChMcCxmdW5jdGlvbihlLG4pe3ZhciByPW5bMF0saT1uWzFdLGE9blsyXTtyZXR1cm4gaT09PWBmYXJgJiYhdCYmKGk9YGZhc2ApLHR5cGVvZiByPT1gc3RyaW5nYCYmKGUubmFtZXNbcl09e3ByZWZpeDppLGljb25OYW1lOmF9KSx0eXBlb2Ygcj09YG51bWJlcmAmJihlLnVuaWNvZGVzW3IudG9TdHJpbmcoMTYpXT17cHJlZml4OmksaWNvbk5hbWU6YX0pLGV9LHtuYW1lczp7fSx1bmljb2Rlczp7fX0pO1VwPW4ubmFtZXMsV3A9bi51bmljb2RlcyxCcD1ybShKLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfTtpcChmdW5jdGlvbihlKXtCcD1ybShlLnN0eWxlRGVmYXVsdCx7ZmFtaWx5OkouZmFtaWx5RGVmYXVsdH0pfSksSnAoKTtmdW5jdGlvbiBZcChlLHQpe3JldHVybihWcFtlXXx8e30pW3RdfWZ1bmN0aW9uIFhwKGUsdCl7cmV0dXJuKEhwW2VdfHx7fSlbdF19ZnVuY3Rpb24gWnAoZSx0KXtyZXR1cm4oR3BbZV18fHt9KVt0XX1mdW5jdGlvbiBRcChlKXtyZXR1cm4gVXBbZV18fHtwcmVmaXg6bnVsbCxpY29uTmFtZTpudWxsfX1mdW5jdGlvbiAkcChlKXt2YXIgdD1XcFtlXSxuPVlwKGBmYXNgLGUpO3JldHVybiB0fHwobj97cHJlZml4OmBmYXNgLGljb25OYW1lOm59Om51bGwpfHx7cHJlZml4Om51bGwsaWNvbk5hbWU6bnVsbH19ZnVuY3Rpb24gZW0oKXtyZXR1cm4gQnB9dmFyIHRtPWZ1bmN0aW9uKCl7cmV0dXJue3ByZWZpeDpudWxsLGljb25OYW1lOm51bGwscmVzdDpbXX19O2Z1bmN0aW9uIG5tKGUpe3ZhciB0PWFkLG49UnAucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09YCR7Si5jc3NQcmVmaXh9LSR7dH1gLGV9LHt9KTtyZXR1cm4gJGQuZm9yRWFjaChmdW5jdGlvbihyKXsoZS5pbmNsdWRlcyhuW3JdKXx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB6cFtyXS5pbmNsdWRlcyhlKX0pKSYmKHQ9cil9KSx0fWZ1bmN0aW9uIHJtKGUpe3ZhciB0PShhcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30pLmZhbWlseSxuPXQ9PT12b2lkIDA/YWQ6dCxyPUJmW25dW2VdO2lmKG49PT1vZCYmIWUpcmV0dXJuYGZhZGA7dmFyIGk9SGZbbl1bZV18fEhmW25dW3JdLGE9ZSBpbiB3cC5zdHlsZXM/ZTpudWxsO3JldHVybiBpfHxhfHxudWxsfWZ1bmN0aW9uIGltKGUpe3ZhciB0PVtdLG49bnVsbDtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPXFwKEouY3NzUHJlZml4LGUpO3I/bj1yOmUmJnQucHVzaChlKX0pLHtpY29uTmFtZTpuLHJlc3Q6dH19ZnVuY3Rpb24gYW0oZSl7cmV0dXJuIGUuc29ydCgpLmZpbHRlcihmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4uaW5kZXhPZihlKT09PXR9KX12YXIgb209dmYuY29uY2F0KGFmKTtmdW5jdGlvbiBzbShlKXt2YXIgdD0oYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9KS5za2lwTG9va3VwcyxuPXQhPT12b2lkIDAmJnQscj1udWxsLGk9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG9tLmluY2x1ZGVzKGUpfSkpLGE9YW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW9tLmluY2x1ZGVzKGUpfSkpLG89UHUoaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSwhaWQuaW5jbHVkZXMoZSl9KSwxKVswXSxzPW89PT12b2lkIDA/bnVsbDpvLGM9bm0oaSksbD1xKHEoe30saW0oYSkpLHt9LHtwcmVmaXg6cm0ocyx7ZmFtaWx5OmN9KX0pO3JldHVybiBxKHEocSh7fSxsKSxkbSh7dmFsdWVzOmUsZmFtaWx5OmMsc3R5bGVzOklwLGNvbmZpZzpKLGNhbm9uaWNhbDpsLGdpdmVuUHJlZml4OnJ9KSksY20obixyLGwpKX1mdW5jdGlvbiBjbShlLHQsbil7dmFyIHI9bi5wcmVmaXgsaT1uLmljb25OYW1lO2lmKGV8fCFyfHwhaSlyZXR1cm57cHJlZml4OnIsaWNvbk5hbWU6aX07dmFyIGE9dD09PWBmYWA/UXAoaSk6e30sbz1acChyLGkpO3JldHVybiBpPWEuaWNvbk5hbWV8fG98fGkscj1hLnByZWZpeHx8cixyPT09YGZhcmAmJiFJcC5mYXImJklwLmZhcyYmIUouYXV0b0ZldGNoU3ZnJiYocj1gZmFzYCkse3ByZWZpeDpyLGljb25OYW1lOml9fXZhciBsbT0kZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1hZHx8ZSE9PW9kfSksdW09T2JqZWN0LmtleXMoX2YpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWFkfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhfZltlXSl9KS5mbGF0KCk7ZnVuY3Rpb24gZG0oZSl7dmFyIHQ9ZS52YWx1ZXMsbj1lLmZhbWlseSxyPWUuY2Fub25pY2FsLGk9ZS5naXZlblByZWZpeCxhPWk9PT12b2lkIDA/YGA6aSxvPWUuc3R5bGVzLHM9bz09PXZvaWQgMD97fTpvLGM9ZS5jb25maWcsbD1jPT09dm9pZCAwP3t9OmMsdT1uPT09b2QsZD10LmluY2x1ZGVzKGBmYS1kdW90b25lYCl8fHQuaW5jbHVkZXMoYGZhZGApLGY9bC5mYW1pbHlEZWZhdWx0PT09YGR1b3RvbmVgLHA9ci5wcmVmaXg9PT1gZmFkYHx8ci5wcmVmaXg9PT1gZmEtZHVvdG9uZWA7cmV0dXJuIXUmJihkfHxmfHxwKSYmKHIucHJlZml4PWBmYWRgKSwodC5pbmNsdWRlcyhgZmEtYnJhbmRzYCl8fHQuaW5jbHVkZXMoYGZhYmApKSYmKHIucHJlZml4PWBmYWJgKSwhci5wcmVmaXgmJmxtLmluY2x1ZGVzKG4pJiYoT2JqZWN0LmtleXMocykuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gdW0uaW5jbHVkZXMoZSl9KXx8bC5hdXRvRmV0Y2hTdmcpJiYoci5wcmVmaXg9bmYuZ2V0KG4pLmRlZmF1bHRTaG9ydFByZWZpeElkLHIuaWNvbk5hbWU9WnAoci5wcmVmaXgsci5pY29uTmFtZSl8fHIuaWNvbk5hbWUpLChyLnByZWZpeD09PWBmYWB8fGE9PT1gZmFgKSYmKHIucHJlZml4PWVtKCl8fGBmYXNgKSxyfXZhciBmbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtUdSh0aGlzLGUpLHRoaXMuZGVmaW5pdGlvbnM9e319cmV0dXJuIER1KGUsW3trZXk6YGFkZGAsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Wy4uLmFyZ3VtZW50c10ucmVkdWNlKHRoaXMuX3B1bGxEZWZpbml0aW9ucyx7fSk7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtlLmRlZmluaXRpb25zW25dPXEocSh7fSxlLmRlZmluaXRpb25zW25dfHx7fSksdFtuXSksRnAobix0W25dKTt2YXIgcj1XZlthZF1bbl07ciYmRnAocix0W25dKSxKcCgpfSl9fSx7a2V5OmByZXNldGAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRlZmluaXRpb25zPXt9fX0se2tleTpgX3B1bGxEZWZpbml0aW9uc2AsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnByZWZpeCYmdC5pY29uTmFtZSYmdC5pY29uP3swOnR9OnQ7cmV0dXJuIE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXt2YXIgcj1uW3RdLGk9ci5wcmVmaXgsYT1yLmljb25OYW1lLG89ci5pY29uLHM9b1syXTtlW2ldfHwoZVtpXT17fSkscy5sZW5ndGg+MCYmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT1gc3RyaW5nYCYmKGVbaV1bdF09byl9KSxlW2ldW2FdPW99KSxlfX1dKX0oKSxwbT1bXSxtbT17fSxobT17fSxnbT1PYmplY3Qua2V5cyhobSk7ZnVuY3Rpb24gX20oZSx0KXt2YXIgbj10Lm1peG91dHNUbztyZXR1cm4gcG09ZSxtbT17fSxPYmplY3Qua2V5cyhobSkuZm9yRWFjaChmdW5jdGlvbihlKXtnbS5pbmRleE9mKGUpPT09LTEmJmRlbGV0ZSBobVtlXX0pLHBtLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5taXhvdXQ/ZS5taXhvdXQoKTp7fTtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3R5cGVvZiB0W2VdPT1gZnVuY3Rpb25gJiYobltlXT10W2VdKSxSdSh0W2VdKT09PWBvYmplY3RgJiZPYmplY3Qua2V5cyh0W2VdKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bZV18fChuW2VdPXt9KSxuW2VdW3JdPXRbZV1bcl19KX0pLGUuaG9va3Mpe3ZhciByPWUuaG9va3MoKTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe21tW2VdfHwobW1bZV09W10pLG1tW2VdLnB1c2gocltlXSl9KX1lLnByb3ZpZGVzJiZlLnByb3ZpZGVzKGhtKX0pLG59ZnVuY3Rpb24gdm0oZSx0KXt2YXIgbj1bLi4uYXJndW1lbnRzXS5zbGljZSgyKTtyZXR1cm4obW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZS5hcHBseShudWxsLFt0XS5jb25jYXQobikpfSksdH1mdW5jdGlvbiB5bShlKXt2YXIgdD1bLi4uYXJndW1lbnRzXS5zbGljZSgxKTsobW1bZV18fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkobnVsbCx0KX0pfWZ1bmN0aW9uIGJtKCl7dmFyIGU9YXJndW1lbnRzWzBdLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBobVtlXT9obVtlXS5hcHBseShudWxsLHQpOnZvaWQgMH1mdW5jdGlvbiB4bShlKXtlLnByZWZpeD09PWBmYWAmJihlLnByZWZpeD1gZmFzYCk7dmFyIHQ9ZS5pY29uTmFtZSxuPWUucHJlZml4fHxlbSgpO2lmKHQpcmV0dXJuIHQ9WnAobix0KXx8dCxBcChTbS5kZWZpbml0aW9ucyxuLHQpfHxBcCh3cC5zdHlsZXMsbix0KX12YXIgU209bmV3IGZtLENtPXtub0F1dG86ZnVuY3Rpb24oKXtKLmF1dG9SZXBsYWNlU3ZnPSExLEoub2JzZXJ2ZU11dGF0aW9ucz0hMSx5bShgbm9BdXRvYCl9LGNvbmZpZzpKLGRvbTp7aTJzdmc6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307cmV0dXJuIFp1Pyh5bShgYmVmb3JlSTJzdmdgLGUpLGJtKGBwc2V1ZG9FbGVtZW50czJzdmdgLGUpLGJtKGBpMnN2Z2AsZSkpOlByb21pc2UucmVqZWN0KEVycm9yKGBPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLmApKX0sd2F0Y2g6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sdD1lLmF1dG9SZXBsYWNlU3ZnUm9vdDtKLmF1dG9SZXBsYWNlU3ZnPT09ITEmJihKLmF1dG9SZXBsYWNlU3ZnPSEwKSxKLm9ic2VydmVNdXRhdGlvbnM9ITAsT3AoZnVuY3Rpb24oKXt3bSh7YXV0b1JlcGxhY2VTdmdSb290OnR9KSx5bShgd2F0Y2hgLGUpfSl9fSxwYXJzZTp7aWNvbjpmdW5jdGlvbihlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtpZihSdShlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSlyZXR1cm57cHJlZml4OmUucHJlZml4LGljb25OYW1lOlpwKGUucHJlZml4LGUuaWNvbk5hbWUpfHxlLmljb25OYW1lfTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD09PTIpe3ZhciB0PWVbMV0uaW5kZXhPZihgZmEtYCk9PT0wP2VbMV0uc2xpY2UoMyk6ZVsxXSxuPXJtKGVbMF0pO3JldHVybntwcmVmaXg6bixpY29uTmFtZTpacChuLHQpfHx0fX1pZih0eXBlb2YgZT09YHN0cmluZ2AmJihlLmluZGV4T2YoYCR7Si5jc3NQcmVmaXh9LWApPi0xfHxlLm1hdGNoKEtmKSkpe3ZhciByPXNtKGUuc3BsaXQoYCBgKSx7c2tpcExvb2t1cHM6ITB9KTtyZXR1cm57cHJlZml4OnIucHJlZml4fHxlbSgpLGljb25OYW1lOlpwKHIucHJlZml4LHIuaWNvbk5hbWUpfHxyLmljb25OYW1lfX1pZih0eXBlb2YgZT09YHN0cmluZ2Ape3ZhciBpPWVtKCk7cmV0dXJue3ByZWZpeDppLGljb25OYW1lOlpwKGksZSl8fGV9fX19LGxpYnJhcnk6U20sZmluZEljb25EZWZpbml0aW9uOnhtLHRvSHRtbDprcH0sd209ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9KS5hdXRvUmVwbGFjZVN2Z1Jvb3QsdD1lPT09dm9pZCAwP0p1OmU7KE9iamVjdC5rZXlzKHdwLnN0eWxlcykubGVuZ3RoPjB8fEouYXV0b0ZldGNoU3ZnKSYmWnUmJkouYXV0b1JlcGxhY2VTdmcmJkNtLmRvbS5pMnN2Zyh7bm9kZTp0fSl9O2Z1bmN0aW9uIFRtKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhYnN0cmFjdCIse2dldDp0fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImh0bWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hYnN0cmFjdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGtwKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZihadSl7dmFyIHQ9SnUuY3JlYXRlRWxlbWVudChgZGl2YCk7cmV0dXJuIHQuaW5uZXJIVE1MPWUuaHRtbCx0LmNoaWxkcmVufX19KSxlfWZ1bmN0aW9uIEVtKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLm1haW4scj1lLm1hc2ssaT1lLmF0dHJpYnV0ZXMsYT1lLnN0eWxlcyxvPWUudHJhbnNmb3JtO2lmKGhwKG8pJiZuLmZvdW5kJiYhci5mb3VuZCl7dmFyIHM9e3g6bi53aWR0aC9uLmhlaWdodC8yLHk6LjV9O2kuc3R5bGU9bXAocShxKHt9LGEpLHt9LHsidHJhbnNmb3JtLW9yaWdpbiI6YCR7cy54K28ueC8xNn1lbSAke3MueStvLnkvMTZ9ZW1gfSkpfXJldHVyblt7dGFnOmBzdmdgLGF0dHJpYnV0ZXM6aSxjaGlsZHJlbjp0fV19ZnVuY3Rpb24gRG0oZSl7dmFyIHQ9ZS5wcmVmaXgsbj1lLmljb25OYW1lLHI9ZS5jaGlsZHJlbixpPWUuYXR0cmlidXRlcyxhPWUuc3ltYm9sLG89YT09PSEwP2Ake3R9LSR7Si5jc3NQcmVmaXh9LSR7bn1gOmE7cmV0dXJuW3t0YWc6YHN2Z2AsYXR0cmlidXRlczp7c3R5bGU6YGRpc3BsYXk6IG5vbmU7YH0sY2hpbGRyZW46W3t0YWc6YHN5bWJvbGAsYXR0cmlidXRlczpxKHEoe30saSkse30se2lkOm99KSxjaGlsZHJlbjpyfV19XX1mdW5jdGlvbiBPbShlKXtyZXR1cm5bYGFyaWEtbGFiZWxgLGBhcmlhLWxhYmVsbGVkYnlgLGB0aXRsZWAsYHJvbGVgXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluIGV9KX1mdW5jdGlvbiBrbShlKXt2YXIgdD1lLmljb25zLG49dC5tYWluLHI9dC5tYXNrLGk9ZS5wcmVmaXgsYT1lLmljb25OYW1lLG89ZS50cmFuc2Zvcm0scz1lLnN5bWJvbCxjPWUubWFza0lkLGw9ZS5leHRyYSx1PWUud2F0Y2hhYmxlLGQ9dSE9PXZvaWQgMCYmdSxmPXIuZm91bmQ/cjpuLHA9Zi53aWR0aCxtPWYuaGVpZ2h0LGg9W0oucmVwbGFjZW1lbnRDbGFzcyxhP2Ake0ouY3NzUHJlZml4fS0ke2F9YDpgYF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBsLmNsYXNzZXMuaW5kZXhPZihlKT09PS0xfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09YGB8fCEhZX0pLmNvbmNhdChsLmNsYXNzZXMpLmpvaW4oYCBgKSxnPXtjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOnEocSh7fSxsLmF0dHJpYnV0ZXMpLHt9LHsiZGF0YS1wcmVmaXgiOmksImRhdGEtaWNvbiI6YSxjbGFzczpoLHJvbGU6bC5hdHRyaWJ1dGVzLnJvbGV8fGBpbWdgLHZpZXdCb3g6YDAgMCAke3B9ICR7bX1gfSl9OyFPbShsLmF0dHJpYnV0ZXMpJiYhbC5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdJiYoZy5hdHRyaWJ1dGVzW2BhcmlhLWhpZGRlbmBdPWB0cnVlYCksZCYmKGcuYXR0cmlidXRlc1tPZl09YGApO3ZhciBfPXEocSh7fSxnKSx7fSx7cHJlZml4OmksaWNvbk5hbWU6YSxtYWluOm4sbWFzazpyLG1hc2tJZDpjLHRyYW5zZm9ybTpvLHN5bWJvbDpzLHN0eWxlczpxKHt9LGwuc3R5bGVzKX0pLHY9ci5mb3VuZCYmbi5mb3VuZD9ibShgZ2VuZXJhdGVBYnN0cmFjdE1hc2tgLF8pfHx7Y2hpbGRyZW46W10sYXR0cmlidXRlczp7fX06Ym0oYGdlbmVyYXRlQWJzdHJhY3RJY29uYCxfKXx8e2NoaWxkcmVuOltdLGF0dHJpYnV0ZXM6e319LHk9di5jaGlsZHJlbixiPXYuYXR0cmlidXRlcztyZXR1cm4gXy5jaGlsZHJlbj15LF8uYXR0cmlidXRlcz1iLHM/RG0oXyk6RW0oXyl9ZnVuY3Rpb24gQW0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS53aWR0aCxyPWUuaGVpZ2h0LGk9ZS50cmFuc2Zvcm0sYT1lLmV4dHJhLG89ZS53YXRjaGFibGUscz1vIT09dm9pZCAwJiZvLGM9cShxKHt9LGEuYXR0cmlidXRlcykse30se2NsYXNzOmEuY2xhc3Nlcy5qb2luKGAgYCl9KTtzJiYoY1tPZl09YGApO3ZhciBsPXEoe30sYS5zdHlsZXMpO2hwKGkpJiYobC50cmFuc2Zvcm09X3Aoe3RyYW5zZm9ybTppLHN0YXJ0Q2VudGVyZWQ6ITAsd2lkdGg6bixoZWlnaHQ6cn0pLGxbYC13ZWJraXQtdHJhbnNmb3JtYF09bC50cmFuc2Zvcm0pO3ZhciB1PW1wKGwpO3UubGVuZ3RoPjAmJihjLnN0eWxlPXUpO3ZhciBkPVtdO3JldHVybiBkLnB1c2goe3RhZzpgc3BhbmAsYXR0cmlidXRlczpjLGNoaWxkcmVuOlt0XX0pLGR9ZnVuY3Rpb24gam0oZSl7dmFyIHQ9ZS5jb250ZW50LG49ZS5leHRyYSxyPXEocSh7fSxuLmF0dHJpYnV0ZXMpLHt9LHtjbGFzczpuLmNsYXNzZXMuam9pbihgIGApfSksaT1tcChuLnN0eWxlcyk7aS5sZW5ndGg+MCYmKHIuc3R5bGU9aSk7dmFyIGE9W107cmV0dXJuIGEucHVzaCh7dGFnOmBzcGFuYCxhdHRyaWJ1dGVzOnIsY2hpbGRyZW46W3RdfSksYX12YXIgTW09d3Auc3R5bGVzO2Z1bmN0aW9uIE5tKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9UHUoZS5zbGljZSg0KSwxKVswXSxpPW51bGw7cmV0dXJuIGk9QXJyYXkuaXNBcnJheShyKT97dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5HUk9VUH1gfSxjaGlsZHJlbjpbe3RhZzpgcGF0aGAsYXR0cmlidXRlczp7Y2xhc3M6YCR7Si5jc3NQcmVmaXh9LSR7WGYuU0VDT05EQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMF19fSx7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOntjbGFzczpgJHtKLmNzc1ByZWZpeH0tJHtYZi5QUklNQVJZfWAsZmlsbDpgY3VycmVudENvbG9yYCxkOnJbMV19fV19Ont0YWc6YHBhdGhgLGF0dHJpYnV0ZXM6e2ZpbGw6YGN1cnJlbnRDb2xvcmAsZDpyfX0se2ZvdW5kOiEwLHdpZHRoOnQsaGVpZ2h0Om4saWNvbjppfX12YXIgUG09e2ZvdW5kOiExLHdpZHRoOjUxMixoZWlnaHQ6NTEyfTtmdW5jdGlvbiBGbShlLHQpeyFMZiYmIUouc2hvd01pc3NpbmdJY29ucyYmZSYmY29uc29sZS5lcnJvcihgSWNvbiB3aXRoIG5hbWUgIiR7ZX0iIGFuZCBwcmVmaXggIiR7dH0iIGlzIG1pc3NpbmcuYCl9ZnVuY3Rpb24gSW0oZSx0KXt2YXIgbj10O3JldHVybiB0PT09YGZhYCYmSi5zdHlsZURlZmF1bHQhPT1udWxsJiYodD1lbSgpKSxuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe2lmKG49PT1gZmFgKXt2YXIgYT1RcChlKXx8e307ZT1hLmljb25OYW1lfHxlLHQ9YS5wcmVmaXh8fHR9aWYoZSYmdCYmTW1bdF0mJk1tW3RdW2VdKXt2YXIgbz1NbVt0XVtlXTtyZXR1cm4gcihObShvKSl9Rm0oZSx0KSxyKHEocSh7fSxQbSkse30se2ljb246Si5zaG93TWlzc2luZ0ljb25zJiZlJiZibShgbWlzc2luZ0ljb25BYnN0cmFjdGApfHx7fX0pKX0pfXZhciBMbT1mdW5jdGlvbigpe30sUm09Si5tZWFzdXJlUGVyZm9ybWFuY2UmJlh1JiZYdS5tYXJrJiZYdS5tZWFzdXJlP1h1OnttYXJrOkxtLG1lYXN1cmU6TG19LHptPWBGQSAiNy4zLjEiYCxCbT1mdW5jdGlvbihlKXtyZXR1cm4gUm0ubWFyayhgJHt6bX0gJHtlfSBiZWdpbnNgKSxmdW5jdGlvbigpe3JldHVybiBWbShlKX19LFZtPWZ1bmN0aW9uKGUpe1JtLm1hcmsoYCR7em19ICR7ZX0gZW5kc2ApLFJtLm1lYXN1cmUoYCR7em19ICR7ZX1gLGAke3ptfSAke2V9IGJlZ2luc2AsYCR7em19ICR7ZX0gZW5kc2ApfSxIbT17YmVnaW46Qm0sZW5kOlZtfSxVbT1mdW5jdGlvbigpe307ZnVuY3Rpb24gV20oZSl7cmV0dXJuIHR5cGVvZihlLmdldEF0dHJpYnV0ZT9lLmdldEF0dHJpYnV0ZShPZik6bnVsbCk9PWBzdHJpbmdgfWZ1bmN0aW9uIEdtKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlP2UuZ2V0QXR0cmlidXRlKGpmKTpudWxsLG49ZS5nZXRBdHRyaWJ1dGU/ZS5nZXRBdHRyaWJ1dGUoTWYpOm51bGw7cmV0dXJuIHQmJm59ZnVuY3Rpb24gS20oZSl7cmV0dXJuIGUmJmUuY2xhc3NMaXN0JiZlLmNsYXNzTGlzdC5jb250YWlucyYmZS5jbGFzc0xpc3QuY29udGFpbnMoSi5yZXBsYWNlbWVudENsYXNzKX1mdW5jdGlvbiBxbSgpe3JldHVybiBKLmF1dG9SZXBsYWNlU3ZnPT09ITA/UW0ucmVwbGFjZTpRbVtKLmF1dG9SZXBsYWNlU3ZnXXx8UW0ucmVwbGFjZX1mdW5jdGlvbiBKbShlKXtyZXR1cm4gSnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsZSl9ZnVuY3Rpb24gWW0oZSl7cmV0dXJuIEp1LmNyZWF0ZUVsZW1lbnQoZSl9ZnVuY3Rpb24gWG0oZSl7dmFyIHQ9KGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSkuY2VGbixuPXQ9PT12b2lkIDA/ZS50YWc9PT1gc3ZnYD9KbTpZbTp0O2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gSnUuY3JlYXRlVGV4dE5vZGUoZSk7dmFyIHI9bihlLnRhZyk7cmV0dXJuIE9iamVjdC5rZXlzKGUuYXR0cmlidXRlc3x8W10pLmZvckVhY2goZnVuY3Rpb24odCl7ci5zZXRBdHRyaWJ1dGUodCxlLmF0dHJpYnV0ZXNbdF0pfSksKGUuY2hpbGRyZW58fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuYXBwZW5kQ2hpbGQoWG0oZSx7Y2VGbjpufSkpfSkscn1mdW5jdGlvbiBabShlKXt2YXIgdD1gICR7ZS5vdXRlckhUTUx9IGA7cmV0dXJuIHQ9YCR7dH1Gb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tIGAsdH12YXIgUW09e3JlcGxhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZih0LnBhcmVudE5vZGUpe2lmKGVbMV0uZm9yRWFjaChmdW5jdGlvbihlKXt0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFhtKGUpLHQpfSksdC5nZXRBdHRyaWJ1dGUoT2YpPT09bnVsbCYmSi5rZWVwT3JpZ2luYWxTb3VyY2Upe3ZhciBuPUp1LmNyZWF0ZUNvbW1lbnQoWm0odCkpO3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobix0KX1lbHNlIHQucmVtb3ZlKCl9fSxuZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2lmKH5kcCh0KS5pbmRleE9mKEoucmVwbGFjZW1lbnRDbGFzcykpcmV0dXJuIFFtLnJlcGxhY2UoZSk7dmFyIHI9UmVnRXhwKGAke0ouY3NzUHJlZml4fS0uKmApO2lmKGRlbGV0ZSBuWzBdLmF0dHJpYnV0ZXMuaWQsblswXS5hdHRyaWJ1dGVzLmNsYXNzKXt2YXIgaT1uWzBdLmF0dHJpYnV0ZXMuY2xhc3Muc3BsaXQoYCBgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PUoucmVwbGFjZW1lbnRDbGFzc3x8dC5tYXRjaChyKT9lLnRvU3ZnLnB1c2godCk6ZS50b05vZGUucHVzaCh0KSxlfSx7dG9Ob2RlOltdLHRvU3ZnOltdfSk7blswXS5hdHRyaWJ1dGVzLmNsYXNzPWkudG9Tdmcuam9pbihgIGApLGkudG9Ob2RlLmxlbmd0aD09PTA/dC5yZW1vdmVBdHRyaWJ1dGUoYGNsYXNzYCk6dC5zZXRBdHRyaWJ1dGUoYGNsYXNzYCxpLnRvTm9kZS5qb2luKGAgYCkpfXZhciBhPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKTt0LnNldEF0dHJpYnV0ZShPZixgYCksdC5pbm5lckhUTUw9YX19O2Z1bmN0aW9uICRtKGUpe2UoKX1mdW5jdGlvbiBlaChlLHQpe3ZhciBuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3Q6VW07aWYoZS5sZW5ndGg9PT0wKW4oKTtlbHNle3ZhciByPSRtO0oubXV0YXRlQXBwcm9hY2g9PT1QZiYmKHI9cXUucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwkbSkscihmdW5jdGlvbigpe3ZhciB0PXFtKCkscj1IbS5iZWdpbihgbXV0YXRlYCk7ZS5tYXAodCkscigpLG4oKX0pfX12YXIgdGg9ITE7ZnVuY3Rpb24gbmgoKXt0aD0hMH1mdW5jdGlvbiByaCgpe3RoPSExfXZhciBpaD1udWxsO2Z1bmN0aW9uIGFoKGUpe2lmKFl1JiZKLm9ic2VydmVNdXRhdGlvbnMpe3ZhciB0PWUudHJlZUNhbGxiYWNrLG49dD09PXZvaWQgMD9VbTp0LHI9ZS5ub2RlQ2FsbGJhY2ssaT1yPT09dm9pZCAwP1VtOnIsYT1lLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2ssbz1hPT09dm9pZCAwP1VtOmEscz1lLm9ic2VydmVNdXRhdGlvbnNSb290LGM9cz09PXZvaWQgMD9KdTpzO2loPW5ldyBZdShmdW5jdGlvbihlKXtpZighdGgpe3ZhciB0PWVtKCk7dXAoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnR5cGU9PT1gY2hpbGRMaXN0YCYmZS5hZGRlZE5vZGVzLmxlbmd0aD4wJiYhV20oZS5hZGRlZE5vZGVzWzBdKSYmKEouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oZS50YXJnZXQpLG4oZS50YXJnZXQpKSxlLnR5cGU9PT1gYXR0cmlidXRlc2AmJmUudGFyZ2V0LnBhcmVudE5vZGUmJkouc2VhcmNoUHNldWRvRWxlbWVudHMmJm8oW2UudGFyZ2V0XSwhMCksZS50eXBlPT09YGF0dHJpYnV0ZXNgJiZXbShlLnRhcmdldCkmJn5ZZi5pbmRleE9mKGUuYXR0cmlidXRlTmFtZSkpe2lmKGUuYXR0cmlidXRlTmFtZT09PWBjbGFzc2AmJkdtKGUudGFyZ2V0KSl7dmFyIHI9c20oZHAoZS50YXJnZXQpKSxhPXIucHJlZml4LHM9ci5pY29uTmFtZTtlLnRhcmdldC5zZXRBdHRyaWJ1dGUoamYsYXx8dCkscyYmZS50YXJnZXQuc2V0QXR0cmlidXRlKE1mLHMpfWVsc2UgS20oZS50YXJnZXQpJiZpKGUudGFyZ2V0KX19KX19KSxadSYmaWgub2JzZXJ2ZShjLHtjaGlsZExpc3Q6ITAsYXR0cmlidXRlczohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19ZnVuY3Rpb24gb2goKXtpaCYmaWguZGlzY29ubmVjdCgpfWZ1bmN0aW9uIHNoKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKGBzdHlsZWApLG49W107cmV0dXJuIHQmJihuPXQuc3BsaXQoYDtgKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwbGl0KGA6YCkscj1uWzBdLGk9bi5zbGljZSgxKTtyZXR1cm4gciYmaS5sZW5ndGg+MCYmKGVbcl09aS5qb2luKGA6YCkudHJpbSgpKSxlfSx7fSkpLG59ZnVuY3Rpb24gY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoYGRhdGEtcHJlZml4YCksbj1lLmdldEF0dHJpYnV0ZShgZGF0YS1pY29uYCkscj1lLmlubmVyVGV4dD09PXZvaWQgMD9gYDplLmlubmVyVGV4dC50cmltKCksaT1zbShkcChlKSk7cmV0dXJuIGkucHJlZml4fHw9ZW0oKSx0JiZuJiYoaS5wcmVmaXg9dCxpLmljb25OYW1lPW4pLGkuaWNvbk5hbWUmJmkucHJlZml4P2k6KGkucHJlZml4JiZyLmxlbmd0aD4wJiYoaS5pY29uTmFtZT1YcChpLnByZWZpeCxlLmlubmVyVGV4dCl8fFlwKGkucHJlZml4LE5wKGUuaW5uZXJUZXh0KSkpLCFpLmljb25OYW1lJiZKLmF1dG9GZXRjaFN2ZyYmZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmKGkuaWNvbk5hbWU9ZS5maXJzdENoaWxkLmRhdGEpLGkpfWZ1bmN0aW9uIGxoKGUpe3JldHVybiB1cChlLmF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWUhPT1gY2xhc3NgJiZlLm5hbWUhPT1gc3R5bGVgJiYoZVt0Lm5hbWVdPXQudmFsdWUpLGV9LHt9KX1mdW5jdGlvbiB1aCgpe3JldHVybntpY29uTmFtZTpudWxsLHByZWZpeDpudWxsLHRyYW5zZm9ybTpvcCxzeW1ib2w6ITEsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxleHRyYTp7Y2xhc3NlczpbXSxzdHlsZXM6e30sYXR0cmlidXRlczp7fX19fWZ1bmN0aW9uIGRoKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7c3R5bGVQYXJzZXI6ITB9LG49Y2goZSkscj1uLmljb25OYW1lLGk9bi5wcmVmaXgsYT1uLnJlc3Qsbz1saChlKSxzPXZtKGBwYXJzZU5vZGVBdHRyaWJ1dGVzYCx7fSxlKTtyZXR1cm4gcSh7aWNvbk5hbWU6cixwcmVmaXg6aSx0cmFuc2Zvcm06b3AsbWFzazp7aWNvbk5hbWU6bnVsbCxwcmVmaXg6bnVsbCxyZXN0OltdfSxtYXNrSWQ6bnVsbCxzeW1ib2w6ITEsZXh0cmE6e2NsYXNzZXM6YSxzdHlsZXM6dC5zdHlsZVBhcnNlcj9zaChlKTpbXSxhdHRyaWJ1dGVzOm99fSxzKX12YXIgZmg9d3Auc3R5bGVzO2Z1bmN0aW9uIHBoKGUpe3ZhciB0PUouYXV0b1JlcGxhY2VTdmc9PT1gbmVzdGA/ZGgoZSx7c3R5bGVQYXJzZXI6ITF9KTpkaChlKTtyZXR1cm5+dC5leHRyYS5jbGFzc2VzLmluZGV4T2YocWYpP2JtKGBnZW5lcmF0ZUxheWVyc1RleHRgLGUsdCk6Ym0oYGdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbmAsZSx0KX1mdW5jdGlvbiBtaCgpe3JldHVybltdLmNvbmNhdChGdShhZiksRnUodmYpKX1mdW5jdGlvbiBoaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtpZighWnUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBuPUp1LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Qscj1mdW5jdGlvbihlKXtyZXR1cm4gbi5hZGQoYCR7TmZ9LSR7ZX1gKX0saT1mdW5jdGlvbihlKXtyZXR1cm4gbi5yZW1vdmUoYCR7TmZ9LSR7ZX1gKX0sYT1KLmF1dG9GZXRjaFN2Zz9taCgpOmlkLmNvbmNhdChPYmplY3Qua2V5cyhmaCkpO2EuaW5jbHVkZXMoYGZhYCl8fGEucHVzaChgZmFgKTt2YXIgbz1bYC4ke3FmfTpub3QoWyR7T2Z9XSlgXS5jb25jYXQoYS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuYC4ke2V9Om5vdChbJHtPZn1dKWB9KSkuam9pbihgLCBgKTtpZihvLmxlbmd0aD09PTApcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBzPVtdO3RyeXtzPXVwKGUucXVlcnlTZWxlY3RvckFsbChvKSl9Y2F0Y2h7fWlmKHMubGVuZ3RoPjApcihgcGVuZGluZ2ApLGkoYGNvbXBsZXRlYCk7ZWxzZSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGM9SG0uYmVnaW4oYG9uVHJlZWApLGw9cy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt0cnl7dmFyIG49cGgodCk7biYmZS5wdXNoKG4pfWNhdGNoKGUpe0xmfHxlLm5hbWU9PT1gTWlzc2luZ0ljb25gJiZjb25zb2xlLmVycm9yKGUpfXJldHVybiBlfSxbXSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7UHJvbWlzZS5hbGwobCkudGhlbihmdW5jdGlvbihuKXtlaChuLGZ1bmN0aW9uKCl7cihgYWN0aXZlYCkscihgY29tcGxldGVgKSxpKGBwZW5kaW5nYCksdHlwZW9mIHQ9PWBmdW5jdGlvbmAmJnQoKSxjKCksZSgpfSl9KS5jYXRjaChmdW5jdGlvbihlKXtjKCksbihlKX0pfSl9ZnVuY3Rpb24gZ2goZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7cGgoZSkudGhlbihmdW5jdGlvbihlKXtlJiZlaChbZV0sdCl9KX1mdW5jdGlvbiBfaChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHI9KHR8fHt9KS5pY29uP3Q6eG0odHx8e30pLGk9bi5tYXNrO3JldHVybiBpJiY9KGl8fHt9KS5pY29uP2k6eG0oaXx8e30pLGUocixxKHEoe30sbikse30se21hc2s6aX0pKX19dmFyIHZoPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5zeW1ib2wsYT1pIT09dm9pZCAwJiZpLG89dC5tYXNrLHM9bz09PXZvaWQgMD9udWxsOm8sYz10Lm1hc2tJZCxsPWM9PT12b2lkIDA/bnVsbDpjLHU9dC5jbGFzc2VzLGQ9dT09PXZvaWQgMD9bXTp1LGY9dC5hdHRyaWJ1dGVzLHA9Zj09PXZvaWQgMD97fTpmLG09dC5zdHlsZXMsaD1tPT09dm9pZCAwP3t9Om07aWYoZSl7dmFyIGc9ZS5wcmVmaXgsXz1lLmljb25OYW1lLHY9ZS5pY29uO3JldHVybiBUbShxKHt0eXBlOmBpY29uYH0sZSksZnVuY3Rpb24oKXtyZXR1cm4geW0oYGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbmAse2ljb25EZWZpbml0aW9uOmUscGFyYW1zOnR9KSxrbSh7aWNvbnM6e21haW46Tm0odiksbWFzazpzP05tKHMuaWNvbik6e2ZvdW5kOiExLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsaWNvbjp7fX19LHByZWZpeDpnLGljb25OYW1lOl8sdHJhbnNmb3JtOnEocSh7fSxvcCksciksc3ltYm9sOmEsbWFza0lkOmwsZXh0cmE6e2F0dHJpYnV0ZXM6cCxzdHlsZXM6aCxjbGFzc2VzOmR9fSl9KX19LHloPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57aWNvbjpfaCh2aCl9fSxob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRyZWVDYWxsYmFjaz1oaCxlLm5vZGVDYWxsYmFjaz1naCxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuaTJzdmc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlLG49dD09PXZvaWQgMD9KdTp0LHI9ZS5jYWxsYmFjaztyZXR1cm4gaGgobixyPT09dm9pZCAwP2Z1bmN0aW9uKCl7fTpyKX0sZS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmljb25OYW1lLHI9dC5wcmVmaXgsaT10LnRyYW5zZm9ybSxhPXQuc3ltYm9sLG89dC5tYXNrLHM9dC5tYXNrSWQsYz10LmV4dHJhO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGwpe1Byb21pc2UuYWxsKFtJbShuLHIpLG8uaWNvbk5hbWU/SW0oby5pY29uTmFtZSxvLnByZWZpeCk6UHJvbWlzZS5yZXNvbHZlKHtmb3VuZDohMSx3aWR0aDo1MTIsaGVpZ2h0OjUxMixpY29uOnt9fSldKS50aGVuKGZ1bmN0aW9uKG8pe3ZhciBsPVB1KG8sMiksdT1sWzBdLGQ9bFsxXTt0KFtlLGttKHtpY29uczp7bWFpbjp1LG1hc2s6ZH0scHJlZml4OnIsaWNvbk5hbWU6bix0cmFuc2Zvcm06aSxzeW1ib2w6YSxtYXNrSWQ6cyxleHRyYTpjLHdhdGNoYWJsZTohMH0pXSl9KS5jYXRjaChsKX0pfSxlLmdlbmVyYXRlQWJzdHJhY3RJY29uPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLnRyYW5zZm9ybSxhPWUuc3R5bGVzLG89bXAoYSk7by5sZW5ndGg+MCYmKG4uc3R5bGU9byk7dmFyIHM7cmV0dXJuIGhwKGkpJiYocz1ibShgZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nYCx7bWFpbjpyLHRyYW5zZm9ybTppLGNvbnRhaW5lcldpZHRoOnIud2lkdGgsaWNvbldpZHRoOnIud2lkdGh9KSksdC5wdXNoKHN8fHIuaWNvbikse2NoaWxkcmVuOnQsYXR0cmlidXRlczpufX19fSxiaD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2xheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQuY2xhc3NlcyxyPW49PT12b2lkIDA/W106bjtyZXR1cm4gVG0oe3R5cGU6YGxheWVyYH0sZnVuY3Rpb24oKXt5bShgYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uYCx7YXNzZW1ibGVyOmUscGFyYW1zOnR9KTt2YXIgbj1bXTtyZXR1cm4gZShmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpP2UubWFwKGZ1bmN0aW9uKGUpe249bi5jb25jYXQoZS5hYnN0cmFjdCl9KTpuPW4uY29uY2F0KGUuYWJzdHJhY3QpfSksW3t0YWc6YHNwYW5gLGF0dHJpYnV0ZXM6e2NsYXNzOltgJHtKLmNzc1ByZWZpeH0tbGF5ZXJzYF0uY29uY2F0KEZ1KHIpKS5qb2luKGAgYCl9LGNoaWxkcmVuOm59XX0pfX19fSx4aD17bWl4b3V0OmZ1bmN0aW9uKCl7cmV0dXJue2NvdW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LG49dC50aXRsZSxyPW49PT12b2lkIDA/bnVsbDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmBjb3VudGVyYCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxqbSh7Y29udGVudDplLnRvU3RyaW5nKCksdGl0bGU6cixleHRyYTp7YXR0cmlidXRlczpzLHN0eWxlczpsLGNsYXNzZXM6W2Ake0ouY3NzUHJlZml4fS1sYXllcnMtY291bnRlcmBdLmNvbmNhdChGdShhKSl9fSl9KX19fX0sU2g9e21peG91dDpmdW5jdGlvbigpe3JldHVybnt0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPXQudHJhbnNmb3JtLHI9bj09PXZvaWQgMD9vcDpuLGk9dC5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppLG89dC5hdHRyaWJ1dGVzLHM9bz09PXZvaWQgMD97fTpvLGM9dC5zdHlsZXMsbD1jPT09dm9pZCAwP3t9OmM7cmV0dXJuIFRtKHt0eXBlOmB0ZXh0YCxjb250ZW50OmV9LGZ1bmN0aW9uKCl7cmV0dXJuIHltKGBiZWZvcmVET01FbGVtZW50Q3JlYXRpb25gLHtjb250ZW50OmUscGFyYW1zOnR9KSxBbSh7Y29udGVudDplLHRyYW5zZm9ybTpxKHEoe30sb3ApLHIpLGV4dHJhOnthdHRyaWJ1dGVzOnMsc3R5bGVzOmwsY2xhc3NlczpbYCR7Si5jc3NQcmVmaXh9LWxheWVycy10ZXh0YF0uY29uY2F0KEZ1KGEpKX19KX0pfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVMYXllcnNUZXh0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC50cmFuc2Zvcm0scj10LmV4dHJhLGk9bnVsbCxhPW51bGw7aWYoUXUpe3ZhciBvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZSkuZm9udFNpemUsMTApLHM9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpPXMud2lkdGgvbyxhPXMuaGVpZ2h0L299cmV0dXJuIFByb21pc2UucmVzb2x2ZShbZSxBbSh7Y29udGVudDplLmlubmVySFRNTCx3aWR0aDppLGhlaWdodDphLHRyYW5zZm9ybTpuLGV4dHJhOnIsd2F0Y2hhYmxlOiEwfSldKX19fSxDaD1SZWdFeHAoYCJgLGB1Z2ApLHdoPVsxMTA1OTIwLDExMTIzMTldLFRoPXEocShxKHEoe30se0ZvbnRBd2Vzb21lOntub3JtYWw6YGZhc2AsNDAwOmBmYXNgfX0pLHRmKSxDZiksbGYpLEVoPU9iamVjdC5rZXlzKFRoKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0LnRvTG93ZXJDYXNlKCldPVRoW3RdLGV9LHt9KSxEaD1PYmplY3Qua2V5cyhFaCkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49RWhbdF07cmV0dXJuIGVbdF09bls5MDBdfHxGdShPYmplY3QuZW50cmllcyhuKSlbMF1bMV0sZX0se30pO2Z1bmN0aW9uIE9oKGUpe3JldHVybiBOcChGdShlLnJlcGxhY2UoQ2gsYGApKVswXXx8YGApfWZ1bmN0aW9uIGtoKGUpe3ZhciB0PWUuZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mZWF0dXJlLXNldHRpbmdzYCkuaW5jbHVkZXMoYHNzMDFgKSxuPWUuZ2V0UHJvcGVydHlWYWx1ZShgY29udGVudGApLnJlcGxhY2UoQ2gsYGApLHI9bi5jb2RlUG9pbnRBdCgwKSxpPXI+PXdoWzBdJiZyPD13aFsxXSxhPW4ubGVuZ3RoPT09MiYmblswXT09PW5bMV07cmV0dXJuIGl8fGF8fHR9ZnVuY3Rpb24gQWgoZSx0KXt2YXIgbj1lLnJlcGxhY2UoL15bJyJdfFsnIl0kL2csYGApLnRvTG93ZXJDYXNlKCkscj1wYXJzZUludCh0KSxpPWlzTmFOKHIpP2Bub3JtYWxgOnI7cmV0dXJuKEVoW25dfHx7fSlbaV18fERoW25dfWZ1bmN0aW9uIGpoKGUsdCl7dmFyIG49YCR7QWZ9JHt0LnJlcGxhY2UoYDpgLGAtYCl9YDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixpKXtpZihlLmdldEF0dHJpYnV0ZShuKSE9PW51bGwpcmV0dXJuIHIoKTt2YXIgYT11cChlLmNoaWxkcmVuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKGtmKT09PXR9KVswXSxvPXF1LmdldENvbXB1dGVkU3R5bGUoZSx0KSxzPW8uZ2V0UHJvcGVydHlWYWx1ZShgZm9udC1mYW1pbHlgKSxjPXMubWF0Y2goSmYpLGw9by5nZXRQcm9wZXJ0eVZhbHVlKGBmb250LXdlaWdodGApLHU9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCk7aWYoYSYmIWMpcmV0dXJuIGUucmVtb3ZlQ2hpbGQoYSkscigpO2lmKGMmJnUhPT1gbm9uZWAmJnUhPT1gYCl7dmFyIGQ9by5nZXRQcm9wZXJ0eVZhbHVlKGBjb250ZW50YCksZj1BaChzLGwpLHA9T2goZCksbT1jWzBdLnN0YXJ0c1dpdGgoYEZvbnRBd2Vzb21lYCksaD1raChvKSxnPVlwKGYscCksXz1nO2lmKG0pe3ZhciB2PSRwKHApO3YuaWNvbk5hbWUmJnYucHJlZml4JiYoZz12Lmljb25OYW1lLGY9di5wcmVmaXgpfWlmKGcmJiFoJiYoIWF8fGEuZ2V0QXR0cmlidXRlKGpmKSE9PWZ8fGEuZ2V0QXR0cmlidXRlKE1mKSE9PV8pKXtlLnNldEF0dHJpYnV0ZShuLF8pLGEmJmUucmVtb3ZlQ2hpbGQoYSk7dmFyIHk9dWgoKSxiPXkuZXh0cmE7Yi5hdHRyaWJ1dGVzW2tmXT10LEltKGcsZikudGhlbihmdW5jdGlvbihpKXt2YXIgYT1rbShxKHEoe30seSkse30se2ljb25zOnttYWluOmksbWFzazp0bSgpfSxwcmVmaXg6ZixpY29uTmFtZTpfLGV4dHJhOmIsd2F0Y2hhYmxlOiEwfSkpLG89SnUuY3JlYXRlRWxlbWVudE5TKGBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z2AsYHN2Z2ApO3Q9PT1gOjpiZWZvcmVgP2UuaW5zZXJ0QmVmb3JlKG8sZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKG8pLG8ub3V0ZXJIVE1MPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBrcChlKX0pLmpvaW4oYApgKSxlLnJlbW92ZUF0dHJpYnV0ZShuKSxyKCl9KS5jYXRjaChpKX1lbHNlIHIoKX1lbHNlIHIoKX0pfWZ1bmN0aW9uIE1oKGUpe3JldHVybiBQcm9taXNlLmFsbChbamgoZSxgOjpiZWZvcmVgKSxqaChlLGA6OmFmdGVyYCldKX1mdW5jdGlvbiBOaChlKXtyZXR1cm4gZS5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmIX5GZi5pbmRleE9mKGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSYmIWUuZ2V0QXR0cmlidXRlKGtmKSYmKCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS50YWdOYW1lIT09YHN2Z2ApfXZhciBQaD1mdW5jdGlvbihlKXtyZXR1cm4hIWUmJklmLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5jbHVkZXModCl9KX0sRmg9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9bmV3IFNldCxuPWUuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSk7bj1uLmZsYXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5jbHVkZXMoYChgKT9lOmUuc3BsaXQoYCxgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSl9KTt2YXIgcj1PdShuKSxpO3RyeXtmb3Ioci5zKCk7IShpPXIubigpKS5kb25lOyl7dmFyIGE9aS52YWx1ZTtpZihQaChhKSl7dmFyIG89SWYucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSh0LGBgKX0sYSk7byE9PWBgJiZvIT09YCpgJiZ0LmFkZChvKX19fWNhdGNoKGUpe3IuZShlKX1maW5hbGx5e3IuZigpfXJldHVybiB0fTtmdW5jdGlvbiBJaChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMCYmYXJndW1lbnRzWzFdO2lmKFp1KXt2YXIgbjtpZih0KW49ZTtlbHNlIGlmKEouc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiluPWUucXVlcnlTZWxlY3RvckFsbChgKmApO2Vsc2V7dmFyIHI9bmV3IFNldCxpPU91KGRvY3VtZW50LnN0eWxlU2hlZXRzKSxhO3RyeXtmb3IoaS5zKCk7IShhPWkubigpKS5kb25lOyl7dmFyIG89YS52YWx1ZTt0cnl7dmFyIHM9T3Uoby5jc3NSdWxlcyksYzt0cnl7Zm9yKHMucygpOyEoYz1zLm4oKSkuZG9uZTspe3ZhciBsPWMudmFsdWUsdT1PdShGaChsLnNlbGVjdG9yVGV4dCkpLGQ7dHJ5e2Zvcih1LnMoKTshKGQ9dS5uKCkpLmRvbmU7KXt2YXIgZj1kLnZhbHVlO3IuYWRkKGYpfX1jYXRjaChlKXt1LmUoZSl9ZmluYWxseXt1LmYoKX19fWNhdGNoKGUpe3MuZShlKX1maW5hbGx5e3MuZigpfX1jYXRjaChlKXtKLnNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MmJmNvbnNvbGUud2FybihgRm9udCBBd2Vzb21lOiBjYW5ub3QgcGFyc2Ugc3R5bGVzaGVldDogJHtvLmhyZWZ9ICgke2UubWVzc2FnZX0pCklmIGl0IGRlY2xhcmVzIGFueSBGb250IEF3ZXNvbWUgQ1NTIHBzZXVkby1lbGVtZW50cywgdGhleSB3aWxsIG5vdCBiZSByZW5kZXJlZCBhcyBTVkcgaWNvbnMuIEFkZCBjcm9zc29yaWdpbj0iYW5vbnltb3VzIiB0byB0aGUgPGxpbms+LCBlbmFibGUgc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiBmb3Igc2xvd2VyIGJ1dCBtb3JlIHRob3JvdWdoIERPTSBwYXJzaW5nLCBvciBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzIHRvIGZhbHNlLmApfX19Y2F0Y2goZSl7aS5lKGUpfWZpbmFsbHl7aS5mKCl9aWYoIXIuc2l6ZSlyZXR1cm47dmFyIHA9QXJyYXkuZnJvbShyKS5qb2luKGAsIGApO3RyeXtuPWUucXVlcnlTZWxlY3RvckFsbChwKX1jYXRjaHt9fXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe3ZhciByPXVwKG4pLmZpbHRlcihOaCkubWFwKE1oKSxpPUhtLmJlZ2luKGBzZWFyY2hQc2V1ZG9FbGVtZW50c2ApO25oKCksUHJvbWlzZS5hbGwocikudGhlbihmdW5jdGlvbigpe2koKSxyaCgpLGUoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aSgpLHJoKCksdCgpfSl9KX19dmFyIExoPXtob29rczpmdW5jdGlvbigpe3JldHVybnttdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2s9SWgsZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLnBzZXVkb0VsZW1lbnRzMnN2Zz1mdW5jdGlvbihlKXt2YXIgdD1lLm5vZGUsbj10PT09dm9pZCAwP0p1OnQ7Si5zZWFyY2hQc2V1ZG9FbGVtZW50cyYmSWgobil9fX0sUmg9ITEsemg9e21peG91dDpmdW5jdGlvbigpe3JldHVybntkb206e3Vud2F0Y2g6ZnVuY3Rpb24oKXtuaCgpLFJoPSEwfX19fSxob29rczpmdW5jdGlvbigpe3JldHVybntib290c3RyYXA6ZnVuY3Rpb24oKXthaCh2bShgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrc2Ase30pKX0sbm9BdXRvOmZ1bmN0aW9uKCl7b2goKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vYnNlcnZlTXV0YXRpb25zUm9vdDtSaD9yaCgpOmFoKHZtKGBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzYCx7b2JzZXJ2ZU11dGF0aW9uc1Jvb3Q6dH0pKX19fX0sQmg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5zcGxpdChgIGApLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQudG9Mb3dlckNhc2UoKS5zcGxpdChgLWApLHI9blswXSxpPW4uc2xpY2UoMSkuam9pbihgLWApO2lmKHImJmk9PT1gaGApcmV0dXJuIGUuZmxpcFg9ITAsZTtpZihyJiZpPT09YHZgKXJldHVybiBlLmZsaXBZPSEwLGU7aWYoaT1wYXJzZUZsb2F0KGkpLGlzTmFOKGkpKXJldHVybiBlO3N3aXRjaChyKXtjYXNlYGdyb3dgOmUuc2l6ZSs9aTticmVhaztjYXNlYHNocmlua2A6ZS5zaXplLT1pO2JyZWFrO2Nhc2VgbGVmdGA6ZS54LT1pO2JyZWFrO2Nhc2VgcmlnaHRgOmUueCs9aTticmVhaztjYXNlYHVwYDplLnktPWk7YnJlYWs7Y2FzZWBkb3duYDplLnkrPWk7YnJlYWs7Y2FzZWByb3RhdGVgOmUucm90YXRlKz1pfXJldHVybiBlfSx7c2l6ZToxNix4OjAseTowLGZsaXBYOiExLGZsaXBZOiExLHJvdGF0ZTowfSl9LFZoPXttaXhvdXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGFyc2U6e3RyYW5zZm9ybTpmdW5jdGlvbihlKXtyZXR1cm4gQmgoZSl9fX19LGhvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS10cmFuc2Zvcm1gKTtyZXR1cm4gbiYmKGUudHJhbnNmb3JtPUJoKG4pKSxlfX19LHByb3ZpZGVzOmZ1bmN0aW9uKGUpe2UuZ2VuZXJhdGVBYnN0cmFjdFRyYW5zZm9ybUdyb3VwaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWFpbixuPWUudHJhbnNmb3JtLHI9ZS5jb250YWluZXJXaWR0aCxpPWUuaWNvbldpZHRoLGE9e291dGVyOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke3IvMn0gMjU2KWB9LGlubmVyOnt0cmFuc2Zvcm06YCR7YHRyYW5zbGF0ZSgke24ueCozMn0sICR7bi55KjMyfSkgYH0gJHtgc2NhbGUoJHtuLnNpemUvMTYqKG4uZmxpcFg/LTE6MSl9LCAke24uc2l6ZS8xNioobi5mbGlwWT8tMToxKX0pIGB9ICR7YHJvdGF0ZSgke24ucm90YXRlfSAwIDApYH1gfSxwYXRoOnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSgke2kvMiotMX0gLTI1NilgfX07cmV0dXJue3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGEub3V0ZXIpLGNoaWxkcmVuOlt7dGFnOmBnYCxhdHRyaWJ1dGVzOnEoe30sYS5pbm5lciksY2hpbGRyZW46W3t0YWc6dC5pY29uLnRhZyxjaGlsZHJlbjp0Lmljb24uY2hpbGRyZW4sYXR0cmlidXRlczpxKHEoe30sdC5pY29uLmF0dHJpYnV0ZXMpLGEucGF0aCl9XX1dfX19fSxIaD17eDowLHk6MCx3aWR0aDpgMTAwJWAsaGVpZ2h0OmAxMDAlYH07ZnVuY3Rpb24gVWgoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBlLmF0dHJpYnV0ZXMmJihlLmF0dHJpYnV0ZXMuZmlsbHx8dCkmJihlLmF0dHJpYnV0ZXMuZmlsbD1gYmxhY2tgKSxlfWZ1bmN0aW9uIFdoKGUpe3JldHVybiBlLnRhZz09PWBnYD9lLmNoaWxkcmVuOltlXX1fbShbU3AseWgsYmgseGgsU2gsTGgsemgsVmgse2hvb2tzOmZ1bmN0aW9uKCl7cmV0dXJue3BhcnNlTm9kZUF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrYCkscj1uP3NtKG4uc3BsaXQoYCBgKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSkpOnRtKCk7cmV0dXJuIHIucHJlZml4fHw9ZW0oKSxlLm1hc2s9cixlLm1hc2tJZD10LmdldEF0dHJpYnV0ZShgZGF0YS1mYS1tYXNrLWlkYCksZX19fSxwcm92aWRlczpmdW5jdGlvbihlKXtlLmdlbmVyYXRlQWJzdHJhY3RNYXNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW4sbj1lLmF0dHJpYnV0ZXMscj1lLm1haW4saT1lLm1hc2ssYT1lLm1hc2tJZCxvPWUudHJhbnNmb3JtLHM9ci53aWR0aCxjPXIuaWNvbixsPWkud2lkdGgsdT1pLmljb24sZD1ncCh7dHJhbnNmb3JtOm8sY29udGFpbmVyV2lkdGg6bCxpY29uV2lkdGg6c30pLGY9e3RhZzpgcmVjdGAsYXR0cmlidXRlczpxKHEoe30sSGgpLHt9LHtmaWxsOmB3aGl0ZWB9KX0scD1jLmNoaWxkcmVuP3tjaGlsZHJlbjpjLmNoaWxkcmVuLm1hcChVaCl9Ont9LG09e3RhZzpgZ2AsYXR0cmlidXRlczpxKHt9LGQuaW5uZXIpLGNoaWxkcmVuOltVaChxKHt0YWc6Yy50YWcsYXR0cmlidXRlczpxKHEoe30sYy5hdHRyaWJ1dGVzKSxkLnBhdGgpfSxwKSldfSxoPXt0YWc6YGdgLGF0dHJpYnV0ZXM6cSh7fSxkLm91dGVyKSxjaGlsZHJlbjpbbV19LGc9YG1hc2stJHthfHxscCgpfWAsXz1gY2xpcC0ke2F8fGxwKCl9YCx2PXt0YWc6YG1hc2tgLGF0dHJpYnV0ZXM6cShxKHt9LEhoKSx7fSx7aWQ6ZyxtYXNrVW5pdHM6YHVzZXJTcGFjZU9uVXNlYCxtYXNrQ29udGVudFVuaXRzOmB1c2VyU3BhY2VPblVzZWB9KSxjaGlsZHJlbjpbZixoXX0seT17dGFnOmBkZWZzYCxjaGlsZHJlbjpbe3RhZzpgY2xpcFBhdGhgLGF0dHJpYnV0ZXM6e2lkOl99LGNoaWxkcmVuOldoKHUpfSx2XX07cmV0dXJuIHQucHVzaCh5LHt0YWc6YHJlY3RgLGF0dHJpYnV0ZXM6cSh7ZmlsbDpgY3VycmVudENvbG9yYCwiY2xpcC1wYXRoIjpgdXJsKCMke199KWAsbWFzazpgdXJsKCMke2d9KWB9LEhoKX0pLHtjaGlsZHJlbjp0LGF0dHJpYnV0ZXM6bn19fX0se3Byb3ZpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PSExO3F1Lm1hdGNoTWVkaWEmJih0PXF1Lm1hdGNoTWVkaWEoYChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpYCkubWF0Y2hlcyksZS5taXNzaW5nSWNvbkFic3RyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9W10sbj17ZmlsbDpgY3VycmVudENvbG9yYH0scj17YXR0cmlidXRlVHlwZTpgWE1MYCxyZXBlYXRDb3VudDpgaW5kZWZpbml0ZWAsZHVyOmAyc2B9O2UucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7ZDpgTTE1Ni41LDQ0Ny43bC0xMi42LDI5LjVjLTE4LjctOS41LTM1LjktMjEuMi01MS41LTM0LjlsMjIuNy0yMi43QzEyNy42LDQzMC41LDE0MS41LDQ0MCwxNTYuNSw0NDcuN3ogTTQwLjYsMjcySDguNSBjMS40LDIxLjIsNS40LDQxLjcsMTEuNyw2MS4xTDUwLDMyMS4yQzQ1LjEsMzA1LjUsNDEuOCwyODksNDAuNiwyNzJ6IE00MC42LDI0MGMxLjQtMTguOCw1LjItMzcsMTEuMS01NC4xbC0yOS41LTEyLjYgQzE0LjcsMTk0LjMsMTAsMjE2LjcsOC41LDI0MEg0MC42eiBNNjQuMywxNTYuNWM3LjgtMTQuOSwxNy4yLTI4LjgsMjguMS00MS41TDY5LjcsOTIuM2MtMTMuNywxNS42LTI1LjUsMzIuOC0zNC45LDUxLjUgTDY0LjMsMTU2LjV6IE0zOTcsNDE5LjZjLTEzLjksMTItMjkuNCwyMi4zLTQ2LjEsMzAuNGwxMS45LDI5LjhjMjAuNy05LjksMzkuOC0yMi42LDU2LjktMzcuNkwzOTcsNDE5LjZ6IE0xMTUsOTIuNCBjMTMuOS0xMiwyOS40LTIyLjMsNDYuMS0zMC40bC0xMS45LTI5LjhjLTIwLjcsOS45LTM5LjgsMjIuNi01Ni44LDM3LjZMMTE1LDkyLjR6IE00NDcuNywzNTUuNWMtNy44LDE0LjktMTcuMiwyOC44LTI4LjEsNDEuNSBsMjIuNywyMi43YzEzLjctMTUuNiwyNS41LTMyLjksMzQuOS01MS41TDQ0Ny43LDM1NS41eiBNNDcxLjQsMjcyYy0xLjQsMTguOC01LjIsMzctMTEuMSw1NC4xbDI5LjUsMTIuNiBjNy41LTIxLjEsMTIuMi00My41LDEzLjYtNjYuOEg0NzEuNHogTTMyMS4yLDQ2MmMtMTUuNyw1LTMyLjIsOC4yLTQ5LjIsOS40djMyLjFjMjEuMi0xLjQsNDEuNy01LjQsNjEuMS0xMS43TDMyMS4yLDQ2MnogTTI0MCw0NzEuNGMtMTguOC0xLjQtMzctNS4yLTU0LjEtMTEuMWwtMTIuNiwyOS41YzIxLjEsNy41LDQzLjUsMTIuMiw2Ni44LDEzLjZWNDcxLjR6IE00NjIsMTkwLjhjNSwxNS43LDguMiwzMi4yLDkuNCw0OS4yaDMyLjEgYy0xLjQtMjEuMi01LjQtNDEuNy0xMS43LTYxLjFMNDYyLDE5MC44eiBNOTIuNCwzOTdjLTEyLTEzLjktMjIuMy0yOS40LTMwLjQtNDYuMWwtMjkuOCwxMS45YzkuOSwyMC43LDIyLjYsMzkuOCwzNy42LDU2LjkgTDkyLjQsMzk3eiBNMjcyLDQwLjZjMTguOCwxLjQsMzYuOSw1LjIsNTQuMSwxMS4xbDEyLjYtMjkuNUMzMTcuNywxNC43LDI5NS4zLDEwLDI3Miw4LjVWNDAuNnogTTE5MC44LDUwIGMxNS43LTUsMzIuMi04LjIsNDkuMi05LjRWOC41Yy0yMS4yLDEuNC00MS43LDUuNC02MS4xLDExLjdMMTkwLjgsNTB6IE00NDIuMyw5Mi4zTDQxOS42LDExNWMxMiwxMy45LDIyLjMsMjkuNCwzMC41LDQ2LjEgbDI5LjgtMTEuOUM0NzAsMTI4LjUsNDU3LjMsMTA5LjQsNDQyLjMsOTIuM3ogTTM5Nyw5Mi40bDIyLjctMjIuN2MtMTUuNi0xMy43LTMyLjgtMjUuNS01MS41LTM0LjlsLTEyLjYsMjkuNSBDMzcwLjQsNzIuMSwzODQuNCw4MS41LDM5Nyw5Mi40emB9KX0pO3ZhciBpPXEocSh7fSxyKSx7fSx7YXR0cmlidXRlTmFtZTpgb3BhY2l0eWB9KSxhPXt0YWc6YGNpcmNsZWAsYXR0cmlidXRlczpxKHEoe30sbikse30se2N4OmAyNTZgLGN5OmAzNjRgLHI6YDI4YH0pLGNoaWxkcmVuOltdfTtyZXR1cm4gdHx8YS5jaGlsZHJlbi5wdXNoKHt0YWc6YGFuaW1hdGVgLGF0dHJpYnV0ZXM6cShxKHt9LHIpLHt9LHthdHRyaWJ1dGVOYW1lOmByYCx2YWx1ZXM6YDI4OzE0OzI4OzI4OzE0OzI4O2B9KX0se3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMTswOzE7MTswOzE7YH0pfSksZS5wdXNoKGEpLGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMWAsZDpgTTI2My43LDMxMmgtMTZjLTYuNiwwLTEyLTUuNC0xMi0xMmMwLTcxLDc3LjQtNjMuOSw3Ny40LTEwNy44YzAtMjAtMTcuOC00MC4yLTU3LjQtNDAuMmMtMjkuMSwwLTQ0LjMsOS42LTU5LjIsMjguNyBjLTMuOSw1LTExLjEsNi0xNi4yLDIuNGwtMTMuMS05LjJjLTUuNi0zLjktNi45LTExLjgtMi42LTE3LjJjMjEuMi0yNy4yLDQ2LjQtNDQuNyw5MS4yLTQ0LjdjNTIuMywwLDk3LjQsMjkuOCw5Ny40LDgwLjIgYzAsNjcuNi03Ny40LDYzLjUtNzcuNCwxMDcuOEMyNzUuNywzMDYuNiwyNzAuMywzMTIsMjYzLjcsMzEyemB9KSxjaGlsZHJlbjp0P1tdOlt7dGFnOmBhbmltYXRlYCxhdHRyaWJ1dGVzOnEocSh7fSxpKSx7fSx7dmFsdWVzOmAxOzA7MDswOzA7MTtgfSl9XX0pLHR8fGUucHVzaCh7dGFnOmBwYXRoYCxhdHRyaWJ1dGVzOnEocSh7fSxuKSx7fSx7b3BhY2l0eTpgMGAsZDpgTTIzMi41LDEzNC41bDcsMTY4YzAuMyw2LjQsNS42LDExLjUsMTIsMTEuNWg5YzYuNCwwLDExLjctNS4xLDEyLTExLjVsNy0xNjhjMC4zLTYuOC01LjItMTIuNS0xMi0xMi41aC0yMyBDMjM3LjcsMTIyLDIzMi4yLDEyNy43LDIzMi41LDEzNC41emB9KSxjaGlsZHJlbjpbe3RhZzpgYW5pbWF0ZWAsYXR0cmlidXRlczpxKHEoe30saSkse30se3ZhbHVlczpgMDswOzE7MTswOzA7YH0pfV19KSx7dGFnOmBnYCxhdHRyaWJ1dGVzOntjbGFzczpgbWlzc2luZ2B9LGNoaWxkcmVuOmV9fX19LHtob29rczpmdW5jdGlvbigpe3JldHVybntwYXJzZU5vZGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYGRhdGEtZmEtc3ltYm9sYCk7cmV0dXJuIGUuc3ltYm9sPW49PT1udWxsPyExOm49PT1gYHx8bixlfX19fV0se21peG91dHNUbzpDbX0pLENtLm5vQXV0byxDbS5jb25maWcsQ20ubGlicmFyeSxDbS5kb207dmFyIEdoPUNtLnBhcnNlO0NtLmZpbmRJY29uRGVmaW5pdGlvbixDbS50b0h0bWw7dmFyIEtoPUNtLmljb247Q20ubGF5ZXIsQ20udGV4dCxDbS5jb3VudGVyO2Z1bmN0aW9uIHFoKGUsdCl7KHQ9PW51bGx8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBKaChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxaChlKX1mdW5jdGlvbiBZaChlLHQsbil7cmV0dXJuKHQ9aWcodCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gWGgoZSl7aWYodHlwZW9mIFN5bWJvbDxgdWAmJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVtgQEBpdGVyYXRvcmBdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIFpoKCl7dGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFFoKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gJGgoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdPT1udWxsP3t9OmFyZ3VtZW50c1t0XTt0JTI/UWgoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1loKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlFoKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KX1yZXR1cm4gZX1mdW5jdGlvbiBlZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG4scixpPXRnKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iocj0wO3I8YS5sZW5ndGg7cisrKW49YVtyXSx0LmluZGV4T2Yobik9PT0tMSYme30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYoaVtuXT1lW25dKX1yZXR1cm4gaX1mdW5jdGlvbiB0ZyhlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e307Zm9yKHZhciByIGluIGUpaWYoe30uaGFzT3duUHJvcGVydHkuY2FsbChlLHIpKXtpZih0LmluZGV4T2YocikhPT0tMSljb250aW51ZTtuW3JdPWVbcl19cmV0dXJuIG59ZnVuY3Rpb24gbmcoZSl7cmV0dXJuIEpoKGUpfHxYaChlKXx8b2coZSl8fFpoKCl9ZnVuY3Rpb24gcmcoZSx0KXtpZih0eXBlb2YgZSE9YG9iamVjdGB8fCFlKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHxgZGVmYXVsdGApO2lmKHR5cGVvZiByIT1gb2JqZWN0YClyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoYEBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuYCl9cmV0dXJuKHQ9PT1gc3RyaW5nYD9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBpZyhlKXt2YXIgdD1yZyhlLGBzdHJpbmdgKTtyZXR1cm4gdHlwZW9mIHQ9PWBzeW1ib2xgP3Q6dCtgYH1mdW5jdGlvbiBhZyhlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBhZz10eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT1gc3ltYm9sYD9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0eXBlb2YgU3ltYm9sPT1gZnVuY3Rpb25gJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT9gc3ltYm9sYDp0eXBlb2YgZX0sYWcoZSl9ZnVuY3Rpb24gb2coZSx0KXtpZihlKXtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIHFoKGUsdCk7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4gbj09PWBPYmplY3RgJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT1gTWFwYHx8bj09PWBTZXRgP0FycmF5LmZyb20oZSk6bj09PWBBcmd1bWVudHNgfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9xaChlLHQpOnZvaWQgMH19ZnVuY3Rpb24gc2coZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MHx8IUFycmF5LmlzQXJyYXkodCkmJnQ/WWgoe30sZSx0KTp7fX1mdW5jdGlvbiBjZyhlKXt2YXIgdCxuPSh0PXsiZmEtc3BpbiI6ZS5zcGluLCJmYS1wdWxzZSI6ZS5wdWxzZSwiZmEtZnciOmUuZml4ZWRXaWR0aCwiZmEtYm9yZGVyIjplLmJvcmRlciwiZmEtbGkiOmUubGlzdEl0ZW0sImZhLWludmVyc2UiOmUuaW52ZXJzZSwiZmEtZmxpcCI6ZS5mbGlwPT09ITAsImZhLWZsaXAtaG9yaXpvbnRhbCI6ZS5mbGlwPT09YGhvcml6b250YWxgfHxlLmZsaXA9PT1gYm90aGAsImZhLWZsaXAtdmVydGljYWwiOmUuZmxpcD09PWB2ZXJ0aWNhbGB8fGUuZmxpcD09PWBib3RoYH0sWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgoWWgodCxgZmEtJHtlLnNpemV9YCxlLnNpemUhPT1udWxsKSxgZmEtcm90YXRlLSR7ZS5yb3RhdGlvbn1gLGUucm90YXRpb24hPT1udWxsKSxgZmEtcm90YXRlLWJ5YCxlLnJvdGF0ZUJ5KSxgZmEtcHVsbC0ke2UucHVsbH1gLGUucHVsbCE9PW51bGwpLGBmYS1zd2FwLW9wYWNpdHlgLGUuc3dhcE9wYWNpdHkpLGBmYS1ib3VuY2VgLGUuYm91bmNlKSxgZmEtc2hha2VgLGUuc2hha2UpLGBmYS1iZWF0YCxlLmJlYXQpLGBmYS1mYWRlYCxlLmZhZGUpLGBmYS1iZWF0LWZhZGVgLGUuYmVhdEZhZGUpLFloKFloKFloKFloKFloKFloKFloKFloKFloKFloKHQsYGZhLWZsYXNoYCxlLmZsYXNoKSxgZmEtc3Bpbi1wdWxzZWAsZS5zcGluUHVsc2UpLGBmYS1zcGluLXJldmVyc2VgLGUuc3BpblJldmVyc2UpLGBmYS13aWR0aC1hdXRvYCxlLndpZHRoQXV0byksYGZhLWNhbnZhcy1zcXVhcmVgLGUuY2FudmFzU3F1YXJlKSxgZmEtY2FudmFzLXJvb215YCxlLmNhbnZhc1Jvb215KSxgZmEtZmxpcC0zNjBgLGUuZmxpcDM2MCksYGZhLWJ1enpgLGUuYnV6eiksYGZhLWZsb2F0YCxlLmZsb2F0KSxgZmEtamVsbG9gLGUuamVsbG8pLFloKFloKFloKFloKFloKHQsYGZhLXNwaW4tc25hcGAsZS5zcGluU25hcCksYGZhLXNwaW4tc25hcC00YCxlLnNwaW5TbmFwNCksYGZhLXNwaW4tc25hcC04YCxlLnNwaW5TbmFwOCksYGZhLXN3aW5nYCxlLnN3aW5nKSxgZmEtd2FnYCxlLndhZykpO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV0/ZTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSl9dmFyIGxnPXR5cGVvZiBnbG9iYWxUaGlzPGB1YD9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8YHVgP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPGB1YD9nbG9iYWw6dHlwZW9mIHNlbGY8YHVgP3NlbGY6e30sdWc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7dmFyIG49ZnVuY3Rpb24oZSx0LHIpe2lmKCFsKHQpfHxkKHQpfHxmKHQpfHxwKHQpfHxjKHQpKXJldHVybiB0O3ZhciBpLGE9MCxvPTA7aWYodSh0KSlmb3IoaT1bXSxvPXQubGVuZ3RoO2E8bzthKyspaS5wdXNoKG4oZSx0W2FdLHIpKTtlbHNlIGZvcih2YXIgcyBpbiBpPXt9LHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihpW2UocyxyKV09bihlLHRbc10scikpO3JldHVybiBpfSxyPWZ1bmN0aW9uKGUsdCl7dHx8PXt9O3ZhciBuPXQuc2VwYXJhdG9yfHxgX2Ascj10LnNwbGl0fHwvKD89W0EtWl0pLztyZXR1cm4gZS5zcGxpdChyKS5qb2luKG4pfSxpPWZ1bmN0aW9uKGUpe3JldHVybiBtKGUpP2U6KGU9ZS5yZXBsYWNlKC9bXC1fXHNdKyguKT8vZyxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKTpgYH0pLGUuc3Vic3RyKDAsMSkudG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKSl9LGE9ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtyZXR1cm4gdC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpfSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSx0KS50b0xvd2VyQ2FzZSgpfSxzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYz1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PWBmdW5jdGlvbmB9LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1PYmplY3QoZSl9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQXJyYXldYH0sZD1mdW5jdGlvbihlKXtyZXR1cm4gcy5jYWxsKGUpPT1gW29iamVjdCBEYXRlXWB9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgUmVnRXhwXWB9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHMuY2FsbChlKT09YFtvYmplY3QgQm9vbGVhbl1gfSxtPWZ1bmN0aW9uKGUpe3JldHVybiBlLT0wLGU9PT1lfSxoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmYHByb2Nlc3NgaW4gdD90LnByb2Nlc3M6dDtyZXR1cm4gdHlwZW9mIG49PWBmdW5jdGlvbmA/ZnVuY3Rpb24odCxyKXtyZXR1cm4gbih0LGUscil9OmV9LGc9e2NhbWVsaXplOmksZGVjYW1lbGl6ZTpvLHBhc2NhbGl6ZTphLGRlcGFzY2FsaXplOm8sY2FtZWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChpLHQpLGUpfSxkZWNhbWVsaXplS2V5czpmdW5jdGlvbihlLHQpe3JldHVybiBuKGgobyx0KSxlLHQpfSxwYXNjYWxpemVLZXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oaChhLHQpLGUpfSxkZXBhc2NhbGl6ZUtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNhbWVsaXplS2V5cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtlLmV4cG9ydHM/ZS5leHBvcnRzPWc6dC5odW1wcz1nfSkobGcpfSkodWcpO3ZhciBkZz11Zy5leHBvcnRzLGZnPVtgZ3JhZGllbnRGaWxsYF0scGc9W2BjbGFzc2AsYHN0eWxlYF0sbWc9W2B0eXBlYCxgc3RvcHNgLGBpZGBdO2Z1bmN0aW9uIGhnKGUpe3JldHVybiBlLnNwbGl0KGA7YCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXQuaW5kZXhPZihgOmApLHI9ZGcuY2FtZWxpemUodC5zbGljZSgwLG4pKTtyZXR1cm4gZVtyXT10LnNsaWNlKG4rMSkudHJpbSgpLGV9LHt9KX1mdW5jdGlvbiBnZyhlKXtyZXR1cm4gZS5zcGxpdCgvXHMrLykucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF09ITAsZX0se30pfWZ1bmN0aW9uIF9nKGUsdCl7cmV0dXJuIEcoYHN0b3BgLCRoKHtrZXk6YCR7dH0tJHtlLm9mZnNldH1gLG9mZnNldDplLm9mZnNldCwic3RvcC1jb2xvciI6ZS5jb2xvcn0sZS5vcGFjaXR5IT09dm9pZCAwJiZ7InN0b3Atb3BhY2l0eSI6ZS5vcGFjaXR5fSkpfWZ1bmN0aW9uIHZnKGUpe2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTt2YXIgdD0oZS5jaGlsZHJlbnx8W10pLm1hcCh2Zyk7cmV0dXJuIGUudGFnPT09YHBhdGhgJiZlLmF0dHJpYnV0ZXMmJmBmaWxsYGluIGUuYXR0cmlidXRlcz8kaCgkaCh7fSxlKSx7fSx7YXR0cmlidXRlczokaCgkaCh7fSxlLmF0dHJpYnV0ZXMpLHt9LHtmaWxsOnZvaWQgMH0pLGNoaWxkcmVuOnR9KTokaCgkaCh7fSxlKSx7fSx7Y2hpbGRyZW46dH0pfWZ1bmN0aW9uIHlnKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGU7dmFyIHI9dC5ncmFkaWVudEZpbGwsaT1yPT09dm9pZCAwP251bGw6cixhPWVnKHQsZmcpLG89aXx8YGZpbGxgaW4gbj92ZyhlKTplLHM9KG8uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHlnKGUse30se30pfSksYz1PYmplY3Qua2V5cyhvLmF0dHJpYnV0ZXN8fHt9KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmF0dHJpYnV0ZXNbdF07c3dpdGNoKHQpe2Nhc2VgY2xhc3NgOmUuY2xhc3M9Z2cobik7YnJlYWs7Y2FzZWBzdHlsZWA6ZS5zdHlsZT1oZyhuKTticmVhaztkZWZhdWx0OmUuYXR0cnNbdF09bn1yZXR1cm4gZX0se2F0dHJzOnt9LGNsYXNzOnt9LHN0eWxlOnt9fSk7bi5jbGFzczt2YXIgbD1uLnN0eWxlLHU9bD09PXZvaWQgMD97fTpsLGQ9ZWcobixwZyk7aWYoaSYmaS5pZCYmKGkudHlwZT09PWBsaW5lYXJgfHxpLnR5cGU9PT1gcmFkaWFsYCkpe3ZhciBmPWkudHlwZSxwPWkuc3RvcHMsbT1wPT09dm9pZCAwP1tdOnAsaD1pLmlkLGc9ZWcoaSxtZyksXz1HKGY9PT1gbGluZWFyYD9gbGluZWFyR3JhZGllbnRgOmByYWRpYWxHcmFkaWVudGAsJGgoJGgoe30sZykse30se2lkOmh9KSxtLm1hcChfZykpO3JldHVybiBHKG8udGFnLCRoKCRoKCRoKCRoKHt9LGEpLHt9LHtjbGFzczpjLmNsYXNzLHN0eWxlOiRoKCRoKHt9LGMuc3R5bGUpLHUpfSxjLmF0dHJzKSxkKSx7fSx7ZmlsbDpgdXJsKCMke2h9KWB9KSxbX10uY29uY2F0KG5nKHMpKSl9cmV0dXJuIEcoZS50YWcsJGgoJGgoJGgoe30sYSkse30se2NsYXNzOmMuY2xhc3Msc3R5bGU6JGgoJGgoe30sYy5zdHlsZSksdSl9LGMuYXR0cnMpLGQpLHMpfXZhciBiZz0hMTt0cnl7Ymc9ITB9Y2F0Y2h7fWZ1bmN0aW9uIHhnKCl7aWYoIWJnJiZjb25zb2xlJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09YGZ1bmN0aW9uYCl7dmFyIGU7KGU9Y29uc29sZSkuZXJyb3IuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBTZyhlKXtpZihlJiZhZyhlKT09PWBvYmplY3RgJiZlLnByZWZpeCYmZS5pY29uTmFtZSYmZS5pY29uKXJldHVybiBlO2lmKEdoLmljb24pcmV0dXJuIEdoLmljb24oZSk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7aWYoYWcoZSk9PT1gb2JqZWN0YCYmZS5wcmVmaXgmJmUuaWNvbk5hbWUpcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg9PT0yKXJldHVybntwcmVmaXg6ZVswXSxpY29uTmFtZTplWzFdfTtpZih0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJue3ByZWZpeDpgZmFzYCxpY29uTmFtZTplfX12YXIgQ2c9Rih7bmFtZTpgRm9udEF3ZXNvbWVJY29uYCxwcm9wczp7Ym9yZGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZml4ZWRXaWR0aDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsaXA6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bITAsITEsYGhvcml6b250YWxgLGB2ZXJ0aWNhbGAsYGJvdGhgXS5pbmRleE9mKGUpPi0xfX0saWNvbjp7dHlwZTpbT2JqZWN0LEFycmF5LFN0cmluZ10scmVxdWlyZWQ6ITB9LG1hc2s6e3R5cGU6W09iamVjdCxBcnJheSxTdHJpbmddLGRlZmF1bHQ6bnVsbH0sbWFza0lkOnt0eXBlOlN0cmluZyxkZWZhdWx0Om51bGx9LGxpc3RJdGVtOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0scHVsbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYHJpZ2h0YCxgbGVmdGBdLmluZGV4T2YoZSk+LTF9fSxwdWxzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHJvdGF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybls5MCwxODAsMjcwXS5pbmRleE9mKE51bWJlci5wYXJzZUludChlLDEwKSk+LTF9fSxyb3RhdGVCeTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3YXBPcGFjaXR5Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5bYDJ4c2AsYHhzYCxgc21gLGBsZ2AsYHhsYCxgMnhsYCxgMXhgLGAyeGAsYDN4YCxgNHhgLGA1eGAsYDZ4YCxgN3hgLGA4eGAsYDl4YCxgMTB4YF0uaW5kZXhPZihlKT4tMX19LHNwaW46e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx0cmFuc2Zvcm06e3R5cGU6W1N0cmluZyxPYmplY3RdLGRlZmF1bHQ6bnVsbH0sc3ltYm9sOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bnVsbH0sdGl0bGVJZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpudWxsfSxpbnZlcnNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm91bmNlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sc2hha2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxiZWF0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmFkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJlYXRGYWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZmxhc2g6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUHVsc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluUmV2ZXJzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHdpZHRoQXV0bzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1NxdWFyZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGNhbnZhc1Jvb215Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZ3JhZGllbnRGaWxsOnt0eXBlOk9iamVjdCxkZWZhdWx0Om51bGwsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZS5pZCE9YHN0cmluZ2B8fCFlLmlkPyhjb25zb2xlLndhcm4oYEZvbnRBd2Vzb21lSWNvbjogZ3JhZGllbnRGaWxsLmlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCksITEpOmUudHlwZSE9PWBsaW5lYXJgJiZlLnR5cGUhPT1gcmFkaWFsYD8oY29uc29sZS53YXJuKGBGb250QXdlc29tZUljb246IGdyYWRpZW50RmlsbC50eXBlIG11c3QgYmUgImxpbmVhciIgb3IgInJhZGlhbCJgKSwhMSk6ITB9fSxmbGlwMzYwOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYnV6ejp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZsb2F0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0samVsbG86e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxzcGluU25hcDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwNDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHNwaW5TbmFwODp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHN3aW5nOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sd2FnOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LHNldHVwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5hdHRycyxyPVcoZnVuY3Rpb24oKXtyZXR1cm4gU2coZS5pY29uKX0pLGk9VyhmdW5jdGlvbigpe3JldHVybiBzZyhgY2xhc3Nlc2AsY2coZSkpfSksYT1XKGZ1bmN0aW9uKCl7cmV0dXJuIHNnKGB0cmFuc2Zvcm1gLHR5cGVvZiBlLnRyYW5zZm9ybT09YHN0cmluZ2A/R2gudHJhbnNmb3JtKGUudHJhbnNmb3JtKTplLnRyYW5zZm9ybSl9KSxvPVcoZnVuY3Rpb24oKXtyZXR1cm4gc2coYG1hc2tgLFNnKGUubWFzaykpfSkscz1XKGZ1bmN0aW9uKCl7dmFyIHQ9JGgoJGgoJGgoJGgoe30saS52YWx1ZSksYS52YWx1ZSksby52YWx1ZSkse30se3N5bWJvbDplLnN5bWJvbCxtYXNrSWQ6ZS5tYXNrSWR9KTtyZXR1cm4gdC50aXRsZT1lLnRpdGxlLHQudGl0bGVJZD1lLnRpdGxlSWQsS2goci52YWx1ZSx0KX0pO0VyKHMsZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIHhnKGBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBpY29uKHMpYCxyLnZhbHVlLG8udmFsdWUpfSx7aW1tZWRpYXRlOiEwfSksZS5ncmFkaWVudEZpbGwmJmUuc3ltYm9sJiZ4ZyhgZ3JhZGllbnRGaWxsIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBzeW1ib2wgaXMgdHJ1ZSBhbmQgd2lsbCBiZSBpZ25vcmVkYCk7dmFyIGM9VyhmdW5jdGlvbigpe3JldHVybiBzLnZhbHVlP3lnKHMudmFsdWUuYWJzdHJhY3RbMF0se2dyYWRpZW50RmlsbDplLnN5bWJvbD9udWxsOmUuZ3JhZGllbnRGaWxsfSxuKTpudWxsfSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMudmFsdWV9fX0pLHdnPXR5cGVvZiB3aW5kb3c8YHVgLFRnLEVnPWU9PlRnPWUsRGc9U3ltYm9sKCk7ZnVuY3Rpb24gT2coZSl7cmV0dXJuIGUmJnR5cGVvZiBlPT1gb2JqZWN0YCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAmJnR5cGVvZiBlLnRvSlNPTiE9YGZ1bmN0aW9uYH12YXIga2c9dHlwZW9mIHdpbmRvdz09YG9iamVjdGAmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93OnR5cGVvZiBzZWxmPT1gb2JqZWN0YCYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOnR5cGVvZiBnbG9iYWw9PWBvYmplY3RgJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp0eXBlb2YgZ2xvYmFsVGhpcz09YG9iamVjdGA/Z2xvYmFsVGhpczp7SFRNTEVsZW1lbnQ6bnVsbH07ZnVuY3Rpb24gQWcoZSx7YXV0b0JvbTp0PSExfT17fSl7cmV0dXJuIHQmJi9eXHMqKD86dGV4dFwvXFMqfGFwcGxpY2F0aW9uXC94bWx8XFMqXC9cUypcK3htbClccyo7LipjaGFyc2V0XHMqPVxzKnV0Zi04L2kudGVzdChlLnR5cGUpP25ldyBCbG9iKFtg77u/YCxlXSx7dHlwZTplLnR5cGV9KTplfWZ1bmN0aW9uIGpnKGUsdCxuKXtsZXQgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKGBHRVRgLGUpLHIucmVzcG9uc2VUeXBlPWBibG9iYCxyLm9ubG9hZD1mdW5jdGlvbigpe0lnKHIucmVzcG9uc2UsdCxuKX0sci5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihgY291bGQgbm90IGRvd25sb2FkIGZpbGVgKX0sci5zZW5kKCl9ZnVuY3Rpb24gTWcoZSl7bGV0IHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3Qub3BlbihgSEVBRGAsZSwhMSk7dHJ5e3Quc2VuZCgpfWNhdGNoe31yZXR1cm4gdC5zdGF0dXM+PTIwMCYmdC5zdGF0dXM8PTI5OX1mdW5jdGlvbiBOZyhlKXt0cnl7ZS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KGBjbGlja2ApKX1jYXRjaHtsZXQgdD1uZXcgTW91c2VFdmVudChgY2xpY2tgLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsdmlldzp3aW5kb3csZGV0YWlsOjAsc2NyZWVuWDo4MCxzY3JlZW5ZOjIwLGNsaWVudFg6ODAsY2xpZW50WToyMCxjdHJsS2V5OiExLGFsdEtleTohMSxzaGlmdEtleTohMSxtZXRhS2V5OiExLGJ1dHRvbjowLHJlbGF0ZWRUYXJnZXQ6bnVsbH0pO2UuZGlzcGF0Y2hFdmVudCh0KX19dmFyIFBnPXR5cGVvZiBuYXZpZ2F0b3I9PWBvYmplY3RgP25hdmlnYXRvcjp7dXNlckFnZW50OmBgfSxGZz0vTWFjaW50b3NoLy50ZXN0KFBnLnVzZXJBZ2VudCkmJi9BcHBsZVdlYktpdC8udGVzdChQZy51c2VyQWdlbnQpJiYhL1NhZmFyaS8udGVzdChQZy51c2VyQWdlbnQpLElnPXdnP3R5cGVvZiBIVE1MQW5jaG9yRWxlbWVudDxgdWAmJmBkb3dubG9hZGBpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFGZz9MZzpgbXNTYXZlT3JPcGVuQmxvYmBpbiBQZz9SZzp6ZzooKT0+e307ZnVuY3Rpb24gTGcoZSx0PWBkb3dubG9hZGAsbil7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgYWApO3IuZG93bmxvYWQ9dCxyLnJlbD1gbm9vcGVuZXJgLHR5cGVvZiBlPT1gc3RyaW5nYD8oci5ocmVmPWUsci5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/Tmcocik6TWcoci5ocmVmKT9qZyhlLHQsbik6KHIudGFyZ2V0PWBfYmxhbmtgLE5nKHIpKSk6KHIuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtVUkwucmV2b2tlT2JqZWN0VVJMKHIuaHJlZil9LDRlNCksc2V0VGltZW91dChmdW5jdGlvbigpe05nKHIpfSwwKSl9ZnVuY3Rpb24gUmcoZSx0PWBkb3dubG9hZGAsbil7aWYodHlwZW9mIGU9PWBzdHJpbmdgKXtpZihNZyhlKSlqZyhlLHQsbik7ZWxzZXtsZXQgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGBhYCk7dC5ocmVmPWUsdC50YXJnZXQ9YF9ibGFua2Asc2V0VGltZW91dChmdW5jdGlvbigpe05nKHQpfSl9fWVsc2UgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoQWcoZSxuKSx0KX1mdW5jdGlvbiB6ZyhlLHQsbixyKXtpZihyfHw9b3BlbihgYCxgX2JsYW5rYCksciYmKHIuZG9jdW1lbnQudGl0bGU9ci5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1gZG93bmxvYWRpbmcuLi5gKSx0eXBlb2YgZT09YHN0cmluZ2ApcmV0dXJuIGpnKGUsdCxuKTtsZXQgaT1lLnR5cGU9PT1gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtYCxhPS9jb25zdHJ1Y3Rvci9pLnRlc3QoU3RyaW5nKGtnLkhUTUxFbGVtZW50KSl8fGBzYWZhcmlgaW4ga2csbz0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChvfHxpJiZhfHxGZykmJnR5cGVvZiBGaWxlUmVhZGVyPGB1YCl7bGV0IHQ9bmV3IEZpbGVSZWFkZXI7dC5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXtsZXQgZT10LnJlc3VsdDtpZih0eXBlb2YgZSE9YHN0cmluZ2ApdGhyb3cgcj1udWxsLEVycm9yKGBXcm9uZyByZWFkZXIucmVzdWx0IHR5cGVgKTtlPW8/ZTplLnJlcGxhY2UoL15kYXRhOlteO10qOy8sYGRhdGE6YXR0YWNobWVudC9maWxlO2ApLHI/ci5sb2NhdGlvbi5ocmVmPWU6bG9jYXRpb24uYXNzaWduKGUpLHI9bnVsbH0sdC5yZWFkQXNEYXRhVVJMKGUpfWVsc2V7bGV0IHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChlKTtyP3IubG9jYXRpb24uYXNzaWduKHQpOmxvY2F0aW9uLmhyZWY9dCxyPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe1VSTC5yZXZva2VPYmplY3RVUkwodCl9LDRlNCl9fXZhcnthc3NpZ246Qmd9PU9iamVjdDtmdW5jdGlvbiBWZygpe2xldCBlPVBlKCEwKSx0PWUucnVuKCgpPT5NKHt9KSksbj1bXSxyPVtdLGk9c24oe2luc3RhbGwoZSl7RWcoaSksaS5fYT1lLGUucHJvdmlkZShEZyxpKSxlLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRwaW5pYT1pLHIuZm9yRWFjaChlPT5uLnB1c2goZSkpLHI9W119LHVzZShlKXtyZXR1cm4gdGhpcy5fYT9uLnB1c2goZSk6ci5wdXNoKGUpLHRoaXN9LF9wOm4sX2E6bnVsbCxfZTplLF9zOm5ldyBNYXAsc3RhdGU6dH0pO3JldHVybiBpfXZhciBIZz0oKT0+e307ZnVuY3Rpb24gVWcoZSx0LG4scj1IZyl7ZS5hZGQodCk7bGV0IGk9KCk9PntlLmRlbGV0ZSh0KSYmcigpfTtyZXR1cm4hbiYmRmUoKSYmSWUoaSksaX1mdW5jdGlvbiBXZyhlLC4uLnQpe2UuZm9yRWFjaChlPT57ZSguLi50KX0pfXZhciBHZz1lPT5lKCksS2c9U3ltYm9sKCkscWc9U3ltYm9sKCk7ZnVuY3Rpb24gSmcoZSx0KXtlIGluc3RhbmNlb2YgTWFwJiZ0IGluc3RhbmNlb2YgTWFwP3QuZm9yRWFjaCgodCxuKT0+ZS5zZXQobix0KSk6ZSBpbnN0YW5jZW9mIFNldCYmdCBpbnN0YW5jZW9mIFNldCYmdC5mb3JFYWNoKGUuYWRkLGUpO2ZvcihsZXQgbiBpbiB0KXtpZighT2JqZWN0Lmhhc093bih0LG4pKWNvbnRpbnVlO2xldCByPXRbbl0saT1lW25dO2Vbbl09T2coaSkmJk9nKHIpJiZPYmplY3QuaGFzT3duKGUsbikmJiFqKHIpJiYhbm4ocik/SmcoaSxyKTpyfXJldHVybiBlfXZhciBZZz1TeW1ib2woKTtmdW5jdGlvbiBYZyhlKXtyZXR1cm4hZXx8dHlwZW9mIGUhPWBvYmplY3RgfHwhT2JqZWN0Lmhhc093bihlLFlnKX12YXJ7YXNzaWduOlpnfT1PYmplY3Q7ZnVuY3Rpb24gUWcoZSl7cmV0dXJuISEoaihlKSYmZS5lZmZlY3QpfWZ1bmN0aW9uICRnKGUsdCxuLHIpe2xldHtzdGF0ZTppLGFjdGlvbnM6YSxnZXR0ZXJzOm99PXQscz1uLnN0YXRlLnZhbHVlW2VdLGM7ZnVuY3Rpb24gbCgpe3JldHVybiBzfHwobi5zdGF0ZS52YWx1ZVtlXT1pP2koKTp7fSksWmcoeW4obi5zdGF0ZS52YWx1ZVtlXSksYSxPYmplY3Qua2V5cyhvfHx7fSkucmVkdWNlKCh0LHIpPT4odFtyXT1zbihXKCgpPT57RWcobik7bGV0IHQ9bi5fcy5nZXQoZSk7cmV0dXJuIG9bcl0uY2FsbCh0LHQpfSkpLHQpLHt9KSl9cmV0dXJuIGM9ZV8oZSxsLHQsbixyLCEwKSxjfWZ1bmN0aW9uIGVfKGUsdCxuPXt9LHIsaSxhKXtsZXQgbyxzPVpnKHthY3Rpb25zOnt9fSxuKSxjPXtkZWVwOiEwfSxsLHUsZD1uZXcgU2V0LGY9bmV3IFNldCxwLG09ci5zdGF0ZS52YWx1ZVtlXTshYSYmIW0mJihyLnN0YXRlLnZhbHVlW2VdPXt9KTtsZXQgaDtmdW5jdGlvbiBnKHQpe2xldCBuO2w9dT0hMSx0eXBlb2YgdD09YGZ1bmN0aW9uYD8odChyLnN0YXRlLnZhbHVlW2VdKSxuPXt0eXBlOmBwYXRjaCBmdW5jdGlvbmAsc3RvcmVJZDplLGV2ZW50czpwfSk6KEpnKHIuc3RhdGUudmFsdWVbZV0sdCksbj17dHlwZTpgcGF0Y2ggb2JqZWN0YCxwYXlsb2FkOnQsc3RvcmVJZDplLGV2ZW50czpwfSk7bGV0IGk9aD1TeW1ib2woKTtRbigpLnRoZW4oKCk9PntoPT09aSYmKGw9ITApfSksdT0hMCxXZyhkLG4sci5zdGF0ZS52YWx1ZVtlXSl9bGV0IF89YT9mdW5jdGlvbigpe2xldHtzdGF0ZTplfT1uLHQ9ZT9lKCk6e307dGhpcy4kcGF0Y2goZT0+e1pnKGUsdCl9KX06SGc7ZnVuY3Rpb24gdigpe28uc3RvcCgpLGQuY2xlYXIoKSxmLmNsZWFyKCksci5fcy5kZWxldGUoZSl9bGV0IHk9KHQsbj1gYCk9PntpZihLZyBpbiB0KXJldHVybiB0W3FnXT1uLHQ7bGV0IGk9ZnVuY3Rpb24oKXtFZyhyKTtsZXQgbj1BcnJheS5mcm9tKGFyZ3VtZW50cyksYT1uZXcgU2V0LG89bmV3IFNldDtmdW5jdGlvbiBzKGUpe2EuYWRkKGUpfWZ1bmN0aW9uIGMoZSl7by5hZGQoZSl9V2coZix7YXJnczpuLG5hbWU6aVtxZ10sc3RvcmU6YixhZnRlcjpzLG9uRXJyb3I6Y30pO2xldCBsO3RyeXtsPXQuYXBwbHkodGhpcyYmdGhpcy4kaWQ9PT1lP3RoaXM6YixuKX1jYXRjaChlKXt0aHJvdyBXZyhvLGUpLGV9cmV0dXJuIGwgaW5zdGFuY2VvZiBQcm9taXNlP2wudGhlbihlPT4oV2coYSxlKSxlKSkuY2F0Y2goZT0+KFdnKG8sZSksUHJvbWlzZS5yZWplY3QoZSkpKTooV2coYSxsKSxsKX07cmV0dXJuIGlbS2ddPSEwLGlbcWddPW4saX0sYj1adCh7X3A6ciwkaWQ6ZSwkb25BY3Rpb246VWcuYmluZChudWxsLGYpLCRwYXRjaDpnLCRyZXNldDpfLCRzdWJzY3JpYmUodCxuPXt9KXtpZihkLmhhcyh0KSlyZXR1cm4gSGc7bGV0IGk9VWcoZCx0LG4uZGV0YWNoZWQsKCk9PmEoKSksYT1vLnJ1bigoKT0+RXIoKCk9PnIuc3RhdGUudmFsdWVbZV0scj0+eyhuLmZsdXNoPT09YHN5bmNgP3U6bCkmJnQoe3N0b3JlSWQ6ZSx0eXBlOmBkaXJlY3RgLGV2ZW50czpwfSxyKX0sWmcoe30sYyxuKSkpO3JldHVybiBpfSwkZGlzcG9zZTp2fSk7ci5fcy5zZXQoZSxiKTtsZXQgeD0oci5fYSYmci5fYS5ydW5XaXRoQ29udGV4dHx8R2cpKCgpPT5yLl9lLnJ1bigoKT0+KG89UGUoKSkucnVuKCgpPT50KHthY3Rpb246eX0pKSkpO2ZvcihsZXQgdCBpbiB4KXtsZXQgbj14W3RdO2oobikmJiFRZyhuKXx8bm4obik/YXx8KG0mJlhnKG4pJiYoaihuKT9uLnZhbHVlPW1bdF06KChuIGluc3RhbmNlb2YgU2V0fHxuIGluc3RhbmNlb2YgTWFwKSYmbi5jbGVhcigpLEpnKG4sbVt0XSkpKSxyLnN0YXRlLnZhbHVlW2VdW3RdPW4pOnR5cGVvZiBuPT1gZnVuY3Rpb25gJiYoeFt0XT15KG4sdCkscy5hY3Rpb25zW3RdPW4pfXJldHVybiBaZyhiLHgpLFpnKEEoYikseCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIiRzdGF0ZSIse2dldDooKT0+ci5zdGF0ZS52YWx1ZVtlXSxzZXQ6ZT0+e2codD0+e1pnKHQsZSl9KX19KSxyLl9wLmZvckVhY2goZT0+e2xldCB0PW8ucnVuKCgpPT5lKHtzdG9yZTpiLGFwcDpyLl9hLHBpbmlhOnIsb3B0aW9uczpzfSkpO1pnKGIsdCl9KSxtJiZhJiZuLmh5ZHJhdGUmJm4uaHlkcmF0ZShiLiRzdGF0ZSxtKSxsPSEwLHU9ITAsYn1mdW5jdGlvbiB0XyhlLHQsbil7bGV0IHIsaT10eXBlb2YgdD09YGZ1bmN0aW9uYDtyPWk/bjp0O2Z1bmN0aW9uIGEobixhKXtsZXQgbz1icigpO3JldHVybiBufHw9bz95cihEZyxudWxsKTpudWxsLG4mJkVnKG4pLG49VGcsbi5fcy5oYXMoZSl8fChpP2VfKGUsdCxyLG4pOiRnKGUscixuKSksbi5fcy5nZXQoZSl9cmV0dXJuIGEuJGlkPWUsYX12YXIgbl89e3ByZWZpeDpgZmFiYCxpY29uTmFtZTpgZ2l0aHViYCxpY29uOls1MTIsNTEyLFtdLGBmMDliYCxgTTIxNi41IDM2Mi41Yy02Ni04LTExMi41LTU1LjUtMTEyLjUtMTE3IDAtMjUgOS01MiAyNC03MC02LjUtMTYuNS01LjUtNTEuNSAyLTY2IDIwLTIuNSA0NyA4IDYzIDIyLjUgMTktNiAzOS05IDYzLjUtOXM0NC41IDMgNjIuNSA4LjVjMTUuNS0xNCA0My0yNC41IDYzLTIyIDcgMTMuNSA4IDQ4LjUgMS41IDY1LjUgMTYgMTkgMjQuNSA0NC41IDI0LjUgNzAuNSAwIDYxLjUtNDYuNSAxMDgtMTEzLjUgMTE2LjUgMTcgMTEgMjguNSAzNSAyOC41IDYyLjVsMCA1MkMzMjMgNDkxLjUgMzM1LjUgNTAwIDM1MC41IDQ5NCA0NDEgNDU5LjUgNTEyIDM2OSA1MTIgMjU3IDUxMiAxMTUuNSAzOTcgMCAyNTUuNSAwUzAgMTE1LjUgMCAyNTdjMCAxMTEgNzAuNSAyMDMgMTY1LjUgMjM3LjUgMTMuNSA1IDI2LjUtNCAyNi41LTE3LjVsMC00MGMtNyAzLTE2IDUtMjQgNS0zMyAwLTUyLjUtMTgtNjYuNS01MS41LTUuNS0xMy41LTExLjUtMjEuNS0yMy0yMy02LS41LTgtMy04LTYgMC02IDEwLTEwLjUgMjAtMTAuNSAxNC41IDAgMjcgOSA0MCAyNy41IDEwIDE0LjUgMjAuNSAyMSAzMyAyMXMyMC41LTQuNSAzMi0xNmM4LjUtOC41IDE1LTE2IDIxLTIxemBdfSxyXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBtYWduaWZ5aW5nLWdsYXNzYCxpY29uOls1MTIsNTEyLFsxMjgyNjksYHNlYXJjaGBdLGBmMDAyYCxgTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjA4IDM1MmExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6YF19LGlfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGtleWAsaWNvbjpbNTEyLDUxMixbMTI4MjczXSxgZjA4NGAsYE0zMzYgMzUyYzk3LjIgMCAxNzYtNzguOCAxNzYtMTc2UzQzMy4yIDAgMzM2IDAgMTYwIDc4LjggMTYwIDE3NmMwIDE4LjcgMi45IDM2LjggOC4zIDUzLjdMNyAzOTFjLTQuNSA0LjUtNyAxMC42LTcgMTdsMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDAgNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQwIDQwIDBjNi40IDAgMTIuNS0yLjUgMTctN2wzMy4zLTMzLjNjMTYuOSA1LjQgMzUgOC4zIDUzLjcgOC4zek0zNzYgOTZhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwemBdfSxhXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LXVwYCxpY29uOlszODQsNTEyLFtgc29ydC1hc2NgXSxgZjBkZWAsYE0zMiAyMjRjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhTLjIgMTc4LjUgOS40IDE2OS40bDE2MC0xNjBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTYwIDE2MGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzNjQuOSAyMjQgMzUyIDIyNEwzMiAyMjR6YF19LG9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZWAsaWNvbjpbNTc2LDUxMixbMTI4MDY1XSxgZjA2ZWAsYE0yODggMzJjLTgwLjggMC0xNDUuNSAzNi44LTE5Mi42IDgwLjYtNDYuOCA0My41LTc4LjEgOTUuNC05MyAxMzEuMS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjZzMTQ1LjUtMzYuOCAxOTIuNi04MC42YzQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42ek0xNDQgMjU2YTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE0NC02NGMwIDM1LjMtMjguNyA2NC02NCA2NC0xMS41IDAtMjIuMy0zLTMxLjctOC40LTEgMTAuOS0uMSAyMi4xIDIuOSAzMy4yIDEzLjcgNTEuMiA2Ni40IDgxLjYgMTE3LjYgNjcuOXM4MS42LTY2LjQgNjcuOS0xMTcuNmMtMTIuMi00NS43LTU1LjUtNzQuOC0xMDEuMS03MC44IDUuMyA5LjMgOC40IDIwLjEgOC40IDMxLjd6YF19LHNfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZXZyb24tdXBgLGljb246WzQ0OCw1MTIsW10sYGYwNzdgLGBNMjAxLjQgMTA1LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTkyIDE5MmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwyMjQgMTczLjMgNTQuNiAzNDIuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsMTkyLTE5MnpgXX0sY189e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgY2lyY2xlLXhtYXJrYCxpY29uOls1MTIsNTEyLFs2MTUzMixgdGltZXMtY2lyY2xlYCxgeG1hcmstY2lyY2xlYF0sYGYwNTdgLGBNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NyAxNjdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNTUgNTUgNTUtNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC01NSA1NSA1NSA1NWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC01NS01NS01NSA1NWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1NS01NS01NS01NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6YF19LGxfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1leGNsYW1hdGlvbmAsaWNvbjpbNTEyLDUxMixbYGV4Y2xhbWF0aW9uLWNpcmNsZWBdLGBmMDZhYCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyem0wLTE5MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjYgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LHVfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNoZWNrYCxpY29uOls0NDgsNTEyLFsxMDAwMywxMDAwNF0sYGYwMGNgLGBNNDM0LjggNzAuMWMxNC4zIDEwLjQgMTcuNSAzMC40IDcuMSA0NC43bC0yNTYgMzUyYy01LjUgNy42LTE0IDEyLjMtMjMuNCAxMy4xcy0xOC41LTIuNy0yNS4xLTkuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxMDEuNSAxMDEuNSAyMzQtMzIxLjdjMTAuNC0xNC4zIDMwLjQtMTcuNSA0NC43LTcuMXpgXX0sZF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgc29ydGAsaWNvbjpbMzg0LDUxMixbYHVuc29ydGVkYF0sYGYwZGNgLGBNMi40IDIwNC4yYzUgMTIgMTYuNiAxOS44IDI5LjYgMTkuOGwzMjAgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0Ljl6bTAgMTAzLjVjLTUgMTItMi4yIDI1LjcgNi45IDM0LjlsMTYwIDE2MGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzM2NC45IDI4OCAzNTIgMjg4TDMyIDI4OGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHpgXX0sZl89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgeG1hcmtgLGljb246WzM4NCw1MTIsWzEyODQ3MywxMDAwNSwxMDAwNiwxMDA2MCwyMTUsYGNsb3NlYCxgbXVsdGlwbHlgLGByZW1vdmVgLGB0aW1lc2BdLGBmMDBkYCxgTTU1LjEgNzMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTQ3LjIgMjU2IDkuOSAzOTMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIuNSAzMDEuMyAzMjkuOSA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDIzNy44IDI1NiAzNzUuMSAxMTguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwxOTIuNSAyMTAuNyA1NS4xIDczLjR6YF19LHBfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNpcmNsZS1jaGVja2AsaWNvbjpbNTEyLDUxMixbNjE1MzMsYGNoZWNrLWNpcmNsZWBdLGBmMDU4YCxgTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyek0zNzQgMTQ1LjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDIyMS4xIDMxNS4yIDE2OSAyNjMuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOCA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM3OS4zIDE3OS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41emBdfSxtXz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBjaGV2cm9uLWRvd25gLGljb246WzQ0OCw1MTIsW10sYGYwNzhgLGBNMjAxLjQgNDA2LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTkyLTE5MmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyMjQgMzM4LjcgNTQuNiAxNjkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsMTkyIDE5MnpgXX0saF89e3ByZWZpeDpgZmFzYCxpY29uTmFtZTpgdHJpYW5nbGUtZXhjbGFtYXRpb25gLGljb246WzUxMiw1MTIsWzk4ODgsYGV4Y2xhbWF0aW9uLXRyaWFuZ2xlYCxgd2FybmluZ2BdLGBmMDcxYCxgTTI1NiAwYzE0LjcgMCAyOC4yIDguMSAzNS4yIDIxbDIxNiA0MDBjNi43IDEyLjQgNi40IDI3LjQtLjggMzkuNVM0ODYuMSA0ODAgNDcyIDQ4MEw0MCA0ODBjLTE0LjEgMC0yNy4yLTcuNC0zNC40LTE5LjVzLTcuNS0yNy4xLS44LTM5LjVsMjE2LTQwMGM3LTEyLjkgMjAuNS0yMSAzNS4yLTIxem0wIDM1MmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAtMTkyYy0xOC4yIDAtMzIuNyAxNS41LTMxLjQgMzMuN2w3LjQgMTA0Yy45IDEyLjUgMTEuNCAyMi4zIDIzLjkgMjIuMyAxMi42IDAgMjMtOS43IDIzLjktMjIuM2w3LjQtMTA0YzEuMy0xOC4yLTEzLjEtMzMuNy0zMS40LTMzLjd6YF19LGdfPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGNvcHlgLGljb246WzQ0OCw1MTIsW10sYGYwYzVgLGBNMTkyIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjAwLjZjMC0xNy40LTcuMS0zNC4xLTE5LjctNDYuMkwzNzAuNiAxNy44QzM1OC43IDYuNCAzNDIuOCAwIDMyNi4zIDBMMTkyIDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNi02NCAwIDAgMTYtMTkyIDAgMC0yNTYgMTYgMCAwLTY0LTE2IDB6YF19LF9fPXtwcmVmaXg6YGZhc2AsaWNvbk5hbWU6YGV5ZS1zbGFzaGAsaWNvbjpbNTc2LDUxMixbXSxgZjA3MGAsYE00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC05Ni40LTk2LjRjMi43LTIuNCA1LjQtNC44IDgtNy4yIDQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjEgMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjYtMTQuOS0zNS43LTQ2LjItODcuNy05My0xMzEuMS00Ny4xLTQzLjctMTExLjgtODAuNi0xOTIuNi04MC42LTU2LjggMC0xMDUuNiAxOC4yLTE0NiA0NC4yTDQxLTI0Ljl6TTIwNC41IDEzOC43YzIzLjUtMTYuOCA1Mi40LTI2LjcgODMuNS0yNi43IDc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0IDAgMzEuMS05LjkgNTkuOS0yNi43IDgzLjVsLTM0LjctMzQuN2MxMi43LTIxLjQgMTctNDcuNyAxMC4xLTczLjctMTMuNy01MS4yLTY2LjQtODEuNi0xMTcuNi02Ny45LTguNiAyLjMtMTYuNyA1LjctMjQgMTBsLTM0LjctMzQuN3pNMzI1LjMgMzk1LjFjLTExLjkgMy4yLTI0LjQgNC45LTM3LjMgNC45LTc5LjUgMC0xNDQtNjQuNS0xNDQtMTQ0IDAtMTIuOSAxLjctMjUuNCA0LjktMzcuM0w2OS40IDEzOS4yYy0zMi42IDM2LjgtNTUgNzUuOC02Ni45IDEwNC41LTMuMyA3LjktMy4zIDE2LjcgMCAyNC42IDE0LjkgMzUuNyA0Ni4yIDg3LjcgOTMgMTMxLjEgNDcuMSA0My43IDExMS44IDgwLjYgMTkyLjYgODAuNiAzNy4zIDAgNzEuMi03LjkgMTAxLjUtMjAuNmwtNjQuMi02NC4yemBdfSx2Xz17cHJlZml4OmBmYXNgLGljb25OYW1lOmBzb3J0LWRvd25gLGljb246WzM4NCw1MTIsW2Bzb3J0LWRlc2NgXSxgZjBkZGAsYE0zMiAyODhjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjIgMzMzLjUgOS40IDM0Mi42bDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzNjQuOSAyODggMzUyIDI4OEwzMiAyODh6YF19O2Z1bmN0aW9uIHlfKGUpe3ZhciB0LG4scj1gYDtpZih0eXBlb2YgZT09YHN0cmluZ2B8fHR5cGVvZiBlPT1gbnVtYmVyYClyKz1lO2Vsc2UgaWYodHlwZW9mIGU9PWBvYmplY3RgKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgaT1lLmxlbmd0aDtmb3IodD0wO3Q8aTt0KyspZVt0XSYmKG49eV8oZVt0XSkpJiYociYmKHIrPWAgYCkscis9bil9ZWxzZSBmb3IobiBpbiBlKWVbbl0mJihyJiYocis9YCBgKSxyKz1uKX1yZXR1cm4gcn1mdW5jdGlvbiBiXygpe2Zvcih2YXIgZSx0LG49MCxyPWBgLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKShlPWFyZ3VtZW50c1tuXSkmJih0PXlfKGUpKSYmKHImJihyKz1gIGApLHIrPXQpO3JldHVybiByfXZhciB4Xz1lPT50eXBlb2YgZT09YGJvb2xlYW5gP2Ake2V9YDplPT09MD9gMGA6ZSxTXz1iXyxDXz0oZSx0KT0+bj0+e2lmKHQ/LnZhcmlhbnRzPT1udWxsKXJldHVybiBTXyhlLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSk7bGV0e3ZhcmlhbnRzOnIsZGVmYXVsdFZhcmlhbnRzOml9PXQsYT1PYmplY3Qua2V5cyhyKS5tYXAoZT0+e2xldCB0PW4/LltlXSxhPWk/LltlXTtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtsZXQgbz14Xyh0KXx8eF8oYSk7cmV0dXJuIHJbZV1bb119KSxvPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgoZSx0KT0+e2xldFtuLHJdPXQ7cmV0dXJuIHI9PT12b2lkIDB8fChlW25dPXIpLGV9LHt9KTtyZXR1cm4gU18oZSxhLHQ/LmNvbXBvdW5kVmFyaWFudHM/LnJlZHVjZSgoZSx0KT0+e2xldHtjbGFzczpuLGNsYXNzTmFtZTpyLC4uLmF9PXQ7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGEpLmV2ZXJ5KGU9PntsZXRbdCxuXT1lO3JldHVybiBBcnJheS5pc0FycmF5KG4pP24uaW5jbHVkZXMoey4uLmksLi4ub31bdF0pOnsuLi5pLC4uLm99W3RdPT09bn0pP1suLi5lLG4scl06ZX0sW10pLG4/LmNsYXNzLG4/LmNsYXNzTmFtZSl9LHdfPShlLHQpPT57bGV0IG49QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyluW2UubGVuZ3RoK3JdPXRbcl07cmV0dXJuIG59LFRfPShlLHQpPT4oe2NsYXNzR3JvdXBJZDplLHZhbGlkYXRvcjp0fSksRV89KGU9bmV3IE1hcCx0PW51bGwsbik9Pih7bmV4dFBhcnQ6ZSx2YWxpZGF0b3JzOnQsY2xhc3NHcm91cElkOm59KSxEXz1gLWAsT189W10sa189YGFyYml0cmFyeS4uYCxBXz1lPT57bGV0IHQ9Tl8oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtyZXR1cm57Z2V0Q2xhc3NHcm91cElkOmU9PntpZihlLnN0YXJ0c1dpdGgoYFtgKSYmZS5lbmRzV2l0aChgXWApKXJldHVybiBNXyhlKTtsZXQgbj1lLnNwbGl0KERfKTtyZXR1cm4gal8obiwrKG5bMF09PT1gYCYmbi5sZW5ndGg+MSksdCl9LGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczooZSx0KT0+e2lmKHQpe2xldCB0PXJbZV0saT1uW2VdO3JldHVybiB0P2k/d18oaSx0KTp0Oml8fE9ffXJldHVybiBuW2VdfHxPX319fSxqXz0oZSx0LG4pPT57aWYoZS5sZW5ndGgtdD09PTApcmV0dXJuIG4uY2xhc3NHcm91cElkO2xldCByPWVbdF0saT1uLm5leHRQYXJ0LmdldChyKTtpZihpKXtsZXQgbj1qXyhlLHQrMSxpKTtpZihuKXJldHVybiBufWxldCBhPW4udmFsaWRhdG9ycztpZihhPT09bnVsbClyZXR1cm47bGV0IG89dD09PTA/ZS5qb2luKERfKTplLnNsaWNlKHQpLmpvaW4oRF8pLHM9YS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxzO2UrKyl7bGV0IHQ9YVtlXTtpZih0LnZhbGlkYXRvcihvKSlyZXR1cm4gdC5jbGFzc0dyb3VwSWR9fSxNXz1lPT5lLnNsaWNlKDEsLTEpLmluZGV4T2YoYDpgKT09PS0xP3ZvaWQgMDooKCk9PntsZXQgdD1lLnNsaWNlKDEsLTEpLG49dC5pbmRleE9mKGA6YCkscj10LnNsaWNlKDAsbik7cmV0dXJuIHI/a18rcjp2b2lkIDB9KSgpLE5fPWU9PntsZXR7dGhlbWU6dCxjbGFzc0dyb3VwczpufT1lO3JldHVybiBQXyhuLHQpfSxQXz0oZSx0KT0+e2xldCBuPUVfKCk7Zm9yKGxldCByIGluIGUpe2xldCBpPWVbcl07Rl8oaSxuLHIsdCl9cmV0dXJuIG59LEZfPShlLHQsbixyKT0+e2xldCBpPWUubGVuZ3RoO2ZvcihsZXQgYT0wO2E8aTthKyspe2xldCBpPWVbYV07SV8oaSx0LG4scil9fSxJXz0oZSx0LG4scik9PntpZih0eXBlb2YgZT09YHN0cmluZ2Ape0xfKGUsdCxuKTtyZXR1cm59aWYodHlwZW9mIGU9PWBmdW5jdGlvbmApe1JfKGUsdCxuLHIpO3JldHVybn16XyhlLHQsbixyKX0sTF89KGUsdCxuKT0+e2xldCByPWU9PT1gYD90OkJfKHQsZSk7ci5jbGFzc0dyb3VwSWQ9bn0sUl89KGUsdCxuLHIpPT57aWYoVl8oZSkpe0ZfKGUociksdCxuLHIpO3JldHVybn10LnZhbGlkYXRvcnM9PT1udWxsJiYodC52YWxpZGF0b3JzPVtdKSx0LnZhbGlkYXRvcnMucHVzaChUXyhuLGUpKX0sel89KGUsdCxuLHIpPT57bGV0IGk9T2JqZWN0LmVudHJpZXMoZSksYT1pLmxlbmd0aDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtsZXRbYSxvXT1pW2VdO0ZfKG8sQl8odCxhKSxuLHIpfX0sQl89KGUsdCk9PntsZXQgbj1lLHI9dC5zcGxpdChEXyksaT1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgdD1yW2VdLGk9bi5uZXh0UGFydC5nZXQodCk7aXx8KGk9RV8oKSxuLm5leHRQYXJ0LnNldCh0LGkpKSxuPWl9cmV0dXJuIG59LFZfPWU9PmBpc1RoZW1lR2V0dGVyYGluIGUmJmUuaXNUaGVtZUdldHRlcj09PSEwLEhfPWU9PntpZihlPDEpcmV0dXJue2dldDooKT0+dm9pZCAwLHNldDooKT0+e319O2xldCB0PTAsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9T2JqZWN0LmNyZWF0ZShudWxsKSxpPShpLGEpPT57bltpXT1hLHQrKyx0PmUmJih0PTAscj1uLG49T2JqZWN0LmNyZWF0ZShudWxsKSl9O3JldHVybntnZXQoZSl7bGV0IHQ9bltlXTtpZih0IT09dm9pZCAwKXJldHVybiB0O2lmKCh0PXJbZV0pIT09dm9pZCAwKXJldHVybiBpKGUsdCksdH0sc2V0KGUsdCl7ZSBpbiBuP25bZV09dDppKGUsdCl9fX0sVV89YCFgLFdfPWA6YCxHXz1bXSxLXz0oZSx0LG4scixpKT0+KHttb2RpZmllcnM6ZSxoYXNJbXBvcnRhbnRNb2RpZmllcjp0LGJhc2VDbGFzc05hbWU6bixtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOnIsaXNFeHRlcm5hbDppfSkscV89ZT0+e2xldHtwcmVmaXg6dCxleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZTpufT1lLHI9ZT0+e2xldCB0PVtdLG49MCxyPTAsaT0wLGEsbz1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgbz1lW3NdO2lmKG49PT0wJiZyPT09MCl7aWYobz09PVdfKXt0LnB1c2goZS5zbGljZShpLHMpKSxpPXMrMTtjb250aW51ZX1pZihvPT09YC9gKXthPXM7Y29udGludWV9fW89PT1gW2A/bisrOm89PT1gXWA/bi0tOm89PT1gKGA/cisrOm89PT1gKWAmJnItLX1sZXQgcz10Lmxlbmd0aD09PTA/ZTplLnNsaWNlKGkpLGM9cyxsPSExO3MuZW5kc1dpdGgoVV8pPyhjPXMuc2xpY2UoMCwtMSksbD0hMCk6cy5zdGFydHNXaXRoKFVfKSYmKGM9cy5zbGljZSgxKSxsPSEwKTtsZXQgdT1hJiZhPmk/YS1pOnZvaWQgMDtyZXR1cm4gS18odCxsLGMsdSl9O2lmKHQpe2xldCBlPXQrV18sbj1yO3I9dD0+dC5zdGFydHNXaXRoKGUpP24odC5zbGljZShlLmxlbmd0aCkpOktfKEdfLCExLHQsdm9pZCAwLCEwKX1pZihuKXtsZXQgZT1yO3I9dD0+bih7Y2xhc3NOYW1lOnQscGFyc2VDbGFzc05hbWU6ZX0pfXJldHVybiByfSxKXz1lPT57bGV0IHQ9bmV3IE1hcDtyZXR1cm4gZS5vcmRlclNlbnNpdGl2ZU1vZGlmaWVycy5mb3JFYWNoKChlLG4pPT57dC5zZXQoZSwxZTYrbil9KSxlPT57bGV0IG49W10scj1bXTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IGE9ZVtpXSxvPWFbMF09PT1gW2Ascz10LmhhcyhhKTtvfHxzPyhyLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpLHI9W10pLG4ucHVzaChhKSk6ci5wdXNoKGEpfXJldHVybiByLmxlbmd0aD4wJiYoci5zb3J0KCksbi5wdXNoKC4uLnIpKSxufX0sWV89ZT0+KHtjYWNoZTpIXyhlLmNhY2hlU2l6ZSkscGFyc2VDbGFzc05hbWU6cV8oZSksc29ydE1vZGlmaWVyczpKXyhlKSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpYXyhlKSwuLi5BXyhlKX0pLFhfPWU9PntsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLG49ZS5wb3N0Zml4TG9va3VwQ2xhc3NHcm91cHM7aWYobilmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyl0W25bZV1dPSEwO3JldHVybiB0fSxaXz0vXHMrLyxRXz0oZSx0KT0+e2xldHtwYXJzZUNsYXNzTmFtZTpuLGdldENsYXNzR3JvdXBJZDpyLGdldENvbmZsaWN0aW5nQ2xhc3NHcm91cElkczppLHNvcnRNb2RpZmllcnM6YSxwb3N0Zml4TG9va3VwQ2xhc3NHcm91cElkczpvfT10LHM9W10sYz1lLnRyaW0oKS5zcGxpdChaXyksbD1gYDtmb3IobGV0IGU9Yy5sZW5ndGgtMTtlPj0wOy0tZSl7bGV0IHQ9Y1tlXSx7aXNFeHRlcm5hbDp1LG1vZGlmaWVyczpkLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpwLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246bX09bih0KTtpZih1KXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9bGV0IGg9ISFtLGc7aWYoaCl7Zz1yKHAuc3Vic3RyaW5nKDAsbSkpO2xldCBlPWcmJm9bZ10/cihwKTp2b2lkIDA7ZSYmZSE9PWcmJihnPWUsaD0hMSl9ZWxzZSBnPXIocCk7aWYoIWcpe2lmKCFoKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aWYoZz1yKHApLCFnKXtsPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCk7Y29udGludWV9aD0hMX1sZXQgXz1kLmxlbmd0aD09PTA/YGA6ZC5sZW5ndGg9PT0xP2RbMF06YShkKS5qb2luKGA6YCksdj1mP18rVV86Xyx5PXYrZztpZihzLmluZGV4T2YoeSk+LTEpY29udGludWU7cy5wdXNoKHkpO2xldCBiPWkoZyxoKTtmb3IobGV0IGU9MDtlPGIubGVuZ3RoOysrZSl7bGV0IHQ9YltlXTtzLnB1c2godit0KX1sPXQrKGwubGVuZ3RoPjA/YCBgK2w6bCl9cmV0dXJuIGx9LCRfPSguLi5lKT0+e2xldCB0PTAsbixyLGk9YGA7Zm9yKDt0PGUubGVuZ3RoOykobj1lW3QrK10pJiYocj1ldihuKSkmJihpJiYoaSs9YCBgKSxpKz1yKTtyZXR1cm4gaX0sZXY9ZT0+e2lmKHR5cGVvZiBlPT1gc3RyaW5nYClyZXR1cm4gZTtsZXQgdCxuPWBgO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PWV2KGVbcl0pKSYmKG4mJihuKz1gIGApLG4rPXQpO3JldHVybiBufSx0dj0oZSwuLi50KT0+e2xldCBuLHIsaSxhLG89bz0+KG49WV8odC5yZWR1Y2UoKGUsdCk9PnQoZSksZSgpKSkscj1uLmNhY2hlLmdldCxpPW4uY2FjaGUuc2V0LGE9cyxzKG8pKSxzPWU9PntsZXQgdD1yKGUpO2lmKHQpcmV0dXJuIHQ7bGV0IGE9UV8oZSxuKTtyZXR1cm4gaShlLGEpLGF9O3JldHVybiBhPW8sKC4uLmUpPT5hKCRfKC4uLmUpKX0sbnY9W10scnY9ZT0+e2xldCB0PXQ9PnRbZV18fG52O3JldHVybiB0LmlzVGhlbWVHZXR0ZXI9ITAsdH0saXY9L15cWyg/Oihcd1tcdy1dKik6KT8oLispXF0kL2ksYXY9L15cKCg/Oihcd1tcdy1dKik6KT8oLispXCkkL2ksb3Y9L15cZCsoPzpcLlxkKyk/XC9cZCsoPzpcLlxkKyk/JC8sc3Y9L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxjdj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sbHY9L14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpfGNvbG9yLW1peClcKC4rXCkkLyx1dj0vXihpbnNldF8pPy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxkdj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvLGZ2PWU9Pm92LnRlc3QoZSksWT1lPT4hIWUmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKGUpKSxwdj1lPT4hIWUmJk51bWJlci5pc0ludGVnZXIoTnVtYmVyKGUpKSxtdj1lPT5lLmVuZHNXaXRoKGAlYCkmJlkoZS5zbGljZSgwLC0xKSksaHY9ZT0+c3YudGVzdChlKSxndj0oKT0+ITAsX3Y9ZT0+Y3YudGVzdChlKSYmIWx2LnRlc3QoZSksdnY9KCk9PiExLHl2PWU9PnV2LnRlc3QoZSksYnY9ZT0+ZHYudGVzdChlKSx4dj1lPT4hWChlKSYmIVooZSksU3Y9ZT0+ZS5zdGFydHNXaXRoKGBAY29udGFpbmVyYCkmJihlWzEwXT09PWAvYCYmZVsxMV0hPT12b2lkIDB8fGVbMTFdPT09YHNgJiZlWzE2XSE9PXZvaWQgMCYmZS5zdGFydHNXaXRoKGAtc2l6ZS9gLDEwKXx8ZVsxMV09PT1gbmAmJmVbMThdIT09dm9pZCAwJiZlLnN0YXJ0c1dpdGgoYC1ub3JtYWwvYCwxMCkpLEN2PWU9PlJ2KGUsSHYsdnYpLFg9ZT0+aXYudGVzdChlKSx3dj1lPT5SdihlLFV2LF92KSxUdj1lPT5SdihlLFd2LFkpLEV2PWU9PlJ2KGUsS3YsZ3YpLER2PWU9PlJ2KGUsR3YsdnYpLE92PWU9PlJ2KGUsQnYsdnYpLGt2PWU9PlJ2KGUsVnYsYnYpLEF2PWU9PlJ2KGUscXYseXYpLFo9ZT0+YXYudGVzdChlKSxqdj1lPT56dihlLFV2KSxNdj1lPT56dihlLEd2KSxOdj1lPT56dihlLEJ2KSxQdj1lPT56dihlLEh2KSxGdj1lPT56dihlLFZ2KSxJdj1lPT56dihlLHF2LCEwKSxMdj1lPT56dihlLEt2LCEwKSxSdj0oZSx0LG4pPT57bGV0IHI9aXYuZXhlYyhlKTtyZXR1cm4gcj9yWzFdP3QoclsxXSk6bihyWzJdKTohMX0senY9KGUsdCxuPSExKT0+e2xldCByPWF2LmV4ZWMoZSk7cmV0dXJuIHI/clsxXT90KHJbMV0pOm46ITF9LEJ2PWU9PmU9PT1gcG9zaXRpb25gfHxlPT09YHBlcmNlbnRhZ2VgLFZ2PWU9PmU9PT1gaW1hZ2VgfHxlPT09YHVybGAsSHY9ZT0+ZT09PWBsZW5ndGhgfHxlPT09YHNpemVgfHxlPT09YGJnLXNpemVgLFV2PWU9PmU9PT1gbGVuZ3RoYCxXdj1lPT5lPT09YG51bWJlcmAsR3Y9ZT0+ZT09PWBmYW1pbHktbmFtZWAsS3Y9ZT0+ZT09PWBudW1iZXJgfHxlPT09YHdlaWdodGAscXY9ZT0+ZT09PWBzaGFkb3dgLEp2PXR2KCgpPT57bGV0IGU9cnYoYGNvbG9yYCksdD1ydihgZm9udGApLG49cnYoYHRleHRgKSxyPXJ2KGBmb250LXdlaWdodGApLGk9cnYoYHRyYWNraW5nYCksYT1ydihgbGVhZGluZ2ApLG89cnYoYGJyZWFrcG9pbnRgKSxzPXJ2KGBjb250YWluZXJgKSxjPXJ2KGBzcGFjaW5nYCksbD1ydihgcmFkaXVzYCksdT1ydihgc2hhZG93YCksZD1ydihgaW5zZXQtc2hhZG93YCksZj1ydihgdGV4dC1zaGFkb3dgKSxwPXJ2KGBkcm9wLXNoYWRvd2ApLG09cnYoYGJsdXJgKSxoPXJ2KGBwZXJzcGVjdGl2ZWApLGc9cnYoYGFzcGVjdGApLF89cnYoYGVhc2VgKSx2PXJ2KGBhbmltYXRlYCkseT0oKT0+W2BhdXRvYCxgYXZvaWRgLGBhbGxgLGBhdm9pZC1wYWdlYCxgcGFnZWAsYGxlZnRgLGByaWdodGAsYGNvbHVtbmBdLGI9KCk9PltgY2VudGVyYCxgdG9wYCxgYm90dG9tYCxgbGVmdGAsYHJpZ2h0YCxgdG9wLWxlZnRgLGBsZWZ0LXRvcGAsYHRvcC1yaWdodGAsYHJpZ2h0LXRvcGAsYGJvdHRvbS1yaWdodGAsYHJpZ2h0LWJvdHRvbWAsYGJvdHRvbS1sZWZ0YCxgbGVmdC1ib3R0b21gXSx4PSgpPT5bLi4uYigpLFosWF0sUz0oKT0+W2BhdXRvYCxgaGlkZGVuYCxgY2xpcGAsYHZpc2libGVgLGBzY3JvbGxgXSxDPSgpPT5bYGF1dG9gLGBjb250YWluYCxgbm9uZWBdLHc9KCk9PltaLFgsY10sZWU9KCk9PltmdixgZnVsbGAsYGF1dG9gLC4uLncoKV0sdGU9KCk9Pltwdixgbm9uZWAsYHN1YmdyaWRgLFosWF0sVD0oKT0+W2BhdXRvYCx7c3BhbjpbYGZ1bGxgLHB2LFosWF19LHB2LFosWF0sbmU9KCk9PltwdixgYXV0b2AsWixYXSxyZT0oKT0+W2BhdXRvYCxgbWluYCxgbWF4YCxgZnJgLFosWF0saWU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBiZXR3ZWVuYCxgYXJvdW5kYCxgZXZlbmx5YCxgc3RyZXRjaGAsYGJhc2VsaW5lYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLEU9KCk9Pltgc3RhcnRgLGBlbmRgLGBjZW50ZXJgLGBzdHJldGNoYCxgY2VudGVyLXNhZmVgLGBlbmQtc2FmZWBdLGFlPSgpPT5bYGF1dG9gLC4uLncoKV0sb2U9KCk9PltmdixgYXV0b2AsYGZ1bGxgLGBkdndgLGBkdmhgLGBsdndgLGBsdmhgLGBzdndgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sc2U9KCk9Pltmdixgc2NyZWVuYCxgZnVsbGAsYGR2d2AsYGx2d2AsYHN2d2AsYG1pbmAsYG1heGAsYGZpdGAsLi4udygpXSxjZT0oKT0+W2Z2LGBzY3JlZW5gLGBmdWxsYCxgbGhgLGBkdmhgLGBsdmhgLGBzdmhgLGBtaW5gLGBtYXhgLGBmaXRgLC4uLncoKV0sRD0oKT0+W2UsWixYXSxsZT0oKT0+Wy4uLmIoKSxOdixPdix7cG9zaXRpb246W1osWF19XSx1ZT0oKT0+W2Buby1yZXBlYXRgLHtyZXBlYXQ6W2BgLGB4YCxgeWAsYHNwYWNlYCxgcm91bmRgXX1dLGRlPSgpPT5bYGF1dG9gLGBjb3ZlcmAsYGNvbnRhaW5gLFB2LEN2LHtzaXplOltaLFhdfV0sZmU9KCk9Plttdixqdix3dl0scGU9KCk9PltgYCxgbm9uZWAsYGZ1bGxgLGwsWixYXSxtZT0oKT0+W2BgLFksanYsd3ZdLGhlPSgpPT5bYHNvbGlkYCxgZGFzaGVkYCxgZG90dGVkYCxgZG91YmxlYF0sZ2U9KCk9Pltgbm9ybWFsYCxgbXVsdGlwbHlgLGBzY3JlZW5gLGBvdmVybGF5YCxgZGFya2VuYCxgbGlnaHRlbmAsYGNvbG9yLWRvZGdlYCxgY29sb3ItYnVybmAsYGhhcmQtbGlnaHRgLGBzb2Z0LWxpZ2h0YCxgZGlmZmVyZW5jZWAsYGV4Y2x1c2lvbmAsYGh1ZWAsYHNhdHVyYXRpb25gLGBjb2xvcmAsYGx1bWlub3NpdHlgXSxfZT0oKT0+W1ksbXYsTnYsT3ZdLHZlPSgpPT5bYGAsYG5vbmVgLG0sWixYXSx5ZT0oKT0+W2Bub25lYCxZLFosWF0sYmU9KCk9Pltgbm9uZWAsWSxaLFhdLE89KCk9PltZLFosWF0seGU9KCk9PltmdixgZnVsbGAsLi4udygpXTtyZXR1cm57Y2FjaGVTaXplOjUwMCx0aGVtZTp7YW5pbWF0ZTpbYHNwaW5gLGBwaW5nYCxgcHVsc2VgLGBib3VuY2VgXSxhc3BlY3Q6W2B2aWRlb2BdLGJsdXI6W2h2XSxicmVha3BvaW50Oltodl0sY29sb3I6W2d2XSxjb250YWluZXI6W2h2XSwiZHJvcC1zaGFkb3ciOltodl0sZWFzZTpbYGluYCxgb3V0YCxgaW4tb3V0YF0sZm9udDpbeHZdLCJmb250LXdlaWdodCI6W2B0aGluYCxgZXh0cmFsaWdodGAsYGxpZ2h0YCxgbm9ybWFsYCxgbWVkaXVtYCxgc2VtaWJvbGRgLGBib2xkYCxgZXh0cmFib2xkYCxgYmxhY2tgXSwiaW5zZXQtc2hhZG93IjpbaHZdLGxlYWRpbmc6W2Bub25lYCxgdGlnaHRgLGBzbnVnYCxgbm9ybWFsYCxgcmVsYXhlZGAsYGxvb3NlYF0scGVyc3BlY3RpdmU6W2BkcmFtYXRpY2AsYG5lYXJgLGBub3JtYWxgLGBtaWRyYW5nZWAsYGRpc3RhbnRgLGBub25lYF0scmFkaXVzOltodl0sc2hhZG93Oltodl0sc3BhY2luZzpbYHB4YCxZXSx0ZXh0Oltodl0sInRleHQtc2hhZG93IjpbaHZdLHRyYWNraW5nOltgdGlnaHRlcmAsYHRpZ2h0YCxgbm9ybWFsYCxgd2lkZWAsYHdpZGVyYCxgd2lkZXN0YF19LGNsYXNzR3JvdXBzOnthc3BlY3Q6W3thc3BlY3Q6W2BhdXRvYCxgc3F1YXJlYCxmdixYLFosZ119XSxjb250YWluZXI6W2Bjb250YWluZXJgXSwiY29udGFpbmVyLXR5cGUiOlt7IkBjb250YWluZXIiOltgYCxgbm9ybWFsYCxgc2l6ZWAsWixYXX1dLCJjb250YWluZXItbmFtZWQiOltTdl0sY29sdW1uczpbe2NvbHVtbnM6W1ksWCxaLHNdfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6eSgpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjp5KCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOltgYXV0b2AsYGF2b2lkYCxgYXZvaWQtcGFnZWAsYGF2b2lkLWNvbHVtbmBdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6W2BzbGljZWAsYGNsb25lYF19XSxib3g6W3tib3g6W2Bib3JkZXJgLGBjb250ZW50YF19XSxkaXNwbGF5OltgYmxvY2tgLGBpbmxpbmUtYmxvY2tgLGBpbmxpbmVgLGBmbGV4YCxgaW5saW5lLWZsZXhgLGB0YWJsZWAsYGlubGluZS10YWJsZWAsYHRhYmxlLWNhcHRpb25gLGB0YWJsZS1jZWxsYCxgdGFibGUtY29sdW1uYCxgdGFibGUtY29sdW1uLWdyb3VwYCxgdGFibGUtZm9vdGVyLWdyb3VwYCxgdGFibGUtaGVhZGVyLWdyb3VwYCxgdGFibGUtcm93LWdyb3VwYCxgdGFibGUtcm93YCxgZmxvdy1yb290YCxgZ3JpZGAsYGlubGluZS1ncmlkYCxgY29udGVudHNgLGBsaXN0LWl0ZW1gLGBoaWRkZW5gXSxzcjpbYHNyLW9ubHlgLGBub3Qtc3Itb25seWBdLGZsb2F0Olt7ZmxvYXQ6W2ByaWdodGAsYGxlZnRgLGBub25lYCxgc3RhcnRgLGBlbmRgXX1dLGNsZWFyOlt7Y2xlYXI6W2BsZWZ0YCxgcmlnaHRgLGBib3RoYCxgbm9uZWAsYHN0YXJ0YCxgZW5kYF19XSxpc29sYXRpb246W2Bpc29sYXRlYCxgaXNvbGF0aW9uLWF1dG9gXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6W2Bjb250YWluYCxgY292ZXJgLGBmaWxsYCxgbm9uZWAsYHNjYWxlLWRvd25gXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OngoKX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UygpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlMoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpTKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpDKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOkMoKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6QygpfV0scG9zaXRpb246W2BzdGF0aWNgLGBmaXhlZGAsYGFic29sdXRlYCxgcmVsYXRpdmVgLGBzdGlja3lgXSxpbnNldDpbe2luc2V0OmVlKCl9XSwiaW5zZXQteCI6W3siaW5zZXQteCI6ZWUoKX1dLCJpbnNldC15IjpbeyJpbnNldC15IjplZSgpfV0sc3RhcnQ6W3siaW5zZXQtcyI6ZWUoKSxzdGFydDplZSgpfV0sZW5kOlt7Imluc2V0LWUiOmVlKCksZW5kOmVlKCl9XSwiaW5zZXQtYnMiOlt7Imluc2V0LWJzIjplZSgpfV0sImluc2V0LWJlIjpbeyJpbnNldC1iZSI6ZWUoKX1dLHRvcDpbe3RvcDplZSgpfV0scmlnaHQ6W3tyaWdodDplZSgpfV0sYm90dG9tOlt7Ym90dG9tOmVlKCl9XSxsZWZ0Olt7bGVmdDplZSgpfV0sdmlzaWJpbGl0eTpbYHZpc2libGVgLGBpbnZpc2libGVgLGBjb2xsYXBzZWBdLHo6W3t6OltwdixgYXV0b2AsWixYXX1dLGJhc2lzOlt7YmFzaXM6W2Z2LGBmdWxsYCxgYXV0b2AscywuLi53KCldfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6W2Byb3dgLGByb3ctcmV2ZXJzZWAsYGNvbGAsYGNvbC1yZXZlcnNlYF19XSwiZmxleC13cmFwIjpbe2ZsZXg6W2Bub3dyYXBgLGB3cmFwYCxgd3JhcC1yZXZlcnNlYF19XSxmbGV4Olt7ZmxleDpbWSxmdixgYXV0b2AsYGluaXRpYWxgLGBub25lYCxYXX1dLGdyb3c6W3tncm93OltgYCxZLFosWF19XSxzaHJpbms6W3tzaHJpbms6W2BgLFksWixYXX1dLG9yZGVyOlt7b3JkZXI6W3B2LGBmaXJzdGAsYGxhc3RgLGBub25lYCxaLFhdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjp0ZSgpfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlQoKX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6bmUoKX1dLCJjb2wtZW5kIjpbeyJjb2wtZW5kIjpuZSgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjp0ZSgpfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlQoKX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6bmUoKX1dLCJyb3ctZW5kIjpbeyJyb3ctZW5kIjpuZSgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbYHJvd2AsYGNvbGAsYGRlbnNlYCxgcm93LWRlbnNlYCxgY29sLWRlbnNlYF19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOnJlKCl9XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOnJlKCl9XSxnYXA6W3tnYXA6dygpfV0sImdhcC14IjpbeyJnYXAteCI6dygpfV0sImdhcC15IjpbeyJnYXAteSI6dygpfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5OlsuLi5pZSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbLi4uRSgpLGBub3JtYWxgXX1dLCJqdXN0aWZ5LXNlbGYiOlt7Imp1c3RpZnktc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbYG5vcm1hbGAsLi4uaWUoKV19XSwiYWxpZ24taXRlbXMiOlt7aXRlbXM6Wy4uLkUoKSx7YmFzZWxpbmU6W2BgLGBsYXN0YF19XX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6W2BhdXRvYCwuLi5FKCkse2Jhc2VsaW5lOltgYCxgbGFzdGBdfV19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6aWUoKX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsuLi5FKCksYGJhc2VsaW5lYF19XSwicGxhY2Utc2VsZiI6W3sicGxhY2Utc2VsZiI6W2BhdXRvYCwuLi5FKCldfV0scDpbe3A6dygpfV0scHg6W3tweDp3KCl9XSxweTpbe3B5OncoKX1dLHBzOlt7cHM6dygpfV0scGU6W3twZTp3KCl9XSxwYnM6W3twYnM6dygpfV0scGJlOlt7cGJlOncoKX1dLHB0Olt7cHQ6dygpfV0scHI6W3twcjp3KCl9XSxwYjpbe3BiOncoKX1dLHBsOlt7cGw6dygpfV0sbTpbe206YWUoKX1dLG14Olt7bXg6YWUoKX1dLG15Olt7bXk6YWUoKX1dLG1zOlt7bXM6YWUoKX1dLG1lOlt7bWU6YWUoKX1dLG1iczpbe21iczphZSgpfV0sbWJlOlt7bWJlOmFlKCl9XSxtdDpbe210OmFlKCl9XSxtcjpbe21yOmFlKCl9XSxtYjpbe21iOmFlKCl9XSxtbDpbe21sOmFlKCl9XSwic3BhY2UteCI6W3sic3BhY2UteCI6dygpfV0sInNwYWNlLXgtcmV2ZXJzZSI6W2BzcGFjZS14LXJldmVyc2VgXSwic3BhY2UteSI6W3sic3BhY2UteSI6dygpfV0sInNwYWNlLXktcmV2ZXJzZSI6W2BzcGFjZS15LXJldmVyc2VgXSxzaXplOlt7c2l6ZTpvZSgpfV0sImlubGluZS1zaXplIjpbe2lubGluZTpbYGF1dG9gLC4uLnNlKCldfV0sIm1pbi1pbmxpbmUtc2l6ZSI6W3sibWluLWlubGluZSI6W2BhdXRvYCwuLi5zZSgpXX1dLCJtYXgtaW5saW5lLXNpemUiOlt7Im1heC1pbmxpbmUiOltgbm9uZWAsLi4uc2UoKV19XSwiYmxvY2stc2l6ZSI6W3tibG9jazpbYGF1dG9gLC4uLmNlKCldfV0sIm1pbi1ibG9jay1zaXplIjpbeyJtaW4tYmxvY2siOltgYXV0b2AsLi4uY2UoKV19XSwibWF4LWJsb2NrLXNpemUiOlt7Im1heC1ibG9jayI6W2Bub25lYCwuLi5jZSgpXX1dLHc6W3t3OltzLGBzY3JlZW5gLC4uLm9lKCldfV0sIm1pbi13IjpbeyJtaW4tdyI6W3MsYHNjcmVlbmAsYG5vbmVgLC4uLm9lKCldfV0sIm1heC13IjpbeyJtYXgtdyI6W3MsYHNjcmVlbmAsYG5vbmVgLGBwcm9zZWAse3NjcmVlbjpbb119LC4uLm9lKCldfV0saDpbe2g6W2BzY3JlZW5gLGBsaGAsLi4ub2UoKV19XSwibWluLWgiOlt7Im1pbi1oIjpbYHNjcmVlbmAsYGxoYCxgbm9uZWAsLi4ub2UoKV19XSwibWF4LWgiOlt7Im1heC1oIjpbYHNjcmVlbmAsYGxoYCwuLi5vZSgpXX1dLCJmb250LXNpemUiOlt7dGV4dDpbYGJhc2VgLG4sanYsd3ZdfV0sImZvbnQtc21vb3RoaW5nIjpbYGFudGlhbGlhc2VkYCxgc3VicGl4ZWwtYW50aWFsaWFzZWRgXSwiZm9udC1zdHlsZSI6W2BpdGFsaWNgLGBub3QtaXRhbGljYF0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6W3IsTHYsRXZdfV0sImZvbnQtc3RyZXRjaCI6W3siZm9udC1zdHJldGNoIjpbYHVsdHJhLWNvbmRlbnNlZGAsYGV4dHJhLWNvbmRlbnNlZGAsYGNvbmRlbnNlZGAsYHNlbWktY29uZGVuc2VkYCxgbm9ybWFsYCxgc2VtaS1leHBhbmRlZGAsYGV4cGFuZGVkYCxgZXh0cmEtZXhwYW5kZWRgLGB1bHRyYS1leHBhbmRlZGAsbXYsWF19XSwiZm9udC1mYW1pbHkiOlt7Zm9udDpbTXYsRHYsdF19XSwiZm9udC1mZWF0dXJlcyI6W3siZm9udC1mZWF0dXJlcyI6W1hdfV0sImZ2bi1ub3JtYWwiOltgbm9ybWFsLW51bXNgXSwiZnZuLW9yZGluYWwiOltgb3JkaW5hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYHNsYXNoZWQtemVyb2BdLCJmdm4tZmlndXJlIjpbYGxpbmluZy1udW1zYCxgb2xkc3R5bGUtbnVtc2BdLCJmdm4tc3BhY2luZyI6W2Bwcm9wb3J0aW9uYWwtbnVtc2AsYHRhYnVsYXItbnVtc2BdLCJmdm4tZnJhY3Rpb24iOltgZGlhZ29uYWwtZnJhY3Rpb25zYCxgc3RhY2tlZC1mcmFjdGlvbnNgXSx0cmFja2luZzpbe3RyYWNraW5nOltpLFosWF19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6W1ksYG5vbmVgLFosVHZdfV0sbGVhZGluZzpbe2xlYWRpbmc6W2EsLi4udygpXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbYG5vbmVgLFosWF19XSwibGlzdC1zdHlsZS1wb3NpdGlvbiI6W3tsaXN0OltgaW5zaWRlYCxgb3V0c2lkZWBdfV0sImxpc3Qtc3R5bGUtdHlwZSI6W3tsaXN0OltgZGlzY2AsYGRlY2ltYWxgLGBub25lYCxaLFhdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6W2BsZWZ0YCxgY2VudGVyYCxgcmlnaHRgLGBqdXN0aWZ5YCxgc3RhcnRgLGBlbmRgXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpEKCl9XSwidGV4dC1jb2xvciI6W3t0ZXh0OkQoKX1dLCJ0ZXh0LWRlY29yYXRpb24iOltgdW5kZXJsaW5lYCxgb3ZlcmxpbmVgLGBsaW5lLXRocm91Z2hgLGBuby11bmRlcmxpbmVgXSwidGV4dC1kZWNvcmF0aW9uLXN0eWxlIjpbe2RlY29yYXRpb246Wy4uLmhlKCksYHdhdnlgXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246W1ksYGZyb20tZm9udGAsYGF1dG9gLFosd3ZdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOkQoKX1dLCJ1bmRlcmxpbmUtb2Zmc2V0IjpbeyJ1bmRlcmxpbmUtb2Zmc2V0IjpbWSxgYXV0b2AsWixYXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6W2B1cHBlcmNhc2VgLGBsb3dlcmNhc2VgLGBjYXBpdGFsaXplYCxgbm9ybWFsLWNhc2VgXSwidGV4dC1vdmVyZmxvdyI6W2B0cnVuY2F0ZWAsYHRleHQtZWxsaXBzaXNgLGB0ZXh0LWNsaXBgXSwidGV4dC13cmFwIjpbe3RleHQ6W2B3cmFwYCxgbm93cmFwYCxgYmFsYW5jZWAsYHByZXR0eWBdfV0saW5kZW50Olt7aW5kZW50OncoKX1dLCJ0YWItc2l6ZSI6W3t0YWI6W3B2LFosWF19XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246W2BiYXNlbGluZWAsYHRvcGAsYG1pZGRsZWAsYGJvdHRvbWAsYHRleHQtdG9wYCxgdGV4dC1ib3R0b21gLGBzdWJgLGBzdXBlcmAsWixYXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOltgbm9ybWFsYCxgbm93cmFwYCxgcHJlYCxgcHJlLWxpbmVgLGBwcmUtd3JhcGAsYGJyZWFrLXNwYWNlc2BdfV0sYnJlYWs6W3ticmVhazpbYG5vcm1hbGAsYHdvcmRzYCxgYWxsYCxga2VlcGBdfV0sd3JhcDpbe3dyYXA6W2BicmVhay13b3JkYCxgYW55d2hlcmVgLGBub3JtYWxgXX1dLGh5cGhlbnM6W3toeXBoZW5zOltgbm9uZWAsYG1hbnVhbGAsYGF1dG9gXX1dLGNvbnRlbnQ6W3tjb250ZW50Oltgbm9uZWAsWixYXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOltgZml4ZWRgLGBsb2NhbGAsYHNjcm9sbGBdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGB0ZXh0YF19XSwiYmctb3JpZ2luIjpbeyJiZy1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgXX1dLCJiZy1wb3NpdGlvbiI6W3tiZzpsZSgpfV0sImJnLXJlcGVhdCI6W3tiZzp1ZSgpfV0sImJnLXNpemUiOlt7Ymc6ZGUoKX1dLCJiZy1pbWFnZSI6W3tiZzpbYG5vbmVgLHtsaW5lYXI6W3t0bzpbYHRgLGB0cmAsYHJgLGBicmAsYGJgLGBibGAsYGxgLGB0bGBdfSxwdixaLFhdLHJhZGlhbDpbYGAsWixYXSxjb25pYzpbcHYsWixYXX0sRnYsa3ZdfV0sImJnLWNvbG9yIjpbe2JnOkQoKX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOmZlKCl9XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6ZmUoKX1dLCJncmFkaWVudC10by1wb3MiOlt7dG86ZmUoKX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206RCgpfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6RCgpfV0sImdyYWRpZW50LXRvIjpbe3RvOkQoKX1dLHJvdW5kZWQ6W3tyb3VuZGVkOnBlKCl9XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOnBlKCl9XSwicm91bmRlZC1lIjpbeyJyb3VuZGVkLWUiOnBlKCl9XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOnBlKCl9XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOnBlKCl9XSwicm91bmRlZC1iIjpbeyJyb3VuZGVkLWIiOnBlKCl9XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOnBlKCl9XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6cGUoKX1dLCJyb3VuZGVkLXNlIjpbeyJyb3VuZGVkLXNlIjpwZSgpfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOnBlKCl9XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6cGUoKX1dLCJyb3VuZGVkLXRsIjpbeyJyb3VuZGVkLXRsIjpwZSgpfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOnBlKCl9XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6cGUoKX1dLCJyb3VuZGVkLWJsIjpbeyJyb3VuZGVkLWJsIjpwZSgpfV0sImJvcmRlci13Ijpbe2JvcmRlcjptZSgpfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14IjptZSgpfV0sImJvcmRlci13LXkiOlt7ImJvcmRlci15IjptZSgpfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjptZSgpfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjptZSgpfV0sImJvcmRlci13LWJzIjpbeyJib3JkZXItYnMiOm1lKCl9XSwiYm9yZGVyLXctYmUiOlt7ImJvcmRlci1iZSI6bWUoKX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6bWUoKX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6bWUoKX1dLCJib3JkZXItdy1iIjpbeyJib3JkZXItYiI6bWUoKX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6bWUoKX1dLCJkaXZpZGUteCI6W3siZGl2aWRlLXgiOm1lKCl9XSwiZGl2aWRlLXgtcmV2ZXJzZSI6W2BkaXZpZGUteC1yZXZlcnNlYF0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6bWUoKX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbYGRpdmlkZS15LXJldmVyc2VgXSwiYm9yZGVyLXN0eWxlIjpbe2JvcmRlcjpbLi4uaGUoKSxgaGlkZGVuYCxgbm9uZWBdfV0sImRpdmlkZS1zdHlsZSI6W3tkaXZpZGU6Wy4uLmhlKCksYGhpZGRlbmAsYG5vbmVgXX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOkQoKX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOkQoKX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOkQoKX1dLCJib3JkZXItY29sb3ItcyI6W3siYm9yZGVyLXMiOkQoKX1dLCJib3JkZXItY29sb3ItZSI6W3siYm9yZGVyLWUiOkQoKX1dLCJib3JkZXItY29sb3ItYnMiOlt7ImJvcmRlci1icyI6RCgpfV0sImJvcmRlci1jb2xvci1iZSI6W3siYm9yZGVyLWJlIjpEKCl9XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10IjpEKCl9XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpEKCl9XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpEKCl9XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpEKCl9XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsuLi5oZSgpLGBub25lYCxgaGlkZGVuYF19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbWSxaLFhdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltgYCxZLGp2LHd2XX1dLCJvdXRsaW5lLWNvbG9yIjpbe291dGxpbmU6RCgpfV0sc2hhZG93Olt7c2hhZG93OltgYCxgbm9uZWAsdSxJdixBdl19XSwic2hhZG93LWNvbG9yIjpbe3NoYWRvdzpEKCl9XSwiaW5zZXQtc2hhZG93IjpbeyJpbnNldC1zaGFkb3ciOltgbm9uZWAsZCxJdixBdl19XSwiaW5zZXQtc2hhZG93LWNvbG9yIjpbeyJpbnNldC1zaGFkb3ciOkQoKX1dLCJyaW5nLXciOlt7cmluZzptZSgpfV0sInJpbmctdy1pbnNldCI6W2ByaW5nLWluc2V0YF0sInJpbmctY29sb3IiOlt7cmluZzpEKCl9XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltZLHd2XX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOkQoKX1dLCJpbnNldC1yaW5nLXciOlt7Imluc2V0LXJpbmciOm1lKCl9XSwiaW5zZXQtcmluZy1jb2xvciI6W3siaW5zZXQtcmluZyI6RCgpfV0sInRleHQtc2hhZG93IjpbeyJ0ZXh0LXNoYWRvdyI6W2Bub25lYCxmLEl2LEF2XX1dLCJ0ZXh0LXNoYWRvdy1jb2xvciI6W3sidGV4dC1zaGFkb3ciOkQoKX1dLG9wYWNpdHk6W3tvcGFjaXR5OltZLFosWF19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOlsuLi5nZSgpLGBwbHVzLWRhcmtlcmAsYHBsdXMtbGlnaHRlcmBdfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6Z2UoKX1dLCJtYXNrLWNsaXAiOlt7Im1hc2stY2xpcCI6W2Bib3JkZXJgLGBwYWRkaW5nYCxgY29udGVudGAsYGZpbGxgLGBzdHJva2VgLGB2aWV3YF19LGBtYXNrLW5vLWNsaXBgXSwibWFzay1jb21wb3NpdGUiOlt7bWFzazpbYGFkZGAsYHN1YnRyYWN0YCxgaW50ZXJzZWN0YCxgZXhjbHVkZWBdfV0sIm1hc2staW1hZ2UtbGluZWFyLXBvcyI6W3sibWFzay1saW5lYXIiOltZXX1dLCJtYXNrLWltYWdlLWxpbmVhci1mcm9tLXBvcyI6W3sibWFzay1saW5lYXItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1wb3MiOlt7Im1hc2stbGluZWFyLXRvIjpfZSgpfV0sIm1hc2staW1hZ2UtbGluZWFyLWZyb20tY29sb3IiOlt7Im1hc2stbGluZWFyLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWxpbmVhci10by1jb2xvciI6W3sibWFzay1saW5lYXItdG8iOkQoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1wb3MiOlt7Im1hc2stdC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtdC10by1wb3MiOlt7Im1hc2stdC10byI6X2UoKX1dLCJtYXNrLWltYWdlLXQtZnJvbS1jb2xvciI6W3sibWFzay10LWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLXQtdG8tY29sb3IiOlt7Im1hc2stdC10byI6RCgpfV0sIm1hc2staW1hZ2Utci1mcm9tLXBvcyI6W3sibWFzay1yLWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS1yLXRvLXBvcyI6W3sibWFzay1yLXRvIjpfZSgpfV0sIm1hc2staW1hZ2Utci1mcm9tLWNvbG9yIjpbeyJtYXNrLXItZnJvbSI6RCgpfV0sIm1hc2staW1hZ2Utci10by1jb2xvciI6W3sibWFzay1yLXRvIjpEKCl9XSwibWFzay1pbWFnZS1iLWZyb20tcG9zIjpbeyJtYXNrLWItZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWItdG8tcG9zIjpbeyJtYXNrLWItdG8iOl9lKCl9XSwibWFzay1pbWFnZS1iLWZyb20tY29sb3IiOlt7Im1hc2stYi1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS1iLXRvLWNvbG9yIjpbeyJtYXNrLWItdG8iOkQoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1wb3MiOlt7Im1hc2stbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtbC10by1wb3MiOlt7Im1hc2stbC10byI6X2UoKX1dLCJtYXNrLWltYWdlLWwtZnJvbS1jb2xvciI6W3sibWFzay1sLWZyb20iOkQoKX1dLCJtYXNrLWltYWdlLWwtdG8tY29sb3IiOlt7Im1hc2stbC10byI6RCgpfV0sIm1hc2staW1hZ2UteC1mcm9tLXBvcyI6W3sibWFzay14LWZyb20iOl9lKCl9XSwibWFzay1pbWFnZS14LXRvLXBvcyI6W3sibWFzay14LXRvIjpfZSgpfV0sIm1hc2staW1hZ2UteC1mcm9tLWNvbG9yIjpbeyJtYXNrLXgtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UteC10by1jb2xvciI6W3sibWFzay14LXRvIjpEKCl9XSwibWFzay1pbWFnZS15LWZyb20tcG9zIjpbeyJtYXNrLXktZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLXktdG8tcG9zIjpbeyJtYXNrLXktdG8iOl9lKCl9XSwibWFzay1pbWFnZS15LWZyb20tY29sb3IiOlt7Im1hc2steS1mcm9tIjpEKCl9XSwibWFzay1pbWFnZS15LXRvLWNvbG9yIjpbeyJtYXNrLXktdG8iOkQoKX1dLCJtYXNrLWltYWdlLXJhZGlhbCI6W3sibWFzay1yYWRpYWwiOltaLFhdfV0sIm1hc2staW1hZ2UtcmFkaWFsLWZyb20tcG9zIjpbeyJtYXNrLXJhZGlhbC1mcm9tIjpfZSgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLXBvcyI6W3sibWFzay1yYWRpYWwtdG8iOl9lKCl9XSwibWFzay1pbWFnZS1yYWRpYWwtZnJvbS1jb2xvciI6W3sibWFzay1yYWRpYWwtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXRvLWNvbG9yIjpbeyJtYXNrLXJhZGlhbC10byI6RCgpfV0sIm1hc2staW1hZ2UtcmFkaWFsLXNoYXBlIjpbeyJtYXNrLXJhZGlhbCI6W2BjaXJjbGVgLGBlbGxpcHNlYF19XSwibWFzay1pbWFnZS1yYWRpYWwtc2l6ZSI6W3sibWFzay1yYWRpYWwiOlt7Y2xvc2VzdDpbYHNpZGVgLGBjb3JuZXJgXSxmYXJ0aGVzdDpbYHNpZGVgLGBjb3JuZXJgXX1dfV0sIm1hc2staW1hZ2UtcmFkaWFsLXBvcyI6W3sibWFzay1yYWRpYWwtYXQiOmIoKX1dLCJtYXNrLWltYWdlLWNvbmljLXBvcyI6W3sibWFzay1jb25pYyI6W1ldfV0sIm1hc2staW1hZ2UtY29uaWMtZnJvbS1wb3MiOlt7Im1hc2stY29uaWMtZnJvbSI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLXRvLXBvcyI6W3sibWFzay1jb25pYy10byI6X2UoKX1dLCJtYXNrLWltYWdlLWNvbmljLWZyb20tY29sb3IiOlt7Im1hc2stY29uaWMtZnJvbSI6RCgpfV0sIm1hc2staW1hZ2UtY29uaWMtdG8tY29sb3IiOlt7Im1hc2stY29uaWMtdG8iOkQoKX1dLCJtYXNrLW1vZGUiOlt7bWFzazpbYGFscGhhYCxgbHVtaW5hbmNlYCxgbWF0Y2hgXX1dLCJtYXNrLW9yaWdpbiI6W3sibWFzay1vcmlnaW4iOltgYm9yZGVyYCxgcGFkZGluZ2AsYGNvbnRlbnRgLGBmaWxsYCxgc3Ryb2tlYCxgdmlld2BdfV0sIm1hc2stcG9zaXRpb24iOlt7bWFzazpsZSgpfV0sIm1hc2stcmVwZWF0Ijpbe21hc2s6dWUoKX1dLCJtYXNrLXNpemUiOlt7bWFzazpkZSgpfV0sIm1hc2stdHlwZSI6W3sibWFzay10eXBlIjpbYGFscGhhYCxgbHVtaW5hbmNlYF19XSwibWFzay1pbWFnZSI6W3ttYXNrOltgbm9uZWAsWixYXX1dLGZpbHRlcjpbe2ZpbHRlcjpbYGAsYG5vbmVgLFosWF19XSxibHVyOlt7Ymx1cjp2ZSgpfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W1ksWixYXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W1ksWixYXX1dLCJkcm9wLXNoYWRvdyI6W3siZHJvcC1zaGFkb3ciOltgYCxgbm9uZWAscCxJdixBdl19XSwiZHJvcC1zaGFkb3ctY29sb3IiOlt7ImRyb3Atc2hhZG93IjpEKCl9XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W2BgLFksWixYXX1dLCJodWUtcm90YXRlIjpbeyJodWUtcm90YXRlIjpbWSxaLFhdfV0saW52ZXJ0Olt7aW52ZXJ0OltgYCxZLFosWF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOltZLFosWF19XSxzZXBpYTpbe3NlcGlhOltgYCxZLFosWF19XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOltgYCxgbm9uZWAsWixYXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjp2ZSgpfV0sImJhY2tkcm9wLWJyaWdodG5lc3MiOlt7ImJhY2tkcm9wLWJyaWdodG5lc3MiOltZLFosWF19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbWSxaLFhdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbYGAsWSxaLFhdfV0sImJhY2tkcm9wLWh1ZS1yb3RhdGUiOlt7ImJhY2tkcm9wLWh1ZS1yb3RhdGUiOltZLFosWF19XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltgYCxZLFosWF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W1ksWixYXX1dLCJiYWNrZHJvcC1zYXR1cmF0ZSI6W3siYmFja2Ryb3Atc2F0dXJhdGUiOltZLFosWF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpbYGAsWSxaLFhdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6W2Bjb2xsYXBzZWAsYHNlcGFyYXRlYF19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjp3KCl9XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6dygpfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOncoKX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6W2BhdXRvYCxgZml4ZWRgXX1dLGNhcHRpb246W3tjYXB0aW9uOltgdG9wYCxgYm90dG9tYF19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbYGAsYGFsbGAsYGNvbG9yc2AsYG9wYWNpdHlgLGBzaGFkb3dgLGB0cmFuc2Zvcm1gLGBub25lYCxaLFhdfV0sInRyYW5zaXRpb24tYmVoYXZpb3IiOlt7dHJhbnNpdGlvbjpbYG5vcm1hbGAsYGRpc2NyZXRlYF19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOltZLGBpbml0aWFsYCxaLFhdfV0sZWFzZTpbe2Vhc2U6W2BsaW5lYXJgLGBpbml0aWFsYCxfLFosWF19XSxkZWxheTpbe2RlbGF5OltZLFosWF19XSxhbmltYXRlOlt7YW5pbWF0ZTpbYG5vbmVgLHYsWixYXX1dLGJhY2tmYWNlOlt7YmFja2ZhY2U6W2BoaWRkZW5gLGB2aXNpYmxlYF19XSxwZXJzcGVjdGl2ZTpbe3BlcnNwZWN0aXZlOltoLFosWF19XSwicGVyc3BlY3RpdmUtb3JpZ2luIjpbeyJwZXJzcGVjdGl2ZS1vcmlnaW4iOngoKX1dLHJvdGF0ZTpbe3JvdGF0ZTp5ZSgpfV0sInJvdGF0ZS14IjpbeyJyb3RhdGUteCI6eWUoKX1dLCJyb3RhdGUteSI6W3sicm90YXRlLXkiOnllKCl9XSwicm90YXRlLXoiOlt7InJvdGF0ZS16Ijp5ZSgpfV0sc2NhbGU6W3tzY2FsZTpiZSgpfV0sInNjYWxlLXgiOlt7InNjYWxlLXgiOmJlKCl9XSwic2NhbGUteSI6W3sic2NhbGUteSI6YmUoKX1dLCJzY2FsZS16IjpbeyJzY2FsZS16IjpiZSgpfV0sInNjYWxlLTNkIjpbYHNjYWxlLTNkYF0sc2tldzpbe3NrZXc6TygpfV0sInNrZXcteCI6W3sic2tldy14IjpPKCl9XSwic2tldy15IjpbeyJza2V3LXkiOk8oKX1dLHRyYW5zZm9ybTpbe3RyYW5zZm9ybTpbWixYLGBgLGBub25lYCxgZ3B1YCxgY3B1YF19XSwidHJhbnNmb3JtLW9yaWdpbiI6W3tvcmlnaW46eCgpfV0sInRyYW5zZm9ybS1zdHlsZSI6W3t0cmFuc2Zvcm06W2AzZGAsYGZsYXRgXX1dLHRyYW5zbGF0ZTpbe3RyYW5zbGF0ZTp4ZSgpfV0sInRyYW5zbGF0ZS14IjpbeyJ0cmFuc2xhdGUteCI6eGUoKX1dLCJ0cmFuc2xhdGUteSI6W3sidHJhbnNsYXRlLXkiOnhlKCl9XSwidHJhbnNsYXRlLXoiOlt7InRyYW5zbGF0ZS16Ijp4ZSgpfV0sInRyYW5zbGF0ZS1ub25lIjpbYHRyYW5zbGF0ZS1ub25lYF0sem9vbTpbe3pvb206W3B2LFosWF19XSxhY2NlbnQ6W3thY2NlbnQ6RCgpfV0sYXBwZWFyYW5jZTpbe2FwcGVhcmFuY2U6W2Bub25lYCxgYXV0b2BdfV0sImNhcmV0LWNvbG9yIjpbe2NhcmV0OkQoKX1dLCJjb2xvci1zY2hlbWUiOlt7c2NoZW1lOltgbm9ybWFsYCxgZGFya2AsYGxpZ2h0YCxgbGlnaHQtZGFya2AsYG9ubHktZGFya2AsYG9ubHktbGlnaHRgXX1dLGN1cnNvcjpbe2N1cnNvcjpbYGF1dG9gLGBkZWZhdWx0YCxgcG9pbnRlcmAsYHdhaXRgLGB0ZXh0YCxgbW92ZWAsYGhlbHBgLGBub3QtYWxsb3dlZGAsYG5vbmVgLGBjb250ZXh0LW1lbnVgLGBwcm9ncmVzc2AsYGNlbGxgLGBjcm9zc2hhaXJgLGB2ZXJ0aWNhbC10ZXh0YCxgYWxpYXNgLGBjb3B5YCxgbm8tZHJvcGAsYGdyYWJgLGBncmFiYmluZ2AsYGFsbC1zY3JvbGxgLGBjb2wtcmVzaXplYCxgcm93LXJlc2l6ZWAsYG4tcmVzaXplYCxgZS1yZXNpemVgLGBzLXJlc2l6ZWAsYHctcmVzaXplYCxgbmUtcmVzaXplYCxgbnctcmVzaXplYCxgc2UtcmVzaXplYCxgc3ctcmVzaXplYCxgZXctcmVzaXplYCxgbnMtcmVzaXplYCxgbmVzdy1yZXNpemVgLGBud3NlLXJlc2l6ZWAsYHpvb20taW5gLGB6b29tLW91dGAsWixYXX1dLCJmaWVsZC1zaXppbmciOlt7ImZpZWxkLXNpemluZyI6W2BmaXhlZGAsYGNvbnRlbnRgXX1dLCJwb2ludGVyLWV2ZW50cyI6W3sicG9pbnRlci1ldmVudHMiOltgYXV0b2AsYG5vbmVgXX1dLHJlc2l6ZTpbe3Jlc2l6ZTpbYG5vbmVgLGBgLGB5YCxgeGBdfV0sInNjcm9sbC1iZWhhdmlvciI6W3tzY3JvbGw6W2BhdXRvYCxgc21vb3RoYF19XSwic2Nyb2xsYmFyLXRodW1iLWNvbG9yIjpbeyJzY3JvbGxiYXItdGh1bWIiOkQoKX1dLCJzY3JvbGxiYXItdHJhY2stY29sb3IiOlt7InNjcm9sbGJhci10cmFjayI6RCgpfV0sInNjcm9sbGJhci1ndXR0ZXIiOlt7InNjcm9sbGJhci1ndXR0ZXIiOltgYXV0b2AsYHN0YWJsZWAsYGJvdGhgXX1dLCJzY3JvbGxiYXItdyI6W3tzY3JvbGxiYXI6W2BhdXRvYCxgdGhpbmAsYG5vbmVgXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOncoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6dygpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15Ijp3KCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOncoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6dygpfV0sInNjcm9sbC1tYnMiOlt7InNjcm9sbC1tYnMiOncoKX1dLCJzY3JvbGwtbWJlIjpbeyJzY3JvbGwtbWJlIjp3KCl9XSwic2Nyb2xsLW10IjpbeyJzY3JvbGwtbXQiOncoKX1dLCJzY3JvbGwtbXIiOlt7InNjcm9sbC1tciI6dygpfV0sInNjcm9sbC1tYiI6W3sic2Nyb2xsLW1iIjp3KCl9XSwic2Nyb2xsLW1sIjpbeyJzY3JvbGwtbWwiOncoKX1dLCJzY3JvbGwtcCI6W3sic2Nyb2xsLXAiOncoKX1dLCJzY3JvbGwtcHgiOlt7InNjcm9sbC1weCI6dygpfV0sInNjcm9sbC1weSI6W3sic2Nyb2xsLXB5Ijp3KCl9XSwic2Nyb2xsLXBzIjpbeyJzY3JvbGwtcHMiOncoKX1dLCJzY3JvbGwtcGUiOlt7InNjcm9sbC1wZSI6dygpfV0sInNjcm9sbC1wYnMiOlt7InNjcm9sbC1wYnMiOncoKX1dLCJzY3JvbGwtcGJlIjpbeyJzY3JvbGwtcGJlIjp3KCl9XSwic2Nyb2xsLXB0IjpbeyJzY3JvbGwtcHQiOncoKX1dLCJzY3JvbGwtcHIiOlt7InNjcm9sbC1wciI6dygpfV0sInNjcm9sbC1wYiI6W3sic2Nyb2xsLXBiIjp3KCl9XSwic2Nyb2xsLXBsIjpbeyJzY3JvbGwtcGwiOncoKX1dLCJzbmFwLWFsaWduIjpbe3NuYXA6W2BzdGFydGAsYGVuZGAsYGNlbnRlcmAsYGFsaWduLW5vbmVgXX1dLCJzbmFwLXN0b3AiOlt7c25hcDpbYG5vcm1hbGAsYGFsd2F5c2BdfV0sInNuYXAtdHlwZSI6W3tzbmFwOltgbm9uZWAsYHhgLGB5YCxgYm90aGBdfV0sInNuYXAtc3RyaWN0bmVzcyI6W3tzbmFwOltgbWFuZGF0b3J5YCxgcHJveGltaXR5YF19XSx0b3VjaDpbe3RvdWNoOltgYXV0b2AsYG5vbmVgLGBtYW5pcHVsYXRpb25gXX1dLCJ0b3VjaC14IjpbeyJ0b3VjaC1wYW4iOltgeGAsYGxlZnRgLGByaWdodGBdfV0sInRvdWNoLXkiOlt7InRvdWNoLXBhbiI6W2B5YCxgdXBgLGBkb3duYF19XSwidG91Y2gtcHoiOltgdG91Y2gtcGluY2gtem9vbWBdLHNlbGVjdDpbe3NlbGVjdDpbYG5vbmVgLGB0ZXh0YCxgYWxsYCxgYXV0b2BdfV0sIndpbGwtY2hhbmdlIjpbeyJ3aWxsLWNoYW5nZSI6W2BhdXRvYCxgc2Nyb2xsYCxgY29udGVudHNgLGB0cmFuc2Zvcm1gLFosWF19XSxmaWxsOlt7ZmlsbDpbYG5vbmVgLC4uLkQoKV19XSwic3Ryb2tlLXciOlt7c3Ryb2tlOltZLGp2LHd2LFR2XX1dLHN0cm9rZTpbe3N0cm9rZTpbYG5vbmVgLC4uLkQoKV19XSwiZm9yY2VkLWNvbG9yLWFkanVzdCI6W3siZm9yY2VkLWNvbG9yLWFkanVzdCI6W2BhdXRvYCxgbm9uZWBdfV19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cHM6eyJjb250YWluZXItbmFtZWQiOltgY29udGFpbmVyLXR5cGVgXSxvdmVyZmxvdzpbYG92ZXJmbG93LXhgLGBvdmVyZmxvdy15YF0sb3ZlcnNjcm9sbDpbYG92ZXJzY3JvbGwteGAsYG92ZXJzY3JvbGwteWBdLGluc2V0OltgaW5zZXQteGAsYGluc2V0LXlgLGBpbnNldC1ic2AsYGluc2V0LWJlYCxgc3RhcnRgLGBlbmRgLGB0b3BgLGByaWdodGAsYGJvdHRvbWAsYGxlZnRgXSwiaW5zZXQteCI6W2ByaWdodGAsYGxlZnRgXSwiaW5zZXQteSI6W2B0b3BgLGBib3R0b21gXSxmbGV4OltgYmFzaXNgLGBncm93YCxgc2hyaW5rYF0sZ2FwOltgZ2FwLXhgLGBnYXAteWBdLHA6W2BweGAsYHB5YCxgcHNgLGBwZWAsYHBic2AsYHBiZWAsYHB0YCxgcHJgLGBwYmAsYHBsYF0scHg6W2BwcmAsYHBsYF0scHk6W2BwdGAsYHBiYF0sbTpbYG14YCxgbXlgLGBtc2AsYG1lYCxgbWJzYCxgbWJlYCxgbXRgLGBtcmAsYG1iYCxgbWxgXSxteDpbYG1yYCxgbWxgXSxteTpbYG10YCxgbWJgXSxzaXplOltgd2AsYGhgXSwiZm9udC1zaXplIjpbYGxlYWRpbmdgXSwiZnZuLW5vcm1hbCI6W2Bmdm4tb3JkaW5hbGAsYGZ2bi1zbGFzaGVkLXplcm9gLGBmdm4tZmlndXJlYCxgZnZuLXNwYWNpbmdgLGBmdm4tZnJhY3Rpb25gXSwiZnZuLW9yZGluYWwiOltgZnZuLW5vcm1hbGBdLCJmdm4tc2xhc2hlZC16ZXJvIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZpZ3VyZSI6W2Bmdm4tbm9ybWFsYF0sImZ2bi1zcGFjaW5nIjpbYGZ2bi1ub3JtYWxgXSwiZnZuLWZyYWN0aW9uIjpbYGZ2bi1ub3JtYWxgXSwibGluZS1jbGFtcCI6W2BkaXNwbGF5YCxgb3ZlcmZsb3dgXSxyb3VuZGVkOltgcm91bmRlZC1zYCxgcm91bmRlZC1lYCxgcm91bmRlZC10YCxgcm91bmRlZC1yYCxgcm91bmRlZC1iYCxgcm91bmRlZC1sYCxgcm91bmRlZC1zc2AsYHJvdW5kZWQtc2VgLGByb3VuZGVkLWVlYCxgcm91bmRlZC1lc2AsYHJvdW5kZWQtdGxgLGByb3VuZGVkLXRyYCxgcm91bmRlZC1icmAsYHJvdW5kZWQtYmxgXSwicm91bmRlZC1zIjpbYHJvdW5kZWQtc3NgLGByb3VuZGVkLWVzYF0sInJvdW5kZWQtZSI6W2Byb3VuZGVkLXNlYCxgcm91bmRlZC1lZWBdLCJyb3VuZGVkLXQiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtdHJgXSwicm91bmRlZC1yIjpbYHJvdW5kZWQtdHJgLGByb3VuZGVkLWJyYF0sInJvdW5kZWQtYiI6W2Byb3VuZGVkLWJyYCxgcm91bmRlZC1ibGBdLCJyb3VuZGVkLWwiOltgcm91bmRlZC10bGAsYHJvdW5kZWQtYmxgXSwiYm9yZGVyLXNwYWNpbmciOltgYm9yZGVyLXNwYWNpbmcteGAsYGJvcmRlci1zcGFjaW5nLXlgXSwiYm9yZGVyLXciOltgYm9yZGVyLXcteGAsYGJvcmRlci13LXlgLGBib3JkZXItdy1zYCxgYm9yZGVyLXctZWAsYGJvcmRlci13LWJzYCxgYm9yZGVyLXctYmVgLGBib3JkZXItdy10YCxgYm9yZGVyLXctcmAsYGJvcmRlci13LWJgLGBib3JkZXItdy1sYF0sImJvcmRlci13LXgiOltgYm9yZGVyLXctcmAsYGJvcmRlci13LWxgXSwiYm9yZGVyLXcteSI6W2Bib3JkZXItdy10YCxgYm9yZGVyLXctYmBdLCJib3JkZXItY29sb3IiOltgYm9yZGVyLWNvbG9yLXhgLGBib3JkZXItY29sb3IteWAsYGJvcmRlci1jb2xvci1zYCxgYm9yZGVyLWNvbG9yLWVgLGBib3JkZXItY29sb3ItYnNgLGBib3JkZXItY29sb3ItYmVgLGBib3JkZXItY29sb3ItdGAsYGJvcmRlci1jb2xvci1yYCxgYm9yZGVyLWNvbG9yLWJgLGBib3JkZXItY29sb3ItbGBdLCJib3JkZXItY29sb3IteCI6W2Bib3JkZXItY29sb3ItcmAsYGJvcmRlci1jb2xvci1sYF0sImJvcmRlci1jb2xvci15IjpbYGJvcmRlci1jb2xvci10YCxgYm9yZGVyLWNvbG9yLWJgXSx0cmFuc2xhdGU6W2B0cmFuc2xhdGUteGAsYHRyYW5zbGF0ZS15YCxgdHJhbnNsYXRlLW5vbmVgXSwidHJhbnNsYXRlLW5vbmUiOltgdHJhbnNsYXRlYCxgdHJhbnNsYXRlLXhgLGB0cmFuc2xhdGUteWAsYHRyYW5zbGF0ZS16YF0sInNjcm9sbC1tIjpbYHNjcm9sbC1teGAsYHNjcm9sbC1teWAsYHNjcm9sbC1tc2AsYHNjcm9sbC1tZWAsYHNjcm9sbC1tYnNgLGBzY3JvbGwtbWJlYCxgc2Nyb2xsLW10YCxgc2Nyb2xsLW1yYCxgc2Nyb2xsLW1iYCxgc2Nyb2xsLW1sYF0sInNjcm9sbC1teCI6W2BzY3JvbGwtbXJgLGBzY3JvbGwtbWxgXSwic2Nyb2xsLW15IjpbYHNjcm9sbC1tdGAsYHNjcm9sbC1tYmBdLCJzY3JvbGwtcCI6W2BzY3JvbGwtcHhgLGBzY3JvbGwtcHlgLGBzY3JvbGwtcHNgLGBzY3JvbGwtcGVgLGBzY3JvbGwtcGJzYCxgc2Nyb2xsLXBiZWAsYHNjcm9sbC1wdGAsYHNjcm9sbC1wcmAsYHNjcm9sbC1wYmAsYHNjcm9sbC1wbGBdLCJzY3JvbGwtcHgiOltgc2Nyb2xsLXByYCxgc2Nyb2xsLXBsYF0sInNjcm9sbC1weSI6W2BzY3JvbGwtcHRgLGBzY3JvbGwtcGJgXSx0b3VjaDpbYHRvdWNoLXhgLGB0b3VjaC15YCxgdG91Y2gtcHpgXSwidG91Y2gteCI6W2B0b3VjaGBdLCJ0b3VjaC15IjpbYHRvdWNoYF0sInRvdWNoLXB6IjpbYHRvdWNoYF19LGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczp7ImZvbnQtc2l6ZSI6W2BsZWFkaW5nYF19LHBvc3RmaXhMb29rdXBDbGFzc0dyb3VwczpbYGNvbnRhaW5lci10eXBlYF0sb3JkZXJTZW5zaXRpdmVNb2RpZmllcnM6W2AqYCxgKipgLGBhZnRlcmAsYGJhY2tkcm9wYCxgYmVmb3JlYCxgZGV0YWlscy1jb250ZW50YCxgZmlsZWAsYGZpcnN0LWxldHRlcmAsYGZpcnN0LWxpbmVgLGBtYXJrZXJgLGBwbGFjZWhvbGRlcmAsYHNlbGVjdGlvbmBdfX0pO2Z1bmN0aW9uIFl2KC4uLmUpe3JldHVybiBKdihiXyhlKSl9dmFyIFh2PUYoe19fbmFtZTpgQWxlcnRgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfSx2YXJpYW50Ont9fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihuLHIpPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBhbGVydGAsY2xhc3M6TyhOKFl2KShOKCR2KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKSkscm9sZTpgYWxlcnRgfSxbSShuLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWnY9Rih7X19uYW1lOmBBbGVydERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGFsZXJ0LWRlc2NyaXB0aW9uYCxjbGFzczpPKE4oWXYpKGB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbSB0ZXh0LWJhbGFuY2UgbWQ6dGV4dC1wcmV0dHkgWyZfcDpub3QoOmxhc3QtY2hpbGQpXTptYi00IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxRdj1GKHtfX25hbWU6YEFsZXJ0VGl0bGVgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgYWxlcnQtdGl0bGVgLGNsYXNzOk8oTihZdikoYGZvbnQtbWVkaXVtIGdyb3VwLWhhcy1bPnN2Z10vYWxlcnQ6Y29sLXN0YXJ0LTIgY24tZm9udC1oZWFkaW5nIFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSwkdj1DXyhgZ3JpZCBnYXAtMC41IHJvdW5kZWQtbGcgYm9yZGVyIHB4LTIuNSBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGhhcy1kYXRhLVtzbG90PWFsZXJ0LWFjdGlvbl06cmVsYXRpdmUgaGFzLWRhdGEtW3Nsb3Q9YWxlcnQtYWN0aW9uXTpwci0xOCBoYXMtWz5zdmddOmdyaWQtY29scy1bYXV0b18xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMiAqOltzdmddOnJvdy1zcGFuLTIgKjpbc3ZnXTp0cmFuc2xhdGUteS0wLjUgKjpbc3ZnXTp0ZXh0LWN1cnJlbnQgKjpbc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBncm91cC9hbGVydCByZWxhdGl2ZSB3LWZ1bGxgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZGAsZGVzdHJ1Y3RpdmU6YHRleHQtZGVzdHJ1Y3RpdmUgYmctY2FyZCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZGVzdHJ1Y3RpdmUvOTAgKjpbc3ZnXTp0ZXh0LWN1cnJlbnRgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YH19KTtmdW5jdGlvbiBleShlKXtyZXR1cm4gdHlwZW9mIGU9PWBzdHJpbmdgP2AnJHtlfSdgOm5ldyBpeSgpLnNlcmlhbGl6ZShlKX12YXIgdHk9YCBfLSw7OiE/LiciKClbXXt9QCovXFwmIyVcYF4rPD0+fH4kMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YCxueT0oZnVuY3Rpb24oKXtsZXQgZT1uZXcgVWludDhBcnJheSgxMjgpO2ZvcihsZXQgdD0wO3Q8Njk7dCsrKWVbdHkuY2hhckNvZGVBdCh0KV09dCsxO2ZvcihsZXQgdD02NTt0PD05MDt0KyspZVt0XT1lW3QrMzJdO3JldHVybiBlfSkoKTtmdW5jdGlvbiByeShlLHQpe2lmKGU9PT10KXJldHVybiAwO2xldCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49ZS5jaGFyQ29kZUF0KGkpLGE9dC5jaGFyQ29kZUF0KGkpO2lmKG49PT1hKWNvbnRpbnVlO2xldCBvPW48MTI4JiZueVtuXT9ueVtuXTpuKzEyOCxzPWE8MTI4JiZueVthXT9ueVthXTphKzEyODtpZihvIT09cylyZXR1cm4gbzxzPy0xOjE7cj09PTAmJihyPW4+YT8tMToxKX1yZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aD9yOmUubGVuZ3RoPHQubGVuZ3RoPy0xOjF9dmFyIGl5PShmdW5jdGlvbigpe2NsYXNzIGV7I2U9bmV3IE1hcDtjb21wYXJlKGUsdCl7bGV0IG49dHlwZW9mIGUscj10eXBlb2YgdDtyZXR1cm4gbj09PWBzdHJpbmdgJiZyPT09YHN0cmluZ2A/cnkoZSx0KTpuPT09YG51bWJlcmAmJnI9PT1gbnVtYmVyYD9lLXQ6cnkodGhpcy5zZXJpYWxpemUoZSwhMCksdGhpcy5zZXJpYWxpemUodCwhMCkpfXNlcmlhbGl6ZShlLHQpe2lmKGU9PT1udWxsKXJldHVybmBudWxsYDtzd2l0Y2godHlwZW9mIGUpe2Nhc2Vgc3RyaW5nYDpyZXR1cm4gdD9lOmAnJHtlfSdgO2Nhc2VgYmlnaW50YDpyZXR1cm5gJHtlfW5gO2Nhc2Vgb2JqZWN0YDpyZXR1cm4gdGhpcy4kb2JqZWN0KGUpO2Nhc2VgZnVuY3Rpb25gOnJldHVybiB0aGlzLiRmdW5jdGlvbihlKX1yZXR1cm4gU3RyaW5nKGUpfXNlcmlhbGl6ZU9iamVjdChlKXtsZXQgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYodCE9PWBbb2JqZWN0IE9iamVjdF1gKXJldHVybiB0aGlzLnNlcmlhbGl6ZUJ1aWx0SW5UeXBlKHQubGVuZ3RoPDEwP2B1bmtub3duOiR7dH1gOnQuc2xpY2UoOCwtMSksZSk7bGV0IG49ZS5jb25zdHJ1Y3RvcixyPW49PT1PYmplY3R8fG49PT12b2lkIDA/YGA6bi5uYW1lO2lmKHIhPT1gYCYmZ2xvYmFsVGhpc1tyXT09PW4pcmV0dXJuIHRoaXMuc2VyaWFsaXplQnVpbHRJblR5cGUocixlKTtpZihgdG9KU09OYGluIGUmJnR5cGVvZiBlLnRvSlNPTj09YGZ1bmN0aW9uYCl7bGV0IHQ9ZS50b0pTT04oKTtyZXR1cm4gcisodHlwZW9mIHQ9PWBvYmplY3RgJiZ0P3RoaXMuJG9iamVjdCh0KTpgKCR7dGhpcy5zZXJpYWxpemUodCl9KWApfWxldCBpPU9iamVjdC5rZXlzKGUpLnNvcnQocnkpLGE9YCR7cn17YDtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IG49aVt0XTthKz1gJHtufToke3RoaXMuc2VyaWFsaXplKGVbbl0pfWAsdDxpLmxlbmd0aC0xJiYoYSs9YCxgKX1yZXR1cm4gYStgfWB9c2VyaWFsaXplQnVpbHRJblR5cGUoZSx0KXtsZXQgbj10aGlzW2AkYCtlXTtpZihuKXJldHVybiBuLmNhbGwodGhpcyx0KTtpZih0eXBlb2YgdC5lbnRyaWVzPT1gZnVuY3Rpb25gKXJldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0LmVudHJpZXMoKSk7dGhyb3cgRXJyb3IoYENhbm5vdCBzZXJpYWxpemUgJHtlfWApfXNlcmlhbGl6ZU9iamVjdEVudHJpZXMoZSx0KXtsZXQgbj1BcnJheS5mcm9tKHQpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlWzBdLHRbMF0pKSxyPWAke2V9e2A7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2xldFt0LGldPW5bZV07cis9YCR7dGhpcy5zZXJpYWxpemUodCwhMCl9OiR7dGhpcy5zZXJpYWxpemUoaSl9YCxlPG4ubGVuZ3RoLTEmJihyKz1gLGApfXJldHVybiByK2B9YH0kb2JqZWN0KGUpe2xldCB0PXRoaXMuI2UuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiYodGhpcy4jZS5zZXQoZSxgIyR7dGhpcy4jZS5zaXplfWApLHQ9dGhpcy5zZXJpYWxpemVPYmplY3QoZSksdGhpcy4jZS5zZXQoZSx0KSksdH0kZnVuY3Rpb24oZSl7bGV0IHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc2xpY2UoLTE1KT09PWBbbmF0aXZlIGNvZGVdIH1gP2Ake2UubmFtZXx8YGB9KClbbmF0aXZlXWA6YCR7ZS5uYW1lfSgke2UubGVuZ3RofSkke3QucmVwbGFjZSgvXHMqXG5ccyovZyxgYCl9YH0kQXJyYXkoZSl7bGV0IHQ9YFtgO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPXRoaXMuc2VyaWFsaXplKGVbbl0pLG48ZS5sZW5ndGgtMSYmKHQrPWAsYCk7cmV0dXJuIHQrYF1gfSREYXRlKGUpe3RyeXtyZXR1cm5gRGF0ZSgke2UudG9JU09TdHJpbmcoKX0pYH1jYXRjaHtyZXR1cm5gRGF0ZShudWxsKWB9fSRBcnJheUJ1ZmZlcihlKXtyZXR1cm5gQXJyYXlCdWZmZXJbJHtuZXcgVWludDhBcnJheShlKS5qb2luKGAsYCl9XWB9JFNldChlKXtyZXR1cm5gU2V0JHt0aGlzLiRBcnJheShBcnJheS5mcm9tKGUpLnNvcnQoKGUsdCk9PnRoaXMuY29tcGFyZShlLHQpKSl9YH0kTWFwKGUpe3JldHVybiB0aGlzLnNlcmlhbGl6ZU9iamVjdEVudHJpZXMoYE1hcGAsZS5lbnRyaWVzKCkpfX1mb3IobGV0IHQgb2ZbYEVycm9yYCxgUmVnRXhwYCxgVVJMYF0pZS5wcm90b3R5cGVbYCRgK3RdPWZ1bmN0aW9uKGUpe3JldHVybmAke3R9KCR7ZX0pYH07Zm9yKGxldCB0IG9mW2BJbnQ4QXJyYXlgLGBVaW50OEFycmF5YCxgVWludDhDbGFtcGVkQXJyYXlgLGBJbnQxNkFycmF5YCxgVWludDE2QXJyYXlgLGBJbnQzMkFycmF5YCxgVWludDMyQXJyYXlgLGBGbG9hdDMyQXJyYXlgLGBGbG9hdDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYCxgKX1dYH07Zm9yKGxldCB0IG9mW2BCaWdJbnQ2NEFycmF5YCxgQmlnVWludDY0QXJyYXlgXSllLnByb3RvdHlwZVtgJGArdF09ZnVuY3Rpb24oZSl7cmV0dXJuYCR7dH1bJHtlLmpvaW4oYG4sYCl9JHtlLmxlbmd0aD4wP2BuYDpgYH1dYH07cmV0dXJuIGV9KSgpO2Z1bmN0aW9uIGF5KGUsdCl7cmV0dXJuIGU9PT10fHxleShlKT09PWV5KHQpfWZ1bmN0aW9uIG95KGUsdCl7bGV0IG49dHlwZW9mIGU9PWBzdHJpbmdgJiYhdD9gJHtlfUNvbnRleHRgOnQscj1TeW1ib2wobik7cmV0dXJuW3Q9PntsZXQgbj15cihyLHQpO2lmKG58fG49PT1udWxsKXJldHVybiBuO3Rocm93IEVycm9yKGBJbmplY3Rpb24gXGAke3IudG9TdHJpbmcoKX1cYCBub3QgZm91bmQuIENvbXBvbmVudCBtdXN0IGJlIHVzZWQgd2l0aGluICR7QXJyYXkuaXNBcnJheShlKT9gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJHtlLmpvaW4oYCwgYCl9YDpgXGAke2V9XGBgfWApfSxlPT4odnIocixlKSxlKV19ZnVuY3Rpb24gc3koKXtsZXQgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKGU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKDtlIT1udWxsJiZlLnNoYWRvd1Jvb3QhPW51bGwmJmUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50IT1udWxsOyllPWUuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBlfWZ1bmN0aW9uIGN5KGUpe3JldHVybiBlPT1udWxsfWZ1bmN0aW9uIGx5KGUsdCl7cmV0dXJuIGN5KGUpPyExOkFycmF5LmlzQXJyYXkoZSk/ZS5zb21lKGU9PmF5KGUsdCkpOmF5KGUsdCl9ZnVuY3Rpb24gdXkoZSx0KXtyZXR1cm4gRmUoKT8oSWUoZSx0KSwhMCk6ITF9ZnVuY3Rpb24gZHkoZSl7bGV0IHQ9ITEsbixyPVBlKCEwKTtyZXR1cm4oKC4uLmkpPT4odHx8PShuPXIucnVuKCgpPT5lKC4uLmkpKSwhMCksbikpfXZhciBmeT10eXBlb2Ygd2luZG93PGB1YCYmdHlwZW9mIGRvY3VtZW50PGB1YDt0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8YHVgJiZnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7dmFyIHB5PWU9PmUhPT12b2lkIDAsbXk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoeT1lPT5teS5jYWxsKGUpPT09YFtvYmplY3QgT2JqZWN0XWAsZ3k9X3koKTtmdW5jdGlvbiBfeSgpe3ZhciBlLHQ7cmV0dXJuIGZ5JiYhISgoZT13aW5kb3cpIT1udWxsJiYoZT1lLm5hdmlnYXRvcikhPW51bGwmJmUudXNlckFnZW50KSYmKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KXx8KCh0PXdpbmRvdyk9PW51bGx8fCh0PXQubmF2aWdhdG9yKT09bnVsbD92b2lkIDA6dC5tYXhUb3VjaFBvaW50cyk+MiYmL2lQYWR8TWFjaW50b3NoLy50ZXN0KHdpbmRvdz8ubmF2aWdhdG9yLnVzZXJBZ2VudCkpfWZ1bmN0aW9uIHZ5KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W2VdfWZ1bmN0aW9uIHl5KGUpe3JldHVybiBlfHxGcygpfWZ1bmN0aW9uIGJ5KGUpe2lmKCFmeSlyZXR1cm4gZTtsZXQgdD0wLG4scixpPSgpPT57LS10LHImJnQ8PTAmJihyLnN0b3AoKSxuPXZvaWQgMCxyPXZvaWQgMCl9O3JldHVybigoLi4uYSk9Pih0Kz0xLHJ8fChyPVBlKCEwKSxuPXIucnVuKCgpPT5lKC4uLmEpKSksdXkoaSksbikpfWZ1bmN0aW9uIHh5KGUpe3JldHVybiBadChqKGUpP25ldyBQcm94eSh7fSx7Z2V0KHQsbixyKXtyZXR1cm4gTihSZWZsZWN0LmdldChlLnZhbHVlLG4scikpfSxzZXQodCxuLHIpe3JldHVybiBqKGUudmFsdWVbbl0pJiYhaihyKT9lLnZhbHVlW25dLnZhbHVlPXI6ZS52YWx1ZVtuXT1yLCEwfSxkZWxldGVQcm9wZXJ0eSh0LG4pe3JldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUudmFsdWUsbil9LGhhcyh0LG4pe3JldHVybiBSZWZsZWN0LmhhcyhlLnZhbHVlLG4pfSxvd25LZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUudmFsdWUpfSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKXtyZXR1cm57ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9fX0pOmUpfWZ1bmN0aW9uIFN5KGUpe3JldHVybiB4eShXKGUpKX1mdW5jdGlvbiBDeShlLC4uLnQpe2xldCBuPXQuZmxhdCgpLHI9blswXTtyZXR1cm4gU3koKCk9Pk9iamVjdC5mcm9tRW50cmllcyh0eXBlb2Ygcj09YGZ1bmN0aW9uYD9PYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKChbZSx0XSk9PiFyKG1uKHQpLGUpKTpPYmplY3QuZW50cmllcyh5bihlKSkuZmlsdGVyKGU9PiFuLmluY2x1ZGVzKGVbMF0pKSkpfWZ1bmN0aW9uIHd5KGUsdD0xZTQpe3JldHVybiB2bigobixyKT0+e2xldCBpPW1uKGUpLGEsbz0oKT0+c2V0VGltZW91dCgoKT0+e2k9bW4oZSkscigpfSxtbih0KSk7cmV0dXJuIHV5KCgpPT57Y2xlYXJUaW1lb3V0KGEpfSkse2dldCgpe3JldHVybiBuKCksaX0sc2V0KGUpe2k9ZSxyKCksY2xlYXJUaW1lb3V0KGEpLGE9bygpfX19KX1mdW5jdGlvbiBUeShlLHQpe3l5KHQpJiZlYShlLHQpfWZ1bmN0aW9uIEV5KGUsdCxuKXtyZXR1cm4gRXIoZSx0LHsuLi5uLGltbWVkaWF0ZTohMH0pfXZhciBEeT1meT93aW5kb3c6dm9pZCAwO2Z5JiZ3aW5kb3cuZG9jdW1lbnQsZnkmJndpbmRvdy5uYXZpZ2F0b3IsZnkmJndpbmRvdy5sb2NhdGlvbjtmdW5jdGlvbiBPeShlKXtsZXQgdD1tbihlKTtyZXR1cm4gdD8uJGVsPz90fWZ1bmN0aW9uIGt5KC4uLmUpe2xldCB0PShlLHQsbixyKT0+KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sciksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4scikpLG49VygoKT0+e2xldCB0PXZ5KG1uKGVbMF0pKS5maWx0ZXIoZT0+ZSE9bnVsbCk7cmV0dXJuIHQuZXZlcnkoZT0+dHlwZW9mIGUhPWBzdHJpbmdgKT90OnZvaWQgMH0pO3JldHVybiBFeSgoKT0+W24udmFsdWU/Lm1hcChlPT5PeShlKSk/P1tEeV0uZmlsdGVyKGU9PmUhPW51bGwpLHZ5KG1uKG4udmFsdWU/ZVsxXTplWzBdKSksdnkoTihuLnZhbHVlP2VbMl06ZVsxXSkpLG1uKG4udmFsdWU/ZVszXTplWzJdKV0sKFtlLG4scixpXSxhLG8pPT57aWYoIWU/Lmxlbmd0aHx8IW4/Lmxlbmd0aHx8IXI/Lmxlbmd0aClyZXR1cm47bGV0IHM9aHkoaSk/ey4uLml9OmksYz1lLmZsYXRNYXAoZT0+bi5mbGF0TWFwKG49PnIubWFwKHI9PnQoZSxuLHIscykpKSk7bygoKT0+e2MuZm9yRWFjaChlPT5lKCkpfSl9LHtmbHVzaDpgcG9zdGB9KX1mdW5jdGlvbiBBeSgpe2xldCBlPXVuKCExKSx0PUZzKCk7cmV0dXJuIHQmJlppKCgpPT57ZS52YWx1ZT0hMH0sdCksZX1mdW5jdGlvbiBqeShlKXtsZXQgdD1BeSgpO3JldHVybiBXKCgpPT4odC52YWx1ZSwhIWUoKSkpfWZ1bmN0aW9uIE15KGUpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lOnR5cGVvZiBlPT1gc3RyaW5nYD90PT50LmtleT09PWU6QXJyYXkuaXNBcnJheShlKT90PT5lLmluY2x1ZGVzKHQua2V5KTooKT0+ITB9ZnVuY3Rpb24gTnkoLi4uZSl7bGV0IHQsbixyPXt9O2UubGVuZ3RoPT09Mz8odD1lWzBdLG49ZVsxXSxyPWVbMl0pOmUubGVuZ3RoPT09Mj90eXBlb2YgZVsxXT09YG9iamVjdGA/KHQ9ITAsbj1lWzBdLHI9ZVsxXSk6KHQ9ZVswXSxuPWVbMV0pOih0PSEwLG49ZVswXSk7bGV0e3RhcmdldDppPUR5LGV2ZW50TmFtZTphPWBrZXlkb3duYCxwYXNzaXZlOm89ITEsZGVkdXBlOnM9ITF9PXIsYz1NeSh0KTtyZXR1cm4ga3koaSxhLGU9PntlLnJlcGVhdCYmbW4ocyl8fGMoZSkmJm4oZSl9LG8pfWZ1bmN0aW9uIFB5KGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiBGeShlLHQsbj17fSl7bGV0e3dpbmRvdzpyPUR5LC4uLml9PW4sYSxvPWp5KCgpPT5yJiZgUmVzaXplT2JzZXJ2ZXJgaW4gcikscz0oKT0+e2EmJj0oYS5kaXNjb25uZWN0KCksdm9pZCAwKX0sYz1FcihXKCgpPT57bGV0IHQ9bW4oZSk7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5tYXAoZT0+T3koZSkpOltPeSh0KV19KSxlPT57aWYocygpLG8udmFsdWUmJnIpe2E9bmV3IFJlc2l6ZU9ic2VydmVyKHQpO2ZvcihsZXQgdCBvZiBlKXQmJmEub2JzZXJ2ZSh0LGkpfX0se2ltbWVkaWF0ZTohMCxmbHVzaDpgcG9zdGB9KSxsPSgpPT57cygpLGMoKX07cmV0dXJuIHV5KGwpLHtpc1N1cHBvcnRlZDpvLHN0b3A6bH19ZnVuY3Rpb24gSXkoZSx0LG4scj17fSl7dmFyIGksYTtsZXR7Y2xvbmU6bz0hMSxwYXNzaXZlOnM9ITEsZXZlbnROYW1lOmMsZGVlcDpsPSExLGRlZmF1bHRWYWx1ZTp1LHNob3VsZEVtaXQ6ZH09cixmPUZzKCkscD1ufHxmPy5lbWl0fHwoZj09bnVsbHx8KGk9Zi4kZW1pdCk9PW51bGw/dm9pZCAwOmkuYmluZChmKSl8fChmPT1udWxsfHwoYT1mLnByb3h5KT09bnVsbHx8KGE9YS4kZW1pdCk9PW51bGw/dm9pZCAwOmEuYmluZChmPy5wcm94eSkpLG09Yzt0fHw9YG1vZGVsVmFsdWVgLG18fD1gdXBkYXRlOiR7dC50b1N0cmluZygpfWA7bGV0IGg9ZT0+bz90eXBlb2Ygbz09YGZ1bmN0aW9uYD9vKGUpOlB5KGUpOmUsZz0oKT0+cHkoZVt0XSk/aChlW3RdKTp1LF89ZT0+e2Q/ZChlKSYmcChtLGUpOnAobSxlKX07aWYocyl7bGV0IG49TShnKCkpLHI9ITE7cmV0dXJuIEVyKCgpPT5lW3RdLGU9PntyfHwocj0hMCxuLnZhbHVlPWgoZSksUW4oKCk9PnI9ITEpKX0pLEVyKG4sbj0+eyFyJiYobiE9PWVbdF18fGwpJiZfKG4pfSx7ZGVlcDpsfSksbn1yZXR1cm4gVyh7Z2V0KCl7cmV0dXJuIGcoKX0sc2V0KGUpe18oZSl9fSl9ZnVuY3Rpb24gTHkoZSl7cmV0dXJuIGU/ZS5mbGF0TWFwKGU9PmUudHlwZT09PUw/THkoZS5jaGlsZHJlbik6W2VdKTpbXX12YXIgUnk9W2BJTlBVVGAsYFRFWFRBUkVBYF07ZnVuY3Rpb24genkoZSx0LG4scj17fSl7aWYoIXR8fHIuZW5hYmxlSWdub3JlZEVsZW1lbnQmJlJ5LmluY2x1ZGVzKHQubm9kZU5hbWUpKXJldHVybiBudWxsO2xldHthcnJvd0tleU9wdGlvbnM6aT1gYm90aGAsYXR0cmlidXRlTmFtZTphPWBbZGF0YS1yZWthLWNvbGxlY3Rpb24taXRlbV1gLGl0ZW1zQXJyYXk6bz1bXSxsb29wOnM9ITAsZGlyOmM9YGx0cmAscHJldmVudFNjcm9sbDpsPSEwLGZvY3VzOnU9ITF9PXIsW2QsZixwLG0saCxnXT1bZS5rZXk9PT1gQXJyb3dSaWdodGAsZS5rZXk9PT1gQXJyb3dMZWZ0YCxlLmtleT09PWBBcnJvd1VwYCxlLmtleT09PWBBcnJvd0Rvd25gLGUua2V5PT09YEhvbWVgLGUua2V5PT09YEVuZGBdLF89cHx8bSx2PWR8fGY7aWYoIWgmJiFnJiYoIV8mJiF2fHxpPT09YHZlcnRpY2FsYCYmdnx8aT09PWBob3Jpem9udGFsYCYmXykpcmV0dXJuIG51bGw7bGV0IHk9bj9BcnJheS5mcm9tKG4ucXVlcnlTZWxlY3RvckFsbChhKSk6bztpZigheS5sZW5ndGgpcmV0dXJuIG51bGw7bCYmZS5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPW51bGw7cmV0dXJuIHZ8fF8/Yj1CeSh5LHQse2dvRm9yd2FyZDpfP206Yz09PWBsdHJgP2Q6Zixsb29wOnN9KTpoP2I9eS5hdCgwKXx8bnVsbDpnJiYoYj15LmF0KC0xKXx8bnVsbCksdSYmYj8uZm9jdXMoKSxifWZ1bmN0aW9uIEJ5KGUsdCxuLHI9ZS5pbmNsdWRlcyh0KT9lLmxlbmd0aDplLmxlbmd0aCsxKXtpZigtLXI9PT0wKXJldHVybiBudWxsO2xldCBpPWUuaW5kZXhPZih0KSxhO2lmKGE9aT09PS0xP24uZ29Gb3J3YXJkPzA6ZS5sZW5ndGgtMTpuLmdvRm9yd2FyZD9pKzE6aS0xLCFuLmxvb3AmJihhPDB8fGE+PWUubGVuZ3RoKSlyZXR1cm4gbnVsbDtsZXQgbz1lWyhhK2UubGVuZ3RoKSVlLmxlbmd0aF07cmV0dXJuIG8/by5oYXNBdHRyaWJ1dGUoYGRpc2FibGVkYCkmJm8uZ2V0QXR0cmlidXRlKGBkaXNhYmxlZGApIT09YGZhbHNlYD9CeShlLG8sbixyKTpvOm51bGx9dmFyW1Z5LEh5XT1veShgQ29uZmlnUHJvdmlkZXJgKTtmdW5jdGlvbiBVeShlKXtsZXQgdD1WeSh7ZGlyOk0oYGx0cmApfSk7cmV0dXJuIFcoKCk9PmU/LnZhbHVlfHx0LmRpcj8udmFsdWV8fGBsdHJgKX1mdW5jdGlvbiBXeShlKXtsZXQgdD1GcygpLG49dD8udHlwZS5lbWl0cyxyPXt9O3JldHVybiBuPy5sZW5ndGh8fGNvbnNvbGUud2FybihgTm8gZW1pdHRlZCBldmVudCBmb3VuZC4gUGxlYXNlIGNoZWNrIGNvbXBvbmVudDogJHt0Py50eXBlLl9fbmFtZX1gKSxuPy5mb3JFYWNoKHQ9PntyW2NlKEUodCkpXT0oLi4ubik9PmUodCwuLi5uKX0pLHJ9ZnVuY3Rpb24gR3koKXtsZXQgZT1GcygpLHQ9TSgpLG49VygoKT0+cigpKTskaSgoKT0+e24udmFsdWUhPT1yKCkmJnBuKHQpfSk7ZnVuY3Rpb24gcigpe3JldHVybiB0LnZhbHVlJiZgJGVsYGluIHQudmFsdWUmJltgI3RleHRgLGAjY29tbWVudGBdLmluY2x1ZGVzKHQudmFsdWUuJGVsLm5vZGVOYW1lKT90LnZhbHVlLiRlbC5uZXh0RWxlbWVudFNpYmxpbmc6T3kodCl9bGV0IGk9T2JqZWN0LmFzc2lnbih7fSxlLmV4cG9zZWQpLGE9e307Zm9yKGxldCB0IGluIGUucHJvcHMpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5lLnByb3BzW3RdfSk7aWYoT2JqZWN0LmtleXMoaSkubGVuZ3RoPjApZm9yKGxldCBlIGluIGkpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5pW2VdfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIiRlbCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZS52bm9kZS5lbH0pLGUuZXhwb3NlZD1hO2Z1bmN0aW9uIG8obil7aWYodC52YWx1ZT1uLG4mJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiJGVsIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5uIGluc3RhbmNlb2YgRWxlbWVudD9uOm4uJGVsfSksIShuIGluc3RhbmNlb2YgRWxlbWVudCkmJiFPYmplY3QuaGFzT3duKG4sYCRlbGApKSl7bGV0IHQ9bi4kLmV4cG9zZWQscj1PYmplY3QuYXNzaWduKHt9LGEpO2ZvcihsZXQgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dFtlXX0pO2UuZXhwb3NlZD1yfX1yZXR1cm57Zm9yd2FyZFJlZjpvLGN1cnJlbnRSZWY6dCxjdXJyZW50RWxlbWVudDpufX1mdW5jdGlvbiBLeShlKXtsZXQgdD1GcygpLG49T2JqZWN0LmtleXModD8udHlwZS5wcm9wcz8/e30pLnJlZHVjZSgoZSxuKT0+e2xldCByPSh0Py50eXBlLnByb3BzW25dKS5kZWZhdWx0O3JldHVybiByIT09dm9pZCAwJiYoZVtuXT1yKSxlfSx7fSkscj1TbihlKTtyZXR1cm4gVygoKT0+e2xldCBlPXt9LGk9dD8udm5vZGUucHJvcHM/P3t9O3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKHQ9PntlW0UodCldPWlbdF19KSxPYmplY3Qua2V5cyh7Li4ubiwuLi5lfSkucmVkdWNlKChlLHQpPT4oci52YWx1ZVt0XSE9PXZvaWQgMCYmKGVbdF09ci52YWx1ZVt0XSksZSkse30pfSl9ZnVuY3Rpb24gcXkoZSx0KXtsZXQgbj1LeShlKSxyPXQ/V3kodCk6e307cmV0dXJuIFcoKCk9Pih7Li4ubi52YWx1ZSwuLi5yfSkpfXZhciBKeT0wO2Z1bmN0aW9uIFl5KGUsdD1gcmVrYWApe2lmKGUpcmV0dXJuIGU7bGV0IG4scj1WeSh7dXNlSWQ6dm9pZCAwfSk7cmV0dXJuIG49ci51c2VJZD9yLnVzZUlkKCk6YHVzZUlkYGluIGJ1P2FpPy4oKTpgJHsrK0p5fWAsdD9gJHt0fS0ke259YDpufWZ1bmN0aW9uIFh5KGUsdCl7bGV0IG49TShlKTtmdW5jdGlvbiByKGUpe3JldHVybiB0W24udmFsdWVdW2VdPz9uLnZhbHVlfXJldHVybntzdGF0ZTpuLGRpc3BhdGNoOmU9PntuLnZhbHVlPXIoZSl9fX1mdW5jdGlvbiBaeShlLHQpe2xldCBuPU0oe30pLHI9TShgbm9uZWApLGk9TShlKSxhPWUudmFsdWU/YG1vdW50ZWRgOmB1bm1vdW50ZWRgLG8scz10LnZhbHVlPy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Pz9EeSx7c3RhdGU6YyxkaXNwYXRjaDpsfT1YeShhLHttb3VudGVkOntVTk1PVU5UOmB1bm1vdW50ZWRgLEFOSU1BVElPTl9PVVQ6YHVubW91bnRTdXNwZW5kZWRgfSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDpgbW91bnRlZGAsQU5JTUFUSU9OX0VORDpgdW5tb3VudGVkYH0sdW5tb3VudGVkOntNT1VOVDpgbW91bnRlZGB9fSksdT1lPT57aWYoZnkpe2xldCBuPW5ldyBDdXN0b21FdmVudChlLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTt0LnZhbHVlPy5kaXNwYXRjaEV2ZW50KG4pfX07RXIoZSxhc3luYyhlLGkpPT57bGV0IGE9aSE9PWU7aWYoYXdhaXQgUW4oKSxhKXtsZXQgYT1yLnZhbHVlLG89UXkodC52YWx1ZSk7ZT8obChgTU9VTlRgKSx1KGBlbnRlcmApLG89PT1gbm9uZWAmJnUoYGFmdGVyLWVudGVyYCkpOm89PT1gbm9uZWB8fG89PT1gdW5kZWZpbmVkYHx8bi52YWx1ZT8uZGlzcGxheT09PWBub25lYD8obChgVU5NT1VOVGApLHUoYGxlYXZlYCksdShgYWZ0ZXItbGVhdmVgKSk6aSYmYSE9PW8/KGwoYEFOSU1BVElPTl9PVVRgKSx1KGBsZWF2ZWApKToobChgVU5NT1VOVGApLHUoYGFmdGVyLWxlYXZlYCkpfX0se2ltbWVkaWF0ZTohMH0pO2xldCBkPWU9PntpZihlLnRhcmdldCE9PXQudmFsdWUpcmV0dXJuO2xldCBuPVF5KHQudmFsdWUpLHI9bi5pbmNsdWRlcyhDU1MuZXNjYXBlKGUuYW5pbWF0aW9uTmFtZSkpLGE9Yy52YWx1ZT09PWBtb3VudGVkYD9gZW50ZXJgOmBsZWF2ZWA7aWYociYmKHUoYGFmdGVyLSR7YX1gKSxsKGBBTklNQVRJT05fRU5EYCksIWkudmFsdWUpKXtsZXQgZT10LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlO3QudmFsdWUuc3R5bGUuYW5pbWF0aW9uRmlsbE1vZGU9YGZvcndhcmRzYCxvPXM/LnNldFRpbWVvdXQoKCk9Pnt0LnZhbHVlPy5zdHlsZS5hbmltYXRpb25GaWxsTW9kZT09PWBmb3J3YXJkc2AmJih0LnZhbHVlLnN0eWxlLmFuaW1hdGlvbkZpbGxNb2RlPWUpfSl9bj09PWBub25lYCYmbChgQU5JTUFUSU9OX0VORGApfSxmPWU9PntlLnRhcmdldD09PXQudmFsdWUmJihyLnZhbHVlPVF5KHQudmFsdWUpKX0scD1Fcih0LChlLHQpPT57ZT8obi52YWx1ZT1nZXRDb21wdXRlZFN0eWxlKGUpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uc3RhcnRgLGYpLGUuYWRkRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uY2FuY2VsYCxkKSxlLmFkZEV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpOihsKGBBTklNQVRJT05fRU5EYCksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbnN0YXJ0YCxmKSx0Py5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFuaW1hdGlvbmVuZGAsZCkpfSx7aW1tZWRpYXRlOiEwfSksbT1FcihjLCgpPT57bGV0IGU9UXkodC52YWx1ZSk7ci52YWx1ZT1jLnZhbHVlPT09YG1vdW50ZWRgP2U6YG5vbmVgfSk7cmV0dXJuIHRhKCgpPT57cCgpLG0oKSx0LnZhbHVlJiYodC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25zdGFydGAsZiksdC52YWx1ZS5yZW1vdmVFdmVudExpc3RlbmVyKGBhbmltYXRpb25jYW5jZWxgLGQpLHQudmFsdWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYW5pbWF0aW9uZW5kYCxkKSksbyE9PXZvaWQgMCYmcz8uY2xlYXJUaW1lb3V0KG8pfSkse2lzUHJlc2VudDpXKCgpPT5bYG1vdW50ZWRgLGB1bm1vdW50U3VzcGVuZGVkYF0uaW5jbHVkZXMoYy52YWx1ZSkpfX1mdW5jdGlvbiBReShlKXtyZXR1cm4gZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKS5hbmltYXRpb25OYW1lfHxgbm9uZWB9dmFyICR5PUYoe25hbWU6YFByZXNlbmNlYCxwcm9wczp7cHJlc2VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW59fSxzbG90czp7fSxzZXR1cChlLHtzbG90czp0LGV4cG9zZTpufSl7bGV0e3ByZXNlbnQ6cixmb3JjZU1vdW50Oml9PXluKGUpLGE9TSgpLHtpc1ByZXNlbnQ6b309WnkocixhKTtuKHtwcmVzZW50Om99KTtsZXQgcz10LmRlZmF1bHQoe3ByZXNlbnQ6by52YWx1ZX0pO3M9THkoc3x8W10pO2xldCBjPUZzKCk7aWYocyYmcz8ubGVuZ3RoPjEpe2xldCBlPWM/LnBhcmVudD8udHlwZS5uYW1lP2A8JHtjLnBhcmVudC50eXBlLm5hbWV9IC8+YDpgY29tcG9uZW50YDt0aHJvdyBFcnJvcihbYERldGVjdGVkIGFuIGludmFsaWQgY2hpbGRyZW4gZm9yIFxgJHtlfVxgIGZvciAgXGBQcmVzZW5jZVxgIGNvbXBvbmVudC5gLGBgLCJOb3RlOiBQcmVzZW5jZSB3b3JrcyBzaW1pbGFybHkgdG8gYHYtaWZgIGRpcmVjdGx5LCBidXQgaXQgd2FpdHMgZm9yIGFuaW1hdGlvbi90cmFuc2l0aW9uIHRvIGZpbmlzaGVkIGJlZm9yZSB1bm1vdW50aW5nLiBTbyBpdCBleHBlY3Qgb25seSBvbmUgZGlyZWN0IGNoaWxkIG9mIHZhbGlkIFZOb2RlIHR5cGUuIixgWW91IGNhbiBhcHBseSBhIGZldyBzb2x1dGlvbnM6YCxbIlByb3ZpZGUgYSBzaW5nbGUgY2hpbGQgZWxlbWVudCBzbyB0aGF0IGBwcmVzZW5jZWAgZGlyZWN0aXZlIGF0dGFjaCBjb3JyZWN0bHkuIixgRW5zdXJlIHRoZSBmaXJzdCBjaGlsZCBpcyBhbiBhY3R1YWwgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmF3IHRleHQgbm9kZSBvciBjb21tZW50IG5vZGUuYF0ubWFwKGU9PmAgIC0gJHtlfWApLmpvaW4oYApgKV0uam9pbihgCmApKX1yZXR1cm4oKT0+aS52YWx1ZXx8ci52YWx1ZXx8by52YWx1ZT9HKHQuZGVmYXVsdCh7cHJlc2VudDpvLnZhbHVlfSlbMF0se3JlZjplPT57bGV0IHQ9T3koZSk7cmV0dXJuIHQ/Lmhhc0F0dHJpYnV0ZT09PXZvaWQgMHx8KHQ/Lmhhc0F0dHJpYnV0ZShgZGF0YS1yZWthLXBvcHBlci1jb250ZW50LXdyYXBwZXJgKT9hLnZhbHVlPXQuZmlyc3RFbGVtZW50Q2hpbGQ6YS52YWx1ZT10KSx0fX0pOm51bGx9fSksZWI9Rih7bmFtZTpgUHJpbWl0aXZlU2xvdGAsaW5oZXJpdEF0dHJzOiExLHNldHVwKGUse2F0dHJzOnQsc2xvdHM6bn0pe3JldHVybigpPT57aWYoIW4uZGVmYXVsdClyZXR1cm4gbnVsbDtsZXQgZT1MeShuLmRlZmF1bHQoKSkscj1lLmZpbmRJbmRleChlPT5lLnR5cGUhPT1jcyk7aWYocj09PS0xKXJldHVybiBlO2xldCBpPWVbcl07ZGVsZXRlIGkucHJvcHM/LnJlZjtsZXQgYT1pLnByb3BzP2tzKHQsaS5wcm9wcyk6dCxvPUNzKHsuLi5pLHByb3BzOnt9fSxhKTtyZXR1cm4gZS5sZW5ndGg9PT0xP286KGVbcl09byxlKX19fSksdGI9W2BhcmVhYCxgaW1nYCxgaW5wdXRgXSxuYj1GKHtuYW1lOmBQcmltaXRpdmVgLGluaGVyaXRBdHRyczohMSxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFzOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxkZWZhdWx0OmBkaXZgfX0sc2V0dXAoZSx7YXR0cnM6dCxzbG90czpufSl7bGV0IHI9ZS5hc0NoaWxkP2B0ZW1wbGF0ZWA6ZS5hcztyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgJiZ0Yi5pbmNsdWRlcyhyKT8oKT0+RyhyLHQpOnI9PT1gdGVtcGxhdGVgPygpPT5HKGViLHQse2RlZmF1bHQ6bi5kZWZhdWx0fSk6KCk9PkcoZS5hcyx0LHtkZWZhdWx0Om4uZGVmYXVsdH0pfX0pO2Z1bmN0aW9uIHJiKCl7bGV0IGU9TSgpO3JldHVybntwcmltaXRpdmVFbGVtZW50OmUsY3VycmVudEVsZW1lbnQ6VygoKT0+W2AjdGV4dGAsYCNjb21tZW50YF0uaW5jbHVkZXMoZS52YWx1ZT8uJGVsLm5vZGVOYW1lKT9lLnZhbHVlPy4kZWwubmV4dEVsZW1lbnRTaWJsaW5nOk95KGUpKX19dmFyW2liLGFiXT1veShgQ29sbGFwc2libGVSb290YCksb2I9Rih7X19uYW1lOmBDb2xsYXBzaWJsZVJvb3RgLHByb3BzOntkZWZhdWx0T3Blbjp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LG9wZW46e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OnZvaWQgMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LGVtaXRzOltgdXBkYXRlOm9wZW5gXSxzZXR1cChlLHtleHBvc2U6dCxlbWl0Om59KXtsZXQgcj1lLGk9SXkocixgb3BlbmAsbix7ZGVmYXVsdFZhbHVlOnIuZGVmYXVsdE9wZW4scGFzc2l2ZTpyLm9wZW49PT12b2lkIDB9KSx7ZGlzYWJsZWQ6YSx1bm1vdW50T25IaWRlOm99PXluKHIpO3JldHVybiBhYih7Y29udGVudElkOmBgLGRpc2FibGVkOmEsb3BlbjppLHVubW91bnRPbkhpZGU6byxvbk9wZW5Ub2dnbGU6KCk9PnthLnZhbHVlfHwoaS52YWx1ZT0haS52YWx1ZSl9fSksdCh7b3BlbjppfSksR3koKSwoZSx0KT0+KFIoKSxCKE4obmIpLHthczplLmFzLCJhcy1jaGlsZCI6ci5hc0NoaWxkLCJkYXRhLXN0YXRlIjpOKGkpP2BvcGVuYDpgY2xvc2VkYCwiZGF0YS1kaXNhYmxlZCI6TihhKT9gYDp2b2lkIDB9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx7b3BlbjpOKGkpfSldKSxfOjN9LDgsW2Bhc2AsYGFzLWNoaWxkYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLHNiPUYoe2luaGVyaXRBdHRyczohMSxfX25hbWU6YENvbGxhcHNpYmxlQ29udGVudGAscHJvcHM6e2ZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sZW1pdHM6W2Bjb250ZW50Rm91bmRgXSxzZXR1cChlLHtlbWl0OnR9KXtsZXQgbj1lLHI9dCxpPWliKCk7aS5jb250ZW50SWR8fD1ZeSh2b2lkIDAsYHJla2EtY29sbGFwc2libGUtY29udGVudGApO2xldCBhPU0oKSx7Zm9yd2FyZFJlZjpvLGN1cnJlbnRFbGVtZW50OnN9PUd5KCksYz1NKDApLGw9TSgwKSx1PVcoKCk9Pmkub3Blbi52YWx1ZSksZD1NKHUudmFsdWUpLGY9TSgpO0VyKCgpPT5bdS52YWx1ZSxhLnZhbHVlPy5wcmVzZW50XSxhc3luYygpPT57YXdhaXQgUW4oKTtsZXQgZT1zLnZhbHVlO2lmKCFlKXJldHVybjtmLnZhbHVlPWYudmFsdWV8fHt0cmFuc2l0aW9uRHVyYXRpb246ZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24sYW5pbWF0aW9uTmFtZTplLnN0eWxlLmFuaW1hdGlvbk5hbWV9LGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAwc2AsZS5zdHlsZS5hbmltYXRpb25OYW1lPWBub25lYDtsZXQgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2wudmFsdWU9dC5oZWlnaHQsYy52YWx1ZT10LndpZHRoLGQudmFsdWV8fChlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1mLnZhbHVlLnRyYW5zaXRpb25EdXJhdGlvbixlLnN0eWxlLmFuaW1hdGlvbk5hbWU9Zi52YWx1ZS5hbmltYXRpb25OYW1lKX0se2ltbWVkaWF0ZTohMH0pO2xldCBwPVcoKCk9PmQudmFsdWUmJmkub3Blbi52YWx1ZSk7cmV0dXJuIFppKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZC52YWx1ZT0hMX0pfSksa3kocyxgYmVmb3JlbWF0Y2hgLGU9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntpLm9uT3BlblRvZ2dsZSgpLHIoYGNvbnRlbnRGb3VuZGApfSl9KSwoZSx0KT0+KFIoKSxCKE4oJHkpLHtyZWZfa2V5OmBwcmVzZW50UmVmYCxyZWY6YSxwcmVzZW50OmUuZm9yY2VNb3VudHx8TihpKS5vcGVuLnZhbHVlLCJmb3JjZS1tb3VudCI6ITB9LHtkZWZhdWx0OlAoKHtwcmVzZW50OnR9KT0+W0goTihuYiksa3MoZS4kYXR0cnMse2lkOk4oaSkuY29udGVudElkLHJlZjpOKG8pLCJhcy1jaGlsZCI6bi5hc0NoaWxkLGFzOmUuYXMsaGlkZGVuOnQ/dm9pZCAwOk4oaSkudW5tb3VudE9uSGlkZS52YWx1ZT9gYDpgdW50aWwtZm91bmRgLCJkYXRhLXN0YXRlIjpwLnZhbHVlP3ZvaWQgMDpOKGkpLm9wZW4udmFsdWU/YG9wZW5gOmBjbG9zZWRgLCJkYXRhLWRpc2FibGVkIjpOKGkpLmRpc2FibGVkPy52YWx1ZT9gYDp2b2lkIDAsc3R5bGU6eyItLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQiOmAke2wudmFsdWV9cHhgLCItLXJla2EtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6YCR7Yy52YWx1ZX1weGB9fSkse2RlZmF1bHQ6UCgoKT0+WyFOKGkpLnVubW91bnRPbkhpZGUudmFsdWV8fHQ/SShlLiRzbG90cyxgZGVmYXVsdGAse2tleTowfSk6VHMoYHYtaWZgLCEwKV0pLF86Mn0sMTA0MCxbYGlkYCxgYXMtY2hpbGRgLGBhc2AsYGhpZGRlbmAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgc3R5bGVgXSldKSxfOjN9LDgsW2BwcmVzZW50YF0pKX19KSxjYj1GKHtfX25hbWU6YENvbGxhcHNpYmxlVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZTtHeSgpO2xldCBuPWliKCk7cmV0dXJuKGUscik9PihSKCksQihOKG5iKSx7dHlwZTplLmFzPT09YGJ1dHRvbmA/YGJ1dHRvbmA6dm9pZCAwLGFzOmUuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImFyaWEtY29udHJvbHMiOk4obikuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpOKG4pLm9wZW4udmFsdWUsImRhdGEtc3RhdGUiOk4obikub3Blbi52YWx1ZT9gb3BlbmA6YGNsb3NlZGAsImRhdGEtZGlzYWJsZWQiOk4obikuZGlzYWJsZWQ/LnZhbHVlP2BgOnZvaWQgMCxkaXNhYmxlZDpOKG4pLmRpc2FibGVkPy52YWx1ZSxvbkNsaWNrOk4obikub25PcGVuVG9nZ2xlfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgdHlwZWAsYGFzYCxgYXMtY2hpbGRgLGBhcmlhLWNvbnRyb2xzYCxgYXJpYS1leHBhbmRlZGAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGlzYWJsZWRgLGBvbkNsaWNrYF0pKX19KTtmdW5jdGlvbiBsYih7dHlwZTplLGRlZmF1bHRWYWx1ZTp0LG1vZGVsVmFsdWU6bn0pe2xldCByPW58fHQ7cmV0dXJuIG4hPT12b2lkIDB8fHQhPT12b2lkIDA/QXJyYXkuaXNBcnJheShyKT9gbXVsdGlwbGVgOmBzaW5nbGVgOmU/P2BzaW5nbGVgfWZ1bmN0aW9uIHViKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl7cmV0dXJuIGV8fGxiKHt0eXBlOmUsZGVmYXVsdFZhbHVlOnQsbW9kZWxWYWx1ZTpufSl9ZnVuY3Rpb24gZGIoe3R5cGU6ZSxkZWZhdWx0VmFsdWU6dH0pe3JldHVybiB0PT09dm9pZCAwP2U9PT1gc2luZ2xlYD92b2lkIDA6W106dH1mdW5jdGlvbiBmYihlLHQpe2xldCBuPVcoKCk9PnViKGUpKSxyPUl5KGUsYG1vZGVsVmFsdWVgLHQse2RlZmF1bHRWYWx1ZTpkYihlKSxwYXNzaXZlOmUubW9kZWxWYWx1ZT09PXZvaWQgMCxkZWVwOiEwfSk7ZnVuY3Rpb24gaShlKXtpZihuLnZhbHVlPT09YHNpbmdsZWApci52YWx1ZT1heShlLHIudmFsdWUpP3ZvaWQgMDplO2Vsc2V7bGV0IHQ9QXJyYXkuaXNBcnJheShyLnZhbHVlKT9bLi4uci52YWx1ZXx8W11dOltyLnZhbHVlXS5maWx0ZXIoQm9vbGVhbik7aWYobHkodCxlKSl7bGV0IG49dC5maW5kSW5kZXgodD0+YXkodCxlKSk7dC5zcGxpY2UobiwxKX1lbHNlIHQucHVzaChlKTtyLnZhbHVlPXR9fXJldHVybnttb2RlbFZhbHVlOnIsY2hhbmdlTW9kZWxWYWx1ZTppLGlzU2luZ2xlOlcoKCk9Pm4udmFsdWU9PT1gc2luZ2xlYCl9fXZhcltwYixtYl09b3koYEFjY29yZGlvblJvb3RgKSxoYj1GKHtfX25hbWU6YEFjY29yZGlvblJvb3RgLHByb3BzOntjb2xsYXBzaWJsZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sZGlyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMX0sb3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6YHZlcnRpY2FsYH0sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sdHlwZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LG1vZGVsVmFsdWU6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX0sZGVmYXVsdFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse2RpcjppLGRpc2FibGVkOmEsdW5tb3VudE9uSGlkZTpvfT15bihuKSxzPVV5KGkpLHttb2RlbFZhbHVlOmMsY2hhbmdlTW9kZWxWYWx1ZTpsLGlzU2luZ2xlOnV9PWZiKG4scikse2ZvcndhcmRSZWY6ZCxjdXJyZW50RWxlbWVudDpmfT1HeSgpO3JldHVybiBtYih7ZGlzYWJsZWQ6YSxkaXJlY3Rpb246cyxvcmllbnRhdGlvbjpuLm9yaWVudGF0aW9uLHBhcmVudEVsZW1lbnQ6Zixpc1NpbmdsZTp1LGNvbGxhcHNpYmxlOm4uY29sbGFwc2libGUsbW9kZWxWYWx1ZTpjLGNoYW5nZU1vZGVsVmFsdWU6bCx1bm1vdW50T25IaWRlOm99KSwoZSx0KT0+KFIoKSxCKE4obmIpLHtyZWY6TihkKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse21vZGVsVmFsdWU6TihjKX0pXSksXzozfSw4LFtgYXMtY2hpbGRgLGBhc2BdKSl9fSksZ2I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuT3Blbj1gb3BlbmAsZS5DbG9zZWQ9YGNsb3NlZGAsZX0oZ2J8fHt9KSxbX2IsdmJdPW95KGBBY2NvcmRpb25JdGVtYCkseWI9Rih7X19uYW1lOmBBY2NvcmRpb25JdGVtYCxwcm9wczp7ZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sdmFsdWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDp2b2lkIDB9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUse2V4cG9zZTp0fSl7bGV0IG49ZSxyPXBiKCksaT1XKCgpPT5yLmlzU2luZ2xlLnZhbHVlP24udmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWU6QXJyYXkuaXNBcnJheShyLm1vZGVsVmFsdWUudmFsdWUpJiZyLm1vZGVsVmFsdWUudmFsdWUuaW5jbHVkZXMobi52YWx1ZSkpLGE9VygoKT0+ci5kaXNhYmxlZC52YWx1ZXx8bi5kaXNhYmxlZCksbz1XKCgpPT5hLnZhbHVlP2BgOnZvaWQgMCkscz1XKCgpPT5pLnZhbHVlP2diLk9wZW46Z2IuQ2xvc2VkKTt0KHtvcGVuOmksZGF0YURpc2FibGVkOm99KTtsZXR7Y3VycmVudFJlZjpjLGN1cnJlbnRFbGVtZW50Omx9PUd5KCk7dmIoe29wZW46aSxkYXRhU3RhdGU6cyxkaXNhYmxlZDphLGRhdGFEaXNhYmxlZDpvLHRyaWdnZXJJZDpgYCxjdXJyZW50UmVmOmMsY3VycmVudEVsZW1lbnQ6bCx2YWx1ZTpXKCgpPT5uLnZhbHVlKX0pO2Z1bmN0aW9uIHUoZSl7bGV0IHQ9ZS50YXJnZXQ7aWYoQXJyYXkuZnJvbShyLnBhcmVudEVsZW1lbnQudmFsdWU/LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtXWApPz9bXSkuZmluZEluZGV4KGU9PmU9PT10KT09PS0xKXJldHVybiBudWxsO3p5KGUsdCxyLnBhcmVudEVsZW1lbnQudmFsdWUse2Fycm93S2V5T3B0aW9uczpyLm9yaWVudGF0aW9uLGRpcjpyLmRpcmVjdGlvbi52YWx1ZSxmb2N1czohMH0pfXJldHVybihlLHQpPT4oUigpLEIoTihvYikseyJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLCJkYXRhLWRpc2FibGVkIjpvLnZhbHVlLCJkYXRhLXN0YXRlIjpzLnZhbHVlLGRpc2FibGVkOmEudmFsdWUsb3BlbjppLnZhbHVlLGFzOm4uYXMsImFzLWNoaWxkIjpuLmFzQ2hpbGQsInVubW91bnQtb24taGlkZSI6bi51bm1vdW50T25IaWRlPz9OKHIpLnVubW91bnRPbkhpZGUudmFsdWUsb25LZXlkb3duOm91KHUsW2B1cGAsYGRvd25gLGBsZWZ0YCxgcmlnaHRgLGBob21lYCxgZW5kYF0pfSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGAse29wZW46aS52YWx1ZX0pXSksXzozfSw4LFtgZGF0YS1vcmllbnRhdGlvbmAsYGRhdGEtZGlzYWJsZWRgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBvcGVuYCxgYXNgLGBhcy1jaGlsZGAsYHVubW91bnQtb24taGlkZWBdKSl9fSksYmI9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxzZXR1cChlKXtsZXQgdD1lLG49cGIoKSxyPV9iKCk7cmV0dXJuIEd5KCksKGUsaSk9PihSKCksQihOKHNiKSx7cm9sZTpgcmVnaW9uYCwiYXMtY2hpbGQiOnQuYXNDaGlsZCxhczplLmFzLCJmb3JjZS1tb3VudCI6dC5mb3JjZU1vdW50LCJhcmlhLWxhYmVsbGVkYnkiOk4ocikudHJpZ2dlcklkLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSwiZGF0YS1kaXNhYmxlZCI6TihyKS5kYXRhRGlzYWJsZWQudmFsdWUsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sc3R5bGU6eyItLXJla2EtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOmB2YXIoLS1yZWthLWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgpYCwiLS1yZWthLWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6YHZhcigtLXJla2EtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQpYH0sb25Db250ZW50Rm91bmQ6aVswXXx8PWU9Pk4obikuY2hhbmdlTW9kZWxWYWx1ZShOKHIpLnZhbHVlLnZhbHVlKX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBmb3JjZS1tb3VudGAsYGFyaWEtbGFiZWxsZWRieWAsYGRhdGEtc3RhdGVgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKSl9fSkseGI9Rih7X19uYW1lOmBBY2NvcmRpb25IZWFkZXJgLHByb3BzOnthc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaDNgfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXBiKCkscj1fYigpO3JldHVybiBHeSgpLChlLGkpPT4oUigpLEIoTihuYikse2FzOnQuYXMsImFzLWNoaWxkIjp0LmFzQ2hpbGQsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24sImRhdGEtc3RhdGUiOk4ocikuZGF0YVN0YXRlLnZhbHVlLCJkYXRhLWRpc2FibGVkIjpOKHIpLmRhdGFEaXNhYmxlZC52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzYCxgYXMtY2hpbGRgLGBkYXRhLW9yaWVudGF0aW9uYCxgZGF0YS1zdGF0ZWAsYGRhdGEtZGlzYWJsZWRgXSkpfX0pLFNiPUYoe19fbmFtZTpgQWNjb3JkaW9uVHJpZ2dlcmAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUsbj1wYigpLHI9X2IoKTtyLnRyaWdnZXJJZHx8PVl5KHZvaWQgMCxgcmVrYS1hY2NvcmRpb24tdHJpZ2dlcmApO2Z1bmN0aW9uIGkoKXtsZXQgZT1uLmlzU2luZ2xlLnZhbHVlJiZyLm9wZW4udmFsdWUmJiFuLmNvbGxhcHNpYmxlO3IuZGlzYWJsZWQudmFsdWV8fGV8fG4uY2hhbmdlTW9kZWxWYWx1ZShyLnZhbHVlLnZhbHVlKX1yZXR1cm4oZSxhKT0+KFIoKSxCKE4oY2IpLHtpZDpOKHIpLnRyaWdnZXJJZCxyZWY6TihyKS5jdXJyZW50UmVmLCJkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtIjpgYCxhczp0LmFzLCJhcy1jaGlsZCI6dC5hc0NoaWxkLCJhcmlhLWRpc2FibGVkIjpOKHIpLmRpc2FibGVkLnZhbHVlfHx2b2lkIDAsImFyaWEtZXhwYW5kZWQiOk4ocikub3Blbi52YWx1ZXx8ITEsImRhdGEtZGlzYWJsZWQiOk4ocikuZGF0YURpc2FibGVkLnZhbHVlLCJkYXRhLW9yaWVudGF0aW9uIjpOKG4pLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpOKHIpLmRhdGFTdGF0ZS52YWx1ZSxkaXNhYmxlZDpOKHIpLmRpc2FibGVkLnZhbHVlLG9uQ2xpY2s6aX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGlkYCxgYXNgLGBhcy1jaGlsZGAsYGFyaWEtZGlzYWJsZWRgLGBhcmlhLWV4cGFuZGVkYCxgZGF0YS1kaXNhYmxlZGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgXSkpfX0pLENiPWBkYXRhLXJla2EtY29sbGVjdGlvbi1pdGVtYDtmdW5jdGlvbiB3YihlPXt9KXtsZXR7a2V5OnQ9YGAsaXNQcm92aWRlcjpuPSExfT1lLHI9YCR7dH1Db2xsZWN0aW9uUHJvdmlkZXJgLGk7bj8oaT17Y29sbGVjdGlvblJlZjpNKCksaXRlbU1hcDpNKG5ldyBNYXApfSx2cihyLGkpKTppPXlyKHIpO2xldCBhPShlPSExKT0+e2xldCB0PWkuY29sbGVjdGlvblJlZi52YWx1ZTtpZighdClyZXR1cm5bXTtsZXQgbj1BcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbChgWyR7Q2J9XWApKSxyPW5ldyBNYXAobi5tYXAoKGUsdCk9PltlLHRdKSksYT1BcnJheS5mcm9tKGkuaXRlbU1hcC52YWx1ZS52YWx1ZXMoKSkuc29ydCgoZSx0KT0+KHIuZ2V0KGUucmVmKT8/LTEpLShyLmdldCh0LnJlZik/Py0xKSk7cmV0dXJuIGU/YTphLmZpbHRlcihlPT5lLnJlZi5kYXRhc2V0LmRpc2FibGVkIT09YGApfSxvPUYoe25hbWU6YENvbGxlY3Rpb25TbG90YCxpbmhlcml0QXR0cnM6ITEsc2V0dXAoZSx7c2xvdHM6dCxhdHRyczpufSl7bGV0e3ByaW1pdGl2ZUVsZW1lbnQ6cixjdXJyZW50RWxlbWVudDphfT1yYigpO3JldHVybiBFcihhLCgpPT57aS5jb2xsZWN0aW9uUmVmLnZhbHVlPWEudmFsdWV9KSwoKT0+RyhlYix7cmVmOnIsLi4ubn0sdCl9fSkscz1GKHtuYW1lOmBDb2xsZWN0aW9uSXRlbWAsaW5oZXJpdEF0dHJzOiExLHByb3BzOnt2YWx1ZTp7dmFsaWRhdG9yOigpPT4hMH19LHNldHVwKGUse3Nsb3RzOnQsYXR0cnM6bn0pe2xldHtwcmltaXRpdmVFbGVtZW50OnIsY3VycmVudEVsZW1lbnQ6YX09cmIoKTtyZXR1cm4gQ3IodD0+e2lmKGEudmFsdWUpe2xldCBuPXNuKGEudmFsdWUpO2kuaXRlbU1hcC52YWx1ZS5zZXQobix7cmVmOmEudmFsdWUsdmFsdWU6ZS52YWx1ZX0pLHQoKCk9PmkuaXRlbU1hcC52YWx1ZS5kZWxldGUobikpfX0pLCgpPT5HKGViLHsuLi5uLFtDYl06YGAscmVmOnJ9LHQpfX0pO3JldHVybntnZXRJdGVtczphLHJlYWN0aXZlSXRlbXM6VygoKT0+QXJyYXkuZnJvbShpLml0ZW1NYXAudmFsdWUudmFsdWVzKCkpKSxpdGVtTWFwU2l6ZTpXKCgpPT5pLml0ZW1NYXAudmFsdWUuc2l6ZSksQ29sbGVjdGlvblNsb3Q6byxDb2xsZWN0aW9uSXRlbTpzfX12YXIgVGI9YHJvdmluZ0ZvY3VzR3JvdXAub25FbnRyeUZvY3VzYCxFYj17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxEYj17QXJyb3dMZWZ0OmBwcmV2YCxBcnJvd1VwOmBwcmV2YCxBcnJvd1JpZ2h0OmBuZXh0YCxBcnJvd0Rvd246YG5leHRgLFBhZ2VVcDpgZmlyc3RgLEhvbWU6YGZpcnN0YCxQYWdlRG93bjpgbGFzdGAsRW5kOmBsYXN0YH07ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gdD09PWBydGxgP2U9PT1gQXJyb3dMZWZ0YD9gQXJyb3dSaWdodGA6ZT09PWBBcnJvd1JpZ2h0YD9gQXJyb3dMZWZ0YDplOmV9ZnVuY3Rpb24ga2IoZSx0LG4pe2xldCByPU9iKGUua2V5LG4pO2lmKCEodD09PWB2ZXJ0aWNhbGAmJltgQXJyb3dMZWZ0YCxgQXJyb3dSaWdodGBdLmluY2x1ZGVzKHIpKSYmISh0PT09YGhvcml6b250YWxgJiZbYEFycm93VXBgLGBBcnJvd0Rvd25gXS5pbmNsdWRlcyhyKSkpcmV0dXJuIERiW3JdfWZ1bmN0aW9uIEFiKGUsdD0hMSl7bGV0IG49c3koKTtmb3IobGV0IHIgb2YgZSlpZihyPT09bnx8KHIuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dH0pLHN5KCkhPT1uKSlyZXR1cm59ZnVuY3Rpb24gamIoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX12YXJbTWIsTmJdPW95KGBSb3ZpbmdGb2N1c0dyb3VwYCksUGI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0dyb3VwYCxwcm9wczp7b3JpZW50YXRpb246e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6dm9pZCAwfSxkaXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMX0sY3VycmVudFRhYlN0b3BJZDp7dHlwZTpbU3RyaW5nLG51bGxdLHJlcXVpcmVkOiExfSxkZWZhdWx0Q3VycmVudFRhYlN0b3BJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXM6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYGVudHJ5Rm9jdXNgLGB1cGRhdGU6Y3VycmVudFRhYlN0b3BJZGBdLHNldHVwKGUse2V4cG9zZTp0LGVtaXQ6bn0pe2xldCByPWUsaT1uLHtsb29wOmEsb3JpZW50YXRpb246byxkaXI6c309eW4ociksYz1VeShzKSxsPUl5KHIsYGN1cnJlbnRUYWJTdG9wSWRgLGkse2RlZmF1bHRWYWx1ZTpyLmRlZmF1bHRDdXJyZW50VGFiU3RvcElkLHBhc3NpdmU6ci5jdXJyZW50VGFiU3RvcElkPT09dm9pZCAwfSksdT1NKCExKSxkPU0oITEpLGY9TSgwKSx7Z2V0SXRlbXM6cCxDb2xsZWN0aW9uU2xvdDptfT13Yih7aXNQcm92aWRlcjohMH0pO2Z1bmN0aW9uIGgoZSl7bGV0IHQ9IWQudmFsdWU7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLnRhcmdldD09PWUuY3VycmVudFRhcmdldCYmdCYmIXUudmFsdWUpe2xldCB0PW5ldyBDdXN0b21FdmVudChUYixFYik7aWYoZS5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQodCksaShgZW50cnlGb2N1c2AsdCksIXQuZGVmYXVsdFByZXZlbnRlZCl7bGV0IGU9cCgpLm1hcChlPT5lLnJlZikuZmlsdGVyKGU9PmUuZGF0YXNldC5kaXNhYmxlZCE9PWBgKTtBYihbZS5maW5kKGU9PmUuZ2V0QXR0cmlidXRlKGBkYXRhLWFjdGl2ZWApPT09YGApLGUuZmluZChlPT5lLmdldEF0dHJpYnV0ZShgZGF0YS1oaWdobGlnaHRlZGApPT09YGApLGUuZmluZChlPT5lLmlkPT09bC52YWx1ZSksLi4uZV0uZmlsdGVyKEJvb2xlYW4pLHIucHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyl9fWQudmFsdWU9ITF9ZnVuY3Rpb24gZygpe3NldFRpbWVvdXQoKCk9PntkLnZhbHVlPSExfSwxKX1yZXR1cm4gdCh7Z2V0SXRlbXM6cH0pLE5iKHtsb29wOmEsZGlyOmMsb3JpZW50YXRpb246byxjdXJyZW50VGFiU3RvcElkOmwsb25JdGVtRm9jdXM6ZT0+e2wudmFsdWU9ZX0sb25JdGVtU2hpZnRUYWI6KCk9Pnt1LnZhbHVlPSEwfSxvbkZvY3VzYWJsZUl0ZW1BZGQ6KCk9PntmLnZhbHVlKyt9LG9uRm9jdXNhYmxlSXRlbVJlbW92ZTooKT0+e2YudmFsdWUtLX19KSwoZSx0KT0+KFIoKSxCKE4obSksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7dGFiaW5kZXg6dS52YWx1ZXx8Zi52YWx1ZT09PTA/LTE6MCwiZGF0YS1vcmllbnRhdGlvbiI6TihvKSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGRpcjpOKGMpLHN0eWxlOntvdXRsaW5lOmBub25lYH0sb25Nb3VzZWRvd246dFswXXx8PWU9PmQudmFsdWU9ITAsb25Nb3VzZXVwOmcsb25Gb2N1czpoLG9uQmx1cjp0WzFdfHw9ZT0+dS52YWx1ZT0hMX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYHRhYmluZGV4YCxgZGF0YS1vcmllbnRhdGlvbmAsYGFzYCxgYXMtY2hpbGRgLGBkaXJgXSldKSxfOjN9KSl9fSksRmI9Rih7X19uYW1lOmBSb3ZpbmdGb2N1c0l0ZW1gLHByb3BzOnt0YWJTdG9wSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExfSxmb2N1c2FibGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYWxsb3dTaGlmdEtleTp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITEsZGVmYXVsdDpgc3BhbmB9fSxzZXR1cChlKXtsZXQgdD1lLG49TWIoKSxyPVl5KCksaT1XKCgpPT50LnRhYlN0b3BJZHx8ciksYT1XKCgpPT5uLmN1cnJlbnRUYWJTdG9wSWQudmFsdWU9PT1pLnZhbHVlKSx7Z2V0SXRlbXM6byxDb2xsZWN0aW9uSXRlbTpzfT13YigpO1ppKCgpPT57dC5mb2N1c2FibGUmJm4ub25Gb2N1c2FibGVJdGVtQWRkKCl9KSx0YSgoKT0+e3QuZm9jdXNhYmxlJiZuLm9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpfSksRXIoKCk9PnQuZm9jdXNhYmxlLChlLHQpPT57ZSE9PXQmJihlP24ub25Gb2N1c2FibGVJdGVtQWRkKCk6bi5vbkZvY3VzYWJsZUl0ZW1SZW1vdmUoKSl9KTtmdW5jdGlvbiBjKGUpe2lmKGUua2V5PT09YFRhYmAmJmUuc2hpZnRLZXkpe24ub25JdGVtU2hpZnRUYWIoKTtyZXR1cm59aWYoZS50YXJnZXQhPT1lLmN1cnJlbnRUYXJnZXQpcmV0dXJuO2xldCByPWtiKGUsbi5vcmllbnRhdGlvbi52YWx1ZSxuLmRpci52YWx1ZSk7aWYociE9PXZvaWQgMCl7aWYoZS5tZXRhS2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5fHwhdC5hbGxvd1NoaWZ0S2V5JiZlLnNoaWZ0S2V5KXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7bGV0IGk9Wy4uLm8oKS5tYXAoZT0+ZS5yZWYpLmZpbHRlcihlPT5lLmRhdGFzZXQuZGlzYWJsZWQhPT1gYCldO2lmKHI9PT1gbGFzdGApaS5yZXZlcnNlKCk7ZWxzZSBpZihyPT09YHByZXZgfHxyPT09YG5leHRgKXtyPT09YHByZXZgJiZpLnJldmVyc2UoKTtsZXQgdD1pLmluZGV4T2YoZS5jdXJyZW50VGFyZ2V0KTtpPW4ubG9vcC52YWx1ZT9qYihpLHQrMSk6aS5zbGljZSh0KzEpfVFuKCgpPT5BYihpKSl9fXJldHVybihlLHQpPT4oUigpLEIoTihzKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4obmIpLHt0YWJpbmRleDphLnZhbHVlPzA6LTEsImRhdGEtb3JpZW50YXRpb24iOk4obikub3JpZW50YXRpb24udmFsdWUsImRhdGEtYWN0aXZlIjplLmFjdGl2ZT9gYDp2b2lkIDAsImRhdGEtZGlzYWJsZWQiOmUuZm9jdXNhYmxlP3ZvaWQgMDpgYCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLG9uTW91c2Vkb3duOnRbMF18fD10PT57ZS5mb2N1c2FibGU/TihuKS5vbkl0ZW1Gb2N1cyhpLnZhbHVlKTp0LnByZXZlbnREZWZhdWx0KCl9LG9uRm9jdXM6dFsxXXx8PWU9Pk4obikub25JdGVtRm9jdXMoaS52YWx1ZSksb25LZXlkb3duOmN9LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2B0YWJpbmRleGAsYGRhdGEtb3JpZW50YXRpb25gLGBkYXRhLWFjdGl2ZWAsYGRhdGEtZGlzYWJsZWRgLGBhc2AsYGFzLWNoaWxkYF0pXSksXzozfSkpfX0pLFtJYixMYl09b3koYFRhYnNSb290YCksUmI9Rih7X19uYW1lOmBUYWJzUm9vdGAscHJvcHM6e2RlZmF1bHRWYWx1ZTp7dHlwZTpudWxsLHJlcXVpcmVkOiExfSxvcmllbnRhdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITEsZGVmYXVsdDpgaG9yaXpvbnRhbGB9LGRpcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITF9LGFjdGl2YXRpb25Nb2RlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OmBhdXRvbWF0aWNgfSxtb2RlbFZhbHVlOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMSxkZWZhdWx0OiEwfSxhc0NoaWxkOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzOnt0eXBlOm51bGwscmVxdWlyZWQ6ITF9fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQse29yaWVudGF0aW9uOmksdW5tb3VudE9uSGlkZTphLGRpcjpvfT15bihuKSxzPVV5KG8pO0d5KCk7bGV0IGM9SXkobixgbW9kZWxWYWx1ZWAscix7ZGVmYXVsdFZhbHVlOm4uZGVmYXVsdFZhbHVlLHBhc3NpdmU6bi5tb2RlbFZhbHVlPT09dm9pZCAwfSksbD1NKCksdT11bihuZXcgU2V0KTtyZXR1cm4gTGIoe21vZGVsVmFsdWU6YyxjaGFuZ2VNb2RlbFZhbHVlOmU9PntjLnZhbHVlPWV9LG9yaWVudGF0aW9uOmksZGlyOnMsdW5tb3VudE9uSGlkZTphLGFjdGl2YXRpb25Nb2RlOm4uYWN0aXZhdGlvbk1vZGUsYmFzZUlkOll5KHZvaWQgMCxgcmVrYS10YWJzYCksdGFic0xpc3Q6bCxjb250ZW50SWRzOnUscmVnaXN0ZXJDb250ZW50OmU9Pnt1LnZhbHVlPW5ldyBTZXQoWy4uLnUudmFsdWUsZV0pfSx1bnJlZ2lzdGVyQ29udGVudDplPT57bGV0IHQ9bmV3IFNldCh1LnZhbHVlKTt0LmRlbGV0ZShlKSx1LnZhbHVlPXR9fSksKGUsdCk9PihSKCksQihOKG5iKSx7ZGlyOk4ocyksImRhdGEtb3JpZW50YXRpb24iOk4oaSksImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hc30se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgLHttb2RlbFZhbHVlOk4oYyl9KV0pLF86M30sOCxbYGRpcmAsYGRhdGEtb3JpZW50YXRpb25gLGBhcy1jaGlsZGAsYGFzYF0pKX19KTtmdW5jdGlvbiB6YihlLHQpe3JldHVybmAke2V9LXRyaWdnZXItJHt0fWB9ZnVuY3Rpb24gQmIoZSx0KXtyZXR1cm5gJHtlfS1jb250ZW50LSR7dH1gfXZhciBWYj1GKHtfX25hbWU6YFRhYnNDb250ZW50YCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxmb3JjZU1vdW50Ont0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMX19LHNldHVwKGUpe2xldCB0PWUse2ZvcndhcmRSZWY6bn09R3koKSxyPUliKCksaT1XKCgpPT56YihyLmJhc2VJZCx0LnZhbHVlKSksYT1XKCgpPT5CYihyLmJhc2VJZCx0LnZhbHVlKSksbz1XKCgpPT50LnZhbHVlPT09ci5tb2RlbFZhbHVlLnZhbHVlKSxzPU0oby52YWx1ZSk7cmV0dXJuIFppKCgpPT57ci5yZWdpc3RlckNvbnRlbnQodC52YWx1ZSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cy52YWx1ZT0hMX0pfSksZWEoKCk9PntyLnVucmVnaXN0ZXJDb250ZW50KHQudmFsdWUpfSksKGUsdCk9PihSKCksQihOKCR5KSx7cHJlc2VudDplLmZvcmNlTW91bnR8fG8udmFsdWUsImZvcmNlLW1vdW50IjpgYH0se2RlZmF1bHQ6UCgoe3ByZXNlbnQ6dH0pPT5bSChOKG5iKSx7aWQ6YS52YWx1ZSxyZWY6TihuKSwiYXMtY2hpbGQiOmUuYXNDaGlsZCxhczplLmFzLHJvbGU6YHRhYnBhbmVsYCwiZGF0YS1zdGF0ZSI6by52YWx1ZT9gYWN0aXZlYDpgaW5hY3RpdmVgLCJkYXRhLW9yaWVudGF0aW9uIjpOKHIpLm9yaWVudGF0aW9uLnZhbHVlLCJhcmlhLWxhYmVsbGVkYnkiOmkudmFsdWUsaGlkZGVuOiF0LHRhYmluZGV4OmAwYCxzdHlsZTpnZSh7YW5pbWF0aW9uRHVyYXRpb246cy52YWx1ZT9gMHNgOnZvaWQgMH0pfSx7ZGVmYXVsdDpQKCgpPT5bIU4ocikudW5tb3VudE9uSGlkZS52YWx1ZXx8dD9JKGUuJHNsb3RzLGBkZWZhdWx0YCx7a2V5OjB9KTpUcyhgdi1pZmAsITApXSksXzoyfSwxMDMyLFtgaWRgLGBhcy1jaGlsZGAsYGFzYCxgZGF0YS1zdGF0ZWAsYGRhdGEtb3JpZW50YXRpb25gLGBhcmlhLWxhYmVsbGVkYnlgLGBoaWRkZW5gLGBzdHlsZWBdKV0pLF86M30sOCxbYHByZXNlbnRgXSkpfX0pLEhiPUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITEsZGVmYXVsdDohMH0sYXNDaGlsZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExfSxhczp7dHlwZTpudWxsLHJlcXVpcmVkOiExfX0sc2V0dXAoZSl7bGV0e2xvb3A6dH09eW4oZSkse2ZvcndhcmRSZWY6bixjdXJyZW50RWxlbWVudDpyfT1HeSgpLGk9SWIoKTtyZXR1cm4gaS50YWJzTGlzdD1yLChlLHIpPT4oUigpLEIoTihQYikseyJhcy1jaGlsZCI6YGAsb3JpZW50YXRpb246TihpKS5vcmllbnRhdGlvbi52YWx1ZSxkaXI6TihpKS5kaXIudmFsdWUsbG9vcDpOKHQpfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7cmVmOk4obikscm9sZTpgdGFibGlzdGAsImFzLWNoaWxkIjplLmFzQ2hpbGQsYXM6ZS5hcywiYXJpYS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbi52YWx1ZX0se2RlZmF1bHQ6UCgoKT0+W0koZS4kc2xvdHMsYGRlZmF1bHRgKV0pLF86M30sOCxbYGFzLWNoaWxkYCxgYXNgLGBhcmlhLW9yaWVudGF0aW9uYF0pXSksXzozfSw4LFtgb3JpZW50YXRpb25gLGBkaXJgLGBsb29wYF0pKX19KSxVYj1GKHtfX25hbWU6YFRhYnNUcmlnZ2VyYCxwcm9wczp7dmFsdWU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHJlcXVpcmVkOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHJlcXVpcmVkOiExLGRlZmF1bHQ6ITF9LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX0sYXM6e3R5cGU6bnVsbCxyZXF1aXJlZDohMSxkZWZhdWx0OmBidXR0b25gfX0sc2V0dXAoZSl7bGV0IHQ9ZSx7Zm9yd2FyZFJlZjpufT1HeSgpLHI9SWIoKSxpPVcoKCk9PnpiKHIuYmFzZUlkLHQudmFsdWUpKSxhPVcoKCk9PnIuY29udGVudElkcy52YWx1ZS5oYXModC52YWx1ZSk/QmIoci5iYXNlSWQsdC52YWx1ZSk6dm9pZCAwKSxvPVcoKCk9PnQudmFsdWU9PT1yLm1vZGVsVmFsdWUudmFsdWUpO3JldHVybihlLHQpPT4oUigpLEIoTihGYikseyJhcy1jaGlsZCI6YGAsZm9jdXNhYmxlOiFlLmRpc2FibGVkLGFjdGl2ZTpvLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bSChOKG5iKSx7aWQ6aS52YWx1ZSxyZWY6TihuKSxyb2xlOmB0YWJgLHR5cGU6ZS5hcz09PWBidXR0b25gP2BidXR0b25gOnZvaWQgMCxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLCJhcmlhLXNlbGVjdGVkIjpvLnZhbHVlP2B0cnVlYDpgZmFsc2VgLCJhcmlhLWNvbnRyb2xzIjphLnZhbHVlLCJkYXRhLXN0YXRlIjpvLnZhbHVlP2BhY3RpdmVgOmBpbmFjdGl2ZWAsZGlzYWJsZWQ6ZS5kaXNhYmxlZCwiZGF0YS1kaXNhYmxlZCI6ZS5kaXNhYmxlZD9gYDp2b2lkIDAsImRhdGEtb3JpZW50YXRpb24iOk4ocikub3JpZW50YXRpb24udmFsdWUsb25Nb3VzZWRvd246dFswXXx8PWl1KHQ9PnshZS5kaXNhYmxlZCYmdC5jdHJsS2V5PT09ITE/TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpOnQucHJldmVudERlZmF1bHQoKX0sW2BsZWZ0YF0pLG9uS2V5ZG93bjp0WzFdfHw9b3UodD0+TihyKS5jaGFuZ2VNb2RlbFZhbHVlKGUudmFsdWUpLFtgZW50ZXJgLGBzcGFjZWBdKSxvbkZvY3VzOnRbMl18fD0oKT0+e2xldCB0PU4ocikuYWN0aXZhdGlvbk1vZGUhPT1gbWFudWFsYDshby52YWx1ZSYmIWUuZGlzYWJsZWQmJnQmJk4ocikuY2hhbmdlTW9kZWxWYWx1ZShlLnZhbHVlKX19LHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDgsW2BpZGAsYHR5cGVgLGBhc2AsYGFzLWNoaWxkYCxgYXJpYS1zZWxlY3RlZGAsYGFyaWEtY29udHJvbHNgLGBkYXRhLXN0YXRlYCxgZGlzYWJsZWRgLGBkYXRhLWRpc2FibGVkYCxgZGF0YS1vcmllbnRhdGlvbmBdKV0pLF86M30sOCxbYGZvY3VzYWJsZWAsYGFjdGl2ZWBdKSl9fSksV2I9Rih7X19uYW1lOmBCdXR0b25gLHByb3BzOnt2YXJpYW50Ont9LHNpemU6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7ZGVmYXVsdDpgYnV0dG9uYH19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKG4scik9PihSKCksQihOKG5iKSx7ImRhdGEtc2xvdCI6YGJ1dHRvbmAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50LCJkYXRhLXNpemUiOmUuc2l6ZSxhczplLmFzLCJhcy1jaGlsZCI6ZS5hc0NoaWxkLGNsYXNzOk8oTihZdikoTihHYikoe3ZhcmlhbnQ6ZS52YXJpYW50LHNpemU6ZS5zaXplfSksdC5jbGFzcykpfSx7ZGVmYXVsdDpQKCgpPT5bSShuLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSw4LFtgZGF0YS12YXJpYW50YCxgZGF0YS1zaXplYCxgYXNgLGBhcy1jaGlsZGAsYGNsYXNzYF0pKX19KSxHYj1DXyhgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBiZy1jbGlwLXBhZGRpbmcgdGV4dC1zbSBmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIGFjdGl2ZTpub3QtYXJpYS1baGFzcG9wdXBdOnRyYW5zbGF0ZS15LXB4IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTQgZ3JvdXAvYnV0dG9uIGlubGluZS1mbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgc2VsZWN0LW5vbmUgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wYCx7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6YGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2FdOmhvdmVyOmJnLXByaW1hcnkvODBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1tdXRlZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLHNlY29uZGFyeTpgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIGFyaWEtZXhwYW5kZWQ6Ymctc2Vjb25kYXJ5IGFyaWEtZXhwYW5kZWQ6dGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZGAsZ2hvc3Q6YGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBkYXJrOmhvdmVyOmJnLW11dGVkLzUwIGFyaWEtZXhwYW5kZWQ6YmctbXV0ZWQgYXJpYS1leHBhbmRlZDp0ZXh0LWZvcmVncm91bmRgLGRlc3RydWN0aXZlOmBiZy1kZXN0cnVjdGl2ZS8xMCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS8yMCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS8yMCB0ZXh0LWRlc3RydWN0aXZlIGZvY3VzLXZpc2libGU6Ym9yZGVyLWRlc3RydWN0aXZlLzQwIGRhcms6aG92ZXI6YmctZGVzdHJ1Y3RpdmUvMzBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH0sc2l6ZTp7ZGVmYXVsdDpgaC04IGdhcC0xLjUgcHgtMi41IGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTIgaGFzLWRhdGEtW2ljb249aW5saW5lLXN0YXJ0XTpwbC0yYCx4czpgaC02IGdhcC0xIHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEwcHgpXSBweC0yIHRleHQteHMgaW4tZGF0YS1bc2xvdD1idXR0b24tZ3JvdXBdOnJvdW5kZWQtbGcgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMS41IGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMS41IFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLHNtOmBoLTcgZ2FwLTEgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTJweCldIHB4LTIuNSB0ZXh0LVswLjhyZW1dIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS0zLjVgLGxnOmBoLTkgZ2FwLTEuNSBweC0yLjUgaGFzLWRhdGEtW2ljb249aW5saW5lLWVuZF06cHItMiBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTJgLGljb246YHNpemUtOGAsImljb24teHMiOmBzaXplLTYgcm91bmRlZC1bbWluKHZhcigtLXJhZGl1cy1tZCksMTBweCldIGluLWRhdGEtW3Nsb3Q9YnV0dG9uLWdyb3VwXTpyb3VuZGVkLWxnIFsmX3N2Zzpub3QoW2NsYXNzKj1zaXplLV0pXTpzaXplLTNgLCJpY29uLXNtIjpgc2l6ZS03IHJvdW5kZWQtW21pbih2YXIoLS1yYWRpdXMtbWQpLDEycHgpXSBpbi1kYXRhLVtzbG90PWJ1dHRvbi1ncm91cF06cm91bmRlZC1sZ2AsImljb24tbGciOmBzaXplLTlgfX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OmBkZWZhdWx0YCxzaXplOmBkZWZhdWx0YH19KSxLYj1bYGRhdGEtc2l6ZWBdLHFiPUYoe19fbmFtZTpgQ2FyZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19LHNpemU6e2RlZmF1bHQ6YGRlZmF1bHRgfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4obixyKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZGAsImRhdGEtc2l6ZSI6ZS5zaXplLGNsYXNzOk8oTihZdikoYHJpbmctZm9yZWdyb3VuZC8xMCBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kIGdhcC00IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIHB5LTQgdGV4dC1zbSByaW5nLTEgaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgaGFzLVs+aW1nOmZpcnN0LWNoaWxkXTpwdC0wIGRhdGEtW3NpemU9c21dOmdhcC0zIGRhdGEtW3NpemU9c21dOnB5LTMgZGF0YS1bc2l6ZT1zbV06aGFzLWRhdGEtW3Nsb3Q9Y2FyZC1mb290ZXJdOnBiLTAgKjpbaW1nOmZpcnN0LWNoaWxkXTpyb3VuZGVkLXQteGwgKjpbaW1nOmxhc3QtY2hpbGRdOnJvdW5kZWQtYi14bCBncm91cC9jYXJkIGZsZXggZmxleC1jb2xgLHQuY2xhc3MpKX0sW0kobi4kc2xvdHMsYGRlZmF1bHRgKV0sMTAsS2IpKX19KSxKYj1GKHtfX25hbWU6YENhcmRDb250ZW50YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtY29udGVudGAsY2xhc3M6TyhOKFl2KShgcHgtNCBncm91cC1kYXRhLVtzaXplPXNtXS9jYXJkOnB4LTNgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFliPUYoe19fbmFtZTpgQ2FyZERlc2NyaXB0aW9uYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCx7ImRhdGEtc2xvdCI6YGNhcmQtZGVzY3JpcHRpb25gLGNsYXNzOk8oTihZdikoYHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxYYj1GKHtfX25hbWU6YENhcmRIZWFkZXJgLHByb3BzOntjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZTtyZXR1cm4oZSxuKT0+KFIoKSx6KGBkaXZgLHsiZGF0YS1zbG90IjpgY2FyZC1oZWFkZXJgLGNsYXNzOk8oTihZdikoYGdhcC0xIHJvdW5kZWQtdC14bCBweC00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6cHgtMyBbLmJvcmRlci1iXTpwYi00IGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6Wy5ib3JkZXItYl06cGItMyBncm91cC9jYXJkLWhlYWRlciBAY29udGFpbmVyL2NhcmQtaGVhZGVyIGdyaWQgYXV0by1yb3dzLW1pbiBpdGVtcy1zdGFydCBoYXMtZGF0YS1bc2xvdD1jYXJkLWFjdGlvbl06Z3JpZC1jb2xzLVsxZnJfYXV0b10gaGFzLWRhdGEtW3Nsb3Q9Y2FyZC1kZXNjcmlwdGlvbl06Z3JpZC1yb3dzLVthdXRvX2F1dG9dYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxaYj1GKHtfX25hbWU6YENhcmRUaXRsZWAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYGRpdmAseyJkYXRhLXNsb3QiOmBjYXJkLXRpdGxlYCxjbGFzczpPKE4oWXYpKGB0ZXh0LWJhc2UgbGVhZGluZy1zbnVnIGZvbnQtbWVkaXVtIGdyb3VwLWRhdGEtW3NpemU9c21dL2NhcmQ6dGV4dC1zbSBjbi1mb250LWhlYWRpbmdgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLFFiPUYoe19fbmFtZTpgSW5wdXRgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sbW9kZWxWYWx1ZTp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sZW1pdHM6W2B1cGRhdGU6bW9kZWxWYWx1ZWBdLHNldHVwKGUse2VtaXQ6dH0pe2xldCBuPWUscj1JeShuLGBtb2RlbFZhbHVlYCx0LHtwYXNzaXZlOiEwLGRlZmF1bHRWYWx1ZTpuLmRlZmF1bHRWYWx1ZX0pO3JldHVybihlLHQpPT5ncigoUigpLHooYGlucHV0YCx7Im9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLCJkYXRhLXNsb3QiOmBpbnB1dGAsY2xhc3M6TyhOKFl2KShgZGFyazpiZy1pbnB1dC8zMCBib3JkZXItaW5wdXQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgZGFyazphcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlLzUwIGRpc2FibGVkOmJnLWlucHV0LzUwIGRhcms6ZGlzYWJsZWQ6YmctaW5wdXQvODAgaC04IHJvdW5kZWQtbGcgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB4LTIuNSBweS0xIHRleHQtYmFzZSB0cmFuc2l0aW9uLWNvbG9ycyBmaWxlOmgtNiBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBmb2N1cy12aXNpYmxlOnJpbmctMyBhcmlhLWludmFsaWQ6cmluZy0zIG1kOnRleHQtc20gdy1mdWxsIG1pbi13LTAgb3V0bGluZS1ub25lIGZpbGU6aW5saW5lLWZsZXggZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1mb3JlZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwYCxuLmNsYXNzKSl9LG51bGwsMikpLFtbV2wsTihyKV1dKX19KSwkYj1gbGxtZ3dBZG1pbktleWA7ZnVuY3Rpb24gZXgoKXt0cnl7cmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJGIpPz9gYH1jYXRjaHtyZXR1cm5gYH19ZnVuY3Rpb24gdHgoZSl7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJGIsZSl9Y2F0Y2h7fX1mdW5jdGlvbiBueCgpe3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCRiKX1jYXRjaHt9fXZhciByeD10XyhgYXV0aGAse3N0YXRlOigpPT4oe2FwaUtleTpleCgpLGVycm9yOmBgfSksZ2V0dGVyczp7aXNBdXRoZW50aWNhdGVkOmU9PmUuYXBpS2V5IT09YGB9LGFjdGlvbnM6e3N1Ym1pdChlKXtlJiYodGhpcy5hcGlLZXk9ZSx0aGlzLmVycm9yPWBgLHR4KGUpKX0scmVqZWN0KGUpe3RoaXMuYXBpS2V5PWBgLHRoaXMuZXJyb3I9ZSxueCgpfX19KSxpeD1jbGFzcyBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpLHRoaXMubmFtZT1gQWRtaW5BcGlFcnJvcmAsdGhpcy5zdGF0dXM9dH19O2FzeW5jIGZ1bmN0aW9uIGF4KGUpe2xldCB0PXJ4KCksbj10LmFwaUtleSxyPWF3YWl0IGZldGNoKGUse2NyZWRlbnRpYWxzOmBzYW1lLW9yaWdpbmAsaGVhZGVyczpuP3sieC1hcGkta2V5IjpufTp7fX0pO2lmKHIuc3RhdHVzPT09NDAxfHxyLnN0YXR1cz09PTQwMyl0aHJvdyB0LmFwaUtleT09PW4mJnQucmVqZWN0KGBpbnZhbGlkIGtleSwgb3Igbm90IGFuIGFkbWluYCksbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7aWYoIXIub2spdGhyb3cgbmV3IGl4KGAke2V9OiBIVFRQICR7ci5zdGF0dXN9YCxyLnN0YXR1cyk7cmV0dXJuIGF3YWl0IHIuanNvbigpfXZhciBveD01ZTMsc3g9dF8oYGRhc2hib2FyZGAse3N0YXRlOigpPT4oe292ZXJ2aWV3Om51bGwsdXNhZ2U6bnVsbCx0YXJnZXRzOm51bGwsbGFzdFVwZGF0ZWQ6bnVsbCxlcnJvcjpgYCx0aW1lcjp2b2lkIDB9KSxhY3Rpb25zOnthc3luYyByZWZyZXNoKCl7aWYoIXJ4KCkuaXNBdXRoZW50aWNhdGVkKXJldHVybjtsZXRbZSx0LG5dPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbYXgoYC9hZG1pbi9hcGkvb3ZlcnZpZXdgKSxheChgL2FkbWluL2FwaS91c2FnZWApLGF4KGAvYWRtaW4vYXBpL3RhcmdldHNgKV0pO2Uuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLm92ZXJ2aWV3PWUudmFsdWUpLHQuc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnVzYWdlPXQudmFsdWUpLG4uc3RhdHVzPT09YGZ1bGZpbGxlZGAmJih0aGlzLnRhcmdldHM9bi52YWx1ZSk7bGV0IHI9W107aWYoZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmBvdmVydmlld2AscmVhc29uOmUucmVhc29ufSksdC5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB1c2FnZWAscmVhc29uOnQucmVhc29ufSksbi5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZyLnB1c2goe2xhYmVsOmB0YXJnZXRzYCxyZWFzb246bi5yZWFzb259KSxyLmxlbmd0aD09PTApe3RoaXMubGFzdFVwZGF0ZWQ9bmV3IERhdGUsdGhpcy5lcnJvcj1gYDtyZXR1cm59ci5zb21lKCh7cmVhc29uOmV9KT0+ZSBpbnN0YW5jZW9mIGl4JiYoZS5zdGF0dXM9PT00MDF8fGUuc3RhdHVzPT09NDAzKSl8fChyLmxlbmd0aDwzJiYodGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZSksdGhpcy5lcnJvcj1yLm1hcCgoe2xhYmVsOmUscmVhc29uOnR9KT0+YCR7ZX06ICR7dCBpbnN0YW5jZW9mIEVycm9yP3QubWVzc2FnZTpTdHJpbmcodCl9YCkuam9pbihgOyBgKSl9LHN0YXJ0UG9sbGluZygpe3RoaXMudGltZXI9PT12b2lkIDAmJih0aGlzLnJlZnJlc2goKSx0aGlzLnRpbWVyPXNldEludGVydmFsKCgpPT52b2lkIHRoaXMucmVmcmVzaCgpLG94KSl9LHN0b3BQb2xsaW5nKCl7dGhpcy50aW1lciE9PXZvaWQgMCYmKGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj12b2lkIDApfX19KSxjeD17Y2xhc3M6YG14LWF1dG8gZmxleCBtaW4taC1bNzB2aF0gbWF4LXctbWQgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgcHgtNGB9LGx4PXtjbGFzczpgZmxleCBzaXplLTEyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgYmctcHJpbWFyeS8xMCB0ZXh0LXByaW1hcnlgfSx1eD17Y2xhc3M6YGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xYH0sZHg9eyJhcmlhLWxhYmVsbGVkYnkiOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMS41IHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sZng9e2NsYXNzOmBmbGV4IGl0ZW1zLXN0YXJ0IGdhcC0xLjVgfSxweD17Y2xhc3M6YGZsZXggaXRlbXMtc3RhcnQgZ2FwLTEuNWB9LG14PXtjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41YH0saHg9e2NsYXNzOmByZWxhdGl2ZWB9LGd4PSgoZSx0KT0+e2xldCBuPWUuX192Y2NPcHRzfHxlO2ZvcihsZXRbZSxyXW9mIHQpbltlXT1yO3JldHVybiBufSkoRih7X19uYW1lOmBBdXRoR2F0ZWAsc2V0dXAoZSl7bGV0IHQ9cngoKSxuPXN4KCkscj1NKGBgKSxpPU0oITEpLGE9TShudWxsKSxvPVcoKCk9PnIudmFsdWUudHJpbSgpIT09YGApO2Z1bmN0aW9uIHMoKXtsZXQgZT1yLnZhbHVlO3IudmFsdWU9YGAsdC5zdWJtaXQoZSksbi5yZWZyZXNoKCl9ZnVuY3Rpb24gYygpe1FuKCgpPT5hLnZhbHVlPy4kZWw/LmZvY3VzKCkpfXJldHVybiBaaShjKSxFcigoKT0+dC5lcnJvcixlPT57ZSYmYygpfSksKGUsbik9PntsZXQgYz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLGN4LFtIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYikse2NsYXNzOmBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LWNlbnRlcmB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLGx4LFtIKGMse2ljb246TihpXyksY2xhc3M6YHNpemUtNWAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxWKGBkaXZgLHV4LFtuWzNdfHw9Vihgc3BhbmAse2NsYXNzOmB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBMTE0gR2F0ZXdheWAsLTEpLEgoTihaYikse2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ublsyXXx8PVtVKGBBZG1pbiBrZXkgcmVxdWlyZWRgLC0xKV1dKSxfOjF9KV0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls0XXx8PVtVKGBFbnRlciBhbiBhZG1pbiBBUEkga2V5IHRvIGNvbnRpbnVlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTRgfSx7ZGVmYXVsdDpQKCgpPT5bblsxMF18fD1WKGBoMmAse2lkOmBhdXRoZ2F0ZS1zZWN1cml0eS1oZWFkaW5nYCxjbGFzczpgc3Itb25seWB9LGAgSG93IHRoaXMga2V5IGlzIGhhbmRsZWQgYCwtMSksVihgdWxgLGR4LFtWKGBsaWAsZngsW0goYyx7aWNvbjpOKHVfKSxjbGFzczpgbXQtMC41IHNpemUtMyBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSksbls1XXx8PVYoYHNwYW5gLG51bGwsYEtlcHQgb25seSBpbiB0aGlzIHRhYidzIHNlc3Npb24gc3RvcmFnZWAsLTEpXSksVihgbGlgLHB4LFtIKGMse2ljb246Tih1XyksY2xhc3M6YG10LTAuNSBzaXplLTMgc2hyaW5rLTBgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLG5bNl18fD1WKGBzcGFuYCxudWxsLGBOZXZlciB3cml0dGVuIHRvIGRpc2tgLC0xKV0pLFYoYGxpYCxteCxbSChjLHtpY29uOk4odV8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zIHNocmluay0wYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSxuWzddfHw9Vihgc3BhbmAsbnVsbCxgU2VudCBvbmx5IHRvIHRoaXMgcGFnZSdzIG93biAvYWRtaW4vYXBpLyogcmVxdWVzdHNgLC0xKV0pXSksVihgZm9ybWAse2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC0zYCxvblN1Ym1pdDppdShzLFtgcHJldmVudGBdKX0sW1YoYGRpdmAsaHgsW0goTihRYikse3JlZl9rZXk6YGtleUlucHV0RWxgLHJlZjphLG1vZGVsVmFsdWU6ci52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6blswXXx8PWU9PnIudmFsdWU9ZSx0eXBlOmkudmFsdWU/YHRleHRgOmBwYXNzd29yZGAsYXV0b2NvbXBsZXRlOmBvZmZgLHBsYWNlaG9sZGVyOmBBUEkga2V5YCwiYXJpYS1sYWJlbCI6YEFkbWluIEFQSSBrZXlgLCJhcmlhLWludmFsaWQiOiEhTih0KS5lcnJvciwiYXJpYS1kZXNjcmliZWRieSI6Tih0KS5lcnJvcj9gYXV0aGdhdGUtZXJyb3JgOnZvaWQgMCxjbGFzczpPKFtgaC0xMCBwci0xMGAseyJhdXRoZ2F0ZS1zaGFrZSI6Tih0KS5lcnJvcn1dKX0sbnVsbCw4LFtgbW9kZWxWYWx1ZWAsYHR5cGVgLGBhcmlhLWludmFsaWRgLGBhcmlhLWRlc2NyaWJlZGJ5YCxgY2xhc3NgXSksSChOKFdiKSx7dHlwZTpgYnV0dG9uYCx2YXJpYW50OmBnaG9zdGAsc2l6ZTpgaWNvbi14c2AsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMS41IC10cmFuc2xhdGUteS0xLzIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZGAsImFyaWEtbGFiZWwiOmkudmFsdWU/YEhpZGUga2V5YDpgU2hvdyBrZXlgLG9uQ2xpY2s6blsxXXx8PWU9PmkudmFsdWU9IWkudmFsdWV9LHtkZWZhdWx0OlAoKCk9PltIKGMse2ljb246aS52YWx1ZT9OKF9fKTpOKG9fKSxjbGFzczpgc2l6ZS0zLjVgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSw4LFtgYXJpYS1sYWJlbGBdKV0pLEgoTihXYikse3R5cGU6YHN1Ym1pdGAsY2xhc3M6YHctZnVsbGAsZGlzYWJsZWQ6IW8udmFsdWV9LHtkZWZhdWx0OlAoKCk9PlsuLi5uWzhdfHw9W1UoYCBDb250aW51ZSBgLC0xKV1dKSxfOjF9LDgsW2BkaXNhYmxlZGBdKV0sMzIpLE4odCkuZXJyb3I/KFIoKSxCKE4oWHYpLHtrZXk6MCxpZDpgYXV0aGdhdGUtZXJyb3JgLHZhcmlhbnQ6YGRlc3RydWN0aXZlYH0se2RlZmF1bHQ6UCgoKT0+W0goTihRdiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4ubls5XXx8PVtVKGBBdXRoZW50aWNhdGlvbiBmYWlsZWRgLC0xKV1dKSxfOjF9KSxIKE4oWnYpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1UoayhOKHQpLmVycm9yKSwxKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKV0pLF86MX0pXSksXzoxfSldKX19fSksW1tgX19zY29wZUlkYCxgZGF0YS12LTRiZTZiYzA5YF1dKTtmdW5jdGlvbiBfeChlLHQpe3JldHVybiB0eXBlb2YgZT09YGZ1bmN0aW9uYD9lKHQpOmV9ZnVuY3Rpb24gdngoZSx0KXtyZXR1cm4gbj0+e3Quc2V0U3RhdGUodD0+KHsuLi50LFtlXTpfeChuLHRbZV0pfSkpfX1mdW5jdGlvbiB5eChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEZ1bmN0aW9ufWZ1bmN0aW9uIGJ4KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmV2ZXJ5KGU9PnR5cGVvZiBlPT1gbnVtYmVyYCl9ZnVuY3Rpb24geHgoZSx0KXtsZXQgbj1bXSxyPWU9PntlLmZvckVhY2goZT0+e24ucHVzaChlKTtsZXQgaT10KGUpO2khPW51bGwmJmkubGVuZ3RoJiZyKGkpfSl9O3JldHVybiByKGUpLG59ZnVuY3Rpb24gUShlLHQsbil7bGV0IHI9W10saTtyZXR1cm4gYT0+e2xldCBvO24ua2V5JiZuLmRlYnVnJiYobz1EYXRlLm5vdygpKTtsZXQgcz1lKGEpO2lmKCEocy5sZW5ndGghPT1yLmxlbmd0aHx8cy5zb21lKChlLHQpPT5yW3RdIT09ZSkpKXJldHVybiBpO3I9cztsZXQgYztpZihuLmtleSYmbi5kZWJ1ZyYmKGM9RGF0ZS5ub3coKSksaT10KC4uLnMpLG49PW51bGx8fG4ub25DaGFuZ2U9PW51bGx8fG4ub25DaGFuZ2UoaSksbi5rZXkmJm4uZGVidWcmJm4hPW51bGwmJm4uZGVidWcoKSl7bGV0IGU9TWF0aC5yb3VuZCgoRGF0ZS5ub3coKS1vKSoxMDApLzEwMCx0PU1hdGgucm91bmQoKERhdGUubm93KCktYykqMTAwKS8xMDAscj10LzE2LGk9KGUsdCk9Pntmb3IoZT1TdHJpbmcoZSk7ZS5sZW5ndGg8dDspZT1gIGArZTtyZXR1cm4gZX07Y29uc29sZS5pbmZvKGAlY+KPsSAke2kodCw1KX0gLyR7aShlLDUpfSBtc2AsYAogICAgICAgICAgICBmb250LXNpemU6IC42cmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICAgICAgY29sb3I6IGhzbCgke01hdGgubWF4KDAsTWF0aC5taW4oMTIwLTEyMCpyLDEyMCkpfWRlZyAxMDAlIDMxJSk7YCxuPy5rZXkpfXJldHVybiBpfX1mdW5jdGlvbiAkKGUsdCxuLHIpe3JldHVybntkZWJ1ZzooKT0+ZT8uZGVidWdBbGw/P2VbdF0sa2V5OiExLG9uQ2hhbmdlOnJ9fWZ1bmN0aW9uIFN4KGUsdCxuLHIpe2xldCBpPXtpZDpgJHt0LmlkfV8ke24uaWR9YCxyb3c6dCxjb2x1bW46bixnZXRWYWx1ZTooKT0+dC5nZXRWYWx1ZShyKSxyZW5kZXJWYWx1ZTooKT0+aS5nZXRWYWx1ZSgpPz9lLm9wdGlvbnMucmVuZGVyRmFsbGJhY2tWYWx1ZSxnZXRDb250ZXh0OlEoKCk9PltlLG4sdCxpXSwoZSx0LG4scik9Pih7dGFibGU6ZSxjb2x1bW46dCxyb3c6bixjZWxsOnIsZ2V0VmFsdWU6ci5nZXRWYWx1ZSxyZW5kZXJWYWx1ZTpyLnJlbmRlclZhbHVlfSksJChlLm9wdGlvbnMsYGRlYnVnQ2VsbHNgLGBjZWxsLmdldENvbnRleHRgKSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHI9PntyLmNyZWF0ZUNlbGw9PW51bGx8fHIuY3JlYXRlQ2VsbChpLG4sdCxlKX0se30pLGl9ZnVuY3Rpb24gQ3goZSx0LG4scil7bGV0IGk9ey4uLmUuX2dldERlZmF1bHRDb2x1bW5EZWYoKSwuLi50fSxhPWkuYWNjZXNzb3JLZXksbz1pLmlkPz8oYT90eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsPT1gZnVuY3Rpb25gP2EucmVwbGFjZUFsbChgLmAsYF9gKTphLnJlcGxhY2UoL1wuL2csYF9gKTp2b2lkIDApPz8odHlwZW9mIGkuaGVhZGVyPT1gc3RyaW5nYD9pLmhlYWRlcjp2b2lkIDApLHM7aWYoaS5hY2Nlc3NvckZuP3M9aS5hY2Nlc3NvckZuOmEmJihzPWEuaW5jbHVkZXMoYC5gKT9lPT57bGV0IHQ9ZTtmb3IobGV0IGUgb2YgYS5zcGxpdChgLmApKXQ9dD8uW2VdO3JldHVybiB0fTplPT5lW2kuYWNjZXNzb3JLZXldKSwhbyl0aHJvdyBFcnJvcigpO2xldCBjPXtpZDpgJHtTdHJpbmcobyl9YCxhY2Nlc3NvckZuOnMscGFyZW50OnIsZGVwdGg6bixjb2x1bW5EZWY6aSxjb2x1bW5zOltdLGdldEZsYXRDb2x1bW5zOlEoKCk9PlshMF0sKCk9PltjLC4uLmMuY29sdW1ucz8uZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpXSwkKGUub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgY29sdW1uLmdldEZsYXRDb2x1bW5zYCkpLGdldExlYWZDb2x1bW5zOlEoKCk9PltlLl9nZXRPcmRlckNvbHVtbnNGbigpXSxlPT57dmFyIHQ7cmV0dXJuKHQ9Yy5jb2x1bW5zKSE9bnVsbCYmdC5sZW5ndGg/ZShjLmNvbHVtbnMuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKTpbY119LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBjb2x1bW4uZ2V0TGVhZkNvbHVtbnNgKSl9O2ZvcihsZXQgdCBvZiBlLl9mZWF0dXJlcyl0LmNyZWF0ZUNvbHVtbj09bnVsbHx8dC5jcmVhdGVDb2x1bW4oYyxlKTtyZXR1cm4gY312YXIgd3g9YGRlYnVnSGVhZGVyc2A7ZnVuY3Rpb24gVHgoZSx0LG4pe2xldCByPXtpZDpuLmlkPz90LmlkLGNvbHVtbjp0LGluZGV4Om4uaW5kZXgsaXNQbGFjZWhvbGRlcjohIW4uaXNQbGFjZWhvbGRlcixwbGFjZWhvbGRlcklkOm4ucGxhY2Vob2xkZXJJZCxkZXB0aDpuLmRlcHRoLHN1YkhlYWRlcnM6W10sY29sU3BhbjowLHJvd1NwYW46MCxoZWFkZXJHcm91cDpudWxsLGdldExlYWZIZWFkZXJzOigpPT57bGV0IGU9W10sdD1uPT57bi5zdWJIZWFkZXJzJiZuLnN1YkhlYWRlcnMubGVuZ3RoJiZuLnN1YkhlYWRlcnMubWFwKHQpLGUucHVzaChuKX07cmV0dXJuIHQociksZX0sZ2V0Q29udGV4dDooKT0+KHt0YWJsZTplLGhlYWRlcjpyLGNvbHVtbjp0fSl9O3JldHVybiBlLl9mZWF0dXJlcy5mb3JFYWNoKHQ9Pnt0LmNyZWF0ZUhlYWRlcj09bnVsbHx8dC5jcmVhdGVIZWFkZXIocixlKX0pLHJ9dmFyIEV4PXtjcmVhdGVUYWJsZTplPT57ZS5nZXRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT57bGV0IGE9cj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sbz1pPy5tYXAoZT0+bi5maW5kKHQ9PnQuaWQ9PT1lKSkuZmlsdGVyKEJvb2xlYW4pPz9bXSxzPW4uZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlLmlkKSkmJiEoaSE9bnVsbCYmaS5pbmNsdWRlcyhlLmlkKSkpO3JldHVybiBEeCh0LFsuLi5hLC4uLnMsLi4ub10sZSl9LCQoZS5vcHRpb25zLHd4LGBnZXRIZWFkZXJHcm91cHNgKSksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodF0sKHQsbixyLGkpPT4obj1uLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZS5pZCkpJiYhKGkhPW51bGwmJmkuaW5jbHVkZXMoZS5pZCkpKSxEeCh0LG4sZSxgY2VudGVyYCkpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJIZWFkZXJHcm91cHNgKSksZS5nZXRMZWZ0SGVhZGVyR3JvdXBzPVEoKCk9PltlLmdldEFsbENvbHVtbnMoKSxlLmdldFZpc2libGVMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgbGVmdGApLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0SGVhZGVyR3JvdXBzYCkpLGUuZ2V0UmlnaHRIZWFkZXJHcm91cHM9USgoKT0+W2UuZ2V0QWxsQ29sdW1ucygpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLCh0LG4scik9PkR4KHQscj8ubWFwKGU9Pm4uZmluZCh0PT50LmlkPT09ZSkpLmZpbHRlcihCb29sZWFuKT8/W10sZSxgcmlnaHRgKSwkKGUub3B0aW9ucyx3eCxgZ2V0UmlnaHRIZWFkZXJHcm91cHNgKSksZS5nZXRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0SGVhZGVyR3JvdXBzKCldLGU9PlsuLi5lXS5yZXZlcnNlKCksJChlLm9wdGlvbnMsd3gsYGdldEZvb3Rlckdyb3Vwc2ApKSxlLmdldExlZnRGb290ZXJHcm91cHM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0Rm9vdGVyR3JvdXBzYCkpLGUuZ2V0Q2VudGVyRm9vdGVyR3JvdXBzPVEoKCk9PltlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGb290ZXJHcm91cHNgKSksZS5nZXRSaWdodEZvb3Rlckdyb3Vwcz1RKCgpPT5bZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxlPT5bLi4uZV0ucmV2ZXJzZSgpLCQoZS5vcHRpb25zLHd4LGBnZXRSaWdodEZvb3Rlckdyb3Vwc2ApKSxlLmdldEZsYXRIZWFkZXJzPVEoKCk9PltlLmdldEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0RmxhdEhlYWRlcnNgKSksZS5nZXRMZWZ0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxlPT5lLm1hcChlPT5lLmhlYWRlcnMpLmZsYXQoKSwkKGUub3B0aW9ucyx3eCxgZ2V0TGVmdEZsYXRIZWFkZXJzYCkpLGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCldLGU9PmUubWFwKGU9PmUuaGVhZGVycykuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRDZW50ZXJGbGF0SGVhZGVyc2ApKSxlLmdldFJpZ2h0RmxhdEhlYWRlcnM9USgoKT0+W2UuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sZT0+ZS5tYXAoZT0+ZS5oZWFkZXJzKS5mbGF0KCksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0RmxhdEhlYWRlcnNgKSksZS5nZXRDZW50ZXJMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRDZW50ZXJGbGF0SGVhZGVycygpXSxlPT5lLmZpbHRlcihlPT57dmFyIHQ7cmV0dXJuISgodD1lLnN1YkhlYWRlcnMpIT1udWxsJiZ0Lmxlbmd0aCl9KSwkKGUub3B0aW9ucyx3eCxgZ2V0Q2VudGVyTGVhZkhlYWRlcnNgKSksZS5nZXRMZWZ0TGVhZkhlYWRlcnM9USgoKT0+W2UuZ2V0TGVmdEZsYXRIZWFkZXJzKCldLGU9PmUuZmlsdGVyKGU9Pnt2YXIgdDtyZXR1cm4hKCh0PWUuc3ViSGVhZGVycykhPW51bGwmJnQubGVuZ3RoKX0pLCQoZS5vcHRpb25zLHd4LGBnZXRMZWZ0TGVhZkhlYWRlcnNgKSksZS5nZXRSaWdodExlYWZIZWFkZXJzPVEoKCk9PltlLmdldFJpZ2h0RmxhdEhlYWRlcnMoKV0sZT0+ZS5maWx0ZXIoZT0+e3ZhciB0O3JldHVybiEoKHQ9ZS5zdWJIZWFkZXJzKSE9bnVsbCYmdC5sZW5ndGgpfSksJChlLm9wdGlvbnMsd3gsYGdldFJpZ2h0TGVhZkhlYWRlcnNgKSksZS5nZXRMZWFmSGVhZGVycz1RKCgpPT5bZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCksZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKSxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCldLChlLHQsbik9PlsuLi5lWzBdPy5oZWFkZXJzPz9bXSwuLi50WzBdPy5oZWFkZXJzPz9bXSwuLi5uWzBdPy5oZWFkZXJzPz9bXV0ubWFwKGU9PmUuZ2V0TGVhZkhlYWRlcnMoKSkuZmxhdCgpLCQoZS5vcHRpb25zLHd4LGBnZXRMZWFmSGVhZGVyc2ApKX19O2Z1bmN0aW9uIER4KGUsdCxuLHIpe2xldCBpPTAsYT1mdW5jdGlvbihlLHQpe3Q9PT12b2lkIDAmJih0PTEpLGk9TWF0aC5tYXgoaSx0KSxlLmZpbHRlcihlPT5lLmdldElzVmlzaWJsZSgpKS5mb3JFYWNoKGU9Pnt2YXIgbjsobj1lLmNvbHVtbnMpIT1udWxsJiZuLmxlbmd0aCYmYShlLmNvbHVtbnMsdCsxKX0sMCl9O2EoZSk7bGV0IG89W10scz0oZSx0KT0+e2xldCBpPXtkZXB0aDp0LGlkOltyLGAke3R9YF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxoZWFkZXJzOltdfSxhPVtdO2UuZm9yRWFjaChlPT57bGV0IG89Wy4uLmFdLnJldmVyc2UoKVswXSxzPWUuY29sdW1uLmRlcHRoPT09aS5kZXB0aCxjLGw9ITE7aWYocyYmZS5jb2x1bW4ucGFyZW50P2M9ZS5jb2x1bW4ucGFyZW50OihjPWUuY29sdW1uLGw9ITApLG8mJm8/LmNvbHVtbj09PWMpby5zdWJIZWFkZXJzLnB1c2goZSk7ZWxzZXtsZXQgaT1UeChuLGMse2lkOltyLHQsYy5pZCxlPy5pZF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYF9gKSxpc1BsYWNlaG9sZGVyOmwscGxhY2Vob2xkZXJJZDpsP2Ake2EuZmlsdGVyKGU9PmUuY29sdW1uPT09YykubGVuZ3RofWA6dm9pZCAwLGRlcHRoOnQsaW5kZXg6YS5sZW5ndGh9KTtpLnN1YkhlYWRlcnMucHVzaChlKSxhLnB1c2goaSl9aS5oZWFkZXJzLnB1c2goZSksZS5oZWFkZXJHcm91cD1pfSksby5wdXNoKGkpLHQ+MCYmcyhhLHQtMSl9O3ModC5tYXAoKGUsdCk9PlR4KG4sZSx7ZGVwdGg6aSxpbmRleDp0fSkpLGktMSksby5yZXZlcnNlKCk7bGV0IGM9ZT0+ZS5maWx0ZXIoZT0+ZS5jb2x1bW4uZ2V0SXNWaXNpYmxlKCkpLm1hcChlPT57bGV0IHQ9MCxuPTAscj1bMF07ZS5zdWJIZWFkZXJzJiZlLnN1YkhlYWRlcnMubGVuZ3RoPyhyPVtdLGMoZS5zdWJIZWFkZXJzKS5mb3JFYWNoKGU9PntsZXR7Y29sU3BhbjpuLHJvd1NwYW46aX09ZTt0Kz1uLHIucHVzaChpKX0pKTp0PTE7bGV0IGk9TWF0aC5taW4oLi4ucik7cmV0dXJuIG4rPWksZS5jb2xTcGFuPXQsZS5yb3dTcGFuPW4se2NvbFNwYW46dCxyb3dTcGFuOm59fSk7cmV0dXJuIGMob1swXT8uaGVhZGVycz8/W10pLG99dmFyIE94PShlLHQsbixyLGksYSxvKT0+e2xldCBzPXtpZDp0LGluZGV4OnIsb3JpZ2luYWw6bixkZXB0aDppLHBhcmVudElkOm8sX3ZhbHVlc0NhY2hlOnt9LF91bmlxdWVWYWx1ZXNDYWNoZTp7fSxnZXRWYWx1ZTp0PT57aWYocy5fdmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3ZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gcy5fdmFsdWVzQ2FjaGVbdF09bi5hY2Nlc3NvckZuKHMub3JpZ2luYWwscikscy5fdmFsdWVzQ2FjaGVbdF19LGdldFVuaXF1ZVZhbHVlczp0PT57aWYocy5fdW5pcXVlVmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdO2xldCBuPWUuZ2V0Q29sdW1uKHQpO2lmKG4hPW51bGwmJm4uYWNjZXNzb3JGbilyZXR1cm4gbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzPyhzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XT1uLmNvbHVtbkRlZi5nZXRVbmlxdWVWYWx1ZXMocy5vcmlnaW5hbCxyKSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSk6KHMuX3VuaXF1ZVZhbHVlc0NhY2hlW3RdPVtzLmdldFZhbHVlKHQpXSxzLl91bmlxdWVWYWx1ZXNDYWNoZVt0XSl9LHJlbmRlclZhbHVlOnQ9PnMuZ2V0VmFsdWUodCk/P2Uub3B0aW9ucy5yZW5kZXJGYWxsYmFja1ZhbHVlLHN1YlJvd3M6YT8/W10sZ2V0TGVhZlJvd3M6KCk9Pnh4KHMuc3ViUm93cyxlPT5lLnN1YlJvd3MpLGdldFBhcmVudFJvdzooKT0+cy5wYXJlbnRJZD9lLmdldFJvdyhzLnBhcmVudElkLCEwKTp2b2lkIDAsZ2V0UGFyZW50Um93czooKT0+e2xldCBlPVtdLHQ9cztmb3IoOzspe2xldCBuPXQuZ2V0UGFyZW50Um93KCk7aWYoIW4pYnJlYWs7ZS5wdXNoKG4pLHQ9bn1yZXR1cm4gZS5yZXZlcnNlKCl9LGdldEFsbENlbGxzOlEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCldLHQ9PnQubWFwKHQ9PlN4KGUscyx0LHQuaWQpKSwkKGUub3B0aW9ucyxgZGVidWdSb3dzYCxgZ2V0QWxsQ2VsbHNgKSksX2dldEFsbENlbGxzQnlDb2x1bW5JZDpRKCgpPT5bcy5nZXRBbGxDZWxscygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5jb2x1bW4uaWRdPXQsZSkse30pLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRBbGxDZWxsc0J5Q29sdW1uSWRgKSl9O2ZvcihsZXQgdD0wO3Q8ZS5fZmVhdHVyZXMubGVuZ3RoO3QrKyl7bGV0IG49ZS5fZmVhdHVyZXNbdF07bj09bnVsbHx8bi5jcmVhdGVSb3c9PW51bGx8fG4uY3JlYXRlUm93KHMsZSl9cmV0dXJuIHN9LGt4PXtjcmVhdGVDb2x1bW46KGUsdCk9PntlLl9nZXRGYWNldGVkUm93TW9kZWw9dC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmdC5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCh0LGUuaWQpLGUuZ2V0RmFjZXRlZFJvd01vZGVsPSgpPT5lLl9nZXRGYWNldGVkUm93TW9kZWw/ZS5fZ2V0RmFjZXRlZFJvd01vZGVsKCk6dC5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCksZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXM9KCk9PmUuX2dldEZhY2V0ZWRVbmlxdWVWYWx1ZXM/ZS5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcygpOm5ldyBNYXAsZS5fZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz10Lm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyYmdC5vcHRpb25zLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXModCxlLmlkKSxlLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXM9KCk9PntpZihlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKXJldHVybiBlLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzKCl9fX0sQXg9KGUsdCxuKT0+e3ZhciByLGk7bGV0IGE9bj09bnVsbHx8KHI9bi50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpO3JldHVybiEhKChpPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYoaT1pLnRvU3RyaW5nKCkpIT1udWxsJiYoaT1pLnRvTG93ZXJDYXNlKCkpIT1udWxsJiZpLmluY2x1ZGVzKGEpKX07QXguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgang9KGUsdCxuKT0+e3ZhciByO3JldHVybiEhKChyPWUuZ2V0VmFsdWUodCkpIT1udWxsJiYocj1yLnRvU3RyaW5nKCkpIT1udWxsJiZyLmluY2x1ZGVzKG4pKX07anguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgTXg9KGUsdCxuKT0+e3ZhciByO3JldHVybigocj1lLmdldFZhbHVlKHQpKT09bnVsbHx8KHI9ci50b1N0cmluZygpKT09bnVsbD92b2lkIDA6ci50b0xvd2VyQ2FzZSgpKT09PW4/LnRvTG93ZXJDYXNlKCl9O014LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIE54PShlLHQsbik9PmUuZ2V0VmFsdWUodCk/LmluY2x1ZGVzKG4pO054LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIFB4PShlLHQsbik9PiFuLnNvbWUobj0+e3ZhciByO3JldHVybiEoKHI9ZS5nZXRWYWx1ZSh0KSkhPW51bGwmJnIuaW5jbHVkZXMobikpfSk7UHguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEZ4PShlLHQsbik9Pm4uc29tZShuPT5lLmdldFZhbHVlKHQpPy5pbmNsdWRlcyhuKSk7RnguYXV0b1JlbW92ZT1lPT5CeChlKXx8IShlIT1udWxsJiZlLmxlbmd0aCk7dmFyIEl4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PT1uO0l4LmF1dG9SZW1vdmU9ZT0+QngoZSk7dmFyIEx4PShlLHQsbik9PmUuZ2V0VmFsdWUodCk9PW47THguYXV0b1JlbW92ZT1lPT5CeChlKTt2YXIgUng9KGUsdCxuKT0+e2xldFtyLGldPW4sYT1lLmdldFZhbHVlKHQpO3JldHVybiBhPj1yJiZhPD1pfTtSeC5yZXNvbHZlRmlsdGVyVmFsdWU9ZT0+e2xldFt0LG5dPWUscj10eXBlb2YgdD09YG51bWJlcmA/dDpwYXJzZUZsb2F0KHQpLGk9dHlwZW9mIG49PWBudW1iZXJgP246cGFyc2VGbG9hdChuKSxhPXQ9PT1udWxsfHxOdW1iZXIuaXNOYU4ocik/LTEvMDpyLG89bj09PW51bGx8fE51bWJlci5pc05hTihpKT8xLzA6aTtpZihhPm8pe2xldCBlPWE7YT1vLG89ZX1yZXR1cm5bYSxvXX0sUnguYXV0b1JlbW92ZT1lPT5CeChlKXx8QngoZVswXSkmJkJ4KGVbMV0pO3ZhciB6eD17aW5jbHVkZXNTdHJpbmc6QXgsaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmU6angsZXF1YWxzU3RyaW5nOk14LGFyckluY2x1ZGVzOk54LGFyckluY2x1ZGVzQWxsOlB4LGFyckluY2x1ZGVzU29tZTpGeCxlcXVhbHM6SXgsd2Vha0VxdWFsczpMeCxpbk51bWJlclJhbmdlOlJ4fTtmdW5jdGlvbiBCeChlKXtyZXR1cm4gZT09bnVsbHx8ZT09PWBgfXZhciBWeD17Z2V0RGVmYXVsdENvbHVtbkRlZjooKT0+KHtmaWx0ZXJGbjpgYXV0b2B9KSxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5GaWx0ZXJzOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uQ29sdW1uRmlsdGVyc0NoYW5nZTp2eChgY29sdW1uRmlsdGVyc2AsZSksZmlsdGVyRnJvbUxlYWZSb3dzOiExLG1heExlYWZSb3dGaWx0ZXJEZXB0aDoxMDB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLmdldEF1dG9GaWx0ZXJGbj0oKT0+e2xldCBuPXQuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpO3JldHVybiB0eXBlb2Ygbj09YHN0cmluZ2A/enguaW5jbHVkZXNTdHJpbmc6dHlwZW9mIG49PWBudW1iZXJgP3p4LmluTnVtYmVyUmFuZ2U6dHlwZW9mIG49PWBib29sZWFuYHx8dHlwZW9mIG49PWBvYmplY3RgJiZuP3p4LmVxdWFsczpBcnJheS5pc0FycmF5KG4pP3p4LmFyckluY2x1ZGVzOnp4LndlYWtFcXVhbHN9LGUuZ2V0RmlsdGVyRm49KCk9Pnl4KGUuY29sdW1uRGVmLmZpbHRlckZuKT9lLmNvbHVtbkRlZi5maWx0ZXJGbjplLmNvbHVtbkRlZi5maWx0ZXJGbj09PWBhdXRvYD9lLmdldEF1dG9GaWx0ZXJGbigpOnQub3B0aW9ucy5maWx0ZXJGbnM/LltlLmNvbHVtbkRlZi5maWx0ZXJGbl0/P3p4W2UuY29sdW1uRGVmLmZpbHRlckZuXSxlLmdldENhbkZpbHRlcj0oKT0+KGUuY29sdW1uRGVmLmVuYWJsZUNvbHVtbkZpbHRlcj8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtbkZpbHRlcnM/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJiEhZS5hY2Nlc3NvckZuLGUuZ2V0SXNGaWx0ZXJlZD0oKT0+ZS5nZXRGaWx0ZXJJbmRleCgpPi0xLGUuZ2V0RmlsdGVyVmFsdWU9KCk9Pnt2YXIgbjtyZXR1cm4obj10LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycyk9PW51bGx8fChuPW4uZmluZCh0PT50LmlkPT09ZS5pZCkpPT1udWxsP3ZvaWQgMDpuLnZhbHVlfSxlLmdldEZpbHRlckluZGV4PSgpPT50LmdldFN0YXRlKCkuY29sdW1uRmlsdGVycz8uZmluZEluZGV4KHQ9PnQuaWQ9PT1lLmlkKT8/LTEsZS5zZXRGaWx0ZXJWYWx1ZT1uPT57dC5zZXRDb2x1bW5GaWx0ZXJzKHQ9PntsZXQgcj1lLmdldEZpbHRlckZuKCksaT10Py5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxhPV94KG4saT9pLnZhbHVlOnZvaWQgMCk7aWYoSHgocixhLGUpKXJldHVybiB0Py5maWx0ZXIodD0+dC5pZCE9PWUuaWQpPz9bXTtsZXQgbz17aWQ6ZS5pZCx2YWx1ZTphfTtyZXR1cm4gaT90Py5tYXAodD0+dC5pZD09PWUuaWQ/bzp0KT8/W106dCE9bnVsbCYmdC5sZW5ndGg/Wy4uLnQsb106W29dfSl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLmNvbHVtbkZpbHRlcnM9e30sZS5jb2x1bW5GaWx0ZXJzTWV0YT17fX0sY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Q29sdW1uRmlsdGVycz10PT57bGV0IG49ZS5nZXRBbGxMZWFmQ29sdW1ucygpO2Uub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkNvbHVtbkZpbHRlcnNDaGFuZ2UoZT0+X3godCxlKT8uZmlsdGVyKGU9PntsZXQgdD1uLmZpbmQodD0+dC5pZD09PWUuaWQpO3JldHVybiEodCYmSHgodC5nZXRGaWx0ZXJGbigpLGUudmFsdWUsdCkpfSkpfSxlLnJlc2V0Q29sdW1uRmlsdGVycz10PT57ZS5zZXRDb2x1bW5GaWx0ZXJzKHQ/W106ZS5pbml0aWFsU3RhdGU/LmNvbHVtbkZpbHRlcnM/P1tdKX0sZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsPSgpPT5lLmdldENvcmVSb3dNb2RlbCgpLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RmlsdGVyZWRSb3dNb2RlbCYmKGUuX2dldEZpbHRlcmVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZpbHRlcmVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRGaWx0ZXJlZFJvd01vZGVsP2UuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCgpOmUuX2dldEZpbHRlcmVkUm93TW9kZWwoKSl9fTtmdW5jdGlvbiBIeChlLHQsbil7cmV0dXJuKGUmJmUuYXV0b1JlbW92ZT9lLmF1dG9SZW1vdmUodCxuKTohMSl8fHQ9PT12b2lkIDB8fHR5cGVvZiB0PT1gc3RyaW5nYCYmIXR9dmFyIFV4PXtzdW06KGUsdCxuKT0+bi5yZWR1Y2UoKHQsbik9PntsZXQgcj1uLmdldFZhbHVlKGUpO3JldHVybiB0Kyh0eXBlb2Ygcj09YG51bWJlcmA/cjowKX0sMCksbWluOihlLHQsbik9PntsZXQgcjtyZXR1cm4gbi5mb3JFYWNoKHQ9PntsZXQgbj10LmdldFZhbHVlKGUpO24hPW51bGwmJihyPm58fHI9PT12b2lkIDAmJm4+PW4pJiYocj1uKX0pLHJ9LG1heDooZSx0LG4pPT57bGV0IHI7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocjxufHxyPT09dm9pZCAwJiZuPj1uKSYmKHI9bil9KSxyfSxleHRlbnQ6KGUsdCxuKT0+e2xldCByLGk7cmV0dXJuIG4uZm9yRWFjaCh0PT57bGV0IG49dC5nZXRWYWx1ZShlKTtuIT1udWxsJiYocj09PXZvaWQgMD9uPj1uJiYocj1pPW4pOihyPm4mJihyPW4pLGk8biYmKGk9bikpKX0pLFtyLGldfSxtZWFuOihlLHQpPT57bGV0IG49MCxyPTA7aWYodC5mb3JFYWNoKHQ9PntsZXQgaT10LmdldFZhbHVlKGUpO2khPW51bGwmJihpPStpKT49aSYmKCsrbixyKz1pKX0pLG4pcmV0dXJuIHIvbn0sbWVkaWFuOihlLHQpPT57aWYoIXQubGVuZ3RoKXJldHVybjtsZXQgbj10Lm1hcCh0PT50LmdldFZhbHVlKGUpKTtpZighYngobikpcmV0dXJuO2lmKG4ubGVuZ3RoPT09MSlyZXR1cm4gblswXTtsZXQgcj1NYXRoLmZsb29yKG4ubGVuZ3RoLzIpLGk9bi5zb3J0KChlLHQpPT5lLXQpO3JldHVybiBuLmxlbmd0aCUyPT0wPyhpW3ItMV0raVtyXSkvMjppW3JdfSx1bmlxdWU6KGUsdCk9PkFycmF5LmZyb20obmV3IFNldCh0Lm1hcCh0PT50LmdldFZhbHVlKGUpKSkudmFsdWVzKCkpLHVuaXF1ZUNvdW50OihlLHQpPT5uZXcgU2V0KHQubWFwKHQ9PnQuZ2V0VmFsdWUoZSkpKS5zaXplLGNvdW50OihlLHQpPT50Lmxlbmd0aH0sV3g9e2dldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7YWdncmVnYXRlZENlbGw6ZT0+e3ZhciB0O3JldHVybigodD1lLmdldFZhbHVlKCkpPT1udWxsfHx0LnRvU3RyaW5nPT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCkpPz9udWxsfSxhZ2dyZWdhdGlvbkZuOmBhdXRvYH0pLGdldEluaXRpYWxTdGF0ZTplPT4oe2dyb3VwaW5nOltdLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR3JvdXBpbmdDaGFuZ2U6dngoYGdyb3VwaW5nYCxlKSxncm91cGVkQ29sdW1uTW9kZTpgcmVvcmRlcmB9KSxjcmVhdGVDb2x1bW46KGUsdCk9PntlLnRvZ2dsZUdyb3VwaW5nPSgpPT57dC5zZXRHcm91cGluZyh0PT50IT1udWxsJiZ0LmluY2x1ZGVzKGUuaWQpP3QuZmlsdGVyKHQ9PnQhPT1lLmlkKTpbLi4udD8/W10sZS5pZF0pfSxlLmdldENhbkdyb3VwPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlR3JvdXBpbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHcm91cGluZz8/ITApJiYoISFlLmFjY2Vzc29yRm58fCEhZS5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZSksZS5nZXRJc0dyb3VwZWQ9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5jbHVkZXMoZS5pZCksZS5nZXRHcm91cGVkSW5kZXg9KCk9PnQuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5kZXhPZihlLmlkKSxlLmdldFRvZ2dsZUdyb3VwaW5nSGFuZGxlcj0oKT0+e2xldCB0PWUuZ2V0Q2FuR3JvdXAoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlR3JvdXBpbmcoKX19LGUuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm49KCk9PntsZXQgbj10LmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdPy5nZXRWYWx1ZShlLmlkKTtpZih0eXBlb2Ygbj09YG51bWJlcmApcmV0dXJuIFV4LnN1bTtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobik9PT1gW29iamVjdCBEYXRlXWApcmV0dXJuIFV4LmV4dGVudH0sZS5nZXRBZ2dyZWdhdGlvbkZuPSgpPT57aWYoIWUpdGhyb3cgRXJyb3IoKTtyZXR1cm4geXgoZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbik/ZS5jb2x1bW5EZWYuYWdncmVnYXRpb25GbjplLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuPT09YGF1dG9gP2UuZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4oKTp0Lm9wdGlvbnMuYWdncmVnYXRpb25GbnM/LltlLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXT8/VXhbZS5jb2x1bW5EZWYuYWdncmVnYXRpb25Gbl19fSxjcmVhdGVUYWJsZTplPT57ZS5zZXRHcm91cGluZz10PT5lLm9wdGlvbnMub25Hcm91cGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uR3JvdXBpbmdDaGFuZ2UodCksZS5yZXNldEdyb3VwaW5nPXQ9PntlLnNldEdyb3VwaW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/Lmdyb3VwaW5nPz9bXSl9LGUuZ2V0UHJlR3JvdXBlZFJvd01vZGVsPSgpPT5lLmdldEZpbHRlcmVkUm93TW9kZWwoKSxlLmdldEdyb3VwZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRHcm91cGVkUm93TW9kZWwmJmUub3B0aW9ucy5nZXRHcm91cGVkUm93TW9kZWwmJihlLl9nZXRHcm91cGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbEdyb3VwaW5nfHwhZS5fZ2V0R3JvdXBlZFJvd01vZGVsP2UuZ2V0UHJlR3JvdXBlZFJvd01vZGVsKCk6ZS5fZ2V0R3JvdXBlZFJvd01vZGVsKCkpfSxjcmVhdGVSb3c6KGUsdCk9PntlLmdldElzR3JvdXBlZD0oKT0+ISFlLmdyb3VwaW5nQ29sdW1uSWQsZS5nZXRHcm91cGluZ1ZhbHVlPW49PntpZihlLl9ncm91cGluZ1ZhbHVlc0NhY2hlLmhhc093blByb3BlcnR5KG4pKXJldHVybiBlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dO2xldCByPXQuZ2V0Q29sdW1uKG4pO3JldHVybiByIT1udWxsJiZyLmNvbHVtbkRlZi5nZXRHcm91cGluZ1ZhbHVlPyhlLl9ncm91cGluZ1ZhbHVlc0NhY2hlW25dPXIuY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWUoZS5vcmlnaW5hbCksZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtuXSk6ZS5nZXRWYWx1ZShuKX0sZS5fZ3JvdXBpbmdWYWx1ZXNDYWNoZT17fX0sY3JlYXRlQ2VsbDooZSx0LG4scik9PntlLmdldElzR3JvdXBlZD0oKT0+dC5nZXRJc0dyb3VwZWQoKSYmdC5pZD09PW4uZ3JvdXBpbmdDb2x1bW5JZCxlLmdldElzUGxhY2Vob2xkZXI9KCk9PiFlLmdldElzR3JvdXBlZCgpJiZ0LmdldElzR3JvdXBlZCgpLGUuZ2V0SXNBZ2dyZWdhdGVkPSgpPT57dmFyIHQ7cmV0dXJuIWUuZ2V0SXNHcm91cGVkKCkmJiFlLmdldElzUGxhY2Vob2xkZXIoKSYmISEoKHQ9bi5zdWJSb3dzKSE9bnVsbCYmdC5sZW5ndGgpfX19O2Z1bmN0aW9uIEd4KGUsdCxuKXtpZighKHQhPW51bGwmJnQubGVuZ3RoKXx8IW4pcmV0dXJuIGU7bGV0IHI9ZS5maWx0ZXIoZT0+IXQuaW5jbHVkZXMoZS5pZCkpO3JldHVybiBuPT09YHJlbW92ZWA/cjpbLi4udC5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLC4uLnJdfXZhciBLeD17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Y29sdW1uT3JkZXI6W10sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5PcmRlckNoYW5nZTp2eChgY29sdW1uT3JkZXJgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRJbmRleD1RKGU9PltyUyh0LGUpXSx0PT50LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksJCh0Lm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldEluZGV4YCkpLGUuZ2V0SXNGaXJzdENvbHVtbj1uPT5yUyh0LG4pWzBdPy5pZD09PWUuaWQsZS5nZXRJc0xhc3RDb2x1bW49bj0+e2xldCByPXJTKHQsbik7cmV0dXJuIHJbci5sZW5ndGgtMV0/LmlkPT09ZS5pZH19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtbk9yZGVyPXQ9PmUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25Db2x1bW5PcmRlckNoYW5nZSh0KSxlLnJlc2V0Q29sdW1uT3JkZXI9dD0+e2Uuc2V0Q29sdW1uT3JkZXIodD9bXTplLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlcj8/W10pfSxlLl9nZXRPcmRlckNvbHVtbnNGbj1RKCgpPT5bZS5nZXRTdGF0ZSgpLmNvbHVtbk9yZGVyLGUuZ2V0U3RhdGUoKS5ncm91cGluZyxlLm9wdGlvbnMuZ3JvdXBlZENvbHVtbk1vZGVdLChlLHQsbik9PnI9PntsZXQgaT1bXTtpZighKGUhPW51bGwmJmUubGVuZ3RoKSlpPXI7ZWxzZXtsZXQgdD1bLi4uZV0sbj1bLi4ucl07Zm9yKDtuLmxlbmd0aCYmdC5sZW5ndGg7KXtsZXQgZT10LnNoaWZ0KCkscj1uLmZpbmRJbmRleCh0PT50LmlkPT09ZSk7cj4tMSYmaS5wdXNoKG4uc3BsaWNlKHIsMSlbMF0pfWk9Wy4uLmksLi4ubl19cmV0dXJuIEd4KGksdCxuKX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBfZ2V0T3JkZXJDb2x1bW5zRm5gKSl9fSxxeD0oKT0+KHtsZWZ0OltdLHJpZ2h0OltdfSksSng9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblBpbm5pbmc6cXgoKSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvbkNvbHVtblBpbm5pbmdDaGFuZ2U6dngoYGNvbHVtblBpbm5pbmdgLGUpfSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5waW49bj0+e2xldCByPWUuZ2V0TGVhZkNvbHVtbnMoKS5tYXAoZT0+ZS5pZCkuZmlsdGVyKEJvb2xlYW4pO3Quc2V0Q29sdW1uUGlubmluZyhlPT5uPT09YHJpZ2h0YD97bGVmdDooZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSxyaWdodDpbLi4uKGU/LnJpZ2h0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLC4uLnJdfTpuPT09YGxlZnRgP3tsZWZ0OlsuLi4oZT8ubGVmdD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKSwuLi5yXSxyaWdodDooZT8ucmlnaHQ/P1tdKS5maWx0ZXIoZT0+IShyIT1udWxsJiZyLmluY2x1ZGVzKGUpKSl9OntsZWZ0OihlPy5sZWZ0Pz9bXSkuZmlsdGVyKGU9PiEociE9bnVsbCYmci5pbmNsdWRlcyhlKSkpLHJpZ2h0OihlPy5yaWdodD8/W10pLmZpbHRlcihlPT4hKHIhPW51bGwmJnIuaW5jbHVkZXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+ZS5nZXRMZWFmQ29sdW1ucygpLnNvbWUoZT0+KGUuY29sdW1uRGVmLmVuYWJsZVBpbm5pbmc/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVDb2x1bW5QaW5uaW5nPz90Lm9wdGlvbnMuZW5hYmxlUGlubmluZz8/ITApKSxlLmdldElzUGlubmVkPSgpPT57bGV0IG49ZS5nZXRMZWFmQ29sdW1ucygpLm1hcChlPT5lLmlkKSx7bGVmdDpyLHJpZ2h0Oml9PXQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLGE9bi5zb21lKGU9PnI/LmluY2x1ZGVzKGUpKSxvPW4uc29tZShlPT5pPy5pbmNsdWRlcyhlKSk7cmV0dXJuIGE/YGxlZnRgOm8/YHJpZ2h0YDohMX0sZS5nZXRQaW5uZWRJbmRleD0oKT0+e3ZhciBuO2xldCByPWUuZ2V0SXNQaW5uZWQoKTtyZXR1cm4gcj8oKG49dC5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcpPT1udWxsfHwobj1uW3JdKT09bnVsbD92b2lkIDA6bi5pbmRleE9mKGUuaWQpKT8/LTE6MH19LGNyZWF0ZVJvdzooZSx0KT0+e2UuZ2V0Q2VudGVyVmlzaWJsZUNlbGxzPVEoKCk9PltlLl9nZXRBbGxWaXNpYmxlQ2VsbHMoKSx0LmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0LG4pPT57bGV0IHI9Wy4uLnQ/P1tdLC4uLm4/P1tdXTtyZXR1cm4gZS5maWx0ZXIoZT0+IXIuaW5jbHVkZXMoZS5jb2x1bW4uaWQpKX0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldENlbnRlclZpc2libGVDZWxsc2ApKSxlLmdldExlZnRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5jb2x1bW4uaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLm1hcChlPT4oey4uLmUscG9zaXRpb246YGxlZnRgfSkpLCQodC5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRMZWZ0VmlzaWJsZUNlbGxzYCkpLGUuZ2V0UmlnaHRWaXNpYmxlQ2VsbHM9USgoKT0+W2UuX2dldEFsbFZpc2libGVDZWxscygpLHQuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuY29sdW1uLmlkPT09dCkpLmZpbHRlcihCb29sZWFuKS5tYXAoZT0+KHsuLi5lLHBvc2l0aW9uOmByaWdodGB9KSksJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFJpZ2h0VmlzaWJsZUNlbGxzYCkpfSxjcmVhdGVUYWJsZTplPT57ZS5zZXRDb2x1bW5QaW5uaW5nPXQ9PmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2UodCksZS5yZXNldENvbHVtblBpbm5pbmc9dD0+ZS5zZXRDb2x1bW5QaW5uaW5nKHQ/cXgoKTplLmluaXRpYWxTdGF0ZT8uY29sdW1uUGlubmluZz8/cXgoKSksZS5nZXRJc1NvbWVDb2x1bW5zUGlubmVkPXQ9PntsZXQgbj1lLmdldFN0YXRlKCkuY29sdW1uUGlubmluZztyZXR1cm4gdD8hIW5bdF0/Lmxlbmd0aDohIShuLmxlZnQ/Lmxlbmd0aHx8bi5yaWdodD8ubGVuZ3RoKX0sZS5nZXRMZWZ0TGVhZkNvbHVtbnM9USgoKT0+W2UuZ2V0QWxsTGVhZkNvbHVtbnMoKSxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0XSwoZSx0KT0+KHQ/P1tdKS5tYXAodD0+ZS5maW5kKGU9PmUuaWQ9PT10KSkuZmlsdGVyKEJvb2xlYW4pLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRMZWZ0TGVhZkNvbHVtbnNgKSksZS5nZXRSaWdodExlYWZDb2x1bW5zPVEoKCk9PltlLmdldEFsbExlYWZDb2x1bW5zKCksZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQpPT4odD8/W10pLm1hcCh0PT5lLmZpbmQoZT0+ZS5pZD09PXQpKS5maWx0ZXIoQm9vbGVhbiksJChlLm9wdGlvbnMsYGRlYnVnQ29sdW1uc2AsYGdldFJpZ2h0TGVhZkNvbHVtbnNgKSksZS5nZXRDZW50ZXJMZWFmQ29sdW1ucz1RKCgpPT5bZS5nZXRBbGxMZWFmQ29sdW1ucygpLGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLChlLHQsbik9PntsZXQgcj1bLi4udD8/W10sLi4ubj8/W11dO3JldHVybiBlLmZpbHRlcihlPT4hci5pbmNsdWRlcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRDZW50ZXJMZWFmQ29sdW1uc2ApKX19O2Z1bmN0aW9uIFl4KGUpe3JldHVybiBlfHwodHlwZW9mIGRvY3VtZW50PGB1YD9kb2N1bWVudDpudWxsKX12YXIgWHg9e3NpemU6MTUwLG1pblNpemU6MjAsbWF4U2l6ZToyKio1My0xfSxaeD0oKT0+KHtzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsaXNSZXNpemluZ0NvbHVtbjohMSxjb2x1bW5TaXppbmdTdGFydDpbXX0pLFF4PXtnZXREZWZhdWx0Q29sdW1uRGVmOigpPT5YeCxnZXRJbml0aWFsU3RhdGU6ZT0+KHtjb2x1bW5TaXppbmc6e30sY29sdW1uU2l6aW5nSW5mbzpaeCgpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe2NvbHVtblJlc2l6ZU1vZGU6YG9uRW5kYCxjb2x1bW5SZXNpemVEaXJlY3Rpb246YGx0cmAsb25Db2x1bW5TaXppbmdDaGFuZ2U6dngoYGNvbHVtblNpemluZ2AsZSksb25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlOnZ4KGBjb2x1bW5TaXppbmdJbmZvYCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UuZ2V0U2l6ZT0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdbZS5pZF07cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUuY29sdW1uRGVmLm1pblNpemU/P1h4Lm1pblNpemUsbj8/ZS5jb2x1bW5EZWYuc2l6ZT8/WHguc2l6ZSksZS5jb2x1bW5EZWYubWF4U2l6ZT8/WHgubWF4U2l6ZSl9LGUuZ2V0U3RhcnQ9UShlPT5bZSxyUyh0LGUpLHQuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmddLCh0LG4pPT5uLnNsaWNlKDAsZS5nZXRJbmRleCh0KSkucmVkdWNlKChlLHQpPT5lK3QuZ2V0U2l6ZSgpLDApLCQodC5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLGBnZXRTdGFydGApKSxlLmdldEFmdGVyPVEoZT0+W2UsclModCxlKSx0LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nXSwodCxuKT0+bi5zbGljZShlLmdldEluZGV4KHQpKzEpLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKSwkKHQub3B0aW9ucyxgZGVidWdDb2x1bW5zYCxgZ2V0QWZ0ZXJgKSksZS5yZXNldFNpemU9KCk9Pnt0LnNldENvbHVtblNpemluZyh0PT57bGV0e1tlLmlkXTpuLC4uLnJ9PXQ7cmV0dXJuIHJ9KX0sZS5nZXRDYW5SZXNpemU9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVSZXNpemluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZUNvbHVtblJlc2l6aW5nPz8hMCksZS5nZXRJc1Jlc2l6aW5nPSgpPT50LmdldFN0YXRlKCkuY29sdW1uU2l6aW5nSW5mby5pc1Jlc2l6aW5nQ29sdW1uPT09ZS5pZH0sY3JlYXRlSGVhZGVyOihlLHQpPT57ZS5nZXRTaXplPSgpPT57bGV0IHQ9MCxuPWU9PntlLnN1YkhlYWRlcnMubGVuZ3RoP2Uuc3ViSGVhZGVycy5mb3JFYWNoKG4pOnQrPWUuY29sdW1uLmdldFNpemUoKT8/MH07cmV0dXJuIG4oZSksdH0sZS5nZXRTdGFydD0oKT0+e2lmKGUuaW5kZXg+MCl7bGV0IHQ9ZS5oZWFkZXJHcm91cC5oZWFkZXJzW2UuaW5kZXgtMV07cmV0dXJuIHQuZ2V0U3RhcnQoKSt0LmdldFNpemUoKX1yZXR1cm4gMH0sZS5nZXRSZXNpemVIYW5kbGVyPW49PntsZXQgcj10LmdldENvbHVtbihlLmNvbHVtbi5pZCksaT1yPy5nZXRDYW5SZXNpemUoKTtyZXR1cm4gYT0+e2lmKCFyfHwhaXx8KGEucGVyc2lzdD09bnVsbHx8YS5wZXJzaXN0KCksdFMoYSkmJmEudG91Y2hlcyYmYS50b3VjaGVzLmxlbmd0aD4xKSlyZXR1cm47bGV0IG89ZS5nZXRTaXplKCkscz1lP2UuZ2V0TGVhZkhlYWRlcnMoKS5tYXAoZT0+W2UuY29sdW1uLmlkLGUuY29sdW1uLmdldFNpemUoKV0pOltbci5pZCxyLmdldFNpemUoKV1dLGM9dFMoYSk/TWF0aC5yb3VuZChhLnRvdWNoZXNbMF0uY2xpZW50WCk6YS5jbGllbnRYLGw9e30sdT0oZSxuKT0+e3R5cGVvZiBuPT1gbnVtYmVyYCYmKHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT57bGV0IHI9dC5vcHRpb25zLmNvbHVtblJlc2l6ZURpcmVjdGlvbj09PWBydGxgPy0xOjEsaT0obi0oZT8uc3RhcnRPZmZzZXQ/PzApKSpyLGE9TWF0aC5tYXgoaS8oZT8uc3RhcnRTaXplPz8wKSwtLjk5OTk5OSk7cmV0dXJuIGUuY29sdW1uU2l6aW5nU3RhcnQuZm9yRWFjaChlPT57bGV0W3Qsbl09ZTtsW3RdPU1hdGgucm91bmQoTWF0aC5tYXgobituKmEsMCkqMTAwKS8xMDB9KSx7Li4uZSxkZWx0YU9mZnNldDppLGRlbHRhUGVyY2VudGFnZTphfX0pLCh0Lm9wdGlvbnMuY29sdW1uUmVzaXplTW9kZT09PWBvbkNoYW5nZWB8fGU9PT1gZW5kYCkmJnQuc2V0Q29sdW1uU2l6aW5nKGU9Pih7Li4uZSwuLi5sfSkpKX0sZD1lPT51KGBtb3ZlYCxlKSxmPWU9Pnt1KGBlbmRgLGUpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsaXNSZXNpemluZ0NvbHVtbjohMSxzdGFydE9mZnNldDpudWxsLHN0YXJ0U2l6ZTpudWxsLGRlbHRhT2Zmc2V0Om51bGwsZGVsdGFQZXJjZW50YWdlOm51bGwsY29sdW1uU2l6aW5nU3RhcnQ6W119KSl9LHA9WXgobiksbT17bW92ZUhhbmRsZXI6ZT0+ZChlLmNsaWVudFgpLHVwSGFuZGxlcjplPT57cD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbW91c2Vtb3ZlYCxtLm1vdmVIYW5kbGVyKSxwPy5yZW1vdmVFdmVudExpc3RlbmVyKGBtb3VzZXVwYCxtLnVwSGFuZGxlciksZihlLmNsaWVudFgpfX0saD17bW92ZUhhbmRsZXI6ZT0+KGUuY2FuY2VsYWJsZSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSxkKGUudG91Y2hlc1swXS5jbGllbnRYKSwhMSksdXBIYW5kbGVyOmU9PntwPy5yZW1vdmVFdmVudExpc3RlbmVyKGB0b3VjaG1vdmVgLGgubW92ZUhhbmRsZXIpLHA/LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRvdWNoZW5kYCxoLnVwSGFuZGxlciksZS5jYW5jZWxhYmxlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLGYoZS50b3VjaGVzWzBdPy5jbGllbnRYKX19LGc9ZVMoKT97cGFzc2l2ZTohMX06ITE7dFMoYSk/KHA/LmFkZEV2ZW50TGlzdGVuZXIoYHRvdWNobW92ZWAsaC5tb3ZlSGFuZGxlcixnKSxwPy5hZGRFdmVudExpc3RlbmVyKGB0b3VjaGVuZGAsaC51cEhhbmRsZXIsZykpOihwPy5hZGRFdmVudExpc3RlbmVyKGBtb3VzZW1vdmVgLG0ubW92ZUhhbmRsZXIsZykscD8uYWRkRXZlbnRMaXN0ZW5lcihgbW91c2V1cGAsbS51cEhhbmRsZXIsZykpLHQuc2V0Q29sdW1uU2l6aW5nSW5mbyhlPT4oey4uLmUsc3RhcnRPZmZzZXQ6YyxzdGFydFNpemU6byxkZWx0YU9mZnNldDowLGRlbHRhUGVyY2VudGFnZTowLGNvbHVtblNpemluZ1N0YXJ0OnMsaXNSZXNpemluZ0NvbHVtbjpyLmlkfSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldENvbHVtblNpemluZz10PT5lLm9wdGlvbnMub25Db2x1bW5TaXppbmdDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZSh0KSxlLnNldENvbHVtblNpemluZ0luZm89dD0+ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZSh0KSxlLnJlc2V0Q29sdW1uU2l6aW5nPXQ9PntlLnNldENvbHVtblNpemluZyh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblNpemluZz8/e30pfSxlLnJlc2V0SGVhZGVyU2l6ZUluZm89dD0+e2Uuc2V0Q29sdW1uU2l6aW5nSW5mbyh0P1p4KCk6ZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nSW5mbz8/WngoKSl9LGUuZ2V0VG90YWxTaXplPSgpPT5lLmdldEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldExlZnRUb3RhbFNpemU9KCk9PmUuZ2V0TGVmdEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MCxlLmdldENlbnRlclRvdGFsU2l6ZT0oKT0+ZS5nZXRDZW50ZXJIZWFkZXJHcm91cHMoKVswXT8uaGVhZGVycy5yZWR1Y2UoKGUsdCk9PmUrdC5nZXRTaXplKCksMCk/PzAsZS5nZXRSaWdodFRvdGFsU2l6ZT0oKT0+ZS5nZXRSaWdodEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoZSx0KT0+ZSt0LmdldFNpemUoKSwwKT8/MH19LCR4PW51bGw7ZnVuY3Rpb24gZVMoKXtpZih0eXBlb2YgJHg9PWBib29sZWFuYClyZXR1cm4gJHg7bGV0IGU9ITE7dHJ5e2xldCB0PXtnZXQgcGFzc2l2ZSgpe3JldHVybiBlPSEwLCExfX0sbj0oKT0+e307d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoYHRlc3RgLG4sdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRlc3RgLG4pfWNhdGNoe2U9ITF9cmV0dXJuICR4PWUsJHh9ZnVuY3Rpb24gdFMoZSl7cmV0dXJuIGUudHlwZT09PWB0b3VjaHN0YXJ0YH12YXIgblM9e2dldEluaXRpYWxTdGF0ZTplPT4oe2NvbHVtblZpc2liaWxpdHk6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlOnZ4KGBjb2x1bW5WaXNpYmlsaXR5YCxlKX0pLGNyZWF0ZUNvbHVtbjooZSx0KT0+e2UudG9nZ2xlVmlzaWJpbGl0eT1uPT57ZS5nZXRDYW5IaWRlKCkmJnQuc2V0Q29sdW1uVmlzaWJpbGl0eSh0PT4oey4uLnQsW2UuaWRdOm4/PyFlLmdldElzVmlzaWJsZSgpfSkpfSxlLmdldElzVmlzaWJsZT0oKT0+e2xldCBuPWUuY29sdW1ucztyZXR1cm4obi5sZW5ndGg/bi5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlKCkpOnQuZ2V0U3RhdGUoKS5jb2x1bW5WaXNpYmlsaXR5Py5bZS5pZF0pPz8hMH0sZS5nZXRDYW5IaWRlPSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlSGlkaW5nPz8hMCkmJih0Lm9wdGlvbnMuZW5hYmxlSGlkaW5nPz8hMCksZS5nZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlVmlzaWJpbGl0eT09bnVsbHx8ZS50b2dnbGVWaXNpYmlsaXR5KHQudGFyZ2V0LmNoZWNrZWQpfX0sY3JlYXRlUm93OihlLHQpPT57ZS5fZ2V0QWxsVmlzaWJsZUNlbGxzPVEoKCk9PltlLmdldEFsbENlbGxzKCksdC5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHldLGU9PmUuZmlsdGVyKGU9PmUuY29sdW1uLmdldElzVmlzaWJsZSgpKSwkKHQub3B0aW9ucyxgZGVidWdSb3dzYCxgX2dldEFsbFZpc2libGVDZWxsc2ApKSxlLmdldFZpc2libGVDZWxscz1RKCgpPT5bZS5nZXRMZWZ0VmlzaWJsZUNlbGxzKCksZS5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMoKSxlLmdldFJpZ2h0VmlzaWJsZUNlbGxzKCldLChlLHQsbik9PlsuLi5lLC4uLnQsLi4ubl0sJCh0Lm9wdGlvbnMsYGRlYnVnUm93c2AsYGdldFZpc2libGVDZWxsc2ApKX0sY3JlYXRlVGFibGU6ZT0+e2xldCB0PSh0LG4pPT5RKCgpPT5bbigpLG4oKS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGUoKSkubWFwKGU9PmUuaWQpLmpvaW4oYF9gKV0sZT0+ZS5maWx0ZXIoZT0+ZS5nZXRJc1Zpc2libGU9PW51bGw/dm9pZCAwOmUuZ2V0SXNWaXNpYmxlKCkpLCQoZS5vcHRpb25zLGBkZWJ1Z0NvbHVtbnNgLHQpKTtlLmdldFZpc2libGVGbGF0Q29sdW1ucz10KGBnZXRWaXNpYmxlRmxhdENvbHVtbnNgLCgpPT5lLmdldEFsbEZsYXRDb2x1bW5zKCkpLGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKSksZS5nZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnNgLCgpPT5lLmdldExlZnRMZWFmQ29sdW1ucygpKSxlLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zYCwoKT0+ZS5nZXRSaWdodExlYWZDb2x1bW5zKCkpLGUuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zPXQoYGdldENlbnRlclZpc2libGVMZWFmQ29sdW1uc2AsKCk9PmUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMoKSksZS5zZXRDb2x1bW5WaXNpYmlsaXR5PXQ9PmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UodCksZS5yZXNldENvbHVtblZpc2liaWxpdHk9dD0+e2Uuc2V0Q29sdW1uVmlzaWJpbGl0eSh0P3t9OmUuaW5pdGlhbFN0YXRlLmNvbHVtblZpc2liaWxpdHk/P3t9KX0sZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZT10PT57dD8/PSFlLmdldElzQWxsQ29sdW1uc1Zpc2libGUoKSxlLnNldENvbHVtblZpc2liaWxpdHkoZS5nZXRBbGxMZWFmQ29sdW1ucygpLnJlZHVjZSgoZSxuKT0+KHsuLi5lLFtuLmlkXTp0fHwhKG4uZ2V0Q2FuSGlkZSE9bnVsbCYmbi5nZXRDYW5IaWRlKCkpfSkse30pKX0sZS5nZXRJc0FsbENvbHVtbnNWaXNpYmxlPSgpPT4hZS5nZXRBbGxMZWFmQ29sdW1ucygpLnNvbWUoZT0+IShlLmdldElzVmlzaWJsZSE9bnVsbCYmZS5nZXRJc1Zpc2libGUoKSkpLGUuZ2V0SXNTb21lQ29sdW1uc1Zpc2libGU9KCk9PmUuZ2V0QWxsTGVhZkNvbHVtbnMoKS5zb21lKGU9PmUuZ2V0SXNWaXNpYmxlPT1udWxsP3ZvaWQgMDplLmdldElzVmlzaWJsZSgpKSxlLmdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlcj0oKT0+dD0+e2UudG9nZ2xlQWxsQ29sdW1uc1Zpc2libGUodC50YXJnZXQ/LmNoZWNrZWQpfX19O2Z1bmN0aW9uIHJTKGUsdCl7cmV0dXJuIHQ/dD09PWBjZW50ZXJgP2UuZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zKCk6dD09PWBsZWZ0YD9lLmdldExlZnRWaXNpYmxlTGVhZkNvbHVtbnMoKTplLmdldFJpZ2h0VmlzaWJsZUxlYWZDb2x1bW5zKCk6ZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKX12YXIgaVM9e2NyZWF0ZVRhYmxlOmU9PntlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCYmZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbChlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw9KCk9PmUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmd8fCFlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWw/ZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCk6ZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsKCksZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz1lLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyYmZS5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXMoZSxgX19nbG9iYWxfX2ApLGUuZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz0oKT0+ZS5fZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz9lLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzKCk6bmV3IE1hcCxlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPWUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzJiZlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyhlLGBfX2dsb2JhbF9fYCksZS5nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzPSgpPT57aWYoZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcylyZXR1cm4gZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcygpfX19LGFTPXtnZXRJbml0aWFsU3RhdGU6ZT0+KHtnbG9iYWxGaWx0ZXI6dm9pZCAwLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uR2xvYmFsRmlsdGVyQ2hhbmdlOnZ4KGBnbG9iYWxGaWx0ZXJgLGUpLGdsb2JhbEZpbHRlckZuOmBhdXRvYCxnZXRDb2x1bW5DYW5HbG9iYWxGaWx0ZXI6dD0+e3ZhciBuO2xldCByPShuPWUuZ2V0Q29yZVJvd01vZGVsKCkuZmxhdFJvd3NbMF0pPT1udWxsfHwobj1uLl9nZXRBbGxDZWxsc0J5Q29sdW1uSWQoKVt0LmlkXSk9PW51bGw/dm9pZCAwOm4uZ2V0VmFsdWUoKTtyZXR1cm4gdHlwZW9mIHI9PWBzdHJpbmdgfHx0eXBlb2Ygcj09YG51bWJlcmB9fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRDYW5HbG9iYWxGaWx0ZXI9KCk9PihlLmNvbHVtbkRlZi5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVHbG9iYWxGaWx0ZXI/PyEwKSYmKHQub3B0aW9ucy5lbmFibGVGaWx0ZXJzPz8hMCkmJigodC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcj09bnVsbD92b2lkIDA6dC5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcihlKSk/PyEwKSYmISFlLmFjY2Vzc29yRm59LGNyZWF0ZVRhYmxlOmU9PntlLmdldEdsb2JhbEF1dG9GaWx0ZXJGbj0oKT0+enguaW5jbHVkZXNTdHJpbmcsZS5nZXRHbG9iYWxGaWx0ZXJGbj0oKT0+e2xldHtnbG9iYWxGaWx0ZXJGbjp0fT1lLm9wdGlvbnM7cmV0dXJuIHl4KHQpP3Q6dD09PWBhdXRvYD9lLmdldEdsb2JhbEF1dG9GaWx0ZXJGbigpOmUub3B0aW9ucy5maWx0ZXJGbnM/Llt0XT8/enhbdF19LGUuc2V0R2xvYmFsRmlsdGVyPXQ9PntlLm9wdGlvbnMub25HbG9iYWxGaWx0ZXJDaGFuZ2U9PW51bGx8fGUub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZSh0KX0sZS5yZXNldEdsb2JhbEZpbHRlcj10PT57ZS5zZXRHbG9iYWxGaWx0ZXIodD92b2lkIDA6ZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyKX19fSxvUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7ZXhwYW5kZWQ6e30sLi4uZX0pLGdldERlZmF1bHRPcHRpb25zOmU9Pih7b25FeHBhbmRlZENoYW5nZTp2eChgZXhwYW5kZWRgLGUpLHBhZ2luYXRlRXhwYW5kZWRSb3dzOiEwfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0RXhwYW5kZWQ9KCk9PntpZighdCl7ZS5fcXVldWUoKCk9Pnt0PSEwfSk7cmV0dXJufWlmKGUub3B0aW9ucy5hdXRvUmVzZXRBbGw/P2Uub3B0aW9ucy5hdXRvUmVzZXRFeHBhbmRlZD8/IWUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmcpe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0RXhwYW5kZWQoKSxuPSExfSl9fSxlLnNldEV4cGFuZGVkPXQ9PmUub3B0aW9ucy5vbkV4cGFuZGVkQ2hhbmdlPT1udWxsP3ZvaWQgMDplLm9wdGlvbnMub25FeHBhbmRlZENoYW5nZSh0KSxlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZD10PT57dD8/IWUuZ2V0SXNBbGxSb3dzRXhwYW5kZWQoKT9lLnNldEV4cGFuZGVkKCEwKTplLnNldEV4cGFuZGVkKHt9KX0sZS5yZXNldEV4cGFuZGVkPXQ9PntlLnNldEV4cGFuZGVkKHQ/e306ZS5pbml0aWFsU3RhdGU/LmV4cGFuZGVkPz97fSl9LGUuZ2V0Q2FuU29tZVJvd3NFeHBhbmQ9KCk9PmUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT5lLmdldENhbkV4cGFuZCgpKSxlLmdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZEhhbmRsZXI9KCk9PnQ9Pnt0LnBlcnNpc3Q9PW51bGx8fHQucGVyc2lzdCgpLGUudG9nZ2xlQWxsUm93c0V4cGFuZGVkKCl9LGUuZ2V0SXNTb21lUm93c0V4cGFuZGVkPSgpPT57bGV0IHQ9ZS5nZXRTdGF0ZSgpLmV4cGFuZGVkO3JldHVybiB0PT09ITB8fE9iamVjdC52YWx1ZXModCkuc29tZShCb29sZWFuKX0sZS5nZXRJc0FsbFJvd3NFeHBhbmRlZD0oKT0+e2xldCB0PWUuZ2V0U3RhdGUoKS5leHBhbmRlZDtyZXR1cm4gdHlwZW9mIHQ9PWBib29sZWFuYD90PT09ITA6ISghT2JqZWN0LmtleXModCkubGVuZ3RofHxlLmdldFJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShlPT4hZS5nZXRJc0V4cGFuZGVkKCkpKX0sZS5nZXRFeHBhbmRlZERlcHRoPSgpPT57bGV0IHQ9MDtyZXR1cm4oZS5nZXRTdGF0ZSgpLmV4cGFuZGVkPT09ITA/T2JqZWN0LmtleXMoZS5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKTpPYmplY3Qua2V5cyhlLmdldFN0YXRlKCkuZXhwYW5kZWQpKS5mb3JFYWNoKGU9PntsZXQgbj1lLnNwbGl0KGAuYCk7dD1NYXRoLm1heCh0LG4ubGVuZ3RoKX0pLHR9LGUuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbD0oKT0+ZS5nZXRTb3J0ZWRSb3dNb2RlbCgpLGUuZ2V0RXhwYW5kZWRSb3dNb2RlbD0oKT0+KCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0RXhwYW5kZWRSb3dNb2RlbCYmKGUuX2dldEV4cGFuZGVkUm93TW9kZWw9ZS5vcHRpb25zLmdldEV4cGFuZGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmd8fCFlLl9nZXRFeHBhbmRlZFJvd01vZGVsP2UuZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbCgpOmUuX2dldEV4cGFuZGVkUm93TW9kZWwoKSl9LGNyZWF0ZVJvdzooZSx0KT0+e2UudG9nZ2xlRXhwYW5kZWQ9bj0+e3Quc2V0RXhwYW5kZWQocj0+e2xldCBpPXI9PT0hMHx8ISEociE9bnVsbCYmcltlLmlkXSksYT17fTtpZihyPT09ITA/T2JqZWN0LmtleXModC5nZXRSb3dNb2RlbCgpLnJvd3NCeUlkKS5mb3JFYWNoKGU9PnthW2VdPSEwfSk6YT1yLG4/Pz0haSwhaSYmbilyZXR1cm57Li4uYSxbZS5pZF06ITB9O2lmKGkmJiFuKXtsZXR7W2UuaWRdOnQsLi4ubn09YTtyZXR1cm4gbn1yZXR1cm4gcn0pfSxlLmdldElzRXhwYW5kZWQ9KCk9PntsZXQgbj10LmdldFN0YXRlKCkuZXhwYW5kZWQ7cmV0dXJuISEoKHQub3B0aW9ucy5nZXRJc1Jvd0V4cGFuZGVkPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0SXNSb3dFeHBhbmRlZChlKSk/PyhuPT09ITB8fG4/LltlLmlkXSkpfSxlLmdldENhbkV4cGFuZD0oKT0+e3ZhciBuO3JldHVybih0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kPT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kKGUpKT8/KCh0Lm9wdGlvbnMuZW5hYmxlRXhwYW5kaW5nPz8hMCkmJiEhKChuPWUuc3ViUm93cykhPW51bGwmJm4ubGVuZ3RoKSl9LGUuZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQ9KCk9PntsZXQgbj0hMCxyPWU7Zm9yKDtuJiZyLnBhcmVudElkOylyPXQuZ2V0Um93KHIucGFyZW50SWQsITApLG49ci5nZXRJc0V4cGFuZGVkKCk7cmV0dXJuIG59LGUuZ2V0VG9nZ2xlRXhwYW5kZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5FeHBhbmQoKTtyZXR1cm4oKT0+e3QmJmUudG9nZ2xlRXhwYW5kZWQoKX19fX0sc1M9MCxjUz0xMCxsUz0oKT0+KHtwYWdlSW5kZXg6c1MscGFnZVNpemU6Y1N9KSx1Uz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7Li4uZSxwYWdpbmF0aW9uOnsuLi5sUygpLC4uLmU/LnBhZ2luYXRpb259fSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblBhZ2luYXRpb25DaGFuZ2U6dngoYHBhZ2luYXRpb25gLGUpfSksY3JlYXRlVGFibGU6ZT0+e2xldCB0PSExLG49ITE7ZS5fYXV0b1Jlc2V0UGFnZUluZGV4PSgpPT57aWYoIXQpe2UuX3F1ZXVlKCgpPT57dD0hMH0pO3JldHVybn1pZihlLm9wdGlvbnMuYXV0b1Jlc2V0QWxsPz9lLm9wdGlvbnMuYXV0b1Jlc2V0UGFnZUluZGV4Pz8hZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb24pe2lmKG4pcmV0dXJuO249ITAsZS5fcXVldWUoKCk9PntlLnJlc2V0UGFnZUluZGV4KCksbj0hMX0pfX0sZS5zZXRQYWdpbmF0aW9uPXQ9PmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2U9PW51bGw/dm9pZCAwOmUub3B0aW9ucy5vblBhZ2luYXRpb25DaGFuZ2UoZT0+X3godCxlKSksZS5yZXNldFBhZ2luYXRpb249dD0+e2Uuc2V0UGFnaW5hdGlvbih0P2xTKCk6ZS5pbml0aWFsU3RhdGUucGFnaW5hdGlvbj8/bFMoKSl9LGUuc2V0UGFnZUluZGV4PXQ9PntlLnNldFBhZ2luYXRpb24obj0+e2xldCByPV94KHQsbi5wYWdlSW5kZXgpLGk9ZS5vcHRpb25zLnBhZ2VDb3VudD09PXZvaWQgMHx8ZS5vcHRpb25zLnBhZ2VDb3VudD09PS0xPzIqKjUzLTE6ZS5vcHRpb25zLnBhZ2VDb3VudC0xO3JldHVybiByPU1hdGgubWF4KDAsTWF0aC5taW4ocixpKSksey4uLm4scGFnZUluZGV4OnJ9fSl9LGUucmVzZXRQYWdlSW5kZXg9dD0+e3ZhciBuO2Uuc2V0UGFnZUluZGV4KHQ/c1M6KChuPWUuaW5pdGlhbFN0YXRlKT09bnVsbHx8KG49bi5wYWdpbmF0aW9uKT09bnVsbD92b2lkIDA6bi5wYWdlSW5kZXgpPz9zUyl9LGUucmVzZXRQYWdlU2l6ZT10PT57dmFyIG47ZS5zZXRQYWdlU2l6ZSh0P2NTOigobj1lLmluaXRpYWxTdGF0ZSk9PW51bGx8fChuPW4ucGFnaW5hdGlvbik9PW51bGw/dm9pZCAwOm4ucGFnZVNpemUpPz9jUyl9LGUuc2V0UGFnZVNpemU9dD0+e2Uuc2V0UGFnaW5hdGlvbihlPT57bGV0IG49TWF0aC5tYXgoMSxfeCh0LGUucGFnZVNpemUpKSxyPWUucGFnZVNpemUqZS5wYWdlSW5kZXgsaT1NYXRoLmZsb29yKHIvbik7cmV0dXJuey4uLmUscGFnZUluZGV4OmkscGFnZVNpemU6bn19KX0sZS5zZXRQYWdlQ291bnQ9dD0+ZS5zZXRQYWdpbmF0aW9uKG49PntsZXQgcj1feCh0LGUub3B0aW9ucy5wYWdlQ291bnQ/Py0xKTtyZXR1cm4gdHlwZW9mIHI9PWBudW1iZXJgJiYocj1NYXRoLm1heCgtMSxyKSksey4uLm4scGFnZUNvdW50OnJ9fSksZS5nZXRQYWdlT3B0aW9ucz1RKCgpPT5bZS5nZXRQYWdlQ291bnQoKV0sZT0+e2xldCB0PVtdO3JldHVybiBlJiZlPjAmJih0PVsuLi5BcnJheShlKV0uZmlsbChudWxsKS5tYXAoKGUsdCk9PnQpKSx0fSwkKGUub3B0aW9ucyxgZGVidWdUYWJsZWAsYGdldFBhZ2VPcHRpb25zYCkpLGUuZ2V0Q2FuUHJldmlvdXNQYWdlPSgpPT5lLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlSW5kZXg+MCxlLmdldENhbk5leHRQYWdlPSgpPT57bGV0e3BhZ2VJbmRleDp0fT1lLmdldFN0YXRlKCkucGFnaW5hdGlvbixuPWUuZ2V0UGFnZUNvdW50KCk7cmV0dXJuIG49PT0tMXx8biE9PTAmJnQ8bi0xfSxlLnByZXZpb3VzUGFnZT0oKT0+ZS5zZXRQYWdlSW5kZXgoZT0+ZS0xKSxlLm5leHRQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlPT5lKzEpLGUuZmlyc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleCgwKSxlLmxhc3RQYWdlPSgpPT5lLnNldFBhZ2VJbmRleChlLmdldFBhZ2VDb3VudCgpLTEpLGUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsPSgpPT5lLmdldEV4cGFuZGVkUm93TW9kZWwoKSxlLmdldFBhZ2luYXRpb25Sb3dNb2RlbD0oKT0+KCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwmJmUub3B0aW9ucy5nZXRQYWdpbmF0aW9uUm93TW9kZWwmJihlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw9ZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbChlKSksZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb258fCFlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWw/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKTplLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwoKSksZS5nZXRQYWdlQ291bnQ9KCk9PmUub3B0aW9ucy5wYWdlQ291bnQ/P01hdGguY2VpbChlLmdldFJvd0NvdW50KCkvZS5nZXRTdGF0ZSgpLnBhZ2luYXRpb24ucGFnZVNpemUpLGUuZ2V0Um93Q291bnQ9KCk9PmUub3B0aW9ucy5yb3dDb3VudD8/ZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKS5yb3dzLmxlbmd0aH19LGRTPSgpPT4oe3RvcDpbXSxib3R0b206W119KSxmUz17Z2V0SW5pdGlhbFN0YXRlOmU9Pih7cm93UGlubmluZzpkUygpLC4uLmV9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uUm93UGlubmluZ0NoYW5nZTp2eChgcm93UGlubmluZ2AsZSl9KSxjcmVhdGVSb3c6KGUsdCk9PntlLnBpbj0obixyLGkpPT57bGV0IGE9cj9lLmdldExlYWZSb3dzKCkubWFwKGU9PntsZXR7aWQ6dH09ZTtyZXR1cm4gdH0pOltdLG89aT9lLmdldFBhcmVudFJvd3MoKS5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSk6W10scz1uZXcgU2V0KFsuLi5vLGUuaWQsLi4uYV0pO3Quc2V0Um93UGlubmluZyhlPT5uPT09YGJvdHRvbWA/e3RvcDooZT8udG9wPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKSxib3R0b206Wy4uLihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLC4uLkFycmF5LmZyb20ocyldfTpuPT09YHRvcGA/e3RvcDpbLi4uKGU/LnRvcD8/W10pLmZpbHRlcihlPT4hKHMhPW51bGwmJnMuaGFzKGUpKSksLi4uQXJyYXkuZnJvbShzKV0sYm90dG9tOihlPy5ib3R0b20/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpfTp7dG9wOihlPy50b3A/P1tdKS5maWx0ZXIoZT0+IShzIT1udWxsJiZzLmhhcyhlKSkpLGJvdHRvbTooZT8uYm90dG9tPz9bXSkuZmlsdGVyKGU9PiEocyE9bnVsbCYmcy5oYXMoZSkpKX0pfSxlLmdldENhblBpbj0oKT0+e2xldHtlbmFibGVSb3dQaW5uaW5nOm4sZW5hYmxlUGlubmluZzpyfT10Lm9wdGlvbnM7cmV0dXJuIHR5cGVvZiBuPT1gZnVuY3Rpb25gP24oZSk6bj8/cj8/ITB9LGUuZ2V0SXNQaW5uZWQ9KCk9PntsZXQgbj1bZS5pZF0se3RvcDpyLGJvdHRvbTppfT10LmdldFN0YXRlKCkucm93UGlubmluZyxhPW4uc29tZShlPT5yPy5pbmNsdWRlcyhlKSksbz1uLnNvbWUoZT0+aT8uaW5jbHVkZXMoZSkpO3JldHVybiBhP2B0b3BgOm8/YGJvdHRvbWA6ITF9LGUuZ2V0UGlubmVkSW5kZXg9KCk9PntsZXQgbj1lLmdldElzUGlubmVkKCk7cmV0dXJuIG4/KChuPT09YHRvcGA/dC5nZXRUb3BSb3dzKCk6dC5nZXRCb3R0b21Sb3dzKCkpPy5tYXAoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSkpPy5pbmRleE9mKGUuaWQpPz8tMTotMX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFJvd1Bpbm5pbmc9dD0+ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZSh0KSxlLnJlc2V0Um93UGlubmluZz10PT5lLnNldFJvd1Bpbm5pbmcodD9kUygpOmUuaW5pdGlhbFN0YXRlPy5yb3dQaW5uaW5nPz9kUygpKSxlLmdldElzU29tZVJvd3NQaW5uZWQ9dD0+e2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nO3JldHVybiB0PyEhblt0XT8ubGVuZ3RoOiEhKG4udG9wPy5sZW5ndGh8fG4uYm90dG9tPy5sZW5ndGgpfSxlLl9nZXRQaW5uZWRSb3dzPSh0LG4scik9PihlLm9wdGlvbnMua2VlcFBpbm5lZFJvd3M/PyEwPyhuPz9bXSkubWFwKHQ9PntsZXQgbj1lLmdldFJvdyh0LCEwKTtyZXR1cm4gbi5nZXRJc0FsbFBhcmVudHNFeHBhbmRlZCgpP246bnVsbH0pOihuPz9bXSkubWFwKGU9PnQuZmluZCh0PT50LmlkPT09ZSkpKS5maWx0ZXIoQm9vbGVhbikubWFwKGU9Pih7Li4uZSxwb3NpdGlvbjpyfSkpLGUuZ2V0VG9wUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYHRvcGApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRUb3BSb3dzYCkpLGUuZ2V0Qm90dG9tUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcuYm90dG9tXSwodCxuKT0+ZS5fZ2V0UGlubmVkUm93cyh0LG4sYGJvdHRvbWApLCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRCb3R0b21Sb3dzYCkpLGUuZ2V0Q2VudGVyUm93cz1RKCgpPT5bZS5nZXRSb3dNb2RlbCgpLnJvd3MsZS5nZXRTdGF0ZSgpLnJvd1Bpbm5pbmcudG9wLGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLmJvdHRvbV0sKGUsdCxuKT0+e2xldCByPW5ldyBTZXQoWy4uLnQ/P1tdLC4uLm4/P1tdXSk7cmV0dXJuIGUuZmlsdGVyKGU9PiFyLmhhcyhlLmlkKSl9LCQoZS5vcHRpb25zLGBkZWJ1Z1Jvd3NgLGBnZXRDZW50ZXJSb3dzYCkpfX0scFM9e2dldEluaXRpYWxTdGF0ZTplPT4oe3Jvd1NlbGVjdGlvbjp7fSwuLi5lfSksZ2V0RGVmYXVsdE9wdGlvbnM6ZT0+KHtvblJvd1NlbGVjdGlvbkNoYW5nZTp2eChgcm93U2VsZWN0aW9uYCxlKSxlbmFibGVSb3dTZWxlY3Rpb246ITAsZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb246ITAsZW5hYmxlU3ViUm93U2VsZWN0aW9uOiEwfSksY3JlYXRlVGFibGU6ZT0+e2Uuc2V0Um93U2VsZWN0aW9uPXQ9PmUub3B0aW9ucy5vblJvd1NlbGVjdGlvbkNoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uUm93U2VsZWN0aW9uQ2hhbmdlKHQpLGUucmVzZXRSb3dTZWxlY3Rpb249dD0+ZS5zZXRSb3dTZWxlY3Rpb24odD97fTplLmluaXRpYWxTdGF0ZS5yb3dTZWxlY3Rpb24/P3t9KSxlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZD10PT57ZS5zZXRSb3dTZWxlY3Rpb24obj0+e3Q9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFJvd3NTZWxlY3RlZCgpOnQ7bGV0IHI9ey4uLm59LGk9ZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4gdD9pLmZvckVhY2goZT0+e2UuZ2V0Q2FuU2VsZWN0KCkmJihyW2UuaWRdPSEwKX0pOmkuZm9yRWFjaChlPT57ZGVsZXRlIHJbZS5pZF19KSxyfSl9LGUudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZD10PT5lLnNldFJvd1NlbGVjdGlvbihuPT57bGV0IHI9dD09PXZvaWQgMD8hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKTp0LGk9ey4uLm59O3JldHVybiBlLmdldFJvd01vZGVsKCkucm93cy5mb3JFYWNoKHQ9PnttUyhpLHQuaWQsciwhMCxlKX0pLGl9KSxlLmdldFByZVNlbGVjdGVkUm93TW9kZWw9KCk9PmUuZ2V0Q29yZVJvd01vZGVsKCksZS5nZXRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0Q29yZVJvd01vZGVsKCldLCh0LG4pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg/aFMoZSxuKTp7cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsPVEoKCk9PltlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsYCkpLGUuZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWw9USgoKT0+W2UuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24sZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXSwodCxuKT0+T2JqZWN0LmtleXModCkubGVuZ3RoP2hTKGUsbik6e3Jvd3M6W10sZmxhdFJvd3M6W10scm93c0J5SWQ6e319LCQoZS5vcHRpb25zLGBkZWJ1Z1RhYmxlYCxgZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWxgKSksZS5nZXRJc0FsbFJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISEodC5sZW5ndGgmJk9iamVjdC5rZXlzKG4pLmxlbmd0aCk7cmV0dXJuIHImJnQuc29tZShlPT5lLmdldENhblNlbGVjdCgpJiYhbltlLmlkXSkmJihyPSExKSxyfSxlLmdldElzQWxsUGFnZVJvd3NTZWxlY3RlZD0oKT0+e2xldCB0PWUuZ2V0UGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3MuZmlsdGVyKGU9PmUuZ2V0Q2FuU2VsZWN0KCkpLHtyb3dTZWxlY3Rpb246bn09ZS5nZXRTdGF0ZSgpLHI9ISF0Lmxlbmd0aDtyZXR1cm4gciYmdC5zb21lKGU9PiFuW2UuaWRdKSYmKHI9ITEpLHJ9LGUuZ2V0SXNTb21lUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9T2JqZWN0LmtleXMoZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbj8/e30pLmxlbmd0aDtyZXR1cm4gdD4wJiZ0PGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpLmZsYXRSb3dzLmxlbmd0aH0sZS5nZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkPSgpPT57bGV0IHQ9ZS5nZXRQYWdpbmF0aW9uUm93TW9kZWwoKS5mbGF0Um93cztyZXR1cm4hZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKSYmdC5maWx0ZXIoZT0+ZS5nZXRDYW5TZWxlY3QoKSkuc29tZShlPT5lLmdldElzU2VsZWN0ZWQoKXx8ZS5nZXRJc1NvbWVTZWxlY3RlZCgpKX0sZS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyPSgpPT50PT57ZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9LGUuZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZEhhbmRsZXI9KCk9PnQ9PntlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQodC50YXJnZXQuY2hlY2tlZCl9fSxjcmVhdGVSb3c6KGUsdCk9PntlLnRvZ2dsZVNlbGVjdGVkPShuLHIpPT57bGV0IGk9ZS5nZXRJc1NlbGVjdGVkKCk7dC5zZXRSb3dTZWxlY3Rpb24oYT0+e2lmKG49bj09PXZvaWQgMD8haTpuLGUuZ2V0Q2FuU2VsZWN0KCkmJmk9PT1uKXJldHVybiBhO2xldCBvPXsuLi5hfTtyZXR1cm4gbVMobyxlLmlkLG4scj8uc2VsZWN0Q2hpbGRyZW4/PyEwLHQpLG99KX0sZS5nZXRJc1NlbGVjdGVkPSgpPT57bGV0e3Jvd1NlbGVjdGlvbjpufT10LmdldFN0YXRlKCk7cmV0dXJuIGdTKGUsbil9LGUuZ2V0SXNTb21lU2VsZWN0ZWQ9KCk9PntsZXR7cm93U2VsZWN0aW9uOm59PXQuZ2V0U3RhdGUoKTtyZXR1cm4gX1MoZSxuKT09PWBzb21lYH0sZS5nZXRJc0FsbFN1YlJvd3NTZWxlY3RlZD0oKT0+e2xldHtyb3dTZWxlY3Rpb246bn09dC5nZXRTdGF0ZSgpO3JldHVybiBfUyhlLG4pPT09YGFsbGB9LGUuZ2V0Q2FuU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbj09YGZ1bmN0aW9uYD90Lm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKGUpOnQub3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0Q2FuU2VsZWN0U3ViUm93cz0oKT0+dHlwZW9mIHQub3B0aW9ucy5lbmFibGVTdWJSb3dTZWxlY3Rpb249PWBmdW5jdGlvbmA/dC5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uPz8hMCxlLmdldENhbk11bHRpU2VsZWN0PSgpPT50eXBlb2YgdC5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uPT1gZnVuY3Rpb25gP3Qub3B0aW9ucy5lbmFibGVNdWx0aVJvd1NlbGVjdGlvbihlKTp0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24/PyEwLGUuZ2V0VG9nZ2xlU2VsZWN0ZWRIYW5kbGVyPSgpPT57bGV0IHQ9ZS5nZXRDYW5TZWxlY3QoKTtyZXR1cm4gbj0+e3QmJmUudG9nZ2xlU2VsZWN0ZWQobi50YXJnZXQ/LmNoZWNrZWQpfX19fSxtUz0oZSx0LG4scixpKT0+e3ZhciBhO2xldCBvPWkuZ2V0Um93KHQsITApO24/KG8uZ2V0Q2FuTXVsdGlTZWxlY3QoKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCh0PT5kZWxldGUgZVt0XSksby5nZXRDYW5TZWxlY3QoKSYmKGVbdF09ITApKTpkZWxldGUgZVt0XSxyJiYoYT1vLnN1YlJvd3MpIT1udWxsJiZhLmxlbmd0aCYmby5nZXRDYW5TZWxlY3RTdWJSb3dzKCkmJm8uc3ViUm93cy5mb3JFYWNoKHQ9Pm1TKGUsdC5pZCxuLHIsaSkpfTtmdW5jdGlvbiBoUyhlLHQpe2xldCBuPWUuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb24scj1bXSxpPXt9LGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoZT0+e3ZhciB0O2xldCBvPWdTKGUsbik7aWYobyYmKHIucHVzaChlKSxpW2UuaWRdPWUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZT17Li4uZSxzdWJSb3dzOmEoZS5zdWJSb3dzKX0pLG8pcmV0dXJuIGV9KS5maWx0ZXIoQm9vbGVhbil9O3JldHVybntyb3dzOmEodC5yb3dzKSxmbGF0Um93czpyLHJvd3NCeUlkOml9fWZ1bmN0aW9uIGdTKGUsdCl7cmV0dXJuIHRbZS5pZF0/PyExfWZ1bmN0aW9uIF9TKGUsdCxuKXt2YXIgcjtpZighKChyPWUuc3ViUm93cykhPW51bGwmJnIubGVuZ3RoKSlyZXR1cm4hMTtsZXQgaT0hMCxhPSExO3JldHVybiBlLnN1YlJvd3MuZm9yRWFjaChlPT57aWYoIShhJiYhaSkmJihlLmdldENhblNlbGVjdCgpJiYoZ1MoZSx0KT9hPSEwOmk9ITEpLGUuc3ViUm93cyYmZS5zdWJSb3dzLmxlbmd0aCkpe2xldCBuPV9TKGUsdCk7bj09PWBhbGxgP2E9ITA6KG49PT1gc29tZWAmJihhPSEwKSxpPSExKX19KSxpP2BhbGxgOmE/YHNvbWVgOiExfXZhciB2Uz0vKFswLTldKykvZ20seVM9KGUsdCxuKT0+RFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxiUz0oZSx0LG4pPT5EUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSkseFM9KGUsdCxuKT0+VFMoRVMoZS5nZXRWYWx1ZShuKSkudG9Mb3dlckNhc2UoKSxFUyh0LmdldFZhbHVlKG4pKS50b0xvd2VyQ2FzZSgpKSxTUz0oZSx0LG4pPT5UUyhFUyhlLmdldFZhbHVlKG4pKSxFUyh0LmdldFZhbHVlKG4pKSksQ1M9KGUsdCxuKT0+e2xldCByPWUuZ2V0VmFsdWUobiksaT10LmdldFZhbHVlKG4pO3JldHVybiByPmk/MTpyPGk/LTE6MH0sd1M9KGUsdCxuKT0+VFMoZS5nZXRWYWx1ZShuKSx0LmdldFZhbHVlKG4pKTtmdW5jdGlvbiBUUyhlLHQpe3JldHVybiBlPT09dD8wOmU+dD8xOi0xfWZ1bmN0aW9uIEVTKGUpe3JldHVybiB0eXBlb2YgZT09YG51bWJlcmA/aXNOYU4oZSl8fGU9PT0xLzB8fGU9PT0tMS8wP2BgOlN0cmluZyhlKTp0eXBlb2YgZT09YHN0cmluZ2A/ZTpgYH1mdW5jdGlvbiBEUyhlLHQpe2xldCBuPWUuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKSxyPXQuc3BsaXQodlMpLmZpbHRlcihCb29sZWFuKTtmb3IoO24ubGVuZ3RoJiZyLmxlbmd0aDspe2xldCBlPW4uc2hpZnQoKSx0PXIuc2hpZnQoKSxpPXBhcnNlSW50KGUsMTApLGE9cGFyc2VJbnQodCwxMCksbz1baSxhXS5zb3J0KCk7aWYoaXNOYU4ob1swXSkpe2lmKGU+dClyZXR1cm4gMTtpZih0PmUpcmV0dXJuLTE7Y29udGludWV9aWYoaXNOYU4ob1sxXSkpcmV0dXJuIGlzTmFOKGkpPy0xOjE7aWYoaT5hKXJldHVybiAxO2lmKGE+aSlyZXR1cm4tMX1yZXR1cm4gbi5sZW5ndGgtci5sZW5ndGh9dmFyIE9TPXthbHBoYW51bWVyaWM6eVMsYWxwaGFudW1lcmljQ2FzZVNlbnNpdGl2ZTpiUyx0ZXh0OnhTLHRleHRDYXNlU2Vuc2l0aXZlOlNTLGRhdGV0aW1lOkNTLGJhc2ljOndTfSxrUz1bRXgsblMsS3gsSngsa3gsVngsaVMsYVMse2dldEluaXRpYWxTdGF0ZTplPT4oe3NvcnRpbmc6W10sLi4uZX0pLGdldERlZmF1bHRDb2x1bW5EZWY6KCk9Pih7c29ydGluZ0ZuOmBhdXRvYCxzb3J0VW5kZWZpbmVkOjF9KSxnZXREZWZhdWx0T3B0aW9uczplPT4oe29uU29ydGluZ0NoYW5nZTp2eChgc29ydGluZ2AsZSksaXNNdWx0aVNvcnRFdmVudDplPT5lLnNoaWZ0S2V5fSksY3JlYXRlQ29sdW1uOihlLHQpPT57ZS5nZXRBdXRvU29ydGluZ0ZuPSgpPT57bGV0IG49dC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Muc2xpY2UoMTApLHI9ITE7Zm9yKGxldCB0IG9mIG4pe2xldCBuPXQ/LmdldFZhbHVlKGUuaWQpO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PWBbb2JqZWN0IERhdGVdYClyZXR1cm4gT1MuZGF0ZXRpbWU7aWYodHlwZW9mIG49PWBzdHJpbmdgJiYocj0hMCxuLnNwbGl0KHZTKS5sZW5ndGg+MSkpcmV0dXJuIE9TLmFscGhhbnVtZXJpY31yZXR1cm4gcj9PUy50ZXh0Ok9TLmJhc2ljfSxlLmdldEF1dG9Tb3J0RGlyPSgpPT50eXBlb2YgdC5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3NbMF0/LmdldFZhbHVlKGUuaWQpPT1gc3RyaW5nYD9gYXNjYDpgZGVzY2AsZS5nZXRTb3J0aW5nRm49KCk9PntpZighZSl0aHJvdyBFcnJvcigpO3JldHVybiB5eChlLmNvbHVtbkRlZi5zb3J0aW5nRm4pP2UuY29sdW1uRGVmLnNvcnRpbmdGbjplLmNvbHVtbkRlZi5zb3J0aW5nRm49PT1gYXV0b2A/ZS5nZXRBdXRvU29ydGluZ0ZuKCk6dC5vcHRpb25zLnNvcnRpbmdGbnM/LltlLmNvbHVtbkRlZi5zb3J0aW5nRm5dPz9PU1tlLmNvbHVtbkRlZi5zb3J0aW5nRm5dfSxlLnRvZ2dsZVNvcnRpbmc9KG4scik9PntsZXQgaT1lLmdldE5leHRTb3J0aW5nT3JkZXIoKSxhPW4hPW51bGw7dC5zZXRTb3J0aW5nKG89PntsZXQgcz1vPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKSxjPW8/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCksbD1bXSx1LGQ9YT9uOmk9PT1gZGVzY2A7cmV0dXJuIHU9byE9bnVsbCYmby5sZW5ndGgmJmUuZ2V0Q2FuTXVsdGlTb3J0KCkmJnI/cz9gdG9nZ2xlYDpgYWRkYDpvIT1udWxsJiZvLmxlbmd0aCYmYyE9PW8ubGVuZ3RoLTE/YHJlcGxhY2VgOnM/YHRvZ2dsZWA6YHJlcGxhY2VgLHU9PT1gdG9nZ2xlYCYmKGF8fGl8fCh1PWByZW1vdmVgKSksdT09PWBhZGRgPyhsPVsuLi5vLHtpZDplLmlkLGRlc2M6ZH1dLGwuc3BsaWNlKDAsbC5sZW5ndGgtKHQub3B0aW9ucy5tYXhNdWx0aVNvcnRDb2xDb3VudD8/MioqNTMtMSkpKTpsPXU9PT1gdG9nZ2xlYD9vLm1hcCh0PT50LmlkPT09ZS5pZD97Li4udCxkZXNjOmR9OnQpOnU9PT1gcmVtb3ZlYD9vLmZpbHRlcih0PT50LmlkIT09ZS5pZCk6W3tpZDplLmlkLGRlc2M6ZH1dLGx9KX0sZS5nZXRGaXJzdFNvcnREaXI9KCk9PmUuY29sdW1uRGVmLnNvcnREZXNjRmlyc3Q/P3Qub3B0aW9ucy5zb3J0RGVzY0ZpcnN0Pz9lLmdldEF1dG9Tb3J0RGlyKCk9PT1gZGVzY2A/YGRlc2NgOmBhc2NgLGUuZ2V0TmV4dFNvcnRpbmdPcmRlcj1uPT57bGV0IHI9ZS5nZXRGaXJzdFNvcnREaXIoKSxpPWUuZ2V0SXNTb3J0ZWQoKTtyZXR1cm4gaT9pIT09ciYmKHQub3B0aW9ucy5lbmFibGVTb3J0aW5nUmVtb3ZhbD8/ITApJiYoIW58fCh0Lm9wdGlvbnMuZW5hYmxlTXVsdGlSZW1vdmU/PyEwKSk/ITE6aT09PWBkZXNjYD9gYXNjYDpgZGVzY2A6cn0sZS5nZXRDYW5Tb3J0PSgpPT4oZS5jb2x1bW5EZWYuZW5hYmxlU29ydGluZz8/ITApJiYodC5vcHRpb25zLmVuYWJsZVNvcnRpbmc/PyEwKSYmISFlLmFjY2Vzc29yRm4sZS5nZXRDYW5NdWx0aVNvcnQ9KCk9PmUuY29sdW1uRGVmLmVuYWJsZU11bHRpU29ydD8/dC5vcHRpb25zLmVuYWJsZU11bHRpU29ydD8/ISFlLmFjY2Vzc29yRm4sZS5nZXRJc1NvcnRlZD0oKT0+e2xldCBuPXQuZ2V0U3RhdGUoKS5zb3J0aW5nPy5maW5kKHQ9PnQuaWQ9PT1lLmlkKTtyZXR1cm4gbj9uLmRlc2M/YGRlc2NgOmBhc2NgOiExfSxlLmdldFNvcnRJbmRleD0oKT0+dC5nZXRTdGF0ZSgpLnNvcnRpbmc/LmZpbmRJbmRleCh0PT50LmlkPT09ZS5pZCk/Py0xLGUuY2xlYXJTb3J0aW5nPSgpPT57dC5zZXRTb3J0aW5nKHQ9PnQhPW51bGwmJnQubGVuZ3RoP3QuZmlsdGVyKHQ9PnQuaWQhPT1lLmlkKTpbXSl9LGUuZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXI9KCk9PntsZXQgbj1lLmdldENhblNvcnQoKTtyZXR1cm4gcj0+e24mJihyLnBlcnNpc3Q9PW51bGx8fHIucGVyc2lzdCgpLGUudG9nZ2xlU29ydGluZz09bnVsbHx8ZS50b2dnbGVTb3J0aW5nKHZvaWQgMCxlLmdldENhbk11bHRpU29ydCgpP3Qub3B0aW9ucy5pc011bHRpU29ydEV2ZW50PT1udWxsP3ZvaWQgMDp0Lm9wdGlvbnMuaXNNdWx0aVNvcnRFdmVudChyKTohMSkpfX19LGNyZWF0ZVRhYmxlOmU9PntlLnNldFNvcnRpbmc9dD0+ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZT09bnVsbD92b2lkIDA6ZS5vcHRpb25zLm9uU29ydGluZ0NoYW5nZSh0KSxlLnJlc2V0U29ydGluZz10PT57ZS5zZXRTb3J0aW5nKHQ/W106ZS5pbml0aWFsU3RhdGU/LnNvcnRpbmc/P1tdKX0sZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbD0oKT0+ZS5nZXRHcm91cGVkUm93TW9kZWwoKSxlLmdldFNvcnRlZFJvd01vZGVsPSgpPT4oIWUuX2dldFNvcnRlZFJvd01vZGVsJiZlLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwmJihlLl9nZXRTb3J0ZWRSb3dNb2RlbD1lLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwoZSkpLGUub3B0aW9ucy5tYW51YWxTb3J0aW5nfHwhZS5fZ2V0U29ydGVkUm93TW9kZWw/ZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCgpOmUuX2dldFNvcnRlZFJvd01vZGVsKCkpfX0sV3gsb1MsdVMsZlMscFMsUXhdO2Z1bmN0aW9uIEFTKGUpe2xldCB0PVsuLi5rUywuLi5lLl9mZWF0dXJlcz8/W11dLG49e19mZWF0dXJlczp0fSxyPW4uX2ZlYXR1cmVzLnJlZHVjZSgoZSx0KT0+T2JqZWN0LmFzc2lnbihlLHQuZ2V0RGVmYXVsdE9wdGlvbnM9PW51bGw/dm9pZCAwOnQuZ2V0RGVmYXVsdE9wdGlvbnMobikpLHt9KSxpPWU9Pm4ub3B0aW9ucy5tZXJnZU9wdGlvbnM/bi5vcHRpb25zLm1lcmdlT3B0aW9ucyhyLGUpOnsuLi5yLC4uLmV9LGE9ey4uLmUuaW5pdGlhbFN0YXRlPz97fX07bi5fZmVhdHVyZXMuZm9yRWFjaChlPT57YT0oZS5nZXRJbml0aWFsU3RhdGU9PW51bGw/dm9pZCAwOmUuZ2V0SW5pdGlhbFN0YXRlKGEpKT8/YX0pO2xldCBvPVtdLHM9ITEsYz17X2ZlYXR1cmVzOnQsb3B0aW9uczp7Li4uciwuLi5lfSxpbml0aWFsU3RhdGU6YSxfcXVldWU6ZT0+e28ucHVzaChlKSxzfHwocz0hMCxQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57Zm9yKDtvLmxlbmd0aDspby5zaGlmdCgpKCk7cz0hMX0pLmNhdGNoKGU9PnNldFRpbWVvdXQoKCk9Pnt0aHJvdyBlfSkpKX0scmVzZXQ6KCk9PntuLnNldFN0YXRlKG4uaW5pdGlhbFN0YXRlKX0sc2V0T3B0aW9uczplPT57bGV0IHQ9X3goZSxuLm9wdGlvbnMpO24ub3B0aW9ucz1pKHQpfSxnZXRTdGF0ZTooKT0+bi5vcHRpb25zLnN0YXRlLHNldFN0YXRlOmU9PntuLm9wdGlvbnMub25TdGF0ZUNoYW5nZT09bnVsbHx8bi5vcHRpb25zLm9uU3RhdGVDaGFuZ2UoZSl9LF9nZXRSb3dJZDooZSx0LHIpPT4obi5vcHRpb25zLmdldFJvd0lkPT1udWxsP3ZvaWQgMDpuLm9wdGlvbnMuZ2V0Um93SWQoZSx0LHIpKT8/YCR7cj9bci5pZCx0XS5qb2luKGAuYCk6dH1gLGdldENvcmVSb3dNb2RlbDooKT0+KG4uX2dldENvcmVSb3dNb2RlbHx8PW4ub3B0aW9ucy5nZXRDb3JlUm93TW9kZWwobiksbi5fZ2V0Q29yZVJvd01vZGVsKCkpLGdldFJvd01vZGVsOigpPT5uLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpLGdldFJvdzooZSx0KT0+e2xldCByPSh0P24uZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKCk6bi5nZXRSb3dNb2RlbCgpKS5yb3dzQnlJZFtlXTtpZighciYmKHI9bi5nZXRDb3JlUm93TW9kZWwoKS5yb3dzQnlJZFtlXSwhcikpdGhyb3cgRXJyb3IoKTtyZXR1cm4gcn0sX2dldERlZmF1bHRDb2x1bW5EZWY6USgoKT0+W24ub3B0aW9ucy5kZWZhdWx0Q29sdW1uXSxlPT4oZT8/PXt9LHtoZWFkZXI6ZT0+e2xldCB0PWUuaGVhZGVyLmNvbHVtbi5jb2x1bW5EZWY7cmV0dXJuIHQuYWNjZXNzb3JLZXk/dC5hY2Nlc3NvcktleTp0LmFjY2Vzc29yRm4/dC5pZDpudWxsfSxjZWxsOmU9Pnt2YXIgdDtyZXR1cm4oKHQ9ZS5yZW5kZXJWYWx1ZSgpKT09bnVsbHx8dC50b1N0cmluZz09bnVsbD92b2lkIDA6dC50b1N0cmluZygpKT8/bnVsbH0sLi4ubi5fZmVhdHVyZXMucmVkdWNlKChlLHQpPT5PYmplY3QuYXNzaWduKGUsdC5nZXREZWZhdWx0Q29sdW1uRGVmPT1udWxsP3ZvaWQgMDp0LmdldERlZmF1bHRDb2x1bW5EZWYoKSkse30pLC4uLmV9KSwkKGUsYGRlYnVnQ29sdW1uc2AsYF9nZXREZWZhdWx0Q29sdW1uRGVmYCkpLF9nZXRDb2x1bW5EZWZzOigpPT5uLm9wdGlvbnMuY29sdW1ucyxnZXRBbGxDb2x1bW5zOlEoKCk9PltuLl9nZXRDb2x1bW5EZWZzKCldLGU9PntsZXQgdD1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIGk9PT12b2lkIDAmJihpPTApLGUubWFwKGU9PntsZXQgYT1DeChuLGUsaSxyKSxvPWU7cmV0dXJuIGEuY29sdW1ucz1vLmNvbHVtbnM/dChvLmNvbHVtbnMsYSxpKzEpOltdLGF9KX07cmV0dXJuIHQoZSl9LCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsQ29sdW1uc2ApKSxnZXRBbGxGbGF0Q29sdW1uczpRKCgpPT5bbi5nZXRBbGxDb2x1bW5zKCldLGU9PmUuZmxhdE1hcChlPT5lLmdldEZsYXRDb2x1bW5zKCkpLCQoZSxgZGVidWdDb2x1bW5zYCxgZ2V0QWxsRmxhdENvbHVtbnNgKSksX2dldEFsbEZsYXRDb2x1bW5zQnlJZDpRKCgpPT5bbi5nZXRBbGxGbGF0Q29sdW1ucygpXSxlPT5lLnJlZHVjZSgoZSx0KT0+KGVbdC5pZF09dCxlKSx7fSksJChlLGBkZWJ1Z0NvbHVtbnNgLGBnZXRBbGxGbGF0Q29sdW1uc0J5SWRgKSksZ2V0QWxsTGVhZkNvbHVtbnM6USgoKT0+W24uZ2V0QWxsQ29sdW1ucygpLG4uX2dldE9yZGVyQ29sdW1uc0ZuKCldLChlLHQpPT50KGUuZmxhdE1hcChlPT5lLmdldExlYWZDb2x1bW5zKCkpKSwkKGUsYGRlYnVnQ29sdW1uc2AsYGdldEFsbExlYWZDb2x1bW5zYCkpLGdldENvbHVtbjplPT5uLl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQoKVtlXX07T2JqZWN0LmFzc2lnbihuLGMpO2ZvcihsZXQgZT0wO2U8bi5fZmVhdHVyZXMubGVuZ3RoO2UrKyl7bGV0IHQ9bi5fZmVhdHVyZXNbZV07dD09bnVsbHx8dC5jcmVhdGVUYWJsZT09bnVsbHx8dC5jcmVhdGVUYWJsZShuKX1yZXR1cm4gbn1mdW5jdGlvbiBqUygpe3JldHVybiBlPT5RKCgpPT5bZS5vcHRpb25zLmRhdGFdLHQ9PntsZXQgbj17cm93czpbXSxmbGF0Um93czpbXSxyb3dzQnlJZDp7fX0scj1mdW5jdGlvbih0LGksYSl7aT09PXZvaWQgMCYmKGk9MCk7bGV0IG89W107Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2xldCBsPU94KGUsZS5fZ2V0Um93SWQodFtjXSxjLGEpLHRbY10sYyxpLHZvaWQgMCxhPy5pZCk7aWYobi5mbGF0Um93cy5wdXNoKGwpLG4ucm93c0J5SWRbbC5pZF09bCxvLnB1c2gobCksZS5vcHRpb25zLmdldFN1YlJvd3Mpe3ZhciBzO2wub3JpZ2luYWxTdWJSb3dzPWUub3B0aW9ucy5nZXRTdWJSb3dzKHRbY10sYyksKHM9bC5vcmlnaW5hbFN1YlJvd3MpIT1udWxsJiZzLmxlbmd0aCYmKGwuc3ViUm93cz1yKGwub3JpZ2luYWxTdWJSb3dzLGkrMSxsKSl9fXJldHVybiBvfTtyZXR1cm4gbi5yb3dzPXIodCksbn0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTVMoKXtyZXR1cm4gZT0+USgoKT0+W2UuZ2V0U3RhdGUoKS5zb3J0aW5nLGUuZ2V0UHJlU29ydGVkUm93TW9kZWwoKV0sKHQsbik9PntpZighbi5yb3dzLmxlbmd0aHx8ISh0IT1udWxsJiZ0Lmxlbmd0aCkpcmV0dXJuIG47bGV0IHI9ZS5nZXRTdGF0ZSgpLnNvcnRpbmcsaT1bXSxhPXIuZmlsdGVyKHQ9PmUuZ2V0Q29sdW1uKHQuaWQpPy5nZXRDYW5Tb3J0KCkpLG89e307YS5mb3JFYWNoKHQ9PntsZXQgbj1lLmdldENvbHVtbih0LmlkKTtuJiYob1t0LmlkXT17c29ydFVuZGVmaW5lZDpuLmNvbHVtbkRlZi5zb3J0VW5kZWZpbmVkLGludmVydFNvcnRpbmc6bi5jb2x1bW5EZWYuaW52ZXJ0U29ydGluZyxzb3J0aW5nRm46bi5nZXRTb3J0aW5nRm4oKX0pfSk7bGV0IHM9ZT0+e2xldCB0PWUubWFwKGU9Pih7Li4uZX0pKTtyZXR1cm4gdC5zb3J0KChlLHQpPT57Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKz0xKXtsZXQgcj1hW25dLGk9b1tyLmlkXSxzPWkuc29ydFVuZGVmaW5lZCxjPXI/LmRlc2M/PyExLGw9MDtpZihzKXtsZXQgbj1lLmdldFZhbHVlKHIuaWQpLGk9dC5nZXRWYWx1ZShyLmlkKSxhPW49PT12b2lkIDAsbz1pPT09dm9pZCAwO2lmKGF8fG8pe2lmKHM9PT1gZmlyc3RgKXJldHVybiBhPy0xOjE7aWYocz09PWBsYXN0YClyZXR1cm4gYT8xOi0xO2w9YSYmbz8wOmE/czotc319aWYobD09PTAmJihsPWkuc29ydGluZ0ZuKGUsdCxyLmlkKSksbCE9PTApcmV0dXJuIGMmJihsKj0tMSksaS5pbnZlcnRTb3J0aW5nJiYobCo9LTEpLGx9cmV0dXJuIGUuaW5kZXgtdC5pbmRleH0pLHQuZm9yRWFjaChlPT57dmFyIHQ7aS5wdXNoKGUpLCh0PWUuc3ViUm93cykhPW51bGwmJnQubGVuZ3RoJiYoZS5zdWJSb3dzPXMoZS5zdWJSb3dzKSl9KSx0fTtyZXR1cm57cm93czpzKG4ucm93cyksZmxhdFJvd3M6aSxyb3dzQnlJZDpuLnJvd3NCeUlkfX0sJChlLm9wdGlvbnMsYGRlYnVnVGFibGVgLGBnZXRTb3J0ZWRSb3dNb2RlbGAsKCk9PmUuX2F1dG9SZXNldFBhZ2VJbmRleCgpKSl9ZnVuY3Rpb24gTlMoKXtyZXR1cm4hMH12YXIgUFM9U3ltYm9sKGBtZXJnZS1wcm94eWApLEZTPXtnZXQoZSx0LG4pe3JldHVybiB0PT09UFM/bjplLmdldCh0KX0saGFzKGUsdCl7cmV0dXJuIGUuaGFzKHQpfSxzZXQ6TlMsZGVsZXRlUHJvcGVydHk6TlMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCl7cmV0dXJue2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiBlLmdldCh0KX0sc2V0Ok5TLGRlbGV0ZVByb3BlcnR5Ok5TfX0sb3duS2V5cyhlKXtyZXR1cm4gZS5rZXlzKCl9fTtmdW5jdGlvbiBJUyhlKXtyZXR1cm5gdmFsdWVgaW4gZT9lLnZhbHVlOmV9ZnVuY3Rpb24gTFMoKXt2YXIgZT1bLi4uYXJndW1lbnRzXTtyZXR1cm4gbmV3IFByb3h5KHtnZXQodCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCByPUlTKGVbbl0pW3RdO2lmKHIhPT12b2lkIDApcmV0dXJuIHJ9fSxoYXModCl7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0paWYodCBpbiBJUyhlW25dKSlyZXR1cm4hMDtyZXR1cm4hMX0sa2V5cygpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCguLi5PYmplY3Qua2V5cyhJUyhlW25dKSkpO3JldHVyblsuLi5BcnJheS5mcm9tKG5ldyBTZXQodCkpXX19LEZTKX12YXIgUlM9Rih7cHJvcHM6W2ByZW5kZXJgLGBwcm9wc2BdLHNldHVwOmU9PigpPT50eXBlb2YgZS5yZW5kZXI9PWBmdW5jdGlvbmB8fHR5cGVvZiBlLnJlbmRlcj09YG9iamVjdGA/RyhlLnJlbmRlcixlLnByb3BzKTplLnJlbmRlcn0pO2Z1bmN0aW9uIHpTKGUpe3JldHVybiBMUyhlLHtkYXRhOk4oZS5kYXRhKX0pfWZ1bmN0aW9uIEJTKGUpe2xldCB0PWooZS5kYXRhKSxuPUFTKExTKHtzdGF0ZTp7fSxvblN0YXRlQ2hhbmdlOigpPT57fSxyZW5kZXJGYWxsYmFja1ZhbHVlOm51bGwsbWVyZ2VPcHRpb25zKGUsbil7cmV0dXJuIHQ/ey4uLmUsLi4ubn06TFMoZSxuKX19LHQ/elMoZSk6ZSkpO2lmKHQpe2xldCB0PXVuKGUuZGF0YSk7RXIodCwoKT0+e24uc2V0U3RhdGUoZT0+KHsuLi5lLGRhdGE6dC52YWx1ZX0pKX0se2ltbWVkaWF0ZTohMH0pfWxldCByPU0obi5pbml0aWFsU3RhdGUpO3JldHVybiBDcigoKT0+e24uc2V0T3B0aW9ucyhuPT57bGV0IGk9bmV3IFByb3h5KHt9LHtnZXQ6KGUsdCk9PnIudmFsdWVbdF19KTtyZXR1cm4gTFMobix0P3pTKGUpOmUse3N0YXRlOkxTKGksZS5zdGF0ZT8/e30pLG9uU3RhdGVDaGFuZ2U6dD0+e3QgaW5zdGFuY2VvZiBGdW5jdGlvbj9yLnZhbHVlPXQoci52YWx1ZSk6ci52YWx1ZT10LGUub25TdGF0ZUNoYW5nZT09bnVsbHx8ZS5vblN0YXRlQ2hhbmdlKHQpfX0pfSl9KSxufXZhciBWUz1bYGFyaWEtbGFiZWxgXSxIUz1GKHtfX25hbWU6YFNvcnRIZWFkZXJCdXR0b25gLHByb3BzOntoZWFkZXI6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT50LmhlYWRlci5jb2x1bW4uZ2V0SXNTb3J0ZWQoKSkscj1XKCgpPT5uLnZhbHVlPT09YGFzY2A/YV86bi52YWx1ZT09PWBkZXNjYD92XzpkXyksaT1XKCgpPT57bGV0IGU9dC5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXI7cmV0dXJuIHR5cGVvZiBlPT1gc3RyaW5nYD9lOnQuaGVhZGVyLmNvbHVtbi5pZH0pLGE9VygoKT0+e2xldCBlPW4udmFsdWU9PT1gYXNjYD9gYXNjZW5kaW5nYDpuLnZhbHVlPT09YGRlc2NgP2BkZXNjZW5kaW5nYDpgbm9uZWA7cmV0dXJuYFNvcnQgYnkgJHtpLnZhbHVlfSwgY3VycmVudGx5ICR7ZX1gfSk7ZnVuY3Rpb24gbygpe3QuaGVhZGVyLmNvbHVtbi50b2dnbGVTb3J0aW5nKG4udmFsdWU9PT1gYXNjYCl9cmV0dXJuKHQsaSk9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBidXR0b25gLHt0eXBlOmBidXR0b25gLCJhcmlhLWxhYmVsIjphLnZhbHVlLGNsYXNzOmBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBweC0xLjUgcHktMC41IGhvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZ2Asb25DbGljazpvfSxbZS5oZWFkZXIuaXNQbGFjZWhvbGRlcj9UcyhgYCwhMCk6KFIoKSxCKE4oUlMpLHtrZXk6MCxyZW5kZXI6ZS5oZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5oZWFkZXIuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKSksSChzLHtpY29uOnIudmFsdWUsY2xhc3M6TyhbYHNpemUtMyBzaHJpbmstMGAsbi52YWx1ZT9gdGV4dC1mb3JlZ3JvdW5kYDpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzYwYF0pLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSldLDgsVlMpfX19KSxVUz17ImRhdGEtc2xvdCI6YHRhYmxlLWNvbnRhaW5lcmAsY2xhc3M6YHJlbGF0aXZlIHctZnVsbCBvdmVyZmxvdy14LWF1dG9gfSxXUz1GKHtfX25hbWU6YFRhYmxlYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgZGl2YCxVUyxbVihgdGFibGVgLHsiZGF0YS1zbG90IjpgdGFibGVgLGNsYXNzOk8oTihZdikoYHctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpXSkpfX0pLEdTPUYoe19fbmFtZTpgVGFibGVCb2R5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGJvZHlgLHsiZGF0YS1zbG90IjpgdGFibGUtYm9keWAsY2xhc3M6TyhOKFl2KShgWyZfdHI6bGFzdC1jaGlsZF06Ym9yZGVyLTBgLHQuY2xhc3MpKX0sW0koZS4kc2xvdHMsYGRlZmF1bHRgKV0sMikpfX0pLEtTPUYoe19fbmFtZTpgVGFibGVDZWxsYCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWU7cmV0dXJuKGUsbik9PihSKCkseihgdGRgLHsiZGF0YS1zbG90IjpgdGFibGUtY2VsbGAsY2xhc3M6TyhOKFl2KShgcC0yIGFsaWduLW1pZGRsZSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSkscVM9Rih7X19uYW1lOmBUYWJsZVJvd2AscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRyYCx7ImRhdGEtc2xvdCI6YHRhYmxlLXJvd2AsY2xhc3M6TyhOKFl2KShgaG92ZXI6YmctbXV0ZWQvNTAgZGF0YS1bc3RhdGU9c2VsZWN0ZWRdOmJnLW11dGVkIGJvcmRlci1iIHRyYW5zaXRpb24tY29sb3JzIGhhcy1hcmlhLWV4cGFuZGVkOmJnLW11dGVkLzUwYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KSxKUz17Y2xhc3M6YGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEwYH0sWVM9Rih7X19uYW1lOmBUYWJsZUVtcHR5YCxwcm9wczp7Y2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sY29sc3Bhbjp7ZGVmYXVsdDoxfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihxUyxudWxsLHtkZWZhdWx0OlAoKCk9PltIKEtTLGtzKHtjbGFzczpOKFl2KShgcC00IHdoaXRlc3BhY2Utbm93cmFwIGFsaWduLW1pZGRsZSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZGAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLEpTLFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldKV0pLF86M30sMTYsW2BjbGFzc2BdKV0pLF86M30pKX19KSxYUz1GKHtfX25hbWU6YFRhYmxlSGVhZGAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRgLGNsYXNzOk8oTihZdikoYHRleHQtZm9yZWdyb3VuZCBoLTEwIHB4LTIgdGV4dC1sZWZ0IGFsaWduLW1pZGRsZSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCBbJjpoYXMoW3JvbGU9Y2hlY2tib3hdKV06cHItMGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKSl9fSksWlM9Rih7X19uYW1lOmBUYWJsZUhlYWRlcmAscHJvcHM6e2NsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lO3JldHVybihlLG4pPT4oUigpLHooYHRoZWFkYCx7ImRhdGEtc2xvdCI6YHRhYmxlLWhlYWRlcmAsY2xhc3M6TyhOKFl2KShgWyZfdHJdOmJvcmRlci1iYCx0LmNsYXNzKSl9LFtJKGUuJHNsb3RzLGBkZWZhdWx0YCldLDIpKX19KTtmdW5jdGlvbiBRUyhlLHQpe3QudmFsdWU9dHlwZW9mIGU9PWBmdW5jdGlvbmA/ZSh0LnZhbHVlKTplfXZhciAkUz1GKHtfX25hbWU6YERhdGFUYWJsZWAscHJvcHM6e2NvbHVtbnM6e30sZGF0YTp7fSxyb3dDbGFzczp7dHlwZTpGdW5jdGlvbn0sZW1wdHlNZXNzYWdlOnt9fSxzZXR1cChlKXtsZXQgdD1lLG49TShbXSkscj1CUyh7Z2V0IGRhdGEoKXtyZXR1cm4gdC5kYXRhfSxnZXQgY29sdW1ucygpe3JldHVybiB0LmNvbHVtbnN9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsbiksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIG4udmFsdWV9fX0pO2Z1bmN0aW9uIGkoZSl7aWYoZT09PWBhc2NgKXJldHVybmBhc2NlbmRpbmdgO2lmKGU9PT1gZGVzY2ApcmV0dXJuYGRlc2NlbmRpbmdgfXJldHVybih0LG4pPT4oUigpLEIoTihXUyksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpTKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEoTihyKS5nZXRIZWFkZXJHcm91cHMoKSxlPT4oUigpLEIoTihxUykse2tleTplLmlkfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKGUuaGVhZGVycyxlPT4oUigpLEIoTihYUykse2tleTplLmlkLGNsYXNzOk8oZS5jb2x1bW4uY29sdW1uRGVmLm1ldGE/LmFsaWduPT09YHJpZ2h0YD9gdGV4dC1yaWdodGA6dm9pZCAwKSwiYXJpYS1zb3J0IjplLmNvbHVtbi5nZXRDYW5Tb3J0KCk/aShlLmNvbHVtbi5nZXRJc1NvcnRlZCgpKT8/YG5vbmVgOnZvaWQgMH0se2RlZmF1bHQ6UCgoKT0+W2UuY29sdW1uLmdldENhblNvcnQoKT8oUigpLEIoSFMse2tleTowLGhlYWRlcjplLGNsYXNzOmAtbXgtMS41YH0sbnVsbCw4LFtgaGVhZGVyYF0pKTplLmlzUGxhY2Vob2xkZXI/VHMoYGAsITApOihSKCksQihOKFJTKSx7a2V5OjEscmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIscHJvcHM6ZS5nZXRDb250ZXh0KCl9LG51bGwsOCxbYHJlbmRlcmAsYHByb3BzYF0pKV0pLF86Mn0sMTAzMixbYGNsYXNzYCxgYXJpYS1zb3J0YF0pKSksMTI4KSldKSxfOjJ9LDEwMjQpKSksMTI4KSldKSxfOjF9KSxIKE4oR1MpLG51bGwse2RlZmF1bHQ6UCgoKT0+W04ocikuZ2V0Um93TW9kZWwoKS5yb3dzLmxlbmd0aD09PTA/KFIoKSxCKE4oWVMpLHtrZXk6MCxjb2xzcGFuOmUuY29sdW1ucy5sZW5ndGgsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS5lbXB0eU1lc3NhZ2U/P2Bub25lYCksMSldKSxfOjF9LDgsW2Bjb2xzcGFuYF0pKTpUcyhgYCwhMCksKFIoITApLHooTCxudWxsLG1hKE4ocikuZ2V0Um93TW9kZWwoKS5yb3dzLHQ9PihSKCksQihOKHFTKSx7a2V5OnQuaWQsY2xhc3M6TyhlLnJvd0NsYXNzPy4odC5vcmlnaW5hbCkpfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHQuZ2V0VmlzaWJsZUNlbGxzKCksZT0+KFIoKSxCKE4oS1MpLHtrZXk6ZS5pZCxjbGFzczpPKGUuY29sdW1uLmNvbHVtbkRlZi5tZXRhPy5hbGlnbj09PWByaWdodGA/YHRleHQtcmlnaHQgdGFidWxhci1udW1zYDp2b2lkIDApfSx7ZGVmYXVsdDpQKCgpPT5bSChOKFJTKSx7cmVuZGVyOmUuY29sdW1uLmNvbHVtbkRlZi5jZWxsLHByb3BzOmUuZ2V0Q29udGV4dCgpfSxudWxsLDgsW2ByZW5kZXJgLGBwcm9wc2BdKV0pLF86Mn0sMTAzMixbYGNsYXNzYF0pKSksMTI4KSldKSxfOjJ9LDEwMzIsW2BjbGFzc2BdKSkpLDEyOCkpXSksXzoxfSldKSxfOjF9KSl9fSksZUM9Rih7X19uYW1lOmBCYWRnZWAscHJvcHM6e2FzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sdmFyaWFudDp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKHIsaSk9PihSKCksQihOKG5iKSxrcyh7ImRhdGEtc2xvdCI6YGJhZGdlYCwiZGF0YS12YXJpYW50IjplLnZhcmlhbnQsY2xhc3M6TihZdikoTih0Qykoe3ZhcmlhbnQ6ZS52YXJpYW50fSksdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLHRDPUNfKGBoLTUgZ2FwLTEgcm91bmRlZC00eGwgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTAuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhhcy1kYXRhLVtpY29uPWlubGluZS1lbmRdOnByLTEuNSBoYXMtZGF0YS1baWNvbj1pbmxpbmUtc3RhcnRdOnBsLTEuNSBbJj5zdmddOnNpemUtMyEgZ3JvdXAvYmFkZ2UgaW5saW5lLWZsZXggdy1maXQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG92ZXJmbG93LWhpZGRlbiB3aGl0ZXNwYWNlLW5vd3JhcCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0zIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmVgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6YmctcHJpbWFyeS84MGAsc2Vjb25kYXJ5OmBiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBbYV06aG92ZXI6Ymctc2Vjb25kYXJ5LzgwYCxkZXN0cnVjdGl2ZTpgYmctZGVzdHJ1Y3RpdmUvMTAgW2FdOmhvdmVyOmJnLWRlc3RydWN0aXZlLzIwIGZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS80MCB0ZXh0LWRlc3RydWN0aXZlIGRhcms6YmctZGVzdHJ1Y3RpdmUvMjBgLG91dGxpbmU6YGJvcmRlci1ib3JkZXIgdGV4dC1mb3JlZ3JvdW5kIFthXTpob3ZlcjpiZy1tdXRlZCBbYV06aG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCxnaG9zdDpgaG92ZXI6YmctbXV0ZWQgaG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctbXV0ZWQvNTBgLGxpbms6YHRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lYH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7YXN5bmMgZnVuY3Rpb24gbkMoZSx0KXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpdHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlKSxgY29waWVkYH1jYXRjaHt9aWYoIXQpcmV0dXJuYGZhaWxlZGA7bGV0IG49ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtuLnNlbGVjdE5vZGVDb250ZW50cyh0KTtsZXQgcj13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHI/KHIucmVtb3ZlQWxsUmFuZ2VzKCksci5hZGRSYW5nZShuKSxgc2VsZWN0ZWRgKTpgZmFpbGVkYH1mdW5jdGlvbiByQyhlLHQpe3JldHVybmAke2V9LyR7dH1gfWZ1bmN0aW9uIGlDKGUpe3JldHVybmAkJHsoZS8xZTYpLnRvRml4ZWQoNCl9YH1mdW5jdGlvbiBhQyhlKXtyZXR1cm4gZS50b0xvY2FsZVN0cmluZyhgZW4tVVNgKX1mdW5jdGlvbiBvQyhlKXtsZXQgdD1NYXRoLmFicyhlKTtpZih0PDFlNClyZXR1cm4gYUMoZSk7bGV0IG49ZTwwP2AtYDpgYCxbcixpXT10PDFlNj9bMWUzLGBrYF06dDwxZTk/WzFlNixgTWBdOlsxZTksYEJgXSxhPXQvcixvPTMtKE1hdGguZmxvb3IoYSk+PTEwMD8zOk1hdGguZmxvb3IoYSk+PTEwPzI6MSkscz0xMCoqbyxjPShNYXRoLmZsb29yKHQqcy9yKS9zKS50b0ZpeGVkKG8pO3JldHVybiBvPjAmJihjPWMucmVwbGFjZSgvMCskLyxgYCkucmVwbGFjZSgvXC4kLyxgYCkpLGAke259JHtjfSR7aX1gfWZ1bmN0aW9uIHNDKGUpe3JldHVybiBlPjAmJiEoZSZlLTEpfWZ1bmN0aW9uIGNDKGUpe3JldHVybiBlPDEwMjQ/YCR7ZX1gOnNDKGUpP2U8MTA0ODU3Nj9gJHtNYXRoLnJvdW5kKGUvMTAyNCl9a2A6YCR7TWF0aC5yb3VuZChlLzEwNDg1NzYpfU1gOmU8MWU2P2Ake01hdGgucm91bmQoZS8xZTMpfWtgOmAke01hdGgucm91bmQoZS8xZTYpfU1gfWZ1bmN0aW9uIGxDKGUpe3JldHVybmAkJHtlLnRvRml4ZWQoMil9YH1mdW5jdGlvbiB1QyhlLHQpe3JldHVybiBlPT09MCYmdD09PTA/YGZyZWVgOmBpbiAke2xDKGUpfSAvIG91dCAke2xDKHQpfSBwZXIgTVRva2B9ZnVuY3Rpb24gZEMoZSl7cmV0dXJuIGU8MWUzP2Ake01hdGgucm91bmQoZSl9bXNgOmAkeyhlLzFlMykudG9GaXhlZCgxKX1zYH1mdW5jdGlvbiBmQyhlLHQpe2lmKCFlfHxlPT09YDAwMDEtMDEtMDFUMDA6MDA6MDBaYClyZXR1cm4gbnVsbDtsZXQgbj1uZXcgRGF0ZShlKS5nZXRUaW1lKCk7cmV0dXJuIE51bWJlci5pc05hTihuKT9udWxsOk1hdGgubWF4KDAsTWF0aC5yb3VuZCgodC1uKS8xZTMpKX1mdW5jdGlvbiBwQyhlKXtsZXQgdD1mQyhlLERhdGUubm93KCkpO3JldHVybiB0PT09bnVsbD9gYDpgICgke3R9cyBhZ28pYH1mdW5jdGlvbiBtQyhlLHQ9RGF0ZS5ub3coKSl7bGV0IG49ZkMoZSx0KTtyZXR1cm4gbj09PW51bGw/YGA6YCR7bn1zIGFnb2B9ZnVuY3Rpb24gaEMoZSl7aWYoIWV8fGU9PT1gMDAwMS0wMS0wMVQwMDowMDowMFpgKXJldHVybmBgO2xldCB0PW5ldyBEYXRlKGUpLmdldFRpbWUoKTtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuYGA7bGV0IG49TWF0aC5yb3VuZCgodC1EYXRlLm5vdygpKS8xZTMpO3JldHVybiBuPD0wP2BgOmBpbiAke259c2B9ZnVuY3Rpb24gZ0MoZSl7aWYoIWV8fGU9PT1gMDAwMS0wMS0wMVQwMDowMDowMFpgKXJldHVybmBuZXZlcmA7bGV0IHQ9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTih0LmdldFRpbWUoKSk/ZTp0LnRvTG9jYWxlU3RyaW5nKCl9ZnVuY3Rpb24gX0MoZSx0KXtyZXR1cm4gZT9wQyh0KT9gcmVmcmVzaGVkYDpgcGVuZGluZ2A6YG9mZmB9ZnVuY3Rpb24gdkMoZSx0KXtzd2l0Y2goX0MoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuYHJlZnJlc2hlZCR7cEModCl9YH19ZnVuY3Rpb24geUMoZSx0KXtzd2l0Y2goX0MoZSx0KSl7Y2FzZWBvZmZgOnJldHVybmBkaXNjb3Zlcnkgb2ZmYDtjYXNlYHBlbmRpbmdgOnJldHVybmBwZW5kaW5nYDtjYXNlYHJlZnJlc2hlZGA6cmV0dXJuIGdDKHQpfX1mdW5jdGlvbiBiQyhlKXtpZighZSlyZXR1cm5gbm9uZWA7bGV0IHQ9W107cmV0dXJuIGUucmVxdWVzdHNQZXJNaW51dGUmJnQucHVzaChgcmVxL21pbiAke2UucmVxdWVzdHNQZXJNaW51dGV9YCksZS5yZXF1ZXN0c1BlckRheSYmdC5wdXNoKGByZXEvZGF5ICR7ZS5yZXF1ZXN0c1BlckRheX1gKSxlLnRva2Vuc1BlckRheSYmdC5wdXNoKGB0b2svZGF5ICR7ZS50b2tlbnNQZXJEYXl9YCksZS50b2tlbnNQZXJNb250aCYmdC5wdXNoKGB0b2svbW9udGggJHtlLnRva2Vuc1Blck1vbnRofWApLGUuY29zdFBlckRheVVTRCYmdC5wdXNoKGBjb3N0L2RheSAkJHtlLmNvc3RQZXJEYXlVU0R9YCksZS5jb3N0UGVyTW9udGhVU0QmJnQucHVzaChgY29zdC9tb250aCAkJHtlLmNvc3RQZXJNb250aFVTRH1gKSx0Lmxlbmd0aD90LmpvaW4oYCwgYCk6YG5vbmVgfWZ1bmN0aW9uIHhDKGUsdCl7c3dpdGNoKHQpe2Nhc2VgaG91cmA6cmV0dXJuYCR7ZS5zbGljZSg4LDEwKX06MDBgO2Nhc2VgZGF5YDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKSxyPU51bWJlcihlLnNsaWNlKDYsOCkpO3JldHVybiBuZXcgRGF0ZSh0LG4tMSxyKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDpgc2hvcnRgLGRheTpgbnVtZXJpY2B9KX1jYXNlYG1vbnRoYDp7bGV0IHQ9TnVtYmVyKGUuc2xpY2UoMCw0KSksbj1OdW1iZXIoZS5zbGljZSg0LDYpKTtyZXR1cm4gbmV3IERhdGUodCxuLTEsMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6YHNob3J0YCx5ZWFyOmBudW1lcmljYH0pfX19dmFyIFNDPUYoe19fbmFtZTpgTW9kZWxDaGlwYCxwcm9wczp7aWQ6e30sY29udGV4dFRva2Vuczp7fSxpbnB1dFBlck1Ub2tVc2Q6e30sb3V0cHV0UGVyTVRva1VzZDp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPXNpKGBsYWJlbGApLHI9TShgaWRsZWApLGk7ZnVuY3Rpb24gYSgpe2NsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKCk9PntyLnZhbHVlPWBpZGxlYH0sMTUwMCl9YXN5bmMgZnVuY3Rpb24gbygpe2xldCBlPWF3YWl0IG5DKHQuaWQsbi52YWx1ZT8/dm9pZCAwKTtyLnZhbHVlPWUsYSgpfWxldCBzPXtpZGxlOmdfLGNvcGllZDp1XyxzZWxlY3RlZDp1XyxmYWlsZWQ6aF99LGM9VygoKT0+KHtpZGxlOmBDb3B5ICR7dC5pZH1gLGNvcGllZDpgQ29waWVkYCxzZWxlY3RlZDpgU2VsZWN0ZWQg4oCUIHByZXNzIEN0cmwvQ21kK0NgLGZhaWxlZDpgQ29weSBmYWlsZWRgfSkpLGw9VygoKT0+e2xldCBlPVtdO3JldHVybiB0LmlucHV0UGVyTVRva1VzZCE9PXZvaWQgMCYmdC5vdXRwdXRQZXJNVG9rVXNkIT09dm9pZCAwJiZlLnB1c2godUModC5pbnB1dFBlck1Ub2tVc2QsdC5vdXRwdXRQZXJNVG9rVXNkKSksdC5jb250ZXh0VG9rZW5zIT09dm9pZCAwJiZlLnB1c2goYCR7Y0ModC5jb250ZXh0VG9rZW5zKX0gY29udGV4dGApLGUuam9pbihgIMK3IGApfSksdT1XKCgpPT57bGV0IGU9Yy52YWx1ZVtyLnZhbHVlXTtyZXR1cm4gbC52YWx1ZT9gJHtlfSDCtyAke2wudmFsdWV9YDplfSk7cmV0dXJuIHRhKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSksKHQsbik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oZUMpLHthczpgYnV0dG9uYCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6TyhbYGN1cnNvci1wb2ludGVyIGdhcC0xIGZvbnQtbW9ubyB0ZXh0LXhzIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kYCxyLnZhbHVlPT09YGZhaWxlZGA/YHRleHQtZGVzdHJ1Y3RpdmVgOmBgXSksdGl0bGU6dS52YWx1ZSwiYXJpYS1sYWJlbCI6dS52YWx1ZSxvbkNsaWNrOm99LHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCx7cmVmOmBsYWJlbGAsY2xhc3M6YHNlbGVjdC10ZXh0YH0sayhlLmlkKSw1MTMpLEgoaSx7aWNvbjpzW3IudmFsdWVdLGNsYXNzOmBzaXplLTIuNSBzaHJpbmstMGAsImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LG51bGwsOCxbYGljb25gXSldKSxfOjF9LDgsW2BjbGFzc2AsYHRpdGxlYCxgYXJpYS1sYWJlbGBdKX19fSk7ZnVuY3Rpb24gQ0MoZSx0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKGUpfHxlPD0wP251bGw6KGUtKE51bWJlci5pc0Zpbml0ZSh0KT90OjApKS9lfWZ1bmN0aW9uIHdDKGUpe3JldHVybiBlPT09bnVsbD9gbm8tdHJhZmZpY2A6ZTwuOT9gc2V2ZXJlYDplPC45OT9gZGVncmFkZWRgOmBoZWFsdGh5YH1mdW5jdGlvbiBUQyhlLHQpe2xldCBuPUNDKGUsdCk7cmV0dXJuIG4hPT1udWxsJiZuPC45OX1mdW5jdGlvbiBFQyhlKXtyZXR1cm4gZT49MT9gMTAwJWA6YCR7TWF0aC5mbG9vcihlKjEwMCl9JWB9ZnVuY3Rpb24gREMoZSx0LG4pe3JldHVybiBlPT09MT90Om59ZnVuY3Rpb24gT0MoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIGluIHRoZSBsYXN0IG1pbnV0ZWA7bGV0IG49Q0MoZSx0KSxyPW49PT1udWxsP2BgOmAgKCR7RUMobil9KWA7cmV0dXJuYCR7ZX0gJHtEQyhlLGBhdHRlbXB0YCxgYXR0ZW1wdHNgKX0sICR7dH0gJHtEQyh0LGBmYWlsdXJlYCxgZmFpbHVyZXNgKX0gaW4gdGhlIGxhc3QgbWludXRlJHtyfWB9ZnVuY3Rpb24ga0MoZSx0KXtpZihlPD0wKXJldHVybmBubyB0cmFmZmljIHRvZGF5YDtsZXQgbj1DQyhlLHQpLHI9bj09PW51bGw/YGA6YCAoJHtFQyhuKX0pYDtyZXR1cm5gJHtlfSAke0RDKGUsYGF0dGVtcHRgLGBhdHRlbXB0c2ApfSwgJHt0fSAke0RDKHQsYGZhaWx1cmVgLGBmYWlsdXJlc2ApfSB0b2RheSR7cn1gfXZhciBBQz17ImFyaWEtaGlkZGVuIjpgdHJ1ZWB9LGpDPXtjbGFzczpgc3Itb25seWB9LE1DPUYoe19fbmFtZTpgUHJvdmlkZXJSYXRlQmFkZ2VgLHByb3BzOnthdHRlbXB0c0RheTp7fSxmYWlsdXJlc0RheTp7fSxhdHRlbXB0c01pbnV0ZTp7fSxmYWlsdXJlc01pbnV0ZTp7fX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPVcoKCk9PkNDKHQuYXR0ZW1wdHNEYXksdC5mYWlsdXJlc0RheSkpLHI9VygoKT0+d0Mobi52YWx1ZSkpLGk9VygoKT0+ci52YWx1ZT09PWBuby10cmFmZmljYD9gbm8gdHJhZmZpY2A6RUMobi52YWx1ZSkpLGE9VygoKT0+dC5hdHRlbXB0c01pbnV0ZT09PXZvaWQgMHx8dC5mYWlsdXJlc01pbnV0ZT09PXZvaWQgMD9rQyh0LmF0dGVtcHRzRGF5LHQuZmFpbHVyZXNEYXkpOk9DKHQuYXR0ZW1wdHNNaW51dGUsdC5mYWlsdXJlc01pbnV0ZSkpLG89VygoKT0+ci52YWx1ZT09PWBzZXZlcmVgP2BkZXN0cnVjdGl2ZWA6ci52YWx1ZT09PWBoZWFsdGh5YD9gc2Vjb25kYXJ5YDpgb3V0bGluZWApLHM9VygoKT0+ci52YWx1ZT09PWBkZWdyYWRlZGA/YGJvcmRlci1zdGF0dXMtd2Fybi80MCB0ZXh0LXN0YXR1cy13YXJuYDpyLnZhbHVlPT09YG5vLXRyYWZmaWNgP2B0ZXh0LW11dGVkLWZvcmVncm91bmRgOmBgKTtyZXR1cm4oZSx0KT0+KFIoKSxCKE4oZUMpLHthczpgc3BhbmAsdmFyaWFudDpvLnZhbHVlLGNsYXNzOk8oW3MudmFsdWUsYGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2BdKSx0aXRsZTphLnZhbHVlfSx7ZGVmYXVsdDpQKCgpPT5bVihgc3BhbmAsQUMsayhpLnZhbHVlKSwxKSxWKGBzcGFuYCxqQyxrKGEudmFsdWUpLDEpXSksXzoxfSw4LFtgdmFyaWFudGAsYGNsYXNzYCxgdGl0bGVgXSkpfX0pLE5DPUYoe19fbmFtZTpgU2VhcmNoSW5wdXRgLHByb3BzOnttb2RlbFZhbHVlOnt9LHBsYWNlaG9sZGVyOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1XKCgpPT5uLm1vZGVsVmFsdWUubGVuZ3RoPjApO2Z1bmN0aW9uIGEoZSl7cihgdXBkYXRlOm1vZGVsVmFsdWVgLFN0cmluZyhlKSl9ZnVuY3Rpb24gbygpe3IoYHVwZGF0ZTptb2RlbFZhbHVlYCxgYCl9cmV0dXJuKHQscik9PntsZXQgcz1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSx6KGBkaXZgLHtjbGFzczpPKE4oWXYpKGByZWxhdGl2ZWAsbi5jbGFzcykpfSxbSChzLHtpY29uOk4ocl8pLGNsYXNzOmBwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0xLzIgbGVmdC0yLjUgc2l6ZS0zLjUgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LW11dGVkLWZvcmVncm91bmRgLCJhcmlhLWhpZGRlbiI6YHRydWVgfSxudWxsLDgsW2BpY29uYF0pLEgoTihRYikseyJtb2RlbC12YWx1ZSI6ZS5tb2RlbFZhbHVlLHR5cGU6YHRleHRgLHBsYWNlaG9sZGVyOmUucGxhY2Vob2xkZXIsImFyaWEtbGFiZWwiOmUucGxhY2Vob2xkZXIsY2xhc3M6YHByLTggcGwtOGAsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOmF9LG51bGwsOCxbYG1vZGVsLXZhbHVlYCxgcGxhY2Vob2xkZXJgLGBhcmlhLWxhYmVsYF0pLGkudmFsdWU/KFIoKSxCKE4oV2IpLHtrZXk6MCx0eXBlOmBidXR0b25gLHZhcmlhbnQ6YGdob3N0YCxzaXplOmBpY29uLXhzYCwiYXJpYS1sYWJlbCI6YENsZWFyIHNlYXJjaGAsY2xhc3M6YGFic29sdXRlIHRvcC0xLzIgcmlnaHQtMSAtdHJhbnNsYXRlLXktMS8yIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRgLG9uQ2xpY2s6b30se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKGZfKSxjbGFzczpgc2l6ZS0zLjVgfSxudWxsLDgsW2BpY29uYF0pXSksXzoxfSkpOlRzKGBgLCEwKV0sMil9fX0pLFBDPUYoe19fbmFtZTpgQWNjb3JkaW9uYCxwcm9wczp7Y29sbGFwc2libGU6e3R5cGU6Qm9vbGVhbn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbn0sZGlyOnt9LG9yaWVudGF0aW9uOnt9LHVubW91bnRPbkhpZGU6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSx0eXBlOnt9LG1vZGVsVmFsdWU6e30sZGVmYXVsdFZhbHVlOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihoYiksa3MoeyJkYXRhLXNsb3QiOmBhY2NvcmRpb25gfSxOKGkpLHtjbGFzczpOKFl2KShgZmxleCB3LWZ1bGwgZmxleC1jb2xgLG4uY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksRkM9Rih7X19uYW1lOmBBY2NvcmRpb25Db250ZW50YCxwcm9wczp7Zm9yY2VNb3VudDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oYmIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWNvbnRlbnRgfSxOKG4pLHtjbGFzczpgZGF0YS1vcGVuOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24gZGF0YS1jbG9zZWQ6YW5pbWF0ZS1hY2NvcmRpb24tdXAgdGV4dC1zbSBvdmVyZmxvdy1oaWRkZW5gfSkse2RlZmF1bHQ6UCgoKT0+W1YoYGRpdmAse2NsYXNzOk8oTihZdikoYHB0LTAgcGItMi41IFsmX2FdOnVuZGVybGluZSBbJl9hXTp1bmRlcmxpbmUtb2Zmc2V0LTMgWyZfYV06aG92ZXI6dGV4dC1mb3JlZ3JvdW5kIFsmX3A6bm90KDpsYXN0LWNoaWxkKV06bWItNGAsdC5jbGFzcykpfSxbSShlLiRzbG90cyxgZGVmYXVsdGApXSwyKV0pLF86M30sMTYpKX19KSxJQz1GKHtfX25hbWU6YEFjY29yZGlvbkl0ZW1gLHByb3BzOntkaXNhYmxlZDp7dHlwZTpCb29sZWFufSx2YWx1ZTp7fSx1bm1vdW50T25IaWRlOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX19LHNldHVwKGUpe2xldCB0PWUsbj1LeShDeSh0LGBjbGFzc2ApKTtyZXR1cm4oZSxyKT0+KFIoKSxCKE4oeWIpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLWl0ZW1gfSxOKG4pLHtjbGFzczpOKFl2KShgbm90LWxhc3Q6Ym9yZGVyLWJgLHQuY2xhc3MpfSkse2RlZmF1bHQ6UCh0PT5bSShlLiRzbG90cyxgZGVmYXVsdGAseGUoU3ModCkpKV0pLF86M30sMTYsW2BjbGFzc2BdKSl9fSksTEM9Rih7X19uYW1lOmBBY2NvcmRpb25UcmlnZ2VyYCxwcm9wczp7YXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PntsZXQgaT1jYShgRm9udEF3ZXNvbWVJY29uYCk7cmV0dXJuIFIoKSxCKE4oeGIpLHtjbGFzczpgZmxleGB9LHtkZWZhdWx0OlAoKCk9PltIKE4oU2IpLGtzKHsiZGF0YS1zbG90IjpgYWNjb3JkaW9uLXRyaWdnZXJgfSxOKG4pLHtjbGFzczpOKFl2KShgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOmFmdGVyOmJvcmRlci1yaW5nICoqOmRhdGEtW3Nsb3Q9YWNjb3JkaW9uLXRyaWdnZXItaWNvbl06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbGcgcHktMi41IHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnVuZGVybGluZSBmb2N1cy12aXNpYmxlOnJpbmctMyAqKjpkYXRhLVtzbG90PWFjY29yZGlvbi10cmlnZ2VyLWljb25dOm1sLWF1dG8gKio6ZGF0YS1bc2xvdD1hY2NvcmRpb24tdHJpZ2dlci1pY29uXTpzaXplLTQgZ3JvdXAvYWNjb3JkaW9uLXRyaWdnZXIgcmVsYXRpdmUgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1hbGwgb3V0bGluZS1ub25lIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MGAsdC5jbGFzcyl9KSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApLEkoZS4kc2xvdHMsYGljb25gLHt9LCgpPT5bSChpLHtpY29uOk4obV8pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBzaHJpbmstMCBncm91cC1hcmlhLWV4cGFuZGVkL2FjY29yZGlvbi10cmlnZ2VyOmhpZGRlbmB9LG51bGwsOCxbYGljb25gXSksSChpLHtpY29uOk4oc18pLCJkYXRhLXNsb3QiOmBhY2NvcmRpb24tdHJpZ2dlci1pY29uYCwiYXJpYS1oaWRkZW4iOmB0cnVlYCxjbGFzczpgcG9pbnRlci1ldmVudHMtbm9uZSBoaWRkZW4gc2hyaW5rLTAgZ3JvdXAtYXJpYS1leHBhbmRlZC9hY2NvcmRpb24tdHJpZ2dlcjppbmxpbmVgfSxudWxsLDgsW2BpY29uYF0pXSldKSxfOjN9LDE2LFtgY2xhc3NgXSldKSxfOjN9KX19fSk7ZnVuY3Rpb24gUkMoKXtsZXQgZT1NKGBgKSx0PVcoKCk9PmUudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpO3JldHVybntxdWVyeTplLG5vcm1hbGl6ZWQ6dCxoYXNRdWVyeTpXKCgpPT50LnZhbHVlLmxlbmd0aD4wKX19ZnVuY3Rpb24gekMoZSx0LG4pe2lmKCF0KXJldHVybiBuZXcgU2V0KGUubWFudWFsbHlFeHBhbmRlZCk7bGV0IHI9bmV3IFNldChlLm1hbnVhbGx5RXhwYW5kZWQpO2ZvcihsZXQgdCBvZiBuKWUubWFudWFsbHlDb2xsYXBzZWQuaGFzKHQpfHxyLmFkZCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBCQyhlLHQsbil7bj8oZS5tYW51YWxseUV4cGFuZGVkLmRlbGV0ZSh0KSxlLm1hbnVhbGx5Q29sbGFwc2VkLmFkZCh0KSk6KGUubWFudWFsbHlDb2xsYXBzZWQuZGVsZXRlKHQpLGUubWFudWFsbHlFeHBhbmRlZC5hZGQodCkpfWZ1bmN0aW9uIFZDKGUpe2UubWFudWFsbHlDb2xsYXBzZWQuY2xlYXIoKX12YXIgSEM9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sVUM9e2NsYXNzOmBncmlkIGdhcC00IHNtOmdyaWQtY29scy0zYH0sV0M9e2NsYXNzOmBmb250LW1lZGl1bWB9LEdDPXtrZXk6MCxjbGFzczpgZmxleCBpdGVtcy1zdGFydCBnYXAtMS41IHRleHQtZGVzdHJ1Y3RpdmVgfSxLQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0scUM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxKQz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sWUM9e2tleTowLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxYQz17a2V5OjAsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxaQz17a2V5OjEsY2xhc3M6YHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxRQz17Y2xhc3M6YGZsZXggZmxleC0xIGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLXgtMyBnYXAteS0xIHByLTIgdGV4dC1sZWZ0YH0sJEM9e2NsYXNzOmBmb250LW1lZGl1bWB9LGV3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sdHc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LG53PXtjbGFzczpgbWItMyBncmlkIGdyaWQtY29scy0yIGdhcC14LTYgZ2FwLXktMS41IHRleHQtc20gc206Z3JpZC1jb2xzLTNgfSxydz17Y2xhc3M6YGJyZWFrLWFsbGB9LGl3PXtrZXk6MH0sYXc9e2tleToxfSxvdz17Y2xhc3M6YHRleHQtZGVzdHJ1Y3RpdmVgfSxzdz17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxjdz17a2V5OjAsdGl0bGU6YGNvbnRleHQgd2luZG93YCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sbHc9e2tleToxLGNsYXNzOmB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LHV3PXtrZXk6MCxjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxkdz1gUGVyLXJlcGxpY2EsIGluLXByb2Nlc3Mgb25seSDigJQgbm90IGEgZmxlZXQtd2lkZSBhdmVyYWdlIGFjcm9zcyB0aGlzIGRlcGxveW1lbnTigJlzIHJlcGxpY2FzLmAsZnc9Rih7X19uYW1lOmBQcm92aWRlcnNWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC5vdmVydmlldykscj1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSx7cXVlcnk6aSxub3JtYWxpemVkOmEsaGFzUXVlcnk6b309UkMoKTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIHJDKGUsdCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhhLnZhbHVlKX1mdW5jdGlvbiBjKGUpe3JldHVybiBlLm1vZGVscy5zb21lKHQ9PnMoZS5uYW1lLHQpKX1mdW5jdGlvbiBsKGUpe3JldHVybiBlLmFsaWFzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl8fGUudGFyZ2V0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYS52YWx1ZSl9bGV0IHU9VygoKT0+e2xldCBlPW4udmFsdWU/LnByb3ZpZGVycz8/W107cmV0dXJuIG8udmFsdWU/ZS5maWx0ZXIoYyk6ZX0pLGQ9VygoKT0+e2xldCBlPW4udmFsdWU/LmFsaWFzZXM/P1tdO3JldHVybiBvLnZhbHVlP2UuZmlsdGVyKGwpOmV9KSxmPVcoKCk9PnpDKHIsby52YWx1ZSx1LnZhbHVlLm1hcChlPT5lLm5hbWUpKSk7ZnVuY3Rpb24gcChlKXtCQyhyLGUsZi52YWx1ZS5oYXMoZSkpfWxldCBtPVcoe2dldDooKT0+QXJyYXkuZnJvbShmLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIGYudmFsdWUpdC5oYXMoZSl8fHAoZSk7Zm9yKGxldCBlIG9mIHQpZi52YWx1ZS5oYXMoZSl8fHAoZSl9fSk7RXIoaSxlPT57ZS50cmltKCk9PT1gYCYmVkMocil9KTtmdW5jdGlvbiBoKGUpe3JldHVybiBvLnZhbHVlP2UubW9kZWxzLmZpbHRlcih0PT5zKGUubmFtZSx0KSk6ZS5tb2RlbHN9bGV0IGc9e2F0dGVtcHRzRGF5OjAsZmFpbHVyZXNEYXk6MH07ZnVuY3Rpb24gXyhlLHQpe3JldHVybiBlLm1vZGVsUmF0ZXM/Llt0XT8/Z31mdW5jdGlvbiB2KGUsdCl7bGV0IG49XyhlLHQpO3JldHVybiBUQyhuLmF0dGVtcHRzRGF5LG4uZmFpbHVyZXNEYXkpfWxldCB5PXt9O2Z1bmN0aW9uIGIoZSx0KXtyZXR1cm4gZS5tb2RlbE1ldGE/Llt0XT8/eX1mdW5jdGlvbiB4KGUpe3N3aXRjaChlKXtjYXNlYG9wZW5gOnJldHVybmBkZXN0cnVjdGl2ZWA7Y2FzZWBoYWxmLW9wZW5gOnJldHVybmBzZWNvbmRhcnlgO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBTKGUpe2xldCB0PWhDKGUub3BlblVudGlsKTtyZXR1cm4gdD9gJHtlLmhlYWx0aFN0YXRlfSAoJHt0fSlgOmUuaGVhbHRoU3RhdGV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZT09PWBvcGVuYD9gdGV4dC1kZXN0cnVjdGl2ZWA6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gZS5sYXRlbmN5Py5zdHJlYW1pbmd9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuIGUubGF0ZW5jeT8uW2Bub24tc3RyZWFtaW5nYF19ZnVuY3Rpb24gdGUoZSl7cmV0dXJuIGUuY291bnQ9PT12b2lkIDA/YG5vIG9ic2VydmF0aW9ucyBjb3VudGVkYDpgJHtlLmNvdW50fSAke2UuY291bnQ9PT0xP2BvYnNlcnZhdGlvbmA6YG9ic2VydmF0aW9uc2B9IG9uIHRoaXMgcmVwbGljYWB9ZnVuY3Rpb24gVChlKXtyZXR1cm5gQXZlcmFnZSB0aW1lIHRvIGZpcnN0IGJ5dGUsIHRoZSBsb2FkLXNlbnNpdGl2ZSByZWFkaW5nIGZvciBzdHJlYW1pbmcgdHJhZmZpYy4gJHt0ZShlKX0uICR7ZHd9YH1mdW5jdGlvbiBuZShlKXtyZXR1cm5gQXZlcmFnZSB0b3RhbCByZXNwb25zZSB0aW1lLCBpbmNsdWRpbmcgZ2VuZXJhdGlvbiDigJQgbm90IGEgbG9hZC1zZW5zaXRpdmUgc2lnbmFsIGxpa2Ugc3RyZWFtaW5nIHR0ZmIsIHNpbmNlIHRoaXMgcHJvdmlkZXIgYnVmZmVycyB0aGUgd2hvbGUgY29tcGxldGlvbiBiZWZvcmUgc2VuZGluZyBhbnl0aGluZy4gJHt0ZShlKX0uICR7ZHd9YH1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5wcm92ZW5hbmNlPy5lc3RpbWF0ZWR9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIGUucHJvdmVuYW5jZT8udW5iaWxsZWR9ZnVuY3Rpb24gRShlKXtsZXQgdD1lLnJlcXVlc3RzPT09MT9gYDpgc2A7cmV0dXJuYCR7ZS5yZXF1ZXN0c30gbm9uLXN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgcHJvbXB0IHRva2VucyB3ZXJlIGVzdGltYXRlZCBmcm9tIHJlcXVlc3QgYm9keSBzaXplIGluc3RlYWQgKCR7ZS50b2tlbnN9IHRva2VucyBiaWxsZWQgZnJvbSB0aGUgZXN0aW1hdGUpLCBjb21wbGV0aW9uIGJpbGxlZCBhcyB6ZXJvLiAke2R3fWB9ZnVuY3Rpb24gYWUoZSl7bGV0IHQ9ZS5yZXF1ZXN0cz09PTE/YGA6YHNgO3JldHVybmAke2UucmVxdWVzdHN9IHN0cmVhbWluZyByZXNwb25zZSR7dH0gY2FycmllZCBubyB1c2FnZSBmcm9tIHRoZSBwcm92aWRlciDigJQgdGhlIHJlcXVlc3Qgd2FzIGNvdW50ZWQgYnV0IHplcm8gdG9rZW5zIHdlcmUgYmlsbGVkLiBJZiB0aGlzIGtlZXBzIGhhcHBlbmluZywgdGhpcyBwcm92aWRlciBtYXkgYmUgc2VydmluZyBjb21wbGV0aW9ucyBlbnRpcmVseSBmcmVlIGFnYWluc3QgZXZlcnkgYnVkZ2V0LiAke2R3fWB9bGV0IG9lPVt7aWQ6YGFsaWFzYCxoZWFkZXI6YEFsaWFzYCxhY2Nlc3NvckZuOmU9PmUuYWxpYXMsY2VsbDooe3JvdzplfSk9PkcoU0Mse2lkOmUub3JpZ2luYWwuYWxpYXMsY29udGV4dFRva2VuczplLm9yaWdpbmFsLm1vZGVsTWV0YT8uY29udGV4dFRva2VucyxpbnB1dFBlck1Ub2tVc2Q6ZS5vcmlnaW5hbC5tb2RlbE1ldGE/LmlucHV0UGVyTVRva1VzZCxvdXRwdXRQZXJNVG9rVXNkOmUub3JpZ2luYWwubW9kZWxNZXRhPy5vdXRwdXRQZXJNVG9rVXNkfSl9LHtpZDpgdGFyZ2V0YCxoZWFkZXI6YFRhcmdldGAsYWNjZXNzb3JGbjplPT5lLnRhcmdldCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxlLm9yaWdpbmFsLnRhcmdldCl9XSxzZT1XKCgpPT5uLnZhbHVlPy5hbGlhc2VzLmxlbmd0aD9vLnZhbHVlP2BubyBhbGlhc2VzIG1hdGNoICIke2kudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgKTtyZXR1cm4oZSx0KT0+e2xldCByPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsSEMsW1YoYGRpdmAsVUMsW0goTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmVkaXMuY29uZmlndXJlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFsyXXx8PVUoYCBSZWRpcyBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1zbWB9LHtkZWZhdWx0OlAoKCk9PltWKGBwYCxXQyxrKG4udmFsdWU/LnJlZGlzLmNvbmZpZ3VyZWQ/YENvbmZpZ3VyZWRgOmBOb3QgY29uZmlndXJlZGApLDEpLG4udmFsdWU/LnJlZGlzLmxhc3RFcnI/KFIoKSx6KGBwYCxHQyxbSChyLHtpY29uOk4oaF8pLGNsYXNzOmBtdC0wLjUgc2l6ZS0zLjUgc2hyaW5rLTBgfSxudWxsLDgsW2BpY29uYF0pLFYoYHNwYW5gLG51bGwsayhuLnZhbHVlLnJlZGlzLmxhc3RFcnIpK2soTihwQykobi52YWx1ZS5yZWRpcy5sYXN0RXJyQXQpKSwxKV0pKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LmNhY2hlLmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8uY2FjaGUuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFszXXx8PVUoYCBSZXNwb25zZSBjYWNoZSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAsS0MsayhuLnZhbHVlPy5jYWNoZS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5jYWNoZS5lbmFibGVkPyhSKCkseihgcGAscUMsYHR0bCBgK2sobi52YWx1ZS5jYWNoZS50dGwpLDEpKTpUcyhgYCwhMCldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLHtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSx7ZGVmYXVsdDpQKCgpPT5bSChyLHtpY29uOm4udmFsdWU/LnJldHJ5LmVuYWJsZWQ/TihwXyk6TihjXyksY2xhc3M6Tyhbbi52YWx1ZT8ucmV0cnkuZW5hYmxlZD9gdGV4dC1jaGFydC1yZXF1ZXN0c2A6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsYHNpemUtMy41YF0pfSxudWxsLDgsW2BpY29uYCxgY2xhc3NgXSksdFs0XXx8PVUoYCBSZXRyeSBgLC0xKV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YHRleHQtc21gfSx7ZGVmYXVsdDpQKCgpPT5bVihgcGAsSkMsayhuLnZhbHVlPy5yZXRyeS5lbmFibGVkP2BFbmFibGVkYDpgRGlzYWJsZWRgKSwxKSxuLnZhbHVlPy5yZXRyeS5lbmFibGVkPyhSKCkseihgcGAsWUMsYCBhdHRlbXB0cyBgK2sobi52YWx1ZS5yZXRyeS5hdHRlbXB0cykrYCwgYmFja29mZiBgK2sobi52YWx1ZS5yZXRyeS5iYWNrb2ZmKSwxKSk6VHMoYGAsITApXSksXzoxfSldKSxfOjF9KV0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbNV18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzZdfHw9W1UoYCBFdmVyeSBjb25maWd1cmVkIHVwc3RyZWFtIGFuZCBpdHMgbGFzdCBkaXNjb3ZlcnkgcmVmcmVzaC4gU2VhcmNoIGZpbHRlcnMgcHJvdmlkZXJzIGFuZCBhbGlhc2VzIGJ5IG1vZGVsIGlkLiBgLC0xKV1dKSxfOjF9KSxIKE5DLHttb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBTZWFyY2ggbW9kZWxzIG9yIGFsaWFzZXMuLi5gLGNsYXNzOmBtdC0yIG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bbi52YWx1ZT8ucHJvdmlkZXJzLmxlbmd0aD9OKG8pJiZ1LnZhbHVlLmxlbmd0aD09PTA/KFIoKSx6KGBwYCxaQyxgIG5vIHByb3ZpZGVycyBtYXRjaCAiYCtrKE4oaSkpK2AiIGAsMSkpOihSKCksQihOKFBDKSx7a2V5OjIsbW9kZWxWYWx1ZTptLnZhbHVlLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzFdfHw9ZT0+bS52YWx1ZT1lLHR5cGU6YG11bHRpcGxlYCxjbGFzczpgcm91bmRlZC1tZCBib3JkZXIgcHgtM2B9LHtkZWZhdWx0OlAoKCk9PlsoUighMCkseihMLG51bGwsbWEodS52YWx1ZSxlPT4oUigpLEIoTihJQykse2tleTplLm5hbWUsdmFsdWU6ZS5uYW1lfSx7ZGVmYXVsdDpQKCgpPT5bSChOKExDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCxRQyxbVihgc3BhbmAsJEMsayhlLm5hbWUpLDEpLEgoTihlQykse2FzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZS50eXBlKSwxKV0pLF86Mn0sMTAyNCksVihgc3BhbmAsZXcsayhlLm1vZGVsQ291bnQpK2AgbW9kZWxzYCwxKSxIKE1DLHsiYXR0ZW1wdHMtZGF5IjplLmF0dGVtcHRzRGF5LCJmYWlsdXJlcy1kYXkiOmUuZmFpbHVyZXNEYXksImF0dGVtcHRzLW1pbnV0ZSI6ZS5hdHRlbXB0c01pbnV0ZSwiZmFpbHVyZXMtbWludXRlIjplLmZhaWx1cmVzTWludXRlfSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgLGBhdHRlbXB0cy1taW51dGVgLGBmYWlsdXJlcy1taW51dGVgXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLEIoTihlQykse2tleTowLGFzOmBzcGFuYCx2YXJpYW50OngoZS5oZWFsdGhTdGF0ZSksY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTplLmhlYWx0aFN0YXRlPT09YG9wZW5gP2BkaXNjb3ZlcnkgaXMgYmFja2luZyBvZmYgYWZ0ZXIgcmVwZWF0ZWQgZmFpbHVyZXNgOmBhIGRpc2NvdmVyeSBwcm9iZSBpcyBkZWNpZGluZyB3aGV0aGVyIHRvIHJlY292ZXJgfSx7ZGVmYXVsdDpQKCgpPT5bVShrKFMoZSkpLDEpXSksXzoyfSwxMDMyLFtgdmFyaWFudGAsYHRpdGxlYF0pKSx3KGUpPy5hdmdUdGZiTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOlQodyhlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgc3RyZWFtaW5nIHR0ZmIgYCtrKE4oZEMpKHcoZSkuYXZnVHRmYk1zKSksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSksZWUoZSk/LmF2Z0R1cmF0aW9uTXM9PT12b2lkIDA/VHMoYGAsITApOihSKCksQihOKGVDKSx7a2V5OjIsYXM6YHNwYW5gLHZhcmlhbnQ6YG91dGxpbmVgLGNsYXNzOmBmb250LW5vcm1hbCB0YWJ1bGFyLW51bXNgLHRpdGxlOm5lKGVlKGUpKX0se2RlZmF1bHQ6UCgoKT0+W1UoYCBub24tc3RyZWFtaW5nIGF2ZyBgK2soTihkQykoZWUoZSkuYXZnRHVyYXRpb25NcykpLDEpXSksXzoyfSwxMDMyLFtgdGl0bGVgXSkpLHJlKGUpPyhSKCksQihOKGVDKSx7a2V5OjMsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbm9ybWFsIHRhYnVsYXItbnVtc2AsdGl0bGU6RShyZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgZXN0aW1hdGVkIGArayhyZShlKS5yZXF1ZXN0cyksMSldKSxfOjJ9LDEwMzIsW2B0aXRsZWBdKSk6VHMoYGAsITApLGllKGUpPyhSKCksQihOKGVDKSx7a2V5OjQsYXM6YHNwYW5gLHZhcmlhbnQ6YGRlc3RydWN0aXZlYCxjbGFzczpgZm9udC1ub3JtYWwgdGFidWxhci1udW1zYCx0aXRsZTphZShpZShlKSl9LHtkZWZhdWx0OlAoKCk9PltVKGAgdW5iaWxsZWQgYCtrKGllKGUpLnJlcXVlc3RzKSwxKV0pLF86Mn0sMTAzMixbYHRpdGxlYF0pKTpUcyhgYCwhMCksZS5sYXN0RXJyPyhSKCksQihyLHtrZXk6NSxpY29uOk4oaF8pLGNsYXNzOmBzaXplLTMuNSBzaHJpbmstMCB0ZXh0LWRlc3RydWN0aXZlYCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKSk6VHMoYGAsITApLFYoYHNwYW5gLHR3LGsoTih2QykoZS5kaXNjb3ZlcnlFbmFibGVkLGUubGFzdFJlZnJlc2gpKSwxKV0pXSksXzoyfSwxMDI0KSxIKE4oRkMpLG51bGwse2RlZmF1bHQ6UCgoKT0+W1YoYGRsYCxudyxbVihgZGl2YCxudWxsLFt0WzddfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQmFzZSBVUkxgLC0xKSxWKGBkZGAscncsayhlLmJhc2VVcmwpLDEpXSksVihgZGl2YCxudWxsLFt0WzhdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCByZWZyZXNoYCwtMSksVihgZGRgLG51bGwsayhOKHlDKShlLmRpc2NvdmVyeUVuYWJsZWQsZS5sYXN0UmVmcmVzaCkpLDEpXSksZS5oZWFsdGhTdGF0ZT09PWBjbG9zZWRgP1RzKGBgLCEwKTooUigpLHooYGRpdmAsaXcsW3RbOV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBEaXNjb3ZlcnkgaGVhbHRoYCwtMSksVihgZGRgLHtjbGFzczpPKEMoZS5oZWFsdGhTdGF0ZSkpfSxrKFMoZSkpLDMpXSkpLGUubGFzdEVycj8oUigpLHooYGRpdmAsYXcsW3RbMTBdfHw9VihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgTGFzdCBlcnJvcmAsLTEpLFYoYGRkYCxvdyxrKGUubGFzdEVyciksMSldKSk6VHMoYGAsITApXSksaChlKS5sZW5ndGg/KFIoKSx6KGBkaXZgLHN3LFsoUighMCkseihMLG51bGwsbWEoaChlKSx0PT4oUigpLHooYHNwYW5gLHtrZXk6dCxjbGFzczpgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xYH0sW0goU0Mse2lkOk4ockMpKGUubmFtZSx0KSwiY29udGV4dC10b2tlbnMiOmIoZSx0KS5jb250ZXh0VG9rZW5zLCJpbnB1dC1wZXItbS10b2stdXNkIjpiKGUsdCkuaW5wdXRQZXJNVG9rVXNkLCJvdXRwdXQtcGVyLW0tdG9rLXVzZCI6YihlLHQpLm91dHB1dFBlck1Ub2tVc2R9LG51bGwsOCxbYGlkYCxgY29udGV4dC10b2tlbnNgLGBpbnB1dC1wZXItbS10b2stdXNkYCxgb3V0cHV0LXBlci1tLXRvay11c2RgXSksYihlLHQpLmNvbnRleHRUb2tlbnM9PT12b2lkIDA/VHMoYGAsITApOihSKCkseihgc3BhbmAsY3csayhOKGNDKShiKGUsdCkuY29udGV4dFRva2VucykpLDEpKSx2KGUsdCk/KFIoKSxCKE1DLHtrZXk6MSwiYXR0ZW1wdHMtZGF5IjpfKGUsdCkuYXR0ZW1wdHNEYXksImZhaWx1cmVzLWRheSI6XyhlLHQpLmZhaWx1cmVzRGF5fSxudWxsLDgsW2BhdHRlbXB0cy1kYXlgLGBmYWlsdXJlcy1kYXlgXSkpOlRzKGBgLCEwKV0pKSksMTI4KSldKSk6KFIoKSx6KGBwYCxsdyxgbm8gbW9kZWxzIGtub3duIHlldGApKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxYQyxgbm9uZWApKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMV18fD1bVShgTW9kZWwgYWxpYXNlc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxMl18fD1bVShgT3BlcmF0b3ItZGVmaW5lZCBhbGlhcyDihpIgdGFyZ2V0IG1vZGVsIG1hcHBpbmdzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOm9lLGRhdGE6ZC52YWx1ZSwiZW1wdHktbWVzc2FnZSI6c2UudmFsdWV9LG51bGwsOCxbYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KSxuLnZhbHVlPy52ZXJzaW9uPyhSKCkseihgcGAsdXcsYFZlcnNpb246IGArayhuLnZhbHVlLnZlcnNpb24pLDEpKTpUcyhgYCwhMCldKX19fSkscHc9W2B0aXRsZWBdLG13PXsiYXJpYS1oaWRkZW4iOmB0cnVlYH0saHc9e2NsYXNzOmBzci1vbmx5YH0sZ3c9Rih7X19uYW1lOmBDb21wYWN0TnVtYmVyYCxwcm9wczp7dmFsdWU6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5vQyh0LnZhbHVlKSkscj1XKCgpPT5hQyh0LnZhbHVlKSk7cmV0dXJuKGUsdCk9PihSKCkseihgc3BhbmAse3RpdGxlOnIudmFsdWV9LFtWKGBzcGFuYCxtdyxrKG4udmFsdWUpLDEpLFYoYHNwYW5gLGh3LGsoci52YWx1ZSksMSldLDgscHcpKX19KTtmdW5jdGlvbiBfdyhlLHQsbil7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT5HKGd3LHt2YWx1ZTpuKGUub3JpZ2luYWwpfSl9fXZhciB2dz1gbm90IG9ic2VydmVkIHlldCDigJQgbm8gdHJhZmZpYyBhbmQgcHJvYmVzIGRpc2FibGVkIG9yIG5vdCB5ZXQgcnVuYDtmdW5jdGlvbiB5dyhlKXtsZXQgdD1tQyhlLmxhc3RDaGVjayk7cmV0dXJuIHQ/YHVuaGVhbHRoeSAoJHt0fSlgOmB1bmhlYWx0aHlgfWZ1bmN0aW9uIGJ3KGUpe2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlICR7dH0ke259YDtyZXR1cm4gZS5sYXN0RXJyb3I/YCR7cn06ICR7ZS5sYXN0RXJyb3J9YDpyfWZ1bmN0aW9uIHh3KGUpe2xldCB0PW1DKGUubGFzdENoZWNrKTtyZXR1cm4gdD9lLnNvdXJjZT9gJHt0fSB2aWEgJHtlLnNvdXJjZX1gOnQ6ZS5zb3VyY2U/YHZpYSAke2Uuc291cmNlfWA6YGB9ZnVuY3Rpb24gU3coZSl7aWYoZS5jb25zZWN1dGl2ZUZhaWx1cmVzPD0wJiYhZS5sYXN0RXJyb3IpcmV0dXJuIHZ3O2xldCB0PWUuY29uc2VjdXRpdmVGYWlsdXJlcz09PTE/YGZhaWx1cmVgOmBmYWlsdXJlc2Asbj1lLnNvdXJjZT9gIHZpYSAke2Uuc291cmNlfWA6YGAscj1gJHtlLmNvbnNlY3V0aXZlRmFpbHVyZXN9ICR7dH0gc28gZmFyJHtufWA7cmV0dXJuIGUubGFzdEVycm9yP2Ake3J9OiAke2UubGFzdEVycm9yfWA6cn1mdW5jdGlvbiBDdyhlKXtpZihlLnN0YXRlPT09YHVuaGVhbHRoeWApcmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBkZXN0cnVjdGl2ZWAsY2xhc3M6YGZvbnQtbm9ybWFsYCx0aXRsZTpidyhlKX0sKCk9Pnl3KGUpKTtpZihlLnN0YXRlPT09YGhlYWx0aHlgKXtsZXQgdD1lLmxhdGVuY3lNcz09PXZvaWQgMD9gYDpgIMK3ICR7ZEMoZS5sYXRlbmN5TXMpfWA7cmV0dXJuIEcoYHNwYW5gLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTp4dyhlKX0sYGhlYWx0aHkke3R9YCl9cmV0dXJuIEcoZUMse2FzOmBzcGFuYCx2YXJpYW50OmBvdXRsaW5lYCxjbGFzczpgZm9udC1ub3JtYWxgLHRpdGxlOlN3KGUpfSwoKT0+YHVua25vd25gKX1mdW5jdGlvbiB3dygpe3JldHVyblt7aWQ6YG5hbWVgLGhlYWRlcjpgTmFtZWAsYWNjZXNzb3JGbjplPT5lLm5hbWUsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgZm9udC1tZWRpdW1gfSxlLm9yaWdpbmFsLm5hbWUpfSx7aWQ6YHVybGAsaGVhZGVyOmBVUkxgLGFjY2Vzc29yRm46ZT0+ZS51cmwsY2VsbDooe3JvdzplfSk9PkcoYHNwYW5gLHtjbGFzczpgYmxvY2sgbWF4LXcteHMgdHJ1bmNhdGUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTplLm9yaWdpbmFsLnVybH0sZS5vcmlnaW5hbC51cmwpfSx7aWQ6YGhlYWx0aGAsaGVhZGVyOmBIZWFsdGhgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT5lLmhlYWx0aC5zdGF0ZSxjZWxsOih7cm93OmV9KT0+Q3coZS5vcmlnaW5hbC5oZWFsdGgpfSx7aWQ6YGFjY2Vzc2AsaGVhZGVyOmBBY2Nlc3NgLGVuYWJsZVNvcnRpbmc6ITEsYWNjZXNzb3JGbjplPT4oZS5hY2Nlc3M/P1tdKS5qb2luKGAsIGApLGNlbGw6KHtyb3c6ZX0pPT57bGV0IHQ9ZS5vcmlnaW5hbC5hY2Nlc3M7cmV0dXJuIHQ/Lmxlbmd0aD9HKGBkaXZgLHtjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LHQubWFwKGU9PkcoZUMse2tleTplLGFzOmBzcGFuYCx2YXJpYW50OmBzZWNvbmRhcnlgLGNsYXNzOmBmb250LW1vbm8gZm9udC1ub3JtYWxgfSwoKT0+ZSkpKTpHKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBBbGwgZ3JvdXBzYCl9fSxfdyhgcmVxTWluYCxgcmVxL21pbmAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1pbnV0ZSksX3coYHJlcURheWAsYHJlcS9kYXlgLGU9PmUuY291bnRlcnMucmVxdWVzdHNQZXJEYXkpLF93KGByZXFNb250aGAsYHJlcS9tb250aGAsZT0+ZS5jb3VudGVycy5yZXF1ZXN0c1Blck1vbnRoKV19dmFyIFR3PXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtNmB9LEV3PUYoe19fbmFtZTpgVGFyZ2V0c1ZpZXdgLHNldHVwKGUpe2xldCB0PXN4KCksbj1XKCgpPT50LnRhcmdldHMpLHtxdWVyeTpyLG5vcm1hbGl6ZWQ6aSxoYXNRdWVyeTphfT1SQygpO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGkudmFsdWUpfWxldCBzPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5tY3BTZXJ2ZXJzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSksYz1XKCgpPT57bGV0IGU9bi52YWx1ZT8uYWdlbnRzPz9bXTtyZXR1cm4gYS52YWx1ZT9lLmZpbHRlcihvKTplfSk7ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlP2EudmFsdWUmJnQ9PT0wP2BubyB0YXJnZXRzIG1hdGNoICIke3IudmFsdWV9ImA6YG5vbmVgOmBub25lIGNvbmZpZ3VyZWRgfWxldCB1PVcoKCk9Pmwobi52YWx1ZT8ubWNwU2VydmVycy5sZW5ndGg/PzAscy52YWx1ZS5sZW5ndGgpKSxkPVcoKCk9Pmwobi52YWx1ZT8uYWdlbnRzLmxlbmd0aD8/MCxjLnZhbHVlLmxlbmd0aCkpLGY9d3coKTtyZXR1cm4oZSx0KT0+KFIoKSx6KGBkaXZgLFR3LFtIKE5DLHttb2RlbFZhbHVlOk4ociksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fD1lPT5qKHIpP3IudmFsdWU9ZTpudWxsLHBsYWNlaG9sZGVyOmBGaWx0ZXIgTUNQIHNlcnZlcnMgb3IgYWdlbnRzYCxjbGFzczpgbWF4LXctc21gfSxudWxsLDgsW2Btb2RlbFZhbHVlYF0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMV18fD1bVShgTUNQIHNlcnZlcnNgLC0xKV1dKSxfOjF9KSxIKE4oWWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbMl18fD1bVShgQ29uZmlndXJlZCBNQ1AgcHJveHkgdGFyZ2V0cywgdGhlIGdyb3VwcyBhbGxvd2VkIHRvIHJlYWNoIHRoZW0sIGFuZCB0aGVpciByZXF1ZXN0IGNvdW50ZXJzLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKCRTLHtjb2x1bW5zOk4oZiksZGF0YTpzLnZhbHVlLCJlbXB0eS1tZXNzYWdlIjp1LnZhbHVlfSxudWxsLDgsW2Bjb2x1bW5zYCxgZGF0YWAsYGVtcHR5LW1lc3NhZ2VgXSldKSxfOjF9KV0pLF86MX0pLEgoTihxYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFhiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWmIpLG51bGwse2RlZmF1bHQ6UCgoKT0+Wy4uLnRbM118fD1bVShgQWdlbnRzYCwtMSldXSksXzoxfSksSChOKFliKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzRdfHw9W1UoYENvbmZpZ3VyZWQgQTJBIGFnZW50IHByb3h5IHRhcmdldHMsIHRoZSBncm91cHMgYWxsb3dlZCB0byByZWFjaCB0aGVtLCBhbmQgdGhlaXIgcmVxdWVzdCBjb3VudGVycy5gLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSCgkUyx7Y29sdW1uczpOKGYpLGRhdGE6Yy52YWx1ZSwiZW1wdHktbWVzc2FnZSI6ZC52YWx1ZX0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KSxEdz1GKHtfX25hbWU6YFRhYnNgLHByb3BzOntkZWZhdWx0VmFsdWU6e30sb3JpZW50YXRpb246e30sZGlyOnt9LGFjdGl2YXRpb25Nb2RlOnt9LG1vZGVsVmFsdWU6e30sdW5tb3VudE9uSGlkZTp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxlbWl0czpbYHVwZGF0ZTptb2RlbFZhbHVlYF0sc2V0dXAoZSx7ZW1pdDp0fSl7bGV0IG49ZSxyPXQsaT1xeShDeShuLGBjbGFzc2ApLHIpO3JldHVybihlLHQpPT4oUigpLEIoTihSYiksa3MoeyJkYXRhLXNsb3QiOmB0YWJzYCwiZGF0YS1vcmllbnRhdGlvbiI6TihpKS5vcmllbnRhdGlvbnx8YGhvcml6b250YWxgfSxOKGkpLHtjbGFzczpOKFl2KShgZ2FwLTIgZ3JvdXAvdGFicyBmbGV4IGRhdGEtaG9yaXpvbnRhbDpmbGV4LWNvbGAsbi5jbGFzcyl9KSx7ZGVmYXVsdDpQKHQ9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCx4ZShTcyh0KSkpXSksXzozfSwxNixbYGRhdGEtb3JpZW50YXRpb25gLGBjbGFzc2BdKSl9fSksT3c9Rih7X19uYW1lOmBUYWJzQ29udGVudGAscHJvcHM6e3ZhbHVlOnt9LGZvcmNlTW91bnQ6e3R5cGU6Qm9vbGVhbn0sYXNDaGlsZDp7dHlwZTpCb29sZWFufSxhczp7fSxjbGFzczp7dHlwZTpbQm9vbGVhbixudWxsLFN0cmluZyxPYmplY3QsQXJyYXldfX0sc2V0dXAoZSl7bGV0IHQ9ZSxuPUN5KHQsYGNsYXNzYCk7cmV0dXJuKGUscik9PihSKCksQihOKFZiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtY29udGVudGAsY2xhc3M6TihZdikoYHRleHQtc20gZmxleC0xIG91dGxpbmUtbm9uZWAsdC5jbGFzcyl9LE4obikpLHtkZWZhdWx0OlAoKCk9PltJKGUuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgY2xhc3NgXSkpfX0pLGt3PUYoe19fbmFtZTpgVGFic0xpc3RgLHByb3BzOntsb29wOnt0eXBlOkJvb2xlYW59LGFzQ2hpbGQ6e3R5cGU6Qm9vbGVhbn0sYXM6e30sY2xhc3M6e3R5cGU6W0Jvb2xlYW4sbnVsbCxTdHJpbmcsT2JqZWN0LEFycmF5XX0sdmFyaWFudDp7ZGVmYXVsdDpgZGVmYXVsdGB9fSxzZXR1cChlKXtsZXQgdD1lLG49Q3kodCxgY2xhc3NgLGB2YXJpYW50YCk7cmV0dXJuKHIsaSk9PihSKCksQihOKEhiKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtbGlzdGAsImRhdGEtdmFyaWFudCI6ZS52YXJpYW50fSxOKG4pLHtjbGFzczpOKFl2KShOKGp3KSh7dmFyaWFudDplLnZhcmlhbnR9KSx0LmNsYXNzKX0pLHtkZWZhdWx0OlAoKCk9PltJKHIuJHNsb3RzLGBkZWZhdWx0YCldKSxfOjN9LDE2LFtgZGF0YS12YXJpYW50YCxgY2xhc3NgXSkpfX0pLEF3PUYoe19fbmFtZTpgVGFic1RyaWdnZXJgLHByb3BzOnt2YWx1ZTp7fSxkaXNhYmxlZDp7dHlwZTpCb29sZWFufSxhc0NoaWxkOnt0eXBlOkJvb2xlYW59LGFzOnt9LGNsYXNzOnt0eXBlOltCb29sZWFuLG51bGwsU3RyaW5nLE9iamVjdCxBcnJheV19fSxzZXR1cChlKXtsZXQgdD1lLG49S3koQ3kodCxgY2xhc3NgKSk7cmV0dXJuKGUscik9PihSKCksQihOKFViKSxrcyh7ImRhdGEtc2xvdCI6YHRhYnMtdHJpZ2dlcmAsY2xhc3M6TihZdikoYGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IHB4LTEuNSBweS0wLjUgdGV4dC1zbSBmb250LW1lZGl1bSBncm91cC1kYXRhLVt2YXJpYW50PWRlZmF1bHRdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpzaGFkb3ctc20gZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6c2hhZG93LW5vbmUgWyZfc3ZnOm5vdChbY2xhc3MqPXNpemUtXSldOnNpemUtNCBoYXMtZGF0YS1baWNvbj1pbmxpbmUtZW5kXTpwci0xIGhhcy1kYXRhLVtpY29uPWlubGluZS1zdGFydF06cGwtMSByZWxhdGl2ZSBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWZvcmVncm91bmQvNjAgdHJhbnNpdGlvbi1hbGwgZ3JvdXAtZGF0YS12ZXJ0aWNhbC90YWJzOnctZnVsbCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6anVzdGlmeS1zdGFydCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctMyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtMSBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgZGFyazp0ZXh0LW11dGVkLWZvcmVncm91bmQgZGFyazpob3Zlcjp0ZXh0LWZvcmVncm91bmQgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTBgLGBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpiZy10cmFuc3BhcmVudCBncm91cC1kYXRhLVt2YXJpYW50PWxpbmVdL3RhYnMtbGlzdDpkYXRhLWFjdGl2ZTpiZy10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJvcmRlci10cmFuc3BhcmVudCBkYXJrOmdyb3VwLWRhdGEtW3ZhcmlhbnQ9bGluZV0vdGFicy1saXN0OmRhdGEtYWN0aXZlOmJnLXRyYW5zcGFyZW50YCxgZGF0YS1hY3RpdmU6YmctYmFja2dyb3VuZCBkYXRhLWFjdGl2ZTp0ZXh0LWZvcmVncm91bmQgZGFyazpkYXRhLWFjdGl2ZTpib3JkZXItaW5wdXQgZGFyazpkYXRhLWFjdGl2ZTpiZy1pbnB1dC8zMCBkYXJrOmRhdGEtYWN0aXZlOnRleHQtZm9yZWdyb3VuZGAsYGFmdGVyOmFic29sdXRlIGFmdGVyOmJnLWZvcmVncm91bmQgYWZ0ZXI6b3BhY2l0eS0wIGFmdGVyOnRyYW5zaXRpb24tb3BhY2l0eSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjppbnNldC14LTAgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6YWZ0ZXI6Ym90dG9tLVstNXB4XSBncm91cC1kYXRhLWhvcml6b250YWwvdGFiczphZnRlcjpoLTAuNSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6aW5zZXQteS0wIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczphZnRlcjotcmlnaHQtMSBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6YWZ0ZXI6dy0wLjUgZ3JvdXAtZGF0YS1bdmFyaWFudD1saW5lXS90YWJzLWxpc3Q6ZGF0YS1hY3RpdmU6YWZ0ZXI6b3BhY2l0eS0xMDBgLHQuY2xhc3MpfSxOKG4pKSx7ZGVmYXVsdDpQKCgpPT5bSShlLiRzbG90cyxgZGVmYXVsdGApXSksXzozfSwxNixbYGNsYXNzYF0pKX19KSxqdz1DXyhgcm91bmRlZC1sZyBwLTAuNzUgZ3JvdXAtZGF0YS1ob3Jpem9udGFsL3RhYnM6aC04IGRhdGEtW3ZhcmlhbnQ9bGluZV06cm91bmRlZC1ub25lIGdyb3VwL3RhYnMtbGlzdCBpbmxpbmUtZmxleCB3LWZpdCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGdyb3VwLWRhdGEtdmVydGljYWwvdGFiczpoLWZpdCBncm91cC1kYXRhLXZlcnRpY2FsL3RhYnM6ZmxleC1jb2xgLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDpgYmctbXV0ZWRgLGxpbmU6YGdhcC0xIGJnLXRyYW5zcGFyZW50YH19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDpgZGVmYXVsdGB9fSk7ZnVuY3Rpb24gTXcoZSx0LG4scj1TdHJpbmcsaT0hMCl7cmV0dXJue2lkOmUsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLG1ldGE6e2FsaWduOmByaWdodGB9LGNlbGw6KHtyb3c6ZX0pPT57aWYoZS5vcmlnaW5hbC5zdG9yZURvd24pcmV0dXJuYD9gO2xldCB0PW4oZS5vcmlnaW5hbCk7cmV0dXJuIGk/Ryhndyx7dmFsdWU6dH0pOnIodCl9fX1mdW5jdGlvbiBOdyhlLHQsbil7cmV0dXJuW3tpZDpgaWRgLGhlYWRlcjplLGFjY2Vzc29yRm46ZT0+ZS5pZCxjZWxsOih7cm93OmV9KT0+Ryhgc3BhbmAse2NsYXNzOmBmb250LW1lZGl1bWB9LGUub3JpZ2luYWwuaWQpfSx7aWQ6YHNlY29uZGFyeWAsaGVhZGVyOnQsYWNjZXNzb3JGbjpuLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LG4oZS5vcmlnaW5hbCkpfSx7aWQ6YGxpbWl0c2AsaGVhZGVyOmBMaW1pdHNgLGFjY2Vzc29yRm46ZT0+YkMoZS5saW1pdHMpLGNlbGw6KHtyb3c6ZX0pPT5HKGBzcGFuYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGJDKGUub3JpZ2luYWwubGltaXRzKSl9LE13KGByZXFNaW5gLGByZXEvbWluYCxlPT5lLnJlcXVlc3RzUGVyTWludXRlKSxNdyhgcmVxRGF5YCxgcmVxL2RheWAsZT0+ZS5yZXF1ZXN0c1BlckRheSksTXcoYHRva0luRGF5YCxgdG9rSW4vZGF5YCxlPT5lLnRva2Vuc0luUGVyRGF5KSxNdyhgdG9rT3V0RGF5YCxgdG9rT3V0L2RheWAsZT0+ZS50b2tlbnNPdXRQZXJEYXkpLE13KGB0b2tJbk1vbnRoYCxgdG9rSW4vbW9udGhgLGU9PmUudG9rZW5zSW5QZXJNb250aCksTXcoYHRva091dE1vbnRoYCxgdG9rT3V0L21vbnRoYCxlPT5lLnRva2Vuc091dFBlck1vbnRoKSxNdyhgY29zdERheWAsYGNvc3QvZGF5YCxlPT5lLmNvc3RQZXJEYXlNaWNyb1VzZCxpQywhMSksTXcoYGNvc3RNb250aGAsYGNvc3QvbW9udGhgLGU9PmUuY29zdFBlck1vbnRoTWljcm9Vc2QsaUMsITEpXX12YXIgUHc9Rih7X19uYW1lOmBVc2FnZVRhYmxlYCxwcm9wczp7aWRMYWJlbDp7fSxlbnRyaWVzOnt9LHNlY29uZGFyeUNvbHVtbkxhYmVsOnt9LHNlY29uZGFyeVZhbHVlOnt0eXBlOkZ1bmN0aW9ufSxlbXB0eU1lc3NhZ2U6e319LHNldHVwKGUpe2xldCB0PWUsbj1XKCgpPT5Odyh0LmlkTGFiZWwsdC5zZWNvbmRhcnlDb2x1bW5MYWJlbCx0LnNlY29uZGFyeVZhbHVlKSk7cmV0dXJuKHQscik9PihSKCksQigkUyx7Y29sdW1uczpuLnZhbHVlLGRhdGE6ZS5lbnRyaWVzLCJlbXB0eS1tZXNzYWdlIjplLmVtcHR5TWVzc2FnZSwicm93LWNsYXNzIjplPT5lLnN0b3JlRG93bj9gYmctZGVzdHJ1Y3RpdmUvMTBgOnZvaWQgMH0sbnVsbCw4LFtgY29sdW1uc2AsYGRhdGFgLGBlbXB0eS1tZXNzYWdlYCxgcm93LWNsYXNzYF0pKX19KTtmdW5jdGlvbiBGdyhlLHQpe3JldHVybiBlLmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModCl9ZnVuY3Rpb24gSXcoZSx0KXtyZXR1cm4gZS5pZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIEx3KGUsdCl7cmV0dXJuIHQuZmlsdGVyKHQ9PnQuZ3JvdXBOYW1lPT09ZS5pZCl9ZnVuY3Rpb24gUncoZSx0LG4pe3JldHVybiBMdyhlLHQpLmZpbHRlcihlPT5GdyhlLG4pKX1mdW5jdGlvbiB6dyhlLHQsbil7cmV0dXJuIEl3KGUsbil8fFJ3KGUsdCxuKS5sZW5ndGg+MH12YXIgQnc9e2NsYXNzOmBmbGV4IGZsZXgtY29sIGdhcC02YH0sVnc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sSHc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sVXc9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sV3c9e2NsYXNzOmB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGFidWxhci1udW1zYH0sR3c9e2tleTowLGNsYXNzOmBtYi0zIGZsZXggZmxleC13cmFwIGdhcC14LTQgZ2FwLXktMSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LEt3PXtjbGFzczpgZmxleCBmbGV4LTEgZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAteC00IGdhcC15LTEgcHItMiB0ZXh0LWxlZnRgfSxxdz17Y2xhc3M6YGZvbnQtbWVkaXVtYH0sSnc9e2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0YWJ1bGFyLW51bXNgfSxZdz17Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRhYnVsYXItbnVtc2B9LFh3PXtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdGFidWxhci1udW1zYH0sWnc9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LFF3PXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LCR3PXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sZVQ9e2tleTowLGNsYXNzOmBmbGV4IGZsZXgtd3JhcCBnYXAtMS41YH0sdFQ9e2tleToxLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxuVD17a2V5OjAsY2xhc3M6YGZsZXggZmxleC13cmFwIGdhcC0xLjVgfSxyVD17a2V5OjEsY2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGlUPXtrZXk6MCxjbGFzczpgZmxleCBmbGV4LXdyYXAgZ2FwLTEuNWB9LGFUPXtrZXk6MSxjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sb1Q9e2NsYXNzOmBtYi0zIGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLXgtNiBnYXAteS0xLjUgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LHNUPXtjbGFzczpgdGFidWxhci1udW1zYH0sY1Q9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSxsVD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LHVUPXtjbGFzczpgdGFidWxhci1udW1zYH0sZFQ9e2NsYXNzOmB0YWJ1bGFyLW51bXNgfSxmVD17Y2xhc3M6YHRhYnVsYXItbnVtc2B9LHBUPXtrZXk6MixjbGFzczpgcHktNiB0ZXh0LWNlbnRlciB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LG1UPWBHbG9iIHBhdHRlcm4g4oCUIG1hdGNoZXMgbGlrZSBhIHNoZWxsIHdpbGRjYXJkICgqLCA/LCBbLi4uXSlgLGhUPUYoe19fbmFtZTpgVXNhZ2VWaWV3YCxzZXR1cChlKXtsZXQgdD1zeCgpLG49VygoKT0+dC51c2FnZSkscj1XKCgpPT57bGV0IGU9e307Zm9yKGxldCBuIG9mIHQub3ZlcnZpZXc/Lmdyb3Vwcz8/W10pZVtuLm5hbWVdPW4ubWVtYmVyQ291bnQ7cmV0dXJuIGV9KTtmdW5jdGlvbiBpKGUpe3JldHVybiBlLmdyb3VwTmFtZT8/YGB9ZnVuY3Rpb24gYShlKXtsZXQgdD1yLnZhbHVlW2UuaWRdO3JldHVybiB0PT09dm9pZCAwP2BgOlN0cmluZyh0KX1sZXR7cXVlcnk6byxub3JtYWxpemVkOnMsaGFzUXVlcnk6Y309UkMoKSxsPVcoKCk9PntsZXQgZT1uLnZhbHVlPy5ncm91cHM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4gZS5maWx0ZXIoZT0+encoZSx0LHMudmFsdWUpKX0pLHU9VygoKT0+Yy52YWx1ZT9sLnZhbHVlLmZpbHRlcihlPT4hSXcoZSxzLnZhbHVlKSkubWFwKGU9PmUuaWQpOltdKTtmdW5jdGlvbiBkKGUpe2xldCB0PW4udmFsdWU/LnVzZXJzPz9bXTtyZXR1cm4hYy52YWx1ZXx8SXcoZSxzLnZhbHVlKT9MdyhlLHQpOlJ3KGUsdCxzLnZhbHVlKX1sZXQgZj1XKCgpPT5uLnZhbHVlPy5ncm91cHMubGVuZ3RoP2MudmFsdWU/YG5vIGdyb3VwcyBtYXRjaCAiJHtvLnZhbHVlfSJgOmBub25lYDpgbm9uZSBjb25maWd1cmVkYCkscD1XKCgpPT57bGV0IGU9bi52YWx1ZT8udXNlcnM/P1tdO2lmKCFjLnZhbHVlKXJldHVybiBlO2xldCB0PW4udmFsdWU/Lmdyb3Vwcz8/W10scj1uZXcgU2V0KHQuZmlsdGVyKGU9Pkl3KGUscy52YWx1ZSkpLm1hcChlPT5lLmlkKSk7cmV0dXJuIGUuZmlsdGVyKGU9PkZ3KGUscy52YWx1ZSl8fGUuZ3JvdXBOYW1lIT09dm9pZCAwJiZyLmhhcyhlLmdyb3VwTmFtZSkpfSksbT1XKCgpPT5uLnZhbHVlPy51c2Vycy5sZW5ndGg/Yy52YWx1ZT9gbm8gdXNlcnMgbWF0Y2ggIiR7by52YWx1ZX0iYDpgbm9uZWA6YG5vbmUgY29uZmlndXJlZGApLGg9TncoYE5hbWVgLGBNZW1iZXJzYCxhKSxnPU0oW10pLF89QlMoe2dldCBkYXRhKCl7cmV0dXJuIGwudmFsdWV9LGdldCBjb2x1bW5zKCl7cmV0dXJuIGh9LGdldENvcmVSb3dNb2RlbDpqUygpLGdldFNvcnRlZFJvd01vZGVsOk1TKCksb25Tb3J0aW5nQ2hhbmdlOmU9PlFTKGUsZyksc3RhdGU6e2dldCBzb3J0aW5nKCl7cmV0dXJuIGcudmFsdWV9fX0pLHY9VygoKT0+Xy5nZXRSb3dNb2RlbCgpLnJvd3MpLHk9bmV3IFNldChbYGlkYCxgc2Vjb25kYXJ5YCxgcmVxRGF5YCxgY29zdERheWBdKSxiPVcoKCk9Pl8uZ2V0SGVhZGVyR3JvdXBzKClbMF0uaGVhZGVycy5maWx0ZXIoZT0+eS5oYXMoZS5jb2x1bW4uaWQpKSkseD1adCh7bWFudWFsbHlFeHBhbmRlZDpuZXcgU2V0LG1hbnVhbGx5Q29sbGFwc2VkOm5ldyBTZXR9KSxTPVcoKCk9PnpDKHgsYy52YWx1ZSx1LnZhbHVlKSk7ZnVuY3Rpb24gQyhlKXtCQyh4LGUsUy52YWx1ZS5oYXMoZSkpfWxldCB3PVcoe2dldDooKT0+QXJyYXkuZnJvbShTLnZhbHVlKSxzZXQ6ZT0+e2xldCB0PW5ldyBTZXQoZSk7Zm9yKGxldCBlIG9mIFMudmFsdWUpdC5oYXMoZSl8fEMoZSk7Zm9yKGxldCBlIG9mIHQpUy52YWx1ZS5oYXMoZSl8fEMoZSl9fSk7RXIobyxlPT57ZS50cmltKCk9PT1gYCYmVkMoeCl9KTtmdW5jdGlvbiBlZShlKXtyZXR1cm4vWyo/W10vLnRlc3QoZSl9cmV0dXJuKGUsdCk9PihSKCkseihgZGl2YCxCdyxbSChOQyx7bW9kZWxWYWx1ZTpOKG8pLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzBdfHw9ZT0+aihvKT9vLnZhbHVlPWU6bnVsbCxwbGFjZWhvbGRlcjpgRmlsdGVyIHVzZXJzIG9yIGdyb3Vwc2AsY2xhc3M6YG1heC13LXNtYH0sbnVsbCw4LFtgbW9kZWxWYWx1ZWBdKSxuLnZhbHVlPyhSKCksQihOKHFiKSx7a2V5OjB9LHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsyXXx8PVtVKGBUb3RhbGAsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFszXXx8PVtVKGBVc2FnZSBzdW1tZWQgYWNyb3NzIGV2ZXJ5IHVzZXIgYW5kIGdyb3VwIGNvbWJpbmVkLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSx7Y2xhc3M6YGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTQgdGV4dC1zbSBzbTpncmlkLWNvbHMtNGB9LHtkZWZhdWx0OlAoKCk9PltWKGBkaXZgLG51bGwsW3RbNF18fD1WKGBwYCx7Y2xhc3M6YHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGBSZXF1ZXN0cy9kYXlgLC0xKSxWKGBwYCxWdyxbSChndyx7dmFsdWU6bi52YWx1ZS50b3RhbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs1XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBpbi9kYXlgLC0xKSxWKGBwYCxIdyxbSChndyx7dmFsdWU6bi52YWx1ZS50b3RhbC50b2tlbnNJblBlckRheX0sbnVsbCw4LFtgdmFsdWVgXSldKV0pLFYoYGRpdmAsbnVsbCxbdFs2XXx8PVYoYHBgLHtjbGFzczpgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYFRva2VucyBvdXQvZGF5YCwtMSksVihgcGAsVXcsW0goZ3cse3ZhbHVlOm4udmFsdWUudG90YWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKV0pXSksVihgZGl2YCxudWxsLFt0WzddfHw9VihgcGAse2NsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmRgfSxgQ29zdC9kYXlgLC0xKSxWKGBwYCxXdyxrKE4oaUMpKG4udmFsdWUudG90YWwuY29zdFBlckRheU1pY3JvVXNkKSksMSldKV0pLF86MX0pXSksXzoxfSkpOlRzKGBgLCEwKSxIKE4ocWIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihYYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChOKFpiKSxudWxsLHtkZWZhdWx0OlAoKCk9PlsuLi50WzhdfHw9W1UoYEdyb3Vwc2AsLTEpXV0pLF86MX0pLEgoTihZYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFs5XXx8PVtVKGBFeHBhbmQgYSBncm91cCB0byBzZWUgaXRzIG1lbWJlciB1c2Vycycgb3duIHVzYWdlLmAsLTEpXV0pLF86MX0pXSksXzoxfSksSChOKEpiKSxudWxsLHtkZWZhdWx0OlAoKCk9Plt2LnZhbHVlLmxlbmd0aD8oUigpLHooYGRpdmAsR3csWyhSKCEwKSx6KEwsbnVsbCxtYShiLnZhbHVlLGU9PihSKCksQihIUyx7a2V5OmUuaWQsaGVhZGVyOmV9LG51bGwsOCxbYGhlYWRlcmBdKSkpLDEyOCkpXSkpOlRzKGBgLCEwKSx2LnZhbHVlLmxlbmd0aD8oUigpLEIoTihQQykse2tleToxLG1vZGVsVmFsdWU6dy52YWx1ZSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFsxXXx8PWU9PncudmFsdWU9ZSx0eXBlOmBtdWx0aXBsZWAsY2xhc3M6YHJvdW5kZWQtbWQgYm9yZGVyIHB4LTNgfSx7ZGVmYXVsdDpQKCgpPT5bKFIoITApLHooTCxudWxsLG1hKHYudmFsdWUsZT0+KFIoKSxCKE4oSUMpLHtrZXk6ZS5vcmlnaW5hbC5pZCx2YWx1ZTplLm9yaWdpbmFsLmlkfSx7ZGVmYXVsdDpQKCgpPT5bSChOKExDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBzcGFuYCxLdyxbVihgc3BhbmAscXcsayhlLm9yaWdpbmFsLmlkKSwxKSxWKGBzcGFuYCxKdyxrKGEoZS5vcmlnaW5hbCl8fGAwYCkrYCBtZW1iZXJzYCwxKSxWKGBzcGFuYCxZdyxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihndyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC5yZXF1ZXN0c1BlckRheX0sbnVsbCw4LFtgdmFsdWVgXSkpLHRbMTBdfHw9VShgIHJlcS9kYXkgYCwtMSldKSxWKGBzcGFuYCxYdyxrKGUub3JpZ2luYWwuc3RvcmVEb3duP2A/YDpOKGlDKShlLm9yaWdpbmFsLmNvc3RQZXJEYXlNaWNyb1VzZCkpK2AvZGF5IGAsMSldKV0pLF86Mn0sMTAyNCksSChOKEZDKSxudWxsLHtkZWZhdWx0OlAoKCk9PltWKGBkbGAsWncsW1YoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOm1UfSxgUHJvdmlkZXJzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwucHJvdmlkZXJzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLFF3LFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5wcm92aWRlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLCR3LGBBbGwgcHJvdmlkZXJzYCkpXSldKSxWKGBkaXZgLG51bGwsW1YoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYCx0aXRsZTptVH0sYE1vZGVsc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1vZGVscz8ubGVuZ3RoPyhSKCkseihgZGl2YCxlVCxbKFIoITApLHooTCxudWxsLG1hKGUub3JpZ2luYWwubW9kZWxzLGU9PihSKCkseihMLHtrZXk6ZX0sW2VlKGUpPyhSKCksQihOKGVDKSx7a2V5OjEsYXM6YHNwYW5gLHZhcmlhbnQ6YHNlY29uZGFyeWAsY2xhc3M6YGZvbnQtbW9ubyBmb250LW5vcm1hbGB9LHtkZWZhdWx0OlAoKCk9PltVKGsoZSksMSldKSxfOjJ9LDEwMjQpKTooUigpLEIoU0Mse2tleTowLGlkOmV9LG51bGwsOCxbYGlkYF0pKV0sNjQpKSksMTI4KSldKSk6KFIoKSx6KGBzcGFuYCx0VCxgQWxsIG1vZGVsc2ApKV0pXSksVihgZGl2YCxudWxsLFtWKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGAsdGl0bGU6bVR9LGBNQ1Agc2VydmVyc2ApLFYoYGRkYCxudWxsLFtlLm9yaWdpbmFsLm1jcFNlcnZlcnM/Lmxlbmd0aD8oUigpLHooYGRpdmAsblQsWyhSKCEwKSx6KEwsbnVsbCxtYShlLm9yaWdpbmFsLm1jcFNlcnZlcnMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLHJULGBBbGwgTUNQIHNlcnZlcnNgKSldKV0pLFYoYGRpdmAsbnVsbCxbVihgZHRgLHtjbGFzczpgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRgLHRpdGxlOm1UfSxgQWdlbnRzYCksVihgZGRgLG51bGwsW2Uub3JpZ2luYWwuYWdlbnRzPy5sZW5ndGg/KFIoKSx6KGBkaXZgLGlULFsoUighMCkseihMLG51bGwsbWEoZS5vcmlnaW5hbC5hZ2VudHMsZT0+KFIoKSxCKE4oZUMpLHtrZXk6ZSxhczpgc3BhbmAsdmFyaWFudDpgc2Vjb25kYXJ5YCxjbGFzczpgZm9udC1tb25vIGZvbnQtbm9ybWFsYH0se2RlZmF1bHQ6UCgoKT0+W1UoayhlKSwxKV0pLF86Mn0sMTAyNCkpKSwxMjgpKV0pKTooUigpLHooYHNwYW5gLGFULGBBbGwgYWdlbnRzYCkpXSldKV0pLFYoYGRsYCxvVCxbVihgZGl2YCxudWxsLFt0WzExXXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYExpbWl0c2AsLTEpLFYoYGRkYCxudWxsLGsoTihiQykoZS5vcmlnaW5hbC5saW1pdHMpKSwxKV0pLFYoYGRpdmAsbnVsbCxbdFsxMl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGByZXEvbWluYCwtMSksVihgZGRgLHNULFtlLm9yaWdpbmFsLnN0b3JlRG93bj8oUigpLHooTCx7a2V5OjB9LFtVKGA/YCldLDY0KSk6KFIoKSxCKGd3LHtrZXk6MSx2YWx1ZTplLm9yaWdpbmFsLnJlcXVlc3RzUGVyTWludXRlfSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxM118fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9kYXlgLC0xKSxWKGBkZGAsY1QsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoZ3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zSW5QZXJEYXl9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE0XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYHRva091dC9kYXlgLC0xKSxWKGBkZGAsbFQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoZ3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyRGF5fSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNV18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tJbi9tb250aGAsLTEpLFYoYGRkYCx1VCxbZS5vcmlnaW5hbC5zdG9yZURvd24/KFIoKSx6KEwse2tleTowfSxbVShgP2ApXSw2NCkpOihSKCksQihndyx7a2V5OjEsdmFsdWU6ZS5vcmlnaW5hbC50b2tlbnNJblBlck1vbnRofSxudWxsLDgsW2B2YWx1ZWBdKSldKV0pLFYoYGRpdmAsbnVsbCxbdFsxNl18fD1WKGBkdGAse2NsYXNzOmB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZGB9LGB0b2tPdXQvbW9udGhgLC0xKSxWKGBkZGAsZFQsW2Uub3JpZ2luYWwuc3RvcmVEb3duPyhSKCkseihMLHtrZXk6MH0sW1UoYD9gKV0sNjQpKTooUigpLEIoZ3cse2tleToxLHZhbHVlOmUub3JpZ2luYWwudG9rZW5zT3V0UGVyTW9udGh9LG51bGwsOCxbYHZhbHVlYF0pKV0pXSksVihgZGl2YCxudWxsLFt0WzE3XXx8PVYoYGR0YCx7Y2xhc3M6YHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYGNvc3QvbW9udGhgLC0xKSxWKGBkZGAsZlQsayhlLm9yaWdpbmFsLnN0b3JlRG93bj9gP2A6TihpQykoZS5vcmlnaW5hbC5jb3N0UGVyTW9udGhNaWNyb1VzZCkpLDEpXSldKSx0WzE4XXx8PVYoYHBgLHtjbGFzczpgbWItMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sYE1lbWJlcnNgLC0xKSxIKFB3LHsiaWQtbGFiZWwiOmBOYW1lYCwic2Vjb25kYXJ5LWNvbHVtbi1sYWJlbCI6YEdyb3VwYCxlbnRyaWVzOmQoZS5vcmlnaW5hbCksInNlY29uZGFyeS12YWx1ZSI6aX0sbnVsbCw4LFtgZW50cmllc2BdKV0pLF86Mn0sMTAyNCldKSxfOjJ9LDEwMzIsW2B2YWx1ZWBdKSkpLDEyOCkpXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSx6KGBwYCxwVCxrKGYudmFsdWUpLDEpKV0pLF86MX0pXSksXzoxfSksSChOKHFiKSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oWGIpLG51bGwse2RlZmF1bHQ6UCgoKT0+W0goTihaYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bLi4udFsxOV18fD1bVShgVXNlcnNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihKYiksbnVsbCx7ZGVmYXVsdDpQKCgpPT5bSChQdyx7ImlkLWxhYmVsIjpgTmFtZWAsInNlY29uZGFyeS1jb2x1bW4tbGFiZWwiOmBHcm91cGAsZW50cmllczpwLnZhbHVlLCJzZWNvbmRhcnktdmFsdWUiOmksImVtcHR5LW1lc3NhZ2UiOm0udmFsdWV9LG51bGwsOCxbYGVudHJpZXNgLGBlbXB0eS1tZXNzYWdlYF0pXSksXzoxfSldKSxfOjF9KV0pKX19KTtmdW5jdGlvbiBnVChlLHQsbil7bGV0IHI9ZS5zdGFydHNXaXRoKGAjYCk/ZS5zbGljZSgxKTplO3JldHVybiB0LmluY2x1ZGVzKHIpP3I6bn1mdW5jdGlvbiBfVChlKXtyZXR1cm5gIyR7ZX1gfWZ1bmN0aW9uIHZUKHt2YWxpZFRhYnM6ZSxkZWZhdWx0VGFiOnR9KXtsZXQgbj10eXBlb2Ygd2luZG93PGB1YCxyPU0obj9nVCh3aW5kb3cubG9jYXRpb24uaGFzaCxlLHQpOnQpO0VyKHIsZT0+e2lmKCFuKXJldHVybjtsZXQgdD1fVChlKTt3aW5kb3cubG9jYXRpb24uaGFzaCE9PXQmJndpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLGBgLHQpfSk7ZnVuY3Rpb24gaSgpe3IudmFsdWU9Z1Qod2luZG93LmxvY2F0aW9uLmhhc2gsZSx0KX1yZXR1cm4gbiYmKFppKCgpPT53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpLHRhKCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgaGFzaGNoYW5nZWAsaSkpKSxyfXZhciB5VD0oZnVuY3Rpb24oKXtsZXQgZT10eXBlb2YgZG9jdW1lbnQ8YHVgJiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYCkucmVsTGlzdDtyZXR1cm4gZSYmZS5zdXBwb3J0cyYmZS5zdXBwb3J0cyhgbW9kdWxlcHJlbG9hZGApP2Btb2R1bGVwcmVsb2FkYDpgcHJlbG9hZGB9KSgpLGJUPWZ1bmN0aW9uKGUpe3JldHVybmAvYWRtaW4vYCtlfSx4VD17fSxTVD1mdW5jdGlvbihlLHQsbil7bGV0IHI9UHJvbWlzZS5yZXNvbHZlKCk7aWYodCYmdC5sZW5ndGg+MCl7bGV0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYGxpbmtgKSxpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXWApLGE9aT8ubm9uY2V8fGk/LmdldEF0dHJpYnV0ZShgbm9uY2VgKTtmdW5jdGlvbiBvKGUpe3JldHVybiBQcm9taXNlLmFsbChlLm1hcChlPT5Qcm9taXNlLnJlc29sdmUoZSkudGhlbihlPT4oe3N0YXR1czpgZnVsZmlsbGVkYCx2YWx1ZTplfSksZT0+KHtzdGF0dXM6YHJlamVjdGVkYCxyZWFzb246ZX0pKSkpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGltcG9ydC5tZXRhLnJlc29sdmU/aW1wb3J0Lm1ldGEucmVzb2x2ZShlKTpuZXcgVVJMKGUsaW1wb3J0Lm1ldGEudXJsKS5ocmVmfXI9byh0Lm1hcCh0PT57aWYodD1iVCh0LG4pLHQ9cyh0KSx0IGluIHhUKXJldHVybjt4VFt0XT0hMDtsZXQgcj10LmVuZHNXaXRoKGAuY3NzYCk7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2xldCBpPWVbbl07aWYoaS5ocmVmPT09dCYmKCFyfHxpLnJlbD09PWBzdHlsZXNoZWV0YCkpcmV0dXJufWxldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGxpbmtgKTtpZihpLnJlbD1yP2BzdHlsZXNoZWV0YDp5VCxyfHwoaS5hcz1gc2NyaXB0YCksaS5jcm9zc09yaWdpbj1gYCxpLmhyZWY9dCxhJiZpLnNldEF0dHJpYnV0ZShgbm9uY2VgLGEpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSkscilyZXR1cm4gbmV3IFByb21pc2UoKGUsbik9PntpLmFkZEV2ZW50TGlzdGVuZXIoYGxvYWRgLGUpLGkuYWRkRXZlbnRMaXN0ZW5lcihgZXJyb3JgLCgpPT5uKEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7dH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShlKXtsZXQgdD1uZXcgRXZlbnQoYHZpdGU6cHJlbG9hZEVycm9yYCx7Y2FuY2VsYWJsZTohMH0pO2lmKHQucGF5bG9hZD1lLHdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpLCF0LmRlZmF1bHRQcmV2ZW50ZWQpdGhyb3cgZX1yZXR1cm4gci50aGVuKHQ9Pntmb3IobGV0IGUgb2YgdHx8W10pZS5zdGF0dXM9PT1gcmVqZWN0ZWRgJiZpKGUucmVhc29uKTtyZXR1cm4gZSgpLmNhdGNoKGkpfSl9LENUPXtjbGFzczpgZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTYgcHgtNCBweS04IHNtOnB4LTYgbGc6cHgtOGB9LHdUPXtjbGFzczpgZmxleCBmbGV4LWNvbCBnYXAtMWB9LFRUPXtjbGFzczpgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yYH0sRVQ9e2NsYXNzOmBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH0sRFQ9YGh0dHBzOi8vZ2l0aHViLmNvbS9sdWthc3pyYWN6eWxvL3RyYWVmaWstbGxtZ2F0ZXdheWAsT1Q9bXUoRih7X19uYW1lOmBBcHBgLHNldHVwKGUpe2xldCB0PUxpKCgpPT5TVCgoKT0+aW1wb3J0KGAuL0NoYXJ0c1ZpZXctRFExSWVPY2IuanNgKSxbXSkpLG49cngoKSxyPXN4KCksaT12VCh7dmFsaWRUYWJzOltgcHJvdmlkZXJzYCxgdXNhZ2VgLGBjaGFydHNgLGB0YXJnZXRzYF0sZGVmYXVsdFRhYjpgcHJvdmlkZXJzYH0pLGE9VygoKT0+ci5lcnJvcj9gcmVmcmVzaCBmYWlsZWQ6ICR7ci5lcnJvcn1gOnIubGFzdFVwZGF0ZWQ/YGxhc3QgdXBkYXRlZCAke3IubGFzdFVwZGF0ZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDpgbG9hZGluZy4uLmApO3JldHVybiBaaSgoKT0+e3Iuc3RhcnRQb2xsaW5nKCl9KSwoZSxvKT0+e2xldCBzPWNhKGBGb250QXdlc29tZUljb25gKTtyZXR1cm4gUigpLHooYGRpdmAsQ1QsW1YoYGhlYWRlcmAsd1QsW1YoYGRpdmAsVFQsW29bMV18fD1WKGBoMWAse2NsYXNzOmB0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRgfSxgTExNIEdhdGV3YXkg4oCUIEFkbWluYCwtMSksSChOKFdiKSx7YXM6YGFgLGhyZWY6RFQsdGFyZ2V0OmBfYmxhbmtgLHJlbDpgbm9vcGVuZXIgbm9yZWZlcnJlcmAsdmFyaWFudDpgZ2hvc3RgLHNpemU6YGljb25gLCJhcmlhLWxhYmVsIjpgR2l0SHViIHJlcG9zaXRvcnlgLGNsYXNzOmB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kYH0se2RlZmF1bHQ6UCgoKT0+W0gocyx7aWNvbjpOKG5fKSxjbGFzczpgc2l6ZS00YCwiYXJpYS1oaWRkZW4iOmB0cnVlYH0sbnVsbCw4LFtgaWNvbmBdKV0pLF86MX0pXSksVihgcGAsRVQsW04ocikuZXJyb3I/KFIoKSxCKHMse2tleTowLGljb246TihsXyksY2xhc3M6YHNpemUtMy41IHRleHQtZGVzdHJ1Y3RpdmVgfSxudWxsLDgsW2BpY29uYF0pKTpUcyhgYCwhMCksVihgc3BhbmAse2NsYXNzOk8oTihyKS5lcnJvcj9gdGV4dC1kZXN0cnVjdGl2ZWA6dm9pZCAwKX0sayhhLnZhbHVlKSwzKV0pXSksTihuKS5pc0F1dGhlbnRpY2F0ZWQ/KFIoKSxCKE4oRHcpLHtrZXk6MSxtb2RlbFZhbHVlOk4oaSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOm9bMF18fD1lPT5qKGkpP2kudmFsdWU9ZTpudWxsfSx7ZGVmYXVsdDpQKCgpPT5bSChOKGt3KSxudWxsLHtkZWZhdWx0OlAoKCk9PltIKE4oQXcpLHt2YWx1ZTpgcHJvdmlkZXJzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bMl18fD1bVShgUHJvdmlkZXJzYCwtMSldXSksXzoxfSksSChOKEF3KSx7dmFsdWU6YHVzYWdlYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bM118fD1bVShgVXNhZ2VgLC0xKV1dKSxfOjF9KSxIKE4oQXcpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+Wy4uLm9bNF18fD1bVShgQ2hhcnRzYCwtMSldXSksXzoxfSksSChOKEF3KSx7dmFsdWU6YHRhcmdldHNgfSx7ZGVmYXVsdDpQKCgpPT5bLi4ub1s1XXx8PVtVKGBNQ1AgJiBBZ2VudHNgLC0xKV1dKSxfOjF9KV0pLF86MX0pLEgoTihPdykse3ZhbHVlOmBwcm92aWRlcnNgfSx7ZGVmYXVsdDpQKCgpPT5bSChmdyldKSxfOjF9KSxIKE4oT3cpLHt2YWx1ZTpgdXNhZ2VgfSx7ZGVmYXVsdDpQKCgpPT5bSChoVCldKSxfOjF9KSxIKE4oT3cpLHt2YWx1ZTpgY2hhcnRzYH0se2RlZmF1bHQ6UCgoKT0+W0goTih0KSldKSxfOjF9KSxIKE4oT3cpLHt2YWx1ZTpgdGFyZ2V0c2B9LHtkZWZhdWx0OlAoKCk9PltIKEV3KV0pLF86MX0pXSksXzoxfSw4LFtgbW9kZWxWYWx1ZWBdKSk6KFIoKSxCKGd4LHtrZXk6MH0pKV0pfX19KSk7T1QudXNlKFZnKCkpLE9ULmNvbXBvbmVudChgRm9udEF3ZXNvbWVJY29uYCxDZyksT1QubW91bnQoYCNhcHBgKTtleHBvcnR7VnIgYXMgJCxreSBhcyBBLFp0IGFzIEF0LFR5IGFzIEIsZ2UgYXMgQnQscXkgYXMgQyx3ciBhcyBDdCxWeSBhcyBELG9uIGFzIER0LFV5IGFzIEUsRmUgYXMgRXQsYnkgYXMgRix5biBhcyBGdCxZdiBhcyBHLHN5IGFzIEgsZnkgYXMgSSxtbiBhcyBJdCxzXyBhcyBKLHVfIGFzIEssZ3kgYXMgTCxOIGFzIEx0LEZ5IGFzIE0sZW4gYXMgTXQsSXkgYXMgTix1biBhcyBOdCxOeSBhcyBPLGogYXMgT3QsZHkgYXMgUCxBIGFzIFB0LEwgYXMgUSxDeSBhcyBSLE8gYXMgUnQsWXkgYXMgUyxDciBhcyBTdCxHeSBhcyBULG5jIGFzIFR0LG95IGFzIFUsY3kgYXMgVixrIGFzIFZ0LGF5IGFzIFcsQ2cgYXMgWCx0XyBhcyBZLGl1IGFzIFosSmIgYXMgXyxtYSBhcyBfdCxEdyBhcyBhLFUgYXMgYXQsbmIgYXMgYixpYyBhcyBidCx4QyBhcyBjLFNzIGFzIGN0LHN4IGFzIGQsa3MgYXMgZHQsVyBhcyBldCxpeCBhcyBmLFFuIGFzIGZ0LFhiIGFzIGcsUiBhcyBndCxaYiBhcyBoLHRhIGFzIGh0LGt3IGFzIGkseiBhcyBpdCxBeSBhcyBqLE0gYXMganQsT3kgYXMgayxJZSBhcyBrdCxvQyBhcyBsLEcgYXMgbHQscnggYXMgbSxaaSBhcyBtdCxGdyBhcyBuLEIgYXMgbnQsUkMgYXMgbyxIIGFzIG90LGF4IGFzIHAsZWEgYXMgcHQsbV8gYXMgcSxBdyBhcyByLFRzIGFzIHJ0LE5DIGFzIHMsRiBhcyBzdCx6dyBhcyB0LFYgYXMgdHQsYUMgYXMgdSxQYSBhcyB1dCxxYiBhcyB2LEkgYXMgdnQsS3kgYXMgdyxQIGFzIHd0LCR5IGFzIHgsRXIgYXMgeHQsd2IgYXMgeSx1YSBhcyB5dCx3eSBhcyB6LHhlIGFzIHp0fTs=", ), }, } diff --git a/webui/src/lib/format.spec.ts b/webui/src/lib/format.spec.ts index ffc4b13..160ffd5 100644 --- a/webui/src/lib/format.spec.ts +++ b/webui/src/lib/format.spec.ts @@ -1,8 +1,6 @@ import { describe, expect, it } from 'vitest' -import { formatCompactCount, formatContextWindow, formatElapsedAgo, formatLatencyMs, formatModelCostHover, formatUntil, refreshDetailLabel, refreshLabel } from './format' - -const ZERO_TIME = '0001-01-01T00:00:00Z' +import { formatCompactCount, formatContextWindow, formatElapsedAgo, formatLatencyMs, formatModelCostHover, formatUntil, refreshDetailLabel, refreshLabel, ZERO_TIME } from './format' describe('refreshLabel', () => { it('reads "discovery off" when discovery is disabled, regardless of lastRefresh', () => { diff --git a/webui/src/lib/format.ts b/webui/src/lib/format.ts index c2fca51..23efce6 100644 --- a/webui/src/lib/format.ts +++ b/webui/src/lib/format.ts @@ -1,6 +1,7 @@ import type { HistoryWindow, LimitsConfig } from '@/types/api' -const ZERO_TIME = '0001-01-01T00:00:00Z' +/** ZERO_TIME is Go's zero time.Time value in its default JSON (RFC 3339) encoding — the unset-timestamp sentinel every admin API "never happened yet" field marshals as, and every formatter/test below treats as absent. */ +export const ZERO_TIME = '0001-01-01T00:00:00Z' /** * routableModelId joins a provider name and one of its own model ids into